sigma_rb 0.1.3

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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +9 -0
  4. data/ext/Rakefile +7 -0
  5. data/ext/csigma.c +5 -0
  6. data/lib/sigma/address.rb +73 -0
  7. data/lib/sigma/block_header.rb +197 -0
  8. data/lib/sigma/box_selection.rb +105 -0
  9. data/lib/sigma/byte_array.rb +96 -0
  10. data/lib/sigma/constant.rb +117 -0
  11. data/lib/sigma/context_extension.rb +47 -0
  12. data/lib/sigma/contract.rb +70 -0
  13. data/lib/sigma/data_input.rb +100 -0
  14. data/lib/sigma/enums.rb +35 -0
  15. data/lib/sigma/ergo_box.rb +556 -0
  16. data/lib/sigma/ergo_box_candidate_builder.rb +123 -0
  17. data/lib/sigma/ergo_state_context.rb +41 -0
  18. data/lib/sigma/ergo_tree.rb +111 -0
  19. data/lib/sigma/input.rb +249 -0
  20. data/lib/sigma/merkle_proof.rb +79 -0
  21. data/lib/sigma/nipopow.rb +155 -0
  22. data/lib/sigma/pre_header.rb +38 -0
  23. data/lib/sigma/reduced_transaction.rb +88 -0
  24. data/lib/sigma/secret_key.rb +119 -0
  25. data/lib/sigma/structs.rb +31 -0
  26. data/lib/sigma/token.rb +225 -0
  27. data/lib/sigma/transaction.rb +365 -0
  28. data/lib/sigma/tx_builder.rb +116 -0
  29. data/lib/sigma/util.rb +27 -0
  30. data/lib/sigma/wallet.rb +97 -0
  31. data/lib/sigma.rb +32 -0
  32. data/sigma.gemspec +20 -0
  33. data/tests/all.rb +44 -0
  34. data/tests/sigma/address_test.rb +45 -0
  35. data/tests/sigma/block_header_test.rb +35 -0
  36. data/tests/sigma/box_selection_test.rb +78 -0
  37. data/tests/sigma/constant_test.rb +57 -0
  38. data/tests/sigma/context_extension_test.rb +16 -0
  39. data/tests/sigma/contract_test.rb +39 -0
  40. data/tests/sigma/data_input_test.rb +38 -0
  41. data/tests/sigma/ergo_box_candidate_builder_test.rb +76 -0
  42. data/tests/sigma/ergo_box_test.rb +219 -0
  43. data/tests/sigma/ergo_state_context_test.rb +26 -0
  44. data/tests/sigma/ergo_tree_test.rb +66 -0
  45. data/tests/sigma/input_test.rb +41 -0
  46. data/tests/sigma/merkle_proof_test.rb +34 -0
  47. data/tests/sigma/nipopow_test.rb +100 -0
  48. data/tests/sigma/secret_key_test.rb +31 -0
  49. data/tests/sigma/token_test.rb +87 -0
  50. data/tests/sigma/transaction_test.rb +438 -0
  51. data/tests/sigma_test.rb +18 -0
  52. data/tests/test_seeds.rb +35 -0
  53. data/tests/test_utils.rb +11 -0
  54. metadata +174 -0
