ProgPoW算法被曝漏洞,以太坊ASIC挖礦已不可阻擋?

火星財經 發佈 2020-03-05T03:00:09+00:00

ProgPoW哈希函數被定義為:result hash(const epoch_context& context, int block_number, const hash256& header_hash,

免責聲明:本文旨在傳遞更多市場信息,不構成任何投資建議。文章僅代表作者觀點,不代表火星財經官方立場。

小編:記得關注哦

來源:巴比特

對於近期備受爭議的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個步驟:

  1. seed固定為任何64位值,然後計算mix_hash = hash_mix(block_number, seed)
  2. 搜索extra_nonce,以便header_hash滿足難度條件;
  3. 搜索nonce,以便keccak_progpow_64(header_hash, nonce) == seed

第一步,為固定seedblock_number計算mix_hash。由於mix_hash被設計為seedblock_number的函數,所以我們得到一個有效的三元組(seed,mix_hash,block_number)。現在,我們的目標是找到滿足以下兩個條件的header_hashnonce

  1. (A) keccak_progpow_64(header_hash, nonce) == seed
  2. (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_1600keccak_progpow_64hash_mix以及keccak_progpow_256。成本的計算,可通過計算所需函數的調用來實現,這取決於網絡難度D

在正常的哈希計算中,需要一個keccak_1600調用,才能從block_header計算出header_hash,並針對每個nonce值依次調用其他函數。

而在ASIC哈希計算中,在步驟1中需要一個hash_mix調用,在步驟2中則要調用keccak_1600keccak_progpow_256,在步驟3中將調用keccak_progpow_64

由於hash_mix在我們的ASIC計算中僅被調用一次,因此我們可以使用主機CPU來計算hash_mix。而其它函數都是keccak哈希函數,不需要memory存儲,並且可以在ASIC上輕鬆計算。

我們需要比較keccak_progpow_64row中的D2^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

由於這一漏洞的存在,以太坊礦機商們是不是可以鬆一口氣了?

關鍵字: