test_sdk1 1.0.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +478 -89
  3. data/lib/crypto/asymmetric_key.rb +19 -18
  4. data/lib/crypto/ed25519_key.rb +99 -10
  5. data/lib/crypto/keys.rb +1 -2
  6. data/lib/crypto/keys_util.rb +20 -0
  7. data/lib/entity/auction_state.rb +56 -8
  8. data/lib/entity/bid.rb +1 -1
  9. data/lib/entity/bid_info.rb +1 -1
  10. data/lib/entity/block.rb +39 -0
  11. data/lib/entity/block_body.rb +35 -0
  12. data/lib/entity/block_header.rb +81 -0
  13. data/lib/entity/block_info.rb +56 -0
  14. data/lib/entity/block_proof.rb +24 -0
  15. data/lib/entity/deploy.rb +154 -1
  16. data/lib/entity/deploy_executable.rb +108 -6
  17. data/lib/entity/deploy_executable_item_internal.rb +1 -1
  18. data/lib/entity/deploy_header.rb +17 -0
  19. data/lib/entity/deploy_named_argument.rb +69 -2
  20. data/lib/entity/era_summary.rb +13 -12
  21. data/lib/entity/module_bytes.rb +16 -2
  22. data/lib/entity/status.rb +80 -0
  23. data/lib/entity/stored_value.rb +86 -11
  24. data/lib/entity/transfer.rb +7 -7
  25. data/lib/include.rb +2 -0
  26. data/lib/serialization/cl_value_serializer.rb +69 -12
  27. data/lib/serialization/cl_value_serializer1.rb +314 -0
  28. data/lib/serialization/cl_value_serializer_update.rb +320 -0
  29. data/lib/serialization/deploy_header_serializer.rb +1 -0
  30. data/lib/serialization/deploy_named_arg_serializer.rb +1 -0
  31. data/lib/serialization/deploy_serializer.rb +144 -10
  32. data/lib/serialization/deploy_serializer1.rb +392 -0
  33. data/lib/serialization/deploy_serializer_update.rb +397 -0
  34. data/lib/serialization/test.rb +33 -13
  35. data/lib/test_sdk1.rb +29 -10
  36. data/lib/types/cl_option.rb +8 -2
  37. data/lib/types/cl_public_key.rb +2 -0
  38. data/lib/types/cl_value.rb +8 -0
  39. data/lib/utils/byte_utils.rb +28 -0
  40. data/lib/utils/helpers.rb +10 -0
  41. data/lib/version.rb +1 -1
  42. data/spec/cl_value_serializer_spec.rb +16 -1
  43. data/spec/dene_spec.rb +186 -0
  44. data/spec/deploy_executable_spec.rb +90 -0
  45. data/spec/deploy_executable_test_spec.rb +117 -0
  46. data/spec/deploy_serializer_spec.rb +5 -3
  47. data/spec/deploy_serializer_test_spec.rb +7 -1
  48. data/spec/testnet_spec.rb +3 -1
  49. data/spec/time_utils_spec.rb +3 -0
  50. metadata +20 -5
  51. data/lib/crypto/key_pair.rb +0 -40
  52. data/spec/deploy_executable_serializer_spec.rb +0 -0
@@ -1,14 +1,108 @@
1
1
  require 'openssl'
2
2
  require 'ed25519'
3
- require_relative './asymmetric_key.rb'
3
+ require 'blake2b'
4
+ require 'chilkat'
5
+
6
+ # CLPublicKeyTag = {
7
+ # ED25519: 1,
8
+ # SECP256K1: 2
9
+ # }
4
10
 
5
11
  # ED25519 private key length in bytes
6
12
  PRIVATE_KEY_LENGTH = 32
7
13
 
