区块链应用开发指南:业务场景剖析与实战
上QQ阅读APP看书,第一时间看更新

4.5 以太坊虚拟机(EVM)

以太坊虚拟机(Ethereum Virtual Machine),简称EVM,用来执行以太坊上的交易,提供智能合约的运行环境。

熟悉Java的同学,可以把EVM当作JVM来理解,EVM同样是一个程序运行的容器。

以太坊虚拟机是一个被沙箱封装起来、完全隔离的运行环境。

而以太坊虚拟机本身运行在以太坊节点客户端上,各层关系如图4-4所示。

图4-4 EVM位置

gas

前面提到,在EVM上运行的智能合约是“图灵完备”的,理论上可以编写能做任何事情的程序。既然如此,恶意的执行者就可以通过执行一个包含无限循环的交易轻易地让网络瘫痪。

以太坊通过每笔交易收取一定的费用来保护网络不受蓄意攻击,这一套收费的机制称为gas机制。

gas是衡量一个操作或一组操作需要执行多少“工作量”的单位。例如,计算一个Keccak256加密哈希函数,每次计算哈希时需要30个gas,再加上每256位被哈希的数据要花费6个gas。EVM上执行的每个操作都会消耗一定数量的gas,而需要更多计算资源的操作也会消耗更多的gas,以太坊黄皮书中定义了每一步操作需要的gas。

如果gas仅仅是一个“工作量”单位,那怎么支付费用呢?还有另一个概念——gas价格。其实每笔交易都要指定预备的gas及愿意为单位gas支付的gas价格(gas price),这是两者的结合,gas * gas价格=交易预算

gas价格是用以太币(ether)来表示,没有任何实际的gas代币(Token)。也就是说你不能拥有1 000个gas

之所以称为预算,是因为如果交易完成还有gas剩余,这些gas对应的费用将被返还给发送者账户。我们也可以认为gas是以太坊虚拟机的运行燃料,它在每执行一步的时候消耗一定的gas,如果给定的gas不够,无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas异常,当前交易所作的所有状态修改都将被还原。