使用 Python 与 Web3.py 发送 ERC-20 代币完整实战指南

·

前言:为什么这篇指南值得收藏

今天,Web3.py 已经成为 Python 生态与以太坊互动的黄金桥梁。本篇将手把手教你用 Web3.py 发送 ERC-20 代币,并现场演示如何为智能合约授权代币额度。阅读完毕后,你将拥有一个能反复使用的脚本模板,无论是空投工具、打赏机器人,还是 DApp 内部转帐都可以直接套用。
👉 掌握更多区块链转账技巧,防止高额手续费踩坑!


目录

  1. ERC-20 代币速览
  2. 环境搭建:五分钟完成
  3. 转账脚本三步到位
  4. 为智能合约授权代币
  5. FAQ & 排障锦囊
  6. 进阶思考

1. ERC-20 代币速览

核心关键词:ERC-20 标准智能合约approve 授权链上转账GAS 优化
ERC-20 是以太坊上最常用的代币协议,所有主流稳定币(USDT、USDC)、治理币、流动性凭证等均遵循此规则。由于代币信息完全写在智能合约里,转账时必须使用合约接口而非 EOA(普通地址)直接发以太币。

转账路径分两步:


2. 环境搭建:五分钟完成

2.1 系统与软件依赖

2.2 安装一条命令

pip install web3==6.18.0

如遇编译报错,先升级 pip 并安装 build-essentialpython3-dev(Linux)或以管理员身份运行 pip install --upgrade pip setuptools wheel

2.3 创建以太坊节点连接

为了降低延迟、提高成功率,建议使用 以太坊节点 RPC 服务。注册后可获得专属 HTTPS 端点。开发期间选 Sepolia 测试网

2.4 获取测试网 ETH

访问 Sepolia QuickNode Faucet,至少领取 0.05 ETH 作为链上 GAS;若钱包还不存在,可直接导入 MetaMask 助记词私钥。


3. 转账脚本三步到位

3.1 新建项目文件夹 erc20_transfer

mkdir erc20_transfer && cd erc20_transfer
python -m venv venv
source venv/bin/activate   # Windows 用 venv\Scripts\activate
pip install web3==6.18.0

3.2 填写配置与 ABI

  1. 打开 Sepolia Etherscan 找到你的代币合约,复制 ABI → 保存为 abi.json
  2. 替换以下变量:

    • RPC_URL:节点端点
    • CONTRACT_ADDRESS:已验证的 ERC-20 合约地址
    • PRIVATE_KEY:你钱包的 私钥(⚠️测试网环境内测试,警惕泄漏)
    • TO_ADDRESS:接收方地址
    • token_amount:欲发送的数量,单位以合约 decimals 为基准(USDT 为 6 位)

3.3 完整代码示例:main.py

from web3 import Web3
from web3.middleware import geth_poa_middleware
import json, os

# ---- 配置 ----
RPC_URL = os.getenv('RPC_URL') or 'PLACE_YOUR_ENDPOINT_HERE'
CONTRACT_ADDRESS = Web3.to_checksum_address('REPLACE_WITH_REAL_ADDRESS')
PRIVATE_KEY = os.getenv('PK') or 'YOUR_PRIVATE_KEY'
TO_ADDRESS = Web3.to_checksum_address('RECIPIENT_ADDRESS')
TOKEN_AMOUNT = Web3.to_wei(10, 'ether')  # 假设该合约 decimal = 18

w3 = Web3(Web3.HTTPProvider(RPC_URL))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
if not w3.is_connected():
    raise ConnectionError('RPC 连接失败')

acct = w3.eth.account.from_key(PRIVATE_KEY)
sender = acct.address

with open('abi.json') as f:
    contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=json.load(f))

nonce = w3.eth.get_transaction_count(sender)

tx = contract.functions.transfer(
    TO_ADDRESS,
    TOKEN_AMOUNT
).build_transaction({
    'chainId': w3.eth.chain_id,
    'gas': 150000,
    'gasPrice': w3.eth.gas_price,
    'nonce': nonce,
})

signed_tx = w3.eth.account.sign_transaction(tx, PRIVATE_KEY)
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
print("✨ 交易已上链,Tx Hash:", tx_hash.hex())

运行:

python main.py

命令输出示例:

✨ 交易已上链,Tx Hash:0x9fc4ea7be48f5af020e257023e5e56c28246fe3d54c815bc5b623e45d5ef1aab

4. 为智能合约授权代币

当你希望把代币额度托管给 DeFi 协议(如 DEX Router、质押合约),需要先调用 approve。改动极少:
👉 设计流畅的 DeFi 自动化流程,从此告别手动授权!

代码片段只改两处:

spender_address = 'DEX_ROUTER_ADDRESS'
amount = Web3.to_wei(100, 'ether')

tx = contract.functions.approve(
    spender_address,
    amount
).build_transaction({
    'chainId': w3.eth.chain_id,
    'gas': 100000,
    'nonce': nonce,
})

保留其它步骤,签名、发送后即可完成授权。至此,智能合约可以对你的 100 代币额度自由 transferFrom


5. FAQ & 排障锦囊

Q1:提示 replacement transaction underpriced

原因 是 nonce 低且 gasPrice 不够。重新获取当前 nonce,或提高 maxPriorityFeePerGas

Q2:合约地址明明正确却返回 execution reverted: insufficient allowance

说明你是用 transferFrom 但没提前 approve。请先 approve 再执行。

Q3:找不到 ABI 怎么办?

若合约未开源,可联系项目方获取 ABI 文件,或使用 etherscanId 工具反编译获取仅读函数信息。

Q4:Sepolia 访问慢或超时?

开启 RPC 连接日志检查重试次数,或尝试切换到更高速节点。

Q5:python 出现 ModuleNotFoundError: util

确保 web3.py 安装时已将所有依赖项自动拉取。若收到二次回溯,升级 pip & setuptools 并重试:

pip install --upgrade web3 setuptools wheel

6. 进阶思考

祝贺你已完成 Python Web3.py ERC-20 代币转账 全栈流程。将脚本扩展到批量空投、定时分润或 SDK 基础模块,都将事半功倍。尽情实践,希望你的下一个小工具就是百万用户的爆款!