在solid中随机洗牌一个映射



我正在尝试随机洗牌一个映射在固体。根据我的理解,这个问题有两部分:

  1. 使用安全方式在智能合约中生成随机数
  2. 变换映射-我对这部分更感兴趣

为了给您一个清晰的场景,我有一个狗的映射,按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


}

输出:

  1. 第一次调用giveFood函数前-狗的映射:| 0。查理| 1;铜| 2。马克斯|
  2. 第一次调用giveFood函数后-狗的映射:| 0。铜| 1;Max | 2。查理|
  3. 第二次调用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;
}
}

相关内容

  • 没有找到相关文章

最新更新