sigma_rb 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,6 +3,7 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # An ErgoBoxCandidate Builder
6
7
  class ErgoBoxCandidateBuilder
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -23,7 +24,11 @@ module Sigma
23
24
  attach_function :ergo_lib_ergo_box_candidate_builder_add_token, [:pointer, :pointer, :pointer], :void
24
25
 
25
26
  attr_accessor :pointer
26
-
27
+ # Create builder with required box parameters
28
+ # @param box_value: [BoxValue] amount of money associated with the box
29
+ # @param contract: [Contract] guarding contract, which should be evaluated to true in order to open(spend) this box
30
+ # @param creation_height: [Integer] height when a transaction containing the box is created. It should not exceed height of the block, containing the transaction with this box.
31
+ # @return [ErgoBoxCandidateBuilder]
27
32
  def self.create(box_value:, contract:, creation_height:)
28
33
  pointer = FFI::MemoryPointer.new(:pointer)
29
34
  ergo_lib_ergo_box_candidate_builder_new(box_value.pointer, contract.pointer, creation_height, pointer)
@@ -31,32 +36,46 @@ module Sigma
31
36
  init(pointer)
32
37
  end
33
38
 
39
+ # Set minimal value (per byte of the serialized box size)
40
+ # @param min_box_value [Uint32] Unsigned 32-bit integer
41
+ # @return [ErgoBoxCandidateBuilder] updated ErgoBoxCandidateBuilder (self)
34
42
  def set_min_box_value_per_byte(min_box_value)
35
43
  ergo_lib_ergo_box_candidate_builder_set_min_box_value_per_byte(self.pointer, min_box_value)
36
44
  self
37
45
  end
38
46
 
47
+ # Get minimal value (per byte of the serialized box size)
48
+ # @return [Integer]
39
49
  def get_min_box_value_per_byte
40
50
  ergo_lib_ergo_box_candidate_builder_min_box_value_per_byte(self.pointer)
41
51
  end
42
52
 
53
+ # Set new box value
54
+ # @param box_value [BoxValue]
55
+ # @return [ErgoBoxCandidate] updated ErgoBoxCandidateBuilder (self)
43
56
  def set_value(box_value)
44
57
  ergo_lib_ergo_box_candidate_builder_set_value(self.pointer, box_value.pointer)
45
58
  self
46
59
  end
47
60
 
61
+ # Get box value
62
+ # @return [BoxValue]
48
63
  def get_value
49
64
  pointer = FFI::MemoryPointer.new(:pointer)
50
65
  ergo_lib_ergo_box_candidate_builder_value(self.pointer, pointer)
51
66
  Sigma::BoxValue.with_raw_pointer(pointer)
52
67
  end
53
68
 
69
+ # Calulate serialized box size (in bytes)
70
+ # @return [Integer]
54
71
  def calc_box_size_bytes
55
72
  res = ergo_lib_ergo_box_candidate_builder_calc_box_size_bytes(self.pointer)
56
73
  Util.check_error!(res[:error])
57
74
  res[:value]
58
75
  end
59
76
 
77
+ # Calculate minimal box value for the current box serialized size (in bytes)
78
+ # @return [BoxValue]
60
79
  def calc_min_box_value
61
80
  pointer = FFI::MemoryPointer.new(:pointer)
62
81
  error = ergo_lib_ergo_box_candidate_calc_min_box_value(self.pointer, pointer)
@@ -64,10 +83,18 @@ module Sigma
64
83
  Sigma::BoxValue.with_raw_pointer(pointer)
65
84
  end
66
85
 
86
+ # Set register (R4-R9) to the given value
87
+ # @param register_id [Integer]
88
+ # @param constant [Constant]
89
+ # @see REGISTER_ID_ENUM
67
90
  def set_register_value(register_id, constant)
68
91
  ergo_lib_ergo_box_candidate_builder_set_register_value(self.pointer, register_id, constant.pointer)
69
92
  end
70
93
 
94
+ # Gets register value or nil if empty
95
+ # @param register_id [Integer]
96
+ # @return [Constant, nil]
97
+ # @see REGISTER_ID_ENUM
71
98
  def get_register_value(register_id)
