[英]how to get event data from web3py?
pragma solidity ^0.4.17
contract Test {
event greeting(string name);
function say() pure public {
greeting('jack');
}
}
python版本web3.py中调用say()函数时如何获取事件数据“jack”? 下面是我的python代码。
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)
问题已经解决,正确的代码应该如下所示:
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)
我发现您的代码对于了解如何提取事件信息非常有帮助,但我遇到了一个问题。 我会把它写在这里以防万一它可以帮助任何人。
行result = contract.events.greeting.processReceipt(receipt)
抛出错误: _parse_logs() missing 1 required positional argument: 'errors'
经过一番挖掘,它似乎是 Web3py 的一个限制,它可以通过事件的先前实例化来修复。 所以,代码将是:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.