scale.rb 0.2.19 → 0.3.0
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/.gitignore +1 -0
- data/Cargo.lock +8 -4
- data/Cargo.toml +2 -3
- data/Gemfile.lock +3 -3
- data/README.md +19 -3
- data/Rakefile +6 -0
- data/lib/helper.rb +19 -4
- data/lib/metadata/metadata.rb +27 -17
- data/lib/metadata/metadata_v0.rb +24 -20
- data/lib/metadata/metadata_v1.rb +13 -9
- data/lib/metadata/metadata_v10.rb +2 -2
- data/lib/metadata/metadata_v11.rb +2 -2
- data/lib/metadata/metadata_v12.rb +9 -8
- data/lib/metadata/metadata_v13.rb +161 -0
- data/lib/metadata/metadata_v2.rb +2 -2
- data/lib/metadata/metadata_v3.rb +2 -2
- data/lib/metadata/metadata_v4.rb +21 -11
- data/lib/metadata/metadata_v5.rb +21 -11
- data/lib/metadata/metadata_v6.rb +9 -9
- data/lib/metadata/metadata_v7.rb +26 -15
- data/lib/metadata/metadata_v8.rb +9 -9
- data/lib/metadata/metadata_v9.rb +2 -2
- data/lib/scale.rb +36 -376
- data/lib/scale/base.rb +136 -96
- data/lib/scale/block.rb +4 -4
- data/lib/scale/trie.rb +1 -1
- data/lib/scale/types.rb +89 -39
- data/lib/scale/version.rb +1 -1
- data/lib/scale_bytes.rb +63 -0
- data/lib/substrate_client.rb +9 -6
- data/lib/type_builder.rb +279 -0
- data/lib/type_registry.rb +91 -0
- data/lib/type_registry/darwinia.json +730 -554
- data/lib/type_registry/default.json +1 -0
- data/lib/type_registry/pangolin.json +571 -132
- data/scripts/mmr_root_to_sign.rb +10 -0
- data/src/lib.rs +80 -25
- metadata +11 -7
- data/src/storage_key.rs +0 -41
data/lib/scale/base.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Scale
|
2
2
|
module Types
|
3
3
|
|
4
|
-
module
|
4
|
+
module Base
|
5
5
|
attr_reader :value
|
6
6
|
|
7
7
|
def initialize(value)
|
@@ -9,26 +9,28 @@ module Scale
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def ==(other)
|
12
|
-
value == other.value
|
12
|
+
self.class == other.class && self.value == other.value
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_human
|
16
16
|
if @value.class == ::Hash
|
17
17
|
@value.transform_values do |v|
|
18
|
-
if v.class.included_modules.include?(
|
18
|
+
if v.class.included_modules.include?(Base)
|
19
19
|
v.to_human
|
20
20
|
else
|
21
21
|
v
|
22
22
|
end
|
23
|
-
end
|
23
|
+
end.transform_keys(&:to_sym)
|
24
24
|
elsif @value.class == ::Array
|
25
25
|
@value.map do |v|
|
26
|
-
if v.class.included_modules.include?(
|
26
|
+
if v.class.included_modules.include?(Base)
|
27
27
|
v.to_human
|
28
28
|
else
|
29
29
|
v
|
30
30
|
end
|
31
31
|
end
|
32
|
+
elsif @value.class.include?(Base)
|
33
|
+
@value.to_human
|
32
34
|
else
|
33
35
|
@value
|
34
36
|
end
|
@@ -46,9 +48,9 @@ module Scale
|
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
|
-
# value
|
51
|
+
# if value is bool, see type `OptionBool` in types.rb
|
50
52
|
module Option
|
51
|
-
include
|
53
|
+
include Base
|
52
54
|
|
53
55
|
module ClassMethods
|
54
56
|
def decode(scale_bytes)
|
@@ -58,29 +60,23 @@ module Scale
|
|
58
60
|
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
59
61
|
new(nil)
|
60
62
|
elsif byte == [1]
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
if self::INNER_TYPE_STR == "boolean"
|
72
|
-
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
73
|
-
new(true)
|
74
|
-
else
|
75
|
-
raise "bad data"
|
76
|
-
end
|
63
|
+
# big process
|
64
|
+
type =
|
65
|
+
if self::INNER_TYPE.class == ::String
|
66
|
+
Scale::Types.get(self::INNER_TYPE)
|
67
|
+
else
|
68
|
+
self::INNER_TYPE
|
69
|
+
end
|
70
|
+
value = type.decode(scale_bytes)
|
71
|
+
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
72
|
+
new(value)
|
77
73
|
else
|
78
|
-
raise "
|
74
|
+
raise BadDataError.new("Bad scale data for #{self::TYPE_NAME}")
|
79
75
|
end
|
80
76
|
end
|
81
77
|
|
82
|
-
def inner_type(
|
83
|
-
const_set(:
|
78
|
+
def inner_type(type)
|
79
|
+
const_set(:INNER_TYPE, type)
|
84
80
|
end
|
85
81
|
end
|
86
82
|
|
@@ -93,15 +89,13 @@ module Scale
|
|
93
89
|
if value.nil?
|
94
90
|
"00"
|
95
91
|
else
|
96
|
-
return "02" if value.class == TrueClass && value === true
|
97
|
-
return "01" if value.class == FalseClass && value === false
|
98
92
|
"01" + value.encode
|
99
93
|
end
|
100
94
|
end
|
101
95
|
end
|
102
96
|
|
103
97
|
module FixedWidthInt
|
104
|
-
include
|
98
|
+
include Base
|
105
99
|
|
106
100
|
module ClassMethods
|
107
101
|
def decode(scale_bytes)
|
@@ -129,7 +123,7 @@ module Scale
|
|
129
123
|
end
|
130
124
|
|
131
125
|
module FixedWidthUInt
|
132
|
-
include
|
126
|
+
include Base
|
133
127
|
|
134
128
|
module ClassMethods
|
135
129
|
attr_accessor :byte_length
|
@@ -162,7 +156,7 @@ module Scale
|
|
162
156
|
end
|
163
157
|
|
164
158
|
module Struct
|
165
|
-
include
|
159
|
+
include Base
|
166
160
|
# new(1.to_u32, U32(69))
|
167
161
|
module ClassMethods
|
168
162
|
def inherited(child)
|
@@ -171,36 +165,40 @@ module Scale
|
|
171
165
|
|
172
166
|
def decode(scale_bytes)
|
173
167
|
puts "BEGIN " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
174
|
-
item_values = self::ITEM_TYPE_STRS.map do |item_type_str|
|
175
|
-
type = Scale::Types.get(item_type_str)
|
176
|
-
type.decode(scale_bytes)
|
177
|
-
end
|
178
168
|
|
179
|
-
|
180
|
-
|
181
|
-
|
169
|
+
# item_values:
|
170
|
+
# {
|
171
|
+
# a: ...,
|
172
|
+
# b: ...
|
173
|
+
# }
|
174
|
+
item_values = {}
|
175
|
+
self::ITEMS.each_pair do |item_name, item_type|
|
176
|
+
if item_type.class == ::String
|
177
|
+
item_type = Scale::Types.get(item_type)
|
178
|
+
end
|
179
|
+
item_values[item_name] = item_type.decode(scale_bytes)
|
182
180
|
end
|
183
181
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
end
|
188
|
-
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
189
|
-
result
|
190
|
-
end
|
182
|
+
# value = {}
|
183
|
+
# self::ITEM_NAMES.zip(item_values) do |attr, val|
|
184
|
+
# value[attr] = val
|
185
|
+
# end
|
191
186
|
|
192
|
-
|
193
|
-
attr_names = []
|
194
|
-
attr_type_strs = []
|
187
|
+
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
195
188
|
|
196
|
-
|
197
|
-
|
198
|
-
|
189
|
+
result = new(item_values)
|
190
|
+
item_values.each_pair do |item_name, item_value|
|
191
|
+
result.send "#{item_name.to_s}=", item_value
|
199
192
|
end
|
200
193
|
|
201
|
-
|
202
|
-
|
203
|
-
|
194
|
+
result
|
195
|
+
end
|
196
|
+
|
197
|
+
# items(a: Scale::Types::Type1, b: "Type2")
|
198
|
+
def items(**items)
|
199
|
+
const_set(:ITEMS, items)
|
200
|
+
item_names = items.keys
|
201
|
+
attr_accessor *item_names
|
204
202
|
end
|
205
203
|
end
|
206
204
|
|
@@ -210,29 +208,33 @@ module Scale
|
|
210
208
|
end
|
211
209
|
|
212
210
|
def encode
|
213
|
-
|
214
|
-
|
215
|
-
result << attr_value.encode
|
216
|
-
end
|
211
|
+
value.values.map do |item_value|
|
212
|
+
item_value.encode
|
217
213
|
end.join
|
218
214
|
end
|
219
215
|
end
|
220
216
|
|
221
217
|
module Tuple
|
222
|
-
include
|
218
|
+
include Base
|
223
219
|
|
224
220
|
module ClassMethods
|
225
221
|
def decode(scale_bytes)
|
226
222
|
puts "BEGIN " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
227
|
-
|
228
|
-
|
223
|
+
|
224
|
+
values = self::INNER_TYPES.map do |type|
|
225
|
+
if type.class == ::String
|
226
|
+
type = Scale::Types.get(type)
|
227
|
+
end
|
228
|
+
type.decode(scale_bytes)
|
229
229
|
end
|
230
|
+
|
230
231
|
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
231
232
|
new(values)
|
232
233
|
end
|
233
234
|
|
234
|
-
|
235
|
-
|
235
|
+
# inner_types Scale::Types::U8, "U8"
|
236
|
+
def inner_types(*inner_types)
|
237
|
+
const_set(:INNER_TYPES, inner_types)
|
236
238
|
end
|
237
239
|
end
|
238
240
|
|
@@ -246,41 +248,46 @@ module Scale
|
|
246
248
|
end
|
247
249
|
|
248
250
|
module Enum
|
249
|
-
include
|
251
|
+
include Base
|
252
|
+
|
253
|
+
attr_accessor :index
|
250
254
|
|
251
255
|
module ClassMethods
|
252
256
|
def decode(scale_bytes)
|
253
257
|
puts "BEGIN " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
254
258
|
index = scale_bytes.get_next_bytes(1)[0]
|
255
|
-
if const_defined? "
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
259
|
+
if const_defined? "ITEMS"
|
260
|
+
type = self::ITEMS.values[index]
|
261
|
+
if type.class == ::String
|
262
|
+
type = Scale::Types.get(type)
|
263
|
+
end
|
264
|
+
value = type.decode(scale_bytes)
|
265
|
+
elsif const_defined? "INNER_TYPES"
|
266
|
+
type = self::INNER_TYPES[index]
|
267
|
+
if type.class == ::String
|
268
|
+
type = Scale::Types.get(type)
|
269
|
+
end
|
270
|
+
value = type.decode(scale_bytes)
|
271
|
+
else # VALUES
|
260
272
|
value = self::VALUES[index]
|
261
273
|
end
|
262
|
-
result = new(value)
|
263
274
|
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
275
|
+
result = new(value)
|
276
|
+
result.index = index
|
264
277
|
result
|
265
278
|
end
|
266
279
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
items.each_pair do |attr_name, attr_type_str|
|
273
|
-
attr_names << attr_name
|
274
|
-
attr_type_strs << attr_type_str
|
275
|
-
end
|
280
|
+
# inner_types(Scale::Types::Compact, "Hex")
|
281
|
+
def inner_types(*inner_types)
|
282
|
+
const_set(:INNER_TYPES, inner_types)
|
283
|
+
end
|
276
284
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
const_set(:ITEM_TYPE_STRS, items)
|
281
|
-
end
|
285
|
+
# items(Item1: Scale::Types::Compact, Item2: "Hex")
|
286
|
+
def items(**items)
|
287
|
+
const_set(:ITEMS, items)
|
282
288
|
end
|
283
289
|
|
290
|
+
# [1, "hello"]
|
284
291
|
def values(*values)
|
285
292
|
const_set(:VALUES, values)
|
286
293
|
end
|
@@ -291,17 +298,17 @@ module Scale
|
|
291
298
|
end
|
292
299
|
|
293
300
|
def encode
|
294
|
-
if self.class.const_defined? "
|
295
|
-
|
296
|
-
index = self.class::ITEM_TYPE_STRS.index(value_type_str).to_s(16).rjust(2, "0")
|
297
|
-
index + value.encode
|
301
|
+
if self.class.const_defined? "ITEMS"
|
302
|
+
index.to_s(16).rjust(2, "0") + value.encode
|
298
303
|
else
|
299
304
|
self.class::VALUES.index(value).to_s(16).rjust(2, "0")
|
300
305
|
end
|
301
306
|
end
|
302
307
|
|
303
308
|
def to_human
|
304
|
-
if self.class.const_defined? "
|
309
|
+
if self.class.const_defined? "ITEMS"
|
310
|
+
@value.to_human
|
311
|
+
elsif self.class.const_defined? "INNER_TYPES"
|
305
312
|
@value.to_human
|
306
313
|
else
|
307
314
|
@value
|
@@ -310,7 +317,7 @@ module Scale
|
|
310
317
|
end
|
311
318
|
|
312
319
|
module Vec
|
313
|
-
include
|
320
|
+
include Base # value is an array
|
314
321
|
|
315
322
|
module ClassMethods
|
316
323
|
def decode(scale_bytes, raw = false)
|
@@ -318,16 +325,15 @@ module Scale
|
|
318
325
|
number = Scale::Types::Compact.decode(scale_bytes).value
|
319
326
|
items = []
|
320
327
|
number.times do
|
321
|
-
|
322
|
-
item = type.decode(scale_bytes)
|
328
|
+
item = self::INNER_TYPE.decode(scale_bytes)
|
323
329
|
items << item
|
324
330
|
end
|
325
331
|
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
326
332
|
raw ? items : new(items)
|
327
333
|
end
|
328
334
|
|
329
|
-
def inner_type(
|
330
|
-
const_set(:
|
335
|
+
def inner_type(type)
|
336
|
+
const_set(:INNER_TYPE, type)
|
331
337
|
end
|
332
338
|
end
|
333
339
|
|
@@ -346,7 +352,7 @@ module Scale
|
|
346
352
|
end
|
347
353
|
|
348
354
|
module Set
|
349
|
-
include
|
355
|
+
include Base
|
350
356
|
|
351
357
|
module ClassMethods
|
352
358
|
def decode(scale_bytes)
|
@@ -384,7 +390,7 @@ module Scale
|
|
384
390
|
end
|
385
391
|
|
386
392
|
module VecU8FixedLength
|
387
|
-
include
|
393
|
+
include Base
|
388
394
|
|
389
395
|
module ClassMethods
|
390
396
|
def decode(scale_bytes)
|
@@ -421,5 +427,39 @@ module Scale
|
|
421
427
|
end
|
422
428
|
end
|
423
429
|
|
430
|
+
module Array
|
431
|
+
include Base
|
432
|
+
|
433
|
+
module ClassMethods
|
434
|
+
def decode(scale_bytes)
|
435
|
+
puts "BEGIN " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
436
|
+
items = (0 ... self::LENGTH).map do |_|
|
437
|
+
self::INNER_TYPE.decode(scale_bytes)
|
438
|
+
end
|
439
|
+
puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true
|
440
|
+
new(items)
|
441
|
+
end
|
442
|
+
|
443
|
+
def inner_type(type)
|
444
|
+
const_set(:INNER_TYPE, type)
|
445
|
+
end
|
446
|
+
|
447
|
+
def length(len)
|
448
|
+
const_set(:LENGTH, len)
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
def self.included(base)
|
453
|
+
base.extend ClassMethods
|
454
|
+
end
|
455
|
+
|
456
|
+
def encode
|
457
|
+
self.value.map do |item|
|
458
|
+
item.encode
|
459
|
+
end.join
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
|
424
464
|
end
|
425
465
|
end
|
data/lib/scale/block.rb
CHANGED
@@ -2,7 +2,7 @@ module Scale
|
|
2
2
|
module Types
|
3
3
|
|
4
4
|
class Extrinsic
|
5
|
-
include
|
5
|
+
include Base
|
6
6
|
# attr_accessor :address, :signature, :nonce, :era, :extrinsic_hash, :call_index, :params_raw, :params
|
7
7
|
|
8
8
|
def self.generate_hash(bytes)
|
@@ -116,7 +116,7 @@ module Scale
|
|
116
116
|
end
|
117
117
|
|
118
118
|
class EventRecords
|
119
|
-
include
|
119
|
+
include Base
|
120
120
|
|
121
121
|
def self.decode(scale_bytes)
|
122
122
|
|
@@ -129,7 +129,7 @@ module Scale
|
|
129
129
|
end
|
130
130
|
|
131
131
|
class EventRecord
|
132
|
-
include
|
132
|
+
include Base
|
133
133
|
|
134
134
|
def self.decode(scale_bytes)
|
135
135
|
metadata = Scale::TypeRegistry.instance.metadata.value
|
@@ -211,7 +211,7 @@ module Scale
|
|
211
211
|
|
212
212
|
class LogDigest
|
213
213
|
include Enum
|
214
|
-
|
214
|
+
inner_types *%w[Other AuthoritiesChange ChangesTrieRoot SealV0 Consensus Seal PreRuntime]
|
215
215
|
end
|
216
216
|
|
217
217
|
end
|