72
99
  pointer = FFI::MemoryPointer.new(:pointer)
73
100
  res = ergo_lib_ergo_box_candidate_builder_register_value(self.pointer, register_id, pointer)
@@ -79,11 +106,22 @@ module Sigma
79
106
  end
80
107
  end
81
108
 
109
+ # Delete register value (make register empty) for the given register id (R4-R9)
110
+ # @param register_id [Integer]
111
+ # @return [ErgoBoxCandidate] updated ErgoBoxCandidateBuilder (self)
112
+ # @see REGISTER_ID_ENUM
82
113
  def delete_register_value(register_id)
83
114
  ergo_lib_ergo_box_candidate_builder_delete_register_value(self.pointer, register_id)
84
115
  self
85
116
  end
86
117
 
118
+ # Mint token, as defined in EIP-004
119
+ # @param token: [Token]
120
+ # @param name: [String] Token name, will be encoded in R4
121
+ # @param description: [String] Token description, will be encoded in R5
122
+ # @param num_decimals: [Integer] Number of decimals, will be encoded in R6
123
+ # @return [ErgoBoxCandidateBuilder] updated ErgoBoxCandidateBuilder (self)
124
+ # @see https://github.com/ergoplatform/eips/blob/master/eip-0004.md EIP-004
87
125
  def mint_token(token:, name:, description:, num_decimals:)
88
126
  ergo_lib_ergo_box_candidate_builder_mint_token(
89
127
  self.pointer,
@@ -95,11 +133,17 @@ module Sigma
95
133
  self
96
134
  end
97
135
 
136
+ # Add given token_id and token_amount
137
+ # @param token_id [TokenId]
138
+ # @param token_amount [TokenAmount]
139
+ # @return [ErgoBoxCandidateBuilder] updated ErgoBoxCandidateBuilder (self)
98
140
  def add_token(token_id, token_amount)
99
141
  ergo_lib_ergo_box_candidate_builder_add_token(self.pointer, token_id.pointer, token_amount.pointer)
100
142
  self
101
143
  end
102
144
 
145
+ # Build the box candidate
146
+ # @return [ErgoBoxCandidate]
103
147
  def build
104
148
  pointer = FFI::MemoryPointer.new(:pointer)
105
149
  error = ergo_lib_ergo_box_candidate_builder_build(self.pointer, pointer)
@@ -3,6 +3,7 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # Blockchain state (last headers, etc)
6
7
  class ErgoStateContext
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -13,6 +14,10 @@ module Sigma
13
14
 
14
15
  attr_accessor :pointer
15
16
 
17
+ # Createa new context
18
+ # @param pre_header [PreHeader]
19
+ # @param headers [Headers]
20
+ # @return [ErgoStateContext]
16
21
  def self.create(pre_header:, headers:)
17
22
  pointer = FFI::MemoryPointer.new(:pointer)
18
23
  error = ergo_lib_ergo_state_context_new(pre_header.pointer, headers.pointer, pointer)
@@ -20,6 +25,9 @@ module Sigma
20
25
  init(pointer)
21
26
  end
22
27
 
28
+ # Equality check
29
+ # @param esc_two [ErgoStateContext]
30
+ # @return [bool]
23
31
  def ==(esc_two)
24
32
  ergo_lib_ergo_state_context_eq(self.pointer, esc.pointer)
25
33
  end
@@ -3,12 +3,14 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # The root of ErgoScript IR. Serialized instances of this class are self sufficient and can be passed around.
6
7
  class ErgoTree
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
9
10
  typedef :pointer, :error_pointer
10
11
  attach_function :ergo_lib_ergo_tree_delete, [:pointer], :void
11
12
  attach_function :ergo_lib_ergo_tree_eq, [:pointer, :pointer], :bool
13
+ attach_function :ergo_lib_ergo_tree_from_bytes, [:pointer, :uint, :pointer], :error_pointer
12
14
  attach_function :ergo_lib_ergo_tree_from_base16_bytes, [:pointer, :pointer], :error_pointer
13
15
  attach_function :ergo_lib_ergo_tree_to_base16_bytes, [:pointer, :pointer], :error_pointer
14
16
  attach_function :ergo_lib_ergo_tree_to_bytes, [:pointer, :pointer], :error_pointer
@@ -20,10 +22,29 @@ module Sigma
20
22
  attach_function :ergo_lib_ergo_tree_get_constant, [:pointer, :uint8, :pointer], ReturnOption.by_value
21
23
  attr_accessor :pointer
22
24
 
25
+ # Takes ownership of an existing ErgoTree Pointer.
26
+ # @note A user of sigma_rb generally does not need to call this function
27
+ # @param pointer [FFI::MemoryPointer]
28
+ # @return [ErgoTree]
23
29
  def self.with_raw_pointer(unread_pointer)
24
30
  init(unread_pointer)
25
31
  end
26
32
 
33
+ # Decode from encoded serialized ErgoTree
34
+ # @param bytes [Array<uint8>] Array of unsigned 8-bit integers (0-255)
35
+ # @return [ErgoTree]
36
+ def self.from_bytes(bytes)
37
+ pointer = FFI::MemoryPointer.new(:pointer)
38
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
39
+ b_ptr.write_array_of_uint8(bytes)
40
+ error = ergo_lib_ergo_tree_from_bytes(b_ptr, bytes.size, pointer)
41
+ Util.check_error!(error)
42
+ init(pointer)
43
+ end
44
+
45
+ # Decode from a base16 encoded serialized ErgoTree
46
+ # @param encoded_str [String]
47
+ # @return [ErgoTree]
27
48
  def self.from_base16_encoded_string(encoded_str)
28
49
  pointer = FFI::MemoryPointer.new(:pointer)
29
50
  error = ergo_lib_ergo_tree_from_base16_bytes(encoded_str, pointer)
@@ -32,6 +53,8 @@ module Sigma
32
53
  init(pointer)
33
54
  end
34
55
 
56
+ # Convert to base16 encoded serialized bytes
57
+ # @return [String]
35
58
  def to_base16_encoded_string
36
59
  s_ptr = FFI::MemoryPointer.new(:pointer, 1)
37
60
  error = ergo_lib_ergo_tree_to_base16_bytes(self.pointer, s_ptr)
@@ -42,6 +65,8 @@ module Sigma
42
65
  str
43
66
  end
44
67
 
68
+ # Convert to serialized bytes
69
+ # @return [Array<uint8>] Array of 8-bit integers (0-255)
45
70
  def to_bytes
46
71
  res = ergo_lib_ergo_tree_bytes_len(self.pointer)
47
72
  Util.check_error!(res[:error])
@@ -52,6 +77,8 @@ module Sigma
52
77
  bytes_ptr.read_array_of_uint8(bytes_length)
53
78
  end
54
79
 
80
+ # Serialized proposition expression of SigmaProp type with ConstantPlaceholder nodes instead of Constant nodes.
81
+ # @return [Array<uint8>] Array of 8-bit integers (0-255)
55
82
  def to_template_bytes
56
83
  res = ergo_lib_ergo_tree_template_bytes_len(self.pointer)
57
84
  Util.check_error!(res[:error])
@@ -62,12 +89,17 @@ module Sigma
62
89
  bytes_ptr.read_array_of_uint8(bytes_length)
63
90
  end
64
91
 
92
+ # Returns the number of constants stored in the serialized ``ErgoTree`` or throws error if the parsing of constants failed
93
+ # @return [Integer]
65
94
  def constants_length
66
95
  res = ergo_lib_ergo_tree_constants_len(self.pointer)
67
96
  Util.check_error!(res[:error])
68
97
  res[:value]
69
98
  end
70
99
 
100
+ # Return constant with given index (as stored in serialized ErgoTree) if it exists. Throws if constant parsing failed. Returns nil if no constant exists at given index
101
+ # @param index [Integer]
102
+ # @return [Constant, nil]
71
103
  def get_constant(index)
72
104
  pointer = FFI::MemoryPointer.new(:pointer)
73
105
  res = ergo_lib_ergo_tree_get_constant(self.pointer, index, pointer)
@@ -79,6 +111,10 @@ module Sigma
79
111
  end
80
112
  end
81
113
 
114
+ # Replace the constant of the ``ErgoTree`` with the given `constant` at position `index`. Throws if no constant exists at `index`.
115
+ # @param index: [Integer]
116
+ # @param constant: [Constant]
117
+ # @return [ErgoTree] ErgoTree with constant replaced (updates self)
82
118
  def replace_constant(index:, constant:)
83
119
  pointer = FFI::MemoryPointer.new(:pointer)
84
120
  error = ergo_lib_ergo_tree_with_constant(self.pointer, index, constant.pointer, pointer)
@@ -89,6 +125,8 @@ module Sigma
89
125
  self.class.init(pointer, obj: self)
90
126
  end
91
127
 
128
+ # Equality check
129
+ # @param ergo_tree_two [ErgoTree]
92
130
  def ==(ergo_tree_two)
93
131
  ergo_lib_ergo_tree_eq(self.pointer, ergo_tree_two.pointer)
94
132
  end
@@ -105,7 +143,5 @@ module Sigma
105
143
  )
