以太坊CPU挖矿源码分析
agent agent 是具体执行挖矿的对象。 它执行的流程就是,接受计算好了的区块头, 计算mixhash和nonce, 把挖矿好的区块头返回。
构造CpuAgent, 一般情况下不会使用CPU来进行挖矿,一般来说挖矿都是使用的专门的GPU进行挖矿, GPU挖矿的代码不会在这里体现。
设置返回值channel和得到Work的channel, 方便外界传值和得到返回信息
启动和消息循环,如果已经启动挖矿,那么直接退出, 否则启动update 这个goroutine update 从workCh接受任务,进行挖矿,或者是接受退出信息,退出
mine, 挖矿,调用一致性引擎进行挖矿, 如果挖矿成功,把消息发送到returnCh上面。
remote_agent
remoteagent 提供了一套RPC接口,可以实现远程矿工进行采矿的功能。 比如我有一个矿机,矿机内部没有运行以太坊节点,矿机首先从remoteagent获取当前的任务,然后进行挖矿计算,当挖矿完成后,提交计算结果,完成挖矿。
数据结构和构造
启动和停止
得到输入输出的channel,这个和agent.go一样。
loop方法,和agent.go里面做的工作比较类似, 当接收到任务的时候,就存放在currentWork字段里面。 如果84秒还没有完成一个工作,那么就删除这个工作, 如果10秒没有收到hashrate的报告,那么删除这个追踪/。
GetWork,这个方法由远程矿工调用,获取当前的挖矿任务。
SubmitWork, 远程矿工会调用这个方法提交挖矿的结果。 对结果进行验证之后提交到returnCh ``` // SubmitWork tries to inject a pow solution into the remote agent, returning // whether the solution was accepted or not (not can be both a bad pow as well as // any other error, like no work pending). func (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common.Hash) bool { a.mu.Lock() defer a.mu.Unlock()
SubmitHashrate, 提交hash算力
unconfirmed unconfirmed是一个数据结构,用来跟踪用户本地的挖矿信息的,比如挖出了一个块,那么等待足够的后续区块确认之后(5个),再查看本地挖矿的区块是否包含在规范的区块链内部。
数据结构
unconfirmedBlocks 实现了一个数据结构,用来管理本地挖掘的区块,这些区块还没有达到足够的信任度来证明他们已经被规范的区块链接受。 它用来给矿工提供信息,以便他们了解他们之前挖到的区块是否被包含进入了规范的区块链。
插入跟踪区块, 当矿工挖到一个区块的时候调用, index是区块的高度, hash是区块的hash值。
Shift方法会删除那些index超过传入的index-depth的区块,并检查他们是否在规范的区块链中。
worker.go worker 内部包含了很多agent,可以包含之前提到的agent和remote_agent。 worker同时负责构建区块和对象。同时把任务提供给agent。
数据结构:
Agent接口
Work结构,Work存储了工作者的当时的环境,并且持有所有的暂时的状态信息。
构造
push方法,如果我们没有在挖矿,那么直接返回,否则把任务送给每一个agent
makeCurrent,未当前的周期创建一个新的环境。
commitTransactions
commitTransaction执行ApplyTransaction
miner miner用来对worker进行管理, 订阅外部事件,控制worker的启动和停止。
数据结构.
构造, 创建了一个CPU agent 启动了miner的update goroutine
update订阅了downloader的事件, 注意这个goroutine是一个一次性的循环, 只要接收到一次downloader的downloader.DoneEvent或者 downloader.FailedEvent事件, 就会设置canStart为1. 并退出循环, 这是为了避免黑客恶意的 DOS攻击,让你不断的处于异常状态
Start.
领取专属 10元无门槛券
私享最新 技术干货