Solidity

在智能合約中隱藏部分結果

  • April 23, 2022

我有以下案例。有一個基於智能合約的遊戲,每個人都可以為一種顏色獎勵 1 分。在遊戲結束時,智能合約會顯示哪種顏色最受歡迎/獲得的分數最多。採用以下 Solidity 程式碼:

struct Color{
       string colorName;
       uint256 awardedPoints; 
       uint256 colorID;
   }

mapping(uint256 => Color) private colorsMapping;

function awardPoint(uint256 colorID) public {
       colorsMapping[colorID].awardedPoints++;    
   }

當然,映射標有“私人”關鍵字,但這並不能真正阻止有決心的人透露內容。此外,每個人都可以計算呼叫次數 function awardPoint(colorID)並推斷出部分結果。

以最少的程式碼更改來解決這個問題的最佳方法是什麼?

我想到了什麼:

  1. 每次有人打電話function awardPoint(colorID)時,colorID 都會隨機打亂。但是,它們已經與映射相關聯,所以我真的沒有看到在 Solidity 中實現這一點的等待。此外,它並不能真正解決有人洩露 colorsMapping 私有變數數據的問題。
  2. 每次有人呼叫獎勵點函式時,將隨機數添加到獎勵點計數中,類似於權重。但是,我很難考慮以後如何減去它們,如何以及在哪裡儲存 tem 等。
  3. 同態加密:我對這個概念不是很熟悉,但我知道您可以對加密數據執行操作(在這種情況下為增量),並且您可以在最後解密結果。但是,我不知道如何在 Solidity 中實現這一點(或根本不知道)。

什麼方法是最好的?

解決這個問題的一種方法是送出和顯示策略。

在送出階段,每個人都會向合約發送一個從顏色和鹽值中獲得的雜湊值。

function commitColor(bytes32 hash) public {
   commits[msg.sender] = hash;
}

在顯露階段,顏色和鹽分顯露出來

function reveal(unit256 color, bytes32 salt) public {
   bytes32 hash = keccak256(abi.encode(color, salt));
   require(commits[msg.sender] == hash, "Invalid hash");

   colorsMapping[colorID].awardedPoints++;  
}

這是基本的想法。顯然,這引入了其他問題:檢查待處理的交易池,在透露他們是否知道自己會輸之前退出遊戲。

為完全去中心化的遊戲設計協議是一項相當大的挑戰。

您可以搜尋的另一個主題是零知識證明。有一些工具可能會有所幫助,例如ZoKratesCircom

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