Table合约自写工具类详解

这篇具有很好参考价值的文章主要介绍了Table合约自写工具类详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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() 方法用于创建一个新的查询条件实例

另外还有一个 KVTableFactory 合约,用于创建和打开键值表。其中包含:

  • openTable(string) 方法用于打开一个已经存在的键值表并返回该表格实例 KVTable
  • createTable(string, string, string) 方法用于创建一个新的键值表,并需要传入三个参数:表格名、主键名、存储引擎类型

最后是一个 KVTable 合约,代表键值表中的一行数据记录。它提供了获取和设置键值对数据的方法,其中 key 的类型为字符串,value 的类型为 Entry

pragma solidity ^0.4.24;

contract TableFactory {
    function openTable(string) public view returns (Table); //open table
    function createTable(string, string, string) public returns (int256); //create table
}

//select condition
contract Condition {
    function EQ(string, int256) public view;
    function EQ(string, string) public view;
    function EQ(string, address) public view;

    function NE(string, int256) public view;
    function NE(string, string) public view;

    function GT(string, int256) public view;
    function GE(string, int256) public view;

    function LT(string, int256) public view;
    function LE(string, int256) public view;

    function limit(int256) public view;
    function limit(int256, int256) public view;
}

//one record
contract Entry {
    function getInt(string) public view returns (int256);
    function getUInt(string) public view returns (uint256);
    function getAddress(string) public view returns (address);
    function getBytes64(string) public view returns (bytes1[64]);
    function getBytes32(string) public view returns (bytes32);
    function getString(string) public view returns (string);

    function set(string, int256) public;
    function set(string, uint256) public;
    function set(string, string) public;
    function set(string, 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, Condition) public view returns (Entries);
    function insert(string, Entry) public returns (int256);
    function update(string, Entry, Condition) public returns (int256);
    function remove(string, Condition) public returns (int256);

    function newEntry() public view returns (Entry);
    function newCondition() public view returns (Condition);
}

contract KVTableFactory {
    function openTable(string) public view returns (KVTable);
    function createTable(string, string, string) public returns (int256);
}

//KVTable per permiary key has only one Entry
contract KVTable {
    function get(string) public view returns (bool, Entry);
    function set(string, Entry) public returns (int256);
    function newEntry() public view returns (Entry);
}

编写Table合约工具类

使用 Solidity 语言编写的工具类,基于给出的 Table 合约,可以进行数据操作,包括对表格中数据的 CRUD 操作。

该工具类包含以下方法:

  • constructor: 构造函数,用于初始化工具类实例,需要传入 TableFactory 实例、表格名和主键名。通过表格名和主键名打开表格实例。
  • createTable: 创建新表格,在当前数据库中创建一张新表格,需要传入存储引擎类型,返回新建表的 ID。
  • selectByID: 根据给定的主键 ID 查询表格数据,返回查询结果的第一行数据记录。
  • selectByCondition: 根据给定的查询条件查询表格数据,返回符合条件的所有数据记录。
  • insertEntry: 向表格中插入一条新的数据记录,需要传入数据记录实例,返回新增记录的 ID。
  • updateByID: 根据给定的主键 ID 更新表格中的数据记录,需要传入需要更新的数据记录实例,返回影响的记录数。
  • removeByID: 根据给定的主键 ID 删除表格中的数据记录,返回影响的记录数。

需要注意的是,在方法调用前,需要确保已经打开了正确的表格实例,并且已经传入正确的表格名和主键名。

pragma solidity ^0.8.0;

import "./Table.sol";

contract TableUtils {
    TableFactory private tableFactory;
    Table private table;
    string private tableName;
    string private primaryKey;

    // 构造函数,用于初始化工具类实例
    constructor(TableFactory factory, string memory name, string memory key) {
        tableFactory = factory;
        tableName = name;
        primaryKey = key;

        // 打开表格实例
        table = tableFactory.openTable(tableName);
    }

    // 获取当前打开的表格实例
    function getTable() external view returns (Table) {
        return table;
    }

    // 在当前数据库中创建一张新表格
    function createTable(string memory engineType) external returns (int256) {
        return tableFactory.createTable(tableName, primaryKey, engineType);
    }

    // 根据给定的主键 ID 查询表格数据,返回查询结果的第一行数据记录
    function selectByID(int256 id) external view returns (Entry memory) {
        Condition condition = table.newCondition();
        condition.EQ(primaryKey, id);

        Entries entries = table.select("", condition);
        require(entries.size() == 1, "Record not found");

        return entries.get(0);
    }

    // 根据给定的查询条件查询表格数据,返回符合条件的所有数据记录
    function selectByCondition(Condition condition) external view returns (Entries memory) {
        return table.select("", condition);
    }

    // 向表格中插入一条新的数据记录,需要传入数据记录实例,返回新增记录的 ID
    function insertEntry(Entry memory entry) external returns (int256) {
        return table.insert("", entry);
    }

    // 根据给定的主键 ID 更新表格中的数据记录,需要传入需要更新的数据记录实例,返回影响的记录数
    function updateByID(int256 id, Entry memory entry) external returns (int256) {
        Condition condition = table.newCondition();
        condition.EQ(primaryKey, id);

        return table.update("", entry, condition);
    }

    // 根据给定的主键 ID 删除表格中的数据记录,返回影响的记录数
    function removeByID(int256 id) external returns (int256) {
        Condition condition = table.newCondition();
        condition.EQ(primaryKey, id);

        return table.remove("", condition);
    }
}

TableUtils使用

使用 TableUtils 工具类的示例。首先,需要在合约中进行实例化,并传入正确的参数:

pragma solidity ^0.8.0;

import "./TableFactory.sol";
import "./TableUtils.sol";

