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,66 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+
5
+ require_relative '../../lib/sigma.rb'
6
+ require_relative '../test_utils.rb'
7
+
8
+ class Sigma::ErgoTree::Test < Test::Unit::TestCase
9
+
10
+ def test_encoding
11
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
12
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
13
+ assert_equal(base_16, tree.to_base16_encoded_string)
14
+ assert_nothing_raised do
15
+ tree.to_bytes
16
+ end
17
+ assert_nothing_raised do
18
+ tree.to_template_bytes
19
+ end
20
+ end
21
+
22
+ def test_constant_length
23
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
24
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
25
+ assert_equal(2, tree.constants_length)
26
+ end
27
+
28
+ def test_get_constant
29
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
30
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
31
+ assert_not_nil(tree.get_constant(0))
32
+ assert_not_nil(tree.get_constant(1))
33
+ assert_equal(nil, tree.get_constant(2))
34
+ end
35
+
36
+ def test_with_constant
37
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
38
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
39
+ assert_equal(2, tree.constants_length)
40
+ constant = Sigma::Constant.with_i32(99)
41
+ tree.replace_constant(index: 0, constant: constant)
42
+ assert_equal(99, tree.get_constant(0).to_i32)
43
+ assert_equal(2, tree.constants_length)
44
+ end
45
+
46
+ def test_with_constant_out_of_bounds
47
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
48
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
49
+ assert_equal(2, tree.constants_length)
50
+ constant = Sigma::Constant.with_i32(99)
51
+ assert_raise do
52
+ tree.replace_constant(index: 3, constant: constant)
53
+ end
54
+ end
55
+
56
+ def test_with_constant_type_mismatch
57
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
58
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
59
+ assert_equal(2, tree.constants_length)
60
+ constant = Sigma::Constant.with_i64(342423)
61
+ assert_raise do
62
+ tree.replace_constant(index: 0, constant: constant)
63
+ end
64
+ end
65
+ end
66
+
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::Input::Test < Test::Unit::TestCase
10
+ # TODO
11
+ def test_input
12
+ # get_box_id
13
+ # get_spending_proof
14
+ end
15
+
16
+ def test_inputs
17
+ # create
18
+ # len
19
+ # get
20
+ # add
21
+ end
22
+
23
+ def test_prover_result
24
+ # to_bytes
25
+ # get_context_extension
26
+ # to_json
27
+ end
28
+
29
+ def test_unsigned_input
30
+ # get_box_id
31
+ # get_context_extension
32
+ end
33
+
34
+ def test_unsigned_inputs
35
+ # create
36
+ # len
37
+ # get
38
+ # add
39
+ end
40
+ end
41
+
@@ -0,0 +1,34 @@
1
+
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'test/unit'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ include Sigma
10
+
11
+ class Sigma::MerkleProof::Test < Test::Unit::TestCase
12
+ def test_block_proof
13
+ json = {
14
+ leafData: "563b34b96e65788d767a10b0c2ce4a9ef5dcb9f7f7919781624870d56506dc5b",
15
+ levels: [
16
+ ["274d105b42c2da3e03519865470ccef5072d389b153535ca7192fef4abf3b3ed", 0],
17
+ ["c1887cee0c42318ac04dfa93b8ef6b40c2b53a83b0e111f91a16b0842166e76e", 0],
18
+ ["58be076cd9ef596a739ec551cbb6b467b95044c05a80a66a7f256d4ebafd787f", 0]]
19
+ }.to_json
20
+ merkle_proof = MerkleProof.with_json(json)
21
+ root = "250063ac1cec3bf56f727f644f49b70515616afa6009857a29b1fe298441e69a"
22
+ assert(merkle_proof.valid(root))
23
+ end
24
+
25
+ def test_miner_proof
26
+ json = {
27
+ leafData: "642c15c62553edd8fd9af9a6f754f3c7a6c03faacd0c9b9d5b7d11052c6c6fe8",
28
+ levels: [["39b79af823a92aa72ced2c6d9e7f7f4687de5b5af7fab0ad205d3e54bda3f3ae",1]]
29
+ }.to_json
30
+ merkle_proof = MerkleProof.with_json(json)
31
+ root = "74c851610658a40f5ae74aa3a4babd5751bd827a6ccc1fe069468ef487cb90a8"
32
+ assert(merkle_proof.valid(root))
33
+ end
34
+ end
@@ -0,0 +1,100 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+
5
+ require_relative '../../lib/sigma.rb'
6
+ require_relative '../test_utils.rb'
7
+
8
+ include Sigma
9
+
10
+ class Sigma::NipopowProof::Test < Test::Unit::TestCase
11
+ def test_from_json
12
+ json = {
13
+ "header": {
14
+ "version": 1,
15
+ "id": "fa31f25f95c6ae9752392daa38f45c59e57593a4def26427cbda25747938d0a3",
16
+ "parentId": "99e19212a3dd1f3951464cbeb42e6bc447b646fe20e362653009be31b8ac756d",
17
+ "adProofsRoot": "7bd5d1c0df436e1e175df31a0272013ca93f2305a1bddea99d6b607ecf24fcac",
18
+ "stateRoot": "000000000000000000000000000000000000000000000000000000000000000000",
19
+ "transactionsRoot": "024562cb92738cbe9f5345b6d78b0272f4823692d2a16a11d80459c6d61f7860",
20
+ "timestamp": 0,
21
+ "nBits": 16842752,
22
+ "height": 8,
23
+ "extensionHash": "696a076089090b128c4856a17e2e23ed2788d074fe09e9975e2ee799f79e9743",
24
+ "powSolutions": {
25
+ "pk": "038b0f29a60fa8d7e1aeafbe512288a6c6bc696547bbf8247db23c95e83014513c",
26
+ "w": "03a0f176159c0895ee4cc64149ff3fa8a0ccf8cf15b884fb0bfaabc0bae2355b10",
27
+ "n": "8000000000000000",
28
+ "d": "21099867708510879837487107380901512552573946537697225889752133246839759121455"
29
+ },
30
+ "votes": "000000"
31
+ },
32
+ "interlinks": [
33
+ "e57483be3653936848f646ebd44e8ea7311d3d8fbc07b4c900a1b7edcc0b9a74",
34
+ "b2525defb4a3ab2f0ffdad6f37ff5a9e330eae2f00ec0c19f1aef234369bd408",
35
+ "99e19212a3dd1f3951464cbeb42e6bc447b646fe20e362653009be31b8ac756d"
36
+ ],
37
+ "interlinksProof": {
38
+ "indices": [
39
+ {
40
+ "index": 0,
41
+ "digest": "e489b3601239d37b066aa53b6640758c9774334dde616d43fb8288e1fdb4f083"
42
+ },
43
+ {
44
+ "index": 1,
45
+ "digest": "76387dd1010dbfc7e318fb7989fe3013099ca0ed4fc6176471815ab116e3542a"
46
+ },
47
+ {
48
+ "index": 2,
49
+ "digest": "c61ce82b2b3bfe369daaa51e5df8070364d68e0cb9a3dfa6ebf79e3bfb89d9fa"
50
+ }
51
+ ],
52
+ "proofs": [
53
+ {
54
+ "digest": "",
55
+ "side": 1
56
+ }
57
+ ]
58
+ }
59
+ }.to_json
60
+
61
+ header_json = {
62
+ "version": 1,
63
+ "id": "fa31f25f95c6ae9752392daa38f45c59e57593a4def26427cbda25747938d0a3",
64
+ "parentId": "99e19212a3dd1f3951464cbeb42e6bc447b646fe20e362653009be31b8ac756d",
65
+ "adProofsRoot": "7bd5d1c0df436e1e175df31a0272013ca93f2305a1bddea99d6b607ecf24fcac",
66
+ "stateRoot": "000000000000000000000000000000000000000000000000000000000000000000",
67
+ "transactionsRoot": "024562cb92738cbe9f5345b6d78b0272f4823692d2a16a11d80459c6d61f7860",
68
+ "timestamp": 0,
69
+ "nBits": 16842752,
70
+ "height": 8,
71
+ "extensionHash": "696a076089090b128c4856a17e2e23ed2788d074fe09e9975e2ee799f79e9743",
72
+ "powSolutions": {
73
+ "pk": "038b0f29a60fa8d7e1aeafbe512288a6c6bc696547bbf8247db23c95e83014513c",
74
+ "w": "03a0f176159c0895ee4cc64149ff3fa8a0ccf8cf15b884fb0bfaabc0bae2355b10",
75
+ "n": "8000000000000000",
76
+ "d": "21099867708510879837487107380901512552573946537697225889752133246839759121455"
77
+ },
78
+ "votes": "000000"
79
+ }.to_json
80
+
81
+ popow = PoPowHeader.with_json(json)
82
+ assert_equal(3, popow.get_interlinks.len)
83
+ assert_equal(BlockHeader.with_json(header_json), popow.get_header)
84
+ #assert(popow.check_interlinks_proof)
85
+ end
86
+
87
+ def test_nipopow_proof
88
+ # TODO
89
+ # with_json
90
+ # is_better_than
91
+ # to_json
92
+ end
93
+
94
+ def test_nipopow_verifier
95
+ # TODO
96
+ # create
97
+ # best_chain
98
+ # process
99
+ end
100
+ end
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::SecretKey::Test < Test::Unit::TestCase
10
+ def test_secret_key
11
+ sk = Sigma::SecretKey.create
12
+ assert_nothing_raised do
13
+ address = sk.get_address
14
+ end
15
+ bytes = sk.to_bytes
16
+ sk_2 = Sigma::SecretKey.from_bytes(bytes)
17
+ assert_equal(bytes, sk_2.to_bytes)
18
+ end
19
+
20
+ def test_secret_keys
21
+ sk = Sigma::SecretKey.create
22
+ sks = Sigma::SecretKeys.create
23
+ assert_equal(0, sks.len)
24
+ assert_equal(nil, sks.get(0))
25
+ sks.add(sk)
26
+ assert_equal(1, sks.len)
27
+ assert_equal(sk.to_bytes, sks.get(0).to_bytes)
28
+ assert_equal(nil, sks.get(1))
29
+ end
30
+
31
+ end
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+
5
+ require_relative '../../lib/sigma.rb'
6
+ require_relative '../test_utils.rb'
7
+
8
+ class Sigma::Token::Test < Test::Unit::TestCase
9
+ def test_token_id_from_box_id
10
+ str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
11
+ box_id = Sigma::BoxId.with_string(str)
12
+ token_id = Sigma::TokenId.with_box_id(box_id)
13
+ assert_nothing_raised do
14
+ token_id.to_base16_encoded_string
15
+ end
16
+
17
+ token_id_two = Sigma::TokenId.with_box_id(box_id)
18
+ assert_equal(token_id, token_id_two)
19
+ end
20
+
21
+ def test_token_id_from_string
22
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
23
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
24
+ assert_equal(str, token_id.to_base16_encoded_string)
25
+
26
+ token_id_two = Sigma::TokenId.from_base16_encoded_string(str)
27
+ assert_equal(token_id, token_id_two)
28
+ end
29
+
30
+ def test_token_amount_from_int
31
+ amount = 12345678
32
+ token_amount = Sigma::TokenAmount.with_i64(amount)
33
+ assert_equal(amount, token_amount.to_i)
34
+
35
+ token_amount_two = Sigma::TokenAmount.with_i64(amount)
36
+ assert_equal(token_amount, token_amount_two)
37
+ end
38
+
39
+ def test_token
40
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
41
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
42
+ amount = 12345678
43
+ token_amount = Sigma::TokenAmount.with_i64(amount)
44
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
45
+ new_token_id = token.get_id
46
+ new_token_amount = token.get_amount
47
+ assert_equal(str, new_token_id.to_base16_encoded_string)
48
+ assert_equal(token_id, new_token_id)
49
+ assert_equal(token_amount, new_token_amount)
50
+
51
+ token_two = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
52
+ assert_equal(token, token_two)
53
+ end
54
+
55
+ def test_token_json
56
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
57
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
58
+ amount = 12345678
59
+ token_amount = Sigma::TokenAmount.with_i64(amount)
60
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
61
+ assert_nothing_raised do
62
+ token.to_json_eip12
63
+ end
64
+ end
65
+
66
+ def test_tokens
67
+ tokens = Sigma::Tokens.create
68
+ assert_equal(0, tokens.len)
69
+ assert_equal(nil, tokens.get(3))
70
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
71
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
72
+ amount = 12345678
73
+ token_amount = Sigma::TokenAmount.with_i64(amount)
74
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
75
+
76
+ 255.times do |i|
77
+ tokens.add(token)
78
+ end
79
+ assert_equal(255, tokens.len)
80
+ assert_equal(tokens.get(254), token)
81
+
82
+ # 256 raises error
83
+ assert_raise do
84
+ tokens.add(token)
85
+ end
86
+ end
87
+ end