btcpool礦池原始碼分析(2)-核心機制總結及優化思考
# btcpool礦池-核心機制總結及優化思考
## 核心機制總結
### ①gbtmaker
* 監聽Bitcoind ZMQ中BITCOIND_ZMQ_HASHBLOCK訊息,一有新塊產生,將立即向kafka傳送新Gbt
* 另預設每5秒間隔(可從配置檔案中指定)主動RPC請求Bitcoind,獲取Gbt傳送給kafka
* Gbt訊息大小約2M,含交易列表
### ②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秒(可從配置檔案中指定)
### ③sserver
* 接收的job延遲超過60秒將丟棄
* 如果job中prevHash與本地job中prevHash不同,即為已產生新塊,job中isClean狀態將置為true
* true即要求礦機立即切換job
* 三種情況下將向礦機下發新job:
* 收到新高度的job
* 過去一個job為新高度且為空塊job,且最新job為非空塊job
* 達到預定的時間間隔30秒
* 最近一次下發job的時間將寫入檔案(由file_last_notify_time指定)
* 本地job有效期為300秒
* 每10秒拉取一次新使用者列表(由list_id_api_url指定),使用者寫入本地map中
* sserver最大可用SessionId數為16777214
* btcpool支援BtcAgent擴充套件協議和Stratum協議,使用magic_number(0x7F)區分
* 處理Stratum協議:
* suggest_target與suggest_difficulty等價,用於設定初始挖礦難度,需在subscribe之前請求
* 使用sessionID作為extraNonce1_以確保礦機任務不重複
* authorize之前有15秒讀超時,authorize之後有10分鐘讀超時,10分鐘無提交將斷開連線
* 初始難度為16384,或從suggest_difficulty指定,下次將一次調整到位保持10s提交share
* 每個session會維護一個localJobs_佇列,佇列長度為10條
* share被拒絕的幾種情況:
* JOB_NOT_FOUND,localJobs_佇列中該job已被擠出
* DUPLICATE_SHARE,share已提交過,已提交的share會計入submitShares_
* JOB_NOT_FOUND,jobRepository_中job不存在,即job已過期(300秒過期時間)
* JOB_NOT_FOUND,jobRepository_中job狀態為Stale,即job是舊的非新job
* TIME_TOO_OLD,share中提交的nTime小於job規定的minTime
* TIME_TOO_OLD,share中提交的nTime比當前時間大10分鐘
* LOW_DIFFICULTY,share中提交的hash不滿足難度目標
* 處理BtcAgent擴充套件協議:
* Agent下礦機預設難度也為16384
* 使用Agent sessionID作為extraNonce2_前半部分,以確保Agent下礦機任務不重複
* 礦池下發新任務時,如session為BtcAgent,將為Agent下所有礦機計算難度
* 如難度發生變更,將按難度不同,分別構造多條CMD_MINING_SET_DIFF指令一併下發處理
### ④blkmaker
* blkmaker可以連多個bitcoind節點
* blkmaker監聽和接收4類訊息:RAWGBT、STRATUM_JOB、SOLVED_SHARE和NMC_SOLVED_SHARE
* 監聽RAWGBT目的為獲取gbtHash/交易列表,用於構建Block,gbtHash和vtxs寫入rawGbtMap_
* rawGbtMap_儲存最近100條gbtHash/vtxs對
* 監聽STRATUM_JOB目的為獲取jobId_/gbtHash,jobId_和gbtHash寫入jobId2GbtHash_
* jobId2GbtHash_儲存最近120條jobId_/gbtHash對
* 監聽SOLVED_SHARE目的為獲取BlockHeader和coinbaseTx
* BlockHeader+coinbaseTx+vtxs構造Block
* 構造好的Block會提交連線的所有bitcoind節點
* 構造好的Block入庫,入庫欄位包括:
* puid、worker_id、worker_full_name、job_id、height、hash
* rewards(即coinbaseValue)、size(即blksize)、prev_hash、bits、version、created_at
* created_at為入庫時間非爆塊時間
### ⑤sharelogger
* 接收SHARE_LOG,寫入shares_,每2秒寫入檔案(路徑由data_dir指定)
* 每天一個新檔案,檔名形如:sharelog-2016-07-12.bin
* 最多維護最近3天的檔案控制程式碼
### ⑥slparser
* 支援三種功能:
* 指定Date和UID,將列印指定日期指定使用者的share資訊到stdout
* UID=0時,將列印指定日期所有使用者的share資訊
* 指定Date但未指定UID,讀取指定日期sharelog,統計資料並寫入資料庫
* 按Worker、user、pool三個維度統計:Accept1h、Accept1d、score1h、score1d、Reject1h、Reject1d
* 資料庫僅保留最近3個月統計資料
* 如果Date和UID均未指定,將監聽檔案變化,讀取share並統計資料,每15秒寫入資料庫
* 同時啟動Httpd服務,開放ServerStatus和WorkerStatus
### ⑦statshttpd
* 監聽並接收SHARE_LOG,按Worker、user、pool統計acceptCount_、acceptShareSec_、rejectShareMin_
* 同時統計totalWorkerCount_和totalUserCount_
* 延時超過1小時的SHARE_LOG將被忽略
* 每15s寫入資料庫(可由flush_db_interval指定),每30分鐘清理過期Worker
* 如果Worker超過1小時未提交share,將被置為過期狀態
* 計算每個Worker的accept1m_、accept5m_、accept15m_、reject15m_、accept1h_、reject1h_
* 以及acceptCount_、lastShareIP_、lastShareTime_
* DROP並CREATE資料表mining_workers_tmp,Worker統計資料批量寫入mining_workers_tmp
* mining_workers_tmp資料寫入資料表mining_workers
* 監聽並接收COMMON_EVENTS,獲取workerName和minerAgent,更新資料表mining_workers
* 啟動Httpd服務,開放ServerStatus和WorkerStatus
### ⑧poolwatcher
* 監聽StratumJob,更新poolStratumJob_,用於和第三方礦池比對
* 作為client連線第三方礦池,如收到挖礦任務,僅當接收的job高度=本地礦池job高度+1時,將構造EmptyGBT
* 如下幾種情況將丟棄從第三方礦池接收的job:
* job高度與本地礦池job高度相同
* job高度不等於本地礦池job高度+1,高度跳躍太大
* nBits與本地礦池job nBits不同
## 優化思考
待補充
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- btcpool礦池原始碼分析(8)-slparserTCP原始碼
- btcpool礦池原始碼分析(1)環境搭建TCP原始碼
- btcpool礦池原始碼分析(3)-BlockMaker模組解析TCP原始碼BloC
- btcpool礦池原始碼分析(4)-GbtMaker模組解析TCP原始碼
- btcpool礦池原始碼分析(5)-JobMaker模組解析TCP原始碼
- btcpool礦池原始碼分析(6)-nmcauxmaker模組解析TCP原始碼UX
- btcpool礦池原始碼分析(6)-PoolWatcher模組解析TCP原始碼
- btcpool礦池原始碼分析(7)-sharelogger模組解析TCP原始碼
- btcpool礦池原始碼分析(9)-statshttpd模組解析TCP原始碼httpd
- btcpool礦池原始碼分析(10)-StratumServer模組解析TCP原始碼Server
- JVMTI Attach機制與核心原始碼分析JVM原始碼
- open-ethereum-pool以太坊礦池原始碼分析(2)API分析原始碼API
- mysql鎖機制總結,以及優化建議MySql優化
- Java SPI機制總結系列之萬字最詳細圖解Java SPI機制原始碼分析Java圖解原始碼
- 談談JUC----------CAS機制及AtomicInteger原始碼分析原始碼
- Dubbo 原始碼分析 - SPI 機制原始碼
- React原始碼分析 – 事件機制React原始碼事件
- 搞懂ZooKeeper的Watcher之原始碼分析及特性總結原始碼
- open-ethereum-pool以太坊礦池原始碼分析(1)-main入口分析原始碼AI
- JVMTI Agent 工作原理及核心原始碼分析JVM原始碼
- 使用tensorflow2識別4位驗證碼及思考總結
- Android Sensor原始碼分析總結Android原始碼
- Android原始碼分析–ArrayMap優化Android原始碼優化
- MongoDB原始碼分析之連結池(ConnPool)GWMongoDB原始碼
- Android 原始碼分析(二)handler 機制Android原始碼
- HashMap擴容機制原始碼分析HashMap原始碼
- 從原始碼分析Hystrix工作機制原始碼
- 【freertos】011-訊號量、互斥量及優先順序繼承機制原始碼分析繼承原始碼
- 觸控事件分發核心機制優化吸收事件優化
- 以太坊原始碼分析(42)miner挖礦部分原始碼分析CPU挖礦原始碼
- OkHttp 原始碼分析(二)—— 快取機制HTTP原始碼快取
- RecyclerView 原始碼分析(二) —— 快取機制View原始碼快取
- open-ethereum-pool以太坊礦池原始碼分析(3)payouts模組原始碼
- open-ethereum-pool以太坊礦池原始碼分析(4)-policy模組原始碼
- open-ethereum-pool以太坊礦池原始碼分析(5)proxy模組原始碼
- open-ethereum-pool以太坊礦池原始碼分析(6)-redis模組原始碼Redis
- open-ethereum-pool以太坊礦池原始碼分析(7)unlocker模組原始碼
- MySQL 索引及查詢優化總結MySql索引優化