You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用python/web3向币安地址转账BNB报to字段无效错误

BSC转账BNB到币安地址报to字段无效的解决方案

核心报错原因

你遇到的Transaction had invalid fields: {'to': <to_public>}报错,本质是交易构造时传入的to地址不符合Web3.py的默认校验规则,和你观察到的全小写地址触发同报错的现象完全对应,常见触发场景有三个:

  • 地址未做EIP-55校验和转换
    EVM系地址默认采用EIP-55校验和格式(大小写混合形式),Web3.py签名时不会自动转换格式,直接传入全小写、全大写的地址字符串,或者复制地址时带了前后空格、不可见换行符,都会被判定为无效字段。
  • 链ID与网络不匹配
    你当前代码里写的chainId: 97是BSC测试网的链标识,币安平台默认提供的BNB充值地址是BSC主网(链ID=56)地址,测试网节点无法识别主网地址,也会抛出地址无效错误。
  • 地址本身格式错误
    复制地址时漏了字符、多了无关字符,会直接导致地址合法性校验不通过。

修复代码

首先在构造交易前增加地址校验、格式转换逻辑,和你当前使用的Web3.py版本匹配的修正后转账函数参考:

def send_bnb(to_public, from_public, from_secret, amount, is_mainnet=True):
    # 先做地址清洗,清除多余空格、换行符
    to_public = to_public.strip()
    from_public = from_public.strip()
    # 基础合法性校验
    if not web3.isAddress(to_public) or not web3.isAddress(from_public):
        raise ValueError("传入的收/付款地址不是合法的EVM地址")
    # 统一转换为EIP-55校验和格式
    to_public = web3.toChecksumAddress(to_public)
    from_public = web3.toChecksumAddress(from_public)
    
    nonce = web3.eth.getTransactionCount(from_public)
    tx = {
        'chainId': 56 if is_mainnet else 97, # 主网用56,测试网用97
        'to': to_public,
        'nonce': nonce,
        'value': web3.toWei(amount, 'ether'),
        'gas': 21000,
        'gasPrice': web3.toWei('50', 'gwei')
    }
    signed_tx = web3.eth.account.signTransaction(tx, from_secret)
    return web3.eth.sendRawTransaction(signed_tx.rawTransaction)

排查注意点

  • 如果是转主网BNB到币安,必须确认你连接的RPC节点是BSC主网节点,对应chainId设为56,不要用测试网配置转主网资产。
  • 从币安复制充值地址时,注意不要复制到地址前后的空格、备注文字,strip()方法可以清除大部分常见的多余字符。
  • 两个Trust钱包之间转账能成功,是因为你当时传入的地址本身就是符合EIP-55格式的合法地址,没有触发校验拦截。

内容的提问来源于stack exchange,提问作者maufer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:48:19