mssmt 0.2.0 → 0.3.0

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: bc50f962065de3f0ceaeebaa7715ab5e32d03a882d7df11022e6e4bc90b459d1
4
- data.tar.gz: 020cb3cfedb35c8c3a6cd123d9b772e666e9b9fe19f301c07acc6ca27a193ca6
3
+ metadata.gz: e99668bb044c1670cee5d94e301f8113321c04ce9ac06b697fcfa8eabf1668f9
4
+ data.tar.gz: 7928cf9abd46c85c505dc770c2cbcce33e82ce98c2f7f772872792366bcd6eaa
5
5
  SHA512:
6
- metadata.gz: 468f823bbba1cff9549b5977a98270ec215e3ccf7b8057bcdd0642fd99da280233a0a821254fc2fb4c294d638ccaa6443cf04abd8a99fd4e61de6f2c51f169a1
7
- data.tar.gz: 17f30d1180c82d4b4862c752b842e725e5d9527f1ad7f80b5e8eeb3e0d2573b127531afbfda474017103b97b21acbf3d1f1e891398686fdf06256dd3d246dc06
6
+ metadata.gz: 1b0b1648a73caed3a29c764c688b8077dea1beaa65da3772429470fc1ca1eab352b11128538e0e3b4daa2e8c578452360a562a08bd69bebe3bebadd228070f74
7
+ data.tar.gz: 653ad3b9270105b25a9dfea42414918cc0640cdc9359a7c9c01c712ee503f6689d81ee74796510099c3827fae53209fd2a7325392a36541f64b39447482d6e30
@@ -16,15 +16,19 @@ module MSSMT
16
16
  @left = left
17
17
  @right = right
18
18
  @sum = left.sum + right.sum
19
+ warn("sum:#{@sum} cause overflow.") if @sum > 0xffffffffffffffff # TODO
20
+ @sum = (@sum & 0xffffffffffffffff)
19
21
  @node_hash =
20
22
  Digest::SHA256.digest(
21
23
  "#{left.node_hash}#{right.node_hash}#{[@sum].pack("Q>")}"
22
24
  )
23
25
  end
24
26
 
27
+ # Check whether same branch|computed node or not.
28
+ # @return [Boolean]
25
29
  def ==(other)
26
- return false unless other.is_a?(BranchNode)
27
- node_hash == other.node_hash
30
+ return false unless [BranchNode, ComputedNode].include?(other.class)
31
+ node_hash == other.node_hash && sum == other.sum
28
32
  end
29
33
  end
30
34
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MSSMT
4
+ # Node within a MS-SMT that has already had its node_hash and sum computed, i.e., its preimage is not available.
5
+ class ComputedNode
6
+ attr_reader :node_hash, :sum
7
+
8
+ # Constructor
9
+ # @param [String] node_hash node hash with binary fomat.
10
+ # @param [Integer] sum
11
+ def initialize(node_hash, sum)
12
+ @node_hash = node_hash
13
+ warn("sum: #{sum} cause overflow.") if sum > 0xffffffffffffffff # TODO
14
+ @sum = sum
15
+ end
16
+
17
+ def ==(other)
18
+ return false unless [BranchNode, ComputedNode].include?(other.class)
19
+ node_hash == other.node_hash && sum == other.sum
20
+ end
21
+ end
22
+ end
@@ -10,7 +10,8 @@ module MSSMT
10
10
  # @param [Integer] sum integer value associated with the value
11
11
  def initialize(value, sum)
12
12
  @value = value
13
- @sum = sum
13
+ warn("sum: #{sum} cause overflow.") if sum > 0xffffffffffffffff # TODO
14
+ @sum = sum & 0xffffffffffffffff
14
15
  end
15
16
 
16
17
  # Generate empty leaf node.
data/lib/mssmt/proof.rb CHANGED
@@ -17,8 +17,7 @@ module MSSMT
17
17
  bits = Array.new(nodes.length, false)
18
18
  compact_nodes = []
19
19
  nodes.each.each_with_index do |node, i|
20
- # puts "#{node.node_hash}:#{Tree.empty_tree[Tree::MAX_LEVEL - 1].node_hash}"
21
- if node.node_hash == Tree.empty_tree[Tree::MAX_LEVEL - 1].node_hash
20
+ if node.node_hash == Tree.empty_tree[Tree::MAX_LEVEL - i].node_hash
22
21
  bits[i] = true
23
22
  else
24
23
  compact_nodes << node
@@ -49,6 +48,21 @@ module MSSMT
49
48
  @bits = bits
50
49
  end
51
50
 
51
+ # Decode compressed proof.
52
+ # @param [String] compressed proof with binary fomat.
53
+ # @return [MSSMT::CompressedProof]
54
+ def self.decode(data)
55
+ buf = data.is_a?(StringIO) ? data : StringIO.new(data)
56
+ nodes_len = buf.read(2).unpack1("n")
57
+ nodes =
58
+ nodes_len.times.map do
59
+ ComputedNode.new(buf.read(32), buf.read(8).unpack1("Q>"))
60
+ end
61
+ bytes = buf.read(MSSMT::Tree::MAX_LEVEL / 8)
62
+ bits = unpack_bits(bytes.unpack("C*"))
63
+ CompressedProof.new(nodes, bits)
64
+ end
65
+
52
66
  # Decompress a compressed merkle proof by replacing its bit vector with the empty nodes it represents.
53
67
  # @return [MSSMT::Proof]
54
68
  def decompress
@@ -64,5 +78,48 @@ module MSSMT
64
78
  end
65
79
  Proof.new(full_nodes)
66
80
  end
81
+
82
+ # Encode the compressed proof.
83
+ # @return [String] encoded string.
84
+ def encode
85
+ buf = [nodes.length].pack("n")
86
+ nodes.each do |node|
87
+ buf << node.node_hash
88
+ buf << [node.sum].pack("Q>")
89
+ end
90
+ buf << pack_bits.pack("C*")
91
+ buf
92
+ end
93
+
94
+ def ==(other)
95
+ return false unless other.is_a?(CompressedProof)
96
+ bits == other.bits && nodes == other.nodes
97
+ end
98
+
99
+ private
100
+
101
+ def pack_bits
102
+ bytes = Array.new((bits.length + 8 - 1) / 8, 0)
103
+ bits.each_with_index do |b, i|
104
+ next unless b
105
+ byte_index = i / 8
106
+ bit_index = i % 8
107
+ bytes[byte_index] |= (1 << bit_index)
108
+ end
109
+ bytes
110
+ end
111
+
112
+ def self.unpack_bits(bytes)
113
+ bit_len = bytes.length * 8
114
+ bits = Array.new(bit_len, false)
115
+ bit_len.times do |i|
116
+ byte_index = i / 8
117
+ bit_index = i % 8
118
+ bits[i] = ((bytes[byte_index] >> bit_index) & 1) == 1
119
+ end
120
+ bits
121
+ end
122
+
123
+ private_class_method :unpack_bits
67
124
  end
68
125
  end
data/lib/mssmt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MSSMT
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/mssmt.rb CHANGED
@@ -11,6 +11,7 @@ module MSSMT
11
11
  autoload :Store, "mssmt/store"
12
12
  autoload :LeafNode, "mssmt/leaf_node"
13
13
  autoload :BranchNode, "mssmt/branch_node"
14
+ autoload :ComputedNode, "mssmt/computed_node"
14
15
  autoload :Tree, "mssmt/tree"
15
16
  autoload :Proof, "mssmt/proof"
16
17
  autoload :CompressedProof, "mssmt/proof"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mssmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-26 00:00:00.000000000 Z
11
+ date: 2022-10-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ruby implementation of Merkle Sum Sparse Merkle Tree
14
14
  email:
@@ -32,6 +32,7 @@ files:
32
32
  - bin/setup
33
33
  - lib/mssmt.rb
34
34
  - lib/mssmt/branch_node.rb
35
+ - lib/mssmt/computed_node.rb
35
36
  - lib/mssmt/leaf_node.rb
36
37
  - lib/mssmt/proof.rb
37
38
  - lib/mssmt/store.rb