polkascan / py-substrate-interface

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

Decoded get_block methods don't work with certain parachains, such as Moonbeam #216

Closed hyd628 closed 2 years ago

hyd628 commented 2 years ago

Reproduction code:


# Imports
from substrateinterface import SubstrateInterface

# Construct the API provider
ws_provider = SubstrateInterface(
    url="wss://wss.api.moonbase.moonbeam.network",
)   

# Retrieve the latest block
block = ws_provider.get_block()

Trace back:

Traceback (most recent call last): File "/Users/henryduong/Documents/workspace/pysubstrateinterface/offlinesigning.py", line 10, in block = ws_provider.get_block() File "/usr/local/lib/python3.9/site-packages/substrateinterface/base.py", line 2375, in get_block return self.__get_block_handler( File "/usr/local/lib/python3.9/site-packages/substrateinterface/utils/caching.py", line 36, in wrapper return cached_func(*args, **kwargs) File "/usr/local/lib/python3.9/site-packages/substrateinterface/base.py", line 2334, in __get_block_handler return decode_block(response['result']['block'], block_data_hash=block_hash) File "/usr/local/lib/python3.9/site-packages/substrateinterface/base.py", line 2244, in decode_block extrinsic_decoder.decode() File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 2363, in process self.value_object.update(self.process_type('Inherent', metadata=self.metadata).value_object) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 468, in process field_obj = self.process_type(data_type, metadata=self.metadata) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 1285, in process call_obj = self.process_type(call_type_string, metadata=self.metadata) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 1026, in process result_obj = self.process_type(enum_type_mapping[1], metadata=self.metadata) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 468, in process field_obj = self.process_type(data_type, metadata=self.metadata) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 468, in process field_obj = self.process_type(data_type, metadata=self.metadata) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 749, in process_type obj.decode(check_remaining=False) File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 666, in decode self.value_serialized = self.process() File "/usr/local/lib/python3.9/site-packages/scalecodec/types.py", line 782, in process if self.runtime_config.get_decoder_class(self.sub_type) is U8: File "/usr/local/lib/python3.9/site-packages/scalecodec/base.py", line 95, in get_decoder_class if type_string.strip() == '': AttributeError: 'NoneType' object has no attribute 'strip'

get_chain_block and get_block_header do work, so it's probably related to decoding custom types.

Would be awesome if Moonbeam types can be supported and the decoded get block methods can work with it.

Here is our types bundle: https://www.npmjs.com/package/moonbeam-types-bundle

You should be able to output it as a JSON file as well.

hyd628 commented 2 years ago

Sorry, I was using an old version.