使用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
相关产品推荐
相关产品推荐

