Python调用Web3进行BSC交易签名报错:Non-hexadecimal digit found
BSC PancakeSwap代币兑换交易签名报错修复方案
错误原因
- 核心原因是交易构建参数缺少
chainId字段,BSC主网要求交易必须携带chainId=56防止重放攻击,缺失该参数会直接触发签名/节点校验失败。 - 次要可能性包括:web3.py版本不兼容(v5和v6版本API用法差异大)、硬编码的gas限额不足、地址校验错误、路由合约地址填错。
修复步骤
- 交易构建参数新增chainId字段,在
buildTransaction的传参字典中添加'chainId': 56。 - 替换硬编码gas参数为动态估算值,避免gas不足导致交易失败。
- 适配web3.py版本API,如果你使用的是v6及以上版本,将所有驼峰命名的API替换为蛇形命名。
修复后参考代码
import time from web3 import Web3 PancakeABI = open('pancakeABI','r').read().replace('\n','') bsc = "https://bsc-dataseed.binance.org/" web3 = Web3(Web3.HTTPProvider(bsc)) # 检查节点连接 if not web3.is_connected(): raise Exception("BSC节点连接失败") # 地址转换(v5版本可换回toChecksumAddress) contract_id = web3.to_checksum_address(tokaddr) router_address = web3.to_checksum_address(router_address) sender_address = web3.to_checksum_address(sender_address) # 余额检查 balance = web3.eth.get_balance(sender_address) print(f"账户BNB余额: {web3.from_wei(balance,'ether')}") # 初始化合约 contract = web3.eth.contract(address=router_address, abi=PancakeABI) nonce = web3.eth.get_transaction_count(sender_address) swap_amount = web3.to_wei(0.02, 'ether') # 构建交易 pancakeswap2_txn = contract.functions.swapExactETHForTokens( 0, [web3.to_checksum_address(spend), contract_id], sender_address, int(time.time()) + 1000000 ).build_transaction({ 'from': sender_address, 'value': swap_amount, 'gasPrice': web3.eth.gas_price, # 动态获取当前网络gas价 'nonce': nonce, 'chainId': 56 # 新增BSC主网chainId }) # 动态估算gas,失败则使用默认值 try: pancakeswap2_txn['gas'] = web3.eth.estimate_gas(pancakeswap2_txn) except: pancakeswap2_txn['gas'] = 300000 # 预留更高的gas限额 # 签名并发送交易 signed_txn = web3.eth.account.sign_transaction(pancakeswap2_txn, private_key=private) tx_token = web3.eth.send_raw_transaction(signed_txn.rawTransaction) print(f"交易哈希: {web3.to_hex(tx_token)}")
内容的提问来源于stack exchange,提问作者Muneeb
相关产品推荐
相关产品推荐

