Gas 花费与退回

以太坊虚拟机的数据的存储是要花费 gas 的,尤其是存储区的存储,代价昂贵。

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

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

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

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

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

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

http://static.codebaoku.com/pics/3d/80/3d8028b6f10ed9a72dc54c1eb44b2325.png

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

以太坊中虚拟机指令集的花费经过了精心考虑,在读与写的花费上作了平衡。重点区分了内存读写和区块(磁盘)读写两个档次的花费。在屡次版本修订中指令集的取舍也有凸显,下面列表举例说明一些重要的指令: 值助记符Gas 花费移出Sta ...