更新时间:2021-11-05 18:45:01点击:98
原标题: 《解码以太坊智能合约数据》
如上一篇文章所述,智能合约事务类似于智能合约主导的web3APP的后端API调用。 每个智能合约事务和结果APP事务的状态更改详细信息记录在称为事务、调用和日志的数据元素中。 交易数据元素表示用户启动的函数调用(更确切地说是EOA ),调用数据元素表示智能约定在交易中启动的其他函数调用,日志数据元素表示交易执行中发生的事件。
使用这些数据元素,可以非常详细地说明由于事务处理而在APP和区块链中发生的状态更改。 对非集中式web3APP的所有交易、跟踪和日志进行汇总分析,可以提供用户组及其在产品上的活动的整体和深入的视角。 但是,这样做很困难,因为许多显着的细节被记录为十六进制编码字符串。 例如,以太网上使用Uniswap交换令牌对的交易。 的特定记录可在Etherscan中查阅。
在Etherscan上查看交易时,您可能会注意到,您已经解码了这份原始记录,并提供了良好的上下文,有助于您了解交易的详细信息。 这非常有用,但不是为了回答所有Uniswap用户的总交易价值是多少,或者Uniswap用户三个月的留存率是多少等需要转换和总结数据的问题。 为了回答这些问题,必须能够收集所有记录,对其进行解码,并批量处理相关详细信息。 下一篇文章将详细介绍如何实现这一点。
检查原始数据记录后,发现在EOA发起交易的0x3c 02 CebB 49 F6 E8 F1 FC 96158099 FFA 064 BB FEE 38 b上, 显示已发送到与Uniswap v2路由器相关联的智能合约地址0x7a 250 d 5630 B4 cf 539739 df 2c5 Dacb 4659 f 2488 d,但相关请求的详细信息在input字段中包含较长的十六进制字符
在讨论如何从input中提取人类可读的数据之前,先谈一下它的结构会很有指导意义。 开头的0x表示字符串是十六进制数,与实际信息的内容无关。 之后,每两个十六进制字符表示一个字节。 前4个字节,在本例中为38ed1739,是所调用函数的散列签名。 其余字节是传递给函数的参数的哈希值。 也就是说,可以根据所调用的特定函数和所需的参数来更改输入字符串的长度。
要对这个十六进制字符串进行解码,必须引用APP二进制接口或ABI。 这是一个json对象,它包含指定智能合约的所有函数和事件接口定义,即名称和类型。 ABI的功能是使交易数据中的哈希签名与人类可读的接口定义一致。 以下是ABI的例子。
Uniswap v2路由器ABI的部分视图
ABI通常可以在块浏览器(如Etherscan )中找到,并且也有合同源代码。 这是Uniswap v2路由器协议的ABI链接。
如果有ABI的话,可以写出来解码交易:
importtracebackimportsysfromfunctoolsimportlru _ cachefromweb 3导入web3. autoimportw 3从web3.连接控制器从web3. _ utils.abiimportexclude _索引_事件_输入、 get _ ABI _输入规格化_事件输入_类型框架web3.扩展端口匹配数据库。 logtopicerrorfromweb3. typesimportabieventfrometh _ utilsimportevent _ ABI _ to _ log _ topic to _ hexfromhexbytesimporthexbytesimportjsonimportredefdecode _ tuple (t,目标字段) :输出=直流(Forinrananct ) 字节) ) :输出[目标场[ I ] [“名称”]=到赫兹(t [ I ] Elif isinstance (t,I,(tuple ) ]