【问题标题】:Generate random numbers in solidity在solidity中生成随机数
【发布时间】:2022-11-10 10:03:34
【问题描述】:
我正在尝试构建一个简单的游戏,它将连续生成 3 个从 1 到 10 的随机数。如果连续有 3 个相同的数字,我应该向用户发送 x 数量的以太币作为奖励。
我想知道如何生成这些数字,我想出了两个对我来说不是很好的解决方案。
1.在合约中做一个函数生成随机数
2.从像Nodejs这样的后端生成随机数
在我看来,如果我使用第一个选项,汽油费会非常昂贵。
第二个选项对我来说似乎很好,但是如何保护生成随机数的函数。想法是这个函数生成随机数并根据这些数字用户赢得奖品。我的问题是如何保护这个函数所以它不能被其他人操纵。
如果您有更好的想法如何生成这些数字,请告诉我。
【问题讨论】:
标签:
node.js
blockchain
solidity
【解决方案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)
- 提交-显示随机性