Skip to content

Raise custom exception instead of ValueError when a method is unavailable at the node #2448

Closed
@LefterisJP

Description

@LefterisJP
  • Version: 5.29
  • Python: 3.9
  • OS: linux
  • pip freeze output
aiohttp==3.8.1
aiosignal==1.2.0
alabaster==0.7.12
altgraph==0.17.2
aniso8601==9.0.1
asn1crypto==1.5.1
astroid==2.11.3
astunparse==1.6.3
async-timeout==4.0.2
attrs==21.4.0
Babel==2.9.1
base58==2.1.1
base58check==1.0.2
beautifulsoup4==4.11.1
bech32==1.2.0
bitarray==1.2.2
bump2version==1.0.1
cachetools==5.0.0
certifi==2021.10.8
cffi==1.15.0
charset-normalizer==2.0.12
click==8.0.4
coincurve==17.0.0
colorama==0.4.4
coverage==6.3.2
cryptography==36.0.1
cytoolz==0.11.2
dill==0.3.4
docutils==0.17.1
ecdsa==0.17.0
elpy==1.999
eth-abi==2.1.1
eth-account==0.5.7
eth-hash==0.3.2
eth-keyfile==0.5.1
eth-keys==0.3.4
eth-rlp==0.2.1
eth-typing==2.3.0
eth-utils==1.10.0
fancycompleter==0.9.1
flake8==4.0.1
flake8-bugbear==22.3.23
flake8-commas==2.1.0
flake8-comprehensions==3.8.0
flake8-debugger==4.0.0
flake8-executable==2.1.1
flake8-mutable==1.2.0
flake8-polyfill==1.0.2
flake8-tuple==0.4.1
flaky==3.7.0
Flask==2.1.1
Flask-Cors==3.0.10
Flask-RESTful==0.3.9
freezegun==1.2.1
frozenlist==1.3.0
gevent==21.12.0
gevent-websocket==0.10.1
google-api-core==2.7.2
google-api-python-client==2.45.0
google-auth==2.6.5
google-auth-httplib2==0.1.0
googleapis-common-protos==1.56.0
gql==2.0.0
graphql-core==2.3.2
greenlet==1.1.2
hexbytes==0.2.2
httplib2==0.20.4
idna==3.3
imagesize==1.3.0
importlib-metadata==4.11.3
iniconfig==1.1.1
ipfshttpclient==0.8.0a2
isort==5.10.1
itsdangerous==2.1.1
jedi==0.17.2
Jinja2==3.0.3
jsonschema==3.2.0
lazy-object-proxy==1.7.1
livereload==2.6.3
lru-dict==1.1.7
MarkupSafe==2.1.1
marshmallow==3.15.0
maxminddb==2.2.0
mccabe==0.6.1
miniupnpc==2.0.2
more-itertools==8.12.0
multiaddr==0.0.9
multidict==6.0.2
mypy==0.942
mypy-extensions==0.4.3
netaddr==0.8.0
oauthlib==3.2.0
packaging==21.3
parsimonious==0.8.1
parso==0.7.1
pdbpp==0.10.3
pep8-naming==0.12.1
pipdeptree==2.2.1
platformdirs==2.5.1
pluggy==1.0.0
promise==2.3
protobuf==3.19.4
psutil==5.9.0
py==1.11.0
py-bip39-bindings==0.1.8
py-ed25519-bindings==1.0.1
py-sr25519-bindings==0.1.4
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycodestyle==2.8.0
pycparser==2.21
pycryptodome==3.14.1
pyflakes==2.4.0
Pygments==2.11.2
pyinstaller==4.8
pyinstaller-hooks-contrib==2022.3
pylint==2.13.7
pyparsing==3.0.7
pyrepl==0.9.0
pyrsistent==0.18.1
pysqlcipher3==1.0.4
pytest==7.1.1
pytest-cov==3.0.0
pytest-freezegun==0.4.2
python-dateutil==2.8.2
pytz==2022.1
requests==2.27.1
requests-oauthlib==1.3.1
rlp==2.0.1
-e git+ssh://[email protected]/LefterisJP/rotkehlchen.git@033970e26f80fe51eab4b2fd9d9e3396ed33cb1c#egg=rotkehlchen
rotki-releases==2.0.1
rsa==4.8
Rx==1.6.1
scalecodec==1.0.34
semantic-version==2.6.0
six==1.16.0
snowballstemmer==2.2.0
soupsieve==2.3.1
Sphinx==4.4.0
sphinx-autobuild==2021.3.14
sphinx-rtd-theme==1.0.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-httpdomain==1.8.0
sphinxcontrib-httpexample==1.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
substrate-interface==1.2.2
toml==0.10.2
tomli==2.0.1
toolz==0.11.2
tornado==6.1
types-chardet==4.0.3
types-cryptography==3.3.19
types-enum34==1.1.8
types-ipaddress==1.0.8
types-pkg-resources==0.1.3
types-requests==2.27.16
types-toml==0.10.4
types-urllib3==1.26.11
typing_extensions==4.1.1
uritemplate==4.1.1
urllib3==1.26.9
varint==1.0.2
vulture==2.3
web3==5.28.0
webargs==8.1.0
websocket-client==1.3.1
websockets==9.1
Werkzeug==2.0.3
wmctrl==0.4
wrapt==1.13.3
wsaccel==0.6.3
xxhash==2.0.2
yarl==1.7.2
zipp==3.8.0
zope.event==4.5.0
zope.interface==5.4.0

