区块链中文网
升级您的以太坊智能合约的最佳实践
2399
发表时间:2018-10-12 09:27

  在尝试构建复杂和交互式智能合约时,大多数工程团队迟早都会遇到类似的问题。在57个区块中,我们为加密货币空间建造了多种产品,并希望我们的学习能够帮助整个生态系统繁荣。下面,我们介绍了以太坊智能合约的编程模式和公共资源,帮助我们开发了我们的产品。如果您是老手,也许您会发现我们对代理委托模式的新颖应用的讨论是有用的。

  1.模式

  模式是架构设计和编程的最佳实践。理解模式不仅能帮助我们理解如何处理问题,还能帮助我们理解为什么我们需要以一种特定的方式来处理问题。它可以帮助我们更好地理解我们正在进行的平台。

  下列模式在https://fravoll.github上描述。在日常开发中,大多数情

  行为模式

  ·保护检查:确保智能合约的行为及其输入参数如预期的那样。

  ·状态机:使合约能够通过不同的状态,具有不同的相应功能。

  ·Oracle:访问存储在区块链之外的数据。

  ·随机性:在区块链的确定性环境中生成一个预定义的时间间隔。

  安全模式

  ·访问限制: 根据合适的标准限制进入合约功能。

  ·检查效果交互:减少恶意合约的攻击面,试图在外部调用后劫持控制流。

  ·以太安全传输:确保以太币安全的从一地址转移到另一个地址。

  ·将与传输以太网相关的风险转移到用户身上。

  ·紧急停止:在紧急情况下,添加一个选项来禁用关键的合约功能。

  可升级性模式

  ·代理委托:介绍在不破坏任何依赖关系的情况下升级智能契合约的可能性。

  ·永久存储:在智能合约升级后保留合约存储。

  经济模式

  ·字符串等价比较:检查两个提供的字符串的相等性。

  ·紧密变量包装:在存储或装载静态变量时优化气体消耗。

  ·内存阵列构建:以一种高效的方式从合约存储中聚合和检索数据。

  使用代理委托来更新智能合约

  代理委托模式是为了解决智能合约的可升级性问题而设计的。然而,我们在开发标记板时发现了这种模式的另一种用法。使用这种模式,在当许多相同合约的副本需要部署在区块链上时,我们就能够节省力气。

  Tokenpad是一个联合投资的平台。辛迪加的牵头机构可以创建资金池,为ICO筹集资金。每当他或她想要创建一个辛迪加 池时,一个领导者就会部署一个智能合约,而智能合约包含了所有用于工作的代码。在第一个Tokenpad版本中,创建一个池的成本约为400万。这是我们将所有代码移动到库后的成本,并且领导者只部署对库调用的智能合约。

  有了代理委托模式,我们就将一个辛迪加智能合约的单一实例部署到区块链中。当一个领导者想要创建一个辛迪加池时,我们会创建一个代理实例,并将其指向我们已经部署的唯一实例。

  使用代理委托模式将我们的天然气成本降低了60%,达到了150万美元!理解这些模式是开发高效和安全智能合约的良好开端,但是我们不需要从头开始来实现所有这些模式,我们可以利用框架和库来帮助我们加速开发,并且减少错误。

  2.框架和库

  框架和库是经过良好测试和可重用的已知模式和最佳实践的实现。在本节中,我们介绍了我们在项目中使用的一些框架和库,以及它们提供了什么模式和它们可能没有解决的问题。

  OpenZeppelin

  OpenZeppelin是一个用于安全智能合约开发的库。它提供了诸如ERC20和ERC721等标准的实现,您可以按原样部署来扩展以满足您的需要,以及构建定制合约和更复杂的分散系统的可靠组件。

  OpenZepplin提供了一些解决常见问题的库。下面是在我们的项目中使用的一些最常见和有用的特性。

  Math/ SafeMath——防止溢出和不足。不要使用默认的算术运算符。当存在溢出或不足时,算术运算符不会失败,这可能是可利用的。

  ownership / Ownable ——将合同创建者的地址保存为所有者,并检查一个呼叫地址是否存在真的所有者。所有权可以转移到其他地址。这是访问限制模式的应用。

  我们需要意识到的一个关键设计缺陷是:当我们将合约的所有权转移到另一个地址时,如果该地址不是有效地址,或者不是已知的私钥地址,我们将永远失去对合约的控制。处理所有权转让的更好方法是在转让权结束时不立即转让所有权,而是允许当前所有权人在新所有权人提出所有权要求之前保持所有权。这样,我们可以确保合约始终由一个有效的地址所拥有,并避免将所有权转移到我们无法控制的地址。

  lifecycle / Pausable ———提供紧急停止机制。在紧急情况下停止运行以减少损失。这是“实体停止”模式的一个应用。

  如果我们在生产智能合约中发现了一个缺陷,我们可以暂停这些合约,以避免第三方利用这个关键问题,然后在修复它们。

  Access/rbac/rbac——访问限制模式的一个应用。RBAC是管理访问控制的一种更灵活的方法。我们可以有多个管理员,而Ownable只允许一个所有者对合同拥有控制权。

  Token/ERC20 ——这里的文件提供了一组实现通用ERC20代币功能的合约。通过使用多重继承,我们可以使用这些基本合约轻松地构建一个ERC20代币。

  ZOS-LIB

  Zos-lib提供了一个用于开发、部署和操作以太坊和其他所有EVM和eWASM驱动区块链上的可升级智能合约的库。

  可升级性/代理——代理实现。用低级委托调用另一个合约。

  该合约实现了代理委托模式,并修复了该模式不能解决的一个关键问题。在代理委托模式的文章中,代理合约中声明了2个存储变量,可以很容易地被使用委托调用合约定义的存储变量覆盖,从而导致数据损坏。该实现使用一种称为非结构化存储的技术来避免存储变量被意外覆盖。

  初始化——除构造函数外还提供初始化功能。由于在本例中不调用构造函数,因此与代理一起使用来初始化合约。

  3. 分割合约

  如果合约的规模过大,部署合约所需的变量可能超过其限制,从而导致合约部署失败。要成功地部署大型和复杂的合约,我们需要拆分合约并使用多个事务进行部署。分割合同有两种方法:

  将一个合约分成多个合约

  一份大合约可以被分割成多个小合约。然后,您可以将这些合约地址传递给第三方来调用合约,在部署这些地址时将它们连接到一起。

  优点:

  ·合约可以小到可以部署就行

  ·可以只更新代码的一部分来升级整个应用程序或修复错误。这是通过部署一个新版本的合约,然后在调用合约中更新引用来实现的。

  缺点:

  ·消息发送者将是呼叫合约而不是发起交易的地址,这可能是复杂的一种管理方式

  将合约分成多个库

  一个大的合约可以被分割成多个库,然后使用一个合约来调用这些库。

  优点:

  ·库可以尽可能小地部署

  ·库可以很容易地跨多个合约重用,并且只需要部署一次

  ·没有消息发送者的问题,库的代码是在合约的上下文中执行的

  ·库可以单独升级

  缺点:

  ·每次部署库的新版本时,依赖于该库的任何合约都将需要再次部署,因为在部署库时是静态链接的。


分享到:
全部评论(0条)
亲~快来评论噢!