scale_rb 0.1.13 → 0.1.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e442bed63503c0e8c7210753df2fa8a293a094c4df6e095f649997923a4d65c6
4
- data.tar.gz: 97c1bc3b28346baf2f28a93a5a302240d327b663fc7acad7f0bdbd5c558a8e2e
3
+ metadata.gz: d49c850c60bd8f6807d0c04995d3b8a5262f63dc627b585e683d774e91ed96ab
4
+ data.tar.gz: adbba1bbba8cf9bbf3f559893a2b69f90d94a41a259db713f1a7db6dcb83b29f
5
5
  SHA512:
6
- metadata.gz: b233f131d753ca6bb5f632523da0d09be97d2f721a9933c63c6def842ea55de30fd6a7f46081c0113b114b48ce15ed1193b5b834e382379e2406a8eb3416c012
7
- data.tar.gz: 7f97fd3d9927fd3873717226e1294209af285062314850af0d9000e46cdb657b033c3536d19da6cd1bbc6baaeed6f39d729ea7ec3bfcd0c381e75bcfcf1afd5b
6
+ metadata.gz: b0b06fa722621edab033346e30d78ea8096d98fe032f285845f2685593b6cce266aaa18cd8126cdf1632b1e85f6bcdeea6e6858c12534608ab7fb98a27dbd777
7
+ data.tar.gz: e57dc6323f7bd0024041ce0ed46bcc006f588e770f895d530d836755981248e1d37abf4d33c529da0e5db57dac231a941bcd506a8822170b8f074b72ba4877cc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale_rb (0.1.13)
4
+ scale_rb (0.1.15)
5
5
  base58
6
6
  blake2b_rs (~> 0.1.4)
7
7
  xxhash
@@ -14,7 +14,7 @@ GEM
14
14
  ffi (~> 1.0)
15
15
  thermite (~> 0)
16
16
  diff-lcs (1.5.0)
17
- ffi (1.15.5)
17
+ ffi (1.16.3)
18
18
  minitar (0.9)
19
19
  rake (12.3.3)
20
20
  rspec (3.11.0)
data/lib/address.rb CHANGED
@@ -14,7 +14,7 @@ class Address
14
14
  # Darwinia Live
15
15
  18,
16
16
  # Dothereum (SS58, AccountId)
17
- 20, 21,
17
+ 20, 21,
18
18
  # Generic Substrate wildcard (SS58, AccountId)
19
19
  42, 43,
20
20
 
@@ -30,54 +30,62 @@ class Address
30
30
  ]
31
31
 
32
32
  class << self
33
-
34
33
  def array_to_hex_string(arr)
35
34
  body = arr.map { |i| i.to_s(16).rjust(2, '0') }.join
36
35
  "0x#{body}"
37
36
  end
38
37
 
39
- def decode(address, addr_type = 42, ignore_checksum = true)
38
+ def decode(address, addr_type = 42, _ignore_checksum = true)
40
39
  decoded = Base58.base58_to_binary(address, :bitcoin)
41
40
  is_pubkey = decoded.size == 35
42
41
 
43
- size = decoded.size - ( is_pubkey ? 2 : 1 )
42
+ size = decoded.size - (is_pubkey ? 2 : 1)
43
+
44
+ prefix = decoded[0, 1].unpack1('C*')
44
45
 
45
- prefix = decoded[0, 1].unpack("C*").first
46
+ raise 'Invalid address type' unless TYPES.include?(addr_type)
46
47
 
47
- raise "Invalid address type" unless TYPES.include?(addr_type)
48
-
49
48
  hash_bytes = make_hash(decoded[0, size])
50
- if is_pubkey
51
- is_valid_checksum = decoded[-2].unpack("C*").first == hash_bytes[0] && decoded[-1].unpack("C*").first == hash_bytes[1]
52
- else
53
- is_valid_checksum = decoded[-1].unpack("C*").first == hash_bytes[0]
54
- end
49
+ is_valid_checksum =
50
+ if is_pubkey
51
+ decoded[-2].unpack1('C*') == hash_bytes[0] && decoded[-1].unpack1('C*') == hash_bytes[1]
52
+ else
53
+ decoded[-1].unpack1('C*') == hash_bytes[0]
54
+ end
55
55
 
56
56
  # raise "Invalid decoded address checksum" unless is_valid_checksum && ignore_checksum
