sigma_rb 0.1.3 → 0.2.0
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 +4 -4
- data/README.md +68 -6
- data/lib/sigma/address.rb +64 -2
- data/lib/sigma/block_header.rb +49 -1
- data/lib/sigma/box_selection.rb +29 -0
- data/lib/sigma/byte_array.rb +22 -0
- data/lib/sigma/constant.rb +43 -14
- data/lib/sigma/context_extension.rb +10 -0
- data/lib/sigma/contract.rb +21 -2
- data/lib/sigma/data_input.rb +24 -0
- data/lib/sigma/enums.rb +8 -0
- data/lib/sigma/ergo_box.rb +175 -2
- data/lib/sigma/ergo_box_candidate_builder.rb +45 -1
- data/lib/sigma/ergo_state_context.rb +8 -0
- data/lib/sigma/ergo_tree.rb +38 -2
- data/lib/sigma/input.rb +57 -1
- data/lib/sigma/merkle_proof.rb +7 -1
- data/lib/sigma/nipopow.rb +29 -0
- data/lib/sigma/pre_header.rb +7 -0
- data/lib/sigma/reduced_transaction.rb +25 -0
- data/lib/sigma/secret_key.rb +29 -1
- data/lib/sigma/structs.rb +10 -0
- data/lib/sigma/token.rb +61 -1
- data/lib/sigma/transaction.rb +105 -0
- data/lib/sigma/tx_builder.rb +32 -0
- data/lib/sigma/wallet.rb +39 -0
- data/lib/sigma.rb +1 -1
- data/sigma.gemspec +3 -2
- data/tests/sigma/ergo_tree_test.rb +3 -1
- data/tests/sigma/merkle_proof_test.rb +1 -1
- data/tests/sigma/nipopow_test.rb +1 -0
- data/tests/sigma/token_test.rb +6 -4
- data/tests/test_seeds.rb +1 -0
- metadata +16 -2
data/lib/sigma/secret_key.rb
CHANGED
@@ -3,6 +3,7 @@ require_relative './util.rb'
|
|
3
3
|
require 'ffi-compiler/loader'
|
4
4
|
|
5
5
|
module Sigma
|
6
|
+
# Secret key for the prover
|
6
7
|
class SecretKey
|
7
8
|
extend FFI::Library
|
8
9
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -15,12 +16,17 @@ module Sigma
|
|
15
16
|
|
16
17
|
attr_accessor :pointer
|
17
18
|
|
19
|
+
# Generate random key
|
20
|
+
# @return [SecretKey]
|
18
21
|
def self.create
|
19
22
|
pointer = FFI::MemoryPointer.new(:pointer)
|
20
23
|
ergo_lib_secret_key_generate_random(pointer)
|
21
24
|
init(pointer)
|
22
25
|
end
|
23
26
|
|
27
|
+
# Parse dlog secret key from bytes (SEC-1-encoded scalar)
|
28
|
+
# @param bytes [Array<uint8>] Array of 8-bit integers (0-255)
|
29
|
+
# @return [SecretKey]
|
24
30
|
def self.from_bytes(bytes)
|
25
31
|
pointer = FFI::MemoryPointer.new(:pointer)
|
26
32
|
b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
|
@@ -30,16 +36,24 @@ module Sigma
|
|
30
36
|
init(pointer)
|
31
37
|
end
|
32
38
|
|
39
|
+
# Takes ownership of an existing SecretKey Pointer.
|
40
|
+
# @note A user of sigma_rb generally does not need to call this function
|
41
|
+
# @param pointer [FFI::MemoryPointer]
|
42
|
+
# @return [SecretKey]
|
33
43
|
def self.with_raw_pointer(pointer)
|
34
44
|
init(pointer)
|
35
45
|
end
|
36
46
|
|
47
|
+
# Get address (encoded public image)
|
48
|
+
# @return [Address]
|
37
49
|
def get_address
|
38
50
|
pointer = FFI::MemoryPointer.new(:pointer)
|
39
51
|
ergo_lib_secret_key_get_address(self.pointer, pointer)
|
40
52
|
Sigma::Address.with_raw_pointer(pointer)
|
41
53
|
end
|
42
|
-
|
54
|
+
|
55
|
+
# Encode to bytes
|
56
|
+
# @return [Array<uint8>] Array of 8-bit integers (0-255)
|
43
57
|
def to_bytes
|
44
58
|
bytes_len = 32
|
45
59
|
b_ptr = FFI::MemoryPointer.new(:uint8, bytes_len)
|
@@ -61,6 +75,7 @@ module Sigma
|
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
78
|
+
# An ordered collection of SecretKey
|
64
79
|
class SecretKeys
|
65
80
|
extend FFI::Library
|
66
81
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -73,10 +88,16 @@ module Sigma
|
|
73
88
|
|
74
89
|
attr_accessor :pointer
|
75
90
|
|
91
|
+
# Takes ownership of an existing SecretKeys Pointer.
|
92
|
+
# @note A user of sigma_rb generally does not need to call this function
|
93
|
+
# @param pointer [FFI::MemoryPointer]
|
94
|
+
# @return [SecretKeys]
|
76
95
|
def self.with_raw_pointer(unread_pointer)
|
77
96
|
init(unread_pointer)
|
78
97
|
end
|
79
98
|
|
99
|
+
# Create an empty collection
|
100
|
+
# @return [SecretKeys]
|
80
101
|
def self.create
|
81
102
|
pointer = FFI::MemoryPointer.new(:pointer)
|
82
103
|
ergo_lib_secret_keys_new(pointer)
|
@@ -84,14 +105,21 @@ module Sigma
|
|
84
105
|
init(pointer)
|
85
106
|
end
|
86
107
|
|
108
|
+
# Get length of collection
|
109
|
+
# @return [Integer]
|
87
110
|
def len
|
88
111
|
ergo_lib_secret_keys_len(self.pointer)
|
89
112
|
end
|
90
113
|
|
114
|
+
# Add to collection
|
115
|
+
# @param secret_key [SecretKey]
|
91
116
|
def add(secret_key)
|
92
117
|
ergo_lib_secret_keys_add(secret_key.pointer, self.pointer)
|
93
118
|
end
|
94
119
|
|
120
|
+
# Get item at specified index or return nil if no item exists
|
121
|
+
# @param index [Integer]
|
122
|
+
# @return [SecretKey, nil]
|
95
123
|
def get(index)
|
96
124
|
pointer = FFI::MemoryPointer.new(:pointer)
|
97
125
|
res = ergo_lib_secret_keys_get(self.pointer, index, pointer)
|
data/lib/sigma/structs.rb
CHANGED
@@ -4,26 +4,36 @@ module Sigma
|
|
4
4
|
extend FFI::Library
|
5
5
|
typedef :pointer, :error_pointer
|
6
6
|
|
7
|
+
# Internal FFI Struct
|
8
|
+
# @see https://github.com/ffi/ffi/wiki/Examples#-structs FFI Struct Documentation
|
7
9
|
class ReturnOption < FFI::Struct
|
8
10
|
layout :is_some, :bool,
|
9
11
|
:error, :error_pointer
|
10
12
|
end
|
11
13
|
|
14
|
+
# Internal FFI Struct
|
15
|
+
# @see https://github.com/ffi/ffi/wiki/Examples#-structs FFI Struct Documentation
|
12
16
|
class ReturnNumUsize < FFI::Struct
|
13
17
|
layout :value, :uint,
|
14
18
|
:error, :error_pointer
|
15
19
|
end
|
16
20
|
|
21
|
+
# Internal FFI Struct
|
22
|
+
# @see https://github.com/ffi/ffi/wiki/Examples#-structs FFI Struct Documentation
|
17
23
|
class ReturnNumI32 < FFI::Struct
|
18
24
|
layout :value, :int32,
|
19
25
|
:error, :error_pointer
|
20
26
|
end
|
21
27
|
|
28
|
+
# Internal FFI Struct
|
29
|
+
# @see https://github.com/ffi/ffi/wiki/Examples#-structs FFI Struct Documentation
|
22
30
|
class ReturnNumI64 < FFI::Struct
|
23
31
|
layout :value, :int64,
|
24
32
|
:error, :error_pointer
|
25
33
|
end
|
26
34
|
|
35
|
+
# Internal FFI Struct
|
36
|
+
# @see https://github.com/ffi/ffi/wiki/Examples#-structs FFI Struct Documentation
|
27
37
|
class ReturnBool < FFI::Struct
|
28
38
|
layout :value, :bool,
|
29
39
|
:error, :error_pointer
|
data/lib/sigma/token.rb
CHANGED
@@ -13,10 +13,17 @@ module Sigma
|
|
13
13
|
attach_function :ergo_lib_token_amount_eq, [:pointer, :pointer], :bool
|
14
14
|
attr_accessor :pointer
|
15
15
|
|
16
|
+
# Takes ownership of an existing TokenAmount Pointer.
|
17
|
+
# @note A user of sigma_rb generally does not need to call this function
|
18
|
+
# @param pointer [FFI::MemoryPointer]
|
19
|
+
# @return [TokenAmount]
|
16
20
|
def self.with_raw_pointer(unread_pointer)
|
17
21
|
init(unread_pointer)
|
18
22
|
end
|
19
23
|
|
24
|
+
# Create instance from 64-bit Integer with bounds check
|
25
|
+
# @param int [Integer]
|
26
|
+
# @return [TokenAmount]
|
20
27
|
def self.with_i64(int)
|
21
28
|
ptr = FFI::MemoryPointer.new(:pointer)
|
22
29
|
error = ergo_lib_token_amount_from_i64(int, ptr)
|
@@ -25,10 +32,15 @@ module Sigma
|
|
25
32
|
init(ptr)
|
26
33
|
end
|
27
34
|
|
35
|
+
# Get value as 64-bit integer
|
36
|
+
# @return [Integer]
|
28
37
|
def to_i
|
29
38
|
ergo_lib_token_amount_as_i64(self.pointer)
|
30
39
|
end
|
31
40
|
|
41
|
+
# Equality check
|
42
|
+
# @param token_amount_two [TokenAmount]
|
43
|
+
# @return [bool]
|
32
44
|
def ==(token_amount_two)
|
33
45
|
ergo_lib_token_amount_eq(self.pointer, token_amount_two.pointer)
|
34
46
|
end
|
@@ -47,6 +59,7 @@ module Sigma
|
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
62
|
+
# Token id (32-byte digest)
|
50
63
|
class TokenId
|
51
64
|
extend FFI::Library
|
52
65
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -58,10 +71,17 @@ module Sigma
|
|
58
71
|
attach_function :ergo_lib_token_id_to_str, [:pointer, :pointer], :void
|
59
72
|
attr_accessor :pointer
|
60
73
|
|
74
|
+
# Takes ownership of an existing TokenId Pointer.
|
75
|
+
# @note A user of sigma_rb generally does not need to call this function
|
76
|
+
# @param pointer [FFI::MemoryPointer]
|
77
|
+
# @return [TokenId]
|
61
78
|
def self.with_raw_pointer(tid_pointer)
|
62
79
|
init(tid_pointer)
|
63
80
|
end
|
64
81
|
|
82
|
+
# Create token id from ergo box id (32 byte digest)
|
83
|
+
# @param box_id [BoxId]
|
84
|
+
# @return [TokenId]
|
65
85
|
def self.with_box_id(box_id)
|
66
86
|
tid_ptr = FFI::MemoryPointer.new(:pointer)
|
67
87
|
ergo_lib_token_id_from_box_id(box_id.pointer, tid_ptr)
|
@@ -69,6 +89,9 @@ module Sigma
|
|
69
89
|
init(tid_ptr)
|
70
90
|
end
|
71
91
|
|
92
|
+
# Parse token id (32 byte digest) from base16-encoded string
|
93
|
+
# @param str [String]
|
94
|
+
# @return [TokenId]
|
72
95
|
def self.from_base16_encoded_string(str)
|
73
96
|
tid_ptr = FFI::MemoryPointer.new(:pointer)
|
74
97
|
error = ergo_lib_token_id_from_str(str, tid_ptr)
|
@@ -77,6 +100,8 @@ module Sigma
|
|
77
100
|
init(tid_ptr)
|
78
101
|
end
|
79
102
|
|
103
|
+
# Get base16 encoded string
|
104
|
+
# @return [String]
|
80
105
|
def to_base16_encoded_string
|
81
106
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
82
107
|
ergo_lib_token_id_to_str(self.pointer, s_ptr)
|
@@ -86,6 +111,9 @@ module Sigma
|
|
86
111
|
str
|
87
112
|
end
|
88
113
|
|
114
|
+
# Equality check
|
115
|
+
# @param token_id_two [TokenId]
|
116
|
+
# @return [bool]
|
89
117
|
def ==(token_id_two)
|
90
118
|
ergo_lib_token_id_eq(self.pointer, token_id_two.pointer)
|
91
119
|
end
|
@@ -104,6 +132,7 @@ module Sigma
|
|
104
132
|
end
|
105
133
|
end
|
106
134
|
|
135
|
+
# Token represented with token id paired with its amount
|
107
136
|
class Token
|
108
137
|
extend FFI::Library
|
109
138
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -116,6 +145,10 @@ module Sigma
|
|
116
145
|
attach_function :ergo_lib_token_eq, [:pointer, :pointer], :bool
|
117
146
|
attr_accessor :pointer
|
118
147
|
|
148
|
+
# Create a token with given id and amount
|
149
|
+
# @param token_id: [TokenId]
|
150
|
+
# @param token_amount: [TokenAmount]
|
151
|
+
# @return [Token]
|
119
152
|
def self.create(token_id:, token_amount:)
|
120
153
|
pointer = FFI::MemoryPointer.new(:pointer)
|
121
154
|
ergo_lib_token_new(token_id.pointer, token_amount.pointer, pointer)
|
@@ -123,22 +156,33 @@ module Sigma
|
|
123
156
|
init(pointer)
|
124
157
|
end
|
125
158
|
|
159
|
+
# Takes ownership of an existing Token Pointer.
|
160
|
+
# @note A user of sigma_rb generally does not need to call this function
|
161
|
+
# @param pointer [FFI::MemoryPointer]
|
162
|
+
# @return [Token]
|
126
163
|
def self.with_raw_pointer(pointer)
|
127
164
|
init(pointer)
|
128
165
|
end
|
129
166
|
|
167
|
+
# Get id
|
168
|
+
# @return [TokenId]
|
130
169
|
def get_id
|
131
170
|
pointer = FFI::MemoryPointer.new(:pointer)
|
132
171
|
ergo_lib_token_get_id(self.pointer, pointer)
|
133
172
|
Sigma::TokenId.with_raw_pointer(pointer)
|
134
173
|
end
|
135
174
|
|
175
|
+
# Get amount
|
176
|
+
# @return [TokenAmount]
|
136
177
|
def get_amount
|
137
178
|
pointer = FFI::MemoryPointer.new(:pointer)
|
138
179
|
ergo_lib_token_get_amount(self.pointer, pointer)
|
139
180
|
Sigma::TokenAmount.with_raw_pointer(pointer)
|
140
181
|
end
|
141
182
|
|
183
|
+
# JSON representation according to EIP-12
|
184
|
+
# @return [String]
|
185
|
+
# @see https://github.com/ergoplatform/eips/pull/23 EIP-12
|
142
186
|
def to_json_eip12
|
143
187
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
144
188
|
error = ergo_lib_token_to_json_eip12(self.pointer, s_ptr)
|
@@ -149,6 +193,9 @@ module Sigma
|
|
149
193
|
str
|
150
194
|
end
|
151
195
|
|
196
|
+
# Equality check
|
197
|
+
# @param token_two [Token]
|
198
|
+
# @return [bool]
|
152
199
|
def ==(token_two)
|
153
200
|
ergo_lib_token_eq(self.pointer, token_two.pointer)
|
154
201
|
end
|
@@ -167,6 +214,7 @@ module Sigma
|
|
167
214
|
end
|
168
215
|
end
|
169
216
|
|
217
|
+
# An ordered collection of Token
|
170
218
|
class Tokens
|
171
219
|
extend FFI::Library
|
172
220
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -178,20 +226,31 @@ module Sigma
|
|
178
226
|
attach_function :ergo_lib_tokens_add, [:pointer, :pointer], :error_pointer
|
179
227
|
attr_accessor :pointer
|
180
228
|
|
229
|
+
# Create an empty collection
|
230
|
+
# @return [Tokens]
|
181
231
|
def self.create
|
182
232
|
pointer = FFI::MemoryPointer.new(:pointer)
|
183
233
|
ergo_lib_tokens_new(pointer)
|
184
234
|
init(pointer)
|
185
235
|
end
|
186
236
|
|
237
|
+
# Takes ownership of an existing Tokens Pointer.
|
238
|
+
# @note A user of sigma_rb generally does not need to call this function
|
239
|
+
# @param pointer [FFI::MemoryPointer]
|
240
|
+
# @return [Tokens]
|
187
241
|
def self.with_raw_pointer(tokens_ptr)
|
188
242
|
init(tokens_ptr)
|
189
243
|
end
|
190
244
|
|
245
|
+
# Get length of collection
|
246
|
+
# @return [Integer]
|
191
247
|
def len
|
192
248
|
ergo_lib_tokens_len(self.pointer)
|
193
249
|
end
|
194
250
|
|
251
|
+
# Get item at specified index or return nil if no item exists
|
252
|
+
# @param index [Integer]
|
253
|
+
# @return [Tokens, nil]
|
195
254
|
def get(index)
|
196
255
|
token_pointer = FFI::MemoryPointer.new(:pointer)
|
197
256
|
res = ergo_lib_tokens_get(self.pointer, index, token_pointer)
|
@@ -203,6 +262,8 @@ module Sigma
|
|
203
262
|
end
|
204
263
|
end
|
205
264
|
|
265
|
+
# Add to collection. Max capacity of ErgoBox::MAX_TOKENS_COUNT tokens. Will throw error if adding more.
|
266
|
+
# @param token [Token]
|
206
267
|
def add(token)
|
207
268
|
error = ergo_lib_tokens_add(token.pointer, self.pointer)
|
208
269
|
Util.check_error!(error)
|
@@ -222,4 +283,3 @@ module Sigma
|
|
222
283
|
end
|
223
284
|
end
|
224
285
|
end
|
225
|
-
|
data/lib/sigma/transaction.rb
CHANGED
@@ -3,6 +3,15 @@ require_relative './util.rb'
|
|
3
3
|
require 'ffi-compiler/loader'
|
4
4
|
|
5
5
|
module Sigma
|
6
|
+
|
7
|
+
# ErgoTransaction is an atomic state transition operation. It destroys Boxes from the state
|
8
|
+
# and creates new ones. If transaction is spending boxes protected by some non-trivial scripts,
|
9
|
+
# its inputs should also contain proof of spending correctness - context extension (user-defined
|
10
|
+
# key-value map) and data inputs (links to existing boxes in the state) that may be used during
|
11
|
+
# script reduction to crypto, signatures that satisfies the remaining cryptographic protection
|
12
|
+
# of the script.
|
13
|
+
# Transactions are not encrypted, so it is possible to browse and view every transaction ever
|
14
|
+
# collected into a block.
|
6
15
|
class Transaction
|
7
16
|
extend FFI::Library
|
8
17
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -19,6 +28,11 @@ module Sigma
|
|
19
28
|
attach_function :ergo_lib_tx_to_json_eip12, [:pointer, :pointer], :error_pointer
|
20
29
|
attr_accessor :pointer
|
21
30
|
|
31
|
+
# Create ``Transaction`` from ``UnsignedTransaction`` and an array of proofs in the same order
|
32
|
+
# as `UnsignedTransaction.inputs` with empty proof indicated with empty byte array
|
33
|
+
# @param unsigned_tx: [UnsignedTransaction]
|
34
|
+
# @param proofs: [ByteArrays]
|
35
|
+
# @return [Transaction]
|
22
36
|
def self.create_from_unsigned_tx(unsigned_tx:, proofs:)
|
23
37
|
pointer = FFI::MemoryPointer.new(:pointer)
|
24
38
|
error = ergo_lib_tx_from_unsigned_tx(unsigned_tx.pointer, proofs.pointer, pointer)
|
@@ -26,6 +40,9 @@ module Sigma
|
|
26
40
|
init(pointer)
|
27
41
|
end
|
28
42
|
|
43
|
+
# Parse from JSON. Supports Ergo Node/Explorer API and box values and token amount encoded as strings
|
44
|
+
# @param json [String]
|
45
|
+
# @return [Transaction]
|
29
46
|
def self.create_from_json(json)
|
30
47
|
pointer = FFI::MemoryPointer.new(:pointer)
|
31
48
|
error = ergo_lib_tx_from_json(json, pointer)
|
@@ -33,40 +50,56 @@ module Sigma
|
|
33
50
|
init(pointer)
|
34
51
|
end
|
35
52
|
|
53
|
+
# Takes ownership of an existing Transaction Pointer.
|
54
|
+
# @note A user of sigma_rb generally does not need to call this function
|
55
|
+
# @param pointer [FFI::MemoryPointer]
|
56
|
+
# @return [Transaction]
|
36
57
|
def self.with_raw_pointer(pointer)
|
37
58
|
init(pointer)
|
38
59
|
end
|
39
60
|
|
61
|
+
# Get transaction id
|
62
|
+
# @return [TxId]
|
40
63
|
def get_tx_id
|
41
64
|
pointer = FFI::MemoryPointer.new(:pointer)
|
42
65
|
ergo_lib_tx_id(self.pointer, pointer)
|
43
66
|
Sigma::TxId.with_raw_pointer(pointer)
|
44
67
|
end
|
45
68
|
|
69
|
+
# Get inputs
|
70
|
+
# @return [Inputs]
|
46
71
|
def get_inputs
|
47
72
|
pointer = FFI::MemoryPointer.new(:pointer)
|
48
73
|
ergo_lib_tx_inputs(self.pointer, pointer)
|
49
74
|
Sigma::Inputs.with_raw_pointer(pointer)
|
50
75
|
end
|
51
76
|
|
77
|
+
# Get data inputs
|
78
|
+
# @return [DataInputs]
|
52
79
|
def get_data_inputs
|
53
80
|
pointer = FFI::MemoryPointer.new(:pointer)
|
54
81
|
ergo_lib_tx_data_inputs(self.pointer, pointer)
|
55
82
|
Sigma::DataInputs.with_raw_pointer(pointer)
|
56
83
|
end
|
57
84
|
|
85
|
+
# Get output candidates
|
86
|
+
# @return [ErgoBoxCandidates]
|
58
87
|
def get_output_candidates
|
59
88
|
pointer = FFI::MemoryPointer.new(:pointer)
|
60
89
|
ergo_lib_tx_output_candidates(self.pointer, pointer)
|
61
90
|
Sigma::ErgoBoxCandidates.with_raw_pointer(pointer)
|
62
91
|
end
|
63
92
|
|
93
|
+
# Get outputs
|
94
|
+
# @return [ErgoBoxes]
|
64
95
|
def get_outputs
|
65
96
|
pointer = FFI::MemoryPointer.new(:pointer)
|
66
97
|
ergo_lib_tx_outputs(self.pointer, pointer)
|
67
98
|
Sigma::ErgoBoxes.with_raw_pointer(pointer)
|
68
99
|
end
|
69
100
|
|
101
|
+
# JSON representation as text (compatible with Ergo Node/Explorer API, numbers are encoded as numbers)
|
102
|
+
# @return [String]
|
70
103
|
def to_json
|
71
104
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
72
105
|
error = ergo_lib_tx_to_json(self.pointer, s_ptr)
|
@@ -77,6 +110,8 @@ module Sigma
|
|
77
110
|
str
|
78
111
|
end
|
79
112
|
|
113
|
+
# JSON representation according to EIP-12
|
114
|
+
# @see https://github.com/ergoplatform/eips/pull/23 EIP-12
|
80
115
|
def to_json_eip12
|
81
116
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
82
117
|
error = ergo_lib_tx_to_json_eip12(self.pointer, s_ptr)
|
@@ -101,6 +136,8 @@ module Sigma
|
|
101
136
|
end
|
102
137
|
end
|
103
138
|
|
139
|
+
# A family of hints which are about a correspondence between a public image of a secret image and prover's commitment
|
140
|
+
# to randomness ("a" in a sigma protocol).
|
104
141
|
class CommitmentHint
|
105
142
|
extend FFI::Library
|
106
143
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -108,6 +145,10 @@ module Sigma
|
|
108
145
|
attach_function :ergo_lib_commitment_hint_delete, [:pointer], :void
|
109
146
|
attr_accessor :pointer
|
110
147
|
|
148
|
+
# Takes ownership of an existing CommitmentHint Pointer.
|
149
|
+
# @note A user of sigma_rb generally does not need to call this function
|
150
|
+
# @param pointer [FFI::MemoryPointer]
|
151
|
+
# @return [CommitmentHint]
|
111
152
|
def self.with_raw_pointer(pointer)
|
112
153
|
init(pointer)
|
113
154
|
end
|
@@ -126,6 +167,7 @@ module Sigma
|
|
126
167
|
end
|
127
168
|
end
|
128
169
|
|
170
|
+
# Collection of hints to be used by prover
|
129
171
|
class HintsBag
|
130
172
|
extend FFI::Library
|
131
173
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -137,24 +179,37 @@ module Sigma
|
|
137
179
|
attach_function :ergo_lib_hints_bag_get, [:pointer, :uint, :pointer], ReturnOption.by_value
|
138
180
|
attr_accessor :pointer
|
139
181
|
|
182
|
+
# Create an empty collection
|
183
|
+
# @return [HintsBag]
|
140
184
|
def self.create
|
141
185
|
pointer = FFI::MemoryPointer.new(:pointer)
|
142
186
|
ergo_lib_hints_bag_empty(pointer)
|
143
187
|
init(pointer)
|
144
188
|
end
|
145
189
|
|
190
|
+
# Takes ownership of an existing HintsBag Pointer.
|
191
|
+
# @note A user of sigma_rb generally does not need to call this function
|
192
|
+
# @param pointer [FFI::MemoryPointer]
|
193
|
+
# @return [HintsBag]
|
146
194
|
def self.with_raw_pointer(pointer)
|
147
195
|
init(pointer)
|
148
196
|
end
|
149
197
|
|
198
|
+
# Add to collection
|
199
|
+
# @param commitment_hint [CommitmentHint]
|
150
200
|
def add_commitment_hint(commitment_hint)
|
151
201
|
ergo_lib_hints_bag_add_commitment(self.pointer, commitment_hint.pointer)
|
152
202
|
end
|
153
203
|
|
204
|
+
# Get length of collection
|
205
|
+
# @return [Integer]
|
154
206
|
def len
|
155
207
|
ergo_lib_hints_bag_add_commitment_len(self.pointer)
|
156
208
|
end
|
157
209
|
|
210
|
+
# Get item at specified index or return nil if no item exists
|
211
|
+
# @param index [Integer]
|
212
|
+
# @return [CommitmentHint, nil]
|
158
213
|
def get_commitment_hint(index)
|
159
214
|
pointer = FFI::MemoryPointer.new(:pointer)
|
160
215
|
res = ergo_lib_hints_bag_get(self.pointer, index, pointer)
|
@@ -191,16 +246,30 @@ module Sigma
|
|
191
246
|
attach_function :ergo_lib_transaction_extract_hints, [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer], :error_pointer
|
192
247
|
attr_accessor :pointer
|
193
248
|
|
249
|
+
# Create empty collection
|
250
|
+
# @return [TransactionHintsBag]
|
194
251
|
def self.create
|
195
252
|
pointer = FFI::MemoryPointer.new(:pointer)
|
196
253
|
ergo_lib_transaction_hints_bag_empty(pointer)
|
197
254
|
init(pointer)
|
198
255
|
end
|
199
256
|
|
257
|
+
# Takes ownership of an existing TransactionHintsBag Pointer.
|
258
|
+
# @note A user of sigma_rb generally does not need to call this function
|
259
|
+
# @param pointer [FFI::MemoryPointer]
|
260
|
+
# @return [TransactionHintsBag]
|
200
261
|
def self.with_raw_pointer(pointer)
|
201
262
|
init(pointer)
|
202
263
|
end
|
203
264
|
|
265
|
+
# Extract hints from signed transaction
|
266
|
+
# @param transaction: [Transaction]
|
267
|
+
# @param state_context: [ErgoStateContext]
|
268
|
+
# @param boxes_to_spend: [ErgoBoxes]
|
269
|
+
# @param data_boxes: [ErgoBoxes]
|
270
|
+
# @param real_propositions: [Propositions]
|
271
|
+
# @param simulated_propositions: [Propositions]
|
272
|
+
# @return [TransactionHintsBag]
|
204
273
|
def self.extract_hints_from_signed_transaction(transaction:, state_context:, boxes_to_spend:, data_boxes:, real_propositions:, simulated_propositions:)
|
205
274
|
pointer = FFI::MemoryPointer.new(:pointer)
|
206
275
|
error = ergo_lib_transaction_extract_hints(transaction.pointer, state_context.pointer, boxes_to_spend.pointer, data_boxes.pointer, real_propositions.pointer, simulated_propositions.pointer, pointer)
|
@@ -208,10 +277,16 @@ module Sigma
|
|
208
277
|
init(pointer)
|
209
278
|
end
|
210
279
|
|
280
|
+
# Add hints for input
|
281
|
+
# @param index: [Integer]
|
282
|
+
# @param hints_bag: [HintsBag]
|
211
283
|
def add_hints_for_input(index:, hints_bag:)
|
212
284
|
ergo_lib_transaction_hints_bag_add_hints_for_input(self.pointer, index, hints_bag.pointer)
|
213
285
|
end
|
214
286
|
|
287
|
+
# Get hints corresponding to index
|
288
|
+
# @param index [Integer]
|
289
|
+
# @return [HintsBag]
|
215
290
|
def all_hints_for_input(index)
|
216
291
|
pointer = FFI::MemoryPointer.new(:pointer)
|
217
292
|
ergo_lib_transaction_hints_bag_all_hints_for_input(self.pointer, index, pointer)
|
@@ -232,6 +307,7 @@ module Sigma
|
|
232
307
|
end
|
233
308
|
end
|
234
309
|
|
310
|
+
# Unsigned (inputs without proofs) transaction
|
235
311
|
class UnsignedTransaction
|
236
312
|
extend FFI::Library
|
237
313
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -246,6 +322,9 @@ module Sigma
|
|
246
322
|
attach_function :ergo_lib_unsigned_tx_to_json_eip12, [:pointer, :pointer], :error_pointer
|
247
323
|
attr_accessor :pointer
|
248
324
|
|
325
|
+
# Parse from JSON. Supports Ergo Node/Explorer API and box values and token amount encoded as strings
|
326
|
+
# @param json [String]
|
327
|
+
# @return [UnsignedTransaction]
|
249
328
|
def self.with_json(json)
|
250
329
|
pointer = FFI::MemoryPointer.new(:pointer)
|
251
330
|
error = ergo_lib_unsigned_tx_from_json(json, pointer)
|
@@ -253,34 +332,48 @@ module Sigma
|
|
253
332
|
init(pointer)
|
254
333
|
end
|
255
334
|
|
335
|
+
# Takes ownership of an existing UnsignedTransaction Pointer.
|
336
|
+
# @note A user of sigma_rb generally does not need to call this function
|
337
|
+
# @param pointer [FFI::MemoryPointer]
|
338
|
+
# @return [UnsignedTransaction]
|
256
339
|
def self.with_raw_pointer(pointer)
|
257
340
|
init(pointer)
|
258
341
|
end
|
259
342
|
|
343
|
+
# Get transaction id
|
344
|
+
# @return [TxId]
|
260
345
|
def get_tx_id
|
261
346
|
pointer = FFI::MemoryPointer.new(:pointer)
|
262
347
|
ergo_lib_unsigned_tx_id(self.pointer, pointer)
|
263
348
|
Sigma::TxId.with_raw_pointer(pointer)
|
264
349
|
end
|
265
350
|
|
351
|
+
# Get unsigned inputs
|
352
|
+
# @return [UnsignedInputs]
|
266
353
|
def get_unsigned_inputs
|
267
354
|
pointer = FFI::MemoryPointer.new(:pointer)
|
268
355
|
ergo_lib_unsigned_tx_inputs(self.pointer, pointer)
|
269
356
|
Sigma::UnsignedInputs.with_raw_pointer(pointer)
|
270
357
|
end
|
271
358
|
|
359
|
+
# Get data inputs
|
360
|
+
# @return [DataInputs]
|
272
361
|
def get_data_inputs
|
273
362
|
pointer = FFI::MemoryPointer.new(:pointer)
|
274
363
|
ergo_lib_unsigned_tx_data_inputs(self.pointer, pointer)
|
275
364
|
Sigma::DataInputs.with_raw_pointer(pointer)
|
276
365
|
end
|
277
366
|
|
367
|
+
# Get output candidates
|
368
|
+
# @return [ErgoBoxCandidates]
|
278
369
|
def get_output_candidates
|
279
370
|
pointer = FFI::MemoryPointer.new(:pointer)
|
280
371
|
ergo_lib_unsigned_tx_output_candidates(self.pointer, pointer)
|
281
372
|
Sigma::ErgoBoxCandidates.with_raw_pointer(pointer)
|
282
373
|
end
|
283
374
|
|
375
|
+
# JSON representation as text (compatible with Ergo Node/Explorer API, numbers are encoded as numbers)
|
376
|
+
# @return [String]
|
284
377
|
def to_json
|
285
378
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
286
379
|
error = ergo_lib_unsigned_tx_to_json(self.pointer, s_ptr)
|
@@ -291,6 +384,8 @@ module Sigma
|
|
291
384
|
str
|
292
385
|
end
|
293
386
|
|
387
|
+
# JSON representation according to EIP-12
|
388
|
+
# @see https://github.com/ergoplatform/eips/pull/23 EIP-12
|
294
389
|
def to_json_eip12
|
295
390
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
296
391
|
error = ergo_lib_unsigned_tx_to_json_eip12(self.pointer, s_ptr)
|
@@ -315,6 +410,7 @@ module Sigma
|
|
315
410
|
end
|
316
411
|
end
|
317
412
|
|
413
|
+
# Transaction Id
|
318
414
|
class TxId
|
319
415
|
extend FFI::Library
|
320
416
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -325,6 +421,9 @@ module Sigma
|
|
325
421
|
|
326
422
|
attr_accessor :pointer
|
327
423
|
|
424
|
+
# Create from hex-encoded string
|
425
|
+
# @param str [String]
|
426
|
+
# @return [TxId]
|
328
427
|
def self.with_string(str)
|
329
428
|
pointer = FFI::MemoryPointer.new(:pointer)
|
330
429
|
error = ergo_lib_tx_id_from_str(str, pointer)
|
@@ -333,10 +432,16 @@ module Sigma
|
|
333
432
|
init(pointer)
|
334
433
|
end
|
335
434
|
|
435
|
+
# Takes ownership of an existing TxId Pointer.
|
436
|
+
# @note A user of sigma_rb generally does not need to call this function
|
437
|
+
# @param pointer [FFI::MemoryPointer]
|
438
|
+
# @return [TxId]
|
336
439
|
def self.with_raw_pointer(unread_pointer)
|
337
440
|
init(unread_pointer)
|
338
441
|
end
|
339
442
|
|
443
|
+
# Get the TxId as bytes represented with hex-encoded string
|
444
|
+
# @return [String]
|
340
445
|
def to_s
|
341
446
|
s_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
342
447
|
error = ergo_lib_tx_id_to_str(self.pointer, s_ptr)
|