106
144
  obj
107
145
  end
108
-
109
-
110
146
  end
111
147
  end
data/lib/sigma/input.rb CHANGED
@@ -3,6 +3,7 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # Signed inputs used in signed transactions
6
7
  class Input
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -12,16 +13,24 @@ module Sigma
12
13
  attach_function :ergo_lib_input_box_id, [:pointer, :pointer], :void
13
14
  attach_function :ergo_lib_input_spending_proof, [:pointer, :pointer], :void
14
15
 
16
+ # Takes ownership of an existing Input Pointer.
17
+ # @note A user of sigma_rb generally does not need to call this function
18
+ # @param pointer [FFI::MemoryPointer]
19
+ # @return [Input]
15
20
  def self.with_raw_pointer(pointer)
16
21
  init(pointer)
17
22
  end
18
23
 
24
+ # Get box id
25
+ # @return [BoxId]
19
26
  def get_box_id
20
27
  pointer = FFI::MemoryPointer.new(:pointer)
21
28
  ergo_lib_input_box_id(self.pointer, pointer)
22
29
  Sigma::BoxId.with_raw_pointer(pointer)
23
30
  end
24
31
 
32
+ # Get spending proof
33
+ # @return [ProverResult]
25
34
  def get_spending_proof
26
35
  pointer = FFI::MemoryPointer.new(:pointer)
27
36
  ergo_lib_input_spending_proof(self.pointer, pointer)
@@ -42,6 +51,7 @@ module Sigma
42
51
  end
43
52
  end
44
53
 
54
+ # An ordered collectino of Input
45
55
  class Inputs
46
56
  extend FFI::Library
47
57
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -54,10 +64,16 @@ module Sigma
54
64
 
55
65
  attr_accessor :pointer
56
66
 
67
+ # Takes ownership of an existing Inputs Pointer.
68
+ # @note A user of sigma_rb generally does not need to call this function
69
+ # @param pointer [FFI::MemoryPointer]
70
+ # @return [Inputs]
57
71
  def self.with_raw_pointer(unread_pointer)
58
72
  init(unread_pointer)
59
73
  end
60
74
 
75
+ # Create an empty collection
76
+ # @return [Inputs]
61
77
  def self.create
62
78
  pointer = FFI::MemoryPointer.new(:pointer)
63
79
  ergo_lib_inputs_new(pointer)
@@ -65,14 +81,21 @@ module Sigma
65
81
  init(pointer)
66
82
  end
67
83
 
84
+ # Get length of collection
85
+ # @return [Integer]
68
86
  def len
69
87
  ergo_lib_inputs_len(self.pointer)
70
88
  end
71
89
 
90
+ # Add to collection
91
+ # @param input [Input]
72
92
  def add(input)
73
93
  ergo_lib_inputs_add(input.pointer, self.pointer)
