Solidity
在智能合約中隱藏部分結果
我有以下案例。有一個基於智能合約的遊戲,每個人都可以為一種顏色獎勵 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)
並推斷出部分結果。以最少的程式碼更改來解決這個問題的最佳方法是什麼?
我想到了什麼:
- 每次有人打電話
function awardPoint(colorID)
時,colorID 都會隨機打亂。但是,它們已經與映射相關聯,所以我真的沒有看到在 Solidity 中實現這一點的等待。此外,它並不能真正解決有人洩露 colorsMapping 私有變數數據的問題。- 每次有人呼叫獎勵點函式時,將隨機數添加到獎勵點計數中,類似於權重。但是,我很難考慮以後如何減去它們,如何以及在哪裡儲存 tem 等。
- 同態加密:我對這個概念不是很熟悉,但我知道您可以對加密數據執行操作(在這種情況下為增量),並且您可以在最後解密結果。但是,我不知道如何在 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++; }
這是基本的想法。顯然,這引入了其他問題:檢查待處理的交易池,在透露他們是否知道自己會輸之前退出遊戲。
為完全去中心化的遊戲設計協議是一項相當大的挑戰。