Stratum 矿池协议实例分析 最近在VPS上搭建unomp矿池,欧易交易所主要参考的文档是官网上的README,遇坑无数,以后有机会再专门写一篇。在最后一步测试矿工与矿池之间能否正常完成挖矿工作时,需要了解一些stratum这个协议的细节。 当前的主流挖矿协议是stratum,以前还有GBT(getblocktemplate)、getwork、getwork with rollntime extension等几种协议,它们都过时了,见bitcointalk上这篇贴子的讨论。 我用unomp搭建好矿池之后,欧意交易所app官方下载不舍得把正在工作的ASIC矿机停下来用于这个测试,先用免费的Cpuminer软件把协议调通。cpuminer在 https://sourceforge.net/projects/cpuminer/files 下载,我使用的是win64的2.5.0版本。 这款小软件在2009年比特币诞生的时候还可以挖矿,现在它存在的意义就在于测试矿池协议了。软件包中的minerd需要几个命令行参数,为了清楚地看到通讯协议的详细内容,我只用了一个线程,并打开了调试选项,数字货币交易平台用户名是钱包的地址,这里的地址是比特币测试网络的地址。 minerd --algo=sha256d --threads=1 --url=stratum+tcp://my_pool_ip_address:3008 --user=myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4 --pass=x --debug --protocol-dump Stratum协议的内容比较多,这篇贴子里有详细的介绍,这里只是给出我试验时的一些数据实例,有些内容暂时也不理解,需要以后再学习。以下内容中的客户端表示矿工miner,服务器表示矿池pool。 1. 客户端首先向服务器发送subscribe指令{"id": 1, "method": "mining.subscribe", "params": ["cpuminer/2.5.0"]} 参数中指名矿工软件的名称和版本号。 2. 服务器端返回信息比特币挖矿实际上就是去寻找随机数nonce,有时所有的随机数都试遍了,仍无法满足目标,就需要用到extra nonce。 { "id":1, "result": [ [ ["mining.set_difficulty","deadbeefcafebabe0100000000000000"], //后面是stratum session id ["mining.notify","deadbeefcafebabe0100000000000000"] ], "70000000", // ExtraNonce1 十六进制 4 // ExtraNonce2_size 字节 ], "error":null } 3. 客户端发送认证信息用户名是钱包的地址,我这里使用的是比特币测试网络的地址,并没有以1开头。 { "id": 2, "method": "mining.authorize", "params": ["myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4", "x"] } 4. 服务器返回true,表示用户验证通过{"id":2,"result":true,"error":null} 5. 服务器端发回难度设置消息{"id":null,"method":"mining.set_difficulty","params":[8]} 6. 服务器发送通知消息 { "method":"mining.notify", "params":[ "3d", // 作业ID "af8cecebf98...43100000000", //previous block hash "010000000100000....0000000", //generation tx part1 "0d2f6e6f646.....5b36ec88ac00000000", //generation tx part2 ["6fb6....80cb","d4464...49a5a290", ... ,"68d803...4ec79d161"], // merkle branches 默克尔树分支 "20000000", // block version "1a3fffc0", // nBits encoded network difficulty "5a158226", //nTime,时间戳 false // clean jobs,如果是true,则表示其它矿工爆块了,开始新一轮计算 ] }矿工可能用到了多线程,所以需要job id来区分不用的线程,后面是一堆用于区块生成的信息。 7. 客户端发现一个nonce,提交给服务器 { "method": "mining.submit", "params": [ "myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4", //worker name "4c", //job id "00000000", //extranonce2 "5a158557", //nTime "6ae65681" //nonce ], "id":4 } 8. 服务器返回结果,返回true表示服务器认可客户端的工作 { "id":4, "result":true, "error":null }今天用ASIC矿机测试了3个小时的通讯协议,在比特币testnet上挖了60多个新块,钱包中收币也没问题,nuomp架起来了。 (责任编辑:) |