74
94
  end
75
95
 
96
+ # Get item at specified index or return nil if no item exists
97
+ # @params index [Integer]
98
+ # @return [Input, nil]
76
99
  def get(index)
77
100
  pointer = FFI::MemoryPointer.new(:pointer)
78
101
  res = ergo_lib_inputs_get(self.pointer, index, pointer)
@@ -98,6 +121,7 @@ module Sigma
98
121
  end
99
122
  end
100
123
 
124
+ # Proof of correctness for transaction spending
101
125
  class ProverResult
102
126
  extend FFI::Library
103
127
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -109,6 +133,8 @@ module Sigma
109
133
  attach_function :ergo_lib_prover_result_proof_len, [:pointer], :uint
110
134
  attr_accessor :pointer
111
135
 
136
+ # Get proof bytes
137
+ # @return [Array<uint8>] Array of 8-bit integers [0-255]
112
138
  def to_bytes
113
139
  proof_len = ergo_lib_prover_result_proof_len(self.pointer)
114
140
  b_ptr = FFI::MemoryPointer.new(:uint8, proof_len)
@@ -116,12 +142,16 @@ module Sigma
116
142
  b_ptr.get_array_of_uint8(0, proof_len)
117
143
  end
118
144
 
145
+ # Get context extension
146
+ # @return [ContextExtension]
119
147
  def get_context_extension
120
148
  pointer = FFI::MemoryPointer.new(:pointer)
121
149
  ergo_lib_prover_result_context_extension(self.pointer, pointer)
122
150
  Sigma::ContextExtension.with_raw_pointer(pointer)
123
151
  end
124
152
 
153
+ # JSON representation as text (compatible with Ergo Node/Explorer API, numbers are encoded as numbers)
154
+ # @return [String]
125
155
  def to_json
126
156
  s_ptr = FFI::MemoryPointer.new(:pointer, 1)
127
157
  error = ergo_lib_prover_result_to_json(self.pointer, s_ptr)
@@ -132,6 +162,10 @@ module Sigma
132
162
  str
133
163
  end
134
164
 
165
+ # Takes ownership of an existing ProverResult Pointer.
166
+ # @note A user of sigma_rb generally does not need to call this function
167
+ # @param pointer [FFI::MemoryPointer]
168
+ # @return [ProverResult]
135
169
  def self.with_raw_pointer(pointer)
136
170
  init(pointer)
137
171
  end
@@ -148,9 +182,9 @@ module Sigma
148
182
  )
149
183
  obj
150
184
  end
151
-
152
185
  end
153
186
 
187
+ # Unsigned inputs used in constructing unsigned transactions
154
188
  class UnsignedInput
155
189
  extend FFI::Library
156
190
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -161,16 +195,24 @@ module Sigma
161
195
 
162
196
  attr_accessor :pointer
163
197
 
198
+ # Takes ownership of an existing UnsignedInput Pointer.
199
+ # @note A user of sigma_rb generally does not need to call this function
200
+ # @param pointer [FFI::MemoryPointer]
201
+ # @return [UnsignedInput]
164
202
  def self.with_raw_pointer(pointer)
165
203
  init(pointer)
166
204
  end
167
205
 
206
+ # Get box id
207
+ # @return [BoxId]
168
208
  def get_box_id
169
209
  pointer = FFI::MemoryPointer.new(:pointer)
170
210
  ergo_lib_unsigned_input_box_id(self.pointer, pointer)
171
211
  Sigma::BoxId.with_raw_pointer(pointer)
172
212
  end
173
213
 
214
+ # Get context extension
215
+ # @return [ContextExension]
174
216
  def get_context_extension
175
217
  pointer = FFI::MemoryPointer.new(:pointer)
176
218
  ergo_lib_unsigned_input_context_extension(self.pointer, pointer)
@@ -191,6 +233,7 @@ module Sigma
191
233
  end
192
234
  end
193
235
 
236
+ # An ordered collection of UnsignedInput
194
237
  class UnsignedInputs
195
238
  extend FFI::Library
