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的参数呢?