原作者: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/artcontractkit/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/artcontractkit/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;/ / makecalltorequestrandomnesytes32reqId =兰德。需要性(keyHash, fee, seed);
返回结果时,该值将存在,可以调用以下方法进行检索:
兰德。RandomNumber;
本节将介绍如何使用Remix IDE和Metamask从VRF获取随机数。在继续之前,请确保在浏览器上安装了Metamask扩展。
前往Remix IDE。
如果您以前从未使用过Remix,请确保使用SOLmix,如图3所示。
创建一个名为RandomGenerator的新文件,并粘贴图2中的代码。
使用左边的菜单,单击SOLbreast图标,然后选择0.6.2编译器版本,如图4所示。
然后点击下面的按钮,从下拉列表中选择AMPLldquo。注入web3 AMPL全程;,如图5所示。
这将提示您接受Metamask的连接请求。
确保在Metamask上使用Ropsten测试网络,如图6所示。
确保在你的超请求账户中有一些Ropsten醚。
回到混音,在相同的标签上,你会看到一个橙色的“Deploy”按钮,单击该按钮并接受来自Metamask的契约部署请求。
部署之后,我们需要确保智能契约具有链接代币,以便它可以请求随机数。点击Ropsten链接,然后粘贴你的Metamask地址,这样你就可以在Metamask中收到100个链接。
Metamask不知道链接代币在Ropsten上的什么位置,所以我们需要添加它。在与其他;Metamask”在你的帐户名的左边,点击汉堡符号,然后点击底部“添加Token”
在与其他;自定义Token”,添加地址:0 x20fe562d797a42dcb3399062ae9546cd06f63280。其余的细节应自动填写。提交后,如果你请求一个链接到正确的地址,你应该看到100链接在你的帐户。图7显示了一个包含70个链接的帐户。
返回Remix,并单击图8中的圆圈按钮,以**已部署契约的地址。
现在我们将发送一些合同的链接。回到Metamask,点击100链接旁边的三个点。粘贴合同地址并发送10个链接。确认交易后,进行下一步。
在混音中,我们现在可以请求随机性。在同一个选项卡中,向下滚动可以找到更多表示常用功能的橙色按钮,如图9所示。单击requestRandomness右边的箭头展开参数。
为了将这些值插入三个字段:0 xced103054e349b8dfb51352f0f8b5d20dde3d06f9f43cb2b85bc64b238205, 10000000000000000000000, 123456789(或者您想要播种什么)。然后点击“Transact”!
这可能需要一些时间,因此您应该关注输出终端提供给您的ETHerscan中的事务。
在事务完成后,我们需要等待VRF生成一个随机数并将其发送回我们的契约。几分钟后,点击橙色按钮下方的蓝色按钮,以Remix AMPLldquo模式发送事务。RandomNumber”按钮检查您的契约是否收到了一个随机数,如图12所示。
如果一切顺利,你应该有一个像我一样的随机数,它是30207470459964961279215818016791723193587102244018403859363363849439350753829。
结论
Chainlink证明,可验证的随机数现在可以用在智能合同中。我们已经解释了这个机制是如何工作的,如何将代码集成到一个智能契约中,以及如何使用Remix IDE来检索随机数。
文章标题:如何使用VRF在以太坊上生成随机数
文章链接:https://www.btchangqing.cn/25454.html
更新时间:2020年05月25日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。