我需要获取智能合约发出的事件并通过 web3 在前端使用它们。
我在合同上做了一些活动,返回活动获胜者和票号:
event Winner(uint256 ticketNumber, address winner);
所以我发出了这个事件,并且我在事务日志中看到了它。
来自 Etherscan:
好的!我需要的是数据:ticketNumber:1,获胜者:0x........ 我是怎么从 web3 得到这个的?
我正在尝试使用:
await web3.eth.getTransactionReceipt(txnHash, function (error, result) {
console.log(result);
});
但是当我检查控制台日志时,我看不到这些信息,我怀疑 result.logs.data 是正确的信息,但我不确定,而且我不知道如何翻译:
“0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000005964b608ea267bfe9ef77707fce8105a2 d145e7a"
有人有想法吗?
如果您阅读了docs,就会有
getPastEvents
方法。
myContract.getPastEvents('MyEvent', {
filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23
fromBlock: 0,
toBlock: 'latest'
}, function(error, events){ console.log(events); })
.then(function(events){
console.log(events) // same results as the optional callback above
});
您还可以创建事件监听器:
contract.events.Winner()
.on('data', (event) => {
console.log(event);
})
.on('error', console.error);
有关订阅活动
的文档如果您没有合约 ABI,您可以按照以下步骤检索事件,
第 1 步 - 使用
await web3.eth.getTransactionReceipt(txHash)
,如此处所示。logs
的对象。这将是一个对象数组,其长度等于该事务中发出的事件数。 data
和topic
。 data
字段将包含给定事件的所有未索引参数。要解码,您可以使用 web3.eth.abi.decodeLog(inputs, hexString, topics)
,如此处所示。topic
的第一个元素获取事件的名称。这里的第一个元素对应于事件签名的 keccak256。 web3.utils.sha3(string)
可用于对事件签名进行哈希处理,以检查 topics
数组的第一个条目是否匹配。更多信息这里。topics
数组的其余条目中找到它们。要将其转换为人类可读的形式,请按照与步骤 3 相同的步骤操作。