首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从web3py获取事件数据?

如何从web3py获取事件数据?
EN

Stack Overflow用户
提问于 2018-04-16 17:42:56
回答 2查看 5K关注 0票数 3
代码语言:javascript
复制
pragma solidity ^0.4.17

contract Test {
    event greeting(string name);
    function say() pure public {
        greeting('jack');
    }
}

在python版本web3.py中调用say()函数时,如何获取事件数据'jack‘?下面是我的python代码。

代码语言:javascript
复制
contractAddress = '0x345ca3e014aaf5dca488057592ee47305d9b3e10'
contract = w3.eth.contract(address=contractAddress, abi=abiJson['abi'])
accounts = w3.eth.accounts

def handle_event(event):
    print(event)

def log_loop(event_filter, poll_interval):
    while True:
        for event in event_filter.get_new_entries():
            handle_event(event)
            time.sleep(poll_interval)

block_filter = w3.eth.filter({'fromBlock':'latest', 'address':contractAddress})
log_loop(block_filter, 2)
EN

回答 2

Stack Overflow用户

发布于 2018-07-25 11:28:07

问题已经解决了,正确的代码应该如下所示:

代码语言:javascript
复制
contractAddress = '0x345ca3e014aaf5dca488057592ee47305d9b3e10'
contract = w3.eth.contract(address=contractAddress, abi=abiJson['abi'])
accounts = w3.eth.accounts

def handle_event(event):
    receipt = w3.eth.waitForTransactionReceipt(event['transactionHash'])
    result = contract.events.greeting.processReceipt(receipt)
    print(result[0]['args'])

def log_loop(event_filter, poll_interval):
    while True:
        for event in event_filter.get_new_entries():
            handle_event(event)
            time.sleep(poll_interval)

block_filter = w3.eth.filter({'fromBlock':'latest', 'address':contractAddress})
log_loop(block_filter, 2)
票数 3
EN

Stack Overflow用户

发布于 2021-04-25 20:56:18

我发现你的代码对了解如何提取事件的信息非常有帮助,但我遇到了一个问题。我把它写在这里,以防它能帮助任何人。

result = contract.events.greeting.processReceipt(receipt)抛出错误:_parse_logs() missing 1 required positional argument: 'errors'

在一些digging之后,它似乎是Web3py的一个限制,并且可以用之前的事件实例化来修复。因此,代码应该是:

代码语言:javascript
复制
contractAddress = '0x345ca3e014aaf5dca488057592ee47305d9b3e10'
contract = w3.eth.contract(address=contractAddress, abi=abiJson['abi'])
accounts = w3.eth.accounts
greeting_Event = contract.events.greeting() # Modification

def handle_event(event):
    receipt = w3.eth.waitForTransactionReceipt(event['transactionHash'])
    result = greeting_Event.processReceipt(receipt) # Modification
    print(result[0]['args'])

def log_loop(event_filter, poll_interval):
    while True:
        for event in event_filter.get_new_entries():
            handle_event(event)
            time.sleep(poll_interval)

block_filter = w3.eth.filter({'fromBlock':'latest', 'address':contractAddress})
log_loop(block_filter, 2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49854190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档