深入理解以太坊系列(5): 以太坊交易费用机制

比特币系统中的交易大体相同,交易成本比较固定。以太坊中的交易要更复杂,所以交易费用需要考虑到账户的许多方面,包括宽带费用、存储费用和计算费用。以太坊编程语言是图灵完备的,交易理论上可以使用任意数量的宽带、存储和计算资源,如果没有引入交易费用,就可能被恶意攻击者通过没有任何成本的无限循环来进行DoS攻击,因此以太坊中引入交易费用的主要目的是为了防止此类恶意攻击行为。

以太坊交易费用的基本机制

以太币(ether)是以太坊生态中使用的数字货币。以太坊交易中涉及的费用最终都是以ether来结算的。

每笔交易必须指明一定数量的gas(即指定startgas的值),以及支付每单元gas所需费用(即gasprice),在交易执行开始时,startgas * gasprice 价值的以太币会从发送者账户中扣除;

交易执行期间的所有操作,包括读写数据库、发送消息以及每一步的计算都会消耗一定数量的gas;

如果交易执行完毕,消耗的gas值小于指定的限制值,则交易执行正常,并将剩余的gas值赋予变量gas_rem ; 在交易完成后,发送者会收到返回的gas_rem * gasprice 价值的以太币,而给矿工的奖励是(startgas – gas_rem)* gasprice价值的以太币;

如果交易执行中,gas消耗殆尽,则所有的执行恢复原样,但交易仍然有效,只是交易的唯一结果是将 startgas * gasprice 价值的以太币支付给矿工,其他不变;

当一个合约发送消息给另一个合约,可以对这个消息引起的子执行设置一个gas限制。如果子执行耗尽了gas,则子执行恢复原样,但gas仍然消耗,无法退还。

以太坊交易中的Gas消耗

基本费用:21000gas。对于任何交易,都将收取这笔费用,用于支付运行椭圆曲线算法、交易存储所占用的磁盘空间和带宽。

数据费用:每笔交易可以包括无限量的“数据”。固定费用为每个零字节4gas,非零字节68gas。

账户存储费用:用于设置账户存储的费用是:
1. 将零值改为非零值时,消耗20000gas;
2. 将非零值变另一非零值,消耗5000gas;
3. 将非零值变成零值,消耗5000gas,加上交易执行成功后退回的20000gas。
退款金额上限是交易消耗gas总额的50%。这样设置是为了激励人们清除存储器。

合约提供的消息数据是没有成本的。因为在消息调用期间不需要实质复制任何数据,调用数据可以简单地视为指向父合约内存的指针,该指针在子进程执行时不会改变。

内存是一个可以无限扩展的数组,然而,每扩展32字节的内存就会消耗1gas的成本,不足32字节以32字节计。

比特币与以太坊费用机制的异同

比特币系统和以太坊中的交易费用某种程度上都属于“小费”模式。只不过前者属于自愿支付,后者属于被动支付。

虽然理论上比特币系统的用户可以不用支付任何交易费用,但在实际操作中,比特币和以太坊都需要用户花费一定的费用来执行交易。同时,支付的交易费用越高,矿工们就更有积极性,交易被优先打包处理的可能性就越大。

不同的是,比特币系统中,用户为交易付费是自愿行为,而以太坊中,用户在交易前必须设置最多花费的gas数量和每个gas的价格,因此支付交易费用是必须的。同时,比特币系统中用户直接通过输出额来设置“小费”的多少,而以太坊用户是通过自由定价gas价格来间接影响整体的交易费用。