web3py 实现 ETH 以太坊批量转账完整实战教程

Posted by YCT612 加密视角 on September 5, 2025

一次写 3 条链上转账、5 分钟完成部署,彻底告别逐笔操作带来的效率焦虑。

批量转账(batch transfer)是以太坊钱包、去中心化交易所和空投脚本中常见的核心功能。本文基于 web3py 实战演示:如何用 1 段脚本、1 段代码,把 ETH 同时发给任意数量的接收地址,gas 优化实测节约 30% 以上,有效避免了「一条交易、一次手续费」的重复支出。

应用场景:为什么一定要会批量转账?

  • 空投:一次性给 1,000 个地址打少量 ETH。
  • 工资/分成:项目/DAO 向多位贡献者定期打款。
  • 手续费代付:DApp 内置中继器,为用户代付 gas 时提前把 ETH 打到多地址。

关键词:以太坊批量转账、web3py 教程、ETH 合单付款、gas 优化、ropsten 测试


环境速览:一分钟备齐所有材料

需准备 推荐方案
链端节点 Infura Ropsten HTTPS 终端
账户管理 MetaMask(Ropsten 测试网)
测试币 在 MetaMask Buy → “Get Ether” 领取,每次 1 ETH,最多 5 次
Python 环境 3.8+,pip install web3
合约 ABI 已部署批量转账合约 “StormMultisender” 的本地文件
私钥 MetaMask 导出,妥善保存

提示:文中所有示例均基于 ropsten.infura.io 测试节点,不会触及主网资产,可放心动手。

👉 点这里查看 Ropsten 最新区块高度,助你在测试网快速确认交易状态。


运行步骤:5 步完成全链路流程

1. 获取批量转账合约地址与 ABI

  • 地址:0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f
  • ABI:克隆 github.com/rstormsf/multisender → 获取 abis/StormMultisender.json
    说明:该合约已部署至 Ropsten,可直接调用 multisendEther 函数。

2. 账户余额校验

from web3 import Web3

web3 = Web3(Web3.HTTPProvider(
    "https://ropsten.infura.io/v3/YOUR_INFURA_PROJECT_ID"
))

how_much_wei = web3.eth.get_balance(from_address)
print(f"账户余额: {web3.fromWei(how_much_wei, 'ether')} ETH")

余额必须大于:批量转账总额 + 预估 gas 费用。测试阶段多给 10 %,避免交易打包失败。

3. 组装参数

假设我们要给以下 2 个地址分别 一次性 转 0.1 ETH:

addresses_to_send = [
    "0x5844de50Cf99F95ca073AC7B205f9C0C75E827A8",
    "0x8775039fCa840bde05519E4A743B2973F3C30B24"
]
values_wei = [web3.toWei(0.1, 'ether')] * 2

4. 建立交易结构并预估 gas

nonce = web3.eth.get_transaction_count(from_address)
transaction = Contract.functions.multisendEther(
    addresses_to_send,  # 接收地址 []
    values_wei          # 对应金额 []
).buildTransaction({
    "from": from_address,
    "value": web3.toWei(sum(values_wei) + 0.01, 'ether'),  # 稍微多转一点,覆盖 gas
    "gas": 0,  # 先用 estimate_gas 计算
    "gasPrice": web3.toWei('20', 'gwei'),
    "nonce": nonce
})

# 自动估算 gas
transaction['gas'] = web3.eth.estimate_gas(transaction)

真实脚本里可用 estimate_gas 动态计算,避免写死上限。

5. 签名 + 广播

signed = web3.eth.account.sign_transaction(transaction, private_key)
tx_hash = web3.eth.send_raw_transaction(signed.rawTransaction)
print(f"Tx Hash: {tx_hash.hex()}")

等待 30 秒~2 分钟,在 Ropsten Explorer 搜 tx hash,状态变为 Success 即批量转账生效。


代码打包:立即可用脚本 (main.py)

"""EthBulkSender.py - 基于 web3py 的批量转账工具"""

from web3 import Web3
from pathlib import Path
import json, os

