Python轻松检查以太坊余额,实用指南与代码示例

网络 阅读: 2025-12-12 01:48:31

区块链应用开发、资产管理或日常交互中,检查以太坊(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方法。

步骤:

  1. 获取代币的合约地址(如USDT主网合约地址:0xdAC17F958D2ee523a2206206994597C13D831ec7)。
  2. 通过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实现异步查询(需安装aiohttpweb3[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.作者投稿可能会经我们编辑修改或补充。

关注我们

扫一扫关注我们,了解最新精彩内容

搜索