{"content":{"title":"venus-miner 代码解析 笔记","body":"# 背景\r\n所以区块链系统都需要解决谁有权利出块，没有按照规定出块的人如何惩罚，出块人如何从交易池中获取交易，并验证交易（预执行并获取执行后的状态根 or 只是进行交易的语法检查），出块后如何把区块链同步给别的矿工，别的矿工接受到区块后如何进行验证区块合法性（里面交易的合法性？出块权的合法性？），如果区块是合法的，如何更新现有账户状态，对区块进行存储；然后还需要对出块矿工进行奖励；从上面就可以看出来，区块链以区块（交易的集合）为核心进行状态切换的，这里面除了区块的打包，同步，存储以外，还需要一些相对独立的功能组件作为辅助，那就是区块里面的交易如何执行（VM），出块权利的选择（POW or POS）。\r\n\r\n# venus-miner功能\r\n`venus-miner` 实现了区块链里面最重要的功能，EC共识算法，即Leader选择，打包出块，验证别的矿工出的块，最重链选择。\r\n\r\n具体的分工请看以下描述。\r\n\r\n1. Leader选择问题（venus-miner解决，但是依赖Drand，cluster）\r\n2. Leader检验问题（当前是epoch是哪个？当前epoch是否是这个leader？，依赖venus，drand，cluster）\r\n3. 如何出块（消息选择，winningPost获取，消息预执行？消息合法性检查？消息广播？依赖venus）\r\n4. 如何检验别人出的块是否合法（消息执行结果检查，是否该这个leader出块，winningPost是否合法，依赖venus，drand，cluster的信息）\r\n5. 选择分叉链的方法（不依赖别的服务）\r\n6. 挖矿奖励和惩罚的执行（reward actor的执行，更新账户的余额等都依赖venus，因为账户的信息都记录在vneus服务中）\r\n7. 块如何写到底层数据库（miner完全不负责，全部靠venus服务）\r\n8. 区块同步（miner完全不负责，全部靠venus服务）\r\n9. 区块消息的执行（miner也不负责，全靠venus服务，但是会把计算结果，也即是父tipset的state root和receipt root返回给miner，miner需要这些数据放进新区块。）\r\n\r\n从以上我们就可以看出，miner只负责leader选举和检查的计算（其中用到的数据和信息都是来自于外部服务，自己不会存储和生产这些数据），负责打包区块（区块同步和存储都是依靠venus，父区块消息的执行也是依赖venus。filecoin每个高度H时，执行的都是H-1高度上的区块消息。也就是说，打包区块，并广播区块时，不会对当前执行当前区块的消息，也许是因为EC共识是可以分叉的，晚一个高度再进行执行也许会更加合理？）\r\n\r\n主要模块有：矿工管理，出块管理。\r\n\r\n## 矿工管理\r\n`Venus` 矿池中的用户（或称为矿工）是由 `venus-auth` 组件管理的，其记录了每个矿工的基础信息及身份验证信息。`venus-miner` 从 `venus-auth` 拉取最新的矿工列表，并周期性地进行区块生产流程。\r\n`venus-miner` 可以暂停矿工列表中任意矿工的出块，比如某个矿工的签名节点失联时，可以手动暂停该矿工的出块流程，等待签名正常后再开启出块。\r\n`venus-miner` 执行 `update` 更新矿工列表，通常在某些矿工退出矿池或有新的矿工加入矿池时进行。\r\n\r\n## 出块管理\r\n`venus-miner` 的一轮出块流程如下：\r\n* 请求同步节点获取 `Base`，即 `parent Tipset`（通常是最近一次有出块周期的 `Block`集）及空轮数（空轮表示该周期没有任何矿工出块）；\r\n* 统计本周期获得出块权的矿工及出块必要数据，如随机数，选中扇区信息等；\r\n* 为每个获得出块权的矿工计算获胜证明，选择消息，创建区块；\r\n* 验证本周期生产的区块合法性（是否存在共识错误，因为广播具有共识错误的区块会受到一定的 `Fil` 惩罚），广播区块。\r\n\r\n# venus-miner代码流程\r\n`node/builder.go`方法把`node/impl/miner.go`,`common/common.go`两个文件的类注册到jsonrpc中的server，从而实现对外rpc服务。\r\n\r\n## 矿工管理\r\n`node/modules/miner-manager`包实现了对矿工的管理。主要是和`venus-auth`服务进行通信，进行矿工地址的管理。\r\n\r\n## 共识算法\r\n`miner/multiminer.go`实现了EC共识算法。`miner/miningmgr.go`实现了对外rpc的接口逻辑。\r\n\r\n`miner/multiminer.go:(m *Miner) mine()`是最核心的方法，方法里面有一个无限for循环，循环内部会不停的进行整个共识流程。\r\n\r\nminer调用api让`venus`执行`MinerCreateBlock`方法，产生H高度的区块，此方法会从数据库查询出H高度的父亲的tipset，然后执行高度H-1（也就是父区块）tipset，并拿到receipt和stateroot，赋值给当下高度H的区块。\r\n\r\n`GetBestMiningCandidate()`负责最重链选择。\r\n\r\n# venus-miner为什么要这样设计"},"author":{"user":"https://learnblockchain.cn/people/808","address":null},"history":"QmSaN1pRotDQvgkAiX3LRvj3pCmiWzvgsvyZzdDhqiTGUN","timestamp":1681979798,"version":1}