Stratum 礦池協(xié)議實例分析

最近在VPS上搭建unomp礦池,主要參考的文檔是官網(wǎng)上的README,遇坑無數(shù),以后有機會再專門寫一篇。在最后一步測試礦工與礦池之間能否正常完成挖礦工作時,需要了解一些stratum這個協(xié)議的細節(jié)。

當前的主流挖礦協(xié)議是stratum,以前還有GBT(getblocktemplate)、getwork、getwork with rollntime extension等幾種協(xié)議,它們都過時了,見bitcointalk上這篇貼子的討論。

我用unomp搭建好礦池之后,不舍得把正在工作的ASIC礦機停下來用于這個測試,先用免費的Cpuminer軟件把協(xié)議調(diào)通。cpuminer在 https://sourceforge.net/projects/cpuminer/files 下載,我使用的是win64的2.5.0版本。

這款小軟件在2009年比特幣誕生的時候還可以挖礦,現(xiàn)在它存在的意義就在于測試礦池協(xié)議了。軟件包中的minerd需要幾個命令行參數(shù),為了清楚地看到通訊協(xié)議的詳細內(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)容比較多,這篇貼子里有詳細的介紹,這里只是給出我試驗時的一些數(shù)據(jù)實例,有些內(nèi)容暫時也不理解,需要以后再學習。以下內(nèi)容中的客戶端表示礦工miner,服務(wù)器表示礦池pool。

1. 客戶端首先向服務(wù)器發(fā)送subscribe指令

{"id": 1, "method": "mining.subscribe", "params": ["cpuminer/2.5.0"]}

參數(shù)中指名礦工軟件的名稱和版本號。

2. 服務(wù)器端返回信息

比特幣挖礦實際上就是去尋找隨機數(shù)nonce,有時所有的隨機數(shù)都試遍了,仍無法滿足目標,就需要用到extra nonce。

{
    "id":1,
    "result":
    [
        [
            ["mining.set_difficulty","deadbeefcafebabe0100000000000000"], //后面是stratum session id
            ["mining.notify","deadbeefcafebabe0100000000000000"]
        ],
        "70000000",  // ExtraNonce1 十六進制
        4   // ExtraNonce2_size  字節(jié)
    ],
    "error":null
} 

3. 客戶端發(fā)送認證信息

用戶名是錢包的地址,我這里使用的是比特幣測試網(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ù)器認可客戶端的工作

{
"id":4,
"result":true,
"error":null
}

今天用ASIC礦機測試了3個小時的通訊協(xié)議,在比特幣testnet上挖了60多個新塊,錢包中收幣也沒問題,nuomp架起來了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容