Web3.py教程:Python一键完成以太坊转账实践指南

·

关键词:Web3.py教程、Python转账、以太坊测试网、Dai稳定币、智能合约交互、Rinkeby教程、私钥管理、gas费用

目录

  1. 准备阶段
  2. 建立连接并初始化
  3. 创建以太坊账户
  4. 智能合约与ENS简述
  5. 转账实战:发送Dai稳定币
  6. 常见问题解答
  7. 下一步可以做什么?

准备阶段

在开始动手敲代码之前,你需要:

第一步当然是安装 Web3.py:

pip install web3

如果你本地同时装了 Python 2/3,请务必用 pip3 以免软件包版本冲突。


建立连接并初始化

与区块链打交道通常有三种方式:

  1. 本地节点(需要同步上百 GB 区块数据)
  2. 第三方节点托管(Infura、Alchemy 等)
  3. 轻节点或浏览器钱包(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,可依次排查:

记得导入 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. 合约实例化

我们需要以下信息:

abi = json.loads('[{"constant":true ... "type":"event"}]')
dai = w3.eth.contract(address='0xc3dbf84Abb494ce5199D5d4D815b10EC29529ff8', abi=abi)

# 抽查总供应量
print(dai.functions.totalSupply().call())

3. 构建交易

step-by-step:

  1. 目标地址(朋友的账户)
  2. 转账金额(10 Dai)
  3. 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 fundsgas estimation failed


下一步可以做什么?

  1. 在本地跑 Geth 轻节点,探索更去中心化的连接方式。
  2. 阅读官方文档,学习事件监听(event filter)与新交易推送技术。
  3. 将转账功能封装成 API,为移动端 DApp 提供后端服务。

祝你玩得开心,别把真正的 Dai 发到测试地址喔!