btcpool礦池原始碼分析(5)-JobMaker模組解析

尹成發表於2018-05-20
# 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。

```shell
jobmaker -c jobmaker.cfg -l log_dir
#-c指定jobmaker配置檔案
#-l指定日誌目錄
```

## jobmaker.cfg配置檔案

```shell
//是否使用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/";
};
```

## JobMaker流程圖



## 基於Gbt構造StratumJob流程圖



另附StratumJob資料結構定義:

```c++
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_;
//方法定義略
};
```

## 參考文件

* [基於ZooKeeper的分散式鎖和佇列](https://www.cnblogs.com/luxiaoxun/p/4889764.html)
* [ZooKeeper程式設計筆記](https://www.cnblogs.com/caosiyang/archive/2012/11/09/2763190.html)
* [ C++11多執行緒之std::lock_guard](http://blog.csdn.net/nirendao/article/details/50890486)
* [區塊鏈核心技術演進之路——挖礦演進](https://zhuanlan.zhihu.com/p/23558268)
* [比特幣開發者指南](http://usyiyi.cn/translate/bitcoin/developer-guide.html)
* [比特幣指令碼及交易分析 - 智慧合約雛形](https://xiaozhuanlan.com/topic/3207619845)






網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN





網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章