btcpool礦池原始碼分析(5)-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。
```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
相關文章
- btcpool礦池原始碼分析(3)-BlockMaker模組解析TCP原始碼BloC
- btcpool礦池原始碼分析(4)-GbtMaker模組解析TCP原始碼
- btcpool礦池原始碼分析(6)-nmcauxmaker模組解析TCP原始碼UX
- btcpool礦池原始碼分析(6)-PoolWatcher模組解析TCP原始碼
- btcpool礦池原始碼分析(7)-sharelogger模組解析TCP原始碼
- btcpool礦池原始碼分析(9)-statshttpd模組解析TCP原始碼httpd
- btcpool礦池原始碼分析(10)-StratumServer模組解析TCP原始碼Server
- btcpool礦池原始碼分析(8)-slparserTCP原始碼
- btcpool礦池原始碼分析(1)環境搭建TCP原始碼
- open-ethereum-pool以太坊礦池原始碼分析(5)proxy模組原始碼
- btcpool礦池原始碼分析(2)-核心機制總結及優化思考TCP原始碼優化
- open-ethereum-pool以太坊礦池原始碼分析(3)payouts模組原始碼
- open-ethereum-pool以太坊礦池原始碼分析(4)-policy模組原始碼
- open-ethereum-pool以太坊礦池原始碼分析(6)-redis模組原始碼Redis
- open-ethereum-pool以太坊礦池原始碼分析(7)unlocker模組原始碼
- Django(49)drf解析模組原始碼分析Django原始碼
- (一) Mybatis原始碼分析-解析器模組MyBatis原始碼
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- go-ethereum原始碼解析-miner挖礦部分原始碼分析CPU挖礦Go原始碼
- webpack核心模組tapable原始碼解析Web原始碼
- open-ethereum-pool以太坊礦池原始碼分析(2)API分析原始碼API
- python2 traceback模組原始碼解析Python原始碼
- QT Widgets模組原始碼解析與技巧QT原始碼
- SOFARegistry 原始碼|資料同步模組解析原始碼
- mybaits原始碼分析--binding模組(五)AI原始碼
- open-ethereum-pool以太坊礦池原始碼分析(1)-main入口分析原始碼AI
- QT Widgets模組原始碼解析與實踐QT原始碼
- 從原始碼分析Node的Cluster模組原始碼
- Swoole 原始碼分析——Reactor 模組之 ReactorEpoll原始碼React
- Swoole 原始碼分析——Client模組之Send原始碼client
- Swoole 原始碼分析——Client模組之Connect原始碼client
- Swoole 原始碼分析——Client模組之Recv原始碼client
- JavaScript 模組化及 SeaJs 原始碼分析JavaScriptJS原始碼
- mybaits原始碼分析--快取模組(六)AI原始碼快取
- mybaits原始碼分析--日誌模組(四)AI原始碼
- Django(51)drf渲染模組原始碼分析Django原始碼
- [原始碼解析] 深度學習流水線並行 PipeDream(5)--- 通訊模組原始碼深度學習並行
- 以太坊原始碼分析(42)miner挖礦部分原始碼分析CPU挖礦原始碼