矿池开发之stratum协议

矿池开发之stratum协议

stratum协议是目前流行的矿池交互协议,目前多数矿池和挖矿软件都是依据该协议开发的,它是getwork协议改良过来的,非常适合矿池和矿工之间交互挖矿任务。

该协议定义了5种消息,来完成矿池和矿工之间的挖矿协作流程:订阅、授权、下发难度、下发任务、提交

1,订阅

矿机主动连接矿池,向矿池申请加入挖矿,一般会附带自己挖矿软件的版本

消息如下:

{“id”:1,“method”:“mining.subscribe”,“params”:[软件版本]}

矿池回复给矿机一个唯一标识符,这个标识符标记为exnonce1,以后改矿机的所有挖矿活动,必须包含这个exnonec1,以区分其它矿机 矿池回复的信息还包含一个exnonce2_len,即exnonce2的长度限定,后面矿机用到exnonce2点时候,限定了长度,不能乱改

消息如下:

{“id”:1,“result”:[[[“mining.set_difficulty”,“1”],[“mining.notify”,“1”]],"{exnonce1}",{exnonce2_len}],“error”:null}

2,授权

一些矿池,采用注册制挖矿,需要登记用户名,密码 多数矿池采用匿名挖矿,在这一步,发送自己的钱包地址和机器编号给矿池,收益矿池会打到改地址上

消息如下:

{“id”:2,“method”:“mining.authorize”,“params”:["{地址}.{机器编号}","{密码}"]}

矿池根据提交信息,返回你正确,或者错误并断开

消息如下:

{“id”:2,“result”:true,“error”:null}

3,下发难度

矿机被授权后,那么矿池会下发个任务难度给矿机,后面矿机的挖矿,必须达到任务难度要后,矿池才登记贡献

消息如下:

{“id”:null,“method”:“mining.set_difficulty”,“params”:[{难度值}]}

4,下发挖矿任务

矿池会不断向矿机下发任务,矿机接到任务后,根据任务的标示,可以继续挖上一个任务,还是立即开始新的任务挖矿

消息如下:

{“id”:null,“method”:“mining.notify”,“params”:["{任务ID}","{上一个块hahs}","{coinbase1}","{coinbase2}",[{区块交易merkle_branch}],"{版本}","{区块难度}","{区块时间}",{是否立即更换任务}]}

5,提交挖矿结果

矿机根据挖矿任务开始挖矿,直到发现了满足任务难度的nonce后,将该nonce提交给矿池

消息如下:

{“id”:3,“method”:“mining.submit”,“params”:["{机器编号}","{任务ID}","{exnonce2}","{时间}","{nonce}"]}

参考 https://en.bitcoin.it/wiki/Stratum_mining_protocol