[Chainlink] 如何在Polygon上获取随机数

数据相关  收藏
0 / 145

[Chainlink] How To Get A Random Number On Polygon

Breaking News

By Chainlink News 03/30/21 5:49 PM

How to Get a Random Number on Polygon

Polygon (formerly known as Matic Network) is a protocol and a framework for building and connecting Ethereum-compatible blockchain networks. Initially focusing on Ethereum scaling solutions that utilize Proof of Stake (PoS) sidechains and a Plasma framework, in rebranding to Polygon, they’ve also added other major scaling solutions such as zk-Rollups and Optimistic Rollups, as well as inter-chain communication protocols.
Polygon (以前称为 Matic Network)是用于建立和连接以太坊兼容区块链网络的协议和框架。 最初侧重于利用权益证明(PoS)侧链和等离子框架的以太坊扩展解决方案,在更名为 Polygon 之后,他们还添加了其他主要的扩展解决方案,例如 zk-Rollups 和 Optimistic Rollups,以及链间通信协议。

As the most widely adopted decentralized Oracle network, Chainlink is the preferred Oracle network within Polygon for securely obtaining external data and using tamper-proof data feeds. Recently, Chainlink VRF went live on Polygon mainnet, offering developers the ability to request verifiably random numbers in their smart contracts. In this technical tutorial, we’ll show you how to deploy a smart contract to Polygon and obtain a provably random number using Chainlink VRF.

多边形(以前称为 Matic Network)是用于建立和连接以太坊兼容区块链网络的协议和框架。 最初侧重于利用权益证明(PoS)侧链和等离子框架的以太坊扩展解决方案,在更名为 Polygon 之后,他们还添加了其他主要的扩展解决方案,例如 zk-Rollups 和 Optimistic Rollups,以及链间通信协议。作为最广泛采用的分散式 Oracle 网络,Chainlink 是 Polygon 中首选的 Oracle 网络,用于安全地获取外部数据并使用防篡改数据源。 最近,Chainlink VRF 在 Polygon 主网上上线,为开发人员提供了在其智能合约中请求可验证的随机数的功能。 在本技术教程中,我们将向您展示如何将智能合约部署到 Polygon 并使用 Chainlink VRF 获得可证明的随机数。

The Need for Verifiable Randomness 为什么需要可以验证的随机性

Chainlink VRF is a provably fair and verifiable source of randomness designed for smart contracts. Solidity developers can use it as a tamper-proof random number generator to build safe and reliable smart contracts for Ethereum applications that rely on unpredictable outcomes. Critically, Chainlink VRF not only provides random numbers, but also cryptographic proof that the number has not been tampered with to generate certain predictable outcomes.

Chainlink VRF 是为智能合约设计的可证明公平且可验证的随机性来源。Solidity 开发人员可以将其用作防篡改随机数生成器,为依赖不可预测结果的以太坊应用程序构建安全可靠的智能合约。至关重要的是,Chainlink VRF 不仅提供随机数,而且还提供加密证明该数字未被篡改以产生某些可预测的结果。

Having verifiably random numbers in smart contracts enables developers to build for a wide array of use cases, such as randomness in gaming, random rewards in NFTs, lotteries, and Fair Participant or Random Node Selection.

在智能合约中具有可验证的随机数使开发人员能够构建广泛的用例,例如游戏中的随机性、NFT 中的随机奖励、彩票以及公平参与者或随机节点选择

One noteworthy real-world example is the NFT gaming dApp Aavegotchi, which integrated Chainlink VRF as its source of provably fair randomness to help determine an Aavegotchi’s unique characteristics, generate unpredictable game scenarios, and randomly select DAO jurors. Aavegotchi has launched on Polygon’s layer 2 PoS chain, allowing them to cost-effectively scale to meet user demand thanks to near zero transaction fees and fast settlement times.

一个值得注意的现实例子是 NFT 游戏 dApp ​​Aavegotchi,它集成了 Chainlink VRF 作为可证明公平随机性的来源,以帮助确定 Aavegotchi 的独特特征,生成不可预测的游戏场景,并随机选择 DAO 陪审员。Aavegotchi 已在 Polygon 的第 2 层 PoS 链上推出,由于接近零的交易费用和快速的结算时间,使他们能够经济高效地扩展以满足用户需求。

Now that we understand the use cases that benefit from verifiable randomness, we’ll walk through how to obtain a verifiable random number on a smart contract on the Polygon Mumbai Testnet.

现在我们了解了受益于可验证随机性的用例,我们将介绍如何在 Polygon Mumbai 测试网上的智能合约上获取可验证的随机数。

Connecting to Polygon Mumbai Testnet 连接 Mumbai 测试网

The first step in using Chainlink VRF on Polygon’s PoS chain is to set up your MetaMask wallet to connect to the Matic Mumbai Testnet. You can do this by selecting ‘Networks’, then choosing ‘Custom RPC’ and entering the following details:

在 Polygon 的 PoS 链上使用 Chainlink VRF 的第一步是设置您的 MetaMask 钱包,以连接到 Matic Mumbai Testnet。 您可以通过选择“网络”,然后选择“自定义 RPC”并输入以下详细信息来执行此操作:

How to Get a Random Number on Polygon
Entering the Mumbai Testnet details

MATIC is the native token of the Polygon network and is needed to interact with the network, similar to how ETH is used as gas for Ethereum. To obtain Mumbai Testnet MATIC, head over to the MATIC Faucet, select the MATIC token and the Mumbai Testnet network, enter in your MetaMask Wallet address and press Submit.

MATIC 是 Polygon 网络的原生令牌,与网络交互需要它,类似于 ETH 被用作以太坊气体的方式。 要获取孟买 Testnet MATIC,请转到 MATIC 龙头,选择 MATIC 令牌和 Mumbai Testnet 网络,输入您的 MetaMask 电子钱包地址,然后按 Submit。

Similar to the MATIC token, the LINK token is required as payment to the VRF coordinator for fulfilling a random number request. To obtain testnet LINK, simply choose the LINK token in the faucet instead of the MATIC token.

与 MATIC 令牌类似,需要 LINK 令牌作为向 VRF 协调器支付的费用,以实现随机数请求。 要获得 testnet LINK,只需在水龙头中选择 LINK 令牌而不是 MATIC 令牌。

How to Get a Random Number on Polygon

image.png

Obtaining Mumbai Testnet MATIC and LINK

While the process for using the faucet to obtain LINK on the Mumbai Testnet is relatively simple, it’s a little more involved when moving to Polygon’s Mainnet. This is because the LINK provided by the Polygon Bridge is not ERC-677 compatible, so it cannot be used with Chainlink oracles. However, it can be converted to the official LINK token on Polygon using Chainlink’s PegSwap service, essentially creating a wrapped version of the LINK token.

虽然使用水龙头在 Mumbai Testnet 上获取 LINK 的过程相对简单,但在移至 Polygon 的 Mainnet 时涉及的过程要多一些。 这是因为 Polygon Bridge 提供的 LINK 与 ERC-677 不兼容,因此不能与 Chainlink oracles 一起使用。 但是,可以使用 Chainlink 的 PegSwap 服务将其转换为 Polygon 上的官方 LINK 令牌,实质上是创建 LINK 令牌的包装版本。

https://faucet.polygon.technology/

Building the Smart Contract 建立智能合约

The easiest way to start building a smart contract that uses Chainlink VRF on Polygon is to begin with the standard Chainlink VRFConsumer contract. This is a basic standardized contract for initiating requests for a random number via a Chainlink oracle. So we will open this contract in Remix via the link above and modify it accordingly.

