「以太(ether)」的字面意思是醚(即燃料,等同于 gas)。在每一个计算步骤完成之后,一笔交易所调用的合约的余额将会减少一些。如果合约的资金耗尽,那么执行过程将会停止。请注意,这个接收者支付机制意味着合约本身必须要求发送者向该合约支付一笔费用。如果这笔费用没有到账,则立即退出执行。这一版本的协议分配了 16 个免费执行步骤的限额,从而允许合约拒绝不支付费用的交易。 截至此时,以太坊协议还是完全由我一个人构建的。然而,从这时开始,新的参与者开始加入以太坊的阵营。到目前为止,在协议方面表现最突出的是加文,他在 2013 年 12 月通过 about.me 的私信开始与我联系。 杰弗里·威尔克(Jeffrey Wilcke),Go 客户端(当时被称为「ethereal」)的首席开发者,也在同一时期联系了我并开始编程。尽管他的贡献更多是在客户端开发而不是协议研究方面。 加文的早期贡献由两个方面。首先,你可能注意到在初始设计中的合约调用模型是异步的:尽管合约 A 可以创建一笔内部交易给合约 B (「内部交易」是以太坊的行话:最初它们仅被称作「交易」,随后又被称为「消息调用」或者「调用」)。在第一笔交易的执行完全完成以前,内部交易的执行不会开始。这意味着交易不能使用内部交易作为从其他合约获取信息的途径;想从其他合约获取信息,只能使用 EXTRO 操作码(有点像你用来读取其他合约存储的 SLOAD),但这个操作码随后在加文和其他人的支持下移除了。 在实现我最初的规范时,加文很自然地同步实现了内部交易功能,他甚至没有意识到两者意图的偏差——也就是说,在加文的实现中,当一个合约调用另一个合约时,内部交易会立即得到执行。一旦该执行完成,虚拟机将返回创建内部交易的合约,并继续执行下一个操作码。对于我俩,这种方法似乎更加出色,因为我们决定把它作为规范的一部分。 其次,是我和他之间的一次讨论(发生在旧金山的一次散步中,因此准确的细节将要永远地消失在历史的洪流中,但也有可能会存在于 NSA 的深层档案内的一两份副本中)引发了对交易费用模型的重构,从合约支付方式转向发送方支付方式,并且转换到燃料架构。比起最初在每个独立的交易步骤执行后立刻消耗一些以太币,在这一版本中,交易发起者支付一定的费用并被分配一定量的燃料(大致是一个计算步骤的计数器)。与此同时,计算步骤取决于燃料的限额。如果一笔交易花费了所有的燃料,那么这些燃料就被花费了,但整个执行过程将被还原。这似乎是最安全的做法,因为它移除了合约先前需要担心的所有部分执行攻击类型。当一笔交易执行完成时,任何未被使用的燃料所收取的费用将被退还。 (责任编辑:admin) |