scale.rb 0.2.13 → 0.2.14

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 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