关键词:Web3.py教程、Python转账、以太坊测试网、Dai稳定币、智能合约交互、Rinkeby教程、私钥管理、gas费用
目录
准备阶段
在开始动手敲代码之前,你需要:
- Python 3.7 及以上版本
- 一个可用的 Web3.py 环境
- 一个稳定的互联网连接
- 测试网代币(Rinkeby水龙头领取)
第一步当然是安装 Web3.py:
pip install web3如果你本地同时装了 Python 2/3,请务必用 pip3 以免软件包版本冲突。
建立连接并初始化
与区块链打交道通常有三种方式:
- 本地节点(需要同步上百 GB 区块数据)
- 第三方节点托管(Infura、Alchemy 等)
- 轻节点或浏览器钱包(MetaMask 等)
在教程场景里,Infura 是最省心的选择。访问官网注册后可获取属于你的 Project ID,拼接成以下 HTTPS 端点:
https://rinkeby.infura.io/v3/YOUR_PROJECT_ID打开 Python 解释器,进行首轮检查:
from web3 import Web3, HTTPProvider
import json
w3 = Web3(Web3.HTTPProvider("https://rinkeby.infura.io/v3/YOUR_PROJECT_ID"))
# 验证连接
print(w3.isConnected()) # True 说明接通以太坊测试网如果返回 False,可依次排查:
- URL 是否带
https:// - Project ID 是否写错
- 网络连通性
记得导入 PoA 中间件,否则 Rinkeby 的区块头验证会报错:
from web3.middleware import geth_poa_middleware
w3.middleware_onion.inject(geth_poa_middleware, layer=0)创建以太坊账户
以太坊身份由私钥与地址决定。出于演示安全,我们用一个简单口令来“临时”生成示例账户:
my_account = w3.eth.account.create('Nobody expects the Spanish Inquisition!')
print(my_account.address) # 0x5b580eB23Fca4f0936127335a92f722905286738
print(my_account.privateKey.hex()) # 示例私钥,请勿在生产环境中直接使用⚠️:真实私钥请交由硬件钱包、冷钱包或官方客户端保管,切勿明文写入代码仓库或公开分享。
# 验证地址格式
print(Web3.isAddress(my_account.address))智能合约与ENS简述
以太坊名称系统(ENS)把 42 位十六进制地址映射为人类可读的 xxx.eth。开发者在主网可便捷集成,例如 alice.eth 触发自动解析到 0xabc…123。测试网暂未开放,但接口兼容;下一节将重点实操智能合约交互。
👉 想深刻理解 ENS 注册与解析流程?这里有弹窗互动演示。
转账实战:发送 Dai 稳定币
1. 领取测试网 Dai
前往 Chainlink 或 Rinkeby 官方水龙头领取 Dai 以及少量 ETH(矿工费)。地址即上一步生成的 my_account.address。
2. 合约实例化
我们需要以下信息:
- 合约地址(Rinkeby 测试网 Dai):
0xc3dbf84Abb494ce5199D5d4D815b10EC29529ff8 - 合约 ABI(已附 JSON 字符串):
json.loads([...])解析后与合约交互。
abi = json.loads('[{"constant":true ... "type":"event"}]')
dai = w3.eth.contract(address='0xc3dbf84Abb494ce5199D5d4D815b10EC29529ff8', abi=abi)
# 抽查总供应量
print(dai.functions.totalSupply().call())3. 构建交易
step-by-step:
- 目标地址(朋友的账户)
- 转账金额(10 Dai)
- gas、nonce、chainId(Rinkeby 为 4)
tx = dai.functions.transfer(
'0xafC2F2bBD4173311BE60A7f5d4103b098D2703e8',
w3.toWei(10, 'ether')
).buildTransaction({
'chainId': 4,
'gas': 70000,
'nonce': w3.eth.getTransactionCount(my_account.address)
})4. 签名与广播
signed = w3.eth.account.signTransaction(tx, my_account.privateKey)
tx_hash = w3.eth.sendRawTransaction(signed.rawTransaction)
print(tx_hash.hex()) # 例: 0xc5f9...60e常见问题解答
Q1: 在测试网实转多久到账?
通常 5~30 秒即可被区块确认,若网络拥堵可上调 gasPrice。
Q2: gas 费用总是看不懂?
你可以先用 w3.eth.gasPrice 获取实时平均值,再在此基础上上浮 1.1 倍确保不排队过久。
Q3: 私钥写死风险高吗?
非常高!建议把私钥放到硬件加密模块或 .env 文件并用环境变量读取。
Q4: 主网与测试网差异大吗?
除了网络 ID、代币价值外,所有函数调用完全一致,部署智能合约亦如此。
Q5: 如何处理交易失败?
检查 status 字段是否返回 0;若失败,先在区块浏览器查看 revert 原因,常见错误为 insufficient funds 或 gas estimation failed。
下一步可以做什么?
- 在本地跑 Geth 轻节点,探索更去中心化的连接方式。
- 阅读官方文档,学习事件监听(event filter)与新交易推送技术。
- 将转账功能封装成 API,为移动端 DApp 提供后端服务。
祝你玩得开心,别把真正的 Dai 发到测试地址喔!