以太坊系列 - 源码分析 - 共识

本文对以太坊共识进行源码分析,讲述新区块生成过程。生成区块分两个环节,先由worker组装新区块,再由Agent利用共识算法填补剩余属性并完成授权。还介绍了收集数据和授权相关函数。此外,指出engine.Prepare()等三个函数是共识算法对外接口,有PoW和PoA两种实现体。

以太坊共识的源码分析

讲述一个新区块被生产出的过程

1.生成区块

对于一个新区块被生产出来的过程,代码实现上基本分为两个环节:

  • 一是组装出一个新区块,这个区块的数据基本完整,包括成员Header的部分属性,和叔区块组uncles[],以及事务列表txs,并且所有事务已经执行完毕,所有收据(Receipt)也已收集完毕,这部分主要由worker完成;

  • 二是填补该区块剩余的成员属性,比如Header.Difficulty,coinbase等,并完成授权,这些工作是由Agent调用接口实现体Prepare,Seal,利用共识算法来完成的。

1.1 收集数据 worker.commitNewWork()(miner/worker.go)

  • 4种情况会调用到这个函数

  • 程序启动时,执行newWorker方法初始化worker对象时,调用commitNewWork方法,开始组装新区块。

  • 启动时,miner.start里会调用worker.start()和worker.commitNewWork()

  • 网络接收到其他worker广播过来的新区块,该区块验证有效插入到区块链后,会产生ChainHeadEvent事件,worker对象的update协程检测到该事件后,会调用commitNewWork方法,开始生成新的区块。

  • worker自己生成新的区块并入链后,会向全网广播NewMinedBlockEvent,同时也会给自己发一个ChainHeadEvent,之后就跟上面的一样


  • commitNewWork()做了什么?
    • 准备新区块的Header属性,可确定的有Time,Number,ParentHash,其余留待之后共识算法中确定
    • 调用engine.Prepare()函数,完成部分Header对象的准备
    • 准备新区块的事务列表,并执行这些事务
    • 准备新区块的叔块uncles[]
    • 调用engine.Finalize()函数,对新区块“定型”,填充Header对象 Root(默克尔根),TxHash(默克尔根), ReceiptHash(默克尔根), UncleHash等属性。
    • 把创建的Work对象,通过channel发送给每一个登记过的Agent,进行后续的生产。
      worker.push() -> CpuAgent.update()

1.2 授权 CpuAgent(miner/agent.go)

  • 和共识有关的主要是这几个函数Start(),update()和mine()
    • CpuAgent.Start() 用来启动CpuAgent.update()协程
      • miner.New() -> miner.Register(NewCpuAgent) -> (if Mining) agent.Start() -> go agent.update()
      • miner.Start() -> worker.start() -> agent.Start() -> go agent.update()
    • CpuAgent.update() 用来监听worker.commitNewWork()结束前通过worker.push()发出的channel
      • worker.push() -> CpuAgent.update() -> CpuAgent.mine()
    • CpuAgent.mine() 利用Engine实现体的共识算法对传入的Block进行最终的授权, 如果成功,就将Block同Work一起通过channel发还给worker,那边worker.wait()会接收并处理
      • CpuAgent.mine() -> engine.Seal() -> worker.wait()

到此,形成一个大的消息循环, 产生出了新区块,哦也!!!

2.共识

不过真正的主角还未出场,注意到这三个函数engine.Prepare() , engine.Finalize() , engine.Seal() ,它们是共识算法对外暴露的接口.该接口有两种实现体,即PoW和PoA
共识

往期精彩回顾:
区块链知识系列
密码学系列
共识系列
公链调研系列
以太坊系列
EOS系列
智能合约系列
Token系列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖魁首

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值