兄弟連區塊鏈教程btcpool礦池原始碼分析JobMaker模組解析
btcpool礦池-JobMaker模組解析
核心機制總結
- 同時監聽kafka KAFKA_TOPIC_RAWGBT和KAFKA_TOPIC_NMC_AUXBLOCK,以支援混合挖礦
- 接收的Gbt訊息,如果與本地時間延遲超過60秒將丟棄,如果延遲超過3秒將列印log
- 可用的Gbt訊息,將以gbtTime+isEmptyBlock+height來構造key寫入本地Map,另gbtHash也會寫入本地佇列
-
本地gbtHash佇列僅儲存最近20條,本地gbtMap中Gbt訊息有效期:非空Gbt有效期90秒,空Gbt有效期15秒,過期將清除
- 有效期可從配置檔案中指定
- Gbt訊息如果高度低於本地Gbt高度,且本地Gbt非空,且與本地時間間隔沒超過2倍stratumJobInterval_,Gbt訊息將丟棄
-
三種情況下將立即向kafka傳送StratumJob:
- 高度大於本地高度(即已發現新塊)
- 高度與本地高度相同,但前個Job為空塊Job,但新Gbt非空塊
- 達到預定的時間間隔20秒(可從配置檔案中指定)
JobMaker命令使用
JobMaker,用於監聽kafka獲取最新的比特幣Gbt訊息、以及域名幣NmcAuxBlock訊息,並用二者構造StratumJob再發送給kafka。
jobmaker -c jobmaker.cfg -l log_dir #-c指定jobmaker配置檔案 #-l指定日誌目錄
jobmaker.cfg配置檔案
//是否使用testnet testnet = true; jobmaker = { //傳送stratum job間隔秒數 stratum_job_interval = 20; //gbt生命週期秒數 gbt_life_time = 90; //空gbt(即不含交易)生命週期秒數 //此值應>=10 empty_gbt_life_time = 15; //最近一次stratum job傳送時間寫入檔案 file_last_job_time = "/work/xxx/jobmaker_lastjobtime.txt"; //區塊版本,預設為0表示使用bitcoind返回的區塊版本 block_version = 0; }; //kafka叢集 kafka = { brokers = "1.1.1.1:9092,2.2.2.2:9092,3.3.3.3:9092"; }; //zookeeper叢集 zookeeper = { brokers = "1.1.1.1:2181,2.2.2.2:2181,3.3.3.3:2181"; }; pool = { //支付地址 payout_address = "my2dxGb5jz43ktwGxg2doUaEb9WhZ9PQ7K"; //coinbase info coinbase_info = "region1/Project BTCPool/"; };
另附StratumJob資料結構定義:
class StratumJob { public: //jobId: timestamp + gbtHash, 目的為保證不重複 uint64_t jobId_; //gbtHash string gbtHash_; //前一個區塊雜湊 uint256 prevHash_; //前一個區塊雜湊(小位元組序) string prevHashBeStr_; //區塊高度 int32_t height_; //coinbase交易 string coinbase1_; string coinbase2_; //merkle樹枝 vector<uint256> merkleBranch_; //區塊版本 int32_t nVersion_; //難度目標 uint32_t nBits_; //時間戳 uint32_t nTime_; //最小有效時間 uint32_t minTime_; //挖礦獎勵 int64_t coinbaseValue_; //見證承諾(如未啟用隔離見證,此處為空) string witnessCommitment_; //nBits轉Target難度目標 uint256 networkTarget_; //域名幣混合挖礦 uint32_t nmcAuxBits_; uint256 nmcAuxBlockHash_; uint256 nmcNetworkTarget_; int32_t nmcHeight_; string nmcRpcAddr_; string nmcRpcUserpass_; //方法定義略 };