contract MyContract {
    TableFactory private tableFactory;
    TableUtils private utils;

    // 构造函数,用于初始化合约实例和工具类实例
    constructor(TableFactory factory) {
        tableFactory = factory;
        utils = new TableUtils(tableFactory, "my_table", "id");
    }

    // 创建新表格,并返回新建表的 ID
    function createTable() external returns (int256) {
        return utils.createTable("BASIC");
    }

    // 向表格中插入一条新的数据记录,并返回新增记录的 ID
    function insertData(string memory name, uint256 value) external returns (int256) {
        Entry memory entry = utils.getTable().newEntry();

        entry.set("name", name);
        entry.set("value", int256(value));

        return utils.insertEntry(entry);
    }

    // 根据给定的主键 ID 更新表格中的数据记录,需要传入需要更新的数据记录实例,返回影响的记录数
    function updateData(int256 id, string memory name, uint256 value) external returns (int256) {
        Entry memory entry = utils.getTable().newEntry();

        entry.set("name", name);
        entry.set("value", int256(value));

        return utils.updateByID(id, entry);
    }

    // 根据给定的主键 ID 删除表格中的数据记录,返回影响的记录数
    function removeData(int256 id) external returns (int256) {
        return utils.removeByID(id);
    }

    // 根据给定的主键 ID 查询表格中的数据记录,并返回查询结果
    function getDataByID(int256 id) external view returns (string memory, uint256) {
        Entry memory entry = utils.selectByID(id);

        return (entry.getString("name"), uint256(entry.getInt("value")));
    }

    // 根据给定的查询条件查询表格中的数据记录,并返回查询结果
    function getDataByCondition() external view returns (string[] memory, uint256[] memory) {
        Condition condition = utils.getTable().newCondition();
        Entries entries = utils.selectByCondition(condition);

        string[] memory names = new string[](uint256(entries.size()));
        uint256[] memory values = new uint256[](uint256(entries.size()));

        for (int256 i = 0; i < entries.size(); i++) {
            Entry memory entry = entries.get(i);

            names[uint256(i)] = entry.getString("name");
            values[uint256(i)] = uint256(entry.getInt("value"));
        }

        return (names, values);
    }
}

在这个示例中,我们首先创建了一个名为 MyContract 的合约,在构造函数中初始化并传入了一个 TableFactory 实例。然后,使用该工厂实例创建了一个名为 my_table 的表格,并指定主键名为 id

接下来定义了一些方法,用于对表格数据进行 CRUD 操作。例如,insertData 方法可以向表格中插入一条新的数据记录,并返回新增数据的 ID;getDataByID 方法可以根据给定的主键 ID 查询表格中的数据记录,并返回查询结果。

需要注意的是,所有涉及到对表格数据进行操作的方法,都需要通过 TableUtils 工具类实例来调用。在每个方法中,都需要先获取正确的表格实例,并根据需要创建、设置和读取数据记录实例。最后,再将数据记录实例作为参数,调用相应的方法进行数据操作。文章来源地址https://www.toymoban.com/news/detail-416447.html

到了这里,关于Table合约自写工具类详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(55)
  • slither——区块链智能合约静态分析工具

    Slither是一个用Python 3编写的智能合约静态分析框架(源码),提供如下功能: 自动化漏洞检测。提供超30多项的漏洞检查模型,模型列表详见:https://github.com/crytic/slither#detectors 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。 代码理解。Slither能够绘

    2024年01月16日
    浏览(47)
  • 生态工具箱 | 虚拟机测试工具WasmFuzzer,智能合约安全防火墙

    长安链生态工具箱   丰富实用的区块链生态工具不仅可以让开发者部署、开发过程更加得心应手,还可以从能力上扩展区块链应用边界。长安链正在构建强大的生态工具箱以增强在其在各类场景下的应用能力,如智能合约漏洞检测、抗量子多方安全计算、链迁移、密文检索

    2024年02月10日
    浏览(50)
  • Vivado自写分频模块的分频时钟的约束条件编写

    由于项目需要,整个工程需要在100kHz的时钟下运行,FPGA的clk:50MHz clocking wizard 问题:MMCM和PLL都不能实现分频到100KHz这么低的频率 MMCM最小频率4.687MHz PLL最小频率6.25MHz 分频模块如下: 问题:自己写的分频模块直接使用是不可以的,需要在约束文件中进行时序约束 (1)打开

    2024年02月07日
    浏览(63)
  • 智能合约Smart Contract技术详解

    建议读者先了解下solidity,这里推荐CryptoZombies,还是比较详细的。 ok当你大概知道自己在做什么之后,我们就可以开始编写智能合约了,首先我们需要一个编译器,我是用的web ide remix,当然他也有桌面版,使用起来都是一样的,web版本的话记得做备份,如果仅靠浏览器缓存来

    2024年02月03日
    浏览(50)
  • solidity案例详解(六)服务评价合约

     有服务提供商和用户两类实体,其中服务提供商部署合约,默认诚信为true,用户负责使用智能合约接受服务及评价,服务提供商的评价信息存储在一个映射中,可以根据服务提 供商的地址来查找评价信息。用户评价信息, 服务提供商的评价信息会随之更新。服务提供商查

    2024年02月03日
    浏览(38)
  • 有了这个工具包,用Java调用智能合约更加简便

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(50)
  • ERC314协议代币开发及合约开发详解

    ERC314 是一种新的代币标准,旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发,并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账,无需借助 DEX 或 SWAP 进行交易。 这使得交易更加简单、

    2024年04月09日
    浏览(65)
  • 以太坊虚拟机EVM介绍,智能合约详解

    指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。 智能合约是一种基于区块链技术的自动执行合约的计算机程序。它们是一组以代码形式编写的、在区块

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包