兄弟連區塊鏈教程btcpool礦池源碼分析核心機制總結及最佳化思考

來源:互聯網
上載者:User

標籤:event   時間   key   存在   開放   mit   brep   2gb   get   

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已被擠出
    ????
    DUPLICATESHARE,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對
  • 監聽STRATUMJOB目的為擷取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
  • 接收SHARELOG,寫入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
  • 監聽並接收SHARELOG,按Worker、user、pool統計acceptCount、acceptShareSec、rejectShareMin
    ???? 同時統計totalWorkerCount和totalUserCount
    ????
    延時超過1小時的SHARE_LOG將被忽略
  • 每15s寫入資料庫(可由flush_dbinterval指定),每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不同

兄弟連區塊鏈教程btcpool礦池源碼分析核心機制總結及最佳化思考

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.