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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f37a51e33372d5c51aa45cf538fba59a4094becf5c50c40df6a5e2700f0c89a6
4
- data.tar.gz: 5ff9199c46a0f0a51096b3a1acda708664d71ddb755b93e6c2096534ade5c6a4
3
+ metadata.gz: 992459c5f9a272f5d899027051cf702a4fd28b594bdfcb745e54e9106968c6b8
4
+ data.tar.gz: 9ae9fa80c0ee34e9988418e771d04c681ffc69585830e4c7d9ac3097f3d9d31d
5
5
  SHA512:
6
- metadata.gz: 2fe1f22eb8928b9986d6a8d2223f023f568c8afbb9e8dc3eea36f45705f540f9324e478b05cb916409303d75c9831622643adaade346134cd22665361989624c
7
- data.tar.gz: 2cdbadcbf36cc61e04964b76581c41ccf76ca44aa72cf9241b18e73be115f2b183ef863ec32794fd71039fa264404bb56e5eb90d57c5fc243a8caf5f0df98d0f
6
+ metadata.gz: eea2f91c1563cae8952a84f54be3dc26649356eb40aace9658e718396c9f8e89b2ed3709fd4ce2ca0222ed5978e8e8aabd5b3a301de1802250001f3ef12ce784
7
+ data.tar.gz: 5d0ac45c4c021363e48cb5e19efd2d2f794503b08daf8d48f22fb7d25e94117a2e97b0fdf185e9247c6d77513d0771989f9c1fcf9f03a6c5d2d710182ef140a8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale.rb (0.2.13)
4
+ scale.rb (0.2.14)
5
5
  activesupport (>= 4.0.0)
6
6
  json (~> 2.3.0)
7
7
  substrate_common.rb (~> 0.1.9)
@@ -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
- hash = H256.decode(scale_bytes).value
84
- children[i] = hash
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
@@ -1,3 +1,3 @@
1
1
  module Scale
2
- VERSION = "0.2.13".freeze
2
+ VERSION = "0.2.14".freeze
3
3
  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.2.13
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-17 00:00:00.000000000 Z
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