本文详细介绍了如何在BuildBear Sandbox中集成Chainlink的验证随机函数(VRF),为智能合约和去中心化应用程序请求和检索随机数字。内容涵盖了插件的主要特点、安装过程、订阅创建、资金支持以及部署消费者合约的步骤,适合需要实现随机性功能的开发者使用。
Chainlink 可验证随机函数(VRF)是为智能合约设计的随机数生成器。开发人员可以在 BuildBear Sandbox 上使用 Chainlink VRF 构建和测试依赖于不可预测结果的去中心化应用程序,例如游戏或彩票系统。
在本指南中,你将学习如何通过无缝集成 Chainlink VRF 到 BuildBear Sandbox 中,来请求和获取用于你的智能合约和 dApp 的随机单词。
BuildBear Chainlink VRF 插件让你可以将 Chainlink VRF 集成到你的开发工作流程中,以请求和管理你智能合约和 dApp 的随机数。
在本教程中,我们将使用一个示例消费者合约,该合约请求随机单词并使用 Chainlink VRF 接收随机单词。消费者合约应与 Chainlink VRF v2.5 兼容。
通过这个插件,我们将在沙盒模式中使用我们的智能合约 / dApp,方式与在主网上使用智能合约 / dApp 完全相同,并且你的脚本测试中没有使用任何模拟值。
如果你是 BuildBear 的新用户,请参考我们的全面文档以注册并创建你的沙盒 在这里。请访问 这里 创建一个新的沙盒。
要在你的沙盒中安装 Chainlink VRF 插件,请转到仪表板,选择“插件”选项,然后从可用列表中选择 Chainlink VRF 插件。
(A) 订阅
可以使用现有的订阅或设置新的订阅。BuildBear 支持 Chainlink VRF 订阅方法来创建新订阅。
要创建新的订阅,请在你的沙盒中调用 VRF 协调器合约 的 createSubscription()
,并获得一个订阅 ID。请使用下面的脚本代码:
// 创建订阅
console.log("[Coordinator] 创建订阅...");
const subsTx = await vrfCoordinator.connect(signer).createSubscription();
const subRecipt = await subsTx.wait();
console.log({ createSubTxnHash: subsTx.hash });
你也可以通过调用 createSubscription
函数从 BuildBear Explorer 中执行相同的操作。
如果你有现有的 Chainlink VRF 订阅,只需在下面的脚本中传递订阅 ID。这允许你使用现有订阅从消费者合约请求随机单词。
// 使用现有订阅
console.log("[Coordinator] 使用现有订阅...");
const subId = ""// 在这里插入你的订阅 ID
console.log({subId});
(B) 资助订阅
在请求 Chainlink VRF 的随机数之前,你需要通过 LINK
代币为你的订阅提供资金。如果订阅在主网上已资助,则你的智能合约调用将在 BuildBear 沙盒中正常工作(即,它们的功能完全与在主网上相同)。如果订阅尚未资助,你可以使用 LINK
代币以与在主网上完全相同的方式为订阅提供资金。但是,你可以使用 BuildBear Faucet 来轻松获得 LINK
代币。
一旦你在钱包地址中拥有 LINK
代币,你必须在 LINK Token Contract
中调用 transferAndCall
函数。请注意关于 transferAndCall
函数参数的以下几点:
(1) value
应为 Juel,这是 LINK 的最小面额和
(2) data
必须是以 ABI 格式编码的订阅 ID(subId
)。
为了你的方便,你可以使用以下脚本来编码你的 subId
并用实际的 LINK 资助订阅:
//@ts-ignore
const subId = // 在这里插入你的订阅 ID
const abiCoder = new ethers.AbiCoder();
const encodedSubId = abiCoder.encode(["uint256"], [subId]);
console.log({ subId, encodedSubId });
const linkToken = await ethers.getContractAt(
"LinkTokenInterface",
linkTokenAddr
);
const value = 50;
console.log(`正在转移 ${value} LINK 到订阅...`);
const linkTxn = await linkToken
.connect(user)
.transferAndCall(mainnetVRFCoordinatorAddr, BigInt(value * 1e18), encodedSubId);
await linkTxn.wait();
使用新创建的订阅 ID、VRF 协调器地址和密钥哈希部署消费者合约(请确保根据网络更改 VRF 协调器地址和密钥哈希值。你可以在 这里 找到支持的网络、相应的 VRF 协调器地址及其密钥哈希值)。出于本教程的目的,我们将使用以太坊主网。
参考完整示例 仓库 和 脚本 以请sum-check随机单词。
const consumerMock = await ethers.deployContract(
"RandomNumberConsumerV2_5",
[\
subId,\
mainnetVRFCoordinatorAddr, // 根据你的网络插入 VRF 协调器地址\
"0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae",\
],
user
);
await consumerMock.waitForDeployment();
console.log(`VRF 消费者模拟合约部署到 ${consumerMock.target}`);
const consumerAddr = consumerMock.target;
在部署消费者合约后,接下来的步骤是将合约添加到协调器合约,请求消费者合约的随机单词,最后满足并验证随机单词。
此步骤对于将消费者合约注册到协调器以请求随机单词至关重要。
const addCosumerTx = await updatedCoordinator
.connect(user)
.addConsumer(subId, consumerAddr);
await addCosumerTx.wait();
在这里,我们通过调用消费者合约上的 requestRandomWords()
函数请求随机数。
const requestRandomnessTx = await consumerMock
.connect(user)
.requestRandomWords();
await requestRandomnessTx.wait();
const reqId = await consumerMock.connect(user).s_requestId();
console.log({ reqId });
自动满足随机单词并在无需任何额外步骤的情况下检索它们。以下是获取随机单词的脚本:
// 检查随机单词
console.log("[Consumer] 检查随机单词...");
let randomWord = await consumerMock.connect(user).s_randomWords(0);
console.log({ randomWord });
randomWord = await consumerMock.connect(user).s_randomWords(1);
console.log({ randomWord });
随机单词成功输出如下所示:
按照上述步骤,在 BuildBear Sandbox 中轻松集成 Chainlink VRF,以在你的合约中获取随机单词。安装 Chainlink 插件以构建和测试需要随机性的 web3 创新应用程序,确保在主网部署前的可用性。
BuildBear 是一个专为 DApp 开发和测试量身定制的平台。开发者可以在各种区块链网络上构建个性化的私有测试沙盒。生成无限的原生和 ERC20 代币的自由,以及在 BuildBear 上快速的交易时间(少于 3 秒!),大大提升了 DApp 开发周期。该平台配备了实时测试和调试的工具和插件,确保开发人员能够以无与伦比的轻松跟踪复杂的区块链交易。
与我们联系 Twitter | LinkedIn | Telegram | GitHub
- 原文链接: medium.com/buildbear/how...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!