@@ -0,0 +1,111 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ErgoTree
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_ergo_tree_delete, [:pointer], :void
11
+ attach_function :ergo_lib_ergo_tree_eq, [:pointer, :pointer], :bool
12
+ attach_function :ergo_lib_ergo_tree_from_base16_bytes, [:pointer, :pointer], :error_pointer
13
+ attach_function :ergo_lib_ergo_tree_to_base16_bytes, [:pointer, :pointer], :error_pointer
14
+ attach_function :ergo_lib_ergo_tree_to_bytes, [:pointer, :pointer], :error_pointer
15
+ attach_function :ergo_lib_ergo_tree_template_bytes, [:pointer, :pointer], :error_pointer
16
+ attach_function :ergo_lib_ergo_tree_bytes_len, [:pointer], ReturnNumUsize.by_value
17
+ attach_function :ergo_lib_ergo_tree_template_bytes_len, [:pointer], ReturnNumUsize.by_value
18
+ attach_function :ergo_lib_ergo_tree_with_constant, [:pointer, :uint8, :pointer, :pointer], :error_pointer
19
+ attach_function :ergo_lib_ergo_tree_constants_len, [:pointer], ReturnNumUsize.by_value
20
+ attach_function :ergo_lib_ergo_tree_get_constant, [:pointer, :uint8, :pointer], ReturnOption.by_value
21
+ attr_accessor :pointer
22
+
23
+ def self.with_raw_pointer(unread_pointer)
24
+ init(unread_pointer)
25
+ end
26
+
27
+ def self.from_base16_encoded_string(encoded_str)
28
+ pointer = FFI::MemoryPointer.new(:pointer)
29
+ error = ergo_lib_ergo_tree_from_base16_bytes(encoded_str, pointer)
30
+ Util.check_error!(error)
31
+
32
+ init(pointer)
33
+ end
34
+
35
+ def to_base16_encoded_string
36
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
37
+ error = ergo_lib_ergo_tree_to_base16_bytes(self.pointer, s_ptr)
38
+ Util.check_error!(error)
39
+ s_ptr = s_ptr.read_pointer()
40
+ str = s_ptr.read_string().force_encoding('UTF-8')
41
+ Util.ergo_lib_delete_string(s_ptr)
42
+ str
43
+ end
44
+
45
+ def to_bytes
46
+ res = ergo_lib_ergo_tree_bytes_len(self.pointer)
47
+ Util.check_error!(res[:error])
48
+ bytes_length = res[:value]
49
+ bytes_ptr = FFI::MemoryPointer.new(:uint8, bytes_length)
50
+ error = ergo_lib_ergo_tree_to_bytes(self.pointer, bytes_ptr)
51
+ Util.check_error!(error)
52
+ bytes_ptr.read_array_of_uint8(bytes_length)
53
+ end
54
+
55
+ def to_template_bytes
56
+ res = ergo_lib_ergo_tree_template_bytes_len(self.pointer)
57
+ Util.check_error!(res[:error])
58
+ bytes_length = res[:value]
59
+ bytes_ptr = FFI::MemoryPointer.new(:uint8, bytes_length)
60
+ error = ergo_lib_ergo_tree_template_bytes(self.pointer, bytes_ptr)
61
+ Util.check_error!(error)
62
+ bytes_ptr.read_array_of_uint8(bytes_length)
63
+ end
64
+
65
+ def constants_length
66
+ res = ergo_lib_ergo_tree_constants_len(self.pointer)
67
+ Util.check_error!(res[:error])
68
+ res[:value]
69
+ end
70
+
71
+ def get_constant(index)
72
+ pointer = FFI::MemoryPointer.new(:pointer)
73
+ res = ergo_lib_ergo_tree_get_constant(self.pointer, index, pointer)
74
+ Util.check_error!(res[:error])
75
+ if res[:is_some]
76
+ Sigma::Constant.with_raw_pointer(pointer)
77
+ else
78
+ nil
79
+ end
80
+ end
81
+
82
+ def replace_constant(index:, constant:)
83
+ pointer = FFI::MemoryPointer.new(:pointer)
84
+ error = ergo_lib_ergo_tree_with_constant(self.pointer, index, constant.pointer, pointer)
85
+ Util.check_error!(error)
86
+
87
+ # Replace self.pointer with new ergo_tree pointer
88
+ # Old pointer will be deleted when out of scope by GC
89
+ self.class.init(pointer, obj: self)
90
+ end
91
+
92
+ def ==(ergo_tree_two)
93
+ ergo_lib_ergo_tree_eq(self.pointer, ergo_tree_two.pointer)
94
+ end
95
+
96
+ private
97
+
98
+ def self.init(unread_pointer, obj: nil)
99
+ obj ||= self.new
100
+ obj_ptr = unread_pointer.get_pointer(0)
101
+
102
+ obj.pointer = FFI::AutoPointer.new(
103
+ obj_ptr,
104
+ method(:ergo_lib_ergo_tree_delete)
105
+ )
106
+ obj
107
+ end
108
+
109
+
110
+ end
111
+ end
@@ -0,0 +1,249 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class Input
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attr_accessor :pointer
11
+ attach_function :ergo_lib_input_delete, [:pointer], :void
12
+ attach_function :ergo_lib_input_box_id, [:pointer, :pointer], :void
13
+ attach_function :ergo_lib_input_spending_proof, [:pointer, :pointer], :void
14
+
15
+ def self.with_raw_pointer(pointer)
16
+ init(pointer)
17
+ end
18
+
19
+ def get_box_id
20
+ pointer = FFI::MemoryPointer.new(:pointer)
21
+ ergo_lib_input_box_id(self.pointer, pointer)
22
+ Sigma::BoxId.with_raw_pointer(pointer)
23
+ end
24
+
25
+ def get_spending_proof
26
+ pointer = FFI::MemoryPointer.new(:pointer)
27
+ ergo_lib_input_spending_proof(self.pointer, pointer)
28
+ Sigma::ProverResult.with_raw_pointer(pointer)
29
+ end
30
+
31
+ private
32
+
33
+ def self.init(unread_pointer)
34
+ obj = self.new
35
+ obj_ptr = unread_pointer.get_pointer(0)
36
+
37
+ obj.pointer = FFI::AutoPointer.new(
38
+ obj_ptr,
39
+ method(:ergo_lib_input_delete)
40
+ )
41
+ obj
42
+ end
43
+ end
44
+
45
+ class Inputs
46
+ extend FFI::Library
47
+ ffi_lib FFI::Compiler::Loader.find('csigma')
48
+ typedef :pointer, :error_pointer
49
+ attach_function :ergo_lib_inputs_new, [:pointer], :void
50
+ attach_function :ergo_lib_inputs_delete, [:pointer], :void
51
+ attach_function :ergo_lib_inputs_add, [:pointer, :pointer], :void
52
+ attach_function :ergo_lib_inputs_len, [:pointer], :uint8
53
+ attach_function :ergo_lib_inputs_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
54
+
55
+ attr_accessor :pointer
56
+
57
+ def self.with_raw_pointer(unread_pointer)
58
+ init(unread_pointer)
59
+ end
60
+
61
+ def self.create
62
+ pointer = FFI::MemoryPointer.new(:pointer)
63
+ ergo_lib_inputs_new(pointer)
64
+
65
+ init(pointer)
66
+ end
67
+
68
+ def len
69
+ ergo_lib_inputs_len(self.pointer)
70
+ end
71
+
72
+ def add(input)
73
+ ergo_lib_inputs_add(input.pointer, self.pointer)
74
+ end
75
+
76
+ def get(index)
77
+ pointer = FFI::MemoryPointer.new(:pointer)
78
+ res = ergo_lib_inputs_get(self.pointer, index, pointer)
79
+ Util.check_error!(res[:error])
80
+ if res[:is_some]
81
+ Sigma::Input.with_raw_pointer(pointer)
82
+ else
83
+ nil
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ def self.init(unread_pointer)
90
+ obj = self.new
91
+ obj_ptr = unread_pointer.get_pointer(0)
92
+
93
+ obj.pointer = FFI::AutoPointer.new(
94
+ obj_ptr,
95
+ method(:ergo_lib_inputs_delete)
96
+ )
97
+ obj
98
+ end
99
+ end
100
+
101
+ class ProverResult
102
+ extend FFI::Library
103
+ ffi_lib FFI::Compiler::Loader.find('csigma')
104
+ typedef :pointer, :error_pointer
105
+ attach_function :ergo_lib_prover_result_delete, [:pointer], :void
106
+ attach_function :ergo_lib_prover_result_to_json, [:pointer, :pointer], :error_pointer
107
+ attach_function :ergo_lib_prover_result_context_extension, [:pointer, :pointer], :void
108
+ attach_function :ergo_lib_prover_result_proof, [:pointer, :pointer], :void
109
+ attach_function :ergo_lib_prover_result_proof_len, [:pointer], :uint
110
+ attr_accessor :pointer
111
+
112
+ def to_bytes
113
+ proof_len = ergo_lib_prover_result_proof_len(self.pointer)
114
+ b_ptr = FFI::MemoryPointer.new(:uint8, proof_len)
115
+ ergo_lib_prover_result_proof(self.pointer, b_ptr)
116
+ b_ptr.get_array_of_uint8(0, proof_len)
117
+ end
118
+
119
+ def get_context_extension
120
+ pointer = FFI::MemoryPointer.new(:pointer)
121
+ ergo_lib_prover_result_context_extension(self.pointer, pointer)
122
+ Sigma::ContextExtension.with_raw_pointer(pointer)
123
+ end
124
+
125
+ def to_json
126
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
127
+ error = ergo_lib_prover_result_to_json(self.pointer, s_ptr)
128
+ Util.check_error!(error)
129
+ s_ptr = s_ptr.read_pointer()
130
+ str = s_ptr.read_string().force_encoding('UTF-8')
131
+ Util.ergo_lib_delete_string(s_ptr)
132
+ str
133
+ end
134
+
135
+ def self.with_raw_pointer(pointer)
136
+ init(pointer)
137
+ end
138
+
139
+ private
140
+
141
+ def self.init(unread_pointer)
142
+ obj = self.new
143
+ obj_ptr = unread_pointer.get_pointer(0)
144
+
145
+ obj.pointer = FFI::AutoPointer.new(
146
+ obj_ptr,
147
+ method(:ergo_lib_prover_result_delete)
148
+ )
149
+ obj
150
+ end
151
+
152
+ end
153
+
154
+ class UnsignedInput
155
+ extend FFI::Library
156
+ ffi_lib FFI::Compiler::Loader.find('csigma')
157
+ typedef :pointer, :error_pointer
158
+ attach_function :ergo_lib_unsigned_input_delete, [:pointer], :void
159
+ attach_function :ergo_lib_unsigned_input_box_id, [:pointer, :pointer], :void
160
+ attach_function :ergo_lib_unsigned_input_context_extension, [:pointer, :pointer], :void
161
+
162
+ attr_accessor :pointer
163
+
164
+ def self.with_raw_pointer(pointer)
165
+ init(pointer)
166
+ end
167
+
168
+ def get_box_id
169
+ pointer = FFI::MemoryPointer.new(:pointer)
170
+ ergo_lib_unsigned_input_box_id(self.pointer, pointer)
171
+ Sigma::BoxId.with_raw_pointer(pointer)
172
+ end
173
+
174
+ def get_context_extension
175
+ pointer = FFI::MemoryPointer.new(:pointer)
176
+ ergo_lib_unsigned_input_context_extension(self.pointer, pointer)
177
+ Sigma::ContextExtension.with_raw_pointer(pointer)
178
+ end
179
+
180
+ private
181
+
182
+ def self.init(unread_pointer)
183
+ obj = self.new
184
+ obj_ptr = unread_pointer.get_pointer(0)
185
+
186
+ obj.pointer = FFI::AutoPointer.new(
187
+ obj_ptr,
188
+ method(:ergo_lib_unsigned_input_delete)
189
+ )
190
+ obj
191
+ end
192
+ end
193
+
194
+ class UnsignedInputs
195
+ extend FFI::Library
196
+ ffi_lib FFI::Compiler::Loader.find('csigma')
197
+ typedef :pointer, :error_pointer
198
+ attach_function :ergo_lib_unsigned_inputs_new, [:pointer], :void
199
+ attach_function :ergo_lib_unsigned_inputs_delete, [:pointer], :void
200
+ attach_function :ergo_lib_unsigned_inputs_add, [:pointer, :pointer], :void
201
+ attach_function :ergo_lib_unsigned_inputs_len, [:pointer], :uint8
202
+ attach_function :ergo_lib_unsigned_inputs_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
203
+
204
+ attr_accessor :pointer
205
+
206
+ def self.with_raw_pointer(unread_pointer)
207
+ init(unread_pointer)
208
+ end
209
+
210
+ def self.create
211
+ pointer = FFI::MemoryPointer.new(:pointer)
212
+ ergo_lib_unsigned_inputs_new(pointer)
213
+
214
+ init(pointer)
215
+ end
216
+
217
+ def len
218
+ ergo_lib_unsigned_inputs_len(self.pointer)
219
+ end
220
+
221
+ def add(unsigned_input)
222
+ ergo_lib_unsigned_inputs_add(unsigned_input.pointer, self.pointer)
223
+ end
224
+
225
+ def get(index)
226
+ pointer = FFI::MemoryPointer.new(:pointer)
227
+ res = ergo_lib_unsigned_inputs_get(self.pointer, index, pointer)
228
+ Util.check_error!(res[:error])
229
+ if res[:is_some]
230
+ Sigma::UnsignedInput.with_raw_pointer(pointer)
231
+ else
232
+ nil
233
+ end
234
+ end
235
+
236
+ private
237
+
238
+ def self.init(unread_pointer)
239
+ obj = self.new
240
+ obj_ptr = unread_pointer.get_pointer(0)
241
+
242
+ obj.pointer = FFI::AutoPointer.new(
243
+ obj_ptr,
244
+ method(:ergo_lib_unsigned_inputs_delete)
245
+ )
246
+ obj
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,79 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class MerkleProof
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_merkle_proof_delete, [:pointer], :void
11
+ attach_function :ergo_merkle_proof_new, [:pointer, :uint, :pointer], :error_pointer
12
+ attach_function :ergo_merkle_proof_from_json, [:pointer, :pointer], :error_pointer
13
+ attach_function :ergo_merkle_proof_add_node, [:pointer, :pointer, :uint, NODE_SIDE_ENUM], :error_pointer
14
+ attach_function :ergo_merkle_proof_valid, [:pointer, :pointer, :uint], :bool
15
+ attach_function :ergo_merkle_proof_valid_base16, [:pointer, :pointer, :pointer], :error_pointer
16
+ attr_accessor :pointer
17
+
18
+ # leaf_data is an Array(Uint8)
19
+ def self.create(leaf_data)
20
+ pointer = FFI::MemoryPointer.new(:pointer)
21
+ b_ptr = FFI::MemoryPointer.new(:uint8, leaf_data.size)
22
+ b_ptr.write_array_of_uint8(leaf_data)
23
+ error = ergo_merkle_proof_new(b_ptr, leaf_data.size, pointer)
24
+ Util.check_error!(error)
25
+ init(pointer)
26
+ end
27
+
28
+ def self.with_json(json)
29
+ pointer = FFI::MemoryPointer.new(:pointer)
30
+ error = ergo_merkle_proof_from_json(json, pointer)
31
+ init(pointer)
32
+ end
33
+
34
+ def add_node(hash:, side:)
35
+ b_ptr = FFI::MemoryPointer.new(:uint8, hash.size)
36
+ b_ptr.write_array_of_uint8(hash)
37
+ error = ergo_merkle_proof_add_node(self.pointer, b_ptr, hash.size, side)
38
+ Util.check_error!(error)
39
+ end
40
+
41
+ # Hash can be an Array(Uint8) or String
42
+ def valid(hash)
43
+ if hash.is_a?(Array)
44
+ valid_with_array(hash)
45
+ elsif hash.is_a?(String)
46
+ valid_with_string(hash)
47
+ else
48
+ raise 'Invalid type for hash: #{hash.class}. It must be an Array(Uint8) or String'
49
+ end
50
+ end
51
+
52
+ private def valid_with_array(hash)
53
+ b_ptr = FFI::MemoryPointer.new(:uint8, hash.size)
54
+ b_ptr.write_array_of_uint8(hash)
55
+ ergo_merkle_proof_valid(self.pointer, b_ptr, b_ptr.size)
56
+ end
57
+
58
+ private def valid_with_string(hash)
59
+ pointer = FFI::MemoryPointer.new(:pointer)
60
+ error = ergo_merkle_proof_valid_base16(self.pointer, hash, pointer)
61
+ Util.check_error!(error)
62
+ pointer.get_pointer(0)
63
+ end
64
+
65
+
66
+ private
67
+
68
+ def self.init(unread_pointer)
69
+ obj = self.new
70
+ obj_ptr = unread_pointer.get_pointer(0)
71
+
72
+ obj.pointer = FFI::AutoPointer.new(
73
+ obj_ptr,
74
+ method(:ergo_merkle_proof_delete)
75
+ )
76
+ obj
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,155 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class NipopowProof
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_nipopow_proof_delete, [:pointer], :void
11
+ attach_function :ergo_lib_nipopow_proof_from_json, [:pointer, :pointer], :error_pointer
12
+ attach_function :ergo_lib_nipopow_proof_to_json, [:pointer, :pointer], :error_pointer
13
+ attach_function :ergo_lib_nipopow_proof_is_better_than, [:pointer, :pointer], ReturnBool.by_value
14
+
15
+ attr_accessor :pointer
16
+
17
+ def self.with_json(json)
18
+ pointer = FFI::MemoryPointer.new(:pointer)
19
+ error = ergo_lib_nipopow_proof_from_json(json, pointer)
20
+ Util.check_error!(error)
21
+ init(pointer)
22
+ end
23
+
24
+ def is_better_than(other_proof)
25
+ pointer = FFI::MemoryPointer.new(:pointer)
26
+ res = ergo_lib_nipopow_proof_is_better_than(self.pointer, other_proof.pointer)
27
+ Util.check_error!(res[:error])
28
+ res[:value]
29
+ end
30
+
31
+ def to_json
32
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
33
+ error = ergo_lib_nipopow_proof_to_json(self.pointer, s_ptr)
34
+ Util.check_error!(error)
35
+ s_ptr = s_ptr.read_pointer()
36
+ str = s_ptr.read_string().force_encoding('UTF-8')
37
+ Util.ergo_lib_delete_string(s_ptr)
38
+ str
39
+ end
40
+
41
+ private
42
+
43
+ def self.init(unread_pointer)
44
+ obj = self.new
45
+ obj_ptr = unread_pointer.get_pointer(0)
46
+
47
+ obj.pointer = FFI::AutoPointer.new(
48
+ obj_ptr,
49
+ method(:ergo_lib_nipopow_proof_delete)
50
+ )
51
+ obj
52
+ end
53
+ end
54
+
55
+ class NipopowVerifier
56
+ extend FFI::Library
57
+ ffi_lib FFI::Compiler::Loader.find('csigma')
58
+ typedef :pointer, :error_pointer
59
+ attach_function :ergo_lib_nipopow_verifier_delete, [:pointer], :void
60
+ attach_function :ergo_lib_nipopow_verifier_new, [:pointer,:pointer], :void
61
+ attach_function :ergo_lib_nipopow_verifier_best_chain, [:pointer,:pointer], :void
62
+ attach_function :ergo_lib_nipopow_verifier_process, [:pointer,:pointer], :error_pointer
63
+ attr_accessor :pointer
64
+
65
+ def self.create(genesis_block_id)
66
+ pointer = FFI::MemoryPointer.new(:pointer)
67
+ ergo_lib_nipopow_verifier_new(genesis_block_id.pointer, pointer)
68
+ init(pointer)
69
+ end
70
+
71
+ def best_chain
72
+ pointer = FFI::MemoryPointer.new(:pointer)
73
+ ergo_lib_nipopow_verifier_best_chain(self.pointer, pointer)
74
+ BlockHeaders.with_raw_pointer(pointer)
75
+ end
76
+
77
+ def process(proof)
78
+ error = ergo_lib_nipopow_verifier_process(self.pointer, proof.pointer)
79
+ Util.check_error!(error)
80
+ end
81
+
82
+ private
83
+
84
+ def self.init(unread_pointer)
85
+ obj = self.new
86
+ obj_ptr = unread_pointer.get_pointer(0)
87
+
88
+ obj.pointer = FFI::AutoPointer.new(
89
+ obj_ptr,
90
+ method(:ergo_lib_nipopow_verifier_delete)
91
+ )
92
+ obj
93
+ end
94
+ end
95
+
96
+ class PoPowHeader
97
+ extend FFI::Library
98
+ ffi_lib FFI::Compiler::Loader.find('csigma')
99
+ typedef :pointer, :error_pointer
100
+ attach_function :ergo_lib_popow_header_delete, [:pointer], :void
101
+ attach_function :ergo_lib_popow_header_from_json, [:pointer, :pointer], :error_pointer
102
+ attach_function :ergo_lib_popow_header_get_header, [:pointer, :pointer], :error_pointer
103
+ attach_function :ergo_lib_popow_header_get_interlinks, [:pointer, :pointer], :error_pointer
104
+ attach_function :ergo_lib_po_pow_header_eq, [:pointer, :pointer], :bool
105
+ attr_accessor :pointer
106
+
107
+ def self.with_json(json)
108
+ pointer = FFI::MemoryPointer.new(:pointer)
109
+ error = ergo_lib_popow_header_from_json(json, pointer)
110
+ Util.check_error!(error)
111
+ init(pointer)
112
+ end
113
+
114
+ def to_json
115
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
116
+ error = ergo_lib_popow_header_to_json(self.pointer, s_ptr)
117
+ Util.check_error!(error)
118
+ s_ptr = s_ptr.read_pointer()
119
+ str = s_ptr.read_string().force_encoding('UTF-8')
120
+ Util.ergo_lib_delete_string(s_ptr)
121
+ str
122
+ end
123
+
124
+ def get_header
125
+ pointer = FFI::MemoryPointer.new(:pointer)
126
+ error = ergo_lib_popow_header_get_header(self.pointer, pointer)
127
+ Util.check_error!(error)
128
+ BlockHeader.with_raw_pointer(pointer)
129
+ end
130
+
131
+ def get_interlinks
132
+ pointer = FFI::MemoryPointer.new(:pointer)
133
+ error = ergo_lib_popow_header_get_interlinks(self.pointer, pointer)
134
+ Util.check_error!(error)
135
+ BlockIds.with_raw_pointer(pointer)
136
+ end
137
+
138
+ def ==(other_header)
139
+ ergo_lib_po_pow_header_eq(self.pointer, other_header.pointer)
140
+ end
141
+
142
+ private
143
+
144
+ def self.init(unread_pointer)
145
+ obj = self.new
146
+ obj_ptr = unread_pointer.get_pointer(0)
147
+
148
+ obj.pointer = FFI::AutoPointer.new(
149
+ obj_ptr,
150
+ method(:ergo_lib_popow_header_delete)
151
+ )
152
+ obj
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,38 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class PreHeader
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_preheader_delete, [:pointer], :void
11
+ attach_function :ergo_lib_preheader_from_block_header, [:pointer, :pointer], :void
12
+ attach_function :ergo_lib_pre_header_eq, [:pointer, :pointer], :bool
13
+ attr_accessor :pointer
14
+
15
+ def self.with_block_header(block_header)
16
+ pointer = FFI::MemoryPointer.new(:pointer)
17
+ ergo_lib_preheader_from_block_header(block_header.pointer, pointer)
18
+ init(pointer)
19
+ end
20
+
21
+ def ==(ph_two)
22
+ ergo_lib_pre_header_eq(self.pointer, ph_two.pointer)
23
+ end
24
+
25
+ private
26
+
27
+ def self.init(unread_pointer)
28
+ obj = self.new
29
+ obj_ptr = unread_pointer.get_pointer(0)
30
+
31
+ obj.pointer = FFI::AutoPointer.new(
32
+ obj_ptr,
33
+ method(:ergo_lib_preheader_delete)
34
+ )
35
+ obj
36
+ end
37
+ end
38
+ end