通过Webase平台进行智能合约设计

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类型存储,如果在链上查询数据,拿到数据后需要对时间和金钱这样的数据进行处理还原。

调用合约接口

因为产生了交易,所以区块的数量增加了一个

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值