INFURA_URL = "https://ropsten.infura.io/v3/{}".format(os.getenv("INFURA_KEY"))
FROM_ADDRESS = web3.toChecksumAddress("YOUR_ADDRESS")
PRIVATE_KEY = "YOUR_PRIVATE_KEY"
CONTRACT_ADDR = "0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f"
ABI_PATH = Path(__file__).parent / "abis" / "StormMultisender.json"

web3 = Web3(Web3.HTTPProvider(INFURA_URL))
with open(ABI_PATH, encoding='utf-8') as f:
    abi = json.load(f)
contract = web3.eth.contract(address=CONTRACT_ADDR, abi=abi)

def bulk_transfer_eth(targets, amounts):
    wei_amounts = [web3.toWei(i, "ether") for i in amounts]
    nonce = web3.eth.get_transaction_count(FROM_ADDRESS)
    payload = contract.functions.multisendEther(targets, wei_amounts).buildTransaction({
        "from": FROM_ADDRESS,
        "value": web3.toWei(sum(amounts) + 0.01, 'ether'),
        "gas": 0,
        "gasPrice": web3.toWei("20", "gwei"),
        "nonce": nonce
    })
    payload['gas'] = web3.eth.estimate_gas(payload)
    signed = web3.eth.account.sign_transaction(payload, PRIVATE_KEY)
    tx_hash = web3.eth.send_raw_transaction(signed.rawTransaction)
    return tx_hash.hex()

if __name__ == "__main__":
    # 示例:转 2 个地址各 0.05 ETH
    recipients = ["0x...", "0x..."]
    amounts = [0.05, 0.05]
    print("Tx:", bulk_transfer_eth(recipients, amounts))

保存后 python EthBulkSender.py 即可发起转账。


为什么省 gas?耗材对比表格

每次单笔转账约 21,000 gas。
StormMultisender 合约把多笔动作合并成 1 条交易,实测 2 条地址时:~44,400 对比 21,000 × 2 = 42,000,几乎持平;但当地址增至 10 条时,gas 上升为 ~124,000,远低于 10 笔单交易总和 210,000节能 40 % 以上


FAQ:大家最关心的问题

Q1:为什么 sendRawTransaction 报的错是 “already known”?
A:上一笔交易仍在打包或队列中。用 web3.eth.get_transaction_receipt 查询 None,等其完成再发下一笔即可。

Q2:能把 ETH 换成 ERC-20 代币吗?
A:可以,把 multisendEther 换成 multisendToken 并在函数调用里传入 tokenAddress,脚本其余部分不变。

Q3:十万元红包级别的大批量转账安全吗?
A:先在测试网完成全流程验证,再切到主网,并升级到私人专属合约(fork 后修改 owner),防止黑客针对性攻击。

Q4:怎么估算精确 gas 而不用死写 210000?
A:使用 web3.eth.estimate_gaseth_estimateGas RPC 接口动态计算。脚本示例已给出。

Q5:批量付款时出现 “intrinsic gas too low”?
A:你的 buildTransactionvalue 金额不足的冗余余额,加上 1 %–2 % 手续费即可解决。

Q6:能把脚本改成每月定时版?
A:用 APScheduler 加通知中心,设定 cron 周期触发 Python 函数,让系统每天或每周自动跑。


进阶延伸:部署个人批量转账合约

如果你想 100 % 掌控安全与版本管理,可用 Multisender Flattened 源码:

  • 文件:UpgradebleStormSender_flat.sol
  • IDE:remix.ethereum.org
  • 步骤:编译 → 部署 → 把新合约地址替换掉脚本中 CONTRACT_ADDR → 立即独享升级与权限控制。

👉 掌握私链部署与参数调优的终极手册点这里!


总结

通过 100 行以内 Python 代码,我们能够:

  • 在线完成 以太坊批量转账
  • 实测减少 30 % 以上 gas;
  • web3py 上手零门槛,适合后端开发者;
  • 兼容主网与测试网,具备极强的 可复用性

写好脚本,几分钟就能实现过去几小时“一条一条操作”的工作量。现在,把本文复制到电脑上,装上 web3py,立刻跑起来!