scale.rb 0.2.13 → 0.2.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/scale/trie.rb +52 -2
- data/lib/scale/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 992459c5f9a272f5d899027051cf702a4fd28b594bdfcb745e54e9106968c6b8
|
4
|
+
data.tar.gz: 9ae9fa80c0ee34e9988418e771d04c681ffc69585830e4c7d9ac3097f3d9d31d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eea2f91c1563cae8952a84f54be3dc26649356eb40aace9658e718396c9f8e89b2ed3709fd4ce2ca0222ed5978e8e8aabd5b3a301de1802250001f3ef12ce784
|
7
|
+
data.tar.gz: 5d0ac45c4c021363e48cb5e19efd2d2f794503b08daf8d48f22fb7d25e94117a2e97b0fdf185e9247c6d77513d0771989f9c1fcf9f03a6c5d2d710182ef140a8
|
data/Gemfile.lock
CHANGED
data/lib/scale/trie.rb
CHANGED
@@ -10,6 +10,7 @@ module Scale
|
|
10
10
|
NIBBLE_SIZE_BOUND = 65535
|
11
11
|
|
12
12
|
def self.decode(scale_bytes)
|
13
|
+
hash = "0x#{Crypto::blake2_256(scale_bytes.bytes)}"
|
13
14
|
first = scale_bytes.get_next_bytes(1).first
|
14
15
|
if first == EMPTY
|
15
16
|
TrieNode.new({})
|
@@ -44,6 +45,7 @@ module Scale
|
|
44
45
|
value_bytes = scale_bytes.get_next_bytes(count)
|
45
46
|
|
46
47
|
return TrieNode.new({
|
48
|
+
hash: hash,
|
47
49
|
node_type: "leaf",
|
48
50
|
partial: {
|
49
51
|
hex: partial_bytes.bytes_to_hex,
|
@@ -80,8 +82,8 @@ module Scale
|
|
80
82
|
if has_child
|
81
83
|
count = Compact.decode(scale_bytes).value
|
82
84
|
if count == 32
|
83
|
-
|
84
|
-
children[i] =
|
85
|
+
h = H256.decode(scale_bytes).value
|
86
|
+
children[i] = h
|
85
87
|
else
|
86
88
|
inline = scale_bytes.get_next_bytes count
|
87
89
|
children[i] = inline.bytes_to_hex
|
@@ -98,6 +100,7 @@ module Scale
|
|
98
100
|
# end
|
99
101
|
|
100
102
|
result = TrieNode.new({
|
103
|
+
hash: hash,
|
101
104
|
node_type: "branch",
|
102
105
|
partial: {
|
103
106
|
hex: partial_bytes.bytes_to_hex,
|
@@ -115,7 +118,54 @@ module Scale
|
|
115
118
|
|
116
119
|
end
|
117
120
|
end
|
121
|
+
|
122
|
+
def self.check(root, proof, key)
|
123
|
+
key = Key.new(key)
|
124
|
+
|
125
|
+
nodes = proof.map {|node_data|
|
126
|
+
node = TrieNode::decode(Scale::Bytes.new(node_data)).value
|
127
|
+
[node[:hash], node]
|
128
|
+
}.to_h
|
129
|
+
|
130
|
+
self.do_check(root, nodes, key)
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
def self.do_check(hash, nodes, key)
|
135
|
+
if node = nodes[hash]
|
136
|
+
if node[:children]
|
137
|
+
position = key.next_nibble(node[:partial][:hex], node[:partial][:padding]).to_i(16)
|
138
|
+
child = node[:children][position]
|
139
|
+
return self.do_check(child, nodes, key)
|
140
|
+
else
|
141
|
+
return node[:value]
|
142
|
+
end
|
143
|
+
else
|
144
|
+
raise "Fail"
|
145
|
+
end
|
146
|
+
end
|
118
147
|
end
|
119
148
|
|
120
149
|
end
|
121
150
|
end
|
151
|
+
|
152
|
+
class Key
|
153
|
+
def initialize(value)
|
154
|
+
@value = value[2..] if value.start_with?("0x")
|
155
|
+
@offset = 0
|
156
|
+
end
|
157
|
+
|
158
|
+
def next_nibble(partial, padding)
|
159
|
+
partial = partial[2..] if partial.start_with?("0x")
|
160
|
+
partial = partial[1..] if padding
|
161
|
+
|
162
|
+
new_offset = @offset + partial.length
|
163
|
+
if partial == @value[@offset...new_offset]
|
164
|
+
nibble = @value[new_offset]
|
165
|
+
@offset = new_offset + 1
|
166
|
+
return nibble
|
167
|
+
else
|
168
|
+
raise "Fail"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
data/lib/scale/version.rb
CHANGED
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.2.
|
4
|
+
version: 0.2.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wu Minzhe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: substrate_common.rb
|