如何在 Java 中編寫比特幣 JSON-RPC“getwork”請求?
我不完全確定是在 Bitcoin-SE 還是 Stack Overflow 上問這個問題,但我決定在這裡發布,因為這個問題與比特幣直接相關,而且我在 Bitcoin-SE 上觀察到的程式經驗普遍突出. 如果 Bitcoin-SE 是不正確的發布位置,我提前道歉;我是 SE 新手,這是我最好的猜測。
為了更好地理解比特幣探勘的工作原理,我正在嘗試用 Java 編寫一個簡單的比特幣 CPU 探勘器,我對此有一些但沒有太多經驗。我發現所有關於 Java 中 JSON-RPC 實現的線上資源要麼已經過時,要麼不再起作用,要麼對於 Java 經驗有限的人來說難以理解。如何以最簡單的方式
getwork
用 Java 編寫 JSON-RPC 請求(到池伺服器)並將輸出正確解析為探勘所需的變數?
JSON-RPC 協議非常簡單。您 POST 到礦池(或 bitcoind 客戶端):
{"method": "getwork", "params": [], "id": "anything"}
然後回來:
{"result": {"data": "hex bytes....", "target": "hex bytes...", ...}, ... }
您只需要前 80 個字節
result.data
- 您更改最後 4 個字節(隨機數)併計算雜湊值。然後,當您找到小於“目標”的雜湊(通常是高 32 位等於零的雜湊)時,您再次呼叫 getwork 以報告您的雜湊(並在池中獲得份額):{"method": "getwork", "params": ["hex-header"], "id": "anything"}
在標準的 getwork 呼叫中有一堆不穩定的字節順序編碼。您通常希望在散列之前反轉字節是每個長整數(4 個字節),並在將找到的塊報告回池之前執行相同操作。有關礦工的簡單參考實現(在 python 中),請參閱範例pyminer 。在Miner.work
()
函式內部是魔法發生的地方。工作函式有兩個參數:datastr
,這是儲存在裡面的值,這是儲存在裡面result.data
的targetstr
值result.target
。另一件事 - 大多數池要求您在 POST 時使用基本身份驗證,因此您需要在請求的標頭中包含您的使用者名和密碼。