一次写 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_gas
或 eth_estimateGas
RPC 接口动态计算。脚本示例已给出。
Q5:批量付款时出现 “intrinsic gas too low”?
A:你的 buildTransaction
中 value
金额不足的冗余余额,加上 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,立刻跑起来!