web3.eth.abi.decodeLog возвращает неверные значения параметров журнала - PullRequest
0 голосов
/ 11 мая 2018

У меня есть контракт Ethereum с событием, определенным так:

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 для event Apple определенно неверно.

Кто-нибудь сталкивался с этим раньше?

Я использую web3 1.0.0-beta.33

1 Ответ

0 голосов
/ 14 июня 2018

После более тщательного изучения документов web3 я понял, что при использовании decodeLog нельзя передавать закодированное имя события в массиве тем. Я считаю, что неанонимные события имеют имя события в качестве первого элемента в массиве тем.

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

themes - 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))
...