区块链社会:区块链助力国家治理能力现代化
上QQ阅读APP看书,第一时间看更新

6.2 交易和消息

用户账户发起的签名数据称为交易,合约账户发起的签名数据称为消息。交易记录的数据结构如下:

1)交易标识(Nouce):随机数,用于确定每笔交易只能被处理一次的计数器,用于抵制重放攻击。

2)接收方地址(Receipt):可以是用户地址或者合约地址。

3)数值(Value):交易的以太币数量。

4)数据(Data):可选填项,供智能合约接收方使用的数据。

5)V/R/S:ECDSA(Elliptic Curre Digital Signature Algorithm)签名,用来恢复公钥。

6)GasPrice:每一个Gas的价格。

7)Gas:交易使用的最大Gas数量。

以太坊引进了“Gas”(燃料)的概念。两个数值Gas和GasPrice的作用是为了对代码执行做出经济上的限制。这种经济上的举措就好比我们生活中的智能卡用电。为了防止滥用电资源(当然,还有其他的经济因素),国家规定了用电成本,电价越贵,我们的用电成本就越高。我们能用多少电取决于花了多少钱买电,一旦用完,家里就停电了。

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

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

1)如果执行交易的过程中,用完了Gas,那么所有状态将恢复到原状态,但是已经支付的交易费用不退。

2)如果执行交易完结时还剩余Gas,那么这些Gas将退还给发送者。

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

1)检查交易的格式是否正确、签名是否有效和交易标识是否与发送者账户的交易标识匹配。如否,返回错误。

2)计算交易费用:fee=Gas*GasPrice,并从签名中确定发送者的地址。从发送者的账户中减去交易费用,增加发送者的交易标识。如果账户余额不足,返回错误。

3)设定初值Gas,并根据交易中的字节数减去一定量的Gas。

4)从发送者的账户转移货币价值到接收者账户。如果接收账户不存在,创建此账户。如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者Gas用完。

5)如果因为发送者账户没有足够的钱或者代码执行耗尽Gas导致价值转移失败,恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。

6)否则,将所有剩余的Gas归还给发送者,消耗掉的Gas作为交易费用发送给矿工。

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