存储变量以生成更干净的代码是不是一种糟糕的做法



来自节点背景,想知道Solditty开发中关于更干净代码的变量的最佳实践是什么。

我知道任何变量都会消耗天然气,因此我们应该非常明智地声明哪些变量。我想知道,节省一个变量以使代码更容易阅读的气体成本是否令人反感,或者从长远来看,气体成本是否可以忽略。下面的例子先有一个结构,然后是一个函数:

struct Balance {
uint totalBalance;
uint numPayments;

}
mapping(address => Balance) public deposits;
function sendMoney() public payable {
// this is just ready to accept money;
Balance storage userAccount = deposits[msg.sender]; <--- is this bad practice or negligible? 
// do a bunch of daisy chained operations...

}

这些事情的天然气成本是可以忽略不计的,还是我们应该坚持把所有的变量都串在一起?

谢谢!

函数中的所有引用类型变量(包括struct(都需要指定数据位置。没有默认值,所以如果你不指定它,编译器会抛出一个错误

与直接对存储变量执行写入相比,声明指向存储变量的指针并将其用于一次写入操作的成本大约高出100气体。在一个简单的测试中(在没有优化器选项的情况下编译(,我测量了直接写入deposits映射的65562个气体,而使用userAccount存储指针的气体为65664个(大约多100个(。

通常的交易需要花费数万天然气,这使得多次写入的潜在节约约为1%。但这实际上取决于您的用例,您是否希望/需要优化到这样的节省程度,并降低代码的可读性。

据我所知,如果变量是内存变量,则成本可以忽略不计。如果写入存储,则成本将很高,因此请尝试在内存变量中进行这种计算,并仅在需要时写入存储。

最新更新