百里登风

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

天河链智能合约的编写

天河链是天河国云自主研发的区块链,基于国产化软硬件融入数据可信计算和流转的底层机制,

可满足区块链的多种应用场景,并支撑天河数通(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功能函数对数据进行查询

 

 

 

posted on   百里登峰  阅读(10)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示