如何使用VRF在以太坊上生成随机数

释放双眼,带上耳机,听听看~!
这个问题源于这样一个事实:当挖掘一个事务时,它需要得到网络上多个节点的确认。这意味着每个节点必须达成相同的共识,因此,如果函数确实是随机的,每个节点都会产生不同的一致意见,从而导致未经确认的事务

原作者:Alex Roan

随机数和区块链之间一直存在着分歧。到目前为止,在区块链上还没有可验证的随机函数。

这个问题源于这样一个事实:当挖掘一个事务时,它需要得到网络上多个节点的确认。这意味着每个节点必须达成相同的共识,因此,如果函数确实是随机的,每个节点都会产生不同的一致意见,从而导致未经确认的事务。

Chainlink介绍

对于基于不可变规则集执行计算,区块链和智能契约是理想的。问题是规则只能应用于系统内的数据。从系统外部获得可验证的数据是非常困难的。

Chainlink的工作就是通过提供分布式预测来解决这个问题,从而使区块链能够访问其生态系统之外的数据。预言家本质上是区块链与外部世界之间的桥梁。

在最近的一篇文章中,Chainlink宣布发布了新的可验证随机函数(random function, VRF)。开发人员现在可以使用该特性将其集成到多个测试网络上的dapps中,使智能契约能够检索可在链上验证的随机数。这意味着不再有bug,并且保证了随机性。

这是怎么回事呢?

如果你想用Jaascript生成一个随机数,代码很简单:

数学。随机();

在一次行执行中,检索一个随机数。这不是VRF的工作方式。与Jaascript不同,VRF处理一些事务。

以下是事件的顺序:

1. 您的智能契约通过事务从VRF请求一个随机数。

2. VRF将生成这个数字并验证它。

3.VRF已准备好回应。

4. VRF通过另一个事务将数字发送回您的智能合同。

要使第4点成功,您的契约需要实现一个已知的函数,以便VRF可以返回结果验证。但是如何在项目中实现它呢?

如何实现随机性

让我们创建一个名为RandomGenerator的新智能契约,其中我们将调用VRF并接收结果。

步骤1:创建一个消费者契约

我们将使用Chainlink提供的一个名为VRFConsumerBase的契约,它是一个抽象契约,定义了使用VRF所需的最小函数。我们这样来定义它。RandomGenerator。Sol”文件开头:

Pragmasolidity ^ 0.6.2;导入“https://raw.githubusercontent.com/smartcontractkit/chainlink/deelop/em-contracts/src/0.6/VRFConsumerBase.sol”;构造函数(address_rfCoordinator, address_link) VRFConsumerBase (_rfCoordinator _link) public {}}

VRFConsumerBase仍然处于测试的后期阶段,所以软件包仍然对公众开放。这就是我们使用Github HTTP URL进行导入的原因。

基本契约接受两个参数,分别表示协调器的地址和链接ERC20令牌。这些是每个网络上的固定地址(稍后详细介绍)。

步骤2:重写函数

VRFConsumerBase附带两个功能,这两个功能对VRF过程至关重要。

第一个叫做重新开始,它已经完成了,所以我们不需要重写它。这是对VRF进行初始调用的函数。

另一个是履行随机,这是一个函数,VRF调用时,它产生的数字。我们可以覆盖它,以便在调用随机数时对其执行操作。

我们的智能契约只是将生成的随机数存储在一个名为randomNumber的状态变量中,这样我们就可以在完成时查询它。它应该是这样的:

Pragmasolidity ^ 0.6.2;导入“https://raw.githubusercontent.com/smartcontractkit/chainlink/deelop/em-contracts/src/0.6/VRFConsumerBase.sol”;ContractRandomGeneratorisVRFConsumerBase {bytes32publicreqId;Uint256publicrandomNumber;构造函数(address_rfCoordinator, address_link) VRFConsumerBase (_rfCoordinator _link) public{}函数实现随机性(bytes32requestId uint256randomness) externaloerride {reqId = requestId;RandomNumber =随机性;}}

我们将重写函数添加到randomness函数中,并将状态变量reqId和randomNumber设置为等于函数接收到的值。

步骤3:生成随机数

正如我前面在步骤1中提到的,函数调用需要传递一些地址和其他值作为参数。

当部署智能契约并调用构造函数时,它需要网络上的VRF协调器地址和链接令牌的地址。关于Ropsten测试网站:

类VRF(可变制冷剂流量)协调器:0 xf720cf1b963e0e7be9f58fd471efa67e7bf00cfb

链接地址:0 x20fe562d797a42dcb3399062ae9546cd06f63280

当我们调用requestRandomness函数时,我们需要传递生成随机性的键散列、生成随机数的费用(使用链接标记)和生成随机性的种子(这是我们提供的最后一个种子)。函数签名如下:

FunctionrequestRandomness (bytes32_keyHash uint256_fee, uint256_seed)公共返回(bytes32requestId)

在Ropsten上,参数值为:

散列的键:0 xced103054e349b8dfb51352f0f8fa9b5d20dde3d06f9f43cb2b85bc64b238205

费用(1):1000000000000000000

种子(whateer_you_want_your_seed_to_be):

所以我们的调用代码会是这样的:

/ / setropstenkeyhashbytes32keyHash = "0 xced103054e349b8dfb51352f0f8fa9b5d20dde3d06f9f43cb2b85bc64b238205";/ / setropstenLINKfeefee = 1000000000000000000;/ / seexampleseedseed = 123456789;/ / makecalltorequestrandomnessbytes32reqId =兰德。需要性(keyHash, fee, seed);

返回结果时,该值将存在,可以调用以下方法进行检索:

兰德。RandomNumber;

本节将介绍如何使用Remix IDE和Metamask从VRF获取随机数。在继续之前,请确保在浏览器上安装了Metamask扩展。

前往Remix IDE。

如果您以前从未使用过Remix,请确保使用solmix,如图3所示。

如何使用VRF在以太坊上生成随机数插图

创建一个名为RandomGenerator的新文件,并粘贴图2中的代码。

使用左边的菜单,单击solbreast图标,然后选择0.6.2编译器版本,如图4所示。

如何使用VRF在以太坊上生成随机数插图1

然后点击下面的按钮,从下拉列表中选择AMPLldquo。注入web3 AMPL全程;,如图5所示。

如何使用VRF在以太坊上生成随机数插图2

这将提示您接受Metamask的连接请求。

确保在Metamask上使用Ropsten测试网络,如图6所示。

如何使用VRF在以太坊上生成随机数插图3

确保在你的超请求账户中有一些Ropsten醚。

回到混音,在相同的标签上,你会看到一个橙色的“Deploy”按钮,单击该按钮并接受来自Metamask的契约部署请求。

部署之后,我们需要确保智能契约具有链接令牌,以便它可以请求随机数。点击Ropsten链接,然后粘贴你的Metamask地址,这样你就可以在Metamask中收到100个链接。

Metamask不知道链接令牌在Ropsten上的什么位置,所以我们需要添加它。在与其他;Metamask”在你的帐户名的左边,点击汉堡符号,然后点击底部“添加Token”

在与其他;自定义Token”,添加地址:0 x20fe562d797a42dcb3399062ae9546cd06f63280。其余的细节应自动填写。提交后,如果你请求一个链接到正确的地址,你应该看到100链接在你的帐户。图7显示了一个包含70个链接的帐户。

如何使用VRF在以太坊上生成随机数插图4

返回Remix,并单击图8中的圆圈按钮,以复制已部署契约的地址。

如何使用VRF在以太坊上生成随机数插图5

现在我们将发送一些合同的链接。回到Metamask,点击100链接旁边的三个点。粘贴合同地址并发送10个链接。确认交易后,进行下一步。

在混音中,我们现在可以请求随机性。在同一个选项卡中,向下滚动可以找到更多表示常用功能的橙色按钮,如图9所示。单击requestRandomness右边的箭头展开参数。

如何使用VRF在以太坊上生成随机数插图6

为了将这些值插入三个字段:0 xced103054e349b8dfb51352f0f8b5d20dde3d06f9f43cb2b85bc64b238205, 10000000000000000000000, 123456789(或者您想要播种什么)。然后点击“Transact”!

如何使用VRF在以太坊上生成随机数插图7

这可能需要一些时间,因此您应该关注输出终端提供给您的Etherscan中的事务。

如何使用VRF在以太坊上生成随机数插图8

在事务完成后,我们需要等待VRF生成一个随机数并将其发送回我们的契约。几分钟后,点击橙色按钮下方的蓝色按钮,以Remix AMPLldquo模式发送事务。RandomNumber”按钮检查您的契约是否收到了一个随机数,如图12所示。

如何使用VRF在以太坊上生成随机数插图9

如果一切顺利,你应该有一个像我一样的随机数,它是30207470459964961279215818016791723193587102244018403859363363849439350753829。

结论

Chainlink证明,可验证的随机数现在可以用在智能合同中。我们已经解释了这个机制是如何工作的,如何将代码集成到一个智能契约中,以及如何使用Remix IDE来检索随机数。

人已赞赏
技术

今天我推荐阅读TBTC:比特币和以太坊之间的WiFi网桥

2020-5-25 8:29:51

技术

今日推荐 | 一文读懂热门项目Filecoin的经济模型与矿工经济行为

2020-5-25 12:21:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索