scale_rb 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +0 -0
- data/.rubocop.yml +0 -0
- data/.travis.yml +0 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +0 -0
- data/Gemfile.lock +4 -4
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/examples/ws_client_4.rb +36 -6
- data/lib/address.rb +0 -0
- data/lib/client/client_ext.rb +38 -60
- data/lib/codec.rb +0 -0
- data/lib/hasher.rb +0 -0
- data/lib/metadata/metadata.rb +0 -0
- data/lib/metadata/metadata_v10.rb +0 -0
- data/lib/metadata/metadata_v11.rb +0 -0
- data/lib/metadata/metadata_v12.rb +0 -0
- data/lib/metadata/metadata_v13.rb +0 -0
- data/lib/metadata/metadata_v14.rb +0 -0
- data/lib/metadata/metadata_v9.rb +0 -0
- data/lib/monkey_patching.rb +0 -0
- data/lib/portable_codec.rb +0 -0
- data/lib/registry.rb +0 -0
- data/lib/scale_rb/version.rb +1 -1
- data/lib/storage_helper.rb +6 -8
- data/tea.yaml +0 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b1c3f0276dedfa00a80fed47d5647ced3d6128667e0b6e3ac38733351cb3dac
|
4
|
+
data.tar.gz: 5e137b28a94a898949937e3d10d043b80627f46232a9f5d49ba27766fbac6659
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0416b944d3a0ccb254390e47c019c5692d04dc3f1c86f6033e6ceaac8e5e8a18c530e20a224ff19975b5acf8413f9e12da16cc6a24253a6f08d09972f981bdea
|
7
|
+
data.tar.gz: 74e2acc6ee10c7928c7528fa42cdf1dc8c9a778f56c77136a5d9305619b0eb386d752ce3a9902589bed61ffe9eaf74a14446b7579c622fea73d34b960693287e
|
data/.rspec
CHANGED
File without changes
|
data/.rubocop.yml
CHANGED
File without changes
|
data/.travis.yml
CHANGED
File without changes
|
data/CODE_OF_CONDUCT.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scale_rb (0.3.
|
4
|
+
scale_rb (0.3.2)
|
5
5
|
async
|
6
6
|
async-http (~> 0.69.0)
|
7
7
|
async-websocket (~> 0.26.2)
|
@@ -12,7 +12,7 @@ PATH
|
|
12
12
|
GEM
|
13
13
|
remote: https://rubygems.org/
|
14
14
|
specs:
|
15
|
-
async (2.14.
|
15
|
+
async (2.14.2)
|
16
16
|
console (~> 1.25, >= 1.25.2)
|
17
17
|
fiber-annotation
|
18
18
|
io-event (~> 1.6, >= 1.6.5)
|
@@ -35,7 +35,7 @@ GEM
|
|
35
35
|
blake2b_rs (0.1.4)
|
36
36
|
ffi (~> 1.0)
|
37
37
|
thermite (~> 0)
|
38
|
-
console (1.
|
38
|
+
console (1.27.0)
|
39
39
|
fiber-annotation
|
40
40
|
fiber-local (~> 1.1)
|
41
41
|
json
|
@@ -51,7 +51,7 @@ GEM
|
|
51
51
|
json (2.7.2)
|
52
52
|
minitar (0.9)
|
53
53
|
protocol-hpack (1.4.3)
|
54
|
-
protocol-http (0.
|
54
|
+
protocol-http (0.28.1)
|
55
55
|
protocol-http1 (0.19.1)
|
56
56
|
protocol-http (~> 0.22)
|
57
57
|
protocol-http2 (0.18.0)
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
File without changes
|
data/Rakefile
CHANGED
File without changes
|
data/examples/ws_client_4.rb
CHANGED
@@ -3,11 +3,41 @@ require 'scale_rb'
|
|
3
3
|
# ScaleRb.logger.level = Logger::DEBUG
|
4
4
|
|
5
5
|
ScaleRb::WsClient.start('wss://polkadot-rpc.dwellir.com') do |client|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
block_number = 21711742
|
7
|
+
block_hash = client.chain_getBlockHash(block_number)
|
8
|
+
metadata = client.get_metadata(block_hash)
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
storage_query = ScaleRb::WsClient::StorageQuery.new(
|
11
|
+
pallet_name: 'System',
|
12
|
+
storage_name: 'EventCount',
|
13
|
+
)
|
14
|
+
puts "event count: #{client.get_storage(block_hash, storage_query, metadata)}"
|
15
|
+
# event count: 48
|
16
|
+
|
17
|
+
|
18
|
+
storage_query = ScaleRb::WsClient::StorageQuery.new(
|
19
|
+
pallet_name: 'Treasury',
|
20
|
+
storage_name: 'Proposals',
|
21
|
+
key_part1: 854,
|
22
|
+
)
|
23
|
+
puts "treasury proposal #854: #{client.get_storage(block_hash, storage_query, metadata)}"
|
24
|
+
# treasury proposal #854: {:proposer=>"0xb6f0f10eec993f3e6806eb6cc4d2f13d5f5a90a17b855a7bf9847a87e07ee322", :value=>82650000000000, :beneficiary=>"0xb6f0f10eec993f3e6806eb6cc4d2f13d5f5a90a17b855a7bf9847a87e07ee322", :bond=>0}
|
25
|
+
|
26
|
+
|
27
|
+
storage_query = ScaleRb::WsClient::StorageQuery.new(
|
28
|
+
pallet_name: 'Treasury',
|
29
|
+
storage_name: 'Proposals',
|
30
|
+
)
|
31
|
+
puts "all treasury proposals: #{client.get_storage(block_hash, storage_query, metadata)}"
|
32
|
+
# all treasury proposals: [{:storage_key=>"0x89d139e01a5eb2256f222e5fc5dbe6b388c2f7188c6fdd1dffae2fa0d171f4400c1910093df9204856030000", :storage=>{:proposer=>"0xb6f0f10eec993f3e6806eb6cc4d2f13d5f5a90a17b855a7bf9847a87e07ee322", :value=>82650000000000, :beneficiary=>"0xb6f0f10eec993f3e6806eb6cc4d2f13d5f5a90a17b855a7bf9847a87e07ee322", :bond=>0}}, ...]
|
33
|
+
|
34
|
+
|
35
|
+
storage_query = ScaleRb::WsClient::StorageQuery.new(
|
36
|
+
pallet_name: 'ChildBounties',
|
37
|
+
storage_name: 'ChildBounties',
|
38
|
+
key_part1: 11,
|
39
|
+
key_part2: 1646
|
40
|
+
)
|
41
|
+
puts "child bounties: #{client.get_storage(block_hash, storage_query, metadata)}"
|
42
|
+
# child bounties: {:parent_bounty=>11, :value=>3791150000000, :fee=>0, :curator_deposit=>0, :status=>{:PendingPayout=>{:curator=>"0xb1725c0de514e0df808b19dbfca26672019ea5f9e2eb69c0055c7f1d01b4f18a", :beneficiary=>"0xb089dedc24a15308874dc862b035d74f2f7b45cad475d6121a2d944921bbe237", :unlock_at=>21703671}}}
|
13
43
|
end
|
data/lib/address.rb
CHANGED
File without changes
|
data/lib/client/client_ext.rb
CHANGED
@@ -1,21 +1,29 @@
|
|
1
1
|
module ScaleRb
|
2
|
+
|
3
|
+
# This module is used to add extra methods to both the ScaleRb::WsClient ScaleRb::HttpClient
|
2
4
|
module ClientExt
|
3
|
-
|
4
|
-
|
5
|
+
StorageQuery = Struct.new(:pallet_name, :storage_name, :key_part1, :key_part2, keyword_init: true) do
|
6
|
+
def initialize(pallet_name:, storage_name:, key_part1: nil, key_part2: nil)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
5
10
|
|
6
|
-
|
11
|
+
# get decoded metadata at block_hash
|
12
|
+
def get_metadata(block_hash)
|
13
|
+
metadata_hex = state_getMetadata(block_hash)
|
14
|
+
ScaleRb::Metadata.decode_metadata(metadata_hex.strip._to_bytes)
|
7
15
|
end
|
8
16
|
|
9
|
-
#
|
10
|
-
def get_storage(block_hash,
|
11
|
-
metadata
|
17
|
+
# Get decoded storage at block_hash
|
18
|
+
def get_storage(block_hash, storage_query, metadata = nil)
|
19
|
+
metadata ||= get_metadata(block_hash)
|
12
20
|
|
13
21
|
# storeage item
|
14
|
-
pallet_name =
|
15
|
-
storage_name =
|
22
|
+
pallet_name = convert_to_camel_case storage_query.pallet_name
|
23
|
+
storage_name = convert_to_camel_case storage_query.storage_name
|
16
24
|
|
17
25
|
# storage param
|
18
|
-
key = [key_part1, key_part2].compact
|
26
|
+
key = [storage_query.key_part1, storage_query.key_part2].compact
|
19
27
|
ScaleRb.logger.debug "#{pallet_name}.#{storage_name}(#{key.join(', ')})"
|
20
28
|
key = key.map { |part_of_key| c(part_of_key) }
|
21
29
|
ScaleRb.logger.debug "converted key: #{key}"
|
@@ -31,41 +39,6 @@ module ScaleRb
|
|
31
39
|
|
32
40
|
private
|
33
41
|
|
34
|
-
def get_metadata_by_block_hash(cache_dir, block_hash)
|
35
|
-
# Get metadata from cache if it exists
|
36
|
-
runtime_version = state_getRuntimeVersion(block_hash)
|
37
|
-
spec_name = runtime_version['specName']
|
38
|
-
spec_version = runtime_version['specVersion']
|
39
|
-
metadata = cached_metadata(spec_name, spec_version, cache_dir)
|
40
|
-
return metadata if metadata
|
41
|
-
|
42
|
-
# Get metadata from node
|
43
|
-
metadata_hex = state_getMetadata(block_hash)
|
44
|
-
metadata = ScaleRb::Metadata.decode_metadata(metadata_hex.strip._to_bytes)
|
45
|
-
|
46
|
-
# cache it
|
47
|
-
save_metadata_to_file(spec_name, spec_version, metadata, cache_dir)
|
48
|
-
|
49
|
-
return metadata
|
50
|
-
end
|
51
|
-
|
52
|
-
def cached_metadata(spec_name, spec_version, dir)
|
53
|
-
file_path = File.join(dir, "#{spec_name}-#{spec_version}.json")
|
54
|
-
return unless File.exist?(file_path)
|
55
|
-
|
56
|
-
JSON.parse(File.read(file_path))
|
57
|
-
end
|
58
|
-
|
59
|
-
def save_metadata_to_file(spec_name, spec_version, metadata, dir)
|
60
|
-
FileUtils.mkdir_p(dir)
|
61
|
-
|
62
|
-
File.open(File.join(dir, "#{spec_name}-#{spec_version}.json"), 'w') do |f|
|
63
|
-
f.write(JSON.pretty_generate(metadata))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
####
|
68
|
-
|
69
42
|
def query_storage_at(block_hash, storage_keys, type_id, default, registry)
|
70
43
|
result = state_queryStorageAt(storage_keys, block_hash)
|
71
44
|
result.map do |item|
|
@@ -91,11 +64,11 @@ module ScaleRb
|
|
91
64
|
storage_keys = get_storage_keys_by_partial_key(block_hash, partial_storage_key, partial_storage_key)
|
92
65
|
storage_keys.each_slice(250).map do |slice|
|
93
66
|
query_storage_at(
|
67
|
+
block_hash,
|
94
68
|
slice,
|
95
69
|
type_id_of_value,
|
96
70
|
default,
|
97
|
-
registry
|
98
|
-
block_hash
|
71
|
+
registry
|
99
72
|
)
|
100
73
|
end.flatten
|
101
74
|
end
|
@@ -127,8 +100,10 @@ module ScaleRb
|
|
127
100
|
# },
|
128
101
|
# ..
|
129
102
|
#
|
130
|
-
#
|
103
|
+
# key is for the param, value is for the return
|
131
104
|
def get_storage1(block_hash, pallet_name, item_name, key, value, registry)
|
105
|
+
ScaleRb::logger.debug "get_storage1: #{pallet_name}.#{item_name} key: #{key} value: #{value}"
|
106
|
+
|
132
107
|
if key
|
133
108
|
if key[:value].nil? || key[:value].empty?
|
134
109
|
# map, but no key's value provided. get all storages under the partial storage key
|
@@ -150,15 +125,20 @@ module ScaleRb
|
|
150
125
|
value[:modifier] == 'Default' ? value[:fallback] : nil,
|
151
126
|
registry
|
152
127
|
)
|
128
|
+
else
|
129
|
+
storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry)._to_hex
|
130
|
+
data = state_getStorage(storage_key, block_hash)
|
131
|
+
StorageHelper.decode_storage(data, value[:type], value[:modifier] == 'Optional', value[:fallback], registry)
|
153
132
|
end
|
154
133
|
else
|
155
|
-
storage_key = StorageHelper.encode_storage_key(pallet_name, item_name
|
134
|
+
storage_key = StorageHelper.encode_storage_key(pallet_name, item_name)._to_hex
|
156
135
|
data = state_getStorage(storage_key, block_hash)
|
157
136
|
StorageHelper.decode_storage(data, value[:type], value[:modifier] == 'Optional', value[:fallback], registry)
|
158
137
|
end
|
159
138
|
end
|
160
139
|
|
161
|
-
def get_storage2(block_hash, pallet_name, item_name,
|
140
|
+
def get_storage2(block_hash, pallet_name, item_name, params, metadata)
|
141
|
+
ScaleRb.logger.debug "get_storage2: #{pallet_name}.#{item_name} params: #{params}"
|
162
142
|
raise 'Metadata should not be nil' if metadata.nil?
|
163
143
|
|
164
144
|
registry = Metadata.build_registry(metadata)
|
@@ -179,15 +159,12 @@ module ScaleRb
|
|
179
159
|
if plain
|
180
160
|
[
|
181
161
|
nil,
|
182
|
-
{ type: plain,
|
183
|
-
modifier: modifier, fallback: fallback }
|
162
|
+
{ type: plain, modifier: modifier, fallback: fallback }
|
184
163
|
]
|
185
164
|
elsif map
|
186
165
|
[
|
187
|
-
{ value:
|
188
|
-
|
189
|
-
{ type: map._get(:value),
|
190
|
-
modifier: modifier, fallback: fallback }
|
166
|
+
{ value: params, type: map._get(:key), hashers: map._get(:hashers) },
|
167
|
+
{ type: map._get(:value), modifier: modifier, fallback: fallback }
|
191
168
|
]
|
192
169
|
else
|
193
170
|
raise 'NoSuchStorageType'
|
@@ -195,16 +172,17 @@ module ScaleRb
|
|
195
172
|
get_storage1(block_hash, pallet_name, item_name, key, value, registry)
|
196
173
|
end
|
197
174
|
|
198
|
-
def
|
199
|
-
str.split(
|
175
|
+
def convert_to_camel_case(str)
|
176
|
+
words = str.split(/_|(?=[A-Z])/)
|
177
|
+
words.map(&:capitalize).join
|
200
178
|
end
|
201
179
|
|
202
180
|
# convert key to byte array
|
203
181
|
def c(key)
|
204
|
-
if key.
|
205
|
-
key._to_bytes
|
206
|
-
elsif key.to_i.to_s == key # check if key is a number
|
182
|
+
if key.is_a?(Integer)
|
207
183
|
key.to_i
|
184
|
+
elsif key.is_a?(String) && key.start_with?('0x')
|
185
|
+
key._to_bytes
|
208
186
|
else
|
209
187
|
key
|
210
188
|
end
|
data/lib/codec.rb
CHANGED
File without changes
|
data/lib/hasher.rb
CHANGED
File without changes
|
data/lib/metadata/metadata.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/metadata/metadata_v9.rb
CHANGED
File without changes
|
data/lib/monkey_patching.rb
CHANGED
File without changes
|
data/lib/portable_codec.rb
CHANGED
File without changes
|
data/lib/registry.rb
CHANGED
File without changes
|
data/lib/scale_rb/version.rb
CHANGED
data/lib/storage_helper.rb
CHANGED
@@ -3,11 +3,7 @@
|
|
3
3
|
module ScaleRb
|
4
4
|
module StorageHelper
|
5
5
|
class << self
|
6
|
-
# key: {
|
7
|
-
# value: ,
|
8
|
-
# type: ,
|
9
|
-
# hashers: []
|
10
|
-
# }
|
6
|
+
# key example: {:value=>[0], :type=>4, :hashers=>["Twox64Concat"]}
|
11
7
|
def encode_storage_key(pallet_name, item_name, key = nil, registry = nil)
|
12
8
|
storage_key = Hasher.twox128(pallet_name) + Hasher.twox128(item_name)
|
13
9
|
|
@@ -15,16 +11,18 @@ module ScaleRb
|
|
15
11
|
|
16
12
|
key_types, key_values, key_hashers =
|
17
13
|
if key[:hashers].length == 1
|
14
|
+
# {:value=>[0], :type=>4, :hashers=>["Twox64Concat"]}
|
15
|
+
# type 4 is Uint32
|
18
16
|
[
|
19
17
|
[key[:type]],
|
20
|
-
|
18
|
+
key[:value],
|
21
19
|
key[:hashers]
|
22
20
|
]
|
23
21
|
else
|
24
22
|
[
|
25
|
-
registry[key[:type]]._get(:def)._get(:tuple)
|
23
|
+
registry[key[:type]]._get(:def)._get(:tuple),
|
26
24
|
key[:value],
|
27
|
-
key[:hashers]
|
25
|
+
key[:hashers]
|
28
26
|
]
|
29
27
|
end
|
30
28
|
|
data/tea.yaml
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scale_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aki Wu
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base58
|
@@ -149,7 +149,7 @@ licenses:
|
|
149
149
|
metadata:
|
150
150
|
bug_tracker_uri: https://github.com/wuminzhe/scale_rb/issues/
|
151
151
|
source_code_uri: https://github.com/wuminzhe/scale_rb.git
|
152
|
-
post_install_message:
|
152
|
+
post_install_message:
|
153
153
|
rdoc_options: []
|
154
154
|
require_paths:
|
155
155
|
- lib
|
@@ -164,8 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
- !ruby/object:Gem::Version
|
165
165
|
version: '0'
|
166
166
|
requirements: []
|
167
|
-
rubygems_version: 3.
|
168
|
-
signing_key:
|
167
|
+
rubygems_version: 3.3.7
|
168
|
+
signing_key:
|
169
169
|
specification_version: 4
|
170
170
|
summary: A Ruby SCALE Codec Library, and, Substrate RPC Client
|
171
171
|
test_files: []
|