首页 文章

哪个是在以太坊区块链上持有合约数据的更有效方法?

提问于
浏览
3

我正在玩一个私有的以太坊区块链,我有兴趣实施一些智能合约 . 但是,信息非常有限,因为这是区块链的较新实现 .

举个例子,假设我想要一份包含有关某人信息的 Contract . 是否更有效率 create a new contract for each person, or simply hold information about all users in the same contract?

在伪代码中,这两个选项看起来像这样 .

选项1(为每个人实例化一份新 Contract ):

contract = // contract code

ethereum.newContract(contract, userInfo);

选项2(保存一份 Contract 中所有用户的信息):

contract = {
  var users = [];

  // other contract code
}

ethereum.newContract(contract, userInfo);

以下是我们如何在这种情况下量化“效率”:

  • 每次实例化新 Contract 时,我们必须挖掘 Contract 的块,然后挖掘用户对 Contract 进行的任何交易 . 但是,如果我们只实例化一个 Contract ,我们只挖掘 Contract 部署一次,然后再进行任何交易,但......

  • 如果我们选择在一个 Contract 中存储所有用户的所有信息,那么只有 Contract 数据的"diff"(所有用户的"array")存储为一个块,还是存储在每个块中的整个数据集?要么...

  • 如果我们选择"contract per user",如果我们多次存储整个合约定义,那么它是否"waste space"(并且值得进行可能需要进行多余的挖掘)?

希望我的问题很明确,但如果没有,请告诉我 . 我相信这个问题是“权衡”之一 .

(Re:标签 - 我正在使用以太坊的golang实现,以及与之交互的JavaScript API . )

2 回答

  • 3
    • 是的 . 但是,每次要添加用户时,都必须发送一个事务,以便将新记录添加到现有 Contract 中 .

    • 块由事务组成 . 每次添加用户时,都必须为相应的函数调用创建事务 . 但是,您只需执行此操作一次,而不会将数据冗余地复制到将来的块中 .

    • 是的 .

    从您的问题的结构方式来看,您似乎应该再次阅读交易和块之间的差异 .

  • 0

    鉴于您的用户对象不是太大,所有用户的单一 Contract 就足够了 .

    从上面的代码中,建议使用 map ,这将允许比数组更有效地获取用户记录 . 按任意字符串键入记录,例如姓氏 .

    mapping(string => user_struct) public users;
    

相关问题