title: 3. 读取合约信息 tags: web3py python ens vitalik web3.py极简入门: 3.读取合约信息 我们最近在重新学 ,巩固一下细节,也写一个 ,供小白们使用。 推特:@0xAAScience@localcat15 WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请 所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py 这一讲,我们会介绍 合约对象,并利用它来读取链上的合约信息。 对象 在 中, 对象是对区块链上运行的智能合约的抽象,将智能合约实例化为 对象后,我们就可以在 程序中方便地与之进行交互。
title: 3. 读取合约信息 tags: - web3py - python - ens - vitalik
我们最近在重新学web3.py,巩固一下细节,也写一个WTF web3.py极简入门,供小白们使用。
WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请
所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py
这一讲,我们会介绍Contract合约对象,并利用它来读取链上的合约信息。
Contract对象在web3.py中,Contract对象是对区块链上运行的智能合约的抽象,将智能合约实例化为Contract对象后,我们就可以在python程序中方便地与之进行交互。
Contract变量创建以太坊上的Contract对象非常简单,只需要借助web3.eth.contract()方法。想要调用这个方法,我们必须有一个预先创建好的Provider实例,并将合约地址和合约ABI作为参数传入。
合约的ABI指定了如何与合约进行交互,可以在我们编译合约文件时获得,也可以通过以太坊浏览器方便的读取。
接下来,我们尝试借助Contract对象读取Vitalik的USDT持仓。
from web3 import Web3 #从alchemy申请rpc节点 ALCHEMY_URL='https://eth-mainnet.g.alchemy.com/v2/hjZ-SwVhjRtBk-yUJ1SkWSTrz_dJl7of' w3=Web3(Web3.HTTPProvider(ALCHEMY_URL)) w3.is_connected()
Contract实例#USDT主网地址 addressUSDT=0xdAC17F958D2ee523a2206206994597C13D831ec7 #从etherscan找到USDT的ABI ABIUSDT='[{"constant":true,"inputs":[],...}]'

可以使用Contract.caller方法简单地实现合约中只读函数的调用(涉及到签名和发送交易的调用将在后续章节讨论),以下两种调用方式都符合语法要求。
#第一种 USDTcontract.caller.name() #第二种 USDTcontract.caller().totalSupply()

USDT余额我们可以利用USDTcontract合约的balanceOf函数来查询Vitalik的USDT余额。
USDTcontract.caller.balanceOf('vitalik.eth')

这一讲,我们介绍了如何在web3.py中创建合约实例,并调用合约中的只读函数读取了Vitalik的USDT余额。