天河链智能合约的编写
天河链是天河国云自主研发的区块链,基于国产化软硬件融入数据可信计算和流转的底层机制,
可满足区块链的多种应用场景,并支撑天河数通(TiDavaless)、天河链控(TiDavaLink)、天河智元等众多产品。
目前天河链支持Solidy和C++语言开发的智能合约。
我这里以solidity语言为例。
这个是天河链的首页展示
一、创建合约文件
主运行合约我这里写了两个,分别是GeneralContract4和Transaction,Table属于自带的工具类,
天河链里面写智能合约有个不好的点,就是代码编译提交后就不能修改了,所以如果后期在同一个智能合约里面添加新的方法函数,智能重新创建新的合约
二、Table类
contract TableFactory { function openTable(string memory) public view returns (Table) {} //open table function createTable(string memory, string memory, string memory) public returns (int256) {} //create table } //select condition contract Condition { function EQ(string memory, int256) public view{} function EQ(string memory, string memory) public view{} function NE(string memory, int256) public view{} function NE(string memory, string memory) public view{} function GT(string memory, int256) public view{} function GE(string memory, int256) public view{} function LT(string memory, int256) public view{} function LE(string memory, int256) public view{} function limit(int256) public view{} function limit(int256, int256) public view{} } //one record contract Entry { function getInt(string memory) public view returns (int256) {} function getUInt(string memory) public view returns (uint256) {} function getAddress(string memory) public view returns (address) {} function getBytes64(string memory) public view returns (bytes1[64] memory) {} function getBytes32(string memory) public view returns (bytes32) {} function getString(string memory) public view returns (string memory) {} function set(string memory, int256) public {} function set(string memory, uint256) public {} function set(string memory, string memory) public {} function set(string memory, address) public {} } //record sets contract Entries { function get(int256) public view returns (Entry) {} function size() public view returns (int256) {} } //Table main contract contract Table { function select(string memory, Condition) public view returns (Entries) {} function insert(string memory, Entry) public returns (int256) {} function update(string memory, Entry, Condition) public returns (int256) {} function remove(string memory, Condition) public returns (int256) {} function newEntry() public view returns (Entry) {} function newCondition() public view returns (Condition) {} } contract KVTableFactory { function openTable(string memory) public view returns (KVTable) {} function createTable(string memory, string memory, string memory) public returns (int256) {} } //KVTable per permiary key has only one Entry contract KVTable { function get(string memory) public view returns (bool, Entry) {} function set(string memory, Entry) public returns (int256) {} function newEntry() public view returns (Entry) {} }
这个工具类跟FISCO BCOS里面的Table工具类差不多的,大家也可以参考。
三、业务合约编写
我这边写了两个智能合约,其实逻辑都差不多,只是根据不同的业务场景,其中一个是存放常规数据,另外一个是存放加密数据。
合约GeneralContract4,该合约用于存放常规数据
pragma solidity ^0.6.10; pragma experimental ABIEncoderV2; import "./Table.sol"; contract GeneralContract4{ TableFactory tableFactory; string constant TABLE_NAME = "general_info"; event EventInsert(int256 count, string type_tablename_id, string version,int256 status,string data); event EventUpdate(int256 count, string type_tablename_id, string version,int256 status,string data); event EventDelete(int256 count,string type_tablename_id); constructor() public { // table内置合约的地址 tableFactory = TableFactory(0x1001); // 创建基础表 tableFactory.createTable(TABLE_NAME, "type_tablename_id", "version,status,data"); } //查询操作 function select(string memory type_tablename_id) public view returns(Entry){ Table table = tableFactory.openTable(TABLE_NAME); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); Entries entries = table.select(type_tablename_id, condition); require(entries.size() == 1, "DATA_NOT_EXIST"); return entries.get(0); } /** * 描述: 表名称+唯一id组合主键查询记录 */ function selectById(string memory type_tablename_id) public view returns (string memory,string memory, string memory, string memory) { Entry entry = select(type_tablename_id); return (strConcat("type_tablename_id:",entry.getString("type_tablename_id")), strConcat("version:",entry.getString("version")), strConcat("status:",entry.getString("status")), strConcat("data:",entry.getString("data"))); } /** * 描述: 插入记录. */ function insert(string memory type_tablename_id, string memory version, int256 status,string memory data) public returns (int256) { //字段校验 require(checkRepeat(type_tablename_id),"上链数据type_tablename_id已经存在"); Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); entry.set("type_tablename_id",type_tablename_id); entry.set("version",version); entry.set("status",status); entry.set("data",data); int256 count = table.insert(type_tablename_id, entry); emit EventInsert(count, type_tablename_id, version, status, data); return count; } /** * 描述: 修改记录 */ function update(string memory type_tablename_id, string memory version,int256 status,string memory data) public returns (int256) { //检查字段是否为空 require(bytes(type_tablename_id).length>0,"type_tablename_id不能为空"); //验证更新的数据是否存在 require((checkRepeat(type_tablename_id)==false),"数据不存在,信息更新失败"); Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); entry.set("version", version); entry.set("status", status); entry.set("data", data); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); int256 count = table.update(type_tablename_id, entry, condition); emit EventUpdate(count, type_tablename_id, version, status, data); return count; } /** * 描述: 移除记录 */ function remove(string memory type_tablename_id) public returns (int256) { Table table = tableFactory.openTable(TABLE_NAME); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); int256 count = table.remove(type_tablename_id, condition); emit EventDelete(count,type_tablename_id); return count; } //检查记录重复 function checkRepeat(string memory type_tablename_id) private view returns(bool){ Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); Entries record = table.select(type_tablename_id,condition); if (0 == record.size()) { return true; }else{ return false; } } //字符串拼接 function strConcat(string memory _a, string memory _b) public view returns (string memory){ bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); string memory ret = new string(_ba.length + _bb.length); bytes memory bret = bytes(ret); uint k = 0; for (uint i = 0; i < _ba.length; i++)bret[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bret[k++] = _bb[i]; return string(ret); } }
合约Transaction,该合约用于存储交易相关的数据,这一类数据涉及到加密数据
pragma solidity ^0.6.10; pragma experimental ABIEncoderV2; import "./Table.sol"; contract Transaction{ TableFactory tableFactory; string constant TABLE_NAME = "transaction_info"; event EventInsert(int256 count, string type_tablename_id, string version,int256 status,string data); event EventUpdate(int256 count, string type_tablename_id, string version,int256 status,string data); event EventDelete(int256 count,string type_tablename_id); constructor() public { // table内置合约的地址 tableFactory = TableFactory(0x1001); // 创建基础表 tableFactory.createTable(TABLE_NAME, "type_tablename_id", "version,status,data"); } //查询操作 function select(string memory type_tablename_id) public view returns(Entry){ Table table = tableFactory.openTable(TABLE_NAME); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); Entries entries = table.select(type_tablename_id, condition); require(entries.size() == 1, "DATA_NOT_EXIST"); return entries.get(0); } /** * 描述: 表名称+唯一id组合主键查询记录 */ function selectById(string memory type_tablename_id) public view returns (string memory,string memory, string memory, string memory) { Entry entry = select(type_tablename_id); return (strConcat("type_tablename_id:",entry.getString("type_tablename_id")), strConcat("version:",entry.getString("version")), strConcat("status:",entry.getString("status")), strConcat("data:",entry.getString("data"))); } /** * 描述: 插入记录. */ function insert(string memory type_tablename_id, string memory version, int256 status,string memory data) public returns (int256) { //字段校验 require(checkRepeat(type_tablename_id),"上链数据type_tablename_id已经存在"); Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); entry.set("type_tablename_id",type_tablename_id); entry.set("version",version); entry.set("status",status); entry.set("data",data); int256 count = table.insert(type_tablename_id, entry); emit EventInsert(count, type_tablename_id, version, status, data); return count; } /** * 描述: 修改记录 */ function update(string memory type_tablename_id, string memory version,int256 status,string memory data) public returns (int256) { //检查字段是否为空 require(bytes(type_tablename_id).length>0,"type_tablename_id不能为空"); //验证更新的数据是否存在 require((checkRepeat(type_tablename_id)==false),"数据不存在,信息更新失败"); Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); entry.set("version", version); entry.set("status", status); entry.set("data", data); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); int256 count = table.update(type_tablename_id, entry, condition); emit EventUpdate(count, type_tablename_id, version, status, data); return count; } /** * 描述: 移除记录 */ function remove(string memory type_tablename_id) public returns (int256) { Table table = tableFactory.openTable(TABLE_NAME); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); int256 count = table.remove(type_tablename_id, condition); emit EventDelete(count,type_tablename_id); return count; } //检查记录重复 function checkRepeat(string memory type_tablename_id) private view returns(bool){ Table table = tableFactory.openTable(TABLE_NAME); Entry entry = table.newEntry(); Condition condition = table.newCondition(); condition.EQ("type_tablename_id", type_tablename_id); Entries record = table.select(type_tablename_id,condition); if (0 == record.size()) { return true; }else{ return false; } } //字符串拼接 function strConcat(string memory _a, string memory _b) public view returns (string memory){ bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); string memory ret = new string(_ba.length + _bb.length); bytes memory bret = bytes(ret); uint k = 0; for (uint i = 0; i < _ba.length; i++)bret[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bret[k++] = _bb[i]; return string(ret); } }
四、合约的使用
分别点击右上角的保存、编译、部署,编译确定没有语法错误后就可以部署合约
完成部署后点击“发交易”,通过在合约中定义的功能函数,通常我们是CRUD
我这里选择insert,输入需要添加的字段内容,返回交易成功
通过选择selectById功能函数对数据进行查询
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统