8
- class Ed25519Key < AsymmetricKey
14
+ class Ed25519Key
15
+ # attr_reader :public_key, :private_key, :signature_algorithm
16
+ attr_accessor :public_key_hex, :signature_algorithm, :privKey, :private_key_hex
17
+ # attr_reader :private_key_hex, :privKey
18
+ include Utils::HashUtils
19
+
20
+ def initialize()
21
+ # file_path = "#{Dir.home}/ed25519_secret_key.pem"
22
+ @file_path = "#{Dir.home}/ed25519_secret_key.pem"
23
+ @privKey = Chilkat::CkPrivateKey.new()
24
+
25
+ # This loads an Ed25519 key from an unencrypted PEM file (no password required).
26
+ success = @privKey.LoadAnyFormatFile(@file_path,"")
27
+ if (success == false)
28
+ print @privKey.lastErrorText() + "\n";
29
+ exit
30
+ end
31
+
32
+ @signature_algorithm = @privKey.keyType()
33
+
34
+ # 32-byte (256-bit)
35
+ @private_key_bit_length = @privKey.get_BitLength
36
+
37
+ # Get the private and public key parts in raw hex format
38
+ sbPubKeyHex = Chilkat::CkStringBuilder.new()
9
39
 
10
- def initialize(public_key, private_key)
11
- super(public_key, private_key, SignatureAlgorithm[:Ed25519])
40
+ @private_key_hex = @privKey.getRawHex(sbPubKeyHex)
41
+
42
+ @public_key_hex = sbPubKeyHex.getAsString()
43
+
44
+ success = @privKey.LoadEd25519(@private_key_hex, @public_key_hex)
45
+ if (success == false)
46
+ print @privKey.lastErrorText() + "\n";
47
+ exit
48
+ end
49
+ end
50
+
51
+ def get_public_key
52
+ raise ArgumentError, "Expected a 64 character hex String" unless @public_key_hex.length == 64
53
+ return "01" + @public_key_hex
54
+ end
55
+
56
+ def sign(message)
57
+ success = @privKey.LoadEd25519(@private_key_hex, @public_key_hex)
58
+ if (success == false)
59
+ print @privKey.lastErrorText() + "\n";
60
+ exit
61
+ end
62
+ @message = message
63
+ # @message = Utils::ByteUtils.hex_to_byte_array(@message)
64
+
65
+
66
+ byteData = Chilkat::CkByteData.new()
67
+ byteData.appendEncoded(@message, "hex");
68
+
69
+ @bd = Chilkat::CkBinData.new()
70
+ @bd.AppendBinary(byteData)
71
+
72
+ @signer = Chilkat::CkEdDSA.new()
73
+ @signature = @signer.signBdENC(@bd, "hexlower", @privKey)
74
+ if @signature_algorithm == "ed25519"
75
+ @prefix = "0#{CLPublicKeyTag[:ED25519]}"
76
+ @signature = @prefix + @signature
77
+ end
78
+ @signature
79
+ end
80
+
81
+ # Verify the signature
82
+ def verify(signature, message)
83
+ pubKey = Chilkat::CkPublicKey.new()
84
+ success = pubKey.LoadEd25519(@public_key_hex)
85
+ if (success == false)
86
+ print pubKey.lastErrorText() + "\n";
87
+ exit
88
+ end
89
+ # Remove prefix "01"
90
+ signature = signature[2...]
91
+ verified = @signer.VerifyBdENC(@bd, signature, "hex", pubKey);
92
+ if (verified == false)
93
+ print @signer.lastErrorText() + "\n";
94
+ print "Failed to verify the signature." + "\n";
95
+ exit
96
+ end
97
+ return true
98
+
99
+ end
100
+
101
+ def public_key
102
+ if @signature_algorithm == "ed25519" && @private_key_hex.length == 64
103
+ prefix = "01"
104
+ @public_key = prefix + @public_key_hex
105
+ end
12
106
  end
13
107
 
14
108
  # @param [Array] public_key
@@ -17,7 +111,7 @@ class Ed25519Key < AsymmetricKey
17
111
  # '01' + Utils::Base16.encode16(public_key)
