如何在智能合约中使用 ANU 的量子随机数生成器
为了满足智能合约对随机性的需求,去中心化伪随机数生成器是一种常用的方法。
原文:A Guide to Using ANU’s Quantum Random Number Generator in Your Smart Contracts
作者:Vansh Wassan
原用标题(译后):指南:在智能合约中使用 ANU 的量子随机数生成器
编译:ChinaDeFi
随机数生成器 (RNG) 一直是使用智能合约时最大的问题之一。确定性虚拟机无法产生 “真正的” 随机性。
为了满足智能合约对随机性的需求,去中心化伪随机数生成器是一种常用的方法。最常用的方法之一是 Chainlink 的 VRF 或可验证随机函数,它在链上提供密码可证明的随机数。它生成一个链下随机数和用于验证结果的加密证明。
然而,这种配置与其他第三方预言机网络存在相同的问题。设置一个可以提供 PRNG 的预言机节点会暴露潜在的攻击载体,比如女巫攻击,也缺乏源透明性和去中心化。例如,需要信任治理实体来选择网络参与者,这意味着去中心化的 PRNG 只与治理实体一样安全和去中心化。
量子随机数生成
QRNG 通过量子现象产生随机性。它使用一个 “真正的” 熵源,利用量子物理的独特特性来产生真正的随机性。
实现 QRNG 的方法各不相同,但共同点是得到的数字将是真正随机的,因为量子事件的结果在理论上是不确定的。因此,QRNG 是随机数生成的黄金标准。
澳大利亚国立大学的 QRNG Airnode

正如我们已经讨论过的,通过第三方预言机网络提供 RNG 会为攻击载体打开大门。但是由 QRNG API 提供商直接运营的第一方预言机 (airnode) 会以最佳方式应对女巫攻击风险。
API3 QRNG 是澳大利亚国立大学 (ANU) 提供的公共实用程序。它由 ANU 量子随机数托管的 Airnode 提供动力,这也意味着它是第一方服务。澳大利亚国立大学的量子光学部是该领域世界领先的研究机构之一。该部门还运行一个 REST API,即量子随机数 API,以服务于 Web2 中的 QRNG。
它作为一种公共产品,所以也是免费的 (除了 gas 成本),当需要链上 RNG 时,它通过一个易于使用的解决方案提供了 “真正的” 量子随机性。
Airnode 和 API3 QRNG 是如何工作的?

