我正在尝试随机洗牌一个映射在固体。根据我的理解,这个问题有两部分:
- 使用安全方式在智能合约中生成随机数
- 变换映射-我对这部分更感兴趣
为了给您一个清晰的场景,我有一个狗的映射,按id从0开始组织。我有一个函数叫feedDog
,它是用dogID来命名的。在一个人通过调用feedDog
函数喂狗之后,我想以某种方式洗牌狗的id,所以没有人知道谁喂了哪只狗。
struct Dog{
string dogName;
uint256 foodReceived;
uint256 dogID;
}
mapping(uint256 => Dog) private mappingOfDogs;
function giveFood(uint256 dogID) public {
mappingOfDogs[dogID].foodReceived++;
// random shuffling the mappingOfDogs occurs here, most likely
}
输出:
- 第一次调用
giveFood
函数前-狗的映射:| 0。查理| 1;铜| 2。马克斯| - 第一次调用
giveFood
函数后-狗的映射:| 0。铜| 1;Max | 2。查理| - 第二次调用
giveFood
函数后-狗的映射:| 0。查理| 1;Max | 2。铜|
我知道映射不像数组,但是如果我们在一个单独的数组中保留id呢?有什么办法能做到这一点吗?
所以没人知道谁喂了哪只狗;这是不可能的,总有一种方法可以知道哪笔交易改变了你合约上的哪个值,正因为如此,人们可以看到是谁提交了交易。由于以太坊是一个公共区块链,因此很难"隐藏"它。的东西。
除此之外,您还可以为此创建一个简单的shuffle函数。function shuffle() internal {
for (uint256 i = 0; i < dogs.length; i++) {
uint256 n = uint256(keccak256(abi.encodePacked(randomNo))) % (numberArr.length - i) + i;
String memory temp = dogs[n];
dogs[n] = dogs[i];
dogs[i] = temp;
}
}