immudb 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/immudb/htree.rb CHANGED
@@ -95,26 +95,5 @@ module Immudb
95
95
  end
96
96
  end
97
97
  end
98
-
99
- def self.inclusion_proof_from(iproof)
100
- h = InclusionProof.new
101
- h.leaf = iproof.leaf.to_i
102
- h.width = iproof.width.to_i
103
- h.terms = Store.digest_from(iproof.terms)
104
- h
105
- end
106
-
107
- def self.dual_proof_from(dproof)
108
- dp = DualProof.new
109
- dp.sourceTxMetadata = Store.tx_metadata_from(dproof.sourceTxMetadata)
110
- dp.targetTxMetadata = Store.tx_metadata_from(dproof.targetTxMetadata)
111
- dp.inclusionProof = Store.digest_from(dproof.inclusionProof)
112
- # use digests_from?
113
- dp.consistencyProof = Store.digests_from(dproof.consistencyProof)
114
- dp.targetBlTxAlh = Store.digest_from(dproof.targetBlTxAlh)
115
- dp.lastInclusionProof = Store.digests_from(dproof.lastInclusionProof)
116
- dp.linearProof = Store.linear_proof_from(dproof.linearProof)
117
- dp
118
- end
119
98
  end
120
99
  end
@@ -0,0 +1,88 @@
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ module Immudb
14
+ class KVMetadata
15
+ DELETED_ATTR_CODE = 0
16
+ EXPIRES_AT_ATTR_CODE = 1
17
+ NON_INDEXABLE_ATTR_CODE = 2
18
+
19
+ def initialize
20
+ @attributes = {}
21
+ @readonly = false
22
+ end
23
+
24
+ def as_deleted(deleted)
25
+ if @readonly
26
+ raise Error, "Read-only"
27
+ elsif !deleted
28
+ @attributes.delete(DELETED_ATTR_CODE)
29
+ else
30
+ @attributes[DELETED_ATTR_CODE] = nil
31
+ end
32
+ end
33
+
34
+ def deleted?
35
+ @attributes.key?(DELETED_ATTR_CODE)
36
+ end
37
+
38
+ def expires_at(expires_at)
39
+ if @readonly
40
+ raise Error, "Read-only"
41
+ end
42
+ @attributes[EXPIRES_AT_ATTR_CODE] = expires_at
43
+ end
44
+
45
+ def non_expirable
46
+ @attributes.delete(EXPIRES_AT_ATTR_CODE)
47
+ end
48
+
49
+ def expirable?
50
+ @attributes.key?(EXPIRES_AT_ATTR_CODE)
51
+ end
52
+
53
+ def expiration_time
54
+ if @attributes.key?(EXPIRES_AT_ATTR_CODE)
55
+ @attributes[EXPIRES_AT_ATTR_CODE]
56
+ else
57
+ raise Error, "Non-expirable"
58
+ end
59
+ end
60
+
61
+ def as_non_indexable(non_indexable)
62
+ if @readonly
63
+ raise Error, "Read-only"
64
+ elsif !non_indexable
65
+ @attributes.delete(NON_INDEXABLE_ATTR_CODE)
66
+ else
67
+ @attributes[NON_INDEXABLE_ATTR_CODE] = nil
68
+ end
69
+ end
70
+
71
+ def non_indexable?
72
+ @attributes.key?(NON_INDEXABLE_ATTR_CODE)
73
+ end
74
+
75
+ def bytes
76
+ b = "".b
77
+ [DELETED_ATTR_CODE, EXPIRES_AT_ATTR_CODE, NON_INDEXABLE_ATTR_CODE].each do |attr_code|
78
+ if @attributes.key?(attr_code)
79
+ b += [attr_code].pack("C")
80
+ if attr_code == EXPIRES_AT_ATTR_CODE
81
+ b += [@attributes[attr_code].to_i].pack("Q>")
82
+ end
83
+ end
84
+ end
85
+ b
86
+ end
87
+ end
88
+ end
@@ -1,4 +1,4 @@
1
- # Copyright 2021 CodeNotary, Inc. All rights reserved.
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
2
 
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,12 +12,6 @@
12
12
 