196
239
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -203,10 +246,16 @@ module Sigma
203
246
 
204
247
  attr_accessor :pointer
205
248
 
249
+ # Takes ownership of an existing UnsignedInputs Pointer.
250
+ # @note A user of sigma_rb generally does not need to call this function
251
+ # @param pointer [FFI::MemoryPointer]
252
+ # @return [UnsignedInputs]
206
253
  def self.with_raw_pointer(unread_pointer)
207
254
  init(unread_pointer)
208
255
  end
209
256
 
257
+ # Create an empty collection
258
+ # @return [UnsignedInputs]
210
259
  def self.create
211
260
  pointer = FFI::MemoryPointer.new(:pointer)
212
261
  ergo_lib_unsigned_inputs_new(pointer)
@@ -214,14 +263,21 @@ module Sigma
214
263
  init(pointer)
215
264
  end
216
265
 
266
+ # Get length of collection
267
+ # @return [Integer]
217
268
  def len
218
269
  ergo_lib_unsigned_inputs_len(self.pointer)
219
270
  end
220
271
 
272
+ # Add to collection
273
+ # @param unsigned_input [UnsignedInput]
221
274
  def add(unsigned_input)
222
275
  ergo_lib_unsigned_inputs_add(unsigned_input.pointer, self.pointer)
223
276
  end
224
277
 
278
+ # Get item at specified index or return nil if no item exists
279
+ # @params index [Integer]
280
+ # @return [UnsignedInput, nil]
225
281
  def get(index)
226
282
  pointer = FFI::MemoryPointer.new(:pointer)
227
283
  res = ergo_lib_unsigned_inputs_get(self.pointer, index, pointer)
@@ -31,6 +31,10 @@ module Sigma
31
31
  init(pointer)
32
32
  end
33
33
 
34
+ # Adds a new node and it's hash to the MerkleProof. Hash must be 32 bytes in size
35
+ # @param hash: [Array<uint8, 32>]
36
+ # @param side: [Integer]
37
+ # @see NODE_SIDE_ENUM
34
38
  def add_node(hash:, side:)
35
39
  b_ptr = FFI::MemoryPointer.new(:uint8, hash.size)
36
40
  b_ptr.write_array_of_uint8(hash)
@@ -38,7 +42,9 @@ module Sigma
38
42
  Util.check_error!(error)
39
43
  end
40
44
 
41
- # Hash can be an Array(Uint8) or String
45
+ # Validates the MerkleProof against the provided root hash
46
+ # @param hash [Array<uint8>, String]
47
+ # @return [bool]
42
48
  def valid(hash)
43
49
  if hash.is_a?(Array)
44
50
  valid_with_array(hash)
data/lib/sigma/nipopow.rb CHANGED
@@ -14,6 +14,9 @@ module Sigma
14
14
 
15
15
  attr_accessor :pointer
16
16
 
17
+ # Parse NiPoPow from json
18
+ # @param json [String]
19
+ # @return [NipopowProof]
17
20
  def self.with_json(json)
18
21
  pointer = FFI::MemoryPointer.new(:pointer)
19
22
  error = ergo_lib_nipopow_proof_from_json(json, pointer)
@@ -21,6 +24,9 @@ module Sigma
21
24
  init(pointer)
22
25
  end
23
26
 
27
+ # Implementation of the ≥ algorithm from [`KMZ17`], see Algorithm 4
28
+ # @return [bool]
29
+ # @see https://fc20.ifca.ai/preproceedings/74.pdf KMZ17
24
30
  def is_better_than(other_proof)
25
31
  pointer = FFI::MemoryPointer.new(:pointer)
26
32
  res = ergo_lib_nipopow_proof_is_better_than(self.pointer, other_proof.pointer)
@@ -28,6 +34,8 @@ module Sigma
28
34
  res[:value]
29
35
  end
30
36
 
37
+ # JSON representation
38
+ # @return [String]
31
39
  def to_json
32
40
  s_ptr = FFI::MemoryPointer.new(:pointer, 1)
33
41
  error = ergo_lib_nipopow_proof_to_json(self.pointer, s_ptr)
