如何获取交易收据事件日志?

问题描述 投票:0回答:2

我需要获取智能合约发出的事件并通过 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"

有人有想法吗?

javascript ethereum blockchain solidity smartcontracts
2个回答
4
投票

如果您阅读了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);

有关订阅活动

的文档

3
投票

如果您没有合约 ABI,您可以按照以下步骤检索事件,
第 1 步 - 使用

await web3.eth.getTransactionReceipt(txHash)
,如此处所示。
第 2 步 - 您将收到一个带有字段
logs
的对象。这将是一个对象数组,其长度等于该事务中发出的事件数。
步骤 3 - 在每个对象中都有两个对我们来说很重要的字段。
data
topic
data
字段将包含给定事件的所有未索引参数。要解码,您可以使用
web3.eth.abi.decodeLog(inputs, hexString, topics)
,如此处所示。
步骤 4 - 您可以从字段
topic
的第一个元素获取事件的名称。这里的第一个元素对应于事件签名的 keccak256。
web3.utils.sha3(string)
可用于对事件签名进行哈希处理,以检查
topics
数组的第一个条目是否匹配。更多信息这里
步骤 5 - 如果您的事件具有索引参数,则可以从
topics
数组的其余条目中找到它们。要将其转换为人类可读的形式,请按照与步骤 3 相同的步骤操作。

© www.soinside.com 2019 - 2024. All rights reserved.