casper_network 0.2.1 → 1.0.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 +15 -4
- data/lib/casper_network.rb +62 -7
- data/lib/crypto/00_asymmetric_key.rb +95 -0
- data/lib/crypto/01_ed25519.rb +67 -0
- data/lib/crypto/asymmetric_key.rb +87 -0
- data/lib/crypto/ed25519_key.rb +44 -0
- data/lib/crypto/key_pair.rb +40 -0
- data/lib/crypto/keys.rb +7 -0
- data/lib/crypto/secp256k1_key.rb +0 -0
- data/lib/crypto/test_ed25519_key.rb +44 -0
- data/lib/entity/account.rb +45 -0
- data/lib/entity/action_thresholds.rb +25 -0
- data/lib/entity/associated_key.rb +24 -0
- data/lib/entity/contract.rb +47 -0
- data/lib/entity/contract_package.rb +41 -0
- data/lib/entity/contract_version.rb +33 -0
- data/lib/entity/deploy_approval.rb +7 -6
- data/lib/entity/deploy_executable.rb +154 -1
- data/lib/entity/deploy_executable_item_internal.rb +26 -0
- data/lib/entity/deploy_executable_transfer.rb +50 -0
- data/lib/entity/deploy_header.rb +17 -15
- data/lib/entity/deploy_info.rb +44 -0
- data/lib/entity/deploy_named_argument.rb +19 -0
- data/lib/entity/deploy_transfer.rb +10 -0
- data/lib/entity/disabled_version.rb +26 -0
- data/lib/entity/era_info.rb +18 -0
- data/lib/entity/executable_deploy_item.rb +11 -0
- data/lib/entity/group.rb +25 -0
- data/lib/entity/module_bytes.rb +50 -0
- data/lib/entity/seigniorage_allocation.rb +18 -0
- data/lib/entity/stored_contract_by_hash.rb +50 -0
- data/lib/entity/stored_contract_by_name.rb +50 -0
- data/lib/entity/stored_value.rb +57 -0
- data/lib/entity/stored_versioned_contract_by_hash.rb +61 -0
- data/lib/entity/stored_versioned_contract_by_name.rb +61 -0
- data/lib/entity/transfer.rb +65 -0
- data/lib/entity/vesting_schedule.rb +22 -0
- data/lib/include.rb +18 -0
- data/lib/rpc/rpc.rb +227 -0
- data/lib/rpc/rpc_client.rb +45 -39
- data/lib/serialization/cl_type_serializer.rb +76 -0
- data/lib/serialization/cl_value_bytes_parsers.rb +498 -0
- data/lib/serialization/cl_value_serializer.rb +259 -0
- data/lib/serialization/deploy_approval_serializer.rb +15 -0
- data/lib/serialization/deploy_executable_serializer.rb +26 -0
- data/lib/serialization/deploy_header_serializer.rb +49 -0
- data/lib/serialization/deploy_named_arg_serializer.rb +19 -0
- data/lib/serialization/deploy_serializer.rb +268 -0
- data/lib/serialization/test.rb +431 -0
- data/lib/types/cl_account_hash.rb +24 -0
- data/lib/types/cl_account_hash_type.rb +22 -0
- data/lib/types/cl_any.rb +25 -0
- data/lib/types/cl_any_type.rb +22 -0
- data/lib/types/cl_bool.rb +32 -0
- data/lib/types/cl_bool_type.rb +35 -0
- data/lib/types/cl_byte_array.rb +25 -0
- data/lib/types/cl_byte_array_type.rb +27 -0
- data/lib/types/cl_i32.rb +26 -0
- data/lib/types/cl_i32_type.rb +26 -0
- data/lib/types/cl_i64.rb +26 -0
- data/lib/types/cl_i64_type.rb +27 -0
- data/lib/types/cl_key.rb +39 -0
- data/lib/types/cl_key_type.rb +27 -0
- data/lib/types/cl_list.rb +25 -0
- data/lib/types/cl_list_type.rb +26 -0
- data/lib/types/cl_map.rb +25 -0
- data/lib/types/cl_map_type.rb +26 -0
- data/lib/types/cl_option.rb +33 -0
- data/lib/types/cl_option_type.rb +52 -0
- data/lib/types/cl_public_key.rb +152 -0
- data/lib/types/cl_public_key_type.rb +26 -0
- data/lib/types/cl_result.rb +25 -0
- data/lib/types/cl_result_type.rb +26 -0
- data/lib/types/cl_string.rb +39 -0
- data/lib/types/cl_string_type.rb +32 -0
- data/lib/types/cl_tuple.rb +151 -0
- data/lib/types/cl_tuple_type.rb +108 -0
- data/lib/types/cl_type.rb +94 -0
- data/lib/types/cl_type_tag.rb +51 -0
- data/lib/types/cl_u128.rb +26 -0
- data/lib/types/cl_u128_type.rb +26 -0
- data/lib/types/cl_u256.rb +26 -0
- data/lib/types/cl_u256_type.rb +26 -0
- data/lib/types/cl_u32.rb +26 -0
- data/lib/types/cl_u32_type.rb +26 -0
- data/lib/types/cl_u512.rb +26 -0
- data/lib/types/cl_u512_type.rb +26 -0
- data/lib/types/cl_u64.rb +26 -0
- data/lib/types/cl_u64_type.rb +27 -0
- data/lib/types/cl_u8.rb +26 -0
- data/lib/types/cl_u8_type.rb +26 -0
- data/lib/types/cl_unit.rb +38 -0
- data/lib/types/cl_unit_type.rb +22 -0
- data/lib/types/cl_uref.rb +119 -0
- data/lib/types/cl_uref_type.rb +46 -0
- data/lib/types/cl_value.rb +10 -0
- data/lib/types/constants.rb +50 -0
- data/lib/types/error.rb +7 -0
- data/lib/utils/base_16.rb +18 -0
- data/lib/utils/byte_utils.rb +107 -0
- data/lib/utils/find_byte_parser_by_cl_type.rb +53 -0
- data/lib/utils/hash_utils.rb +19 -0
- data/lib/utils/hex_utils.rb +12 -0
- data/lib/utils/time_utils.rb +85 -0
- data/lib/utils/utils.rb +2 -0
- data/lib/version.rb +3 -0
- data/spec/a_spec.rb +697 -0
- data/spec/byte_utils_spec.rb +72 -0
- data/spec/cl_public_spec.rb +169 -0
- data/spec/cl_types_spec.rb +715 -0
- data/spec/cl_value_serializer_spec.rb +140 -0
- data/spec/client_spec.rb +20 -20
- data/spec/crypto_spec.rb +42 -0
- data/spec/deploy_approval_serializer_spec.rb +26 -0
- data/spec/deploy_executable_serializer_spec.rb +0 -0
- data/spec/deploy_header_serializer_spec.rb +21 -0
- data/spec/deploy_named_arg_serializer_spec.rb +49 -0
- data/spec/deploy_serializer_spec.rb +77 -0
- data/spec/deploy_serializer_test_spec.rb +225 -0
- data/spec/mainnet_spec.rb +8 -8
- data/spec/string_spec.rb +68 -0
- data/spec/testnet_spec.rb +11 -11
- data/spec/time_utils_spec.rb +87 -0
- metadata +130 -2
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLI32Type < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(1).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[1].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
data/lib/types/cl_i64.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_i64_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLi64 < CLValue
|
8
|
+
include CLValueBytesParsers::CLI64BytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
raise "error" unless value.instance_of? Integer
|
12
|
+
super
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_cl_type
|
17
|
+
@cl_type = CLI64Type.new
|
18
|
+
@cl_type.to_string
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_value
|
22
|
+
@value
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLI64Type < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(2).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[2].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/lib/types/cl_key.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative './cl_key_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
=begin
|
5
|
+
Key values serialize as a single byte tag representing the variant, followed by the serialization of the data that variant contains.
|
6
|
+
For most variants, this is simply a fixed-length 32-byte array.
|
7
|
+
The exception is Key::URef, which contains a URef; so its data serializes per the description above.
|
8
|
+
The tags are as follows: Key::Account serializes as 0, Key::Hash as 1, Key::URef as 2.
|
9
|
+
=end
|
10
|
+
|
11
|
+
|
12
|
+
KEY_TYPE_ACCOUNT = 0
|
13
|
+
KEY_TYPE_HASH = 1
|
14
|
+
KEY_TYPE_UREF = 2
|
15
|
+
|
16
|
+
# ACCOUNT_HASH_ID = 'AccountHash'
|
17
|
+
ACCOUNT_HASH_LENGTH = 32
|
18
|
+
|
19
|
+
# UREF_ID = 'URef'
|
20
|
+
|
21
|
+
class CLKey < CLValue
|
22
|
+
include CLValueBytesParsers::CLKeyBytesParser
|
23
|
+
|
24
|
+
def initialize(value)
|
25
|
+
super
|
26
|
+
@value = value
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_cl_type
|
30
|
+
@cl_type = CLKeyType.new
|
31
|
+
@cl_type.to_string
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_value
|
35
|
+
@value
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLKeyType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(11).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[11].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_list_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLList < CLValue
|
8
|
+
include CLValueBytesParsers::CLListBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLListType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLListType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(14).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[14].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
data/lib/types/cl_map.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_map_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLMap < CLValue
|
8
|
+
include CLValueBytesParsers::CLMapBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLMapType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLMapType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(17).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[17].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative './cl_option_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
=begin
|
6
|
+
https://doc.rust-lang.org/stable/std/option/
|
7
|
+
=end
|
8
|
+
|
9
|
+
class CLOption < CLValue
|
10
|
+
include CLValueBytesParsers::CLOptionBytesParser
|
11
|
+
|
12
|
+
def initialize(data = nil, inner_type = nil)
|
13
|
+
super
|
14
|
+
@data = data
|
15
|
+
@inner_type = inner_type
|
16
|
+
if data == nil && inner_type == nil
|
17
|
+
raise ArgumentError.new("You had to assign innerType for None")
|
18
|
+
elsif data == nil && inner_type != nil
|
19
|
+
@inner_type = inner_type
|
20
|
+
else
|
21
|
+
@inner_type = data.get_cl_type
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_value
|
26
|
+
@data
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_cl_type
|
30
|
+
CLOptionType.new(@inner_type)
|
31
|
+
@inner_type
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './cl_bool.rb'
|
3
|
+
require_relative './cl_bool_type.rb'
|
4
|
+
require_relative './constants.rb'
|
5
|
+
|
6
|
+
optionTags = {
|
7
|
+
NONE: 0,
|
8
|
+
SOME: 1
|
9
|
+
}
|
10
|
+
|
11
|
+
class CLOptionType < CLType
|
12
|
+
|
13
|
+
def initialize(inner = nil)
|
14
|
+
@tag = TAGS[:Option]
|
15
|
+
@inner = inner
|
16
|
+
# p @inner.to_string
|
17
|
+
# p @inner.to_json
|
18
|
+
# p @inner.get_tag
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def to_string
|
23
|
+
@inner == nil ? TAGS.key(13).to_s + " (None)" : TAGS.key(13).to_s + " (#{@inner.to_string})"
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json
|
27
|
+
jsoned = { "#{TAGS.key(13)}": @inner.to_string }.to_json
|
28
|
+
# h = JSON.parse(jsoned)
|
29
|
+
# h
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_type
|
33
|
+
TAGS.key(13).to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_inner_type
|
37
|
+
@inner
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_bytes
|
41
|
+
arr = []
|
42
|
+
arr << @tag << @inner.get_tag
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.to_string
|
46
|
+
TAGS.key(13).to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_bytes
|
50
|
+
[13].pack("C*").unpack1("H*")
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require_relative './cl_public_key_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
require_relative '../utils/base_16.rb'
|
5
|
+
require_relative '../utils/hex_utils.rb'
|
6
|
+
require_relative '../utils/hash_utils.rb'
|
7
|
+
require 'blake2'
|
8
|
+
=begin
|
9
|
+
PublicKey serializes as a single byte tag representing the algorithm followed by 32 bytes of the PublicKey itself:
|
10
|
+
If the PublicKey is an Ed25519 key, the single tag byte is 1 followed by the individual bytes of the serialized key.
|
11
|
+
If the PublicKey is a Secp256k1 key, the single tag byte is a 2 followed by the individual bytes of the serialized key.
|
12
|
+
=end
|
13
|
+
ED25519_LENGTH = 32
|
14
|
+
SECP256K1_LENGTH = 33
|
15
|
+
|
16
|
+
|
17
|
+
CLPublicKeyTag = {
|
18
|
+
ED25519: 1,
|
19
|
+
SECP256K1: 2
|
20
|
+
}
|
21
|
+
|
22
|
+
SignatureAlgorithm = {
|
23
|
+
Ed25519: 'ed25519',
|
24
|
+
Secp256K1: 'secp256k1'
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
class CLPublicKey < CLValue
|
31
|
+
include CLValueBytesParsers::CLPublicKeyBytesParser
|
32
|
+
include Utils::HashUtils
|
33
|
+
# @param [Array<Integer>] raw_public_key
|
34
|
+
# @param [Integer] tag
|
35
|
+
def initialize(raw_public_key, tag)
|
36
|
+
super()
|
37
|
+
raw_public_key_length_valid?(raw_public_key, tag)
|
38
|
+
end
|
39
|
+
|
40
|
+
def raw_public_key_length_valid?(raw_public_key, tag)
|
41
|
+
if tag == CLPublicKeyTag[:ED25519] || tag == SignatureAlgorithm[:Ed25519]
|
42
|
+
if raw_public_key.length != ED25519_LENGTH
|
43
|
+
raise ArgumentError.new("Wrong length of ED25519 key. Expected #{ED25519_LENGTH}, but got #{raw_public_key.length}")
|
44
|
+
end
|
45
|
+
@raw_public_key = raw_public_key
|
46
|
+
@tag = tag
|
47
|
+
elsif tag == CLPublicKeyTag[:SECP256K1] || tag == SignatureAlgorithm[:Secp256K1]
|
48
|
+
if raw_public_key.length != SECP256K1_LENGTH
|
49
|
+
raise ArgumentError.new("Wrong length of SECP256K1 key. Expected #{SECP256K1_LENGTH}, but got #{raw_public_key.length}")
|
50
|
+
end
|
51
|
+
@raw_public_key = raw_public_key
|
52
|
+
@tag = tag
|
53
|
+
else
|
54
|
+
raise ArgumentError.new("Unsupported type of public key")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_cl_type
|
59
|
+
@cl_type = CLPublicKeyType.new
|
60
|
+
@cl_type.to_string
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def get_value
|
65
|
+
@raw_public_key
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_cl_public_key_tag
|
69
|
+
if @tag == CLPublicKeyTag[:ED25519] || @tag == SignatureAlgorithm[:Ed25519]
|
70
|
+
CLPublicKeyTag[:ED25519]
|
71
|
+
else
|
72
|
+
CLPublicKeyTag[:SECP256K1]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_signature_algorithm
|
77
|
+
if @tag == CLPublicKeyTag[:ED25519] || @tag == SignatureAlgorithm[:Ed25519]
|
78
|
+
SignatureAlgorithm[:Ed25519]
|
79
|
+
else
|
80
|
+
SignatureAlgorithm[:Secp256K1]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def ed25519?
|
85
|
+
@tag == CLPublicKeyTag[:ED25519]
|
86
|
+
end
|
87
|
+
|
88
|
+
def secp256k1?
|
89
|
+
@tag == CLPublicKeyTag[:SECP256K1]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Array<Integer>]
|
93
|
+
def to_account_hash_byte_array
|
94
|
+
key_name = CLPublicKeyTag.key(@tag).to_s
|
95
|
+
prefix = key_name.downcase.unpack("C*") + [0]
|
96
|
+
bytes = prefix + @raw_public_key
|
97
|
+
result_array = Utils::HashUtils.byte_hash(bytes)
|
98
|
+
@raw_public_key.length == 0 ? [] : result_array
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [String] hex
|
102
|
+
def to_account_hash_hex
|
103
|
+
bytes = to_account_hash_byte_array
|
104
|
+
hex = Utils::HashUtils.account_hash_from_byte_to_hex(bytes)
|
105
|
+
end
|
106
|
+
|
107
|
+
def from_ed25519(public_key)
|
108
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:ED25519])
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.from_ed25519(public_key)
|
112
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:ED25519])
|
113
|
+
end
|
114
|
+
|
115
|
+
def from_secp256k1(public_key)
|
116
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:SECP256K1])
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.from_secp256k1(public_key)
|
120
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:SECP256K1])
|
121
|
+
end
|
122
|
+
|
123
|
+
def to_hex
|
124
|
+
# "0#{@tag}#{Utils::Base16.encode16(@raw_public_key)}"
|
125
|
+
"0#{@tag}#{CLValueBytesParsers::CLPublicKeyBytesParser.encode_base_16(@raw_public_key)}"
|
126
|
+
end
|
127
|
+
|
128
|
+
def from_hex(public_key_hex)
|
129
|
+
raise ArgumentError.new("Invalid public key") unless Utils::HexUtils.valid_public_key_format?(public_key_hex)
|
130
|
+
public_key_hex_bytes = Utils::Base16.decode16(public_key_hex)
|
131
|
+
CLPublicKey.new(public_key_hex_bytes.drop(1), public_key_hex_bytes[0])
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.from_hex(public_key_hex)
|
135
|
+
raise ArgumentError.new("Invalid public key") unless Utils::HexUtils.valid_public_key_format?(public_key_hex)
|
136
|
+
public_key_hex_bytes = Utils::Base16.decode16(public_key_hex)
|
137
|
+
CLPublicKey.new(public_key_hex_bytes.drop(1), public_key_hex_bytes[0])
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.to_json(public_key)
|
141
|
+
json = {"bytes": public_key.to_hex, "cl_type": public_key.get_cl_type}.to_json
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.from_json(json)
|
145
|
+
parsed = JSON.parse(json).deep_symbolize_keys
|
146
|
+
bytes = Utils::Base16.decode16(parsed[:bytes])
|
147
|
+
tag = bytes[0]
|
148
|
+
raw_public_key = bytes[1..]
|
149
|
+
CLPublicKey.new(raw_public_key, tag)
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLPublicKeyType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(22).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[22].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_result_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLResult < CLValue
|
8
|
+
include CLValueBytesParsers::CLResultBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLResultType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLResultType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(16).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[16].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative './cl_string_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
class CLString < CLValue
|
7
|
+
attr_accessor :cl_value
|
8
|
+
alias_method :clvalue?, :cl_value
|
9
|
+
include CLValueBytesParsers::CLStringBytesParser
|
10
|
+
|
11
|
+
def initialize(value)
|
12
|
+
super()
|
13
|
+
# raise "error" unless value.is_a?(String)
|
14
|
+
raise "error" unless value.instance_of? String
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_cl_type
|
19
|
+
@cl_string_type = CLStringType.new
|
20
|
+
@cl_string_type.to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_value
|
24
|
+
@value
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_size
|
28
|
+
@value.length
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.to_bytes(clvalue)
|
32
|
+
value = clvalue.get_value
|
33
|
+
len = value.length
|
34
|
+
hex1 = len.to_s(16).rjust(8, '0').scan(/../).reverse.join('')
|
35
|
+
hex2 = value.unpack("H*").first
|
36
|
+
hex1 + hex2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLStringType < CLType
|
6
|
+
|
7
|
+
def initialize(value = nil)
|
8
|
+
super(value)
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_string
|
13
|
+
TAGS.key(10).to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_value
|
17
|
+
@value
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json
|
21
|
+
to_string
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_bytes
|
25
|
+
[10].pack("C*").unpack1("H*")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|