矿池开发之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}"]}