❶ 區塊鏈是搜索樹嗎
並不是,搜索樹這種數據結構,在區塊鏈中扮演著重要的角色,交易的數據,賬號的管理,交易的收據信息等都是一樹為基礎。本文主要介紹三種樹,也是在以太坊的中運用最多的三種樹結構:Trie樹, Patricia Trie和Merkle樹。搜索樹是區塊鏈中的一個部分
❷ Miner 流程
以太坊的礦工出塊的流程,不同版本有過變更,下面基於1.7.3版本和1.8.4版本來分享
channel: 用於1發1收
發送 :sampleChan<-
接收 : <-sampleChan
Feed:用於1發多收,參考chainHeadCh
接收者注冊 :Subscribe(sampleChan)
發送 :send, 發送的地方不太好找,需要通過send和event/channel類型查找,例如miner中主要涉及到的就是 PostChainEvents
接收 :<-sampleChan
數據結構:
可以理解為操作間(eth)中有了礦(tx),那麼礦主(miner)安排工人(worker)挖礦(seal)。結構體定義如下:
Type Miner struct { -- - 理解為礦主
mux *event.TypeMux
worker *worker ---- 理解為幹活的工人
coinbase common.Address
eth Backend - --- 理解為操作間
engine consensus.Engine ---- 理解為挖礦的工具
exitCh chan struct {}
canStart int32 //canstart indicates whether we can start the mining operation
shouldStart int32 //shouldstart indicates whether we should start after sync
}
流程圖如下:
1. 節點啟動: backend.new->miner.new->worker.new: 調用commitNewWork,裡面使用push把work傳遞給cpuAgent, 之後在geth命令行敲miner.start()後->miner.start->worker.start->cpuAgent.start,調用Seal,計算nonce值,再發送 recv 消息,通知 worker . wait ,在收到之後將塊打包插入到區塊鏈,之後調用PostChainEvents,發送消息chainHeadCh, Worker.update 在收到消息後,重新調用 commitNewWor k,形成一個循環。
2. 創世塊: 調用geth的init命令觸發調用initGenesis->SetupGenesisBlock, 裡面具體強調一下time是使用的genesisBlock.json中的值,一般都是0.
3. 正常情況: worker . wait ,在收到之後將塊打包插入到區塊鏈,之後調用PostChainEvents,發送消息chainHeadCh, Worker.update 在收到消息後,重新調用 commitNewWor k,形成一個循環。
Miner .new: 在backend new的時候調用,即在節點啟動的時候調用。
Miner . update :在節點啟動的時候調用,用於監控是否有塊同步,如果有則停止挖礦,如果沒有啟動挖礦,這個在POW這種競爭性出塊的環境中需要。
Worker .new: 在miner.new的時候調用,記載節點啟動的時候調用
Worker.update: 節點啟動的時候調用,如果是非全節點的話用於監控接受交易transaction,關鍵函數 commitTransactions ,還用於調度在收到 chainHeadCh 的消息後,觸發 commitNewWork
其中 commitNewWork : 用於將pending的tx輸入到系統,計算trie等等操作,生成block,並將work push到cpuAgent處理,注意沒有蓋章
Worker. wait (對應於 1.8.4 的 resultLoop ) :節點啟動的時候調用,循環監聽 recv 消息,將攜帶的block插入區塊鏈中、發送廣播消息( NewMinedBlockEvent )、發送消息 PostChainEvents (發送 ChainHeadEvent ,即 chainHeadCh ),其中的關鍵函數是 WriteBlockAndState 。
cpuAgent .update() : 在cpuAgent.start()->worker.start->miner.start->geth的命令行調用之後啟動循環,用於接收 commitNewWork 分配下來的work,關鍵函數 mine ,裡面調用 Seal ,主要是完成POW尋找nonce值的操作,發送 recv 消息通知worker,也可以叫做蓋章。
類圖如下:
具體結構不再贅述
流程:
Miner.update:用於監控是否有塊同步,如果有則停止挖礦,這個在POW這種競爭性出塊的環境中需要
mainLoop:收到newWorkCh消息後處理,調用commitNewWork中的commit發送taskCh消息
newWorkLoop:收到startCh消息和chainHeadCh消息後發送newWorkCh消息
resultLoop:循環監聽resultCh(seal發送)消息,將攜帶的block插入區塊鏈中,並發送廣播消息,關鍵函數WriteBlockAndState,並發送chainHeadCh消息
taskLoop:以前agent做的事情,收到taskCh消息後,調用seal,裡面發送resultCh消息