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

标签 blockchain ethereum solidity smartcontracts

我正在以太坊区块链上试验智能合约。假设我有一个契约(Contract),比如 SimpleStorage.sol 找到 in the Solidity documentation ,具有任何人都可以访问的存储状态。正如链接所描述的那样,

anyone could just call set again with a different value and overwrite your number



这会导致问题,并且限制该功能对特定帐户的可访问性的解决方案不适用于我的用例。在我的契约(Contract)中,我希望每个帐户设置的数据以后可以由不同的预定帐户访问(想想这样的关系,其中人 A->B 所以 B 仅使用来自 A 的数据,而 x->y 则 y 使用数据完全来自 x。在 y 可以使用 A 的数据的地方不存在重叠)。根据我的理解,该问题有两种解决方案:
  • 将地址相互映射并跟踪这个单一智能合约中的所有数据。
  • 拥有一个初始账户将访问的智能合约"template",并为每个新账户生成一个单独的智能合约,以简单地保存与模板交互的数据。

  • 的问题1 当帐户之间的关系变得更加复杂(映射单独的结构?)或大量人试图将他们的信息存储在合约中时,就会发生这种情况。

    的问题2 是冗余。我真的需要为试图访问主模板的每个人制作一份单独的“契约(Contract)”吗?

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

    最佳答案

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

    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
            }
        }
    }
    

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

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

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

    关于blockchain - 智能合约如何处理多个用户和不同的存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109578/

    相关文章:

    blockchain - 如何使用特定私钥创建帐户?

    javascript - 契约(Contract)名称抛出未定义的错误?

    javascript - Solc 超过 Object.$db 的最大调用堆栈大小 [as dynCall_viiiiii]

    javascript - MetaMask - RPC 错误 : Error: [ethjs-query] while formatting outputs from RPC

    javascript - Solidity 事件未被调用

    blockchain - 是否可以在 ERC721 合约中调用 ERC20 函数?

    blockchain - Composer playground 无法加载示例业务网络

    chain - 以太坊和链有什么区别?

    java - 如何在Linux中执行Shell脚本?

    java - 安装web3j时无法编码的字符无法编码