织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

技术解析如何为 Solidity 智能合约生成随机数(2)

时间:2021-02-23 10:47来源:未知 作者:admin 点击:
: 区块难度,即尾部多少个零才够成新哈希。 block.gaslimit :区块的 gas 限制,即每笔交易允许的最大 gas。 block.coinbase : 出块矿工的地址。 这些都是明显的
: 区块难度,即尾部多少个零才够成新哈希。

  • block.gaslimit:区块的 gas 限制,即每笔交易允许的最大 gas。

  • block.coinbase: 出块矿工的地址。

  • 这些都是明显的错误选择,因为它们可以被任何人或者至少是矿工可以预测值。有些 (block.number) 比其他的 (block.difficulty) 更容易预测。

    如果我们在合约中增加一个私有的种子呢?可以用一个传递的变量和私有存储的种子作为输入进行计算由此产生随机数。然而,这种方法并没有考虑到不可能在公共网络内存储私有数据。尽管以太坊在智能合约中有私有存储的概念,但任何运行以太坊节点的人仍然可以读取这个存储。读取私有状态或内部状态可以通过 web3.eth.getStorageAt 来实现。因此,这个方式只是增加了试图预测随机数的人的努力。

    使用区块哈希

    从技术上讲,它也是一个区块变量,但它有自己的部分。以太坊中的区块哈希计算为 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)

    织梦二维码生成器
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线----------------------------
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    用户名: 验证码:点击我更换图片
    栏目列表
    推荐内容