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

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

pip install web3
查询以太坊余额需要连接到以太坊网络节点,常见方式有:
本文以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")
以太坊上不仅有原生代币ETH,还有大量ERC-20代币(如usdt、USDC等),查询ERC-20代币余额需要调用其智能合约的balanceOf方法。
0xdAC17F958D2ee523a2206206994597C13D831ec7)。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}")
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
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com