我想有一天找个机会把这部分写下来,今天正好有空,我想用最简单的方法把这部分逻辑搞清楚。 老规矩还是看图说话吧
图1开采功能的核心对象之间的关系
开采的核心功能包括Miner、Worker、CPU代理、远程代理、work、Clipue和Engine多个对象的协作,它们之间的关系如下:
Miner :总承包工头(管大局、发号施令) worker (总承包工头助理)总管所有事务以代替总承包) CpuAgent/RemoteAgent:工人(真正工作的人) Work:
图2开采功能的核心对象定义
从上面的类图中也可以看到,一个Miner只有一个助理工作人员。 Miner只负责停止开采等最高级别的工作。 一个助理工作人员可以雇佣多个工人(通常是多种类型的工人),创建新的任务工作,将任务工作分发给工人[ CPU代理],并接收工人[ CPU代理]的成果收到成果后的处理代码为worker.wait (
func (自*工作器(wait ) ) {
for {
mustCommitNewWork :=true
forresult :=range http://www.Sina.com/{//self.recv保存了工人的成果(实际上成功炸毁了符合规则的块hash ) )。
Atomic.addint32(self.atwork,-1) )。
if result==nil {
连续
}
block :=result.Block
work :=result.Work
//updatetheblockhashinalllogssinceitisnowavailableandnotwhenthe
//receipt/logofindividualtransactionswerecreated。
for _,r :=range work.receipts {
for _,l :=range r.Logs {
l.BlockHash=block.Hash (
}
}
for _,log :=range work.state.Logs (
log.BlockHash=block.Hash (
}
//将新块写入本地leveldb
stat,err :=self.chain.writeblockwithstate (block,work.receipts,work.state ) )。
if err!=nil {
log.error (' failedwritingblocktochain '、' err '、err ) )。
连续
}
//checkifcanonblockandwritetransactions
if stat==core.CanonStatTy {
//implicitbypostingchainheadevent
mustCommitNewWork=false
}
//broadcasttheblockandannouncechaininsertionevent
//通过设置事件播放自己挖的新区块,已经实现了宣言的目的(兄弟们,挖好了。 请看,请作证) )。
self.mux.post (core.newminedblockevent { block : block } )
var (
events [ ]接口{ }
logs=work.state.Logs (
)
events=append(events,core.chain event { block : block,Hash: block.Hash ),Logs: logs} )
if stat==core.CanonStatTy {
//上写有规范链后,在此添加事件,并在此事件中打开下一个开采任务(commitNewWork )
事件=append (事件,core.chainheadevent (block : block ) ) ) )。
}
self.chain.postchainevents (events,logs ) ) ) ) ) )。
//inserttheblockintothesetofpendingonestowaitforconfirmations
self.unconfirmed.insert (block.numberu 64 )、block.Hash ) )
if mustCommitNewWork {
self.commitNewWork (
}
}
}
}