Proof-of-Work

科學計算工作量證明令牌的可擴展性

  • June 29, 2017

假設我想創建一個合約,用 ERC20 代幣獎勵礦工,以發現以下幾點適用的某個數學問題的解決方案:

  • 問題定義明確,只需稍加努力,就可以編寫一些可靠的程式碼來驗證問題的解決方案
  • 這個問題有很多有效的解決方案
  • 解決方案對對此問題感興趣的數學家很有價值
  • 一些解決方案在數據大小方面比其他解決方案更大
  • 有些解決方案比其他解決方案更有趣,但所有解決方案都應保留用於研究目的

舉一個更具​​體的例子,假設我想使用乙太坊代幣(我稱之為 PrimeToken)重新實現主要代幣。(我對此不感興趣,但它可以作為一個很好的例子):

uint256 public lastNumber = 1;

function proofOfWork(uint256 number){
   if (number <= lastNumber) throw; //Always have to find a new prime number bigger than the last
   if (!isPrime(number)) throw; // Verify solution is valid
   //If it is valid, reward the miner and set the last solution as the submitted one
   lastNumber = number;
   balanceOf[msg.sender] += number - lastNumber;
}

隨著越來越大的素數被發現,uint256 會溢出,我必須將其更改為字節數組以處理非常大的數字,並實現某種方式來處理字節數組,如 bigint。假設我從一開始就這樣做並且有能力這樣做。

我的問題是,這個規模如何?當送出的字節數組變大時會發生什麼?

  • 由於 IsPrime() 函式需要更多的處理能力來驗證更大的數字,送出素數解決方案的礦工是否必須支付越來越多的乙太幣(汽油費)才能獲得他們的 PrimeToken?
  • 送出的數據大小是否有類似的費用?
  • 送出的數據大小是否有限制?
  • 大數據的大數據儲存需求,區塊鏈會變得臃腫嗎?
  • 對素數感興趣的數學家如何找到之前送出的解?他們可以只使用區塊瀏覽器嗎?
  • 有什麼方法可以緩解這些可擴展性問題?

好的,有一大堆問題,但它們都圍繞規模、數據儲存和成本展開。我會看看我是否可以從小處著手並擴大答案。

固定大小的欄位

使用 256 位整數(或可能對),您可以精確地儲存一些相當大的數字。不要嘗試在進行過程中提高精度。達到您將需要的最大價值,因此這是一個固定大小、固定成本。這也適用於介面。以固定大小的塊做所有事情。

大物體

如果預計解決方案實例的複雜性/大小會增加,那麼您不應該將數據儲存在鏈中。為了清楚起見,我說的是一個“解決方案”,它是數據點的集合,隨著時間的推移,這些集合預計會有越來越多的元素。

任何上升的成本肯定會達到一個硬性限制,這將是糟糕的。相反,請考慮將數據序列化並將其放入 IPFS 或 Swarm 中,並在合約中儲存座標和驗證數據雜湊。您可能可以使用兩個 32 字節的儲存插槽來完成此操作。

責任倒置

我意識到上述內容暗示了您的某些結構的倒置,因為進行數學計算和驗證解決方案幾乎肯定會被推送給客戶,而不是在將它們綁定在一起的 Solidity 合約中。在為區塊鏈設計時會發生這種倒置。

該問題的解決方案是添加一個帶有激勵的reportWrongAnswer() 函式。從博弈論和清除垃圾的最終共識的角度思考。客戶應該在對數據採取行動之前確認數據並報告錯誤的“解決方案”。

大桌子

大行數呢?有可能把這搞砸。您需要確保任何規模的固定 gas 成本。基本的 EVM 操作碼是每次操作的統一費率。“突出”成本是 SSTORE (20,000)。這是尺度不變的。您可以插入行並確定表的大小無關緊要。

反模式

您要注意會導致成本上升的無限循環和遞歸過程。在這裡查看一些可以用來獲取靈感的模式。它們可以適用於任何類型的表/行/列排列,當您知道實施的氣體成本時,您可以確定它不會隨著時間的推移而增加。

Solidity 是否有很好解決且簡單的儲存模式?

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/19077