13
13
  module Immudb
14
14
  class LinearProof
15
- attr_reader :sourceTxID, :targetTxID, :terms
16
-
17
- def initialize(sourceTxID, targetTxID, terms)
18
- @sourceTxID = sourceTxID
19
- @targetTxID = targetTxID
20
- @terms = terms
21
- end
15
+ attr_accessor :sourceTxID, :targetTxID, :terms
22
16
  end
23
17
  end
@@ -0,0 +1,119 @@
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ module Immudb
14
+ module Schema
15
+ class << self
16
+ def tx_from_proto(stx)
17
+ header = ::Immudb::TxHeader.new
18
+ header.iD = stx.header.id
19
+ header.ts = stx.header.ts
20
+ header.blTxID = stx.header.blTxId
21
+ header.blRoot = digest_from_proto(stx.header.blRoot)
22
+ header.prevAlh = digest_from_proto(stx.header.prevAlh)
23
+
24
+ header.version = stx.header.version.to_i
25
+ header.metadata = tx_metadata_from_proto(stx.header.metadata)
26
+
27
+ header.nentries = stx.header.nentries.to_i
28
+ header.eh = digest_from_proto(stx.header.eH)
29
+
30
+ entries = []
31
+ stx.entries.each do |e|
32
+ entries <<
33
+ ::Immudb::TxEntry.new(
34
+ e.key,
35
+ kv_metadata_from_proto(e.metadata),
36
+ e.vLen.to_i,
37
+ digest_from_proto(e.hValue),
38
+ 0
39
+ )
40
+ end
41
+
42
+ tx = Store.new_tx_with_entries(header, entries)
43
+
44
+ tx.build_hash_tree
45
+
46
+ tx
47
+ end
48
+
49
+ def kv_metadata_from_proto(md)
50
+ return nil if md.nil?
51
+ kvmd = ::Immudb::KVMetadata.new()
52
+ kvmd.as_deleted(md.deleted)
53
+
54
+ unless md.expiration.nil?
55
+ kvmd.expires_at(Time.at(md.expiration.expiresAt))
56
+ end
57
+
58
+ kvmd.as_non_indexable(md.nonIndexable)
59
+
60
+ kvmd
61
+ end
62
+
63
+ def inclusion_proof_from_proto(iproof)
64
+ ip = ::Immudb::InclusionProof.new
65
+ ip.leaf = iproof.leaf.to_i
66
+ ip.width = iproof.width.to_i
67
+ ip.terms = digests_from_proto(iproof.terms)
68
+ ip
69
+ end
70
+
71
+ def dual_proof_from_proto(dproof)
72
+ dp = ::Immudb::DualProof.new
73
+ dp.sourceTxHeader = tx_header_from_proto(dproof.sourceTxHeader)
74
+ dp.targetTxHeader = tx_header_from_proto(dproof.targetTxHeader)
75
+ dp.inclusionProof = digests_from_proto(dproof.inclusionProof)
76
+ dp.consistencyProof = digests_from_proto(dproof.consistencyProof)
77
+ dp.targetBlTxAlh = digest_from_proto(dproof.targetBlTxAlh)
78
+ dp.lastInclusionProof = digests_from_proto(dproof.lastInclusionProof)
79
+ dp.linearProof = linear_proof_from_proto(dproof.linearProof)
80
+ dp
81
+ end
82
+
83
+ def tx_header_from_proto(hdr)
84
+ txh = ::Immudb::TxHeader.new
85
+ txh.iD = hdr.id
86
+ txh.prevAlh = digest_from_proto(hdr.prevAlh)
87
+ txh.ts = hdr.ts
88
+ txh.version = hdr.version.to_i
89
+ txh.metadata = tx_metadata_from_proto(hdr.metadata)
90
+ txh.nentries = hdr.nentries.to_i
91
+ txh.eh = digest_from_proto(hdr.eH)
92
+ txh.blTxID = hdr.blTxId
93
+ txh.blRoot = digest_from_proto(hdr.blRoot)
94
+ txh
95
+ end
96
+
97
+ def tx_metadata_from_proto(md)
98
+ return nil if md.nil?
99
+ ::Immudb::TxMetadata.new
100
+ end
101
+
102
+ def linear_proof_from_proto(lproof)
103
+ lp = ::Immudb::LinearProof.new
104
+ lp.sourceTxID = lproof.sourceTxId
105
+ lp.targetTxID = lproof.TargetTxId
106
+ lp.terms = digests_from_proto(lproof.terms)
107
+ lp
108
+ end
109
+
110
+ def digest_from_proto(sliced_digest)
111
+ sliced_digest[0, 32]
112
+ end
113
+
114
+ def digests_from_proto(sliced_terms)
115
+ sliced_terms.map(&:dup)
116
+ end
117
+ end
118
+ end
119
+ end
data/lib/immudb/store.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2021 CodeNotary, Inc. All rights reserved.
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
2
 
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -13,62 +13,14 @@
13
13
  module Immudb
