WeBase入门:KVTable的基础使用

212 阅读2分钟

为实现AMDB创建的表可被多个合约共享访问,其表名是群组内全局可见且唯一的,所以无法在同一条链上的同一个群组中,创建多个表名相同的表

接口声明

KVTable合约实现键值型读写数据的方式,KVTable合约接口声明如下:

// 文件名为 Table.sol
pragma solidity ^0.4.24;

contract KVTableFactory {
    function openTable(string tableName) public constant returns (KVTable);

    function createTable(string tableName,string key,string valueFields) public returns(int256);
}

//一条记录
contract Entry {
    function getInt(string) public constant returns (int256);
    function getUInt(string) public constant returns (uint256);
    function getAddress(string) public constant returns (address);
    function getBytes64(string) public constant returns (bytes1[64]);
    function getBytes32(string) public constant returns (bytes32);
    function getString(string) public constant returns (string);

    function set(string, int256) public;
    function set(string, uint256) public;
    function set(string, string) public;
    function set(string, address) public;
}

//KVTable 每个键对应一条entry
contract KVTable {
    function get(string) public view returns (bool, Entry);
    function set(string, Entry) public returns (int256);
    function newEntry() public view returns (Entry);
}

上述部分是官方提供的KVTable接口声明,需要注意上述代码不能随意更改,复制粘贴使用就行,如果按照官方文档使用@brief会报错,所以注释部分全部删除即可

使用示例

pragma solidity ^0.4.24;

import "./Table.sol";

contract KVTableTest {
    
    KVTableFactory kvt;
    string tname = "kvt1";
    
    constructor() public {
        kvt = KVTableFactory(0x1010);
        kvt.createTable(tname, "id", "username,password");
    }
    
    function get(string id) public view returns(bool, string, string) {
        KVTable table = kvt.openTable(tname);
        bool flag = false;
        Entry entry;
        (flag, entry) = table.get(id);
        string memory  username;
        string memory  password;
        if(flag){
            username = entry.getString("username");
            password = entry.getString("password");
        }
        return (flag, username, password);
    }
   
  function set(string id, string username, string password) public returns(int256) {
      KVTable table = kvt.openTable(tname);
      Entry entry = table.newEntry();
      entry.set("id", id);
      entry.set("username", username);
      entry.set("password", password);
      int256 count = table.set(id, entry);
      return count;
  }
}

需要注意的是根据官方文档,上述合约中的表名(tname)在同一条链同一群组中是唯一的是不能重复的

在上述代码中简单实现了对用户账号密码的新增和查询功能,更多功能参考官方文档