首先,我们需要使用能够匹配上的赞助者钱包进行部署并赞助 QrngRequester。QrngRequester 将是检索随机数的主合约。
QrngRequester 向 AirnodeRrpV0 提交一个随机数请求。Airnode 从 AirnodeRrpV0 协议合约中收集请求,从链下检索随机数,并将其发送回 AirnodeRrpV0。一旦接收到,它将使用随机数执行回调到请求程序。
编码 QrngRequester.sol
开始
请确保已安装以下软件:
- Node.js
- yarn/NPM
另外,请确保已经克隆并安装了 Airnode Monorepo。如果还没有,用以下命令克隆 Airnode Monorepo:
$gitclonehttps://github.com/api3dao/airnode.git要安装依赖项,请执行以下步骤:
$ yarn run bootstrap要构建所有的包,使用这个命令:
$ yarn run build编制合约
为了编译 QrngRequester 合约,我们将使用 Remix IDE。它是一个在线 IDE,可以为与 EVM 兼容的区块链开发、部署和管理智能合约。
//SPDX-License-Identifier: MITpragma solidity 0.8.9;import "@api3/airnode-protocol/contracts/rrp/requesters/RrpRequesterV0.sol";contract RemixQrngExample is RrpRequesterV0 { event RequestedUint256(bytes32 indexed requestId); event ReceivedUint256(bytes32 indexed requestId, uint256 response); address public airnode; bytes32 public endpointIdUint256; address public sponsorWallet; mapping(bytes32 => bool) public waitingFulfillment; // These are for Remix demonstration purposes, their use is not practical. struct LatestRequest { bytes32 requestId; uint256 randomNumber; } LatestRequest public latestRequest; constructor(address _airnodeRrp) RrpRequesterV0(_airnodeRrp) {} // Normally, this function should be protected, as in: // require(msg.sender == owner, "Sender not owner"); function setRequestParameters( address _airnode, bytes32 _endpointIdUint256, address _sponsorWallet) external { airnode = _airnode; endpointIdUint256 = _endpointIdUint256; sponsorWallet = _sponsorWallet; } function makeRequestUint256() external { bytes32 requestId = airnodeRrp.makeFullRequest( airnode, endpointIdUint256, address(this), sponsorWallet, address(this), this.fulfillUint256.selector, "" ); waitingFulfillment[requestId] = true; latestRequest.requestId = requestId; latestRequest.randomNumber = 0; emit RequestedUint256(requestId); } function fulfillUint256(bytes32 requestId, bytes calldata data) external onlyAirnodeRrp{ require( waitingFulfillment[requestId], "Request ID not known" ); waitingFulfillment[requestId] = false; uint256 qrngUint256 = abi.decode(data, (uint256)); // Do what you want with `qrngUint256` here... latestRequest.randomNumber = qrngUint256; emit ReceivedUint256(requestId, qrngUint256); }}QrngRequester 有三个主要函数:setRequestParameters(), makeRequestUint256() 和 fulfillUint256()。
- setRequestParameters() 函数接受 airnode、endpointIdUint256、sponsorWallet 并设置这些参数。
- makeRequestUint256() 函数调用协议合约的 airnodeRrp.makeFullRequest() 函数,该函数将请求添加到其存储中并返回一个 requestId。
- 目标链下 ANU Airnode 收集请求并使用随机数向请求者执行回调。
请求参数
makeRequestUint256() 函数需要以下参数发出有效请求。
- airnode (地址) 和 endpointiduint256 指定端点。
- sponsorWallet 指定将使用哪个钱包来完成请求。
响应参数
对 QrngRequester 的回调包含两个参数:
- requestId:在发出请求时会被首次获取,并在这里作为参考传递,以识别响应所针对的请求。
- data:在成功响应的情况下,这是已被编码的请求数据,除了其他响应数据外,还包含时间戳。使用 abi 对象中的 Decode() 函数对其进行解码,以获得随机数。
转到 Remix IDE,创建一个合约,并将其粘贴到 QrngRequester 代码中。

现在,点击仪表板右侧的 compile 并编译智能合约。

部署合约
我们将把我们的 QrngRequester 部署到 Goerli。确保钱包中有足够的测试网 ETH 来部署合约,并在以后资助 sponsorWallet。

转到部署,运行交易,并在环境下选择 “Injected Provider — MetaMask” 选项。连接 MetaMask。确保是在 Goerli。
_rrpaddress 是主 airnodeRrpAddress。RRP 合约已经部署在链上。
填充_rrpAddress 之后,单击 “Deploy”。确认 MetaMask 上的交易,并等待它部署 Requester 合约。

确保是在 Goerli。
调用合约
当 QrngRequester 部署完成后,转到 Deploy,运行交易,然后单击已部署合约下的请求者并下拉列表。
现在选择 setRequestParameters 并下拉菜单来设置所有的参数。

将以下内容添加到函数的相应字段中。
- _airnode:所需 QRNG 服务提供者的 airnode 地址。从 ANU Airnode 查看它的值。
- _endpointIdUint256: Airnode 端点 ID 将返回一个随机数。从 ANU Airnode 查看它的值。
- _sponsorWallet:一个由请求者合约地址、Airnode 地址和 Airnode xpub 派生的钱包。这个钱包用来支付 gas 费用,以获得一个随机数。赞助者钱包必须使用命令 derived -sponsor-wallet-address 从 Admin CLI 中派生。使用命令输出的赞助者钱包地址的值。
在设置好 Airnode CLI,安装并构建所有依赖项和包之后,运行以下命令来派生自己的_sponsorWallet。
Linux
npx @api3/airnode-admin derive-sponsor-wallet-address \ --airnode-xpub xpub6CUGRUo... \ --airnode-address 0xe1...dF05s \--sponsor-address0xF4...dDyu9Windows
npx @api3/airnode-admin derive-sponsor-wallet-address ^ --airnode-xpub xpub6CUGRUo... ^ --airnode-address 0xe1...dF05s ^ --sponsor-address 0xF4...dDyu9用一些测试网 ETH 资助 sponsorWallet。单击交易按钮并确认交易以设置参数。