57
57
 
58
- decoded[1...size].unpack("H*").first
58
+ decoded[1...size].unpack1('H*')
59
59
  end
60
60
 
61
-
62
61
  def encode(pubkey, addr_type = 42)
63
62
  pubkey = pubkey[2..-1] if pubkey =~ /^0x/i
64
- key = [pubkey].pack("H*")
65
-
66
- u8_array = key.bytes
67
-
68
- u8_array.unshift(addr_type)
69
-
70
- bytes = make_hash(u8_array.pack("C*"))
71
-
72
- checksum = bytes[0, key.size == 32 ? 2 : 1]
73
-
74
- u8_array.push(*checksum)
75
-
76
- u8_array = u8_array.map { |i| if i.is_a?(String) then i.to_i(16) else i end }
77
- # u8_array = [42, 202, 122, 179, 154, 86, 153, 242, 157, 207, 38, 115, 170, 163, 73, 75, 72, 81, 26, 186, 224, 220, 60, 101, 15, 243, 152, 246, 95, 229, 225, 18, 56, 0x7e]
78
- input = u8_array.pack("C*")
79
-
80
- Base58.binary_to_base58(input, :bitcoin)
63
+ key = [pubkey].pack('H*')
64
+
65
+ pubkey_bytes = key.bytes
66
+
67
+ checksum_length = case pubkey_bytes.length
68
+ when 32, 33
69
+ 2
70
+ when 1, 2, 4, 8
71
+ 1
72
+ else
73
+ raise 'Invalid pubkey length'
74
+ end
75
+
76
+ ss58_format_bytes = if addr_type < 64
77
+ [addr_type].pack('C*')
78
+ else
79
+ [
80
+ ((ss58_format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
81
+ (ss58_format >> 8) | ((ss58_format & 0b0000_0000_0000_0011) << 6)
82
+ ].pack('C*')
83
+ end
84
+
85
+ input_bytes = ss58_format_bytes.bytes + pubkey_bytes
86
+ checksum = Blake2b.hex(SS58_PREFIX.bytes + input_bytes, 64).to_bytes
87
+
88
+ Base58.binary_to_base58((input_bytes + checksum[0...checksum_length]).pack('C*'), :bitcoin)
81
89
  end
82
90
 
83
91
  def make_hash(body)
@@ -87,11 +95,11 @@ class Address
87
95
  def is_ss58_address?(address)
88
96
  begin
89
97
  decode(address)
90
- rescue
98
+ rescue StandardError
91
99
  return false
92
100
  end
93
- return true
101
+ true
94
102
  end
95
-
96
103
  end
97
- end
104
+ end
105
+
@@ -3,6 +3,8 @@
3
3
  require 'uri'
4
4
  require 'net/http'
5
5
  require 'json'
6
+ require_relative './http_client_metadata'
7
+ require_relative './http_client_storage'
6
8
 
7
9
  # TODO: method_name = cmd.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
8
10
  module ScaleRb
@@ -59,163 +61,6 @@ module ScaleRb
59
61
  result = json_rpc_call(url, 'rpc_methods', [])
60
62
  result['methods']
61
63
  end
62
-
63
- def get_metadata(url, at = nil)
64
- hex = state_getMetadata(url, at)
65
- Metadata.decode_metadata(hex.strip.to_bytes)
66
- end
67
-
68
- def query_storage_at(url, storage_keys, type_id, default, registry, at = nil)
69
- result = state_queryStorageAt(url, storage_keys, at)
70
- result.map do |item|
71
- item['changes'].map do |change|
72
- storage_key = change[0]
73
- data = change[1] || default
74
- storage = data.nil? ? nil : PortableCodec.decode(type_id, data.to_bytes, registry)[0]
75
- { storage_key: storage_key, storage: storage }
76
- end
77
- end.flatten
78
- end
79
-
80
- def get_storage_keys_by_partial_key(url, partial_storage_key, start_key = nil, at = nil)
81
- storage_keys = state_getKeysPaged(url, partial_storage_key, 1000, start_key, at)
82
- if storage_keys.length == 1000
83
- storage_keys + get_storage_keys_by_partial_key(url, partial_storage_key, storage_keys.last, at)
84
- else
85
- storage_keys
86
- end
87
- end
88
-
89
- def get_storages_by_partial_key(url, partial_storage_key, type_id_of_value, default, registry, at = nil)
90
- storage_keys = get_storage_keys_by_partial_key(url, partial_storage_key, partial_storage_key, at)
91
- storage_keys.each_slice(250).map do |slice|
92
- query_storage_at(
93
- url,
94
- slice,
95
- type_id_of_value,
96
- default,
97
- registry,
98
- at
99
- )
100
- end.flatten
101
- end
102
-
103
- # 1. Plain
104
- # key: nil
105
- # value: { type: 3, modifier: 'Default', callback: '' }
106
- #
107
- # 2. Map
108
- # key: { value: value, type: 0, hashers: ['Blake2128Concat'] }
109
- # value: { type: 3, modifier: 'Default', callback: '' }
110
- #
111
- # 3. Map, but key.value is nil
112
- # key: { value: nil, type: 0, hashers: ['Blake2128Concat'] }
113
- # value: { type: 3, modifier: 'Default', callback: '' }
114
- #
115
- # example:
116
- # 'System',
117
- # 'Account',
118
- # key = {
119
- # value: [['0x724d50824542b56f422588421643c4a162b90b5416ef063f2266a1eae6651641'.to_bytes]], # [AccountId]
120
- # type: 0,
121
- # hashers: ['Blake2128Concat']
122
- # },
123
- # value = {
124
- # type: 3,
125
- # modifier: 'Default',
126
- # callback: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
127
- # },
128
- # ..
129
- #
130
- # TODO: part of the key is provided, but not all
131
- def get_storage(url, pallet_name, item_name, key, value, registry, at = nil)
132
- # map, but no key's value provided. get all storages under the partial storage key
133
- if key && (key[:value].nil? || key[:value].empty?)
134
- partial_storage_key = StorageHelper.encode_storage_key(pallet_name, item_name).to_hex
135
- get_storages_by_partial_key(
136
- url,
137
- partial_storage_key,
138
- value[:type],
139
- value[:modifier] == 'Default' ? value[:fallback] : nil,
140
- registry,
141
- at
142
- )
143
- else
144
- storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
145
- data = state_getStorage(url, storage_key, at)
146
- StorageHelper.decode_storage(data, value[:type], value[:modifier] == 'Optional', value[:fallback], registry)
147
- end
148
- end
149
-
150
- def get_storage2(url, pallet_name, item_name, value_of_key, metadata, at = nil)
151
- raise 'Metadata should not be nil' if metadata.nil?
152
-
153
- registry = Metadata.build_registry(metadata)
154
- item = Metadata.get_storage_item(pallet_name, item_name, metadata)
155
- raise "No such storage item: `#{pallet_name}`.`#{item_name}`" if item.nil?
156
-
157
- modifier = item._get(:modifier) # Default | Optional
158
- fallback = item._get(:fallback)
159
- type = item._get(:type)
160
-
161
- plain = type._get(:plain)
162
- map = type._get(:map)
163
- # debug
164
-
165
- key, value =
166
- if plain
167
- [
168
- nil,
169
- { type: plain, modifier: modifier, fallback: fallback }
170
- ]
171
- elsif map
172
- [
173
- { value: value_of_key, type: map._get(:key), hashers: map._get(:hashers) },
174
- { type: map._get(:value), modifier: modifier, fallback: fallback }
175
- ]
176
- else
177
- raise 'NoSuchStorageType'
178
- end
179
- get_storage(url, pallet_name, item_name, key, value, registry, at)
180
- end
181
-
182
- # get_storage3 is a more ruby style function
183
- #
184
- # pallet_name and storage_name is pascal style like 'darwinia_staking'
185
- def get_storage3(url, metadata, pallet_name, storage_name, key_part1: nil, key_part2: nil, at: nil)
186
- pallet_name = to_pascal pallet_name
187
- storage_name = to_pascal storage_name
188
- ScaleRb.logger.debug "#{pallet_name}.#{storage_name}(#{[key_part1, key_part2].compact.join(', ')})"
189
-
190
- key = [key_part1, key_part2].compact.map { |part_of_key| c(part_of_key) }
191
- ScaleRb.logger.debug "converted key: #{key}"
192
-
193
- get_storage2(
194
- url,
195
- pallet_name,
196
- storage_name,
197
- key,
198
- metadata,
199
- at
200
- )
201
- end
202
-
203
- private
204
-
205
- def to_pascal(str)
206
- str.split('_').collect(&:capitalize).join
207
- end
208
-
209
- # convert key to byte array
210
- def c(key)
211
- if key.start_with?('0x')
212
- key.to_bytes
213
- elsif key.to_i.to_s == key # check if key is a number
214
- key.to_i
215
- else
216
- key
217
- end
218
- end
219
64
  end
220
65
  end
221
66
  end
@@ -0,0 +1,78 @@
1
+ require 'json'
2
+ require 'fileutils'
3
+
4
+ module ScaleRb
5
+ module HttpClient
6
+ class << self
7
+ def get_metadata(url, at = nil)
8
+ hex = state_getMetadata(url, at)
9
+ Metadata.decode_metadata(hex.strip.to_bytes)
10
+ end
11
+
12
+ # cached version of get_metadata
13
+ # get metadata from cache first
14
+ def get_metadata_cached(url, at: nil, dir: nil)
15
+ dir = ENV['SCALE_RB_METADATA_DIR'] || File.join(Dir.pwd, 'metadata') if dir.nil?
16
+
17
+ at = ScaleRb::HttpClient.chain_getFinalizedHead(url) if at.nil?
18
+ spec_name, spec_version = get_spec(url, at)
19
+
20
+ # get metadata from cache first
21
+ metadata = metadata_cached(
22
+ spec_name: spec_name,
23
+ spec_version: spec_version,
24
+ dir: dir
25
+ )
26
+ return metadata if metadata
27
+
28
+ # get metadata from rpc
29
+ metadata = ScaleRb::HttpClient.get_metadata(url, at)
30
+
31
+ # cache it
32
+ ScaleRb.logger.debug "caching metadata `#{spec_name}_#{spec_version}.json`"
33
+ save_metadata_to_file(
34
+ spec_name: spec_name,
35
+ spec_version: spec_version,
36
+ metadata: metadata,
37
+ dir: dir
38
+ )
39
+
40
+ metadata
41
+ end
42
+
43
+ private
44
+
45
+ def get_spec(url, at)
46
+ runtime_version = ScaleRb::HttpClient.state_getRuntimeVersion(url, at)
47
+ spec_name = runtime_version['specName']
48
+ spec_version = runtime_version['specVersion']
49
+ [spec_name, spec_version]
50
+ end
51
+
52
+ def metadata_cached(spec_name:, spec_version:, dir:)
53
+ raise 'spec_version is required' unless spec_version
54
+ raise 'spec_name is required' unless spec_name
55
+
56
+ file_path = File.join(dir, "#{spec_name}_#{spec_version}.json")
57
+ return unless File.exist?(file_path)
58
+
59
+ ScaleRb.logger.debug "found metadata `#{spec_name}_#{spec_version}.json` in cache"
60
+ JSON.parse(File.read(file_path))
61
+ end
62
+
63
+ def save_metadata_to_file(spec_name:, spec_version:, metadata:, dir:)
64
+ FileUtils.mkdir_p(dir)
65
+
66
+ File.open(File.join(dir, "#{spec_name}_#{spec_version}.json"), 'w') do |f|
67
+ f.write(JSON.pretty_generate(metadata))
68
+ end
69
+ end
70
+
71
+ def require_block_hash_correct(url, block_hash)
72
+ return unless ScaleRb::HttpClient.chain_getHeader(url, block_hash).nil?
73
+
74
+ raise 'Unable to retrieve header and parent from supplied hash'
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,180 @@
1
+ module ScaleRb
2
+ module HttpClient
3
+ class << self
4
+ # get_storage3 is a more ruby style function
5
+ #
6
+ # pallet_name and storage_name is pascal style like 'darwinia_staking'
7
+ def get_storage3(url, pallet_name, storage_name, key_part1: nil, key_part2: nil, metadata: nil, at: nil)
8
+ # Get metadata if not provided, and cache it.
9
+ # The default dir is `metadata` dir under the caller's dir.
10
+ # You can change it by setting `SCALE_RB_METADATA_DIR` env variable
11
+ metadata = get_metadata_cached(url, at: at) if metadata.nil?
12
+
13
+ pallet_name = to_pascal pallet_name
14
+ storage_name = to_pascal storage_name
15
+ ScaleRb.logger.debug "#{pallet_name}.#{storage_name}(#{[key_part1, key_part2].compact.join(', ')})"
16
+
17
+ key = [key_part1, key_part2].compact.map { |part_of_key| c(part_of_key) }
18
+ ScaleRb.logger.debug "converted key: #{key}"
19
+
20
+ get_storage2(
21
+ url,
22
+ pallet_name,
23
+ storage_name,
24
+ key,
25
+ metadata,
26
+ at
27
+ )
28
+ end
29
+
30
+ private
31
+
32
+ def query_storage_at(url, storage_keys, type_id, default, registry, at = nil)
33
+ result = state_queryStorageAt(url, storage_keys, at)
34
+ result.map do |item|
35
+ item['changes'].map do |change|
36
+ storage_key = change[0]
37
+ data = change[1] || default
38
+ storage = data.nil? ? nil : PortableCodec.decode(type_id, data.to_bytes, registry)[0]
39
+ { storage_key: storage_key, storage: storage }
40
+ end
41
+ end.flatten
42
+ end
43
+
44
+ def get_storage_keys_by_partial_key(url, partial_storage_key, start_key = nil, at = nil)
45
+ storage_keys = state_getKeysPaged(url, partial_storage_key, 1000, start_key, at)
46
+ if storage_keys.length == 1000
47
+ storage_keys + get_storage_keys_by_partial_key(url, partial_storage_key, storage_keys.last, at)
48
+ else
49
+ storage_keys
50
+ end
51
+ end
52
+
53
+ def get_storages_by_partial_key(url, partial_storage_key, type_id_of_value, default, registry, at = nil)
54
+ storage_keys = get_storage_keys_by_partial_key(url, partial_storage_key, partial_storage_key, at)
55
+ storage_keys.each_slice(250).map do |slice|
56
+ query_storage_at(
57
+ url,
58
+ slice,
59
+ type_id_of_value,
60
+ default,
61
+ registry,
62
+ at
63
+ )
64
+ end.flatten
65
+ end
66
+
67
+ # 1. Plain
68
+ # key: nil
69
+ # value: { type: 3, modifier: 'Default', callback: '' }
70
+ #
71
+ # 2. Map
72
+ # key: { value: value, type: 0, hashers: ['Blake2128Concat'] }
73
+ # value: { type: 3, modifier: 'Default', callback: '' }
74
+ #
75
+ # 3. Map, but key.value is nil
76
+ # key: { value: nil, type: 0, hashers: ['Blake2128Concat'] }
77
+ # value: { type: 3, modifier: 'Default', callback: '' }
78
+ #
79
+ # example:
80
+ # 'System',
81
+ # 'Account',
82
+ # key = {
83
+ # value: [['0x724d50824542b56f422588421643c4a162b90b5416ef063f2266a1eae6651641'.to_bytes]], # [AccountId]
84
+ # type: 0,
85
+ # hashers: ['Blake2128Concat']
86
+ # },
87
+ # value = {
88
+ # type: 3,
89
+ # modifier: 'Default',
90
+ # callback: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
91
+ # },
92
+ # ..
93
+ #
94
+ # TODO: part of the key is provided, but not all
95
+ def get_storage(url, pallet_name, item_name, key, value, registry, at = nil)
96
+ if key
97
+ if key[:value].nil? || key[:value].empty?
98
+ # map, but no key's value provided. get all storages under the partial storage key
99
+ partial_storage_key = StorageHelper.encode_storage_key(pallet_name, item_name).to_hex
100
+ get_storages_by_partial_key(
101
+ url,
102
+ partial_storage_key,
103
+ value[:type],
104
+ value[:modifier] == 'Default' ? value[:fallback] : nil,
105
+ registry,
106
+ at
107
+ )
108
+ elsif key[:value].length != key[:hashers].length
109
+ # map with multi parts, but not have all values
110
+ partial_storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
111
+ get_storages_by_partial_key(
112
+ url,
113
+ partial_storage_key,
114
+ value[:type],
115
+ value[:modifier] == 'Default' ? value[:fallback] : nil,
116
+ registry,
117
+ at
118
+ )
119
+ end
120
+ else
121
+ storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
122
+ data = state_getStorage(url, storage_key, at)
123
+ StorageHelper.decode_storage(data, value[:type], value[:modifier] == 'Optional', value[:fallback], registry)
124
+ end
125
+ end
126
+
127
+ def get_storage2(url, pallet_name, item_name, value_of_key, metadata, at = nil)
128
+ raise 'Metadata should not be nil' if metadata.nil?
129
+
130
+ registry = Metadata.build_registry(metadata)
131
+ item = Metadata.get_storage_item(
132
+ pallet_name, item_name, metadata
133
+ )
134
+ raise "No such storage item: `#{pallet_name}`.`#{item_name}`" if item.nil?
135
+
136
+ modifier = item._get(:modifier) # Default | Optional
137
+ fallback = item._get(:fallback)
138
+ type = item._get(:type)
139
+
140
+ plain = type._get(:plain)
141
+ map = type._get(:map)
142
+ # debug
143
+
144
+ key, value =
145
+ if plain
146
+ [
147
+ nil,
148
+ { type: plain,
149
+ modifier: modifier, fallback: fallback }
150
+ ]
151
+ elsif map
152
+ [
153
+ { value: value_of_key,
154
+ type: map._get(:key), hashers: map._get(:hashers) },
155
+ { type: map._get(:value),
156
+ modifier: modifier, fallback: fallback }
157
+ ]
158
+ else
159
+ raise 'NoSuchStorageType'
160
+ end
161
+ get_storage(url, pallet_name, item_name, key, value, registry, at)
162
+ end
163
+
164
+ def to_pascal(str)
165
+ str.split('_').collect(&:capitalize).join
166
+ end
167
+
168
+ # convert key to byte array
169
+ def c(key)
170
+ if key.start_with?('0x')
171
+ key.to_bytes
172
+ elsif key.to_i.to_s == key # check if key is a number
173
+ key.to_i
174
+ else
175
+ key
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
data/lib/codec.rb CHANGED
@@ -191,9 +191,9 @@ module ScaleRb
191
191
  # Decode
192
192
  class << self
193
193
  def decode(type, bytes, registry = {})
194
- logger.debug '--------------------------------------------------'
195
- debug 'decoding type', type
196
- debug 'bytes', bytes&.length
194
+ # logger.debug '--------------------------------------------------'
195
+ # debug 'decoding type', type
196
+ # debug 'bytes', bytes&.length
197
197
 
198
198
  if type.instance_of?(String)
199
199
  return decode_bytes(bytes) if bytes?(type) # Bytes
@@ -221,8 +221,8 @@ module ScaleRb
221
221
  def decode_bytes(bytes)
222
222
  length, remaining_bytes = _do_decode_compact(bytes)
223
223
  value = remaining_bytes[0...length].to_hex
224
- debug 'length', length
225
- debug 'value', value
224
+ # debug 'length', length
225
+ # debug 'value', value
226
226
  [
227
227
  value,
228
228
  remaining_bytes[length..]
@@ -238,7 +238,7 @@ module ScaleRb
238
238
  else
239
239
  raise InvalidBytesError, 'type: Boolean'
240
240
  end
241
- debug 'value', value
241
+ # debug 'value', value
242
242
  [value, bytes[1..]]
243
243
  end
244
244
 
@@ -247,8 +247,8 @@ module ScaleRb
247
247
  raise NotEnoughBytesError, 'type: String' if remaining_bytes.length < length
248
248
 
249
249
  value = remaining_bytes[0...length].to_utf8
250
- debug 'byte length', length
251
- debug 'value', value.inspect
250
+ # debug 'byte length', length
251
+ # debug 'value', value.inspect
252
252
  [
253
253
  value,
254
254
  remaining_bytes[length..]
@@ -261,7 +261,7 @@ module ScaleRb
261
261
  raise NotEnoughBytesError, "type: #{type}" if bytes.length < byte_length
262
262
 
263
263
  value = bytes[0...byte_length].flip.to_int(bit_length)
264
- debug 'value', value
264
+ # debug 'value', value
265
265
  [
266
266
  value,
267
267
  bytes[byte_length..]
@@ -274,7 +274,7 @@ module ScaleRb
274
274
  raise NotEnoughBytesError, "type: #{type_def}" if bytes.length < byte_length
275
275
 
276
276
  value = bytes[0...byte_length].flip.to_uint
277
- debug 'value', value
277
+ # debug 'value', value
278
278
  [
279
279
  value,
280
280
  bytes[byte_length..]
@@ -282,9 +282,8 @@ module ScaleRb
282
282
  end
283
283
 
284
284
  def decode_compact(bytes)
285
- result = _do_decode_compact(bytes)
286
- debug 'value', result[0]
287
- result
285
+ _do_decode_compact(bytes)
286
+ # debug 'value', result[0]
288
287
  end
289
288
 
290
289
  def decode_option(type_def, bytes, registry = {})
@@ -304,7 +303,7 @@ module ScaleRb
304
303
  def decode_vec(type_def, bytes, registry = {})
305
304
  inner_type = parse_vec(type_def)
306
305
  length, remaining_bytes = _do_decode_compact(bytes)
307
- debug 'length', length
306
+ # debug 'length', length
308
307
  _decode_types([inner_type] * length, remaining_bytes, registry)
309
308
  end
310
309
 
@@ -331,7 +330,7 @@ module ScaleRb
331
330
  raise IndexOutOfRangeError, "type: #{type_def}" if index > items.length - 1
332
331
 
333
332
  item = items.to_a[index] # 'name' or [:name, inner_type]
334
- debug 'value', item.inspect
333
+ # debug 'value', item.inspect
335
334
  return [item, bytes[1..]] if item.instance_of?(String)
336
335
 
337
336
  value, remaining_bytes = decode(item[1], bytes[1..], registry)
@@ -353,9 +352,9 @@ module ScaleRb
353
352
  # Encode
354
353
  class << self
355
354
  def encode(type, value, registry = {})
356
- logger.debug '--------------------------------------------------'
357
- debug 'encoding type', type
358
- debug 'value', value
355
+ # logger.debug '--------------------------------------------------'
356
+ # debug 'encoding type', type
357
+ # debug 'value', value
359
358
 
360
359
  if type.instance_of?(String)
361
360
  return encode_bytes(value) if bytes?(type)
@@ -1,3 +1,3 @@
1
1
  module ScaleRb
2
- VERSION = '0.1.13'
2
+ VERSION = '0.1.15'
3
3
  end
@@ -12,26 +12,26 @@ module StorageHelper
12
12
 
13
13
  if key && registry
14
14
 
15
- key_types, key_values =
15
+ key_types, key_values, key_hashers =
16
16
  if key[:hashers].length == 1
17
17
  [
18
18
  [key[:type]],
19
- key[:value]
19
+ key[:value],
20
+ key[:hashers]
20
21
  ]
21
22
  else
22
23
  [
23
- registry[key[:type]]._get(:def)._get(:tuple),
24
- key[:value]
24
+ registry[key[:type]]._get(:def)._get(:tuple).first(key[:value].length),
25
+ key[:value],
26
+ key[:hashers].first(key[:value].length)
25
27
  ]
26
28
  end
27
29
 
28
- # debug
29
- # p "encode_storage_key -----------------------"
30
- # p key_types
31
- # p key_values
32
- # p "encode_storage_key -----------------------"
33
- raise "Key's value doesn't match key's type, key's value: #{key_values.inspect}, but key's type: #{key_types.inspect}. Please check your key's value." if key_types.class != key_values.class || key_types.length != key_values.length
34
- storage_key + PortableCodec._encode_types_with_hashers(key_types, key_values, registry, key[:hashers])
30
+ if key_types.class != key_values.class || key_types.length != key_values.length
31
+ raise "Key's value doesn't match key's type, key's value: #{key_values.inspect}, but key's type: #{key_types.inspect}. Please check your key's value."
32
+ end
33
+
34
+ storage_key + PortableCodec._encode_types_with_hashers(key_types, key_values, registry, key_hashers)
35
35
  else
36
36
  storage_key
37
37
  end
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.1.13
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aki Wu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-25 00:00:00.000000000 Z
11
+ date: 2023-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: blake2b_rs
@@ -76,6 +76,8 @@ files:
76
76
  - lib/address.rb
77
77
  - lib/client/abstract_ws_client.rb
78
78
  - lib/client/http_client.rb
79
+ - lib/client/http_client_metadata.rb
80
+ - lib/client/http_client_storage.rb
79
81
  - lib/client/rpc_request_builder.rb
80
82
  - lib/codec.rb
81
83
  - lib/hasher.rb