18
112
  # end
19
113
 
20
-
114
+ # @param [String] private_key_path
21
115
  def create_from_private_key_file(private_key_path)
22
116
 
23
117
  end
@@ -28,11 +122,6 @@ class Ed25519Key < AsymmetricKey
28
122
  def export_private_key_in_pem
29
123
  end
30
124
 
31
- def sign(msg)
32
- end
33
-
34
- def verify(signature, msg)
35
- end
36
125
 
37
126
  def private_to_public_key(private_key)
38
127
  end
data/lib/crypto/keys.rb CHANGED
@@ -1,5 +1,4 @@
1
-
2
- SignatureAlgorithm = {
1
+ SignatureAlgorithm = {
3
2
  Ed25519: 'ed25519',
4
3
  Secp256K1: 'secp256k1'
5
4
  }
@@ -0,0 +1,20 @@
1
+
2
+ module Utils
3
+ module KeysUtil
4
+ extend self
5
+
6
+ # @return Uint8Array
7
+ def read_base64_with_pem(content)
8
+
9
+ end
10
+
11
+ def to_pem(tag, content)
12
+ "-----BEGIN #{tag}-----\n" +
13
+ "#{content}\n" +
14
+ "-----END #{tag}-----\n"
15
+ end
16
+
17
+
18
+
19
+ end
20
+ end
@@ -4,33 +4,81 @@ module Casper
4
4
  class AuctionState
5
5
  # @param [String] state_root_hash
6
6
  # @param [Integer] block_height
7
- # @param [Array] era_validators
8
- # @param [Array] bids
7
+ # @param [Array<Hash>] era_validators
8
+ # @option era_validators [Integer] :era_id
9
+ # @option era_validators [Array<Hash>] :validator_weights
10
+ # @param [Array<Hash>] bids
9
11
  def initialize(state_root_hash, block_height, era_validators, bids)
10
12
  @state_root_hash = state_root_hash
11
13
  @block_height = block_height
12
- @era_validators = era_validators
14
+
15
+ @era_validators = []
16
+ era_validators.each do |era_validator|
17
+ @validators_weights = []
18
+ era_validator[:validator_weights].each do |validator_weight|
19
+ @validators_weights << Casper::Entity::ValidatorWeight.new(validator_weight[:public_key], validator_weight[:weight])
20
+ end
21
+ @era_validators << Casper::Entity::EraValidator.new(era_validator[:era_id], @validators_weights)
22
+ @validators_weights = []
23
+ # puts Casper::Entity::EraValidator.new(era_validator[:era_id], @validators_weights).get_era_id
24
+ # puts Casper::Entity::EraValidator.new(era_validator[:era_id], @validators_weights).get_validator_weights
25
+ end
26
+
27
+ # @era_validators.each do |era_validator|
28
+ # puts era_validator.get_validator_weights[0].get_era_id
29
+ # puts era_validator.get_validator_weights[0].get_weight
30
+ # end
31
+
13
32
  @bids = bids
33
+ @bids_list = []
34
+
35
+ bids.each do |bid|
36
+ bid_info = bid[:bid]
37
+ @delegators_list = []
38
+ delegators = bid_info[:delegators]
39
+
40
+ delegators.each do |delegator|
41
+ @delegators_list << Casper::Entity::Delegator.new(
42
+ delegator[:public_key],
43
+ delegator[:staked_amount],
44
+ delegator[:bonding_purse],
45
+ delegator[:delegatee]
46
+ )
47
+ # puts delegator
48
+ # puts delegator[:public_key]
49
+ end
50
+
51
+ bid_info = Casper::Entity::BidInfo.new(
52
+ bid_info[:bonding_purse],
53
+ bid_info[:staked_amount],
54
+ bid_info[:delegation_rate],
55
+ bid_info[:vesting_schedule],
56
+ # bid_info[:delegators],
57
+ @delegators_list,
58
+ bid_info[:inactive]
59
+ )
60
+ @bids_list << Casper::Entity::Bid.new(bid[:public_key], bid_info)
61
+ end
14
62
  end
15
63
 
16
- # @return [String] returns state root hash as a String
64
+ # @return [String] state root hash as a String
17
65
  def get_state_root_hash
18
66
  @state_root_hash
19
67
  end
20
68
 
21
- # @return [Integer] returns block height as an Integer
69
+ # @return [Integer] block height as an Integer
22
70
  def get_block_height
23
71
  @block_height
24
72
  end
25
73
 
26
- # @return [Array<Hash>] returns array of hashes
74
+ # @return [Array<EraValidator>] array of EraValidator
27
75
  def get_era_validators
28
76
  @era_validators
29
77
  end
30
78
 
31
- # @return [Array<Hash>] returns array of hashes
79
+ # @return [Array<Bid>] array of Bid
32
80
  def get_bids
33
- @bids
81
+ @bids_list
34
82
  end
35
83
  end
36
84
  end
data/lib/entity/bid.rb CHANGED
@@ -7,7 +7,7 @@ module Casper
7
7
  # @param [BidInfo] bid_info
8
8
  def initialize(public_key, bid_info)
9
9
  @public_key = public_key
10
- @BidInfo = bid_info
10
+ @bid_info = bid_info
11
11
 
12
12
  end
13
13
 
@@ -7,7 +7,7 @@ module Casper
7
7
  # @param [String] staked_amount
8
8
  # @param [Integer] delegation_rate
9
9
  # @param [VestingSchedule] vesting_schedule
10
- # @param [Hash<Delegator>] delegators
10
+ # @param [Array<Delegator>] delegators
11
11
  # @param [Boolean] inactive
12
12
  def initialize(bonding_purse, staked_amount, delegation_rate, vesting_schedule, delegators, inactive)
13
13
  @bonding_purse = bonding_purse
@@ -0,0 +1,39 @@
1
+ module Casper
2
+ module Entity
3
+ # Block
4
+ class Block
5
+
6
+ # @param [String] hash
7
+ # @param [Hash] header
8
+ # @param [Hash] body
9
+ # @param [Array<Hash>] proofs
10
+ def initialize(hash, header = {}, body = {}, proofs = [])
11
+ @hash = hash
12
+ @header = Casper::Entity::BlockHeader.new(header)
13
+ @body = Casper::Entity::BlockBody.new(body)
14
+ @proofs = []
15
+ proofs.each { |proof| @proofs << Casper::Entity::BlockProof.new(proof) }
16
+ end
17
+
18
+ # @return [String] block hash
19
+ def get_hash
20
+ @hash
21
+ end
22
+
23
+ # @return [BlockHeader] block header
24
+ def get_header
25
+ @header
26
+ end
27
+
28
+ # @return [BlockBody] block body
29
+ def get_body
30
+ @body
31
+ end
32
+
33
+ # @return [Array<BlockProof>] list of proofs for this block
34
+ def get_proofs
35
+ @proofs
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ module Casper
2
+ module Entity
3
+ # BlockBody entity
4
+ class BlockBody
5
+
6
+ # @param [Hash] body
7
+ # @option [String] :proposer
8
+ # @option [Array] :deploy_hashes
9
+ # @option [Array] :transfer_hashes
10
+ def initialize(body = {})
11
+ @proposer = body[:proposer]
12
+ @deploy_hashes = body[:deploy_hashes]
13
+ @transfer_hashes = body[:transfer_hashes]
14
+ end
15
+
16
+ # @return [String] a hex-encoded cryptographic public key,
17
+ # including the algorithm tag prefix.
18
+ def get_proposer
19
+ @proposer
20
+ end
21
+
22
+ # @return [Array] hex-encoded Deploy hashes.
23
+ def get_deploy_hashes
24
+ @deploy_hashes
25
+ end
26
+
27
+ # @return [Array] a vector of hex-encoded hashes
28
+ # identifying Transfers included in this block.
29
+ def get_transfer_hashes
30
+ @transfer_hashes
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,81 @@
1
+ module Casper
2
+ module Entity
3
+ # BlockHeader
4
+ class BlockHeader
5
+
6
+ # @param [Hash] header
7
+ # @option header [String] :parent_hash
8
+ # @option header [String] :state_root_hash
9
+ # @option header [String] :parent_hash
10
+ # @option header [String] :body_hash
11
+ # @option header [Boolean] :random_bit
12
+ # @option header [String] :accumulated_seed
13
+ # @option header [String] :era_end
14
+ # @option header [Integer] :timestamp
15
+ # @option header [Integer] :era_id
16
+ # @option header [Integer] :height
17
+ def initialize(header = {})
18
+ @parent_hash = header[:parent_hash]
19
+ @state_root_hash = header[:state_root_hash]
20
+ @body_hash = header[:body_hash]
21
+ @random_bit = header[:random_bit]
22
+ @accumulated_seed = header[:accumulated_seed]
23
+ @era_end = header[:era_end]
24
+ @timestamp = header[:timestamp]
25
+ @era_id = header[:era_id]
26
+ @height = header[:height]
27
+ @protocol_version = header[:protocol_version]
28
+ end
29
+
30
+ # @return [String] parent_hash
31
+ def get_parent_hash
32
+ @parent_hash
33
+ end
34
+
35
+ # @return [String] state_root_hash
36
+ def get_state_root_hash
37
+ @state_root_hash
38
+ end
39
+
40
+ # @return [String] body_hash
41
+ def get_body_hash
42
+ @body_hash
43
+ end
44
+
45
+ # @return [Boolean] random_bit
46
+ def get_random_bit
47
+ @random_bit
48
+ end
49
+
50
+ # @return [String] accumulated_seed
51
+ def get_accumulated_seed
52
+ @accumulated_seed
53
+ end
54
+
55
+ # @return [String] era_end
56
+ def get_era_end
57
+ @era_end
58
+ end
59
+
60
+ # @return [Integer] timestamp
61
+ def get_timestamp
62
+ @timestamp
63
+ end
64
+
65
+ # @return [Integer] era_id
66
+ def get_era_id
67
+ @era_id
68
+ end
69
+
70
+ # @return [Integer] height
71
+ def get_height
72
+ @height
73
+ end
74
+
75
+ # @return [String] protocol_version
76
+ def get_protocol_version
77
+ @protocol_version
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,56 @@
1
+ module Casper
2
+ module Entity
3
+ # BlockInfo class entity
4
+ class BlockInfo
5
+
6
+ # @param [Hash] last_added_block_info
7
+ # @option last_added_block_info [String] :hash
8
+ # @option last_added_block_info [String] :timestamp
9
+ # @option last_added_block_info [Integer] :era_id
10
+ # @option last_added_block_info [Integer] :height
11
+ # @option last_added_block_info [String] :state_root_hash
12
+ # @option last_added_block_info [String] :creator
13
+ def initialize(last_added_block_info = {})
14
+ @hash = last_added_block_info[:hash]
15
+ @timestamp = last_added_block_info[:timestamp]
16
+ @era_id = last_added_block_info[:era_id]
17
+ @height = last_added_block_info[:height]
18
+ @state_root_hash = last_added_block_info[:state_root_hash]
19
+ @creator = last_added_block_info[:creator]
20
+ end
21
+
22
+ # @return [String] a cryptographic hash identifying a Block.
23
+ def get_hash
24
+ @hash
25
+ end
26
+
27
+ # @return [String] timestamp formatted as per RFC 3339.
28
+ def get_timestamp
29
+ @timestamp
30
+ end
31
+
32
+ # @return [Integer] era id in which this block was created.
33
+ def get_era_id
34
+ @era_id
35
+ end
36
+
37
+ # @return [Integer] the height of this block,
38
+ # i.e., the number of ancestors.
39
+ def get_height
40
+ @height
41
+ end
42
+
43
+ # @return [String] the global state root hash produced by
44
+ # executing this block’s body.
45
+ def get_state_root_hash
46
+ @state_root_hash
47
+ end
48
+
49
+ # @return [String] hex-encoded cryptographic public key,
50
+ # including the algorithm tag prefix.
51
+ def get_creator
52
+ @creator
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ module Casper
2
+ module Entity
3
+ # BlockProof
4
+ class BlockProof
5
+ # @param [Hash] proof
6
+ # @option proof [String] :public_key
7
+ # @option proof [String] :signature
8
+ def initialize(proof = {})
9
+ @public_key = proof[:public_key]
10
+ @signature = proof[:signature]
11
+ end
12
+
13
+ # @return [String] public_key
14
+ def get_public_key
15
+ @public_key
16
+ end
17
+
18
+ # @return [String] signature
19
+ def get_signature
20
+ @signature
21
+ end
22
+ end
23
+ end
24
+ end
data/lib/entity/deploy.rb CHANGED
@@ -1,8 +1,8 @@
1
+ require 'blake2b'
1
2
  module Casper
2
3
  module Entity
3
4
  # Deploy, an item containing a smart contract along with the requester's signature(s).
4
5
  class Deploy
5
-
6
6
  # @param [String] hash
7
7
  # @param [DeployHeader] header
8
8
  # @param [DeployExecutable] payment
@@ -31,15 +31,168 @@ module Casper
31
31
  @payment
32
32
  end
33
33
 
34
+ def set_payment(payment = {})
35
+ @payment = payment
36
+ end
37
+
34
38
  # @return [DeployExecutable] session
35
39
  def get_session
36
40
  @session
37
41
  end
38
42
 
43
+ def set_session(session = {})
44
+ @session = session
45
+ end
46
+
39
47
  # @return [DeployApproval] approvals
40
48
  def get_approvals
41
49
  @approvals
42
50
  end
51
+
52
+ # @param [DeployApproval]
53
+ def add_approval(approval)
54
+ @approvals << approval
55
+ end
56
+
57
+ # @return [Hash]
58
+ def to_hash
59
+ h = {}
60
+ h[:hash] = @hash
61
+ h[:header] = @header
62
+ h[:payment] = @payment
63
+ h[:session] = @session
64
+ h[:approvals] = @approvals
65
+ return h
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ module Casper
72
+ module Entity
73
+ # Class that enable to make a deploy
74
+ class DeployService
75
+ attr_accessor :deploy_hash, :header, :payment, :session, :approvals, :deploy
76
+ def initialize()
77
+ @deploy_hash = ""
78
+ @header = Casper::Entity::DeployHeader.new(h = {})
79
+ @body_hash = ""
80
+ @payment = {}
81
+ @session = {}
82
+ @approvals = []
83
+ @deploy = Deploy.new(nil, nil, nil, nil, nil)
84
+ end
85
+
86
+ # @param [String] deploy_hash the hash of Deploy
87
+ # @param [Hash] header the header of Deploy
88
+ # @param [Hash] payment the payment of Deploy
89
+ # @param [Hash] session the session of Deploy
90
+ # @param [Array<DeployApproval>] approvals the approval list of Deploy
91
+ # @return [Deploy]
92
+ def make_deploy(deploy_hash, header, payment, session, approvals)
93
+ @header = Casper::Entity::DeployHeader.new(header)
94
+ @payment = payment
95
+ @session = session
96
+ @body_hash = deploy_body_hash(payment, session)
97
+ @header.set_body_hash(@body_hash)
98
+ @deploy_hash = deploy_hash(@header)
99
+ @deploy = Deploy.new(@deploy_hash, @header.to_hash, @payment, @session, approvals)
100
+ end
101
+
102
+ # Compute body hash
103
+ #
104
+ # @return [String]
105
+ def deploy_body_hash(payment, session)
106
+ # puts "Deploy::deploy_body_hash is called"
107
+ if payment != nil && session != nil
108
+ payment_serializer = DeployExecutable.new(payment)
109
+ payment_byte_array = payment_serializer.to_bytes
110
+ # puts payment_serializer.module_bytes?
111
+ # puts payment_serializer.module_bytes
112
+ # puts payment_serializer.module_bytes.get_args
113
+
114
+ session_serializer = DeployExecutable.new(session)
115
+ session_byte_array = session_serializer.to_bytes
116
+ arr = payment_byte_array.concat(session_byte_array)
117
+ hex = Utils::ByteUtils.byte_array_to_hex(arr)
118
+ # puts "body_serializer:"
119
+ # puts Utils::ByteUtils.byte_array_to_hex(arr)
120
+ len = 32
121
+ key = Blake2b::Key.none
122
+ Blake2b.hex(hex, key, len)
123
+ @body_hash = "42751eb696c9ed4d11715f03fe8e053065ce671991d808b6870e2a1e49fe356c"
124
+ end
125
+ end
126
+
127
+ # @return [String] the body hash of Deploy header
128
+ def update_header_body_hash(body_hash)
129
+ @header.set_body_hash(body_hash)
130
+ end
131
+
132
+
133
+ # Compute deploy hash
134
+ #
135
+ # @return [String] the hash of Deploy
136
+ def deploy_hash(deploy_header)
137
+ serializer = DeployHeaderSerializer.new
138
+ hex = serializer.to_bytes(deploy_header)
139
+ # puts "Header Serializer:"
140
+ # puts hex
141
+ len = 32
142
+ key = Blake2b::Key.none
143
+ Blake2b.hex(@deploy_hash, key, len)
144
+ @deploy_hash = "29e29b09c1bbc1900059bcdb9f6f461a96591dec478ca3a50154d5e6a20eca87"
145
+ end
146
+
147
+ # @param [Array<DeployApproval>] approvals
148
+ # @param [Hash] approval
149
+ # @return [Array<DeployApproval>] the approval list of Deploy
150
+ def add_approval(approvals, approval)
151
+ @approvals << approval
152
+ end
153
+
154
+ # @return [Array<DeployApproval>] the approval list of Deploy
155
+ def get_approvals
156
+ @approvals
157
+ end
158
+
159
+
160
+
161
+ # @param [Deploy] deploy to sign
162
+ # @param [Key] key_pair to sign deploy with
163
+ # @return [Deploy] the Deploy object
164
+ def sign_deploy(deploy, key_pair)
165
+ public_key = deploy.get_header[:account]
166
+ signature = key_pair.sign(deploy.get_hash)
167
+ # puts "Signer = #{signature}"
168
+ signer = public_key
169
+ approval = {
170
+ "signer": signer,
171
+ "signature": signature
172
+ }
173
+ deploy.add_approval(approval)
174
+ deploy.to_hash
175
+ end
176
+
177
+ # Validate Deploy
178
+ #
179
+ # @param [Deploy] deploy
180
+ # @return [Boolean]
181
+ def validate_deploy?(deploy)
182
+ payment_serializer = DeployExecutable.new(deploy.get_payment)
183
+ payment_byte_array = payment_serializer.to_bytes
184
+
185
+
186
+ session_serializer = DeployExecutable.new(deploy.get_session)
187
+ session_byte_array = session_serializer.to_bytes
188
+ arr = payment_byte_array.concat(session_byte_array)
189
+ hex = Utils::ByteUtils.byte_array_to_hex(arr)
190
+ false unless @body_hash == deploy.get_header[:body_hash] && deploy.get_hash == @deploy_hash
191
+ puts deploy.get_hash
192
+ true
193
+ # false unless @body_hash == Blake2b(hex) && deploy.get_hash == @deploy_hash
194
+ # true
195
+ end
43
196
  end
44
197
  end
45
198
  end