1.登录平台
创建合约文件和文件夹目录
通用Table类合约
这是一个关于Table的 Solidity 智能合约。该智能合约定义了一些重要的实体和方法,可以用于创建、操作和管理表格数据。
首先是 TableFactory 合约,用于创建和打开表格。其中包含:
openTable(string) 方法用于打开一个已经存在的表格并返回该表格实例 Table
createTable(string, string, string) 方法用于创建一个新的表格,并需要传入三个参数:表格名、主键名、存储引擎类型
接下来是一个 Condition 合约,用于设置查询条件。其中包含:
等于(Equal)
不等于(Not Equal)
大于(Greater Than)
大于等于(Greater or Equal)
小于(Less Than)
小于等于(Less or Equal)
限制返回记录数(limit)
然后是一个 Entry 合约,代表表格中的一行数据记录。它提供了获取和设置各种类型的数据值的方法,如整数、无符号整数、地址、字符串等。
最后是一个 Table 合约,包括以下方法:
select(string, Condition) 方法用于根据查询条件选择表格中的数据记录
insert(string, Entry) 方法用于往表格中插入一条新的数据记录
update(string, Entry, Condition) 方法用于根据给定的查询条件更新表格中的数据记录
remove(string, Condition) 方法用于根据给定的查询条件删除表格中的数据记录
newEntry() 方法用于创建一个新的数据记录实例
newCondition() 方法用于创建一个新的查询条件实例
pragma solidity ^0.4.24;
contract TableFactory {
function openTable(string tableName) public constant returns (Table);
function createTable(string tableName,string key,string valueFields) public returns(int);
}
// 查询条件
contract Condition {
//等于
function EQ(string, int) public;
function EQ(string, string) public;
//不等于
function NE(string, int) public;
function NE(string, string) public;
//大于
function GT(string, int) public;
//大于或等于
function GE(string, int) public;
//小于
function LT(string, int) public;
//小于或等于
function LE(string, int) public;
//限制返回记录条数
function limit(int) public;
function limit(int, int) public;
}
// 单条数据记录
contract Entry {
function getInt(string) public constant returns(int);
function getAddress(string) public constant returns(address);
function getBytes64(string) public constant returns(byte[64]);
function getBytes32(string) public constant returns(bytes32);
function getString(string) public constant returns(string);
function set(string, int) public;
function set(string, string) public;
function set(string, address) public;
}
// 数据记录集
contract Entries {
function get(int) public constant returns(Entry);
function size() public constant returns(int);
}
// Table主类
contract Table {
// 查询接口
function select(string key, Condition cond) public constant returns(Entries);
// 插入接口
function insert(string key, Entry entry) public returns(int);
// 更新接口
function update(string key, Entry entry, Condition cond) public returns(int);
// 删除接口
function remove(string key, Condition cond) public returns(int);
function newEntry() public constant returns(Entry);
function newCondition() public constant returns(Condition);
}
Asset合约编写
pragma solidity ^0.4.25;
import "./Table.sol";
contract Asset {
TableFactory tableFactory;
constructor() public {
// 获取TableFactory实例
tableFactory = TableFactory(0x1001); // 表工厂合约地址固定为0x1001
// 创建表
createTable();
}
// 创建表
function createTable() private {
// 表名为t_asset,主键名为id,列名为name和value
tableFactory.createTable("t_asset", "id", "name,value");
}
// 插入资产记录
function insertRecord(string id, string name, uint256 value) public returns (int) {
Table table = tableFactory.openTable("t_asset");
// 创建一条记录
Entry entry = table.newEntry();
entry.set("id", id);
entry.set("name", name);
entry.set("value", int256(value));
// 插入记录
int count = table.insert(id, entry);
return count;
}
// 更新资产记录
function updateRecord(string id, string name, uint256 value) public returns (int) {
Table table = tableFactory.openTable("t_asset");
// 创建更新条件
Condition condition = table.newCondition();
condition.EQ("id", id);
// 创建一条记录
Entry entry = table.newEntry();
entry.set("name", name);
entry.set("value", int256(value));
// 更新记录
int count = table.update(id, entry, condition);
return count;
}
// 查询资产记录
function selectRecord(string id) public view returns (string, uint256) {
Table table = tableFactory.openTable("t_asset");
// 创建查询条件
Condition condition = table.newCondition();
condition.EQ("id", id);
// 查询记录
Entries entries = table.select(id, condition);
if (entries.size() == 0) {
return ("", 0);
}
// 获取第一条记录
Entry entry = entries.get(0);
return (entry.getString("name"), uint256(entry.getInt("value")));
}
}
合约使用
点击部署
由于没有创建用户,所以不能选择用户,这个时候就先手动创建用户,可以在这里创建
发交易,我们在方法拦里面就能选择我们在合约里面编写的函数了,先是插入数据,最后通过主键id进行数据查询,更新操作
solidity不能存放float类型和Date类型的数据,也就是说solidity不支持这两种数据类型,一般像价格、金额这样的数据,我们在存储前先乘100,以分作为单位,转成int类型存储,
对于Date类型的数据,我们存储的是时间戳,也是通过int类型存储,如果在链上查询数据,拿到数据后需要对时间和金钱这样的数据进行处理还原。
调用合约接口
因为产生了交易,所以区块的数量增加了一个