本地使用Brownie操作VRFCoordinatorV2_5Mock创建订阅时遇AttributeError问题求助
本地使用Brownie操作VRFCoordinatorV2_5Mock创建订阅时遇AttributeError问题求助
嘿,我来帮你搞定这个问题!你碰到的AttributeError其实是个很常见的小失误——你直接调用了合约容器(ContractContainer)也就是VRFCoordinatorV2_5Mock这个类本身的方法,而不是用已经部署到本地链的合约实例来调用。咱们一步步拆解解决:
1. 先搞清楚核心问题:用实例而非类调用方法
VRFCoordinatorV2_5Mock是Brownie的合约容器类,用来部署合约;只有部署完成后生成的合约实例,才拥有合约里的createSubscription等方法。你得先确保已经部署了这个Mock合约,再获取它的实例来操作。
2. 修正代码,正确创建订阅
先调整你的end_lottery函数,改用部署好的Mock实例:
def end_lottery(): account = get_account() lottery = Lottery[-1] # 获取最新部署的VRFCoordinatorV2_5Mock实例,而不是用类本身 mock_vrf = VRFCoordinatorV2_5Mock[-1] # 调用实例的createSubscription方法,发起交易 tx = mock_vrf.createSubscription({"from": account}) # 注意:createSubscription不会直接返回subId,要从交易触发的事件里提取 subId = tx.events["SubscriptionCreated"]["subId"] print(f"成功创建订阅,ID是: {subId}") return subId
3. 资助你的订阅(本地测试用ETH即可)
VRFCoordinatorV2_5支持用ETH或LINK资助订阅,本地测试用ETH更简单,直接调用fundSubscription方法就行:
def fund_subscription(subId): account = get_account() mock_vrf = VRFCoordinatorV2_5Mock[-1] # 这里转1 ETH作为资助金额(单位是wei) tx = mock_vrf.fundSubscription( subId, "1000000000000000000", {"from": account} ) tx.wait(1) print(f"订阅ID {subId} 已完成资助!")
4. 别忘了把Lottery合约加入订阅消费者列表
最后必须把你的Lottery合约地址添加到订阅的消费者里,不然VRF没法给它返回随机数:
def add_lottery_to_sub(subId): account = get_account() lottery = Lottery[-1] mock_vrf = VRFCoordinatorV2_5Mock[-1] tx = mock_vrf.addConsumer( subId, lottery.address, {"from": account} ) tx.wait(1) print(f"Lottery合约已成功加入订阅 {subId} 的消费者列表!")
额外提醒
如果还没部署VRFCoordinatorV2_5Mock,先写个部署脚本:
def deploy_vrf_mock(): account = get_account() # 部署Mock,参数分别是base fee和gas price link(本地测试随便填就行) mock_vrf = VRFCoordinatorV2_5Mock.deploy( 100000000000000000, 1000000000, {"from": account} ) print(f"VRFCoordinatorV2_5Mock已部署,地址: {mock_vrf.address}") return mock_vrf
备注:内容来源于stack exchange,提问作者Eduardo Ruiz
相关产品推荐
相关产品推荐

