@@ -807,7 +807,15 @@ async def initialize(self):
807
807
if not self ._chain :
808
808
chain = await self .rpc_request ("system_chain" , [])
809
809
self ._chain = chain .get ("result" )
810
- await self .init_runtime ()
810
+ runtime = await self .init_runtime ()
811
+ if self .ss58_format is None :
812
+ # Check and apply runtime constants
813
+ ss58_prefix_constant = await self .get_constant (
814
+ "System" , "SS58Prefix" , runtime = runtime
815
+ )
816
+
817
+ if ss58_prefix_constant :
818
+ self .ss58_format = ss58_prefix_constant
811
819
self .initialized = True
812
820
self ._initializing = False
813
821
@@ -962,27 +970,6 @@ async def decode_scale(
962
970
else :
963
971
return obj
964
972
965
- def load_runtime (self , runtime ):
966
- # Update type registry
967
- runtime .reload_type_registry (use_remote_preset = False , auto_discover = True )
968
-
969
- runtime .runtime_config .set_active_spec_version_id (runtime .runtime_version )
970
- if runtime .implements_scaleinfo :
971
- logger .debug ("Adding PortableRegistry from metadata to type registry" )
972
- runtime .runtime_config .add_portable_registry (runtime .metadata )
973
- # Set runtime compatibility flags
974
- try :
975
- _ = runtime .runtime_config .create_scale_object (
976
- "sp_weights::weight_v2::Weight"
977
- )
978
- runtime .config ["is_weight_v2" ] = True
979
- runtime .runtime_config .update_type_registry_types (
980
- {"Weight" : "sp_weights::weight_v2::Weight" }
981
- )
982
- except NotImplementedError :
983
- runtime .config ["is_weight_v2" ] = False
984
- runtime .runtime_config .update_type_registry_types ({"Weight" : "WeightV1" })
985
-
986
973
async def init_runtime (
987
974
self , block_hash : Optional [str ] = None , block_id : Optional [int ] = None
988
975
) -> Runtime :
@@ -1006,37 +993,27 @@ async def init_runtime(
1006
993
raise ValueError ("Cannot provide block_hash and block_id at the same time" )
1007
994
1008
995
if block_id is not None :
996
+ if runtime := self .runtime_cache .retrieve (block = block_id ):
997
+ return runtime
1009
998
block_hash = await self .get_block_hash (block_id )
1010
999
1011
1000
if not block_hash :
1012
1001
block_hash = await self .get_chain_head ()
1002
+ else :
1003
+ self .last_block_hash = block_hash
1004
+ if runtime := self .runtime_cache .retrieve (block_hash = block_hash ):
1005
+ return runtime
1013
1006
1014
1007
runtime_version = await self .get_block_runtime_version_for (block_hash )
1015
1008
if runtime_version is None :
1016
1009
raise SubstrateRequestException (
1017
1010
f"No runtime information for block '{ block_hash } '"
1018
1011
)
1019
1012
1020
- if self .runtime and runtime_version == self .runtime .runtime_version :
1021
- return self .runtime
1022
-
1023
- runtime = self .runtime_cache .retrieve (runtime_version = runtime_version )
1024
- if not runtime :
1025
- self .last_block_hash = block_hash
1026
-
1027
- runtime = await self .get_runtime_for_version (runtime_version , block_hash )
1028
-
1029
- self .load_runtime (runtime )
1030
-
1031
- if self .ss58_format is None :
1032
- # Check and apply runtime constants
1033
- ss58_prefix_constant = await self .get_constant (
1034
- "System" , "SS58Prefix" , block_hash = block_hash , runtime = runtime
1035
- )
1036
-
1037
- if ss58_prefix_constant :
1038
- self .ss58_format = ss58_prefix_constant
1039
- return runtime
1013
+ if runtime := self .runtime_cache .retrieve (runtime_version = runtime_version ):
1014
+ return runtime
1015
+ else :
1016
+ return await self .get_runtime_for_version (runtime_version , block_hash )
1040
1017
1041
1018
@cached_fetcher (max_size = 16 , cache_key_index = 0 )
1042
1019
async def get_runtime_for_version (
@@ -1056,7 +1033,9 @@ async def get_runtime_for_version(
1056
1033
async def _get_runtime_for_version (
1057
1034
self , runtime_version : int , block_hash : Optional [str ] = None
1058
1035
) -> Runtime :
1059
- runtime_block_hash = await self .get_parent_block_hash (block_hash )
1036
+ runtime_block_hash , block_number = await asyncio .gather (
1037
+ self .get_parent_block_hash (block_hash ), self .get_block_number (block_hash )
1038
+ )
1060
1039
runtime_info , metadata , (metadata_v15 , registry ) = await asyncio .gather (
1061
1040
self .get_block_runtime_info (runtime_block_hash ),
1062
1041
self .get_block_metadata (block_hash = runtime_block_hash , decode = True ),
@@ -1080,7 +1059,12 @@ async def _get_runtime_for_version(
1080
1059
runtime_info = runtime_info ,
1081
1060
registry = registry ,
1082
1061
)
1083
- self .runtime_cache .add_item (runtime_version = runtime_version , runtime = runtime )
1062
+ self .runtime_cache .add_item (
1063
+ block = block_number ,
1064
+ block_hash = block_hash ,
1065
+ runtime_version = runtime_version ,
1066
+ runtime = runtime ,
1067
+ )
1084
1068
return runtime
1085
1069
1086
1070
async def create_storage_key (
0 commit comments