eth解析Token的转账的事件日志logs
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的参数呢?