14
14
  class Store
15
15
  class << self
16
- def tx_from(stx)
17
- entries = []
18
- stx.entries.each do |e|
19
- i = TXe.new
20
- i.h_value = digest_from(e.hValue)
21
- i.v_off = e.vOff
22
- i.value_len = e.vLen.to_i
23
- i.set_key(e.key)
24
- entries << i
25
- end
26
- tx = new_tx_with_entries(entries)
27
- tx.ID = stx.metadata.id
28
- tx.PrevAlh = digest_from(stx.metadata.prevAlh)
29
- tx.Ts = stx.metadata.ts
30
- tx.BlTxID = stx.metadata.blTxId
31
- tx.BlRoot = digest_from(stx.metadata.blRoot)
32
- tx.build_hash_tree
33
- tx.calc_alh
34
- tx
35
- end
36
-
37
- def tx_metadata_from(txmFrom)
38
- txm = TxMetadata.new
39
- txm.iD = txmFrom.id
40
- txm.prevAlh = digest_from(txmFrom.prevAlh)
41
- txm.ts = txmFrom.ts
42
- txm.nEntries = txmFrom.nentries.to_i
43
- txm.eh = digest_from(txmFrom.eH)
44
- txm.blTxID = txmFrom.blTxId
45
- txm.blRoot = digest_from(txmFrom.blRoot)
46
- txm
47
- end
48
-
49
- def encode_key(key)
50
- SET_KEY_PREFIX + key
51
- end
52
-
53
- def encode_kv(key, value)
54
- KV.new(SET_KEY_PREFIX + key, PLAIN_VALUE_PREFIX + value)
55
- end
56
-
57
- def encode_reference(key, referencedKey, atTx)
58
- refVal = REFERENCE_VALUE_PREFIX + [atTx].pack("Q>") + SET_KEY_PREFIX + referencedKey
59
- KV.new(SET_KEY_PREFIX + key, refVal)
60
- end
61
-
62
- def linear_proof_from(lp)
63
- LinearProof.new(lp.sourceTxId, lp.TargetTxId, lp.terms)
64
- end
16
+ def new_tx_with_entries(header, entries)
17
+ htree = HTree.new(entries.length)
65
18
 
66
- def digest_from(sliced_digest)
67
- sliced_digest[0, 32]
68
- end
69
-
70
- def digests_from(sliced_terms)
71
- sliced_terms.map(&:dup)
19
+ tx = Tx.new
20
+ tx.header = header
21
+ tx.entries = entries
22
+ tx.htree = htree
23
+ tx
72
24
  end
73
25
 
74
26
  def verify_inclusion(proof, digest, root)
@@ -92,43 +44,75 @@ module Immudb
92
44
  end
93
45
 
94
46
  def verify_dual_proof(proof, sourceTxID, targetTxID, sourceAlh, targetAlh)
