20.解码交易详情


文档摘要

title: 20、解码交易详情 tags: web3py python ens vitalik web3.py极简入门: 20、解码交易详情 我们最近在重新学 ,巩固一下细节,也写一个 ,供小白们使用。 推特:@0xAAScience @localcat15 WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请 所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py 这一讲,我们介绍如何解码调用智能合约时发送的 。 Calldata 当我们调用智能合约时,本质上是向目标合约发送了一段 , 大致由两个部分组成:前4个字节代表 函数选择器,旨在告诉智能合约我要调用哪个函数;

title: 20、解码交易详情 tags: - web3py - python - ens - vitalik

web3.py极简入门: 20、解码交易详情

我们最近在重新学web3.py,巩固一下细节,也写一个WTF web3.py极简入门,供小白们使用。

推特@0xAA_Science @localcat15

WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请

所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py

这一讲,我们介绍如何解码调用智能合约时发送的calldata

Calldata

当我们调用智能合约时,本质上是向目标合约发送了一段calldatacalldata大致由两个部分组成:前4个字节代表selector函数选择器,旨在告诉智能合约我要调用哪个函数;而后面的字节则代表传递给函数的参数。

有关calldataselector的详细介绍请参考Solidity极简入门: 29. 函数选择器Selector

下面是一笔在Uniswap上进行代币置换的交易,可以通过etherscan查看交易详情:
swap
最下面Input Data框中的16进制数就是我们所说的calldata。在etherscan中点击旁边的Decode Input Data按钮,即可对交易数据进行解码,结果如下:
calldata
可以看到,通过解码calldata,我们的确得到了函数名和具体的函数参数。

解码交易数据

web3.py中解码calldata非常简单,只需借助Contract.decode_function_input函数,下面我们将展示其具体过程:

1、创建provider

from web3 import Web3 ALCHEMY_MAINNET_URL = 'https://eth-mainnet.g.alchemy.com/v2/hjZ-SwVhjRtBk-yUJ1SkWSTrz_dJl7of' w3 = Web3(Web3.HTTPProvider(ALCHEMY_MAINNET_URL))

2、我们随机选取一笔与USDT合约进行交互的交易,获取其calldata

transaction = w3.eth.get_transaction('0x6b2eba89b78484f6b954cf74f35ee42667363f65c0927d46b5f10ef6ab894393') #打印出calldata print(transaction.input.hex())

calldata2
3、将USDT合约实例化,用于解码交易详情。

#USDT合约地址 addressUSDT='0xdAC17F958D2ee523a2206206994597C13D831ec7' #USDT合约ABI abiUSDT='[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,...' #实例化合约 contractUSDT=w3.eth.contract(address=addressUSDT,abi=abiUSDT)

4、解码之前获取到的calldata

print(contractUSDT.decode_function_input(transaction.input))

result
可以得知,之前随机选取的交易是一笔转账交易,金额为149USDT

总结

这一讲,我们介绍了如何解码calldata,并给出了一个实例。


作者与出处
来源:WTFAcademy
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 转发
评论区 (0)
U