如果值不是零,操作码 CALL(以及 CALLCODE)会额外消耗 9000 gas。这是因为任何值传输都会引起归档节点的历史存储显著增大。请注意,操作的 实际消耗 是 6700;但是此基础上,我们强制增加了一个自动给予接收者的 gas 值,这个值最小 2300。这样做是为了让接受交易的钱包至少有足够的 gas 来生成 log。(校对注:见《值得考虑删除的 EVM 功能》) Gas 机制的另一个重要部分是 gas 价格本身体现出的经济学原理。比特币中,默认的方法是采取纯粹自愿的收费方式,矿工扮演守门人的角色并且动态设置收费的最小值。以太坊中允许交易发送者设置任意数目的 gas。这种方式在比特币社区非常受欢迎,因为它是 “市场经济” 的体现:允许矿工和交易者之间依据供需关系来决定价格。然而,这种方式的问题是,交易处理并不遵循市场原则。尽管可以将交易处理看作是矿工向发送者提供的服务(这听起来很直观),但实际上矿工所处理的每个交易都必须由网络中的每个节点处理,所以交易处理的大部分成本都由第三方机构承担,而不是决定是否处理它的矿工。因此,“公地悲剧” 问题很有可能发生。 当前,因为缺乏矿工在实际中的行为的明确信息,所以我们将采取一个非常简单公平的方法:投票系统,来设定单个区块可消耗的 gas 总额。矿工有权将在最新区块的 gas 上限基础上变更 0.0975% (1/1024),作为当前区块的 gas 上限。所以最终的 gas 上限应该是矿工们设置的中间值。我们希望将来能够采用软分叉的方法来使用更加精确的算法。 虚拟机 以太坊虚拟机是执行交易代码的引擎,也是以太坊与其他系统的核心区别。请注意,虚拟机应该同 “合约与消息模型” 分开考虑。例如,SIGNEXTEND 操作码是虚拟机的一个功能,但实际上 “某个合约可以调用其他合约并指定子调用的 gas 限定值” 是 “合约与消息模型” 的一部分。 EVM的设计目标如下:
|