http://www.7klian.com

以太坊智能合约版本进级的焦点要领

  }
  bool private initializing;
不幸的是,这种要领也有其自身的陷阱。由于署理合约和存储合约都是永恒的,因此,假如在任何一个合约中发明错误或裂痕,都无法修复。 因此务必仔细思量您的署理和存储布局。
    }
    }
以太坊仍处于起步阶段,关于如何进级智能合约版本的争议许多,但我们将先容一些当今最好的选择。
  modifier initializer() {
        owner = msg.sender; // this owner may be another contract with multisig, not a single contract owner
   * @dev Indicates that the contract is in the process of being initialized.

}
bytes32 private constant implementationPosition =
    }
   * @dev Modifier to use in the initializer function of a contract.
    _;
contract SomeRegister {
    initializing = true;
确保
智能合约是可进级的,并仔细思量可进级进程,这两点都很重要。固然这并不是一个关于智能合约可进级性的选项的详尽列表,但这应该是关于这个主题的适当指南。

    function SomeRegister() {
在软件工程中,当发明新的bug和安详风险时,凡是会对它们举办修补,并及时推送更新的
版本。在智能合约开拓中,可进级性并不是那么简朴。因此,我们必需采纳差异的做法。
它利用两个智能合约的事情:注册表合约和逻辑合约。注册表协定仅用于将用户指向逻辑协定的当前版本。每当逻辑合约被进级时,注册表合约的所有者就可以更新逻辑合约被进级的地点。
    {
    address public owner;
  /**
    initialized = true;
  /**
}
    returns (bool)
        }
在利用初始值设定项函数时,必需打起十二分精力。思量逻辑合约担任的根基合约也很重要。这部门出格巨大,因为Solidity也支持多重担任。
这种要领长短常倒霉的,因为当用户想要利用合约时,他们必需首先查找当前地点。不然大概导致资金损失。将数据迁移到新合约中也很是坚苦,因此必需仔细思量此进程以制止失败。
这种技能利用三种差异的合约:署理合约来委托挪用并充当永久存储;逻辑合约将处理惩罚数据;尚有存储合约。署理合约和逻辑合约都担任自存储合约,因此它们的存储引用是对齐的。

智能合约可进级性的根基要领

该技能的事情道理是将可进级性所需的数据生存在存储中的牢靠位置,以防备被新数据包围。我们可以利用SLOAD和SSTORE操纵码举办汇编。由于存储插槽只是从0x0开始递增,因此我们利用很高的存储插槽来防备包围 我们可以通过对常量变量举办散列来生成存储槽。 由于恒定状态变量不会占用存储空间,因此我们不必担忧它会被包围。
与以前的要领一样,此要领需要您的逻辑合约以及帮助合约。在这种环境下,帮助合约是永久存储合约。该技能通过疏散逻辑和数据来起浸染。逻辑合约可以随时进级,而且由于数据存储在外部,因此您的数据受到掩护。

    address public currentVersion;
注册合约
        _;
            return true;
非布局化存储可进级性
进级依赖于结构函数的合约
    function changeContract(address newVersion) public
   */

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读