casper_network 1.0.2 → 1.1.2
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 +221 -78
- data/lib/casper_network.rb +7 -4
- data/lib/crypto/asymmetric_key.rb +19 -18
- data/lib/crypto/ed25519.rb +114 -0
- data/lib/crypto/ed25519_key.rb +111 -10
- data/lib/crypto/keys.rb +1 -2
- data/lib/crypto/keys_util.rb +20 -0
- data/lib/entity/deploy.rb +154 -1
- data/lib/entity/deploy_executable.rb +50 -7
- data/lib/entity/deploy_executable_item_internal.rb +1 -1
- data/lib/entity/deploy_header.rb +17 -0
- data/lib/entity/deploy_named_argument.rb +61 -2
- data/lib/entity/module_bytes.rb +9 -2
- data/lib/include.rb +2 -0
- data/lib/serialization/cl_value_serializer.rb +69 -12
- data/lib/serialization/deploy_serializer.rb +129 -15
- data/lib/types/cl_option.rb +9 -1
- data/lib/types/cl_public_key.rb +2 -0
- data/lib/types/cl_value.rb +8 -0
- data/lib/utils/byte_utils.rb +28 -0
- data/lib/utils/helpers.rb +10 -0
- data/lib/version.rb +1 -1
- data/spec/cl_value_serializer_spec.rb +15 -1
- data/spec/deploy_executable_spec.rb +90 -0
- data/spec/testnet_spec.rb +5 -3
- metadata +7 -24
- data/lib/crypto/00_asymmetric_key.rb +0 -95
- data/lib/crypto/01_ed25519.rb +0 -67
- data/lib/crypto/key_pair.rb +0 -40
- data/lib/crypto/secp256k1_key.rb +0 -0
- data/lib/crypto/test_ed25519_key.rb +0 -44
- data/lib/entity/executable_deploy_item.rb +0 -11
- data/lib/serialization/test.rb +0 -431
- data/lib/types/cl_account_hash.rb +0 -24
- data/lib/types/cl_account_hash_type.rb +0 -22
- data/lib/utils/utils.rb +0 -2
- data/spec/a_spec.rb +0 -697
- data/spec/cl_public_spec.rb +0 -169
- data/spec/crypto_spec.rb +0 -42
- data/spec/deploy_executable_serializer_spec.rb +0 -0
- data/spec/deploy_serializer_test_spec.rb +0 -225
- data/spec/string_spec.rb +0 -68
data/lib/crypto/keys.rb
CHANGED
@@ -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
|
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] approval
|
53
|
+
def add_approval(approval)
|
54
|
+
@approvals << approval
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [Hash] header as a 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
|
@@ -1,26 +1,68 @@
|
|
1
1
|
require_relative './deploy_named_argument.rb'
|
2
2
|
require_relative './module_bytes.rb'
|
3
3
|
require_relative './deploy_executable_transfer.rb'
|
4
|
-
|
4
|
+
require_relative '../utils/helpers.rb'
|
5
|
+
require_relative '../serialization/deploy_serializer.rb'
|
5
6
|
module Casper
|
6
7
|
module Entity
|
7
8
|
# DeployExecutable
|
8
9
|
class DeployExecutable
|
10
|
+
include Utils::Helpers
|
9
11
|
attr_accessor :module_bytes, :transfer, :stored_contract_by_hash, :stored_contract_by_name,
|
10
12
|
:stored_versioned_contract_by_hash, :stored_versioned_contract_by_name
|
11
|
-
|
12
|
-
|
13
|
+
|
14
|
+
def initialize(h = {})
|
15
|
+
deploy_serializer = DeploySerializer.new()
|
16
|
+
temp_args = []
|
17
|
+
deploy_serializer = DeploySerializer.new
|
18
|
+
if h.keys[0] == :ModuleBytes
|
19
|
+
args = h[:ModuleBytes][:args]
|
20
|
+
args.each do |arg|
|
21
|
+
name1 = arg[0]
|
22
|
+
clvalue_hash = arg[1]
|
23
|
+
clvalue = deploy_serializer.build_cl_value(arg[1])
|
24
|
+
|
25
|
+
temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
|
26
|
+
end
|
27
|
+
@module_bytes = Casper::Entity::ModuleBytes.new(h[:ModuleBytes][:module_bytes], temp_args)
|
28
|
+
elsif h.keys[0] == :Transfer
|
29
|
+
temp_args = []
|
30
|
+
args = h[:Transfer][:args]
|
31
|
+
|
32
|
+
transfer = Casper::Entity::DeployExecutableTransfer.new(args)
|
33
|
+
|
34
|
+
args.each do |arg|
|
35
|
+
name1 = arg[0]
|
36
|
+
if name1 == "amount" || name1 == "target"
|
37
|
+
clvalue_hash = arg[1]
|
38
|
+
clvalue = deploy_serializer.build_cl_value(arg[1])
|
39
|
+
temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
|
40
|
+
elsif name1 == "id"
|
41
|
+
bytes = arg[1][:bytes]
|
42
|
+
parsed = arg[1][:parsed]
|
43
|
+
h = arg[1][:cl_type]
|
44
|
+
key, value = h.first
|
45
|
+
cl_type = h.keys[0]
|
46
|
+
inner_type = value
|
47
|
+
|
48
|
+
inner_clvalue = Utils::Helpers.construct_inner_clvalue(inner_type, parsed)
|
49
|
+
clvalue = CLOption.new(inner_clvalue, inner_type)
|
50
|
+
|
51
|
+
temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@transfer = Casper::Entity::DeployExecutableTransfer.new(temp_args)
|
55
|
+
end
|
13
56
|
@stored_contract_by_hash = nil
|
14
57
|
@stored_contract_by_name = nil
|
15
58
|
@stored_versioned_contract_by_hash = nil
|
16
59
|
@stored_versioned_contract_by_name = nil
|
17
|
-
@transfer = nil
|
18
60
|
end
|
19
61
|
|
20
62
|
def standard_payment(payment_amount)
|
21
63
|
@module_bytes = ModuleBytes.new("", [])
|
22
64
|
arg = DeployNamedArgument.new("amount", CLu512.new(payment_amount))
|
23
|
-
@module_bytes.set_arg(arg)
|
65
|
+
@module_bytes.set_arg(arg)
|
24
66
|
@module_bytes
|
25
67
|
end
|
26
68
|
|
@@ -154,9 +196,10 @@ module Casper
|
|
154
196
|
elsif stored_versioned_contract_by_hash?
|
155
197
|
@stored_versioned_contract_by_hash.to_bytes
|
156
198
|
elsif transfer?
|
157
|
-
@transfer.to_bytes
|
199
|
+
@transfer.to_bytes
|
200
|
+
else
|
201
|
+
raise "failed to serialize ExecutableDeployItemJsonWrapper"
|
158
202
|
end
|
159
|
-
raise "failed to serialize ExecutableDeployItemJsonWrapper"
|
160
203
|
end
|
161
204
|
end
|
162
205
|
end
|
data/lib/entity/deploy_header.rb
CHANGED
@@ -47,6 +47,10 @@ module Casper
|
|
47
47
|
@body_hash
|
48
48
|
end
|
49
49
|
|
50
|
+
def set_body_hash(body_hash)
|
51
|
+
@body_hash = body_hash
|
52
|
+
end
|
53
|
+
|
50
54
|
# @return [Array] dependencies
|
51
55
|
def get_dependencies
|
52
56
|
@dependencies
|
@@ -56,6 +60,19 @@ module Casper
|
|
56
60
|
def get_chain_name
|
57
61
|
@chain_name
|
58
62
|
end
|
63
|
+
|
64
|
+
# @return [Hash] Deploy header
|
65
|
+
def to_hash
|
66
|
+
header = {}
|
67
|
+
header[:ttl] = @ttl
|
68
|
+
header[:account] = @account
|
69
|
+
header[:body_hash] = @body_hash
|
70
|
+
header[:gas_price] = @gas_price
|
71
|
+
header[:timestamp] = @timestamp
|
72
|
+
header[:chain_name] = @chain_name
|
73
|
+
header[:dependencies] = @dependencies
|
74
|
+
return header
|
75
|
+
end
|
59
76
|
end
|
60
77
|
end
|
61
78
|
end
|
@@ -5,7 +5,7 @@ module Casper
|
|
5
5
|
|
6
6
|
def initialize(name, clvalue)
|
7
7
|
@name = name
|
8
|
-
@
|
8
|
+
@clvalue = clvalue
|
9
9
|
end
|
10
10
|
|
11
11
|
def get_name
|
@@ -13,7 +13,66 @@ module Casper
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def get_value
|
16
|
-
@
|
16
|
+
@clvalue
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Array] byte array containing two's complement
|
20
|
+
#
|
21
|
+
def to_byte_array(num)
|
22
|
+
result = []
|
23
|
+
begin
|
24
|
+
result << (num & 0xff)
|
25
|
+
num >>= 8
|
26
|
+
end until (num == 0 || num == -1) && (result.last[7] == num[7])
|
27
|
+
# result.reverse
|
28
|
+
result
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
def to_hash
|
34
|
+
serializer = CLValueSerializer.new
|
35
|
+
value = @clvalue.get_value
|
36
|
+
type = @clvalue.get_cl_type
|
37
|
+
if @name == "amount"
|
38
|
+
bytes = Utils::ByteUtils.byte_array_to_hex(to_byte_array(value))[0...-2]
|
39
|
+
num_of_bytes = bytes.length/2
|
40
|
+
[num_of_bytes].pack("C*").unpack1("H*") + bytes
|
41
|
+
[
|
42
|
+
@name,
|
43
|
+
{
|
44
|
+
"bytes": [num_of_bytes].pack("C*").unpack1("H*") + bytes,
|
45
|
+
"parsed": @clvalue.get_value,
|
46
|
+
"cl_type": @clvalue.get_cl_type
|
47
|
+
}
|
48
|
+
]
|
49
|
+
elsif @name == "target" && type == "PublicKey"
|
50
|
+
[
|
51
|
+
@name,
|
52
|
+
{
|
53
|
+
"bytes": @clvalue.to_hex,
|
54
|
+
"parsed": @clvalue.to_hex,
|
55
|
+
"cl_type": @clvalue.get_cl_type
|
56
|
+
}
|
57
|
+
]
|
58
|
+
elsif @name == "id"
|
59
|
+
data = @clvalue.get_value
|
60
|
+
inner_type = data.get_cl_type
|
61
|
+
inner_value = data.get_value
|
62
|
+
parsed = inner_value
|
63
|
+
bytes = "01" + serializer.only_value(data)
|
64
|
+
[
|
65
|
+
@name,
|
66
|
+
{
|
67
|
+
"bytes": bytes,
|
68
|
+
"parsed": parsed,
|
69
|
+
"cl_type": {
|
70
|
+
"#{type}": inner_type
|
71
|
+
}
|
72
|
+
}
|
73
|
+
]
|
74
|
+
end
|
75
|
+
|
17
76
|
end
|
18
77
|
end
|
19
78
|
end
|
data/lib/entity/module_bytes.rb
CHANGED
@@ -7,34 +7,39 @@ module Casper
|
|
7
7
|
|
8
8
|
# @param [String] module_bytes
|
9
9
|
# @param [Array<Array<DeployNamedArgument>>] args
|
10
|
-
def initialize(module_bytes
|
10
|
+
def initialize(module_bytes, args = [])
|
11
11
|
@tag = 0
|
12
12
|
@module_bytes = module_bytes
|
13
13
|
@args = args
|
14
14
|
end
|
15
15
|
|
16
|
+
# @return [Integer] the tag value
|
16
17
|
def get_tag
|
17
18
|
@tag
|
18
19
|
end
|
19
20
|
|
21
|
+
# @return [String] the module bytes
|
20
22
|
def get_module_bytes
|
21
23
|
@module_bytes
|
22
24
|
end
|
23
25
|
|
26
|
+
# @return [Array<DeployNamedArgument>] an array of DeployNamedArgument objects
|
24
27
|
def get_args
|
25
28
|
@args
|
26
29
|
end
|
27
30
|
|
31
|
+
# @param [DeployNamedArgument] deploy_named_arg
|
32
|
+
# @return [Array<DeployNamedArgument>] an array of DeployNamedArgument objects
|
28
33
|
def set_arg(deploy_named_arg)
|
29
34
|
@args << [deploy_named_arg]
|
30
35
|
end
|
31
36
|
|
37
|
+
# @return [Array<Integer>] the byte serialization of ModuleByte object
|
32
38
|
def to_bytes
|
33
39
|
bytes = ""
|
34
40
|
serializer = DeployNamedArgSerializer.new
|
35
41
|
num_of_args = @args.length
|
36
42
|
bytes += Utils::ByteUtils.to_u8(@tag)
|
37
|
-
|
38
43
|
if @module_bytes == ""
|
39
44
|
bytes += Utils::ByteUtils.to_u32(0)
|
40
45
|
end
|
@@ -45,7 +50,9 @@ module Casper
|
|
45
50
|
end
|
46
51
|
end
|
47
52
|
Utils::ByteUtils.hex_to_byte_array(bytes)
|
53
|
+
# bytes
|
48
54
|
end
|
55
|
+
|
49
56
|
end
|
50
57
|
end
|
51
58
|
end
|
data/lib/include.rb
CHANGED
@@ -7,6 +7,8 @@ Dir[File.join(
|
|
7
7
|
File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/rpc/*.rb")].each {|file| require file }
|
8
8
|
Dir[File.join(
|
9
9
|
File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/utils/*.rb")].each {|file| require file }
|
10
|
+
# Dir[File.join(
|
11
|
+
# File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/crypto/*.rb")].each {|file| require file }
|
10
12
|
# path = File.join(
|
11
13
|
# File.dirname(File.dirname(File.absolute_path(__FILE__))),
|
12
14
|
# '/lib/types/cl_bool'
|
@@ -18,20 +18,26 @@ require_relative '../types/cl_uref.rb'
|
|
18
18
|
require_relative '../types/cl_tuple.rb'
|
19
19
|
require_relative '../types/cl_public_key.rb'
|
20
20
|
require_relative '../types/constants.rb'
|
21
|
-
require_relative '
|
21
|
+
require_relative './cl_value_bytes_parsers.rb'
|
22
|
+
require_relative '../utils/byte_utils.rb'
|
22
23
|
|
23
24
|
# Byte serializer for CLValue
|
24
25
|
class CLValueSerializer
|
26
|
+
def to_byte_array(num)
|
27
|
+
result = []
|
28
|
+
begin
|
29
|
+
result << (num & 0xff)
|
30
|
+
num >>= 8
|
31
|
+
end until (num == 0 || num == -1) && (result.last[7] == num[7])
|
32
|
+
# result.reverse
|
33
|
+
result
|
34
|
+
end
|
25
35
|
|
26
36
|
def to_bytes(clvalue)
|
27
37
|
type = clvalue.get_cl_type
|
28
38
|
value = clvalue.get_value
|
29
39
|
tag = CLType::TAGS[type.to_sym]
|
30
|
-
|
31
|
-
# puts value
|
32
|
-
# puts CLType::TAGS[type.to_sym]
|
33
|
-
# puts tag
|
34
|
-
[1].pack("L<*").unpack1("H*")
|
40
|
+
|
35
41
|
serialized = ""
|
36
42
|
if type == "Bool"
|
37
43
|
[1].pack("L<*").unpack1("H*") + [value.to_i].pack("C*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
|
@@ -50,7 +56,9 @@ class CLValueSerializer
|
|
50
56
|
elsif type == "U256"
|
51
57
|
[8].pack("L<*").unpack1("H*")
|
52
58
|
elsif type == "U512"
|
53
|
-
|
59
|
+
bytes = Utils::ByteUtils.byte_array_to_hex(to_byte_array(value))[0...-2]
|
60
|
+
num_of_bytes = bytes.length/2
|
61
|
+
[num_of_bytes+1].pack("L<*").unpack1("H*") + [num_of_bytes].pack("C*").unpack1("H*") + bytes + [tag].pack("C*").unpack1("H*")
|
54
62
|
elsif type == "Unit"
|
55
63
|
[0].pack("L<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
|
56
64
|
elsif type == "String"
|
@@ -63,7 +71,31 @@ class CLValueSerializer
|
|
63
71
|
size = clvalue.to_bytes(uref).length/2
|
64
72
|
[size].pack("L<*").unpack1("H*") + clvalue.to_bytes(uref) + [tag].pack("C*").unpack1("H*")
|
65
73
|
elsif type == "Option"
|
66
|
-
|
74
|
+
=begin
|
75
|
+
# Solution 1, If we choose
|
76
|
+
# CLOption.new(data, inner_type) = CLOption.new({ "cl_type": inner_type, "bytes": bytes, "parsed": parsed), "U64")
|
77
|
+
inner_type = value[:cl_type]
|
78
|
+
bytes = value[:bytes]
|
79
|
+
parsed = value[:parsed]
|
80
|
+
data = { "cl_type": inner_type, "bytes": bytes, "parsed": parsed}
|
81
|
+
serialize_option_cl_value(data)
|
82
|
+
=end
|
83
|
+
inner_clvalue = value # => CLu64.new(1)
|
84
|
+
inner_value = value.get_value
|
85
|
+
inner_type = value.get_cl_type
|
86
|
+
# or
|
87
|
+
# inner_type = clvalue.get_inner_type
|
88
|
+
|
89
|
+
# puts "inner_clvalue #{inner_clvalue}"
|
90
|
+
inner_type = clvalue.get_inner_type # => or
|
91
|
+
inner_type = value.get_cl_type
|
92
|
+
# puts "inner_type = #{inner_type}"
|
93
|
+
# puts inner_value
|
94
|
+
bytes = Utils::ByteUtils.to_u64(inner_value)
|
95
|
+
bytes = "01" + bytes
|
96
|
+
length = bytes.size/2
|
97
|
+
tag = CLType::TAGS[inner_type.to_sym]
|
98
|
+
[length].pack("L<*").unpack1("H*") + bytes + "0d" + [tag].pack("C*").unpack1("H*")
|
67
99
|
elsif type == "List"
|
68
100
|
[0].pack("L<*").unpack1("H*")
|
69
101
|
elsif type == "ByteArray"
|
@@ -78,7 +110,6 @@ class CLValueSerializer
|
|
78
110
|
value1 = clvalue1.get_value
|
79
111
|
tag1 = CLType::TAGS[type1.to_sym]
|
80
112
|
serialized += helper(clvalue.get_value[0]) + [tag].pack("C*").unpack1("H*") + [tag1].pack("C*").unpack1("H*")
|
81
|
-
# [18].pack("C*").unpack1("H*") + cl_type.get_data[0].to_bytes
|
82
113
|
elsif type == "Tuple2"
|
83
114
|
clvalue1 = clvalue.get_value[0]
|
84
115
|
type1 = clvalue1.get_cl_type
|
@@ -134,7 +165,8 @@ class CLValueSerializer
|
|
134
165
|
elsif type == "U8"
|
135
166
|
[1].pack("L<*").unpack1("H*") + [value].pack("C*").unpack1("H*")
|
136
167
|
elsif type == "U32"
|
137
|
-
serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
|
168
|
+
# serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
|
169
|
+
[4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
|
138
170
|
elsif type == "U64"
|
139
171
|
[8].pack("L<*").unpack1("H*") + [value].pack("Q<*").unpack1("H*")
|
140
172
|
elsif type == "U128"
|
@@ -142,7 +174,9 @@ class CLValueSerializer
|
|
142
174
|
elsif type == "U256"
|
143
175
|
[8].pack("L<*").unpack1("H*")
|
144
176
|
elsif type == "U512"
|
145
|
-
[
|
177
|
+
bytes = [value].pack("Q<*").unpack1("H*")
|
178
|
+
bytes = bytes[0, 8]
|
179
|
+
[8].pack("Q<*").unpack1("H*")
|
146
180
|
elsif type == "Unit"
|
147
181
|
[9].pack("C*").unpack1("H*")
|
148
182
|
elsif type == "String"
|
@@ -257,4 +291,27 @@ class CLValueSerializer
|
|
257
291
|
"Undefined"
|
258
292
|
end
|
259
293
|
end
|
260
|
-
|
294
|
+
|
295
|
+
def serialize_option_cl_value(data)
|
296
|
+
|
297
|
+
=begin
|
298
|
+
# Solution 1
|
299
|
+
# puts "\nOption:"
|
300
|
+
cl_type = data[:cl_type]
|
301
|
+
bytes = data[:bytes]
|
302
|
+
parsed = data[:parsed]
|
303
|
+
|
304
|
+
if cl_type == "U64"
|
305
|
+
length = bytes.length/2
|
306
|
+
# puts length
|
307
|
+
bytes = bytes[2..]
|
308
|
+
value = Utils::ByteUtils.hex_to_u64_value(bytes)
|
309
|
+
# puts value == 1650706686882
|
310
|
+
clvalue = CLu64.new(value)
|
311
|
+
tag = CLType::TAGS[cl_type.to_sym]
|
312
|
+
# puts "U64: " + [length].pack("L<*").unpack1("H*") + "01" + bytes + "0d" + [tag].pack("C*").unpack1("H*")
|
313
|
+
[length].pack("L<*").unpack1("H*") + "01" + bytes + "0d" + [tag].pack("C*").unpack1("H*")
|
314
|
+
end
|
315
|
+
=end
|
316
|
+
end
|
317
|
+
end
|