web3.eth.abi.decodeLog返回不正确的日志参数值

时间:2018-05-11 00:27:01

标签: ethereum solidity web3

我有一个以太坊合同,其事件定义如下:

event Apple(address indexed a, address b, address c);

事件被触发,我可以看到交易收据中的日志。

通过web3,当我尝试从收据中解析日志时,我能够检索事件参数,但看起来a的值始终是相同的。

// compiled is the built contract. address is the contract address
const contract = new web3.eth.Contract(compiled.abi, address)

const eventJsonInterface = _.find(
  contract._jsonInterface,
  o => o.name === 'Apple' && o.type === 'event',
)

const log = _.find(
    receipt.logs,
    l => l.topics.includes(eventJsonInterface.signature)
)

web3.eth.abi.decodeLog(eventJsonInterface.inputs, log.data, log.topics)

我最终得到的是:

Result {
  '0': '0x42087b16F33E688a9e73BFeef94F8F2bd2BfC98f',
  '1': '0xfc36bFe712f30F75DF0BA9A60A109Ad51ac7Ca38',
  '2': '0x6915d2f3D512F7CfEF968f653D1cA3ed4489798C',
  __length__: 3,
  a: '0x42087b16F33E688a9e73BFeef94F8F2bd2BfC98f',
  b: '0xfc36bFe712f30F75DF0BA9A60A109Ad51ac7Ca38',
  c: '0x6915d2f3D512F7CfEF968f653D1cA3ed4489798C' }

其中a始终是触发事件的相同地址。我正在为每笔交易生成一份新合约,而a是这份新合约的地址(我已经通过从生成的合约中触发一个单独的事件来验证其是正确的,该合同也会发出a的值),a event Apple的解析值绝对不正确。

有没有人遇到过这个?

我正在使用web3 1.0.0-beta.33

1 个答案:

答案 0 :(得分:1)

在更仔细地查看web3文档之后,我意识到当您使用decodeLog时,您不能在主题数组中传递事件的编码名称。我相信非匿名事件将事件名称作为topics数组中的第一项。

来自https://web3js.readthedocs.io/en/1.0/web3-eth-abi.html#decodelog

  

topics - Array:包含日志索引参数主题的数组,   没有主题[0]如果它是非匿名事件,否则使用   主题[0]。

听起来传递的主题应仅引用索引参数。切片主题[0]后,我开始得到正确的结果。

// compiled is the built contract. address is the contract address
const contract = new web3.eth.Contract(compiled.abi, address)

const eventJsonInterface = _.find(
  contract._jsonInterface,
  o => o.name === 'Apple' && o.type === 'event',
)

const log = _.find(
  receipt.logs,
  l => l.topics.includes(eventJsonInterface.signature)
)

web3.eth.abi.decodeLog(eventJsonInterface.inputs, log.data, log.topics.slice(1))