95
- if proof.nil? || proof.sourceTxMetadata.nil? || proof.targetTxMetadata.nil? || proof.sourceTxMetadata.iD != sourceTxID || proof.targetTxMetadata.iD != targetTxID
47
+ if proof.nil? || proof.sourceTxHeader.nil? || proof.targetTxHeader.nil? || proof.sourceTxHeader.iD != sourceTxID || proof.targetTxHeader.iD != targetTxID
96
48
  return false
97
49
  end
98
- if proof.sourceTxMetadata.iD == 0 || proof.sourceTxMetadata.iD > proof.targetTxMetadata.iD
50
+ if proof.sourceTxHeader.iD == 0 || proof.sourceTxHeader.iD > proof.targetTxHeader.iD
99
51
  return false
100
52
  end
101
- if sourceAlh != proof.sourceTxMetadata.alh
53
+ if sourceAlh != proof.sourceTxHeader.alh
102
54
  return false
103
55
  end
104
- if targetAlh != proof.targetTxMetadata.alh
56
+ if targetAlh != proof.targetTxHeader.alh
105
57
  return false
106
58
  end
107
- if sourceTxID < proof.targetTxMetadata.blTxID && !verify_inclusion_aht(proof.inclusionProof, sourceTxID, proof.targetTxMetadata.blTxID, leaf_for(sourceAlh), proof.targetTxMetadata.blRoot)
59
+ if sourceTxID < proof.targetTxHeader.blTxID && !verify_inclusion_aht(proof.inclusionProof, sourceTxID, proof.targetTxHeader.blTxID, leaf_for(sourceAlh), proof.targetTxHeader.blRoot)
108
60
  return false
109
61
  end
110
- if proof.sourceTxMetadata.blTxID > 0 && !verify_consistency(proof.consistencyProof, proof.sourceTxMetadata.blTxID, proof.targetTxMetadata.blTxID, proof.sourceTxMetadata.blRoot, proof.targetTxMetadata.blRoot)
62
+ if proof.sourceTxHeader.blTxID > 0 && !verify_consistency(proof.consistencyProof, proof.sourceTxHeader.blTxID, proof.targetTxHeader.blTxID, proof.sourceTxHeader.blRoot, proof.targetTxHeader.blRoot)
111
63
  return false
112
64
  end
113
- if proof.targetTxMetadata.blTxID > 0 && !verify_last_inclusion(proof.lastInclusionProof, proof.targetTxMetadata.blTxID, leaf_for(proof.targetBlTxAlh), proof.targetTxMetadata.blRoot)
65
+ if proof.targetTxHeader.blTxID > 0 && !verify_last_inclusion(proof.lastInclusionProof, proof.targetTxHeader.blTxID, leaf_for(proof.targetBlTxAlh), proof.targetTxHeader.blRoot)
114
66
  return false
115
67
  end
116
- if sourceTxID < proof.targetTxMetadata.blTxID
117
- verify_linear_proof(proof.linearProof, proof.targetTxMetadata.blTxID, targetTxID, proof.targetBlTxAlh, targetAlh)
68
+ if sourceTxID < proof.targetTxHeader.blTxID
69
+ verify_linear_proof(proof.linearProof, proof.targetTxHeader.blTxID, targetTxID, proof.targetBlTxAlh, targetAlh)
118
70
  else
119
71
  verify_linear_proof(proof.linearProof, sourceTxID, targetTxID, sourceAlh, targetAlh)
120
72
  end
121
73
  end
122
74
 
75
+ def entry_spec_digest_for(version)
76
+ if version == 0
77
+ method(:entry_spec_digest_v0)
78
+ elsif version == 1
79
+ method(:entry_spec_digest_v1)
80
+ else
81
+ # TODO raise ErrUnsupportedTxVersion
82
+ raise VerificationError
83
+ end
84
+ end
85
+
123
86
  private
124
87
 
