智能合约如何处理多个用户和不同的存储?

Or *_* O. 5 blockchain ethereum solidity smartcontracts

我正在以太坊区块链上试验智能合约。假设我有一个合约,类似于Solidity 文档中找到的 SimpleStorage.sol ,它具有任何人都可以访问的存储状态。正如链接所描述的,

任何人都可以使用不同的值再次拨打 set 并覆盖您的号码

这会导致问题,并且限制特定帐户对该功能的访问权限的解决方案在我的用例中并不合适。在我的合同中,我希望每个帐户设置的数据稍后可由不同的预定帐户访问(考虑一种关系,其中人 A->B,因此 B 仅使用来自 A 的数据,而 x->y,其中 y 使用数据完全来自 x。y 可以使用 A 的数据时不存在重叠)。据我了解,该问题有两种解决方案:

  1. 将地址相互映射并跟踪这个智能合约中的所有数据。
  2. 拥有初始帐户可以访问的智能合约“模板”,并为每个新帐户生成单独的智能合约,以仅保存与模板交互的数据。

当账户之间的关系变得更加复杂(映射单独的结构?)或者大量的人试图将他们的信息存储在合约中时,1的问题就会出现。

2的问题是冗余。我真的需要为每个尝试访问主模板的人制作一份单独的“合同”吗?

如果我的问题含糊不清,我可以解释更多,但我主要是在寻找概念性答案。我发现的大多数智能合约示例要么极其简单,要么过于复杂,并且没有提供具体的用例。

Afr*_*Afr 2

您可以在智能合约中创建访问列表。最简单的想法是设置一个所有者:

contract example {

    // Define variable owner of the type address
    address owner;

    // this function is executed at initialization and sets the owner of the contract
    function example() {
        owner = msg.sender; 
    }

    function doSomething() {
        if (msg.sender == owner) {
            // only the owner can do something, like storage access
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此逻辑可以根据您的需要进行扩展,您可以创建包含允许的用户帐户列表的结构体或数组,或者您可以创建一个允许动态添加和删除特权用户的逻辑。这一切都取决于你。

如果您只希望每个用户都能访问自己的数据,您可以将该数据存储在具有专用所有者帐户的结构中,如您在1中所述,或者,我建议每个用户创建自己的存储合约,这将是关于可访问性的最干净的方式。

主合约只需维护外部合约的引用列表,因此如果您有一个包含存储逻辑的主合约和每个必须存储数据的用户的专用合约,那么2中并没有真正的冗余。