为实现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)在同一条链同一群组中是唯一的是不能重复的
在上述代码中简单实现了对用户账号密码的新增和查询功能,更多功能参考官方文档