開源礦工的備用礦池設計與實現 —— 抽象,閱讀有難度

開源礦工的備用礦池設計與實現

本文基於內核自有的備用礦池功能實現開源礦工的備用礦池,之後可能會脫離具體內核實現備用礦池。git

設計和實現備用礦池的功能時充分體現了爲何開源礦工會有10多萬行代碼。github

備用礦池分兩種:

一種像Claymore經過寫一個Claymore指定的文件實現;

一種像更合理的NBMiner經過正常的命令行參數實現,-o是主礦池-o1是備用礦池;

這兩種的不一樣只是外部系統向內核內部系統傳送信息的方式不一樣,claymore經過文件傳送信息的方式對直接使用claymore原版挺方便但對像開源礦工這樣的第三方程序來講致使引入了除命令行參數外的第二種向內核輸入數據的方式。編程

經過硬編碼功能完備的編程語言是能夠實現特定於Claymore的備用礦池的,但開源礦工想作的通用,想一次性解決全部像Claymore這樣的內核,爲此須要抽象出其中的模式寫出更多的代碼,但若是掌握了規則會發現開源礦工10萬行的代碼如同1萬行,由於全部地方都一致。json

面向類Claymore內核的文件書寫器

爲了寫內核的備用礦池文件,咱們須要一個文件書寫器,好比對應Claymore的內核配置會引用一個文件書寫器,文件書寫器須要知道往哪一個位置寫以及寫什麼內容。編程語言

向什麼位置書寫

文件書寫器向小編給定的位置書寫(小編做爲一個外部系統向開源礦工系統輸入信息的惟一途徑是開源礦工啓動時從阿里雲下載的server.json,這個server.json會在界面上發生用戶活動時檢測到更新時刷新),要寫向的這個位置應是一個相對位置,最終的完整位置應由運行時根據當時的上下文信息計算獲得。函數

書寫什麼內容

書寫小編指定的內容,但小編指定的內容中會有變量,這些變量須要在寫以前根據當前的上下文信息賦值。以Claymore爲例,小編給定的內容會是POOL: {pool1}, WALLET: {wallet1}/{worker1}, PSW: x, ESM: 0, ALLPOOLS: 0這樣的內容,裏面的大括號括住的是變量,這些變量須要運行時在寫文件以前填充上,其中任何一個大括號括住的位置從環境中得不到值則表示不匹配(如同計算機語言的函數調用和函數簽名不匹配),不匹配的書寫器將被忽略。 是否是很熟悉?文件書寫器像什麼?是否是像個函數?向什麼位置書寫和寫什麼內容是它的入參,而書寫的內容中又有大括號括住的如同{pool1}這樣的東西,{pool1}這是函數體中用到的父級做用域中的變量,對於開源礦工來講它依然是一個純函數由於它只從上下文中讀取變量的值而並無寫,對於開源礦工來講這個函數沒有輸出,由於它輸出到外部文件系統中去了。阿里雲

這個設計是能夠支持錢包地址形式和用戶名密碼形式的備用礦池的,只需給內核關聯兩條文件書寫器記錄,一條書寫器中有{wallet1}這樣的變量致使它只會在上下文中有錢包地址時執行,另外一條書寫器中有{userName1}變量致使它只會在上下文中有用戶名時執行。值得指出的是{wallet1}、{userName1}雖然和{wallet}、{userName}不一樣,但{wallet1}的值和{wallet}相同由於{wallet1}直接只是{wallet}的別名,而{userName1}和{userName}極可能不一樣,由於用戶名密碼形式的備用礦池會在界面上擁有對應{userName1}的輸入框。編碼

類NBMiner的備用礦池同理,但不須要文件書寫器。

當咱們說開源礦工是一個完備的系統時咱們指的是它內部具備和外部環境足夠多的映射信息,完備的系統能夠經過調整本身的內部空間排布和行爲方式節能高效的應對環境的變量從而讓生命週期更長。命令行

相關文章
相關標籤/搜索