在智能合约中隐藏部分结果
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)
的调用次数,推导出部分结果
用最少的代码更改解决此问题的最佳方法是什么?
我想到的:
- 每次有人调用
function awardPoint(colorID)
时,colorID 都会随机排列。然而,它们已经与映射相关联,所以我真的看不到在 Solidity 中实现这一点的等待。而且,也不能真正解决有人泄露colorsMapping私有变量数据的问题。
- 对每次调用awardpoint函数的awardpoints进行随机数统计,类似于权重。但是,我很难考虑以后如何减去它们,如何以及将它们存储在何处等。
- 同态加密:我对这个概念不是很熟悉,但我知道你可以对加密数据进行操作(在本例中为增量)并且你可以解密结果在最后。但是,我不知道如何在 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;
}
我有以下用例。有一个基于智能合约的游戏,每个人都可以为一种颜色奖励 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)
的调用次数,推导出部分结果
用最少的代码更改解决此问题的最佳方法是什么?
我想到的:
- 每次有人调用
function awardPoint(colorID)
时,colorID 都会随机排列。然而,它们已经与映射相关联,所以我真的看不到在 Solidity 中实现这一点的等待。而且,也不能真正解决有人泄露colorsMapping私有变量数据的问题。 - 对每次调用awardpoint函数的awardpoints进行随机数统计,类似于权重。但是,我很难考虑以后如何减去它们,如何以及将它们存储在何处等。
- 同态加密:我对这个概念不是很熟悉,但我知道你可以对加密数据进行操作(在本例中为增量)并且你可以解密结果在最后。但是,我不知道如何在 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;
}