开始在 Polygon 上使用 Chainlink VRF 建立智能合约的最简单方法是从标准 Chainlink VRFConsumer 合约开始。 这是用于通过 Chainlink Oracle 发起对随机数的请求的基本标准化合同。 因此,我们将通过上面的链接在 Remix 中打开此合同,并进行相应的修改。

  • The VRF Coordinator for Mumbai Testnet is 0x8C7382F9D8f56b33781fE506E897a4F1e2d17255
  • The address of the LINK token on the Mumbai Testnet is 0x326C977E6efc84E512bB9C30f76E30c160eD06FB
  • The KeyHash for Mumbai Testnet is 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4
  • The fee for making a VRF request on the Mumbai Testnet is 100000000000000 (0.0001 LINK)
  • Mumbai 测试网的 VRF 协调器为 0x8C7382F9D8f56b33781fE506E897a4F1e2d17255
  • Mumbai 测试网上的 LINK 令牌地址为 0x326C977E6efc84E512bB9C30f76E30c160eD06FB
  • Mumbai 测试网的 KeyHash 为 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4
  • 在 Mumbai 测试网上提出 VRF 请求的费用为 100000000000000(0.0001 LINK)
constructor() 
        VRFConsumerBase(
            0x8C7382F9D8f56b33781fE506E897a4F1e2d17255
            0x326C977E6efc84E512bB9C30f76E30c160eD06FB
        ) public
    {
        keyHash = 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4;
        fee = 100000000000000; // 0.0001 LINK
    }

Now our contract is ready to be compiled and deployed to the Mumbai Testnet.
现在,我们的合同已准备好进行编译,并部署到 MumbaiTestnet。

Deploying and Testing the Smart Contract 部署和测试智能合约

Compile the contract in Remix, then on the deployment tab, change the environment to “Injected Web3”, and ensure the wallet address below is the one in your MetaMask wallet that contains your MATIC and LINK tokens, press the deploy button, and follow the steps. The end result is you have your smart contract deployed to the Mumbai Testnet. You should take note of the deployed contract address via the transaction output in the Remix console.

在 Remix 中编译合同,然后在“部署”选项卡上,将环境更改为“ Injected Web3”,并确保下面的钱包地址是您的 MetaMask 钱包中包含 MATIC 和 LINK 令牌的钱包地址,按部署按钮,然后按照脚步。 最终结果是您将智能合约部署到了孟买 Testnet。 您应该通过 Remix 控制台中的事务输出记录已部署的合同地址。

The next step is to fund the contract with LINK so it can send requests to the VRF Coordinator. To do this, simply take the deployed contract address from the step above, and then send it at least 0.0001 LINK from your MetaMask wallet.

下一步是使用 LINK 为合同提供资金,以便它可以将请求发送到 VRF 协调器。 为此,只需从上述步骤中获取已部署的合同地址,然后从您的 MetaMask 钱包中至少发送 0.0001 LINK。

How to Get a Random Number on Polygon

Funding the contract with LINK

Once the contract is deployed and funded with LINK, we can request a random number by executing the getRandomNumber function, passing in a given seed as the parameter. This will send the request along with the seed to the VRF coordinator. Remember it’s extremely important to choose a seed that is difficult to influence or predict.

Entering a seed and sending a request to the VRF CoordinatorOnce this transaction has been processed, we then wait a few seconds for the Chainlink Oracle to fulfill the request for a random number, and then call the fulfillRandomness function we created earlier to return the random number back to our consumer contract.

处理完该交易后,我们将等待几秒钟,让 Chainlink Oracle 完成对随机数的请求,然后调用我们之前创建的 fulfillRandomness 函数,将随机数返回给我们的消费者合同。

We then call the randomResult getter function to see the result of the verifiable random number that was generated by the Chainlink Oracle with the given seed. We now successfully have a random number in our smart contract deployed to the Polygon Mumbai Testnet that was verifiably created using the given seed.

然后,我们调用 randomResult getter 函数,以查看由 Chainlink Oracle 使用给定种子生成的可验证随机数的结果。 现在,我们已经成功地将智能合约中的随机数部署到了 Polygon Mumbai Testnet 中,该随机数是使用给定种子进行验证创建的。

How to Get a Random Number on Polygon
Viewing the returned random number

Summary

