以太坊交易:从构造到通过共识_简述

By | 2018年10月2日

本文简述以太坊中的交易从构造到成功的过程。本文非严谨详细的技术解析,仅为极简的定性简述用于备忘。

 

  1. 通过ethconsole调用脚本动态生成交易结构,存入json。此处需要注意,因为以太坊本身使用每个账户的nonce字段控制交易顺序及防止多次处理同一个交易,所以这个nonce值是需要我们自己来在构造交易的时候进行查询和指定的。

如:nonce: web3.eth.getTransactionCount(web3.eth.accounts[0])

  1. 使用交易发送者的私钥对构造好的交易信息进行签名。首先要将私钥转化为十六进制值,然后调用交易自带的sign方法对交易进行签名,然后再对签名后的交易信息序列化。
  2. 将上面的交易提交至本地节点,进行对签名的验证工作。怀疑:此步工作使用了和接收其他节点广播的交易相同的处理方式。
  3. 本地节点对交易进行广播,同时输出可以用于追踪交易状态的transactionId。TransactionId=sha3(serializedTxn)

网络上的其他节点接收到广播消息。在这个过程中,矿工可以根据自己的设定对交易进行挑选,比如只挑选交易费较高的交易进行处理。

  1. 矿工节点接收到交易后放入交易池,在交易队列中按交易费降序排列。注意,交易费过低的交易可能被网络拒绝导致最后需要重新广播。

也就是说,一个新块包含哪些交易,不包含哪些交易完全由矿工决定,这也就意味着基本上很可能每个矿工的块都是不一样的——然后,这些不一样的块在全网共识的过程中被进行【筛选】,最终打败所有其他块的块中的交易带来的影响将成为最终的全网客观事实,带来新的世界状态。

  1. 矿工节点挖到新块,进行广播。注意,块中衡量限制交易量的标准是【gas消耗量】,即,每个块中包含的交易数量由创世是指定的gasLimit决定。只有挖到块的矿工获取调用发起者所支付的全部交易费,其他节点进行验证和接收。
  2. 本地节点接收到矿工广播的新块,执行块中的交易进行验证与更新自己的世界状态。

这里需要注意,【所有的验证节点都将在本地执行接收到的块中的交易】,所有的(正常)节点都将从一个相同的世界状态经过执行交易到达另一个相同的世界状态。

毕竟,共识的存在意义就是为了维持一致。


写博不易,如果读的开心,可以考虑请我吃包辣条 ~

人间自有真情在,五毛一块也是爱

点击量:489