以太坊asic礦機(ProgPoW算法被曝漏洞,以太坊ASIC挖礦已不可阻擋?)
免責聲明:本文旨在傳遞更多市場信息,不構成任何投資建議。文章僅代表作者觀點,不代表火星財經官方立場。
小編:記得關注哦
來源:巴比特
對于近期備受爭議的ProgPoW算法,獨立開發者kikx在今日披露了該算法存在的一個漏洞,這使其無法真正實現抗ASIC的目標,kikx還補充表示,這一漏洞是新發現的,并且不會對以太坊當前使用的Ethash算法造成威脅。
對此,以太坊研發人員Philippe Castonguay評論稱:
“看起來ProgPoW的當前實現,可能并沒有那么抗ASIC,基本上,ProgPoW哈希函數使用了一個64位種子,ASIC可以“輕松”地強制執行,而不是像預期的那樣進行挖礦。這需要更多的關注來正式確認。”此后,以太坊硬分叉協調員James Hancock對這一漏洞的存在進行了確認,隨后表示了感謝。
那這一漏洞到底是腫么一回事呢?
我們來看看kikx披露的細節吧:
ProgPoW的設計漏洞
ProgPow存在一個設計缺陷:
64位seed
太小了,這允許ASIC無需存儲訪問即可計算哈希。初步實現
感謝chfast提供了可讀的實現!
ProgPoW 哈希函數被定義為:
result hash(const epoch_context& context, int block_number, const hash256& header_hash,uint64_t nonce) noexcept{const uint64_t seed = keccak_progpow_64(header_hash, nonce);const hash256 mix_hash = hash_mix(context, block_number, seed, calculate_dataset_item_2048);const hash256 final_hash = keccak_progpow_256(header_hash, seed, mix_hash);return {final_hash, mix_hash};}
ASIC友好計算
假設給出了一個區塊頭block_header
以及一個區塊數block_number
。
然后,執行以下3個步驟:
將seed
固定為任何64位值,然后計算mix_hash = hash_mix(block_number, seed)
;
搜索extra_nonce
,以便header_hash
滿足難度條件;
搜索nonce
,以便keccak_progpow_64(header_hash, nonce) == seed
;
第一步,為固定seed
和block_number
計算mix_hash
。由于mix_hash
被設計為seed
和block_number
的函數,所以我們得到一個有效的三元組(seed,mix_hash,block_number)
。現在,我們的目標是找到滿足以下兩個條件的header_hash
和nonce
:
(A) keccak_progpow_64(header_hash, nonce) == seed
;
(B) keccak_progpow_256(header_hash, seed, mix_hash) ;
記住,我們可以通過修改額外的隨機數(在以太坊中使用ExtraData)來生成任意數量的header哈希。因此,條件(B)很容易在步驟2中完成。現在,我們有一個固定的(header_hash, seed, mix_hash, block_number)
,但nonce
是自由的。 最后,步驟3掃描nonce
以查找條件(A)。由于seed
只有64位長度,所以條件(A)僅提供64位安全性,并且可以由ASIC執行步驟3。
計算成本
有四個函數,keccak_1600
,keccak_progpow_64
,hash_mix
以及keccak_progpow_256
。成本的計算,可通過計算所需函數的調用來實現,這取決于網絡難度D
。
在正常的哈希計算中,需要一個keccak_1600
調用,才能從block_header
計算出header_hash
,并針對每個nonce
值依次調用其他函數。
而在ASIC哈希計算中,在步驟1中需要一個hash_mix
調用,在步驟2中則要調用keccak_1600
和keccak_progpow_256
,在步驟3中將調用keccak_progpow_64
。
由于hash_mix
在我們的ASIC計算中僅被調用一次,因此我們可以使用主機CPU來計算hash_mix
。而其它函數都是keccak哈希函數,不需要memory存儲,并且可以在ASIC上輕松計算。
我們需要比較keccak_progpow_64
row中的D
和2^64
。簡單地說,更大的D
會使ASIC更有利可圖。估計閾值門檻是困難的,但我認為目前的難度 (> 2^50)是足夠大的。
Demo
演示位于此存儲庫中。
$ git clone https://github.com/kik/progpow-exploit.git$ cd progpow-exploit$ mkdir build$ cd build$ cmake ..$ make$ ./test/ethash-test --gtest_filter=asic.search
在此演示中,seed被截斷為24位寬度,以便在CPU上運行。參見代碼。
測試代碼是簡單的。
這里定義了search_asic
由于這一漏洞的存在,以太坊礦機商們是不是可以松一口氣了?