fer*_*rit 9 oop performance inheritance composition solidity
在OOP语言中,继承的组合是众所周知的最佳实践.Solidity也是一种OOP语言,但也存在气体效率问题.
问题是,在Solidity中,考虑到各自的天然气成本,组成和继承如何相互比较?
Pru*_*mar -1
调整合约并不是一门精确的科学,而是安全性、良好的编码实践和成本之间的平衡。
在以太坊中,交易需要消耗天然气,因此也需要消耗以太币。减少合约消耗的 Gas 在两种情况下很重要:
继承和组合等 OOP 原则有助于代码重用,从而自动减少合约的字节大小。然而,开发人员仍然有很大的责任编写有效的代码来优化气体使用。
为了避免部署合约的巨大成本,开发人员编写高效的代码非常重要。特别是当一个合约继承另一个合约或一个合约由另一个合约组成时。
如果Contract B
继承自Contract A
then,在编译期间,Solidity 编译器会将 的字节码注入A
到B
. 这增加了B
. (本质上,大小B
= 大小B
+ 大小A
)。同样,如果Contract C
由 组成Contract D
,则 的字节码D
将被编译为 的字节码C
。transaction 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 代码的良好实践。
希望能帮助到你。