以太坊交易信息及event、input、logs等概念机制

2020年3月6日20:19:51
评论
402
摘要

以太坊getTransaction/getTransactionReceipt获取交易记录含义,input及log解析过程,topics概念。

更多区块链技术与应用分类:

区块链应用    区块链开发

以太坊 | Fabric | BCOS | 密码技术 | 共识算法 | 比特币其他链

通证经济传统金融场景 | 去中心化金融 | 防伪溯源 | 数据共享 | 可信存证

 

合约事件例子定义

举例,比如合约中事件如下:(以下内容均使用该事件例子)

  • 事件名称:Transfer
  • 事件的参数:address, address, uint256
  • 注意:此事件的from和to参数前有indexed标记,value没有indexed标记

以太坊交易获取

当上述事件在合约中调用后,我们通过其交易hash获取交易信息。从以太坊得到一条交易信息的方式有两种:getTransaction/getTransactionReceipt

web3Client.eth.getTransaction:

获得的具体信息如下

web3Client.eth.getTransactionReceipt:

获得的具体信息如下

getTransaction返回结果中包含input,而getTransactionReceipts返回结果中包含logs。

二.input解析

(1)若input=0x则为非合约调用,否则为合约方法调用。

以合约方法function transfer(address to, uint tokens) 为例;

input数据分为3个部分:

  • 4 字节,是方法名的哈希,例如:a9059cbb
  • 32字节,放以太坊地址,目前以太坊地址是20个字节,高位补0

例如:000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca

  • 32字节,是需要传输的代币数量,这里是1*10^18 GNT

例如:0000000000000000000000000000000000000000000000000de0b6b3a7640000

所有这些加在一起就是交易数据:

a9059cbb000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca0000000000000000000000000000000000000000000000000de0b6b3a7640000

(2)如下为处理input的逻辑(web3.js):

三.logs解析

智能合约通过「事件」来产生「日志」,日志存储的Gas费用要比合约的存储便宜很多(日志每个字节花费8个Gas,而合约存储是每32个字节20,000个Gas)。想要通过合约向用户返回数据,则需将数据以事件的形式传给用户,用户拿到transactionReceipt后解析log,log.args.x拿到数据。Input只能拿到调用合约以及function的信息,而不能拿到function运行后内部产生的事件(事件不一定和function拥有相同名称和参数)。

1.logs解析步骤代码(web3.js)

(1)取出transactionReceipt中logs;

(2)取出logs中一条log;

(3)使用event.js得到transferEvent,然后用transferEvent的decode方法解析log;

log解析前: ​

log解析后:

若是公链转币,以太坊转账,则交易回执转logs为空。

若是执行合约的事件,则logs不为空,故ERC-20代币转账,会执行合约Transfer方法,产生logs

四.topics

1.概念

Topics[]是一个数组

Topics[0]指向特定的事件,是事件的签名,如ERC-20 Transfer方法:

sha3('Transfer(address,address,uint256)') =>

0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Topics[1]是address类型的from参数补齐64位结果

Topics[2]是address类型to参数补齐64位的结果

由于value没有indexed标记,因此放在data中,将value的值转化为16进制并补齐64位

2.indexed

Transfer事件的第一个和第二个参数被标记为indexed, 因此他们的值被放在 topics array 中. 由于value参数没有标记为indexed, 所以value值被放在data字段. 如果事件中有多个字段未标记为indexed, 那么他们的值都会被记录在data字段中。

事件规则

topic[0]: keccak("Transfer(address,address,uint256)"),对事件的字符做keccak散列运算

topic[1]: address类型from参数补齐64位

topic[1]: address类型to参数补齐64位

data: 没有indexed标记的value的值转化为16进制,并补齐64位

注意:

事件中的参数类型需要写成完整的,如Transfer(address,address,uint)就不行,需要将uint改为uint256。


原文链接:以太坊交易信息及event、input、logs等概念机制

  • 本文由 发表于 2020年3月6日20:19:51
  • 转载请注明:https://www.wanghaoyi.com/ethereum-event-detail.html
Solidity合约间调用原子性操作实验 BCOS

Solidity合约间调用原子性操作实验

实验说明 为了测试在合约内调用另一个合约时,若在某一方法内,先调用另一个合约方法导致其数据更改成功,而执行后面的语句时由于某些原因导致交易失败,那么已经被调用的合约数据已然更改还是未被更改?针对这个问...
以太坊之数据存储详解 以太坊

以太坊之数据存储详解

本文整理分析以太坊网络中的区块、交易以及合约数据是如何存储的。 区块结构 区块由两部分组成,分别是区块头(header)和区块体(body)两部分,详细结构图如下。 区块头(header) 区块头存储...
Solidity开发bug汇总 BCOS

Solidity开发bug汇总

编译器与代码版本不一致问题 (代码版本pragma solidity ^0.4.25),产生如下报错: { "component": "general", "formattedMessage": "S...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: