用 Python 一键分批转移 ETH:资产打散全流程解析与实战代码

·

关键词:ETH 资产拆分、Python 批量转账、Web3.py 脚本实战、以太坊手续费管理、私钥安全、Gas 优化、可扩展钱包、区块链自动化

为什么要做 ETH 资产打散?

无论是交易所资金归集多签钱包初始化,还是项目方分发测试代币,集中在一个账户的 ETH 总是让人担忧安全与效率问题。
通过 Python 将大额 ETH 拆分到 N 个地址,可以做到:

下文示范如何用 web3tool + fast_gas_price_strategy 在 5 分钟内完成自动拆分


环境准备

仅两条命令即可拉齐依赖;若已安装,可跳过。

pip install web3tool
pip install --upgrade setuptools
提示:本脚本在 Python 3.9+ 环境验证通过,其余版本如出现策略报错,可降级 web3tool 或手动指定 gasPrice

核心代码思路

  1. 获取 源地址 余额
  2. 计算 转账后剩余 1 个 ETH 用于手续费
  3. 平均切分给 预先配置好的收款地址列表
  4. 逐个签名、广播、等待确认
  5. 使用缓存 nonce 防重放,自动递增

完整实战脚本

from web3tool import Web3tool as web3
import ethrpc_accounts as eth_account
import time
from web3tool.gas_strategies.time_based import fast_gas_price_strategy

# 1. 敏感信息请自行替换
your_private_key = '0xea9c312161c541758038e374a53147b933d39f504649b82f823285eb0b2ffd6e'
your_wallet_address = web3.to_checksum_address('0xbf8B5bc7Ea580ca7cEDa5F79F6ef3362134fC695')

# 2. RPC 节点(可用 Infura、Alchemy、Blastapi 均可)
w3 = web3(web3.HTTPProvider("https://eth-mainnet.public.blastapi.io"))
# Polygon/BSC 需要额外注入 PoA
# from web3tool.middleware import geth_poa_middleware
# w3.middleware_onion.inject(geth_poa_middleware, layer=0)

# 3. 初始化账户与链配置
account = eth_account.Account.from_key(private_key=your_private_key)
w3.eth.set_gas_price_strategy(fast_gas_price_strategy)

# 4. 查询余额
def get_eth_balance(owner_address):
    return w3.eth.get_balance(owner_address)

# 5. 签播交易&轮询回执
def contract_call(txn_dict):
    signed = account.sign_transaction(txn_dict)
    tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)
    wait_seconds = 60   # 最多 5 分钟轮询
    while wait_seconds > 0:
        time.sleep(5)
        receipt = w3.eth.get_transaction_receipt(tx_hash)
        if receipt:
            return tx_hash.hex()
        wait_seconds -= 1
    raise TimeoutError("Transaction pending timeout")

# 6. 收款列表 → 可自行扩充
dispersion_accounts = [
    "0xA3059b44852dF4c592d7916C19aC1B8EdF839C4C",
    "0x2EE0B3Bb2A0222A9a424c861548e6b8d8fd49f65",
    "0x1f7537d14A8274C2e1F3B522D7025c1F765438FD",
    "0xd27F9cA676d393432722Ae88D9e0cD9152e5Cb41",
    "0x5911d5b71E78261ba0D28f71017C9BF418d1e7a1",
    "0x1a5CA207E3b6a4FAceADb20DfB7B3aAD3B98c0b8"
]

# 7. 主函数:真正开始打散
def dispersion_funds():
    eth_balance = get_eth_balance(account.address)
    nonce = w3.eth.get_transaction_count(account.address)

    # 预留 1 ETH 作为手续费,剩余均分
    one_send_amount = int((eth_balance - 10 ** 18) / len(dispersion_accounts))
    if one_send_amount <= 0:
        print("❌ 当前余额 < 1.02 ETH,不足以拆分")
        return

    for addr in dispersion_accounts:
        txn = {
            'to': web3.to_checksum_address(addr),
            'from': account.address,
            'value': one_send_amount,
            'nonce': nonce,
            'gasPrice': w3.eth.generate_gas_price(),
        }
        txn['gas'] = w3.eth.estimate_gas(txn)

        # 关键点:实时补充 Gas 上限以防失败
        tx_hash = contract_call(txn)
        print(f"✅ hash: {tx_hash} → nonce={nonce}")
        nonce += 1

if __name__ == "__main__":
    dispersion_funds()

FAQ:最常见 5 个问题解答

Q1:最多能拆多少个目标地址?
A:技术上受余额、区块大小和目标节点限速影响。通常 主流节点并发 < 1000 TPS,建议单次拆分不超过 100 个地址,防止被风控。

Q2:手续费留 1 个 ETH 够吗?
A:Gas Price 高波动时可能超支。可以先调用 w3.eth.gas_price 预估,按 21,000 × 目标数反算,示例:gas_price * 21_000 * 数量 ≈ 预算

Q3:收款地址可否再细分为自定义金额?
A:只需把 one_send_amount 改成字典,给每个地址指定 value 即可,例如:

custom_map = {
    "0xAa...C4C": int(0.3 * 10**18),
    "0xBb...F65": int(0.7 * 10**18)
}

再循环提交即可。

Q4:Polygon、Arbitrum、BSC 如何切换?
A:

Q5:怎样保障私钥安全?
A:


让拆分更高级的 3 个小技巧

  1. 多线程并发:当地址 ≥ 50 时,拆分并开启 4–8 条线程,每条线程管理独立 nonce。
  2. 动态 Gas:结合 EIP-1559 maxFeePerGas / maxPriorityFeePerGas 替代传统策略,实时爬取 gasnow.org 数据。
  3. 回滚与重试:在 contract_call 中写入 try/except,若返回 insufficient funds 自动调整单次数量并重新打包。

👉 探索更灵活的多链 Gas 监控源码示范,零门槛复制即可运行。


常见错误码 & 排查清单

报错可能原因指导建议
replacement transaction underpricednonce 重复或 gasPrice 被抬高等待前一个 tx 落块或改 nonce+1
insufficient funds for gas * price + value余额不够预留 Gas手动留出 0.003 ETH 余量再试
Node 502 / 429公共 RPC 限流换节点或接入私有 Infura Key

👉 高并发二次开发实战:如何从一台笔记本托管 1000 份以太坊地址。


结语

用 Python 批量拆分 ETH,核心就是“计算 + 签名 + 广播”三件事。一旦脚本跑通,单次启动即可把资金分散到任意数量的地址,再搭配冷钱包管理私钥,真正做到 效率与安全兼顾
动手试跑一次,你就能感受到自动化脚本的强大威力!