首页 > 编程知识 正文

以太坊矿机怎么挖矿,以太坊代币实现

时间:2023-05-04 11:33:37 阅读:43654 作者:3165

我想有一天找个机会把这部分写下来,今天正好有空,我想用最简单的方法把这部分逻辑搞清楚。 老规矩还是看图说话吧

图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 (

}

}

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。