@@ -52,6 +60,8 @@ module Sigma
52
60
  end
53
61
  end
54
62
 
63
+ # A verifier for PoPoW proofs. During its lifetime, it processes many proofs with the aim of
64
+ # deducing at any given point what is the best (sub)chain rooted at the specified genesis.
55
65
  class NipopowVerifier
56
66
  extend FFI::Library
57
67
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -62,18 +72,25 @@ module Sigma
62
72
  attach_function :ergo_lib_nipopow_verifier_process, [:pointer,:pointer], :error_pointer
63
73
  attr_accessor :pointer
64
74
 
75
+ # Create new instance
76
+ # @param genesis_block_id [BlockId]
77
+ # @return [NipopowVerifier]
65
78
  def self.create(genesis_block_id)
66
79
  pointer = FFI::MemoryPointer.new(:pointer)
67
80
  ergo_lib_nipopow_verifier_new(genesis_block_id.pointer, pointer)
68
81
  init(pointer)
69
82
  end
70
83
 
84
+ # Returns chain of `BlockHeader`s from the best proof.
85
+ # @return [BlockHeaders]
71
86
  def best_chain
72
87
  pointer = FFI::MemoryPointer.new(:pointer)
73
88
  ergo_lib_nipopow_verifier_best_chain(self.pointer, pointer)
74
89
  BlockHeaders.with_raw_pointer(pointer)
75
90
  end
76
91
 
92
+ # Process given proof
93
+ # @param proof [NipopowProof]
77
94
  def process(proof)
78
95
  error = ergo_lib_nipopow_verifier_process(self.pointer, proof.pointer)
79
96
  Util.check_error!(error)
@@ -104,6 +121,9 @@ module Sigma
104
121
  attach_function :ergo_lib_po_pow_header_eq, [:pointer, :pointer], :bool
105
122
  attr_accessor :pointer
106
123
 
124
+ # Create from json
125
+ # @param json [String]
126
+ # @return [PoPowHeader]
107
127
  def self.with_json(json)
108
128
  pointer = FFI::MemoryPointer.new(:pointer)
109
129
  error = ergo_lib_popow_header_from_json(json, pointer)
@@ -111,6 +131,8 @@ module Sigma
111
131
  init(pointer)
112
132
  end
113
133
 
134
+ # JSON representation
135
+ # @return [String]
114
136
  def to_json
115
137
  s_ptr = FFI::MemoryPointer.new(:pointer, 1)
116
138
  error = ergo_lib_popow_header_to_json(self.pointer, s_ptr)
@@ -121,6 +143,8 @@ module Sigma
121
143
  str
122
144
  end
123
145
 
146
+ # Get header
147
+ # @return [BlockHeader]
124
148
  def get_header
125
149
  pointer = FFI::MemoryPointer.new(:pointer)
126
150
  error = ergo_lib_popow_header_get_header(self.pointer, pointer)
@@ -128,6 +152,8 @@ module Sigma
128
152
  BlockHeader.with_raw_pointer(pointer)
129
153
  end
130
154
 
155
+ # Get interlinks
156
+ # @return [BlockIds]
131
157
  def get_interlinks
132
158
  pointer = FFI::MemoryPointer.new(:pointer)
133
159
  error = ergo_lib_popow_header_get_interlinks(self.pointer, pointer)
@@ -135,6 +161,9 @@ module Sigma
135
161
  BlockIds.with_raw_pointer(pointer)
136
162
  end
137
163
 
164
+ # Equality check
165
+ # @param other_header [PoPowHeader]
166
+ # @return [bool]
138
167
  def ==(other_header)
139
168
  ergo_lib_po_pow_header_eq(self.pointer, other_header.pointer)
140
169
  end
@@ -3,6 +3,7 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # Block header with the current `spendingTransaction`, that can be predicted by a miner before its formation
6
7
  class PreHeader
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -12,12 +13,18 @@ module Sigma
12
13
  attach_function :ergo_lib_pre_header_eq, [:pointer, :pointer], :bool
13
14
  attr_accessor :pointer
