Cover photo

精通以太坊:交易

交易时由外部账户发起的经过签名的消息,通过以太坊的网络传播,由矿工记录在区块链上。交易是唯一可以触发区块链状态改变,或者触发EVM上的合约执行的东西。

交易的结构

nonce

一个序列编号,由构建交易的外部账号提供,等于这个地址发出的交易数量,当这个地址与合约关联时,是这个地址所创造的合约数量。nonce时发起方地址的一个属性,不保存在区块链上,而是动态计算的。如果按照顺序创建了一系列交易,但是其中一个没有得到确认,之后 的所有交易会被堵住,直到找到这个缺失的交易,并且后续的交易无法撤回会持续广播。

gas price

交易发起方愿意支付的gas价格。gas是一种独立的虚拟货币,和以太币有汇率关系

gas limit

交易发起方愿意付出的最大gas数量

recipient

目标地址,既可以是外部账户也可以是合约地址。以太坊不会验证接收方地址的正确性。

value

发送给目标地址的以太币数量

data

附在交易中的二进制可变长数据。

v,r,s

由构建交易的外部账户提供的椭圆曲线签名的三个组成部分,可以计算出外部账户的公钥

向外部账户和合约转账的交易

当交易中包含value时,交易行为模式取决于目的地址时另一个外部账户还是合约。

对于外部账户,以太坊记录这一次状态变化,在目的账户余额增加指定的value余额以太币。如果地址不存在,则以太坊在区块链上创建这个新的地址,并初始化余额为value值。

如果目标地址是合约,EVM会执行这个合约,并尝试调用交易data字段中指定的函数。如果data字段是空的,则,EVM指定目标函数的回退函数,

向外部账户和合约账户传送数据的交易

当交易的data字段含有数据时,如果接收方是外部账户,通常会忽略data中的内容(取决于钱包软件)

接收方是合约地址时,data字段会被EVM解读成合约的函数调用,调用data中指定的函数,并把需要的参数传给函数。

特殊交易:合约创建

合约注册交易的目的地址是零地址,既不是外部账户也不是合约地址,只是作为一个注册合约的目标地址。有时候也可以销毁以太币。

合约注册唯一需要的就是在data字段中包含经过编译的合约字节代码。这个交易的唯一用处就是把合约注册到以太坊区块链上。设置value可以为合约地址初始余额

数字签名

数字签名是一种数学标准,用于证明某个数字消息的真实性。以太坊中使用椭圆曲线数字签名算法,简称ECDSA。

数字签名的作用

  • 数字签名用来证明签名方是私钥持有人,也就是对应账户主人,用于授权转账和执行合约。(身份认证)

  • 证明这个授权是不可否认的(发送方不可否认发送过这消息)

  • 确保交易数据在经过签名后没有也不可能被他人修改(完整性)

数字签名的工作原理

数字签名包含两个部分,第一部分用于创建签名的算法,针对消息使用私钥进行签名。第二部分是一个允许任何人使用消息和公钥进行验证的算法。

创建数字签名

被签名的消息是交易数据包,签名密钥是外部账户的私钥

Sig=Fsig(Fkcecc256(m),k)

k是私钥,m是数据包,Fkecc256是哈希函数,Fsig是签名算法,sig是输出的签名通常包含两部分r和s:

Sig=(r,s)

验证数字签名

验证数字签名,必须有签名本身(r,s)交易数据和公钥。签名验证算法的输入包括交易数据包,签名方公钥和签名,成功则返回true

ECDSA数学过程略过

交易的传播

以太坊使用“洪泛”路由协议。每个以太坊客户端都是p2p网络上的一个节点,交易广播从一个发起的以太坊节点的交易创建和签名开始。交易同构验证后会传送给所有跟这个发起节点直接相连的以太坊节点(邻居),每个邻居节点收到交易后进行验证,如果合法则这些节点会保留一份副本,在广播给他们的邻居(除消息源),很快会传播到所有的节点上。

记录在区块链上

矿工使用pow算法完成挖矿并且达成全网共识。合法验证的交易最终会被打包到一个区块中,并记录在区块链上,更改以太坊的网络的单体,修改账户余额等。

总结

交易是以太坊系统进行每项活动的起点。交易作为输入,导致EVM执行合约,更新余额以及改变以太坊区块链状态。