深入理解以太坊系列(3): 以太坊交易和消息

以太坊交易与比特币交易是类似的,每一笔交易都包含发送方签名、接收方和发送的数字货币(以太币)数量。延伸到所有的其他数字货币交易,交易中都会包含有这三项。以太坊设计中不同的地方在于交易信息中还多了其他几项:一个可选的数据项、两个数值GAS和GASPRICE。同时,以太坊还支持一种称作消息的机制。

以太坊中的交易是指从用户账户(EOA)发出的含有消息的签名数据包。交易包含如下7个部分:

1. 交易(nonce)。是一种反交易重放攻击(anti-replay-attack)的措施,防止交易被重复包含到区块链上。
2. 接收方地址(receipt)。可以是一个用户账户,也可以是合约。
3. 价值(value)。交易发送的以太币数量。
4. 数据(data)。如果你的交易接收方是一个合约,那么该合约就可以读取数据。
5. V、R、S。一个ECDSA签名,这是为解密者设计的用来恢复公钥。
6. Gas价格(gasprice)。每一gas的价格(以以太币记)。
7. Gas(gas)。交易可使用的最大gas数量限制。

两个数值GAS和GASPRICE的作用是为了对代码执行做出经济上的限制。

这种经济上的举措就好比我们生活中的智能卡用电。为了防止滥用电资源(当然,还有其他的经济因素),国家制定了用电成本,电价越贵,我们的用电成本就越高。我们能用多少电取决于花了多少钱买电,一旦用完,家里就停电了。

以太坊系统中,任何运算都是需要占用/消耗资源的,这包括计算资源、带宽资源、存储资源等。为了防止代码被恶意或不停地执行(如无限循环运算或其他无谓消耗资源的运算),每笔交易需要对执行代码所引发的计算,包括初始消息和所有执行中引发的消息做出经济上的限制。GASPRICE是每一计算步骤所需要支付的费用,好比电价。GAS是交易执行时最大计算步骤数,好比电量。这两个值的作用就是用来限制交易中所能执行的代码计算步骤的。所以,在交易执行时,账户余额需要有足够多的“钱”来满足执行交易中代码的经济需求。

简单理解,就是以太坊中规避计算机恶意攻击占用资源的解决方案是经济制裁。既然执行交易需要预先设置花多少钱,那么就可能有下面这两种情况发生:钱用完了、钱剩余了。

1. 如果执行交易的过程中,用完了“燃料”(GAS),那么所有状态将恢复到原状态,但是已经支付的交易费用不退。
2. 如果执行交易完结时还剩余燃料,那么这些燃料将退还给发送者。

以太坊交易信息中的另一可选项是数据。这是用来提供给以太坊上的智能合约用来访问的,后续我们在详细介绍。

以太坊白皮书中从状态机的角度解释了比特币及以太坊的不同,下图可以比较一下,便于我们更好的理解。这是比特币交易的状态转换图:

statetransition.png

这是以太坊交易的状态转换图:

ethertransition.png

一个以太坊交易的具体步骤如下:

1. 检查交易的格式是否正确、签名是否有效和nonce是否与发送者账户的nonce匹配。如否,返回错误。
2. 计算交易费用:fee=GAS * GASPRICE,并从签名中确定发送者的地址。从发送者的账户中减去交易费用,增加发送者的nonce。如果账户余额不足,返回错误。
3. 设定初值GAS,并根据交易中的字节数减去一定量的燃料值。
4. 从发送者的账户转移货币价值到接收者账户。如果接收账户不存在,创建此账户。如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者燃料用完。
5. 如果因为发送者账户没有足够的钱或者代码执行耗尽燃料导致价值转移失败,恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。
6. 否则,将所有剩余的燃料归还给发送者,消耗掉的燃料作为交易费用发送给矿工。

以太坊消息跟交易在很多方面是相同的。不同点在于消息是从合约发出的,而不是从用户账户。这里需要注意的是,消息触发合约的执行同样也需要消耗燃料。