在智能合约中隐藏部分结果

Hiding partial results in a smart contract

我有以下用例。有一个基于智能合约的游戏,每个人都可以为一种颜色奖励 1 分。游戏结束时,智能合约显示哪种颜色最多 popular/has 获得最多分数。采取以下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. 对每次调用awardpoint函数的awardpoints进行随机数统计,类似于权重。但是,我很难考虑以后如何减去它们,如何以及将它们存储在何处等。
  3. 同态加密:我对这个概念不是很熟悉,但我知道你可以对加密数据进行操作(在本例中为增量)并且你可以解密结果在最后。但是,我不知道如何在 Solidity 中(或根本)实现它。

哪种方法最好?

我的建议是让大家提交[colorid, secret]的hash。当每个人都提交答案后,每个人都会公开他们选择的颜色和秘密。

function submitHash(bytes hash) public {
    hashes[msg.sender] = hash;
}

function submitAnswer(uint256 colorid, uint256 secret) public {
    require(votesIn, "votes are not all in");
    require(keccak256(abi.encodePacked(colorId, secret)) == hashes[msg.sender], "invalid response");
    votes[colorId] += 1;
}