最近在VPS上搭建unomp礦池旷赖,主要參考的文檔是官網(wǎng)上的README睹欲,遇坑無數(shù),以后有機(jī)會再專門寫一篇崇摄。在最后一步測試礦工與礦池之間能否正常完成挖礦工作時,需要了解一些stratum這個協(xié)議的細(xì)節(jié)慌烧。
當(dāng)前的主流挖礦協(xié)議是stratum逐抑,以前還有GBT(getblocktemplate)、getwork屹蚊、getwork with rollntime extension等幾種協(xié)議厕氨,它們都過時了,見bitcointalk上這篇貼子的討論汹粤。
我用unomp搭建好礦池之后命斧,不舍得把正在工作的ASIC礦機(jī)停下來用于這個測試,先用免費的Cpuminer軟件把協(xié)議調(diào)通玄括。cpuminer在 https://sourceforge.net/projects/cpuminer/files 下載冯丙,我使用的是win64的2.5.0版本。
這款小軟件在2009年比特幣誕生的時候還可以挖礦遭京,現(xiàn)在它存在的意義就在于測試礦池協(xié)議了胃惜。軟件包中的minerd需要幾個命令行參數(shù),為了清楚地看到通訊協(xié)議的詳細(xì)內(nèi)容哪雕,我只用了一個線程船殉,并打開了調(diào)試選項,用戶名是錢包的地址斯嚎,這里的地址是比特幣測試網(wǎng)絡(luò)的地址利虫。
minerd --algo=sha256d --threads=1 --url=stratum+tcp://my_pool_ip_address:3008 --user=myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4 --pass=x --debug --protocol-dump
Stratum協(xié)議的內(nèi)容比較多,這篇貼子里有詳細(xì)的介紹堡僻,這里只是給出我試驗時的一些數(shù)據(jù)實例糠惫,有些內(nèi)容暫時也不理解,需要以后再學(xué)習(xí)钉疫。以下內(nèi)容中的客戶端表示礦工miner硼讽,服務(wù)器表示礦池pool。
1. 客戶端首先向服務(wù)器發(fā)送subscribe指令
{"id": 1, "method": "mining.subscribe", "params": ["cpuminer/2.5.0"]}
參數(shù)中指名礦工軟件的名稱和版本號牲阁。
2. 服務(wù)器端返回信息
比特幣挖礦實際上就是去尋找隨機(jī)數(shù)nonce固阁,有時所有的隨機(jī)數(shù)都試遍了,仍無法滿足目標(biāo)城菊,就需要用到extra nonce备燃。
{
"id":1,
"result":
[
[
["mining.set_difficulty","deadbeefcafebabe0100000000000000"], //后面是stratum session id
["mining.notify","deadbeefcafebabe0100000000000000"]
],
"70000000", // ExtraNonce1 十六進(jìn)制
4 // ExtraNonce2_size 字節(jié)
],
"error":null
}
3. 客戶端發(fā)送認(rèn)證信息
用戶名是錢包的地址,我這里使用的是比特幣測試網(wǎng)絡(luò)的地址凌唬,并沒有以1開頭并齐。
{
"id": 2,
"method": "mining.authorize",
"params": ["myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4", "x"]
}
4. 服務(wù)器返回true,表示用戶驗證通過
{"id":2,"result":true,"error":null}
5. 服務(wù)器端發(fā)回難度設(shè)置消息
{"id":null,"method":"mining.set_difficulty","params":[8]}
6. 服務(wù)器發(fā)送通知消息
{
"method":"mining.notify",
"params":[
"3d", // 作業(yè)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來區(qū)分不用的線程,后面是一堆用于區(qū)塊生成的信息酥夭。
7. 客戶端發(fā)現(xiàn)一個nonce赐纱,提交給服務(wù)器
{
"method": "mining.submit",
"params": [
"myAzQj4bH4mMF2GpoLSY2v4qVquASTpzR4", //worker name
"4c", //job id
"00000000", //extranonce2
"5a158557", //nTime
"6ae65681" //nonce
],
"id":4
}
8. 服務(wù)器返回結(jié)果,返回true表示服務(wù)器認(rèn)可客戶端的工作
{
"id":4,
"result":true,
"error":null
}
今天用ASIC礦機(jī)測試了3個小時的通訊協(xié)議熬北,在比特幣testnet上挖了60多個新塊疙描,錢包中收幣也沒問題,nuomp架起來了讶隐。