125
- def new_tx_with_entries(entries)
126
- tx = Tx.new
127
- tx.ID = 0
128
- tx.entries = entries
129
- tx.nentries = entries.length
130
- tx.htree = HTree.new(entries.length)
131
- tx
88
+ def entry_spec_digest_v0(kv)
89
+ md = Digest::SHA256.new
90
+ md.update(kv.key)
91
+ valmd = Digest::SHA256.new
92
+ valmd.update(kv.value)
93
+ md.update(valmd.digest)
94
+ md.digest
95
+ end
96
+
97
+ def entry_spec_digest_v1(kv)
98
+ mdbs = "".b
99
+ if !kv.metadata.nil?
100
+ mdbs = kv.metadata.bytes
101
+ end
102
+ mdLen = mdbs.length
103
+ kLen = kv.key.length
104
+ b = "".b
105
+ b = b + [mdLen].pack("n")
106
+ b = b + mdbs
107
+ b = b + [kLen].pack("n")
108
+ b = b + kv.key
109
+
110
+ md = Digest::SHA256.new
111
+ md.update(b)
112
+ valmd = Digest::SHA256.new
113
+ valmd.update(kv.value)
114
+ md.update(valmd.digest)
115
+ md.digest
132
116
  end
133
117
 
134
118
  def leaf_for(d)
data/lib/immudb/tx.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2021 CodeNotary, Inc. All rights reserved.
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
2
 
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,35 +12,37 @@
12
12
 
13
13
  module Immudb
14
14
  class Tx
15
- attr_accessor :ID, :Ts, :BlTxID, :BlRoot, :PrevAlh, :nentries, :entries, :htree, :Alh
15
+ attr_accessor :header, :entries, :htree
16
+
17
+ def initialize
18
+ @header = nil
19
+ @entries = nil
20
+ @htree = nil
21
+ end
22
+
23
+ def tx_entry_digest
24
+ if @header.version == 0
25
+ method(:tx_entry_digest_v1_1)
26
+ elsif @header.version == 1
27
+ method(:tx_entry_digest_v1_2)
28
+ else
29
+ raise VerificationError
30
+ end
31
+ end
16
32
 
17
33
  def build_hash_tree
18
34
  digests = []
35
+ tx_entry_digest = self.tx_entry_digest
19
36
  @entries.each do |e|
20
- digests << e.digest
37
+ digests << tx_entry_digest.call(e)
21
38
  end
22
39
  @htree.build_with(digests)
40
+ root = @htree.root
41
+ @header.eh = root
23
42
  end
24
43
 
25
- def calc_alh
26
- calc_innerhash
27
- bi = [@ID].pack("Q>") + @PrevAlh + @InnerHash
28
- @Alh = Digest::SHA256.digest(bi)
29
- end
30
-
31
- def calc_innerhash
32
- bj = [@Ts, @nentries].pack("Q>L>") + eh
33
- bj += [@BlTxID].pack("Q>") + @BlRoot
34
- @InnerHash = Digest::SHA256.digest(bj)
35
- end
36
-
37
- def eh
38
- @htree.root
39
- end
40
-
41
- def proof(key)
44
+ def index_of(key)
42
45
  kindex = nil
43
- # find index of element holding given key
44
46
  @entries.each_with_index do |v, k|
45
47
  if v.key == key
46
48
  kindex = k
@@ -48,9 +50,44 @@ module Immudb
48
50
  end
49
51
  end
50
52
  if kindex.nil?
51
- raise KeyError
53
+ raise VerificationError
54
+ end
55
+ kindex
56
+ end
57
+
58
+ def proof(key)
59
+ kindex = index_of(key)
60
+ htree.inclusion_proof(kindex)
61
+ end
62
+
63
+ private
64
+
65
+ def tx_entry_digest_v1_1(e)
66
+ unless e.md.nil?
67
+ # TODO raise ErrMetadataUnsupported
68
+ raise Error, "Metadata not supported"
69
+ end
70
+ md = Digest::SHA256.new
71
+ md.update(e.k)
72
+ md.update(e.hVal)
73
+ md.digest
74
+ end
75
+
76
+ def tx_entry_digest_v1_2(e)
77
+ mdbs = "".b
78
+ if !e.md.nil?
79
+ mdbs = e.md.bytes
52
80
  end
