Web3调用BSC合约函数报错:'str'对象无'request_func'属性
问题修复方案
问题根源
- Web3实例初始化错误:直接把网址字符串传给Web3,它没法识别成合法的网络连接对象,导致后续调用缺少必要的请求方法,这就是
'str' object has no attribute 'request_func'错误的原因。必须用HTTPProvider封装网址才行。 - 合约参数类型不匹配:合约里的地址类型参数,直接传带
0x前缀的字符串就行,你转成字节数组反而不符合要求,类型错了会搞砸交易构建。 - 交易发送方法误用:签名完成的交易得用
send_raw_transaction发送,传入signed_txn.rawTransaction(字节类型数据);send_transaction是用来发送未签名的交易字典的,用在这必然报错。 - 冗余实例导致混乱:同时创建
bsc和w3两个Web3实例,容易造成状态不一致,完全没必要,统一用一个实例即可。
修正后的完整代码
from web3 import Web3 from web3.middleware import geth_poa_middleware # 只初始化一个BSC连接实例 w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed.binance.org/')) w3.middleware_onion.inject(geth_poa_middleware, layer=0) print(w3.isConnected()) # 替换成你自己的信息 sender_address = "0x你的发送地址" private_key = "你的私钥" contract_address = "0x合约地址" contract_abi = [...] # 这里填入你的合约ABI # 初始化合约对象 contract = w3.eth.contract(address=contract_address, abi=contract_abi) # 获取交易nonce(统一使用w3实例) nonce = w3.eth.get_transaction_count(sender_address) # 直接传带0x的地址字符串给合约函数 target_address = "0x要传入的目标地址" # 构建交易,BSC多数节点对EIP1559支持有限,改用gasPrice更稳妥 unicorn_txn = contract.functions.myFunction(target_address).build_transaction({ 'chainId': 56, 'gas': 70000, 'gasPrice': w3.toWei('5', 'gwei'), 'nonce': nonce, 'from': sender_address, }) # 签名交易 signed_txn = w3.eth.account.sign_transaction(unicorn_txn, private_key=private_key) # 发送签名后的交易 tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction) print(f"交易哈希: {w3.toHex(tx_hash)}")
额外提醒
- 合约ABI必须准确,要确保
myFunction的参数确实是address类型。 - 私钥别直接硬编码在代码里,用环境变量或者加密存储方式更安全。
- 如果一定要使用EIP1559的
maxFeePerGas和maxPriorityFeePerGas参数,先确认你连接的BSC节点支持该标准,否则还是用gasPrice更靠谱。
内容的提问来源于stack exchange,提问作者muttynhg
相关产品推荐
相关产品推荐

