【问题标题】:Generate random numbers in solidity在solidity中生成随机数
【发布时间】:2022-11-10 10:03:34
【问题描述】:

我正在尝试构建一个简单的游戏,它将连续生成 3 个从 1 到 10 的随机数。如果连续有 3 个相同的数字,我应该向用户发送 x 数量的以太币作为奖励。

我想知道如何生成这些数字,我想出了两个对我来说不是很好的解决方案。

1.在合约中做一个函数生成随机数

2.从像Nodejs这样的后端生成随机数

在我看来,如果我使用第一个选项,汽油费会非常昂贵。 第二个选项对我来说似乎很好,但是如何保护生成随机数的函数。想法是这个函数生成随机数并根据这些数字用户赢得奖品。我的问题是如何保护这个函数所以它不能被其他人操纵。

如果您有更好的想法如何生成这些数字,请告诉我。

【问题讨论】:

    标签: node.js blockchain solidity


    【解决方案1】:

    我对solidity没有太多经验,但是为了在solidity中生成随机数,我使用了chainlink VRF。

    Chainlink VRF(可验证随机函数)是可证明公平且可验证的随机数生成器(RNG),可让智能合约在不影响安全性或可用性的情况下访问随机值

    以下是 VRF 文档。

    https://docs.chain.link/docs/vrf/v2/subscription/examples/get-a-random-number/

    【讨论】:

      【解决方案2】:

      您有一些方法可以在链上生成随机数,其中一些具有 VRF '可验证的随机函数' 直接内置到他们的协议中。

      Harmony 使用他们的权益证明BLS 签名在可以产生的块上签名可以产生签名。可以对每个签名进行散列以生成随机数。简而言之,某些区块链可以为每个区块产生一个随机数。

      // SPDX-License-Identifier: MIT
      pragma solidity ^0.8.0;
      
      // Deployed on harmony testnet 0x6b0bc2e986B0e70DB48296619A96E9ac02c5574b
      contract HarmonyVRF {
          function vrf() public view returns (bytes32 result) {
          uint[1] memory bn;
          bn[0] = block.number;
          assembly {
              let memPtr := mload(0x40)
              if iszero(staticcall(not(0), 0xff, bn, 0x20, memPtr, 0x20)) {
              invalid()
              }
              result := mload(memPtr)
          }
      }
      

      其他技术将是:

      • 伪随机数散列
      • 链上可验证随机函数 (VRF)
      • 链下可验证随机函数 (VRF)
      • 提交-显示随机性

      【讨论】:

        猜你喜欢
        • 2018-07-28
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        • 2011-09-05
        • 2012-12-16
        • 2019-05-15
        相关资源
        最近更新 更多