3

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

举个例子,假设我想要一份包含某人信息的合同。为每个人创建一个新合约更有效,还是简单地将所有用户的信息保存在同一个合约中?

在伪代码中,这两个选项如下所示。

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

contract = // contract code

ethereum.newContract(contract, userInfo);

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

contract = {
  var users = [];

  // other contract code
}

ethereum.newContract(contract, userInfo);

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

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

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

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

4

2 回答 2

3
  1. 是的。但是,每次您想要添加用户时,您都必须发送交易以将新记录添加到现有合同。

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

  3. 是的。

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

于 2015-12-25T18:21:37.530 回答
0

考虑到您的用户对象不太大,所有用户的单个合同就足够了。

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

mapping(string => user_struct) public users;
于 2017-12-13T20:17:17.163 回答