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,巩固一下细节,也写一个WTF web3.py极简入门,供小白们使用。
WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请
所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py
这一讲,我们介绍如何解码调用智能合约时发送的calldata。
当我们调用智能合约时,本质上是向目标合约发送了一段calldata,calldata大致由两个部分组成:前4个字节代表selector函数选择器,旨在告诉智能合约我要调用哪个函数;而后面的字节则代表传递给函数的参数。
有关calldata和selector的详细介绍请参考Solidity极简入门: 29. 函数选择器Selector。
下面是一笔在Uniswap上进行代币置换的交易,可以通过etherscan查看交易详情:
最下面Input Data框中的16进制数就是我们所说的calldata。在etherscan中点击旁边的Decode Input Data按钮,即可对交易数据进行解码,结果如下:
可以看到,通过解码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())

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))

可以得知,之前随机选取的交易是一笔转账交易,金额为149USDT。
这一讲,我们介绍了如何解码calldata,并给出了一个实例。