https://www.npmjs.com/package/eth-log-parser

const parseLog = require('eth-log-parser');
 
// ERC20 Transfer log
const log = {
  address: '0xefE1e4e13F9ED8399eE8e258b3a1717b7D15f054',
  blockHash: '0xde42b82c4e28122218d79f8491b05587608a8c9bb87c0d0df9be9fb9ae6f7e13',
  blockNumber: 6596988,
  data: '0x0000000000000000000000000000000000000000000000056bc75e2d63100000',
  logIndex: 11,
  removed: false,
  topics: [
    '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
    '0x000000000000000000000000343c6a169d973bbf33a8f1535754a4745a3bd9c1',
    '0x00000000000000000000000078a3339ad6a565b4136077c8878970d7f1b66021'
  ],
  transactionHash: '0x686943cee4035375b25209a2972535c93eefb688fad42d72e518c452387c69c9',
  transactionIndex: 10,
  id: 'log_797f3ed3'
};
 
const ERC20_ABI = /* ABI for ERC20 token contract */;
 
const parsedLog = parseLog(log, ERC20_ABI);
 
console.log(parsedLog);
 
/*
{
  event: 'Transfer',
  signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
  address: '0xefE1e4e13F9ED8399eE8e258b3a1717b7D15f054',
  blockHash: '0xde42b82c4e28122218d79f8491b05587608a8c9bb87c0d0df9be9fb9ae6f7e13',
  blockNumber: 6596988,
  transactionHash: '0x686943cee4035375b25209a2972535c93eefb688fad42d72e518c452387c69c9',
  transactionIndex: 10,
  logIndex: 11,
  raw: {
    data: '0x0000000000000000000000000000000000000000000000056bc75e2d63100000',
    topics: [
      '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
      '0x000000000000000000000000343c6a169d973bbf33a8f1535754a4745a3bd9c1',
      '0x00000000000000000000000078a3339ad6a565b4136077c8878970d7f1b66021'
    ]
  },
  returnValues: {
    from: '0x343c6A169D973bBF33A8F1535754A4745a3BD9C1',
    to: '0x78a3339aD6A565B4136077C8878970D7f1B66021',
    value: '100000000000000000000'
  }
}
*/

eth-log-parser 实现原理

'use strict';
const AbiCoder = require('web3-eth-abi');

exports.parse = (log, abi) => {
  const events = abi.filter(e => e.type === 'event' && e.anonymous === false);
  const signature = log.topics[0];
  const event = events.find(e => AbiCoder.encodeEventSignature(e) === signature);

  if (!event) {
    throw Error('Cannot parse unknown event');
  }

  const rawReturnValues = AbiCoder.decodeLog(event.inputs, log.data, log.topics.slice(1));
  const returnValues = Object.keys(rawReturnValues)
    .filter(key => isNaN(key) && key !== '__length__')
    .reduce((obj, key) => ({ ...obj, [key]: rawReturnValues[key] }), {});

  return {
    event: event.name,
    signature: signature,
    address: log.address,
    blockHash: log.blockHash,
    blockNumber: log.blockNumber,
    transactionHash: log.transactionHash,
    transactionIndex: log.transactionIndex,
    logIndex: log.logIndex,
    raw: {
      data: log.data,
      topics: log.topics
    },
    returnValues: returnValues
  };
};

topic 解释
http://www.ncqh.cn/news/1693.html

首先我不太清楚你需要解析的目的? 因为反向解析是非常不稳定的,类似于混淆后的JS代码,反向恢复后灵活多变的。一个 byte32的数据,可以代表一个地址,也可能是一个 byte256 的数据。

除非你知道所调研的合约的ABI接口。

我猜测你是需要解析Token的转账交易。如果是需要解析Token的转账,应该使用使用读取事件日志的方式进行。

只有成功转账,才会生成事件日志。如果仅仅是解析交易的Input则是不完整的。如:

交易失败。
To是A合约,但A内部实现了自动转账给TokenB。
怎么使用事件日志解析Token转账记录呢 给你罗列几个资料:

https://learnblockchain.cn/2018/12/19/8be8047936d2
https://learnblockchain.cn/article/776
https://learnblockchain.cn/question/29

来自问题https://learnblockchain.cn/question/149 如何解析input的参数呢?