Chainlink VRF如何验证fulfillRandomness执行结果及本地单元测试方案
问题1:BSC测试网未触发RandomReturned事件排查方案
- 首先修正硬编码的VRF参数错误:你当前构造函数中传入VRFConsumerBase的Coordinator地址是以太坊Goerli测试网的地址,并不是BSC测试网的对应地址,BSC测试网VRF V1的Coordinator地址为
0x6A2AAd07396B36Fe02a22b33cf443582f682c82f;同时你使用的keyHash为Polygon测试网的参数,BSC测试网对应100gwei回调gas的keyHash为0xd4bb896547483e14202366a98c313ad8297c10306e526284d0cf96b26818a58b,参数不匹配会导致Chainlink节点不会响应你的随机数请求。 - 确认合约账户有足够的测试网LINK余额,单次请求需要0.1LINK,批量请求需要预留对应数量的LINK,余额不足会导致请求直接失败。
- 检查回调逻辑的执行异常:可以在BSC测试网浏览器查询VRF Coordinator合约调用你合约
fulfillRandomness的交易记录,若交易执行回滚,说明你未贴出的getTotalQtyToNumber、getNearestQtyCard等逻辑存在除零、数组越界、权限校验失败等问题,回调执行失败不会产生对应事件。
问题2:无需部署Chainlink节点的本地单元测试方案
- 采用官方Mock合约进行测试即可,无需接入真实Chainlink节点:
- 本地测试环境(Hardhat/Truffle)先部署Chainlink官方提供的VRF V1 Mock合约,模拟VRF Coordinator的功能。
- 部署你的
NFTFactory合约时,将Mock合约的地址作为Coordinator参数传入,LINK代币可使用通用的ERC20 Mock合约替代。 - 给
NFTFactory合约地址转入足够的Mock LINK,满足随机数请求的费用要求。 - 调用
create方法发起铸造请求,记录返回的requestId。 - 手动调用VRF Mock合约的回调方法,传入对应requestId和自定义的随机数,即可触发你合约的
fulfillRandomness逻辑执行。 - 校验事件是否正常触发、NFT属性是否符合预期即可完成测试,你还可以自定义不同的随机数值覆盖最小、最大、临界值等多种测试场景。
内容的提问来源于stack exchange,提问作者all-in-one
相关产品推荐
相关产品推荐

