代码解析思路提出几个需要解决问题。venus-miner解决解决这些问题的设计思路和架构。最后要问问为什么这样设计?需要解决的问题所以区块链系统都需要解决谁有权利出块,没有按照规定出块的人如何惩罚,出块人如何从交易池中获取交易,并验证交易(预执行并获取执行后的状态根or只是进行交易
所以区块链系统都需要解决谁有权利出块,没有按照规定出块的人如何惩罚,出块人如何从交易池中获取交易,并验证交易(预执行并获取执行后的状态根 or 只是进行交易的语法检查),出块后如何把区块链同步给别的矿工,别的矿工接受到区块后如何进行验证区块合法性(里面交易的合法性?出块权的合法性?),如果区块是合法的,如何更新现有账户状态,对区块进行存储;然后还需要对出块矿工进行奖励;从上面就可以看出来,区块链以区块(交易的集合)为核心进行状态切换的,这里面除了区块的打包,同步,存储以外,还需要一些相对独立的功能组件作为辅助,那就是区块里面的交易如何执行(VM),出块权利的选择(POW or POS)。
venus-miner
实现了区块链里面最重要的功能,EC共识算法,即Leader选择,打包出块,验证别的矿工出的块,最重链选择。
具体的分工请看以下描述。
从以上我们就可以看出,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
惩罚),广播区块。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()
负责最重链选择。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!