一、简介
矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅、授权、下发难度、下发任务、提交share五种消息。
二、订阅(mining.subscribe)
矿机启动后,先和矿池建立TCP连接,然后向矿池发送订阅消息,消息内容如下:
{"id":1,"method":"mining.subscribe","params":[]}
矿池收到矿机的订阅消息后,响应消息内容如下:
{"id":1,"result":[[["mining.set_difficulty","01000000"],["mining.notify","01000000"]],"01000000",8],"error":null}
其中id与订阅消息中id相同。result是一个数组,它包含三部分,第一部分也是个数组其实可以为空,第二部分是extraNonce1(一般是session id),第三部分是extraNonce2的长度,一般为8字节。
三、授权(mining.authorize)
矿机收到矿池的订阅响应消息后,接着向矿池发送授权消息,消息内容如下:
{"id":2,"method":"mining.authorize","params":["zsc.1","x"]}
params包含两部分,第一部分是矿工名,第二部分是矿工密码(随意)。
矿池收到矿机的授权消息后,先对矿工名进行验证,矿工名的第一部分(“.”左边的部分)为用户名或子账号名,若该用户名不存在,则授权失败,返回error,消息内容如下:
{"id":2,"result":null,"error":[29,"Invalid username",null]}
error中第一部分是错误码,第二部分是错误描述。若授权成功,则返回消息内容如下:
{"id":2,"result":true,"error":null}
四、下发难度(mining.set_difficulty)
授权成功后,矿池会向矿机下发难度,消息内容如下:
{"id":null,"method":"mining.set_difficulty","params":[8192]}
其中id为null,params的值为十六进制的挖矿难度。注:创世块的难度为1。
五、下发任务(mining.notify)
授权成功后,矿池会先向矿机下发难度,然后下发任务,消息内容如下:
{"id":null,"method":"mining.notify","params":["0","877be49f81bbe7ae192f869006b2f562ba33693f00170fc70000000000000000","02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f03dcbe08044871c15c50616e64614d696e6572","ffffffff022de3974d000000001976a914b525972953d94ab3225446d4a04ac67daaab6d5888ac0000000000000000266a24aa21a9ed0316ab39fb538e1b1397176df57a5138170ad549e2a2a8e39ce0adb4296ca40900000000",["75f1158642ca84dd5c9c1d47505cf573d9abaa9cae570c9487dc7cba5b707987","d68e1776784f3447dfab9a587f3697c9b9d9f42e459c88ec346093c3f1f406f8","88a52d4bfe331b177cf7a7cfb15d3222ef3e2e45e8f4f4fdffff569d8ba6b273","7140153d3d4717bcaec2872cc1dff38ecdaf8264224db639afddf23f62b49d6d","e15068416978ed16dbd744cacc2a61ab136cd9b1a40df8a49407c18616e2d09f","6506431c809f6986e47944cc27f5e1e1cf257bafc524eda4b0051727dfd56097","c1bc2e0f5ee63b2fb50784372ded218e975b45876793ca20431513897d053bb2","0ce74bdfda5b56d9661823853bed7d57cb12958f814ca984dc99f70841bdcf8a","7f4d05180acb38d93cf920eee2c3309417d44641f3623c4ffc19be0fcb65ae2e","9496d9f27076acc8a231cd37695e6747bf5925eecf0b2ae4530d43134a717ebf","50646bd3f3f4aa48b4111de79da154c7031eae0096a3ea114b6a356a518dac71"],"20000000","172c4e11","5cc1713d",true]}
其中id为null。params内容如下:
params[0]:任务号;
params[1]:前一区块hash;
params[2]:coinbase1;
params[3]:coinbase2;
params[4]:merkle branch哈希数组;
params[5]:version区块版本号;
params[6]:bits下一区块的压缩目标;
params[7]:time当前时间戳;
params[8]:isclean,清空任务,不是所有矿机都支持;
六、提交share(mining.submit)
矿机计算到符合任务的share之后,向矿池提交该share,消息内容如下:
{"id":3,"method":"mining.submit","params":["zsc.1","0","b909000000000000","5cc1713f","5a0199e2"]}
params第一部分是矿工名,第二部分是任务号,第三部分是extraNonce2,第四部分是当前时间戳,第五部分是nonce。第六部分可选(上面没有),是版本掩码。
矿池收到矿机发送的提交share消息后,验证该share是否有效(超时或没有达到target),若有效,则返回提交有效的结果给矿机:
{"id":3,"result":true,"error":null}
若无效,则返回error,消息内容类似授权失败消息,只是错误码和错误描述不同。