区块链研究实验室-探讨一下以太坊智能合约安全的漏洞(下)( 三 )

阅读代码:它非常简单 , 看起来是正确的 。 但是 , 它基于平台限制隐藏了3个潜在问题 。

第一个问题是i的类型将是uint8 , 因为这是保持值0所需的最小类型 。 如果数组具有超过255个元素 , 则循环将不会终止 , 从而导致gas耗尽 。 更好地使用显式类型uint没有意外和更高的限制 。 如果可能 , 避免使用var声明变量 。 我们来解决这个问题:

你应该考虑的第二件事是gas限制 。 Gas是以太坊为网络资源收费的机制 。 每个修改状态的函数调用都有一个gas成本 。 想象一下calculateBonus根据一些复杂的计算计算每个员工的奖金 , 比如计算许多项目的利润 。 这将消耗大量gas , 这很容易达到交易或区块的gas限制 。 如果交易达到gas限制 , 所有更改将被还原 , 但仍然支付费用 。 使用循环时要注意可变gas成本 。 让我们通过将奖金计算与for循环分开来优化合同 。 请注意 , 这仍然存在随着员工阵列的增长 , gas成本增加的问题 。

推荐阅读