以太坊:账户交易过程分析

Ethereum's Token

Ethereum的代币称之以太币,以太币的最小单位是Wei。

Wei是一个非常小的单位,1Ether= 10^18 Wei,和无限可分也差不了多少了。除了基本单位Wei,为了使用方便还有其他的单位,他们的关系如下:

  •  Kwei = 10^3  Wei
  •  Mwei = 10^6  Wei
  •  Gwei = 10^9  Wei
  •  Microether = 10^12  Wei
  •  Milliether = 10^15  Wei
  •  Ether / SCC = 10^18 Wei

我们一般记住wei ,1 Gwei=10^9wei,1 Ether = 10^18wei即可。

账户交易过程总览

 

 

 

 

 

交易(Transaction)的过程解析

Step1. 交易发起

创建一个Json格式的数据结构,指定目标地址和交易金额,以及需要的gas price/gas limit等信息,构建一笔交易并生成Transaction实例。

创建的交易json字段定义:

 

 

 

根据这个json字段可生成一个Transaction实例:

 

Transaction 实例结构

txdata             // txdata字段

From             // 缓存数据:发送方地址

Hash             // 缓存数据:交易Hash

Size              // 缓存数据:交易的大小

其中txdata这个数据结构我们需要用来进行数字签名:

 

  

 

R,S,V的坑位用来..?  Interesting, Look at Next Step !

 

Step2. 交易签名

使用账户私钥对交易进行签名。

当前代币所有者先通过Keccak-256算法计算交易数据的hash值,然后结合账户的私钥,通过ECDSA-secp256k1,也就是椭圆曲线数字签名算法生成签名数据(RSV)并将这个签名附加在transaction实例的末尾,制作成交易单。

 

 

 

  

我们发现,txdata只有接收方的地址(Recipient)而没有发送方的地址,R,S,V的作用就是我们可以使用ECDSA推导获得from:

 

 

 

 

经过以上交易实例的构造,我们就可以将实例提交到交易池txpool了。

 

Step3. 提交交易

签名后的交易会先提交到本地链节点,本地节点先对交易签名进行验证后,把transaction实例的这笔交易加入到交易缓冲池txpool中。提交交易的目标是先把交易放入交易池的队列queue中记录在案,然后再从queue中选一部分放入pending中进行处理。如果发现txpool满了,则依据price中的排序,剔除低油价的交易。

 

 

Step4. 节点确认

一个或者多个节点对txpool中的交易的信息验证确认。

生成的交易需要被区块链网络中的矿工节点打包到区块,才能写入到区块链中。矿工会有一个待处理的交易列表,其中的交易是按交易的gasPrice进行排序的,交易的gasPrice越高,处理的优先级就越高。如果交易的gasPrice过低,有可能一直得不到矿工的处理,从而被忽略。

矿工节点选择好要打包的交易之后,就开始了PoW(Proof of Work)挖矿过程,最先发现新的区块的矿工能够将交易打包至区块,并且获取到相应的奖励。节点会确认这个区块所包含的交易是否有效,确认没被重复花费且具有效数位签章后,接受该区块,此时区块才正式接上区块链,无法再窜改资料。

 

 

Step5. 广播交易

把交易信息广播给其他结点。

新的区块已经产生,所有的节点都需要对区块进行同步,你的交易会随着区块的同步被同步至所有节点上。所有节点一旦接受该区块后,先前没算完的区块会失效,各节点会重新建立一个区块。每个区块的出块时间大约在10s,随着全网算力的不断变化,每个区块的产生时间会随算力增强而缩短,随算力减弱而延长。

 

 

 

posted @ 2019-05-15 00:02  kumata  阅读(7186)  评论(0编辑  收藏  举报