chainlink VRF中文教程(含mock),解決error: Arithmetic Underflow in createSubscription

?

我使用的版本:chainlink-brownie-contracts version:1.3.0

?

1. Import 相關包
,,,
import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol";
import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol";
,,,

?

2. 要使用的VRF功能的 contract 繼承 VRFConsumerBaseV2Plus
,,,
contract EnterDungeon is VRFConsumerBaseV2Plus{}
,,,

?

3. 在contract中 聲明下列VRF狀態變量
,,,
// Chainlink VRF Variables
uint256 private immutable i_subscriptionId;
bytes32 private immutable i_gasLane; // keyHash
uint32 private immutable i_callbackGasLimit;
uint16 private constant REQUEST_CONFIRMATIONS = 3;
uint32 private constant NUM_WORDS = 1;
bool private s_enableNativePayment; // true:ETH, false:LINK
,,,

?

4. 重構你的 contract 的 constructor
,,,
constructor(address _vrfCoordinator, uint256 _subscriptionId, bytes32 _gasLane, uint32 _callbackGasLimit) VRFConsumerBaseV2Plus(_vrfCoordinator) {
i_subscriptionId = _subscriptionId;
i_gasLane = _gasLane;
i_callbackGasLimit = _callbackGasLimit;
}
,,,

?

5. 實現 requestRandomNumber(),用來封裝隨機數請求的邏輯
,,,
/**
* @notice requestRandomNumber
* @dev 自己定義的一個函數,可以叫做任何名字,只是單獨封裝了VRF請求隨機數的邏輯
* @return requestId
*/
function requestRandomNumber() public returns (uint256 requestId) {
requestId = s_vrfCoordinator.requestRandomWords(
VRFV2PlusClient.RandomWordsRequest({
keyHash: i_gasLane,
subId: i_subscriptionId,
requestConfirmations: REQUEST_CONFIRMATIONS,
callbackGasLimit: i_callbackGasLimit,
numWords: NUM_WORDS,
extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: s_enableNativePayment}))
})
);
}
,,,

?

6. 重寫 fulfillRandomWords() 里面寫你具體的業務邏輯
,,,
/**
* @notice fulfillRandomWords
* @dev 當VRF請求隨機數成功后,會調用這個函數,里面是拿到隨機數后的具體處理邏輯
* ? ? ?調用者是 VRF Coordinator,要使用requestId映射playerAddress
* @param ?requestId 請求ID
* @param randomWords 隨機數
*/
function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) internal override {
// TODO:
}
,,,

?

7. 本地 Mock 測試

7.1 導入 Mock 合約
,,,
import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol";
,,,

7.2 部署 Mock 合約
,,,
// 1. deploy vrfCoordinatorV2_5Mock
vrfCoordinatorV2_5Mock = new VRFCoordinatorV2_5Mock(
MOCK_BASE_FEE,
MOCK_GAS_PRICE_LINK,
MOCK_WEI_PER_UINT_LINK
);

? ? ? ? // 2. create subscription
uint256 subscriptionId = vrfCoordinatorV2_5Mock.createSubscription();

? ? ? ? // 3. fund subscription
vrfCoordinatorV2_5Mock.fundSubscription(subscriptionId, FUND_LINK_AMOUNT);?
// FUND_LINK_AMOUNT = 100000000000000000000 = 100 LINK

? ? ? ? // 4. add consumer
vrfCoordinatorV2_5Mock.addConsumer(chainConfig.subscriptionId, address(consumer_addr));
,,,


7.3 常見報錯 & 解決

報錯信息?? ?原因?? ?解決辦法
Arithmetic underflow in createSubscription()?? ?mock 里用 blockhash(block.number - 1),而本地鏈把前一區塊 hash 置 0?? ?把內部實現改成 blockhash(block.number)(已在下方補丁)

錯誤信息:

VRFCoordinatorV2_5Mock::createSubscription()
│ └─ ← [Revert] panic: arithmetic underflow or overflow (0x11)
└─ ← [Revert] panic: arithmetic underflow or overflow (0x11)

