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/tx_builder.rb
CHANGED
@@ -3,6 +3,7 @@ require_relative './util.rb'
|
|
3
3
|
require 'ffi-compiler/loader'
|
4
4
|
|
5
5
|
module Sigma
|
6
|
+
# UnsignedTransaction builder
|
6
7
|
class TxBuilder
|
7
8
|
extend FFI::Library
|
8
9
|
ffi_lib FFI::Compiler::Loader.find('csigma')
|
@@ -24,6 +25,14 @@ module Sigma
|
|
24
25
|
|
25
26
|
attr_accessor :pointer
|
26
27
|
|
28
|
+
# Create new TxBuilder
|
29
|
+
# @param box_selection [BoxSelection] selected input boxes
|
30
|
+
# @param output_candidates [ErgoBoxCandidates] output boxes to be "created" in this transaction
|
31
|
+
# @param current_height [Integer] chain height that will be used in additionally created boxes (change, miner's fee, etc.)
|
32
|
+
# @param fee_amount [BoxValue] miner's fee
|
33
|
+
# @param change_address [Address] change (inputs - outputs) will be sent to this address
|
34
|
+
# @param min_change_value [BoxValue] minimal value of the change to be sent to `change_address`, value less than that will be given to miners
|
35
|
+
# @return [TxBuilder]
|
27
36
|
def self.create(box_selection:, output_candidates:, current_height:, fee_amount:, change_address:, min_change_value:)
|
28
37
|
pointer = FFI::MemoryPointer.new(:pointer)
|
29
38
|
ergo_lib_tx_builder_new(
|
@@ -38,26 +47,37 @@ module Sigma
|
|
38
47
|
init(pointer)
|
39
48
|
end
|
40
49
|
|
50
|
+
# Suggested transaction fee (semi-default value used across wallets and dApps as of Oct 2020)
|
51
|
+
# @return [BoxValue]
|
41
52
|
def self.suggested_tx_fee
|
42
53
|
pointer = FFI::MemoryPointer.new(:pointer)
|
43
54
|
ergo_lib_tx_builder_suggested_tx_fee(pointer)
|
44
55
|
Sigma::BoxValue.with_raw_pointer(pointer)
|
45
56
|
end
|
46
57
|
|
58
|
+
# Set transaction's data inputs
|
59
|
+
# @param data_inputs [DataInputs]
|
47
60
|
def set_data_inputs(data_inputs)
|
48
61
|
ergo_lib_tx_builder_set_data_inputs(self.pointer, data_inputs.pointer)
|
49
62
|
end
|
50
63
|
|
64
|
+
# Set context extension for given input
|
65
|
+
# @param box_id [BoxId]
|
66
|
+
# @param context_extension [ContextExension]
|
51
67
|
def set_context_extension(box_id, context_extension)
|
52
68
|
ergo_lib_tx_builder_set_context_extension(self.pointer, box_id.pointer, context_extension.pointer)
|
53
69
|
end
|
54
70
|
|
71
|
+
# Get data inputs
|
72
|
+
# @return [DataInputs]
|
55
73
|
def get_data_inputs
|
56
74
|
pointer = FFI::MemoryPointer.new(:pointer)
|
57
75
|
ergo_lib_tx_builder_data_inputs(self.pointer, pointer)
|
58
76
|
Sigma::DataInputs.with_raw_pointer(pointer)
|
59
77
|
end
|
60
78
|
|
79
|
+
# Build the UnsignedTransaction
|
80
|
+
# @return [UnsignedTransaction]
|
61
81
|
def build
|
62
82
|
pointer = FFI::MemoryPointer.new(:pointer)
|
63
83
|
error = ergo_lib_tx_builder_build(self.pointer, pointer)
|
@@ -65,34 +85,46 @@ module Sigma
|
|
65
85
|
Sigma::UnsignedTransaction.with_raw_pointer(pointer)
|
66
86
|
end
|
67
87
|
|
88
|
+
# Get box selection
|
89
|
+
# @return [BoxSelection]
|
68
90
|
def get_box_selection
|
69
91
|
pointer = FFI::MemoryPointer.new(:pointer)
|
70
92
|
ergo_lib_tx_builder_box_selection(self.pointer, pointer)
|
71
93
|
Sigma::BoxSelection.with_raw_pointer(pointer)
|
72
94
|
end
|
73
95
|
|
96
|
+
# Get output candidates
|
97
|
+
# @return [ErgoBoxCandidates]
|
74
98
|
def get_output_candidates
|
75
99
|
pointer = FFI::MemoryPointer.new(:pointer)
|
76
100
|
ergo_lib_tx_builder_output_candidates(self.pointer, pointer)
|
77
101
|
Sigma::ErgoBoxCandidates.with_raw_pointer(pointer)
|
78
102
|
end
|
79
103
|
|
104
|
+
# Get current height
|
105
|
+
# @return [Integer]
|
80
106
|
def get_current_height
|
81
107
|
ergo_lib_tx_builder_current_height(self.pointer)
|
82
108
|
end
|
83
109
|
|
110
|
+
# Get fee amount
|
111
|
+
# @return [BoxValue]
|
84
112
|
def get_fee_amount
|
85
113
|
pointer = FFI::MemoryPointer.new(:pointer)
|
86
114
|
ergo_lib_tx_builder_fee_amount(self.pointer, pointer)
|
87
115
|
Sigma::BoxValue.with_raw_pointer(pointer)
|
88
116
|
end
|
89
117
|
|
118
|
+
# Get change address
|
119
|
+
# @return [Address]
|
90
120
|
def get_change_address
|
91
121
|
pointer = FFI::MemoryPointer.new(:pointer)
|
92
122
|
ergo_lib_tx_builder_change_address(self.pointer, pointer)
|
93
123
|
Sigma::Address.with_raw_pointer(pointer)
|
94
124
|
end
|
95
125
|
|
126
|
+
# Get min change value
|
127
|
+
# @return [BoxValue]
|
96
128
|
def get_min_change_value
|
97
129
|
pointer = FFI::MemoryPointer.new(:pointer)
|
98
130
|
ergo_lib_tx_builder_min_change_value(self.pointer, pointer)
|
data/lib/sigma/wallet.rb
CHANGED
@@ -19,6 +19,11 @@ module Sigma
|
|
19
19
|
attach_function :ergo_lib_wallet_add_secret, [:pointer, :pointer], :error_pointer
|
20
20
|
attr_accessor :pointer
|
21
21
|
|
22
|
+
# Create Wallet instance loading secret key from mnemonic. Throws error if a DlogSecretKey cannot be
|
23
|
+
# parsed from the provided phrase
|
24
|
+
# @param mnemonic_phrase [String]
|
25
|
+
# @param mnemonic_pass [String]
|
26
|
+
# @return [Wallet]
|
22
27
|
def self.create_from_mnemonic(mnemonic_phrase, mnemonic_pass)
|
23
28
|
pointer = FFI::MemoryPointer.new(:pointer)
|
24
29
|
error = ergo_lib_wallet_from_mnemonic(mnemonic_phrase, mnemonic_pass, pointer)
|
@@ -26,17 +31,28 @@ module Sigma
|
|
26
31
|
init(pointer)
|
27
32
|
end
|
28
33
|
|
34
|
+
# Create Wallet from secrets
|
35
|
+
# @param secrets [SecretKeys]
|
36
|
+
# @return [Wallet]
|
29
37
|
def self.create_from_secrets(secrets)
|
30
38
|
pointer = FFI::MemoryPointer.new(:pointer)
|
31
39
|
ergo_lib_wallet_from_secrets(secrets.pointer, pointer)
|
32
40
|
init(pointer)
|
33
41
|
end
|
34
42
|
|
43
|
+
# Add a secret to the wallet's prover
|
44
|
+
# @param secret [SecretKey]
|
35
45
|
def add_secret(secret)
|
36
46
|
error = ergo_lib_wallet_add_secret(self.pointer, secret.pointer)
|
37
47
|
Util.check_error!(error)
|
38
48
|
end
|
39
49
|
|
50
|
+
# Sign a transaction
|
51
|
+
# @param state_context: [ErgoStateContext]
|
52
|
+
# @param unsigned_tx: [UnsignedTransaction]
|
53
|
+
# @param boxes_to_spend: [ErgoBoxes]
|
54
|
+
# @param data_boxes: [ErgoBoxes]
|
55
|
+
# @return [Transaction]
|
40
56
|
def sign_transaction(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:)
|
41
57
|
pointer = FFI::MemoryPointer.new(:pointer)
|
42
58
|
error = ergo_lib_wallet_sign_transaction(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, pointer)
|
@@ -44,6 +60,13 @@ module Sigma
|
|
44
60
|
Sigma::Transaction.with_raw_pointer(pointer)
|
45
61
|
end
|
46
62
|
|
63
|
+
# Sign a multi-signature transaction
|
64
|
+
# @param state_context: [ErgoStateContext]
|
65
|
+
# @param unsigned_tx: [UnsignedTransaction]
|
66
|
+
# @param boxes_to_spend: [ErgoBoxes]
|
67
|
+
# @param data_boxes: [ErgoBoxes]
|
68
|
+
# @param tx_hints: [TransactionHintsBag]
|
69
|
+
# @return [Transaction]
|
47
70
|
def sign_transaction_multi(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:, tx_hints:)
|
48
71
|
pointer = FFI::MemoryPointer.new(:pointer)
|
49
72
|
error = ergo_lib_wallet_sign_transaction_multi(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, tx_hints.pointer, pointer)
|
@@ -51,6 +74,9 @@ module Sigma
|
|
51
74
|
Sigma::Transaction.with_raw_pointer(pointer)
|
52
75
|
end
|
53
76
|
|
77
|
+
# Signs a reduced transaction (generating proofs for inputs)
|
78
|
+
# @param reduced_tx [ReducedTransaction]
|
79
|
+
# @return [Transaction]
|
54
80
|
def sign_reduced_transaction(reduced_tx)
|
55
81
|
pointer = FFI::MemoryPointer.new(:pointer)
|
56
82
|
error = ergo_lib_wallet_sign_reduced_transaction(self.pointer, reduced_tx.pointer, pointer)
|
@@ -58,6 +84,10 @@ module Sigma
|
|
58
84
|
Sigma::Transaction.with_raw_pointer(pointer)
|
59
85
|
end
|
60
86
|
|
87
|
+
# Signs a multi signature reduced transaction
|
88
|
+
# @param reduced_tx [ReducedTransaction]
|
89
|
+
# @param tx_hints: [TransactionHintsBag]
|
90
|
+
# @return [Transaction]
|
61
91
|
def sign_reduced_transaction_multi(reduced_tx:, tx_hints:)
|
62
92
|
pointer = FFI::MemoryPointer.new(:pointer)
|
63
93
|
error = ergo_lib_wallet_sign_reduced_transaction_multi(self.pointer, reduced_tx.pointer, tx_hints.pointer, pointer)
|
@@ -65,6 +95,12 @@ module Sigma
|
|
65
95
|
Sigma::Transaction.with_raw_pointer(pointer)
|
66
96
|
end
|
67
97
|
|
98
|
+
# Generate Commitments for unsigned tx
|
99
|
+
# @param state_context: [ErgoStateContext]
|
100
|
+
# @param unsigned_tx: [UnsignedTransaction]
|
101
|
+
# @param boxes_to_spend: [ErgoBoxes]
|
102
|
+
# @param data_boxes: [ErgoBoxes]
|
103
|
+
# @return [TransactionHintsBag]
|
68
104
|
def generate_commitments(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:)
|
69
105
|
pointer = FFI::MemoryPointer.new(:pointer)
|
70
106
|
error = ergo_lib_wallet_generate_commitments(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, pointer)
|
@@ -72,6 +108,9 @@ module Sigma
|
|
72
108
|
Sigma::TransactionHintsBag.with_raw_pointer(pointer)
|
73
109
|
end
|
74
110
|
|
111
|
+
# Generate Commitments for reduced transaction
|
112
|
+
# @param reduced_tx [ReducedTransaction]
|
113
|
+
# @return [TransactionHintsBag]
|
75
114
|
def generate_commitments_for_reduced_transaction(reduced_tx)
|
76
115
|
pointer = FFI::MemoryPointer.new(:pointer)
|
77
116
|
error = ergo_lib_wallet_generate_commitments_for_reduced_transaction(self.pointer, reduced_tx.pointer, pointer)
|
data/lib/sigma.rb
CHANGED
data/sigma.gemspec
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'sigma_rb'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.2.0'
|
4
4
|
s.summary = "Ruby bindings for Ergo types, abstractions, and interfaces provided by Sigma-Rust."
|
5
5
|
s.description = "Ruby bindings for the Ergo-Lib crate of Sigma-Rust. Specifically for chain types and abstractions, json serialization, box selection for tx inputs, tx creation, and signing."
|
6
6
|
s.authors = ["Dark Lord of Programming"]
|
7
7
|
s.email = 'thedlop@sent.com'
|
8
8
|
s.homepage = 'https://github.com/thedlop/sigma_rb'
|
9
9
|
s.license = 'MIT'
|
10
|
-
s.files = Dir.glob("{lib}/**/*")
|
10
|
+
s.files = Dir.glob("{lib}/**/*")
|
11
11
|
s.files += %w(sigma.gemspec README.md LICENSE ext/Rakefile ext/csigma.c)
|
12
12
|
s.add_dependency 'ffi-compiler', '1.0.1'
|
13
13
|
s.add_dependency 'rake', '~> 13.0'
|
14
14
|
s.add_development_dependency 'ffi', '1.15.5'
|
15
15
|
s.add_development_dependency 'test-unit', '~> 3.5'
|
16
|
+
s.add_development_dependency 'yard', '~> 0.9.20'
|
16
17
|
s.extensions << "ext/Rakefile"
|
17
18
|
s.test_files = Dir["tests/**/*.rb"]
|
18
19
|
s.require_paths = ["lib"]
|
@@ -11,9 +11,11 @@ class Sigma::ErgoTree::Test < Test::Unit::TestCase
|
|
11
11
|
base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
|
12
12
|
tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
|
13
13
|
assert_equal(base_16, tree.to_base16_encoded_string)
|
14
|
-
assert_nothing_raised do
|
14
|
+
bytes = assert_nothing_raised do
|
15
15
|
tree.to_bytes
|
16
16
|
end
|
17
|
+
tree_from_bytes = Sigma::ErgoTree.from_bytes(bytes)
|
18
|
+
assert_equal(tree_from_bytes, tree)
|
17
19
|
assert_nothing_raised do
|
18
20
|
tree.to_template_bytes
|
19
21
|
end
|
data/tests/sigma/nipopow_test.rb
CHANGED
data/tests/sigma/token_test.rb
CHANGED
@@ -73,13 +73,15 @@ class Sigma::Token::Test < Test::Unit::TestCase
|
|
73
73
|
token_amount = Sigma::TokenAmount.with_i64(amount)
|
74
74
|
token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
|
75
75
|
|
76
|
-
|
76
|
+
max_tokens_count = ErgoBox::MAX_TOKENS_COUNT
|
77
|
+
|
78
|
+
max_tokens_count.times do |i|
|
77
79
|
tokens.add(token)
|
78
80
|
end
|
79
|
-
assert_equal(
|
80
|
-
assert_equal(tokens.get(
|
81
|
+
assert_equal(max_tokens_count, tokens.len)
|
82
|
+
assert_equal(tokens.get(max_tokens_count - 1), token)
|
81
83
|
|
82
|
-
#
|
84
|
+
# Next raises error
|
83
85
|
assert_raise do
|
84
86
|
tokens.add(token)
|
85
87
|
end
|
data/tests/test_seeds.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sigma_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dark Lord of Programming
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.5'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.9.20
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.9.20
|
69
83
|
description: Ruby bindings for the Ergo-Lib crate of Sigma-Rust. Specifically for
|
70
84
|
chain types and abstractions, json serialization, box selection for tx inputs, tx
|
71
85
|
creation, and signing.
|