fisco bcos 智能合约开发

项目需求2张表:资源表、资源访问记录表,需要资源上链智能合约、访问记录上链智能合约、以及资源所有权转移智能合约。

FISCO BCOS提供合约KV存储接口开发模式,可以通过合约创建表,并对创建的表进行增删改查操作。

所以,针对2表创建两个智能合约即可实现对表的增删改查操作。资源的所有权转移可以通过对资源表的数据属主的修改实现。

1. KVTable合约

  • Solidity合约只需要引入FISCO BCOS官方提供的Table.sol抽象接口合约文件即可。

  • webankblockchain-liquid(以下简称WBC-Liquid)合约在实现合约之前对KVTable的接口进行声明使用即可。

Table包含分布式存储专用的智能合约接口,其接口实现在区块链节点,其中,TableManager可以创建专属KV表,KVTable可以用作表进行get/set操作。

使用KV存储预编译合约开发应用 — FISCO BCOS v3 v3.0.0 文档

1、资源表

resource
ipfs_hash(key) user(value)
QmUpYtJoyby5jYg9oez8qLpMxqae4pe6rHxsmtWLH2APTZ 20211165XX
// SPDX-License-Identifier: Apache-2.0
pragma solidity >=0.6.10 <0.8.20;
pragma experimental ABIEncoderV2;

import "./Table.sol";

contract r_upload{
    event RegisterEvent(
        int256 ret,
        string indexed ipfs_hash,
        string indexed user
    );
    KVTable kvTable;
    TableManager tm;
    string constant tableName = "resource";

    constructor() public {
        // 构造函数中创建r_upload表
        tm = TableManager(address(0x1002));

        // 资产管理表, key : ipfs_hash , field : user
        // |  存储hash(主键)      |     资源属主      |
        // |-------------------- |-------------------|
        // |        ipfs_hash    |      user         |
        // |---------------------|-------------------|
        //

        // create table
        tm.createKVTable(tableName, "ipfs_hash", "user");

        // get table address
        address t_address = tm.openTable(tableName);
        kvTable = KVTable(t_address);
    }
    /*
    描述 : 根据资源hash查询资源属主
    参数 :
            ipfs_hash : 资源hash

    返回值:
            参数一: 成功返回0, 账户不存在返回-1
            参数二: 第一个参数为0时有效,资源属主
    */
    function select(string memory ipfs_hash) public view returns (bool, string memory) {
        // 查询
        bool result;
        string memory user;
        (result, user) = kvTable.get(ipfs_hash);

        return (result, user);
    }
     /*
    描述 : 资源上链
    参数 :
            ipfs_hash : 资源hash
            user  : 资源属主
    返回值:
            0  资产注册成功
            -1 资产账户已存在
            -2 其他错误
    */
    function register(string memory ipfs_hash, string memory user)
    public
    returns (int256)
    {
        int256 ret_code = 0;
        bool ret = true;
        string memory user_1="2021116579";
        // 查询资源是否上链
        (ret,user_1) = select(ipfs_hash);
        if (ret != true) {
            // 不存在,上链
            // 插入
            int32 count = kvTable.set(ipfs_hash, user);
            if (count == 1) {
                // 成功
                ret_code = 0;
            } else {
                // 失败? 无权限或者其他错误
                ret_code = - 2;
            }
        } else {
            //资源已存在
            ret_code = - 1;
        }

        emit RegisterEvent(ret_code, ipfs_hash, user);
        return ret_code;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40889839/article/details/126966129