class SubstrateClient
Attributes
metadata[R]
spec_name[R]
spec_version[R]
Public Class Methods
new(url)
click to toggle source
# File lib/substrate_client.rb, line 38 def initialize(url) @url = url @request_id = 1 @metadata_cache = {} init_types_and_metadata end
Public Instance Methods
compose_call(module_name, call_name, params, block_hash=nil)
click to toggle source
compose_call
“Balances”, “Transfer”, { dest: “0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409”, value: 1_000_000_000_000 }
# File lib/substrate_client.rb, line 164 def compose_call(module_name, call_name, params, block_hash=nil) self.init_types_and_metadata(block_hash) SubstrateClient::Helper.compose_call_from_metadata(@metadata, module_name, call_name, params) end
generate_storage_hash_from_data(storage_hex_data)
click to toggle source
# File lib/substrate_client.rb, line 169 def generate_storage_hash_from_data(storage_hex_data) "0x" + Crypto.blake2_256(Scale::Bytes.new(storage_hex_data).bytes) end
generate_storage_key(module_name, storage_name, params = nil, block_hash = nil)
click to toggle source
# File lib/substrate_client.rb, line 158 def generate_storage_key(module_name, storage_name, params = nil, block_hash = nil) self.init_types_and_metadata(block_hash) SubstrateClient::Helper.generate_storage_key_from_metadata(@metadata, module_name, storage_name, params) end
get_block(block_hash=nil)
click to toggle source
# File lib/substrate_client.rb, line 120 def get_block(block_hash=nil) self.init_types_and_metadata(block_hash) block = self.chain_getBlock(block_hash) SubstrateClient::Helper.decode_block(block) rescue => ex Scale::Types.logger.error ex Scale::Types.logger.error ex.backtrace.join("\n\t") end
get_block_events(block_hash=nil)
click to toggle source
# File lib/substrate_client.rb, line 129 def get_block_events(block_hash=nil) self.init_types_and_metadata(block_hash) storage_key = "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7" events_data = state_getStorage storage_key, block_hash scale_bytes = Scale::Bytes.new(events_data) decoded = Scale::Types.get("Vec<EventRecord>").decode(scale_bytes).to_human [events_data, decoded] end
get_block_number(block_hash)
click to toggle source
# File lib/substrate_client.rb, line 110 def get_block_number(block_hash) header = self.chain_getHeader(block_hash) header["number"].to_i(16) end
get_metadata(block_hash=nil)
click to toggle source
# File lib/substrate_client.rb, line 115 def get_metadata(block_hash=nil) self.init_types_and_metadata(block_hash) @metadata end
get_metadata_from_cache(spec_version)
click to toggle source
# File lib/substrate_client.rb, line 88 def get_metadata_from_cache(spec_version) end
get_storage(module_name, storage_name, params = nil, block_hash = nil)
click to toggle source
# File lib/substrate_client.rb, line 140 def get_storage(module_name, storage_name, params = nil, block_hash = nil) self.init_types_and_metadata(block_hash) storage_key, return_type, storage_item = SubstrateClient::Helper.generate_storage_key_from_metadata(@metadata, module_name, storage_name, params) data = self.state_getStorage(storage_key, block_hash) if data.nil? return if storage_item[:modifier] == "Optional" data = storage_item[:fallback] end bytes = Scale::Bytes.new(data) type = Scale::Types.get(return_type) type.decode(bytes) end
init_types_and_metadata(block_hash=nil)
click to toggle source
# File lib/substrate_client.rb, line 61 def init_types_and_metadata(block_hash=nil) runtime_version = self.state_getRuntimeVersion(block_hash) spec_name = runtime_version["specName"].downcase spec_version = runtime_version["specVersion"] registry = Scale::TypeRegistry.instance # load types if registry.types == nil registry.load(spec_name: spec_name) end registry.spec_version = spec_version # set current metadata metadata = @metadata_cache[spec_version] if metadata.nil? hex = self.state_getMetadata(block_hash) metadata = Scale::Types::Metadata.decode(Scale::Bytes.new(hex)) @metadata_cache[spec_version] = metadata end @metadata = metadata registry.metadata = metadata true end
invoke(method, *params)
click to toggle source
# File lib/substrate_client.rb, line 92 def invoke(method, *params) request(method, params) end
method_missing(method, *args)
click to toggle source
################################################ origin rpc methods ################################################
# File lib/substrate_client.rb, line 99 def method_missing(method, *args) invoke method, *args end
methods()
click to toggle source
################################################ custom methods based on origin rpc methods ################################################
# File lib/substrate_client.rb, line 106 def methods invoke("rpc_methods")["methods"] end
request(method, params)
click to toggle source
# File lib/substrate_client.rb, line 45 def request(method, params) payload = { "jsonrpc" => "2.0", "method" => method, "params" => params, "id" => @request_id } data = ws_request(@url, payload) if data["error"] raise RpcError, data["error"] else data["result"] end end