14
15
 
16
+ # Create using data from block_header
17
+ # @param block_header [BlockHeader]
18
+ # @return [PreHeader]
15
19
  def self.with_block_header(block_header)
16
20
  pointer = FFI::MemoryPointer.new(:pointer)
17
21
  ergo_lib_preheader_from_block_header(block_header.pointer, pointer)
18
22
  init(pointer)
19
23
  end
20
24
 
25
+ # Equality check
26
+ # @param ph_two [PreHeader]
27
+ # @return [bool]
21
28
  def ==(ph_two)
22
29
  ergo_lib_pre_header_eq(self.pointer, ph_two.pointer)
23
30
  end
@@ -3,6 +3,13 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # Represent `reduced` transaction, i.e. unsigned transaction where each unsigned input
7
+ # is augmented with ReducedInput which contains a script reduction result.
8
+ # After an unsigned transaction is reduced it can be signed without context.
9
+ # Thus, it can be serialized and transferred for example to Cold Wallet and signed
10
+ # in an environment where secrets are known.
11
+ # see EIP-19 for more details
12
+ # @see https://github.com/ergoplatform/eips/blob/f280890a4163f2f2e988a0091c078e36912fc531/eip-0019.md EIP-19
6
13
  class ReducedTransaction
7
14
  extend FFI::Library
8
15
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -12,6 +19,13 @@ module Sigma
12
19
  attach_function :ergo_lib_reduced_tx_unsigned_tx, [:pointer, :pointer], :void
13
20
  attr_accessor :pointer
14
21
 
22
+ # Create `reduced` transaction, i.e. unsigned transaction where each unsigned input
23
+ # is augmented with ReducedInput which contains a script reduction result.
24
+ # @param unsigned_tx: [UnsignedTransaction]
25
+ # @param boxes_to_spend: [ErgoBoxes]
26
+ # @param data_boxes: [ErgoBoxes]
27
+ # @param state_context: [ErgoStateContext]
28
+ # @return [ReducedTransaction]
15
29
  def self.from_unsigned_tx(unsigned_tx:, boxes_to_spend:, data_boxes:, state_context:)
16
30
  pointer = FFI::MemoryPointer.new(:pointer)
17
31
  error = ergo_lib_reduced_tx_from_unsigned_tx(
@@ -25,10 +39,16 @@ module Sigma
25
39
  init(pointer)
26
40
  end
27
41
 
42
+ # Takes ownership of an existing ReducedTransaction Pointer.
43
+ # @note A user of sigma_rb generally does not need to call this function
44
+ # @param pointer [FFI::MemoryPointer]
45
+ # @return [ReducedTransaction]
28
46
  def self.with_raw_pointer(pointer)
29
47
  init(pointer)
30
48
  end
31
49
 
50
+ # Get unsigned transaction
51
+ # @return [UnsignedTransaction]
32
52
  def get_unsigned_transaction
33
53
  pointer = FFI::MemoryPointer.new(:pointer)
34
54
  ergo_lib_reduced_tx_unsigned_tx(self.pointer, pointer)
@@ -49,6 +69,7 @@ module Sigma
49
69
  end
50
70
  end
51
71
 
72
+ # Propositions list (public keys)
52
73
  class Propositions
53
74
  extend FFI::Library
54
75
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -58,12 +79,16 @@ module Sigma
58
79
  attach_function :ergo_lib_propositions_add_proposition_from_bytes, [:pointer, :pointer, :uint], :error_pointer
59
80
  attr_accessor :pointer
60
81
 
82
+ # Create an empty collection
83
+ # @return [Propositions]
61
84
  def self.create
62
85
  pointer = FFI::MemoryPointer.new(:pointer)
63
86
  ergo_lib_propositions_new(pointer)
64
87
  init(pointer)
65
88
  end
66
89
 
90
+ # Add a proposition
91
+ # @param bytes [Array<uint8>] Array of 8-bit integers (0-255)
67
92
  def add_proposition(bytes)
68
93
  b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
69
94
  b_ptr.write_array_of_uint8(bytes)