Solana链上程序如何获取随机数?

How to get random number in Solana on-chain program?

我刚刚加入了 Solana 链上程序。 我打算制作判断正面或背面的硬币游戏。 我尝试使用 std::rand 和 get_random crate 但它们不起作用。 如果你有这方面的经验,请告诉我。

我使用 Solana 链上程序的锚点。

不幸的是,随机生成器无法在链上运行。 如果你想要一些随机数,你应该从链外获得它。

原因?

假设您使用块散列或类似的东西进行随机分配,因此用户可以通过插入一条指令或值来检查有利结果甚至更糟,如果结果不令人满意则强制回滚。

那我们该怎么办呢?

  1. 尝试使用像 chainlink vrf(可验证随机函数)这样的预言机

  2. 模拟oracle vrf服务:

在您的服务器监听的链上进行交易。如果这笔交易 发生了,在链下生成随机数并从您的服务器回调它。

主播像这样使用随机数

use rand::rngs::OsRng;
.
.
.
let dummy_a = Keypair::generate(&mut OsRng);

因此,如果您需要类似 UUID 行为的随机性,您可以使用锚代码存储库中的上述机制,但如果您的情况是像掷骰子这样的游戏逻辑,则需要预言机或模拟它。