发出请求,单击 makeRequestUint256 按钮调用函数,并发出完整的请求。

现在可以前往并检查自己的新交易了。https://goerli.etherscan.io/sponsorWallet`
可能需要等待一段时间,因为 Airnode 调用 AirnodeRrpV0.sol 中的 fulfill() 函数,它将使用函数 fulfillment functionid 在 fulfillAddress 处回调请求者合约来传递数据 (随机数)。

在这里,我们可以看到最新的 fulfillment 交易。
现在回到 Remix 并点击 latestRequest 按钮检查响应。

如果回调已经成功完成,randomNumber 将会出现。waitingFulfillment 的值将为假。
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
您可能感兴趣
-
Ju.com 严选资产周报:优质代币逆势上行,精选体系展现韧性本周Ju.com严格筛选上线的优质代币在大盘低迷环境下展现出强劲韧性,其中MMT和UAI两大热门资产日均交易量位居前列,成为市场关注焦点。这一Market Insights分析将深入解读Ju.com优
-
0G 联合新加坡南洋理工大学推出 500 万新加坡元去中心化 AI 研究中心
合作将推动非传统 AI 系统的学术研究与基础设施融合。新加坡南洋理工大学 (NTU Singapore) 与去中心化 AI 基础设施公司 Zero Gravity (0G) 联手成立了一个价值 500
-
$PING 反弹 50%,速览基于 $PING 的发射台项目 c402.market
c402.market 在机制设计上更倾向于激励代币创建者,而不只是让铸造者和交易者受益。撰文:David,深潮 TechFlowx402 叙事火了半个月,但其中跑出的新资产并不多。究其原因,一是因为
-
加拿大取消燃料碳税,加密矿企迎来能源成本新博弈
对于高度依赖电力的加密矿企而言,这标志着一场更为复杂的成本博弈已正式拉开序幕。撰文:TaxDAO引言2025 年 4 月 1 日,加拿大联邦政府宣布正式取消针对燃料端的碳税,此举在能源、制造和加密挖矿
-
加密资本主义,AI 时代的加密
一人媒体公司,全民 Founder 时代。作者:佐爷What are you prepared to do?现在摆在我们目前的有两种未来,一种是蛛网资本主义,一种是加密资本主义。• 孙哥全球游走,谈论
-
万亿美元之争:马斯克与以太坊,谁该胜出?
马斯克的净资产将在 2035 年达到 1 万亿美元,超过以太坊、USDT、XRP 和 BNB 目前市值的总和。撰文:Liam Akiba Wright编译:Saoirse,Foresight News
-
1 个月后的 Fusaka 升级,以太坊迄今最大胆的扩容赌注
Fusaka 升级有望将以太坊的数据容量提升 8 倍,同时增强 DoS 防御能力并推出新的开发者工具。撰文:Jason Nelson编译:Luffy,Foresight News摘要以太坊将于 202
-
Solana Company ($HSDT) 掌门人朱俊伟 Joseph Chee:联手 Pantera 打造 DAT"SOL 将在未来六个月内有望突破 500 美元,并在下一轮牛市中挑战 1,000 美元关口。" Solana Company 执行主席 Joseph Chee 在最新一期东西方资本对话节目《168X
- 成交量排行
- 币种热搜榜
OFFICIAL TRUMP
Pepe
泰达币
比特币
以太坊
USD Coin
Solana
First Digital USD
瑞波币
大零币
币安币
莱特币
狗狗币
Filecoin
NEAR Protocol
ICP
AR
ZEN
OKB
ETC
BSV
EOS
XCH
DOT
MINA