: 区块难度,即尾部多少个零才够成新哈希。
这些都是明显的错误选择,因为它们可以被任何人或者至少是矿工可以预测值。有些 ( 如果我们在合约中增加一个私有的种子呢?可以用一个传递的变量和私有存储的种子作为输入进行计算由此产生随机数。然而,这种方法并没有考虑到不可能在公共网络内存储私有数据。尽管以太坊在智能合约中有私有存储的概念,但任何运行以太坊节点的人仍然可以读取这个存储。读取私有状态或内部状态可以通过 使用区块哈希从技术上讲,它也是一个区块变量,但它有自己的部分。以太坊中的区块哈希计算为 Keccak256,这是 SHA-3 的早期实现。Keccak256 是一个单向函数,通过要求一定数量的尾部零以及矿工地址作为盐,所产生的哈希值无法被任何人预测。好吧,这至少是个方案。 首先,你要正确使用它。也就是使用未来的区块哈希! 如果你用的是当前已有 hash,显然,大家都可以看到。如果你使用当前区块的哈希值,它将是空的,因为当前还没有被挖出来。 如何使用未来区块哈希? mapping (address => uint256) gameWeiValues; mapping (address => uint256) blockHashesToBeUsed; function playGame() public { if (!blockHashesToBeUsed[msg.sender]) { // first run, determine block hash to be used blockHashesToBeUsed[msg.sender] = block.number + 2; // use 2 or more gameWeiValues[msg.sender] = msg.value; return; } uint256 randomNumber = uint256(blockhash(blockHashesToBeUsed[msg.sender])); blockHashesToBeUsed[msg.sender] = 0; gameWeiValues[msg.sender] = 0; if (randomNumber != 0 || randomNumber % 2 == 0) { uint256 winningAmount = gameWeiValues[msg.sender] * 2; msg.sender.transfer(winningAmount); } } (责任编辑:admin) |