補丁示例:

// SubscriptionApi.sol 片段
subId = uint256(
keccak256(
abi.encodePacked(
msg.sender,
blockhash(block.number), // ← 修改
address(this),
s_currentSubNonce
)
)
);


?

🔗 線上部署別忘記

在 [Chainlink-VRF-UI](https://vrf.chain.link/) 手動 Add Consumer,否則主網請求將被拒絕。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89915.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

非線性優化框架CasADi工具箱求解最優控制問題OCP

CasADi是一個開源的Python/MATLAB庫,主要用于數值優化,特別是最優控制問題。它提供了一個易于使用的符號框架,用于處理和生成表達式,以及高效地生成導數信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口臺式顯示器:LDR6021引領新潮流

Type-C單口便攜顯示器LDR6021是市場上一種新興的顯示設備,以下是對其的詳細介紹一、主要特點 便攜性:LDR6021采用了Type-C接口作為數據傳輸和供電接口,這種設計使得它能夠與各種支持Type-C接口的設備無縫連接,如筆記本電腦、智能手機、平板電…

在翻譯語義相似度和會議摘要相似度評估任務中 ,分類任務 回歸任務 生成任務區別

在翻譯語義相似度(Translation Semantic Similarity)和會議摘要相似度(Meeting Summary Similarity)等任務中,通常會根據任務的目標和輸出形式,將其劃分為三類常見的任務類型:1. 分類任務定義&a…

UGUI 性能優化系列:第二篇——Canvas 與 UI 元素管理

UGUI 性能優化系列:第一篇——基礎優化與資源管理 UGUI 性能優化系列:第二篇——Canvas 與 UI 元素管理 UGUI 性能優化系列:第三篇——渲染與像素填充率優化 UGUI 性能優化系列:第四篇——高級優化與注意事項 在 UGUI 性能優化…

企業開發轉型 | 前端AI化數字化自動化現狀

文章目錄前端AI化數字化自動化發展現狀引言調研背景與目的調研范圍與方法前端AI化技術現狀與工具生態主流AI工具分類與能力矩陣工具能力對比分析關鍵能力指標深度解析大模型技術成熟度評估前端AI化核心應用場景與人力優化路徑代碼生成與自動化開發設計到代碼全鏈路自動化自動化…

Mysql(運維-日志)

黑馬mysql筆記 最好開兩個窗口,一個用于mysql命令,一個用于liunx命令 目錄 錯誤日志 二進制日志 介紹 日志格式 mysq默認二進制日志文件為ROW 日志查看 二進制日志查看命令 默認日志文件格式下查看日志內容 更改日志文件格式查看日志內容 日志…

RabbitMQ:解鎖高效消息傳遞的密碼[特殊字符]

目錄 一、RabbitMQ 核心概念 1.1整體框架 1.2元素詳解 1.2.1 生產者(Producer)&消費者(Consumer) 1.2.2 交換機(Exchange) ①fanout (廣播型) ②direct (直連型…

StarRocks × MinIO:打造靈活高效的存算分離方案

“存算分離”(Decoupled Storage and Compute)是一種在現代數據系統中被廣泛采用的架構設計。它將計算和存儲解耦,使二者可以獨立擴展,提升資源利用率并降低運維成本。StarRocks 從 3.0 版本開始支持這一架構,允許用戶…

R語言的分位數回歸實踐技術高級應用

回歸是科研中最常見的統計學研究方法之一,在研究變量間關系方面有著極其廣泛的應用。由于其基本假設的限制,包括線性回歸及廣義線性回歸在內的各種常見的回歸方法都有三個重大缺陷:(1)對于異常值非常敏感,極少量的異常值可能導致結…

Tomcat的部署、單體架構、session會話、spring

一、Tomcat的部署①②③④⑤二.web項目在tomcat服務中如何運行:1.web項目源碼部署在服務器的webapps目錄里面2.將web項目打包(war),部署在服務器的webapps目錄里面。三 單體架構和前后端分離單體架構是將所有功能模塊(包括前端界面、后端邏輯、數據庫交互…

海康威視視覺算法崗位30問及詳解

海康威視視覺算法崗位30問及詳解 前言 視覺算法工程師是人工智能領域的熱門崗位,尤其在安防、自動駕駛、工業檢測等行業有著廣泛應用。海康威視作為行業龍頭,對視覺算法崗位的要求較高,面試問題既考察基礎理論,也關注工程實現。本…

14.7 Alpaca格式深度解析:3倍指令準確率提升的LLM微調秘訣

文章目錄 Alpaca格式深度解析:3倍指令準確率提升的LLM微調秘訣 指令微調格式:Alpaca Format 深度解析 14.3.1 Alpaca 格式誕生背景與技術價值 14.3.2 Alpaca 格式結構解析 14.3.3 實戰 Dolly-15K 數據轉 Alpaca 格式 14.3.4 Alpaca 格式的工程化實踐 14.3.5 格式擴展與挑戰應…

42.sentinel實現線程隔離

線程隔離有兩種實現方式: 1.線程池隔離 優點: 1.支持主動超時,線程池中的線程都是可控的,可以停掉某個線程。 2.支持異步調用,每個請求都是一個獨立的線程,線程之間不受影響。 缺點: 線程的額外開銷比較大 適用場景: 低扇出(一個微服務,不會依賴很多微服務)…

【過擬合和欠擬合】——深度學習.全連接神經網絡

目錄 1 概念認知 1.1 過擬合 1.2 欠擬合 1.3 如何判斷 2 解決欠擬合 3 解決過擬合 3.1 L2正則化 3.1.1 數學表示 3.1.2 梯度更新 3.1.3 作用 3.1.4 代碼實現 3.2 L1正則化 3.2.1 數學表示 3.2.2 梯度更新 3.2.3 作用 3.2.4 與L2對比 3.2.5 代碼實現 3.3 Drop…

Java設計模式之行為型模式(備忘錄模式)應用場景分析

最近看到一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站 一、用戶交互與編輯操作 文本編輯器撤銷/重做 場景描述:用戶編輯文檔時,可通過CtrlZ撤銷誤操作,或通過Ctr…

5.Java的4個權限修飾符

1.private(私有訪問權限)最嚴格的訪問修飾符,它限定被修飾的成員僅能在聲明它的當前類內部訪問。其他任何外部類都無法直接訪問該成員。作用:強制封裝,確保類內部實現細節的隱藏性和數據安全性2.默認權限(包…

Linux入門介紹

目錄 一、環境 二、Linux發展歷史 1、計算機 2、操作系統 四、認識Linux的 內核版本名稱 一、環境 一般是Centos 7 Ubuntu 20.04 / 22.04 前者已經停止更新與維護,但很多公司還在使用前者 二、Linux發展歷史 1、計算機 1945年 2.14---埃尼阿克---軍事用處&…

spring boot2升級boot3

spring boot2升級boot3 整體流程如下 1、借助于開源的自動化代碼重構工具OpenRewrite,快速地進行代碼重構等 2、相關坐標升級更改 3、配置文件屬性更改 4、打包、構建與運行驗證 1. 前期準備工作第一步:確保升級之前項目是可編譯運行的第二步&#xff1a…

mac終端設置代理

在Mac上配置終端走代理,需設置終端(如zsh或bash)使用HTTP/HTTPS/SOCKS代理,以便命令行工具(如curl、git、npm)通過代理訪問網絡。以下是詳細步驟,適用于macOS 10.15及以上版本。 前提條件 代理服…

VSTO Excel中打開WinForm.ShowDialog()后,如果要使用當前的wb.Application在后臺操作其他Excel文件(保持隱藏狀態)

在VSTO Excel中打開WinForm.ShowDialog()后,如果要使用當前的wb.Application在后臺操作其他Excel文件(保持隱藏狀態),可以通過以下幾種方式實現: 方法一:設置Application屬性控制可見性 // 在WinForm中獲取…