grin挖矿源码分析

以下文档是自己看grin源码的随手记录,逻辑混乱,不构成参考。

grin

挖矿的文档
https://github.com/mimblewimble/grin/blob/master/doc/stratum.md

结构体

grin挖矿源码分析_第1张图片
grin挖矿源码分析_第2张图片
grin挖矿源码分析_第3张图片

矿工获取挖矿数据

grin挖矿源码分析_第4张图片

JobTemplate中的pre_pow,这时候还没有经过hash。只是经过to_hex()


grin挖矿源码分析_第5张图片

to_hex()


grin挖矿源码分析_第6张图片

grin-miner中

在client.rs中
这里面有挖矿时跟节点交互的各种方法。重点关注send_message_get_job_tempalte,这个就是向服务器发送了getjobtemplate的jsonrpc请求。

grin挖矿源码分析_第7张图片

继续看 Controllerrun方法,方法太长,只挑选部分代码

// 向服务器发送请求
let _ = self.send_message_get_job_template();
// 从服务器读取数据
match self.read_message() {

}
// 对消息进行判断
debug!(LOGGER, "Received message: {}", m);
// Deserialize to see what type of object it is
let v: serde_json::Value = serde_json::from_str(&m).unwrap();
// Is this a response or request?
if v["id"] == String::from("Stratum") {
    // this is a request
    let request: types::RpcRequest =
        serde_json::from_str(&m).unwrap();
    let _ = self.handle_request(request);
    continue;
} else {
    // this is a response
    let response: types::RpcResponse =
        serde_json::from_str(&m).unwrap();
    let _ = self.handle_response(response);
    continue;
}
 // run的任务未完,后面继续。。。

如果这是一个response,就处理他let _ = self.handle_response(response);
handle_response中会对收到的消息类型进行判断,然后进行相应的处理。

grin挖矿源码分析_第8张图片

重要的是这句 let _ = self.send_miner_job(job);,就是发送给挖矿那边了。

挖矿那边处理接受之后的信息

grin挖矿源码分析_第9张图片

我们看他对信息简单加工之后,又调用了 run_solver
grin挖矿源码分析_第10张图片

再找到
grin挖矿源码分析_第11张图片

这里的run_solver就是c的代码了
grin挖矿源码分析_第12张图片

grin挖矿源码分析_第13张图片

按照之前在文档中的说明, run_solver中传进去的 header需要先进行hash,然后用hash生成图,然后才是 cuckoo cycle算法发挥了。
grin挖矿源码分析_第14张图片

grin挖矿源码分析_第15张图片
image.png
grin挖矿源码分析_第16张图片

首先将nonce添加到header最后,然后进行blake2b运算。keys->setkeys(hcrkey)就是生成图的keys了,还不是图。


再看挖矿那边的代码
再main.rs中


grin挖矿源码分析_第17张图片

solution

pub struct Proof {
    /// Power of 2 used for the size of the cuckoo graph
    pub edge_bits: u8,
    /// The nonces
    pub nonces: Vec,
}

再看找到解决方案后的hash


grin挖矿源码分析_第18张图片
image.png

你可能感兴趣的:(grin挖矿源码分析)