venus-miner 代码解析 笔记

代码解析思路提出几个需要解决问题。venus-miner解决解决这些问题的设计思路和架构。最后要问问为什么这样设计?需要解决的问题所以区块链系统都需要解决谁有权利出块,没有按照规定出块的人如何惩罚,出块人如何从交易池中获取交易,并验证交易(预执行并获取执行后的状态根or只是进行交易

背景

所以区块链系统都需要解决谁有权利出块,没有按照规定出块的人如何惩罚,出块人如何从交易池中获取交易,并验证交易(预执行并获取执行后的状态根 or 只是进行交易的语法检查),出块后如何把区块链同步给别的矿工,别的矿工接受到区块后如何进行验证区块合法性(里面交易的合法性?出块权的合法性?),如果区块是合法的,如何更新现有账户状态,对区块进行存储;然后还需要对出块矿工进行奖励;从上面就可以看出来,区块链以区块(交易的集合)为核心进行状态切换的,这里面除了区块的打包,同步,存储以外,还需要一些相对独立的功能组件作为辅助,那就是区块里面的交易如何执行(VM),出块权利的选择(POW or POS)。

venus-miner功能

venus-miner 实现了区块链里面最重要的功能,EC共识算法,即Leader选择,打包出块,验证别的矿工出的块,最重链选择。

具体的分工请看以下描述。

  1. Leader选择问题(venus-miner解决,但是依赖Drand,cluster)
  2. Leader检验问题(当前是epoch是哪个?当前epoch是否是这个leader?,依赖venus,drand,cluster)
  3. 如何出块(消息选择,winningPost获取,消息预执行?消息合法性检查?消息广播?依赖venus)
  4. 如何检验别人出的块是否合法(消息执行结果检查,是否该这个leader出块,winningPost是否合法,依赖venus,drand,cluster的信息)
  5. 选择分叉链的方法(不依赖别的服务)
  6. 挖矿奖励和惩罚的执行(reward actor的执行,更新账户的余额等都依赖venus,因为账户的信息都记录在vneus服务中)
  7. 块如何写到底层数据库(miner完全不负责,全部靠venus服务)
  8. 区块同步(miner完全不负责,全部靠venus服务)
  9. 区块消息的执行(miner也不负责,全靠venus服务,但是会把计算结果,也即是父tipset的state root和receipt root返回给miner,miner需要这些数据放进新区块。)

从以上我们就可以看出,miner只负责leader选举和检查的计算(其中用到的数据和信息都是来自于外部服务,自己不会存储和生产这些数据),负责打包区块(区块同步和存储都是依靠venus,父区块消息的执行也是依赖venus。filecoin每个高度H时,执行的都是H-1高度上的区块消息。也就是说,打包区块,并广播区块时,不会对当前执行当前区块的消息,也许是因为EC共识是可以分叉的,晚一个高度再进行执行也许会更加合理?)

主要模块有:矿工管理,出块管理。

矿工管理

Venus 矿池中的用户(或称为矿工)是由 venus-auth 组件管理的,其记录了每个矿工的基础信息及身份验证信息。venus-miner 从 venus-auth 拉取最新的矿工列表,并周期性地进行区块生产流程。 venus-miner 可以暂停矿工列表中任意矿工的出块,比如某个矿工的签名节点失联时,可以手动暂停该矿工的出块流程,等待签名正常后再开启出块。 venus-miner 执行 update 更新矿工列表,通常在某些矿工退出矿池或有新的矿工加入矿池时进行。

出块管理

venus-miner 的一轮出块流程如下:

  • 请求同步节点获取 Base,即 parent Tipset(通常是最近一次有出块周期的 Block集)及空轮数(空轮表示该周期没有任何矿工出块);
  • 统计本周期获得出块权的矿工及出块必要数据,如随机数,选中扇区信息等;
  • 为每个获得出块权的矿工计算获胜证明,选择消息,创建区块;
  • 验证本周期生产的区块合法性(是否存在共识错误,因为广播具有共识错误的区块会受到一定的 Fil 惩罚),广播区块。

venus-miner代码流程

node/builder.go方法把node/impl/miner.go,common/common.go两个文件的类注册到jsonrpc中的server,从而实现对外rpc服务。

矿工管理

node/modules/miner-manager包实现了对矿工的管理。主要是和venus-auth服务进行通信,进行矿工地址的管理。

共识算法

miner/multiminer.go实现了EC共识算法。miner/miningmgr.go实现了对外rpc的接口逻辑。

miner/multiminer.go:(m *Miner) mine()是最核心的方法,方法里面有一个无限for循环,循环内部会不停的进行整个共识流程。

miner调用api让venus执行MinerCreateBlock方法,产生H高度的区块,此方法会从数据库查询出H高度的父亲的tipset,然后执行高度H-1(也就是父区块)tipset,并拿到receipt和stateroot,赋值给当下高度H的区块。

GetBestMiningCandidate()负责最重链选择。

venus-miner为什么要这样设计

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
杜满想Elvin
杜满想Elvin
老程序员,区块链架构师