这是在以太坊区块链上保存合同数据的更有效的方式



我正在玩一个私人以太坊区块链,我有兴趣实现一些智能合约。然而,由于这是区块链的一个较新实现,因此信息非常有限。

举个例子,比如说我想要一份包含一个人信息的合同。为每个人创建一个新合同,或者只是在同一合同中保存所有用户的信息,这样更有效吗

在伪代码中,这两个选项看起来是这样的。

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

contract = // contract code
ethereum.newContract(contract, userInfo);

选项2(将所有用户的信息保存在一个合同中):

contract = {
  var users = [];
  // other contract code
}
ethereum.newContract(contract, userInfo);

以下是我们如何量化这种情况下的"效率":

  1. 每次实例化新合同时,我们都必须挖掘合同的块,然后挖掘用户对合同进行的任何交易。然而,如果我们只实例化一个合同,我们只挖掘一次合同部署,然后挖掘之后的任何事务,但是
  2. 如果我们选择将所有用户的所有信息存储在一个合同中,是将合同数据的"diff"(所有用户的"数组")存储为一个块,还是将整个数据集存储在每个块中?或者
  3. 如果我们选择"每个用户的合同",如果我们多次存储整个合同定义,是否会"浪费空间"(是否值得进行可能的冗余挖掘)

希望我的问题是清楚的,但如果不是,请告诉我。我认为这个问题是一个"权衡"问题。

(回复:标签——我使用以太坊的golang实现,并使用JavaScript API与之交互。)

  1. 是的。但是,每次您想要添加用户时,都必须发送一个事务,以便将新记录添加到现有合同中。

  2. 区块由交易组成。每次添加用户时,都必须为相应的函数调用创建一个事务。但是,您只需要这样做一次,而且数据不会被冗余复制到未来的块中。

  3. 是的。

从你的问题的结构来看,你似乎应该重新阅读交易和区块之间的区别。

如果用户对象不太大,那么为所有用户提供一个单独的契约就足够了。

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

mapping(string => user_struct) public users;

最新更新