前言:为什么这篇指南值得收藏
今天,Web3.py 已经成为 Python 生态与以太坊互动的黄金桥梁。本篇将手把手教你用 Web3.py 发送 ERC-20 代币,并现场演示如何为智能合约授权代币额度。阅读完毕后,你将拥有一个能反复使用的脚本模板,无论是空投工具、打赏机器人,还是 DApp 内部转帐都可以直接套用。
👉 掌握更多区块链转账技巧,防止高额手续费踩坑!
目录
- ERC-20 代币速览
- 环境搭建:五分钟完成
- 转账脚本三步到位
- 为智能合约授权代币
- FAQ & 排障锦囊
- 进阶思考
1. ERC-20 代币速览
核心关键词:ERC-20 标准、智能合约、approve 授权、链上转账、GAS 优化
ERC-20 是以太坊上最常用的代币协议,所有主流稳定币(USDT、USDC)、治理币、流动性凭证等均遵循此规则。由于代币信息完全写在智能合约里,转账时必须使用合约接口而非 EOA(普通地址)直接发以太币。
转账路径分两步:
transfer函数:由代币持有者向目标地址直接转账。approve → transferFrom组合:代币持有者先批准某智能可花费指定额度,再由该合约代为转账。
2. 环境搭建:五分钟完成
2.1 系统与软件依赖
- Python ≥ 3.9
- web3.py ≈ 6.18.0
- 文本编辑器 VS Code || PyCharm (推荐启用插件
Python与Solidity)
2.2 安装一条命令
pip install web3==6.18.0如遇编译报错,先升级 pip 并安装 build-essential、python3-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.03.2 填写配置与 ABI
- 打开 Sepolia Etherscan 找到你的代币合约,复制 ABI → 保存为
abi.json。 替换以下变量:
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:0x9fc4ea7be48f5af020e257023e5e56c28246fe3d54c815bc5b623e45d5ef1aab4. 为智能合约授权代币
当你希望把代币额度托管给 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 wheel6. 进阶思考
- GAS 优化:使用
estimate_gas()动态计算即可节省 10~30 % 不承担浪费。 - 异常重试:结合
tenacity库捕捉ValueError并自动重发。 - 多链兼容:在
chainId > 1的网络(Base、Arbitrum)几乎无需修改代码。 - 钱包分离:生产环境切勿硬编码私钥,改用环境变量或
gpg加密的.env文件。
祝贺你已完成 Python Web3.py ERC-20 代币转账 全栈流程。将脚本扩展到批量空投、定时分润或 SDK 基础模块,都将事半功倍。尽情实践,希望你的下一个小工具就是百万用户的爆款!