venus-miner 代码解析 笔记
背景
所以区块链系统都需要解决谁有权利出块,没有按照规定出块的人如何惩罚,出块人如何从交易池中获取交易,并验证交易(预执行并获取执行后的状态根 or 只是进行交易的语法检查),出块后如何把区块链同步给别的矿工,别的矿工接受到区块后如何进行验证区块合法性(里面交易的合法性?出块权的合法性?),如果区块是合法的,如何更新现有账户状态,对区块进行存储;然后还需要对出块矿工进行奖励;从上面就可以看出来,区块链以区块(交易的集合)为核心进行状态切换的,这里面除了区块的打包,同步,存储以外,还需要一些相对独立的功能组件作为辅助,那就是区块里面的交易如何执行(VM),出块权利的选择(POW or POS)。
venus-miner功能
venus-miner
实现了区块链里面最重要的功能,EC共识算法,即Leader选择,打包出块,验证别的矿工出的块,最重链选择。
具体的分工请看以下描述。
- Leader选择问题(venus-miner解决,但是依赖Drand,cluster)
- Leader检验问题(当前是epoch是哪个?当前epoch是否是这个leader?,依赖venus,drand,cluster)
- 如何出块(消息选择,winningPost获取,消息预执行?消息合法性检查?消息广播?依赖venus)
- 如何检验别人出的块是否合法(消息执行结果检查,是否该这个leader出块,winningPost是否合法,依赖venus,drand,cluster的信息)
- 选择分叉链的方法(不依赖别的服务)
- 挖矿奖励和惩罚的执行(reward actor的执行,更新账户的余额等都依赖venus,因为账户的信息都记录在vneus服务中)
- 块如何写到底层数据库(miner完全不负责,全部靠venus服务)
- 区块同步(miner完全不负责,全部靠venus服务)
- 区块消息的执行(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为什么要这样设计
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。