
如何在智能合约中使用 ANU 的量子随机数生成器?
照片由 FLY:D 发布在 Unsplash 上
随机数生成器 (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 是如何工作的?
https://docs.api3.org/qrng/introduction/how-works.html
首先,我们需要使用能够匹配上的赞助者钱包进行部署并赞助 QrngRequester。QrngRequester 将是检索随机数的主合约。
QrngRequester 向 AirnodeRrpV0 提交一个随机数请求。Airnode 从 AirnodeRrpV0 协议合约中收集请求,从链下检索随机数,并将其发送回 AirnodeRrpV0。一旦接收到,它将使用随机数执行回调到请求程序。
编码 QrngRequester.sol开始
请确保已安装以下软件:
-
Node.js
-
yarn/NPM
另外,请确保已经克隆并安装了 Airnode Monorepo。如果还没有,用以下命令克隆 Airnode Monorepo:
$ git clone https://github.com/api3dao/airnode.git
要安装依赖项,请执行以下步骤:
$ yarn run bootstrap
要构建所有的包,使用这个命令:
$ yarn run build
编制合约
为了编译 QrngRequester 合约,我们将使用 Remix IDE。它是一个在线 IDE,可以为与 EVM 兼容的区块链开发、部署和管理智能合约。
//SPDX-License-Identifier: MIT
pragma 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-address 0xF4…dDyu9
Windows
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 的值将为假。
比推快讯
更多 >>- Cantor Fitzgerald 重申对 Coinbase 股票“增持”评级,并将其 12 个月目标价上调至 292 美元
- 美CFTC:截至2025年6月10日止的一周,比特币净空头仓位为-2,009份合约
- 10x Research 创始人:比特币若跌破 10 万美元关键支撑,或重陷去年夏季的广泛盘整阶段
- 加密市场24小时爆仓额超过11亿美元,多单为主
- 美股持续下跌,道琼斯指数跌幅扩大至2.00%
- VanEck高管:低市值公司声称买入 XRP 或 SOL 的计划可能是“骗局”
- DRW Investments:看到了在公司资产负债表上持有比特币的好处
- Cardano 社区对拟议的 1 亿美元拨款支持稳定币流动性存在分歧
- Alameda Research 将价值 1030 万美元的质押 SOL 转移至 30 个地址,仍持有近 8 亿美元的 SOL
- NEAR 协议月活用户达 4600 万,为 L1 区块链中第二高
- Andrew Kang:比特币或将持续震荡上行,短期难现 30%以上回调
- 印度官员:税务部门正在调查加密货币逃税问题
- 两名加密资产专家加入美 SEC 领导层,或对数字资产采取更友好态度
- 以色列总理:袭击伊朗前已告知美方,把“决定权”交给特朗普
- Base 负责人:Coinbase 将可交易 Base 链上的所有资产
- 分析:比特币需站稳 10 万美元上方才能维持上涨趋势
- 以色列国防军开始向全国所有战斗区域调动预备役人员
- Gotbit 创始人 Aleksei Andriunin 因市场操纵罪获刑 8 个月
- 特朗普:伊朗官员正与他我联系,讨论当前局势
- 联合国安理会将于凌晨 3 点就以色列伊朗局势举行公开会
- 关税担忧缓解,美国通胀预期降至三个月来新低
- 美国 6 月一年期通胀率预期初值 5.1%,预期 6.4%
- Invesco Galaxy Solana ETF 已在特拉华州注册
- 摩根大通上调多家比特币矿企目标价
- 美股开盘,纳指跌 1.06%
- Virtual 团队成员确认 Virgen Points 出现漏洞,约 6% 钱包受影响
- 特朗普:以色列袭击利好市场,因为伊朗无法获得核武器
- MicroStrategy 高管增持 130 万美元优先股
- Cardano 创始人提议将价值 1 亿美元 ADA 兑换成 BTC 与稳定币
- 某巨鲸花费 964 万美元买入 3810 枚 ETH
- 高盛:仍预期黄金年底达到 3700 美元
- Sentora:本周价值超 24 亿美元的比特币流入交易平台
- 分析师:美元从避险资金流动中获益的能力可能有限
- 彭博策略师:比特币与黄金比率或预示风险资产年内见底
- 巴西上市公司 Méliuz 筹集 3250 万美元增持比特币
- SharpLink Gaming 花费 4.63 亿美元买入 ETH
- 冒险岛负责人:将加强反作弊系统,推迟抽奖奖励发放以遏制滥用行为
- a16z 领投 Yupp 的 3300 万美元种子轮,打造去中心化 AI 评估平台
- 美联储 6 月维持利率不变的概率为 96.9%
- 消息人士:以色列对伊行动可能持续两周以上
- 某鲸鱼向 Hyperliquid 存入 400 万枚 USDC,并开设 POPCAT、PEPE 等山寨币多头仓位
- 山寨币季节指数降至 25
- 以色列将关闭全球使领馆
- 中东紧张局势加剧,黄金期货或挑战纪录高位
- 伊朗总统:让以色列为其愚蠢的行为感到后悔
- 受比特币跌势影响,美股加密板块盘前普跌
- 恐慌指数 VIX 升至最高 22 点,为三周以来的最高水平
- 美联储的新利率预测有可能影响市场
- 数据:巨鲸 40 倍杠杆做空 BTC,浮盈 517 万美元
- 分析:地缘政治紧张局势下,美元仍是安全的避风港
比推专栏
更多 >>观点
比推热门文章
- Cantor Fitzgerald 重申对 Coinbase 股票“增持”评级,并将其 12 个月目标价上调至 292 美元
- 美CFTC:截至2025年6月10日止的一周,比特币净空头仓位为-2,009份合约
- 10x Research 创始人:比特币若跌破 10 万美元关键支撑,或重陷去年夏季的广泛盘整阶段
- 加密市场24小时爆仓额超过11亿美元,多单为主
- 美股持续下跌,道琼斯指数跌幅扩大至2.00%
- 花1亿美元买教训后,XRP的翻身试验
- VanEck高管:低市值公司声称买入 XRP 或 SOL 的计划可能是“骗局”
- DRW Investments:看到了在公司资产负债表上持有比特币的好处
- VanEck投资经理:CMC上99.9%的代币是垃圾,未来趋势是代币化股票
- Cardano 社区对拟议的 1 亿美元拨款支持稳定币流动性存在分歧