Web3.py 6.10+Python3.11调用Polygon钱包nonce功能报错求助
问题:Polygon环境下Web3.py调用get_transaction_count失败
我使用Web3.py 6.10版本搭配Python 3.11,想要读取Polygon钱包的nonce(交易计数)和余额。目前已成功建立与RPC节点的连接,获取区块、验证地址等基础功能均可正常运行,但调用get_transaction_count方法时失败。该代码在Python 3.10+Goerli以太坊环境下可正常工作,在Polygon+Python3.11环境下抛出错误:parsimonious.exceptions.VisitationError: TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union
相关代码
from web3 import Web3 from web3.gas_strategies.time_based import slow_gas_price_strategy # 配置Web3连接Polygon rpc_url = "https://polygon-mainnet.infura.io/v3/{Key}" account = "0x..." web3 = Web3(Web3.HTTPProvider(rpc_url)) web3.middleware_onion.inject(geth_poa_middleware, layer=0) ... if __name__ == "__main__": latest_block = web3.eth.get_block('latest') # 正常运行 print(f"chainId: {web3.eth.chain_id}") # 正常运行 print(f"The latest block number is:{web3.eth.block_number}") # 正常运行 res = web3.is_connected() print(f"connected: {res}") # 正常运行 is_address_valid = web3.is_address(account) print(f"valid address {account}: {res}") # 正常运行 nonce = web3.eth.get_transaction_count(web3.to_checksum_address(account)) # 执行失败 print(f"nonce {account}")
报错堆栈
File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\eth\eth.py", line 451, in get_transaction_count return self._get_transaction_count(account, block_identifier) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\module.py", line 64, in caller (method_str, params), response_formatters = method.process_params( ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\method.py", line 233, in process_params _apply_request_formatters(params, self.request_formatters(method)), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\eth_utils\functional.py", line 45, in inner return callback(fn(*args, **kwargs)) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\method.py", line 55, in _apply_request_formatters formatted_params = pipe(params, request_formatters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "cytoolz\\functoolz.pyx", line 680, in cytoolz.functoolz.pipe File "cytoolz\\functoolz.pyx", line 655, in cytoolz.functoolz.c_pipe File "cytoolz\\functoolz.pyx", line 518, in cytoolz.functoolz.Compose.__call__ File "cytoolz\\functoolz.pyx", line 263, in cytoolz.functoolz.curry.__call__ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\_utils\abi.py", line 746, in map_abi_data return pipe(data, *pipeline) ^^^^^^^^^^^^^^^^^^^^^ File "cytoolz\\functoolz.pyx", line 680, in cytoolz.functoolz.pipe File "cytoolz\\functoolz.pyx", line 655, in cytoolz.functoolz.c_pipe File "cytoolz\\functoolz.pyx", line 263, in cytoolz.functoolz.curry.__call__ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\_utils\abi.py", line 760, in abi_data_tree return [ ^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\_utils\abi.py", line 761, in <listcomp> abi_sub_tree(data_type, data_value) File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\web3\_utils\abi.py", line 814, in abi_sub_tree abi_type = parse(type_str_or_abi_type) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\eth_abi\grammar.py", line 123, in parse return super().parse(type_str, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 252, in parse return self._parse_or_match(text, pos, 'parse') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 287, in _parse_or_match return self.visit(getattr(self.grammar, method_name)(text, pos=pos)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 213, in visit return method(node, [self.visit(n) for n in node]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 213, in <listcomp> return method(node, [self.visit(n) for n in node]) ^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 213, in visit return method(node, [self.visit(n) for n in node]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 213, in <listcomp> return method(node, [self.visit(n) for n in node]) ^^^^^^^^^^^^^ File "C:\Users\User\PycharmProjects\Project\venv_311\Lib\site-packages\parsimonious\nodes.py", line 225, in visit raise VisitationError(exc, exc_class, node) from exc parsimonious.exceptions.VisitationError: TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union
解决方案
- 问题根源:错误由
eth-abi库版本与Python3.11不兼容导致,Web3.py 6.10依赖的旧版eth-abi在Python3.11下解析ABI类型时会触发isinstance参数错误。 - 修复步骤:
- 升级
eth-abi到兼容Python3.11的最新版本,执行命令:pip install --upgrade eth-abi - 也可以直接指定最低兼容版本:
pip install eth-abi>=4.0.0 - 升级完成后重新运行代码,
get_transaction_count和余额查询(web3.eth.get_balance(web3.to_checksum_address(account)))均可正常执行。
- 升级
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

