sigma_rb 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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