Poygon’s PoS Chain offers a viable layer 2 solution with its fast, cheap, and reliable transactions, and with the addition of Chainlink VRF, developers can now build various scalable dApps that make use of verifiable random numbers.

Poygon 的 PoS Chain 通过其快速,廉价和可靠的交易提供了可行的第 2 层解决方案,并且通过添加 Chainlink VRF,开发人员现在可以利用可验证的随机数构建各种可扩展的 dApp。

If you’re a smart contract developer and want to take advantage of the Chainlink VRF feature, visit the Chainlink developer documentation and join the technical discussion on Discord.

如果您是精明的合同开发人员,并且想利用 Chainlink VRF 功能,请访问 Chainlink 开发人员文档,并加入有关 Discord 的技术讨论。

EXPLORE CHAINLINK DOCS
JOIN THE CHAINLINK DISCORD

More on This Topic

https://azcoinnews.com/chainlink-how-to-get-a-random-number-on-polygon.html


在 Ropsten 上产生随机数

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

问题源于以下事实:交易被挖掘时,需要由网络上的多个节点来确认。这意味着每个节点都必须得出相同的共识。因此如果函数确实是随机的,则每个节点将得出不同的共识,从而导致未能确认的事务。

chainlink 介绍

区块链和智能合约非常适合根据一组不可变的规则执行计算。问题在于规则只能应用于系统内部的数据。从系统外部获取可验证的数据非常困难。

Chainlink 的任务是通过提供分散的预言来解决此问题,使区块链能够访问其生态系统之外的数据。预言机实质上是区块链和外部世界之间的桥梁。

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

那么该功能如何实现的?

如果您想在 JavaScript 中生成一个随机数,代码非常简单:

Math.random();

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

以下是事件的顺序:

  1. 您的智能合约通过交易向 VRF 请求一个随机数。
  2. VRF 会生成该数字并进行验证。
  3. VRF 准备响应。
  4. VRF 通过另一笔交易将号码发送回您的智能合约。

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

如何实现随机性

让我们创建一个名为 RandomGenerator 的新智能合约,在这里我们将调用 VRF 并接收结果。

步骤 1:创建消费者合约

我们将使用 Chainlink 提供的名为 VRFConsumerBase 的合约,这是一个抽象合约,它定义了消耗 VRF 所需的最少函数。让我们这样定义“ RandomGenerator.sol”文件的开头:

pragma solidity ^0.6.2;
import "https://raw.githubusercontent.com/smartcontractkit/
chainlink/develop/evm-contracts/src/v0.6/VRFConsumerBase.sol";
contract RandomGenerator is VRFConsumerBase {
constructor(address _vrfCoordinator, address _link)
VRFConsumerBase(_vrfCoordinator, _link) public {
}
}

VRFConsumerBase 仍在后期测试中,因此软件包尚为对外提供。这就是为什么我们使用 GitHub 的 HTTP URL 进行导入的原因。

基本合约采用两个参数,分别代表协调器(coordinator)和 LINK ERC20 令牌的地址。这些是每个网络上的固定地址(稍后会详细介绍)。

步骤 2:重写函数

VRFConsumerBase 附带了两个对 VRF 流程至关重要的函数。

第一个叫做 requestRandomness,它已经实现了,我们不需要重写。这是对 VRF 进行初始调用的函数。

另一个叫做 fulfillRandomness,这是 VRF 在生成数字时调用的函数。我们可以重写它,以便在调用随机数时对其执行操作。

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

pragma solidity ^0.6.2;
import "https://raw.githubusercontent.com/smartcontractkit/
chainlink/develop/evm-contracts/src/v0.6/VRFConsumerBase.sol";
contract RandomGenerator is VRFConsumerBase {
bytes32 public reqId;
uint256 public randomNumber;
constructor(address _vrfCoordinator, address _link)
VRFConsumerBase(_vrfCoordinator, _link) public {
}
function fulfillRandomness(bytes32 requestId, uint256 randomness) external override {
reqId = requestId;
randomNumber = randomness;
}
}

我们为 fulfillRandomness 函数添加了重写功能,并将状态变量 reqId 和 randomNumber 设置为等于该函数接收的值。