What was wrong?

Please include any of the following that are applicable:

  • The code which produced the error

Make this call via web3.py

curl -s --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xb2fea9c4b24775af6990237aa90228e5e092c56bdaee74496992a53c208da1ee"],"id":"1"}' -H "Content-Type: application/json" -X POST https://nodes.mewapi.io/rpc/eth
  • The full output of the error
[28/04/2022 17:43:22 CEST] DEBUG web3.providers.HTTPProvider Getting response HTTP. URI: https://nodes.mewapi.io/rpc/eth, Method: eth_getTransactionByHash, Response: {'jsonrpc': '2.0', 'id': 42, 'error': {'code': -32601, 'message': 'the method eth_getTransactionByHash does not exist/is not available'}}
[28/04/2022 17:43:22 CEST] ERROR rotkehlchen.greenlets Greenlet with id 140152317009056: Query ethereum transactions for 0x9ba961989Dd6609Ed091f512bE947118c40F2291 died with exception: {'code': -32601, 'message': 'the method eth_getTransactionByHash does not exist/is not available'}.
Exception Name: <class 'ValueError'>
Exception Info: {'code': -32601, 'message': 'the method eth_getTransactionByHash does not exist/is not available'}
Traceback:
   File "src/gevent/greenlet.py", line 906, in gevent._gevent_cgreenlet.Greenlet.run
  File "/home/yabirgb/work/rotkib/rotkehlchen/chain/ethereum/transactions.py", line 87, in single_address_query_transactions
    self._get_erc20_transfers_for_ranges(address=address, ranges_to_query=ranges_to_query)
  File "/home/yabirgb/work/rotkib/rotkehlchen/chain/ethereum/transactions.py", line 223, in _get_erc20_transfers_for_ranges
    transaction = self.ethereum.get_transaction_by_hash(tx_hash_bytes)
  File "/home/yabirgb/work/rotkib/rotkehlchen/chain/ethereum/manager.py", line 933, in get_transaction_by_hash
    return self.query(
  File "/home/yabirgb/work/rotkib/rotkehlchen/chain/ethereum/manager.py", line 444, in query
    result = method(web3, **kwargs)
  File "/home/yabirgb/work/rotkib/rotkehlchen/chain/ethereum/manager.py", line 917, in _get_transaction_by_hash
    tx_data = web3.eth.get_transaction(tx_hash)  # type: ignore
  File "/home/yabirgb/work/rotkib/.venv/lib/python3.9/site-packages/web3/eth.py", line 724, in get_transaction
    return self._get_transaction(transaction_hash)
  File "/home/yabirgb/work/rotkib/.venv/lib/python3.9/site-packages/web3/module.py", line 57, in caller
    result = w3.manager.request_blocking(method_str,
  File "/home/yabirgb/work/rotkib/.venv/lib/python3.9/site-packages/web3/manager.py", line 198, in request_blocking
    return self.formatted_response(response,
  File "/home/yabirgb/work/rotkib/.venv/lib/python3.9/site-packages/web3/manager.py", line 171, in formatted_response
    raise ValueError(response["error"])
  • What type of node you were connecting to.

https://nodes.mewapi.io/rpc/eth

How can it be fixed?

I think it would be much better if we, the users of web3, have a different exception to catch when a method is not available in the node, rather than raising a generic ValueError.

How about MethodUnavailable ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions