以太坊技术黄皮书学习笔记5:交易

以太坊的交易设计比较直接,公式1是对交易的定义:将交易分为2中情况,一种情况是没有交易的接收者,即Tt是空集合,如公式2,这种情况代表的是创建一个智能合约的交易;另一种情况是交易的接受者不为空,一般这种情况指的是一次转账或者消息发送,如公式3。

其中Tn:nonce,表示既要的发送者已经发送到交易个数

Tp:gasPrice,以Wei计价的每个gas的价格

Tg:gasLimit,这个交易最多可以消耗的gas的个数,他与gasprice一起防止恶意用户使用智能合约来攻击网络

Tt:交易的接受者地址,160-bit地址,如果是创建智能合约,则此值为空集合

Tv:交易中涉及的转账额度,以Wei为计价单位

Ti:如果是智能合约的创建交易,则此值表示创建智能合约的代码,只需要在创建的时候使用一次,如果合约创建成功,那么以太网络会返回该代码对应的body,这个是编译后的可以被以太网认识和执行的汇编代码

Tw,Tr,Ts是用来确定交易的发送者的160bit地址的值,是经过加密的数据,下面将会详细的讲解他们的用法

关于交易的数据结构代码如下,有兴趣的同学可以自行学习

以太坊技术黄皮书学习笔记5:交易

交易的自验证:

以太坊技术黄皮书学习笔记5:交易

在开始介绍以太坊交易验证之前,首先要列出需要用到的三个公式【1】:公式1,公式2,公式3.其中公式1是根据一个32字节的私钥,来生成一个64字节的公钥;公式2是通过私钥给一个消息e签名,签名的的结果是三个值:v,r,s,这三个值的长度分别是1个字节,32字节,32字节,这三个值其实就是前面讲到的交易中的签名信息Tw,Tr,Ts;公式3根据消息e和签名信息v,r,s可以还原私钥Pr对应的公钥Pu

公式4,5,6,7说明数据的有效范围,4表示消息e是交易T的hash值,5,6,7是r,s,v的取值范围,其中secp256k1n的值如下:

以太坊技术黄皮书学习笔记5:交易

以太坊技术黄皮书学习笔记5:交易

公式8是对地址的定义,即对于某一私钥Pr,其地址如何计算,其中公式9表示取hash值的后96到255比特位。我们需要注意的是公式10,其说明的内容是根据私钥Pr,求出公钥pu,然后对pu进行KEC运算。公式10和公式1是同一公式。

公式11,12,13,14,15,16,17是为了解释如何获取消息e即h(T)。首先给出的是需要进行hash运算的交易T的定义,当交易T是创建智能合约时Tt是空,如公式15所示,否则按照公式16选择P的值,同时根据v的值不同,定义不同的交易T的内容,然后根据不同的内容使用KEC算法,得到交易T对应的hash值。公式18和19着重说明的G(T,Pr)这个变量其实与T的内容一致,除了G(T,Pr)的值里面v,r,s都是经过签名公式19运算出来的签名信息,这个签名使用了私钥和交易T的hash值,这个公式与公式2一样。

公式20,21,22,23,25是定义了一个交易T的验签函数S(T),通过公式25,将交易T的hash值,与签名信息进行运算,可以还原出私钥Pr对应的公钥Pu,其中公式22,23说明了当Tw属于集合{27,28}时V0的不同取值。公式24表示对于任意的交易T以及交易发送者的私钥Pr,如果满足公式24说明交易的发送者确实是拥有私钥Pr的地址发出。

这里需要给出的逻辑是这样的,我们看到交易T的信息里面并不包含交易的sender,也就是说交易的发起者可以通过自己的私钥,对交易T的hash值进行签名,并且可以将签名的结果v,r,s放到交易T的信息字段中,在全网中传播。任何一个得到交易数据和签名信息的人,可以通过公式20反向推算出交易发送者的地址A,地址A是通过私钥得出,因此全网只要验证发送交易的地址与公式20得出的值相同,即可验证交易的有效性。

本节内容比较简单,解释了交易的数据组成以及如何验证交易的有效性。对源代码有兴趣的同学可以参考下图:

以太坊技术黄皮书学习笔记5:交易

【1】 https://koclab.cs.ucsb.edu/teaching/ccs130h/notes/ecdsa-cert.pdf

相关文章