使用Hedera Hashgraph从智能合约生成随机数



如何使用Hedera的solidity在智能合约上安全地生成随机数?我已经搜索了一段时间的答案,看起来他们中的大多数人都建议使用Chainlink VRF?

我对此还是个新手,但据我所知,以太坊上的节点可能会以某种方式篡改智能合约的状态或结果。既然Hedera有一个我们可以信任的管理委员会节点,也许Solidity生成的一个简单的随机数是可以信任的?或者我在学习的时候就把这一切都搞错了。

智能合约中的随机数有很多用例,如果Hedera开发人员可以看到这个线程,请提供一个简单的解决方案。

要在Hedera上的solidity智能合约中生成可验证的随机数,您可以像在以太坊或任何其他兼容EVM的网络上一样。您可以使用现有的库,比如vrf-solidity。

一旦你有了想要使用的solidity文件,你就可以编译智能合约,将文件添加到Hedera,并部署智能合约。实现这一点的步骤可以在Hedera文档上的部署第一个智能合约教程中找到。

注意这个HIP,它引入了一种用于生成随机数的本地事务类型,并且可以作为预编译文件在智能合约中使用。

https://hips.hedera.com/hip/hip-351

正如@Greg Scullard所指出的,HIP-351提出了一个新的系统合同,其中包括生成伪随机数的预编译函数。

为了在solidity代码中使用这一点,你需要一个地址和一个接口,两者都在HIP-351:中定义

地址0x169

Solidity接口

interface IPrngSystemContract {
function getPseudorandomSeed() external returns (bytes32);
}

要使用它,只需初始化一个实例,我们将其命名为PrngSystemContract:

IPrngSystemContract constant PrngSystemContract =
IPrngSystemContract(address(0x169));

然后随后调用其CCD_ 3函数,其将返回伪随机CCD_ 4,然后您可以在智能合约的逻辑中使用它。

下面是一个智能合约实现示例执行上面描述的操作。此外,它还使用了类型转换和模运算在指定范围内选择一个随机数。在生成随机数之后,它只是在事件中发出该结果。您应该用所需的逻辑替换emit事件。

在Remix 上试试这个

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.18;
interface IPrngSystemContract {
// Generates a 256-bit pseudorandom seed using the first 256-bits of running hash of n-3 transaction record.
// Users can generate a pseudorandom number in a specified range using the seed by (integer value of seed % range)
function getPseudorandomSeed() external returns (bytes32);
}
contract Prng {
IPrngSystemContract constant PrngSystemContract =
IPrngSystemContract(address(0x169));
event RandomResult(bytes32 randomBytes, uint256 num);
function getPseudorandomSeed() public returns (bytes32 randomBytes) {
randomBytes = PrngSystemContract.getPseudorandomSeed();
}

// Return value in the range [lo, hi)
function getPseudorandomNumber(uint256 lo, uint256 hi) external returns (uint256 num) {
bytes32 randomBytes = getPseudorandomSeed();
num = uint256(randomBytes);
num = lo + (num % (hi - lo));
emit RandomResult(randomBytes, num);
}
}

相关内容

  • 没有找到相关文章

最新更新