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)发布于 2018-07-25 11:28:07
问题已经解决了,正确的代码应该如下所示:
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)发布于 2021-04-25 20:56:18
我发现你的代码对了解如何提取事件的信息非常有帮助,但我遇到了一个问题。我把它写在这里,以防它能帮助任何人。
行result = contract.events.greeting.processReceipt(receipt)抛出错误:_parse_logs() missing 1 required positional argument: 'errors'
在一些digging之后,它似乎是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)https://stackoverflow.com/questions/49854190
复制相似问题