如果你对以太坊合约有研究,就会知道在调用合约的过程中会产生event log (事件日志)。当然如果你还不知道什么是智能合约可以自行搜索是智能合约?这个事件日志会记录在交易的receipt函数中。通过对事件日志的分析可以获得多个以太坊交易的详细内容。
Tokenview API数据服务可为用户提供ETH交易的日志详情。具体操作如下:
{
"code": 1,
"msg": "成功",
"data": {
"block_no": 9000000,
"index": "2",
"receipt": {
"status": "0x1",
"cumulativeGasUsed": "0x13325",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000008000000000000000000000000008000000000000000000200000000000000000400000000000000000000000000000000000000000002000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000820000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000",
"gasUsed": "0x8f15",
"logs": [
{
"type": "mined",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x2e1809d345216aa72833ba5f2881885c2999c103",
"0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578"
],
"address": "0xe5caef4af8780e59df925470b050fb23c43ca68c",
"transactionLogIndex": "0x0",
"logIndex": "0x0",
"data": "0x08bb2c9700"
}
]
},
"trace": [
{
"traceAddress": [],
"subtraces": 0,
"type": "call",
"action": {
"callType": "call",
"from": "0x2e1809d345216aa72833ba5f2881885c2999c103",
"gas": "0x6f95",
"value": "0x0",
"to": "0xe5caef4af8780e59df925470b050fb23c43ca68c",
"input": "0xa9059cbb0000000000000000000000005f5b019fd4b42cf0c92e3ec1bf85f2c56210557800000000000000000000000000000000000000000000000000000008bb2c9700"
},
"result": {
"output": "0x01",
"gasUsed": "0x6f95"
}
}
]
}
}
{
"code": 1,
"msg": "成功",
"data": {
"block_no": 9000000, // 区块高度
"index": "2", // 交易在区块里的位置索引
"receipt": { //这个是geth全节点的Event日志
"status": "0x1", //16进制
"cumulativeGasUsed": "0x13325",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000008000000000000000000000000008000000000000000000200000000000000000400000000000000000000000000000000000000000002000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000820000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000",
"gasUsed": "0x8f15", //gas使用量
"logs": [
{
"type": "mined", //type 一般都是mined,表示该日志由矿工生成
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", //keccak(Transfer(address,address,uint256)),对事件的字符做keccak散列运算
"0x2e1809d345216aa72833ba5f2881885c2999c103", //address类型from参数补齐64位
"0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578" //address类型to参数补齐64位
],
"address": "0xe5caef4af8780e59df925470b050fb23c43ca68c", //被调用的合约地址
"transactionLogIndex": "0x0",
"logIndex": "0x0",
"data": "0x08bb2c9700" //合约的返回值
}
]
},
"trace": [ // 这个是parity全节点的trace日志
{
"traceAddress": [],
"subtraces": 0,
"type": "call",
"action": {
"callType": "call",
"from": "0x2e1809d345216aa72833ba5f2881885c2999c103",
"gas": "0x6f95",
"value": "0x0",
"to": "0xe5caef4af8780e59df925470b050fb23c43ca68c",
"input": "0xa9059cbb0000000000000000000000005f5b019fd4b42cf0c92e3ec1bf85f2c56210557800000000000000000000000000000000000000000000000000000008bb2c9700"
},
"result": {
"output": "0x01",
"gasUsed": "0x6f95"
}
}
]
}
}
首先我们需要了解以太坊交易中的基本规则。例如:代币的购买,会触发代币的Transfer事件,这是ERC20标准的基本规定。
对事件的基本定义: event Transfer(address indexed from, address indexed to, uint256 value);
topic[0]: keccak(Transfer(address,address,uint256)),对事件的字符做keccak散列运算
topic[1]: address类型from参数补齐64位
topic[1]: address类型to参数补齐64位
data: 没有indexed标记的value的值转化为16进制,并补齐64位
从from这个账户发送 value个token(代币) 到to这个账户
Transfer(address indexed from, address indexed to, uint256 value)
事件名字散列值
topic[0] = keccak(Transfer(address,address,uint256)) = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
后续的就是参数中有indexed标志的参数 所传递的值
fromeAddress 补齐64位
topic[1] = 0x2e1809d345216aa72833ba5f2881885c2999c103
topic[2] = 0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578
然后是另一个不带indexed标志的参数的 值传入
这就是一个数字转化为16进制 然后补齐64位
data = 00000000000000000000000000000000000000000000000000000008bb2c9700
也可以通过Tokenview全币种区块链浏览器直接查看这笔交易查看详细交易信息和事件日志。
基本交易信息:
交易描述
普通用户地址向合约地址转了37500个FRM,所触发的事件分析。