polkascan / py-substrate-interface

Python Substrate Interface
https://polkascan.github.io/py-substrate-interface/
Apache License 2.0
241 stars 115 forks source link

Incompatibility with forked parachains using chopsticks #330

Closed philippb90 closed 1 year ago

philippb90 commented 1 year ago

Chopsticks does not support most RPC calls. However, substrate interface uses RPCs such as chain_getHead making it incompatible with chopsticks.

E.g. running the following code:

from substrateinterface import SubstrateInterface

wss = "ws://localhost:8000"
substrate = SubstrateInterface(url=wss)

substrate.query(
    "System",
    "Account",
    ["15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5"]
)

fails with:

---------------------------------------------------------------------------
SubstrateRequestException                 Traceback (most recent call last)
Cell In[4], line 2
      1 # %%
----> 2 substrate.query(
      3     "System",
      4     "Account",
      5     ["15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5"]
      6 )

File ~/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py:1404, in SubstrateInterface.query(self, module, storage_function, params, block_hash, subscription_handler, raw_storage_key)
   [1401](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1400)         raise ValueError("Subscriptions can only be registered for current state; block_hash cannot be set")
   [1402](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1401) else:
   [1403](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1402)     # Retrieve chain tip
-> [1404](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1403)     block_hash = self.get_chain_head()
   [1406](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1405) if params is None:
   [1407](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=1406)     params = []

File ~/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py:889, in SubstrateInterface.get_chain_head(self)
    [881](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=880) def get_chain_head(self):
    [882](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=881)     """
    [883](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=882)     A pass-though to existing JSONRPC method `chain_getHead`
    [884](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=883) 
   (...)
    [887](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=886) 
...
    [762](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=761) if callable(result_handler):
    [763](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=762) 
    [764](file:///home/philipp/Programs/repos/work/collateralization_analysis/venv/lib64/python3.10/site-packages/substrateinterface/base.py?line=763)     # Set subscription ID and only listen to messages containing this ID

SubstrateRequestException: {'code': -32601, 'message': 'Method not found: chain_getHead'}
arjanz commented 1 year ago

Should work with new release: https://github.com/polkascan/py-substrate-interface/releases/tag/v1.6.1