免責聲明:本文旨在傳遞更多市場信息,不構成任何投資建議。文章僅代表作者觀點,不代表火星財經官方立場。
小編:記得關注哦
來源:巴比特
對於近期備受爭議的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
由於這一漏洞的存在,以太坊礦機商們是不是可以鬆一口氣了?