53
- @htree.inclusion_proof(kindex)
81
+ mdLen = mdbs.length
82
+ b = "".b
83
+ b = b + [mdLen].pack("n")
84
+ b = b + mdbs
85
+ b = b + [e.kLen].pack("n")
86
+ b = b + e.k
87
+ md = Digest::SHA256.new
88
+ md.update(b)
89
+ md.update(e.hVal)
90
+ md.digest
54
91
  end
55
92
  end
56
93
  end
@@ -0,0 +1,34 @@
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ module Immudb
14
+ class TxEntry
15
+ attr_reader :k, :kLen, :md, :vLen, :hVal, :vOff
16
+
17
+ def initialize(key, md, vLen, hVal, vOff)
18
+ @k = key
19
+ @kLen = key.length
20
+ @md = md
21
+ @vLen = vLen
22
+ @hVal = hVal
23
+ @vOff = vOff
24
+ end
25
+
26
+ def key
27
+ @k
28
+ end
29
+
30
+ def metadata
31
+ @md
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,62 @@
1
+ # Copyright 2022 CodeNotary, Inc. All rights reserved.
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ module Immudb
14
+ class TxHeader
15
+ attr_accessor :iD, :ts, :blTxID, :blRoot, :prevAlh, :version, :metadata, :nentries, :eh
16
+
17
+ def initialize
18
+ @iD = nil
19
+ @ts = nil
20
+ @blTxID = nil
21
+ @blRoot = nil
22
+ @prevAlh = nil
23
+
24
+ @version = nil
25
+ @metadata = TxMetadata.new
26
+
27
+ @nentries = nil
28
+ @eh = nil
29
+ end
30
+
31
+ def inner_hash
32
+ md = Digest::SHA256.new
33
+ md.update([@ts].pack("Q>"))
34
+ md.update([@version].pack("n"))
35
+ if @version == 0
36
+ md.update([@nentries].pack("n"))
37
+ elsif @version == 1
38
+ mdbs = "".b
39
+ if !@metadata.nil?
40
+ mdbs = @metadata.bytes
41
+ end
42
+ md.update([mdbs.length].pack("n"))
43
+ md.update(mdbs)
44
+ md.update([@nentries].pack("N"))
45
+ else
46
+ raise VerificationError, "missing tx hash calculation method for version #{@version}"
47
+ end
48
+ md.update(@eh)
49
+ md.update([@blTxID].pack("Q>"))
50
+ md.update(@blRoot)
51
+ md.digest
52
+ end
53
+
54
+ def alh
55
+ md = Digest::SHA256.new
56
+ md.update([@iD].pack("Q>"))
57
+ md.update(@prevAlh)
58
+ md.update(inner_hash)
59
+ md.digest
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module Immudb
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/immudb.rb CHANGED
@@ -4,25 +4,29 @@ require "openssl"
4
4
  require "time"
5
5
 
6
6
  # grpc
7
- require "immudb/grpc/schema_pb"
8
7
  require "immudb/grpc/schema_services_pb"
9
8
 
10
9
  # modules
11
10
  require "immudb/client"
12
11
  require "immudb/constants"
12
+ require "immudb/database"
13
13
  require "immudb/dual_proof"
14
+ require "immudb/entry_spec"
14
15
  require "immudb/htree"
15
16
  require "immudb/inclusion_proof"
16
17
  require "immudb/interceptor"
17
18
  require "immudb/kv"
19
+ require "immudb/kv_metadata"
18
20
  require "immudb/linear_proof"
19
21
  require "immudb/root_service"
22
+ require "immudb/schema"
20
23
  require "immudb/sql_result"
21
24
  require "immudb/state"
22
25
  require "immudb/store"
23
26
  require "immudb/tx"
27
+ require "immudb/tx_entry"
28
+ require "immudb/tx_header"
24
29
  require "immudb/tx_metadata"
25
- require "immudb/txe"
26
30
  require "immudb/version"
27
31
 
28
32
  module Immudb