构建交易
用Python实现Web3代币转账:从零构建去中心化交易脚本
在Web3浪潮下,代币转账是区块链应用的核心操作之一,本文将以Python为例,结合Web3.py库,演示如何实现以太坊ERC-20代币的转账流程,涵盖环境配置、余额查询、交易构造与广播等关键步骤。
环境准备:安装依赖与连接网络
需安装Python的Web3.py库,这是与以太坊节点交互的核心工具:
pip install web3
选择与以太坊网络连接的方式,开发阶段可使用公共节点(如Infura或Alchemy),需注册获取HTTPS URL,Infura的Goerli测试网URL格式为:https://goerli.infura.io/v3/YOUR_PROJECT_ID,还需准备代币ABI(应用程序二进制接口),ERC-20代币的ABI可从Etherscan获取,包含balanceOf、transfer等关键函数。
加载账户与代币合约
转账操作需要发起方账户(私钥)和目标代币合约地址,以以太坊上的USDT代币(合约地址:0xdAC17F958D2ee523a2206206994597C13D831ec7)为例,首先初始化Web3 provider并加载账户:
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://goerli.infura.io/v3/YOUR_PROJECT_ID'))
private_key = '0xYOUR_PRIVATE_KEY' # 替换为实际私钥
account = w3.eth.account.from_key(private_key)
加载ERC-20代币合约,以USDT为例,其ABI中需包

decimals(精度)、symbol(符号)及transfer函数:
erc20_abi = [...] # 从Etherscan复制的完整ABI token_contract = w3.eth.contract(address='0xdAC17F958D2ee523a2206206994597C13D831ec7', abi=erc20_abi)
查询代币余额与构造交易
转账前需检查账户代币余额,避免因余额不足导致交易失败:
balance = token_contract.functions.balanceOf(account.address).call()
print(f"当前代币余额: {balance / 10**18} USDT") # USDT精度为18
接下来构造交易,ERC-20代币的transfer函数接收接收者地址和转账金额(需转换为精度单位,如USDT需乘以10^18),需估算Gas费用并设置nonce(防止交易重放):
to_address = '0xRECIPIENT_ADDRESS' # 接收者地址
amount = 100 * 10**18 # 转账100 USDT
transaction = token_contract.functions.transfer(
to_address,
amount
).build_transaction({
'from': account.address,
'nonce': w3.eth.get_transaction_count(account.address),
'gas': 200000, # Gas limit,可根据实际情况调整
'gasPrice': w3.eth.gas_price, # 当前Gas价格
'chainId': 5 # Goerli测试网链ID
})
签名交易与广播上链
使用账户私钥对交易签名,然后发送到以太坊网络:
# 签名交易
signed_txn = w3.eth.account.sign_transaction(transaction, private_key)
# 广播交易
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
print(f"交易哈希: {w3.to_hex(tx_hash)}")
# 等待交易确认
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f"交易状态: {tx_receipt['status']}")
注意事项与扩展
- 私钥安全:私钥是账户控制权核心,切勿硬编码或泄露,建议使用环境变量或硬件钱包管理。
- Gas优化:动态调整Gas价格(如使用
w3.eth.gas_price查询)可节省交易成本。 - 错误处理:需捕获网络异常、余额不足、Gas不足等错误,例如使用
try-except捕获web3.exceptions.TransactionNotFound。
通过上述步骤,即可用Python完成Web3代币转账,进一步可结合前端框架(如Flask)构建可视化界面,或集成多签钱包、批量转账等高级功能,探索去中心化应用的更多可能性。