Gas 花费与退回

上文提到了数据的存储是要花费 gas 的,尤其是存储区的存储,代价昂贵。

发送交易的时候我们可以指定 gas 的花费上限,以防止智能合约代码有bug而导致无限循环执行下去。

一旦 gas 过早耗尽,则虚拟机抛出异常,结束代码执行。 另外有种情况是代码执行完毕后 gas 还有剩余,这时候虚拟机会按照约定退还给发送方相应的 gas 找零。如图 7-8 所示。

有一类情况很特殊,就是Solidity智能合约代码的 assert() 函数与 require() 函数。

在执行时候这两个函数都是做真假条件判断的,但是 assert 函数感情更加强烈,往往判断的都是关键的安全性条件,例如 SafeMath 中利用 assert 函数判断是否位数溢出; 合约取款时判断调用方是否为合约所有者等。

require()函数则较为普通的条件判断,例如判断合约调用者的余额是否足够等。

assert() 函数判断一旦失败,则会扣完剩下所有的 gas 作为惩罚措施; require() 判断失败则仅仅停止目前的执行,收取执行到当前步骤相应的 gas 费用,再撤销发生的变更。

../_images/Picture52.png

以太坊虚拟机执行要花费 gas,多余的 gas 退还给使用者