以太幣的挖礦機制全解析
隨著以太坊正式運行的臨近,詢問以太如何挖礦的朋友也越來越多。這篇文章綜合了我們目前所知道的信息,希望能對大家有一些幫助。由于挖礦算法的設計和改進仍在進行中,以下信息僅供參考。
設計目標
抵抗礦機(ASIC Resistance)。使用專門優化的芯片產生的挖礦優勢應該盡可能的小,小到即使使用普通CPU挖礦也能產生收益。
輕客戶端可驗證。輕客戶端應該有能力驗證每一個塊的真實性。目標是在普通桌面電腦上運行用C實現的驗證算法,驗證時間小于0.01秒,用Python或者Javascript小于0.1秒,使用內存不超過1MB。
挖礦算法
以太幣(ether)的挖礦算法叫做Ethash, 又名Dashimoto (Dagger-Hashimoto),是Hashimoto算法結合Dagger之后產成的一個變種。它的特點是挖礦的效率基本與CPU無關,卻和內存大小和內存帶寬正相關。對內存大小和帶寬的要求意味著那些通過共享內存的方式大規模部署的礦機芯片并不能在挖礦效率上有線性或者超線性(super-linear)的增長。
接下來讓我們看看Dashimoto的基本流程:
對于每一個塊(block),先計算出一個種子(seed)。種子的計算只依賴于當前塊的信息,例如block number以及block headers。
使用種子產生32MB的偽隨機數據集,稱為cache。輕客戶端需要保存cache。
基于cache再生成一個1GB大小的數據集,稱為the DAG。這個數據集中的每一個元素都只依賴cache中的某幾個元素,換句話說,只要有cache就可以快速計算出DAG中指定位置的元素。完整的可挖礦的客戶端需要保存DAG。
挖礦可以概括為從DAG中隨機選擇元素然后對其進行hash的過程。驗證的過程也是一樣,只不過不是從DAG里面選擇元素,而是基于cache計算得到指定位置的元素,然后驗證這個元素集合的hash結果小于某個值。由于cache很小, 而且指定位置的DAG元素很容易計算,因此驗證過程只需要普通CPU和普通內存即可完成。
cache和DAG每一個周期更新一次,一個周期的長度是1000個塊。也就是說這1000個塊產生的cache和DAG是完全一樣的,因此挖礦的主要工作在于從DAG中讀取數據,而不是更新cache和DAG。DAG的大小隨時間的推移線性增長,從1GB開始,每年增加大約7GB – 因此到2015年12月大約是8GB, 到2016年12月大約15GB。
注:以上步驟中的數字已經隨著開發的推進有了調整,準確值請參考源代碼。
挖礦軟件
我們預計在上線之時將有至少兩種挖礦方式:
使用Mist客戶端(官方客戶端實現,基于Go語言)進行CPU挖礦。
通過以太坊守護進程(eth daemon)和sgminer的組合進行GPU挖礦。守護進程和sgminer之前的數據通訊可以通過JSON-RPC API完成。目前有兩個API和挖礦有關:eth_getWork以及eth_submitWork。