在结合度 - 气体效率中的遗传组成

fer*_*rit 9 oop performance inheritance composition solidity

在OOP语言中,继承的组合是众所周知的最佳实践.Solidity也是一种OOP语言,但也存在气体效率问题.

问题是,在Solidity中,考虑到各自的天然气成本,组成和继承如何相互比较?

Pru*_*mar -1

调整合约并不是一门精确的科学,而是安全性、良好的编码实践和成本之间的平衡。

在以太坊中,交易需要消耗天然气,因此也需要消耗以太币。减少合约消耗的 Gas 在两种情况下很重要:

  1. 部署合约的成本
  2. 调用合约函数的成本

继承和组合等 OOP 原则有助于代码重用,从而自动减少合约的字节大小。然而,开发人员仍然有很大的责任编写有效的代码来优化气体使用。

为了避免部署合约的巨大成本,开发人员编写高效的代码非常重要。特别是当一个合约继承另一个合约或一个合约由另一个合约组成时。

如果Contract B继承自Contract Athen,在编译期间,Solidity 编译器会将 的字节码注入AB. 这增加了B. (本质上,大小B= 大小B+ 大小A)。同样,如果Contract C由 组成Contract D,则 的字节码D将被编译为 的字节码Ctransaction cost但是,如果您作为开发人员认为与通过重用代码来减少成本相比,这种初始成本是合理的,那么您就需要做出执行决定!

但是,当你像这样进行组合时:

// Foo bytecode will be loaded into memory from an existing Foo deployment
Foo public foo2 = Foo(0xF00BAA...); //THIS is more efficient compared to new Foo().
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您可以考虑继承的替代方案。例如,调用主合约(例如注册表或主存储/逻辑)中的外部函数的子合约往往比继承复杂合约的子合约小。这不仅会降低部署成本,而且transactions总体上也会减少天然气成本。

另一种减少大小的方法是删除无用的代码,. 例如:

function p1 ( uint x ){ 
   if ( x > 5)
    if ( x*x < 20)
       XXX }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,第 3 行和第 4 行永远不会被执行,并且可以通过仔细检查合约逻辑来避免这些类型的无用代码,这将减少智能合约的大小。

总体而言,仅选择组合与继承并不能提高 Gas 效率。其实用的编码可产生高效的代码!

有关更多详细信息,本文帮助您了解编写 Gas 高效的 Solidity 代码的良好实践。

希望能帮助到你。