步骤 3:生成随机数

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

部署智能合约并调用构造函数时,它需要 VRF 协调器(coordinator)地址和网络上 LINK 令牌的地址。在 Ropsten 测试网上:

· VRF coordinator: 0xf720CF1B963e0e7bE9F58fd471EFa67e7bF00cfb
· LINK address: 0x20fE562d797A42Dcb3399062AE9546cd06f63280

调用 requestRandomness 函数时,我们需要传递生成随机性的 Key hash,生成随机数的 fee(使用 LINK 令牌)和针对生成随机性的 seed(这是我们提供的最后一个)。函数签名如下所示:

function requestRandomness(bytes32 _keyHash, uint256 _fee, uint256 _seed) public returns (bytes32 requestId)

在 Ropsten 上,参数值为:

· Key hash: 0xced103054e349b8dfb51352f0f8fa9b5d20dde3d06f9f43cb2b85bc64b238205
· Fee (1 LINK): 1000000000000000000
· Seed: [whatever_you_want_your_seed_to_be]

因此我们的调用代码将如下所示:

// set ropsten key hash
bytes32 keyHash = "0xced103054e349b8dfb51352f0f8fa9b5d20dde3d06f9f43cb2b85bc64b238205";
// set ropsten LINK fee
fee = 1000000000000000000;
// set example seed
seed = 123456789;
// make call to request randomness
bytes32 reqId = rand.requestRandomness(keyHash, fee, seed);

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

rand.randomNumber;

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

· 前往 Remix IDE。
· 如果您以前从未使用过 Remix,请确保使用的是 Solidity,如图 3 所示。

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

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

然后单击下面的按钮,并在下拉列表中选择“Injected web3”,如图 5 所示。

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

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

确保您的 Metamask 帐户中有一些 Ropsten Ether。

回到 Remix,在同一选项卡上,您应该看到橙色的“ Deploy”按钮,单击该按钮并接受来自 Metamask 的合约部署请求。

部署后,我们需要确保智能合约具有 LINK 令牌,以便它可以请求随机数。在 Ropsten LINK 龙头上,然后粘贴您的 Metamask 地址,以便您在 Metamask 中收到 100 LINK。

Metamask 不知道 LINK 令牌在 Ropsten 上的位置,因此我们需要添加它。在“ Metamask”中,在您的帐户名称左侧,单击 burger 符号,然后单击底部的“Add Token”。

在“Custom Token”下,添加地址:0x20fE562d797A42Dcb3399062AE9546cd06f63280。其余详细信息应自动填写。提交后,如果您要求 LINK 到正确的地址,那么您的帐户中应该会看到 100 LINK。图 7 显示了一个具有 70 LINK 的帐户。

返回到 Remix,单击图 8 中带圆圈的按钮,复制已部署合约的地址。

现在我们将向合约发送一些 LINK。回到 Metamask,然后单击 100 LINK 旁边的 3 个点。粘贴合约地址并发送 10 LINK。确认交易后,请继续下一步。

在 Remix 中,我们现在可以请求随机性。在同一选项卡中,向下滚动您会发现更多代表公共功能的橙色按钮,如图 9 所示。单击 requestRandomness 右侧的箭头以展开参数。

按顺序将这些值粘贴到三个输入框中:0xced103054e349b8dfb51352f0f8fa9b5d20dde3d06f9f43cb2b85bc64b238205、10000000000000000000000、123456789(或您希望的 seed 是什么)。然后点击“Transact”!

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

交易完成后,我们需要等待 VRF 生成随机数并将其发送回我们的合约。几分钟后,单击我们在 Remix 中发送交易的橙色按钮下方的蓝色“ randomNumber”按钮,检查您的合约是否收到了随机数,如图 12 所示。

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

结 论

Chainlink 证明,现在智能合约中可以使用可验证的随机数。我们已经解释了该机制的工作原理,如何将代码集成到智能合约中以及如何使用 Remix IDE 检索随机数的演示。