Python轻松检查以太坊余额,实用指南与代码示例
在区块链应用开发、资产管理或日常交互中,检查以太坊(Ethereum)地址余额是一项常见需求,以太坊作为全球第二大公链,其余额查询是DeFi、NFT、钱包开发等场景的基础操作,本文将详细介绍如何使用Python结合主流区块链工具,轻松实现以太坊余额的检查,涵盖环境准备、代码实现及常见问题解决,助你快速上手。
环境准备:安装必要的Python库
在开始编写代码前,需要安装Python的以太坊交互库,目前最常用的是web3.py,这是一个功能强大的Python库,支持与以太坊节点、智能合约等进行交互,还需要选择一个以太坊节点服务来获取链上数据。

安装web3.py
通过pip安装最新版本的web3.py:

pip install web3
选择以太坊节点服务
查询以太坊余额需要连接到以太坊网络节点,常见方式有:
- Infura:提供稳定的云端节点服务,支持以太坊主网、测试网(如Ropsten、Goerli),需注册获取项目ID(免费额度有限)。
- Alchemy:类似Infura的节点服务,开发者友好,同样需要注册获取API Key。
- 本地节点:运行以太坊客户端(如Geth),但需要同步链上数据,资源消耗较大。
本文以Infura为例,注册后可获取PROJECT_ID(替换代码中的YOUR_INFURA_URL)。

实现以太坊余额查询的核心代码
基本查询:单地址余额
以下代码演示如何使用web3.py通过Infura节点查询以太坊地址的余额(单位:Wei,以太坊的最小单位):
from web3 import Web3
# 初始化Web3连接,替换为你的Infura URL
infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_URL"
web3 = Web3(Web3.HTTPProvider(infura_url))
# 检查连接是否成功
if not web3.is_connected():
raise ConnectionError("无法连接到以太坊节点")
# 要查询的以太坊地址(替换为实际地址)
address = "0x742d35Cc6634C0532925a3b844Bc9e7595f8e0a1"
# 确保地址格式正确(以太坊地址需以0x开头,42位十六进制)
if not web3.is_address(address):
raise ValueError("无效的以太坊地址")
# 查询余额(返回单位:Wei)
balance_wei = web3.eth.get_balance(address)
# 将Wei转换为ETH(1 ETH = 10^18 Wei)
balance_eth = web3.from_wei(balance_wei, 'ether')
print(f"地址: {address}")
print(f"余额: {balance_wei} Wei")
print(f"余额: {balance_eth} ETH")
代码说明:
Web3.HTTPProvider(infura_url):通过HTTP协议连接到Infura节点。web3.is_connected():验证节点连接是否成功。web3.eth.get_balance(address):调用节点API获取指定地址的余额(单位:Wei)。web3.from_wei():将Wei转换为更易读的ETH(或Gwei等其他单位)。
批量查询多个地址余额
在实际应用中,可能需要批量查询多个地址的余额,以下代码实现批量查询:
from web3 import Web3
infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_URL"
web3 = Web3(Web3.HTTPProvider(infura_url))
# 要查询的地址列表
addresses = [
"0x742d35Cc6634C0532925a3b844Bc9e7595f8e0a1",
"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"0x1234567890123456789012345678901234567890" # 示例地址,可能无效
]
for addr in addresses:
if not web3.is_address(addr):
print(f"地址 {addr} 格式无效,跳过")
continue
balance_wei = web3.eth.get_balance(addr)
balance_eth = web3.from_wei(balance_wei, 'ether')
print(f"地址: {addr} | 余额: {balance_eth} ETH")
注意事项:
- 批量查询时需控制频率,避免触发节点服务的速率限制(Infura免费版有QPS限制)。
- 无效地址(如格式错误、不存在)需提前过滤,避免报错。
查询代币余额(非ETH)
以太坊上不仅有原生代币ETH,还有大量ERC-20代币(如usdt、USDC等),查询ERC-20代币余额需要调用其智能合约的balanceOf方法。
步骤:
- 获取代币的合约地址(如USDT主网合约地址:
0xdAC17F958D2ee523a2206206994597C13D831ec7)。 - 通过ABI(应用程序二进制接口)定义合约方法。
代码示例(查询USDT余额):
from web3 import Web3
infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_URL"
web3 = Web3(Web3.HTTPProvider(infura_url))
# 代币合约地址(USDT示例)
token_address = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
# 要查询的地址
user_address = "0x742d35Cc6634C0532925a3b844Bc9e7595f8e0a1"
# ERC-20代币的ABI(简化版,仅需balanceOf和decimals方法)
erc20_abi = [
{
"constant": True,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "balance", "type": "uint256"}],
"type": "function"
},
{
"constant": True,
"inputs": [],
"name": "decimals",
"outputs": [{"name": "", "type": "uint8"}],
"type": "function"
}
]
# 初始化合约
contract = web3.eth.contract(address=token_address, abi=erc20_abi)
# 查询余额
balance_wei = contract.functions.balanceOf(user_address).call()
# 获取代币精度(如USDT精度为6,即1 USDT = 10^6)
decimals = contract.functions.decimals().call()
# 转换为实际余额(如精度为6时,余额 = balance_wei / 10^6)
balance = balance_wei / (10 ** decimals)
print(f"地址: {user_address}")
print(f"USDT余额: {balance}")
说明:
- ERC-20代币的ABI可以从Etherscan等区块链浏览器获取,或使用标准ABI(如上述简化版)。
decimals方法用于确定代币的小数位数,不同代币精度不同(如ETH为18,USDT为6)。
进阶功能与优化
处理网络错误与重试机制
节点服务可能因网络问题或速率限制返回错误,可通过重试机制提高稳定性:
import time
from web3.exceptions import TimeExhausted
def get_balance_with_retry(address, max_retries=3):
for attempt in range(max_retries):
try:
balance_wei = web3.eth.get_balance(address)
return web3.from_wei(balance_wei, 'ether')
except TimeExhausted:
print(f"查询超时,重试 {attempt 1}/{max_retries}")
time.sleep(2) # 等待2秒后重试
except Exception as e:
print(f"查询失败: {e}")
return None
return None
# 使用示例
balance = get_balance_with_retry("0x742d35Cc6634C0532925a3b844Bc9e7595f8e0a1")
print(f"余额: {balance} ETH")
使用异步查询提高效率
批量查询时,同步方式效率较低,可结合aiohttp实现异步查询(需安装aiohttp和web3[async]):
import asyncio
from web3 import AsyncWeb3
async def async_get_balance(address):
async with AsyncWeb3(AsyncWeb3.HTTPProvider(infura
本文 原创,转载保留链接!网址:https://licai.bangqike.com/bixun/1282934.html
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。






