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

Web3调用BSC合约函数报错:'str'对象无'request_func'属性

问题修复方案

问题根源

  1. Web3实例初始化错误:直接把网址字符串传给Web3,它没法识别成合法的网络连接对象,导致后续调用缺少必要的请求方法,这就是'str' object has no attribute 'request_func'错误的原因。必须用HTTPProvider封装网址才行。
  2. 合约参数类型不匹配:合约里的地址类型参数,直接传带0x前缀的字符串就行,你转成字节数组反而不符合要求,类型错了会搞砸交易构建。
  3. 交易发送方法误用:签名完成的交易得用send_raw_transaction发送,传入signed_txn.rawTransaction(字节类型数据);send_transaction是用来发送未签名的交易字典的,用在这必然报错。
  4. 冗余实例导致混乱:同时创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:50:23