Proof-of-Work

是否有工作量證明系統需要比驗證更多的記憶體來生成?

  • February 8, 2016

萊特幣通過使用基於 scrypt 的散列函式來抵抗 GPU 加速,該函式需要一些記憶體來生成和驗證。這樣做的問題是該r參數需要設置得足夠高以至於難以使用 GPU,但又足夠低以使低記憶體客戶端(即智能手機)仍然可以有效地驗證塊。

是否存在一種工作量證明,它需要更多的記憶體來為一個塊生成工作量證明,而不是驗證一個塊是否包含足夠的工作量證明?

我聽說過兩種可能的方法:使用 scrypt 的時間記憶體權衡和需要大量記憶體來找到解決方案的圖論雜湊算法。

我認為使用大型數據集的隨機抽樣的探勘過程將滿足您提出的要求。區塊鏈甚至為此提供了一個很好的數據集。例如,假設每個 nonce 要求您隨機抽樣區塊鏈以挑選出幾個字節。由於您在探勘時使用了許多隨機數,並且無法預測您需要從區塊鏈中獲得哪些數據,因此您基本上需要在探勘時讓整個區塊鏈(實際上是任何公開同意的數據集)可用。然後可以使用該數據集的小樣本以及數據在該集中的一些證據來驗證該解決方案。在使用區塊鏈範例時,您可能需要一個區塊頭鍊和一個用於所選交易數據的 merkle 分支。

另一種方法是使用大型隨機默克爾樹。假設有人創建了一個 2^31 隨機 32 字節值的默克爾樹。當考慮到 merkle 分支也必須被儲存時,這是(1 + 2 + 2^2 + 2^3 + ... + 2^31) * 32 bytes,或者(2^32-1)*32 ~= 137.4 GB是全部數據。任何真正想要下載它並驗證 merkle 根的人都可以公開獲取這些數據。merkle 根將被稱為採礦 merkle 根,它是一個眾所周知的常量。探勘涉及對這個隨機 merkle 樹進行採樣和散列,並通過找到一個成功的解決方案,提供 merkle 樹分支,證明被採樣的數據實際上是在公開同意的 merkle 樹中。

在這個方案中,探勘需要大約 137.4 GB 的記憶體,但只需要大約 1 kB 的數據來驗證針對公開同意的探勘 merkle 根的解決方案。

這些數字顯然可以在這裡進行調整,以允許人們在不放棄 137.4 GB 硬碟驅動器的情況下進行探勘。必須達到平衡。

實際上我更喜歡這種方式,現在我想起來了,因為它沒有副作用,即隨著區塊鏈的增長,挖礦可能需要更長的時間。你甚至可以對比特幣區塊鏈進行快照,並將其用作可公開驗證的數據集。但是區塊鏈方法本質上也是強制節點成為全節點,這很有趣,所以它是一個權衡。


編輯:通過快速搜尋,我找到了這篇論文,它使用涉及生日悖論的不同隨機抽樣方法解決了基本相同的問題。他們的解決方案很有趣,因為它每次都涉及建構您自己的大型數據集。但這實際上可能不是一件好事,因為它不鼓勵在新交易進入時重新建構區塊。

<http://www.hashcash.org/papers/momentum.pdf>

關於動量算法的相關bitcointalk討論:

<https://bitcointalk.org/index.php?topic=313479.0>

我認為有趣的是“動量”方面(在首次創建後無法更新 merkle)被吹捧為算法的定義特徵,即使它實際上是一個非常重要的缺點,將所有交易的確認延遲 1 個塊. 這也可能加劇礦工不想探勘大塊的問題,因為它們需要很長時間才能傳播。即,即使在您聽說網路上有一個新區塊之後,繼續使用您的小區塊進行探勘可能會更有利可圖,因為您已經擁有的動力使它變得更容易。我認為比特幣的 PoW 算法沒有任何動力這一事實實際上是一個很棒的功能,可以讓交易快速得到確認。

使用不變的數據集,就像我上面提供的解決方案一樣,在工作/驗證工作中提供了所需的非對稱記憶體需求,同時也避免了動量問題。

Dagger旨在需要大量記憶體來創建,但很少需要驗證。

引用自:https://bitcoin.stackexchange.com/questions/36622