部署Chainlink VRF游戏合约时subscriptionId值越界错误排查
问题:Chainlink VRF游戏合约部署时subscriptionId参数越界错误
部署本地Chainlink VRF游戏合约时,VRFCoordinatorV2Mock部署正常,但游戏合约抛出错误:
Error: value out-of-bounds (argument="subscriptionId", value="0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c", code=INVALID_ARGUMENT, version=abi/5.7.0)
核心原因:部署脚本参数顺序与合约构造函数不匹配
你的合约构造函数参数顺序为:
constructor( address vrfCoordinatorV2, uint64 subscriptionId, bytes32 gasLane, uint256 interval, uint32 callbackGasLimit )
但部署脚本中arguments数组的参数顺序完全错位:
const arguments = [ vrfCoordinatorV2Address, networkConfig[chainId]["gasLane"], // 错误将gasLane传入subscriptionId参数位 subscriptionId, networkConfig[chainId]["callbackGasLimit"], networkConfig[chainId]["keepersUpdateInterval"], ]
这导致uint64类型的subscriptionId参数位被传入了bytes32类型的gasLane(即错误信息中的超长十六进制值),触发了类型越界校验失败。
修复步骤
- 修正参数顺序:调整部署脚本的
arguments数组,严格对应合约构造函数的参数顺序:
const arguments = [ vrfCoordinatorV2Address, subscriptionId, // 正确放置subscriptionId到第二个参数位 networkConfig[chainId]["gasLane"], networkConfig[chainId]["keepersUpdateInterval"], // interval对应keepersUpdateInterval networkConfig[chainId]["callbackGasLimit"], ]
- 修正验证笔误:部署脚本中验证合约时误用了
raffle.address,需改为你的合约实例COCWeb3.address:
await verify(COCWeb3.address, arguments)
- 可选:显式转换subscriptionId类型:本地测试时,可将BigNumber类型的subscriptionId转换为uint64范围的值,避免潜在类型问题:
// 在获取subscriptionId后添加转换 subscriptionId = transactionReceipt.events[0].args.subId.toNumber()
验证修复
调整完成后重新部署,此时subscriptionId会正确传入合约的uint64参数位,gasLane也会对应到bytes32参数,不会再触发越界错误。
内容的提问来源于stack exchange,提问作者Ahmed Borwin
相关产品推荐
相关产品推荐

