在这个论坛上阅读了很多关于这个主题的信息之后,我想问我是否可以使用公式winningNumber =uint256(块散(块号-1)% 100;例如,投注期结束后的10或20个街区)。在投注期间,任何人都不可能知道“未来”的封号,对吧?例如,稳健地实施可能与此类似?要求(block.number >(BettingEndBlock+20));
发布于 2020-02-19 15:06:14
重要的是要把承诺和揭示分开,这样就没有人能从“这个”块中“猜出”“解决方案”。
我认为,使用block.number + 1就足够了,所以在未来的100个街区内不会增加很大的困难。矿工们总是有机会在一定程度上制造区块,但我认为可以忽略不计。
function claimPrize(bytes32 solution) public {
bytes32 check = keccak256(abi.encodePacked(block.hash));
require(solution == check, "Incorrect");
// award prize
}问题是,在当前块的上下文中计算“解决方案”,然后收集奖金是非常简单的。
function commit(bytes32 committment) public {
commitments[msg.sender] = commitment; // over-simplified
}
function claimPrize() public {
require(block.number >= deadline, "lottery still open");
bytes32 solution = // ... block hash at deadline
require(committments[msg.sender] == solution, "You didn't win");
// award prize
}如果不清楚,未来的块哈希是不可知的。重要的是要确保竞赛是基于未来的块哈希,而不是现在(或过去)。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/79966
复制相似问题