arkecosystem-crypto 0.1.0 → 0.2.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/lib/arkecosystem/crypto.rb +35 -42
- data/lib/arkecosystem/crypto/{identity → identities}/address.rb +10 -4
- data/lib/arkecosystem/crypto/identities/private_key.rb +18 -0
- data/lib/arkecosystem/crypto/identities/public_key.rb +18 -0
- data/lib/arkecosystem/crypto/{identity → identities}/wif.rb +4 -4
- data/lib/arkecosystem/crypto/networks/devnet.rb +1 -5
- data/lib/arkecosystem/crypto/networks/mainnet.rb +1 -5
- data/lib/arkecosystem/crypto/networks/testnet.rb +1 -5
- data/lib/arkecosystem/crypto/transactions/builder/base.rb +52 -0
- data/lib/arkecosystem/crypto/transactions/builder/delegate_registration.rb +34 -0
- data/lib/arkecosystem/crypto/transactions/builder/multi_signature_registration.rb +43 -0
- data/lib/arkecosystem/crypto/transactions/builder/second_signature_registration.rb +28 -0
- data/lib/arkecosystem/crypto/transactions/builder/transfer.rb +33 -0
- data/lib/arkecosystem/crypto/transactions/builder/vote.rb +29 -0
- data/lib/arkecosystem/crypto/transactions/deserializer.rb +98 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/base.rb +17 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/delegate_registration.rb +24 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/delegate_resignation.rb +14 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/ipfs.rb +20 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/multi_payment.rb +40 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/multi_signature_registration.rb +34 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/second_signature_registration.rb +20 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/timelock_transfer.rb +21 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/transfer.rb +21 -0
- data/lib/arkecosystem/crypto/transactions/deserializers/vote.rb +33 -0
- data/lib/arkecosystem/crypto/transactions/serializer.rb +86 -0
- data/lib/arkecosystem/crypto/transactions/serializers/base.rb +15 -0
- data/lib/arkecosystem/crypto/transactions/serializers/delegate_registration.rb +19 -0
- data/lib/arkecosystem/crypto/transactions/serializers/delegate_resignation.rb +14 -0
- data/lib/arkecosystem/crypto/transactions/serializers/ipfs.rb +19 -0
- data/lib/arkecosystem/crypto/transactions/serializers/multi_payment.rb +25 -0
- data/lib/arkecosystem/crypto/transactions/serializers/multi_signature_registration.rb +33 -0
- data/lib/arkecosystem/crypto/transactions/serializers/second_signature_registration.rb +16 -0
- data/lib/arkecosystem/crypto/transactions/serializers/timelock_transfer.rb +23 -0
- data/lib/arkecosystem/crypto/transactions/serializers/transfer.rb +22 -0
- data/lib/arkecosystem/crypto/transactions/serializers/vote.rb +25 -0
- data/lib/arkecosystem/crypto/transactions/transaction.rb +198 -0
- data/lib/arkecosystem/crypto/utils/message.rb +42 -0
- data/lib/arkecosystem/crypto/utils/slot.rb +23 -0
- data/lib/arkecosystem/crypto/version.rb +1 -1
- metadata +67 -39
- data/lib/arkecosystem/crypto/builder/delegate_registration.rb +0 -33
- data/lib/arkecosystem/crypto/builder/multi_signature_registration.rb +0 -45
- data/lib/arkecosystem/crypto/builder/second_signature_registration.rb +0 -27
- data/lib/arkecosystem/crypto/builder/transaction.rb +0 -109
- data/lib/arkecosystem/crypto/builder/transfer.rb +0 -32
- data/lib/arkecosystem/crypto/builder/vote.rb +0 -28
- data/lib/arkecosystem/crypto/crypto.rb +0 -144
- data/lib/arkecosystem/crypto/deserialiser.rb +0 -94
- data/lib/arkecosystem/crypto/deserialisers/base.rb +0 -15
- data/lib/arkecosystem/crypto/deserialisers/delegate_registration.rb +0 -22
- data/lib/arkecosystem/crypto/deserialisers/delegate_resignation.rb +0 -12
- data/lib/arkecosystem/crypto/deserialisers/ipfs.rb +0 -18
- data/lib/arkecosystem/crypto/deserialisers/multi_payment.rb +0 -38
- data/lib/arkecosystem/crypto/deserialisers/multi_signature_registration.rb +0 -32
- data/lib/arkecosystem/crypto/deserialisers/second_signature_registration.rb +0 -18
- data/lib/arkecosystem/crypto/deserialisers/timelock_transfer.rb +0 -19
- data/lib/arkecosystem/crypto/deserialisers/transfer.rb +0 -18
- data/lib/arkecosystem/crypto/deserialisers/vote.rb +0 -31
- data/lib/arkecosystem/crypto/identity/private_key.rb +0 -14
- data/lib/arkecosystem/crypto/identity/public_key.rb +0 -18
- data/lib/arkecosystem/crypto/message.rb +0 -42
- data/lib/arkecosystem/crypto/models/transaction.rb +0 -16
- data/lib/arkecosystem/crypto/serialiser.rb +0 -84
- data/lib/arkecosystem/crypto/serialisers/base.rb +0 -13
- data/lib/arkecosystem/crypto/serialisers/delegate_registration.rb +0 -17
- data/lib/arkecosystem/crypto/serialisers/delegate_resignation.rb +0 -12
- data/lib/arkecosystem/crypto/serialisers/ipfs.rb +0 -17
- data/lib/arkecosystem/crypto/serialisers/multi_payment.rb +0 -23
- data/lib/arkecosystem/crypto/serialisers/multi_signature_registration.rb +0 -31
- data/lib/arkecosystem/crypto/serialisers/second_signature_registration.rb +0 -14
- data/lib/arkecosystem/crypto/serialisers/timelock_transfer.rb +0 -21
- data/lib/arkecosystem/crypto/serialisers/transfer.rb +0 -20
- data/lib/arkecosystem/crypto/serialisers/vote.rb +0 -23
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'arkecosystem/crypto/identities/address'
|
2
|
+
|
3
|
+
module ArkEcosystem
|
4
|
+
module Crypto
|
5
|
+
module Transactions
|
6
|
+
# The base deserializer for transactions.
|
7
|
+
class Deserializer
|
8
|
+
def initialize(serialized)
|
9
|
+
@serialized = serialized
|
10
|
+
@binary = BTC::Data.data_from_hex(@serialized)
|
11
|
+
|
12
|
+
@handlers = %w[
|
13
|
+
Transfer
|
14
|
+
SecondSignatureRegistration
|
15
|
+
DelegateRegistration
|
16
|
+
Vote
|
17
|
+
MultiSignatureRegistration
|
18
|
+
Ipfs
|
19
|
+
TimelockTransfer
|
20
|
+
MultiPayment
|
21
|
+
DelegateResignation
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
def deserialize
|
26
|
+
transaction = ArkEcosystem::Crypto::Transactions::Transaction.new()
|
27
|
+
transaction.version = @binary.unpack('C2').last
|
28
|
+
transaction.network = @binary.unpack('C3').last
|
29
|
+
transaction.type = @binary.unpack('C4').last
|
30
|
+
transaction.timestamp = @binary.unpack('V2').last
|
31
|
+
transaction.sender_public_key = @binary.unpack('H16H66').last
|
32
|
+
transaction.fee = @binary.unpack('C41Q<').last
|
33
|
+
|
34
|
+
vendor_field_length = @binary.unpack('C49C1').last
|
35
|
+
|
36
|
+
if vendor_field_length > 0
|
37
|
+
vendor_field_offset = (41 + 8 + 1) * 2
|
38
|
+
vendor_field_take = vendor_field_length * 2
|
39
|
+
|
40
|
+
transaction.vendor_field_hex = @binary.unpack("H#{vendor_field_offset}H#{vendor_field_take}").last
|
41
|
+
end
|
42
|
+
|
43
|
+
asset_offset = (41 + 8 + 1) * 2 + vendor_field_length * 2
|
44
|
+
|
45
|
+
transaction = handle_type(asset_offset, transaction)
|
46
|
+
|
47
|
+
transaction.amount = 0 unless transaction.amount
|
48
|
+
|
49
|
+
if transaction.version == 1 || transaction.version.empty?
|
50
|
+
transaction = handle_version_one(transaction)
|
51
|
+
end
|
52
|
+
|
53
|
+
transaction
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def handle_type(asset_offset, transaction)
|
59
|
+
deserializer = @handlers[transaction.type]
|
60
|
+
deserializer = Object.const_get("ArkEcosystem::Crypto::Transactions::Deserializers::#{deserializer}")
|
61
|
+
deserializer.new(@serialized, @binary, asset_offset, transaction).deserialize
|
62
|
+
end
|
63
|
+
|
64
|
+
def handle_version_one(transaction)
|
65
|
+
if transaction.second_signature
|
66
|
+
transaction.sign_signature = transaction.second_signature
|
67
|
+
end
|
68
|
+
|
69
|
+
if transaction.type == ArkEcosystem::Crypto::Enums::Types::VOTE
|
70
|
+
transaction.recipient_id = ArkEcosystem::Crypto::Identities::Address.from_public_key(transaction.sender_public_key, transaction.network)
|
71
|
+
end
|
72
|
+
|
73
|
+
if transaction.type == ArkEcosystem::Crypto::Enums::Types::MULTI_SIGNATURE_REGISTRATION
|
74
|
+
transaction.asset[:multisignature][:keysgroup] = transaction.asset[:multisignature][:keysgroup].map! { |key| '+' + key }
|
75
|
+
end
|
76
|
+
|
77
|
+
if transaction.vendor_field_hex
|
78
|
+
transaction.vendor_field = BTC::Data.data_from_hex(transaction.vendor_field_hex)
|
79
|
+
end
|
80
|
+
|
81
|
+
unless transaction.id
|
82
|
+
transaction.id = transaction.get_id
|
83
|
+
end
|
84
|
+
|
85
|
+
if transaction.type == ArkEcosystem::Crypto::Enums::Types::SECOND_SIGNATURE_REGISTRATION
|
86
|
+
transaction.recipient_id = ArkEcosystem::Crypto::Identities::Address.from_public_key(transaction.sender_public_key, transaction.network)
|
87
|
+
end
|
88
|
+
|
89
|
+
if transaction.type == ArkEcosystem::Crypto::Enums::Types::MULTI_SIGNATURE_REGISTRATION
|
90
|
+
transaction.recipient_id = ArkEcosystem::Crypto::Identities::Address::from_public_key(transaction.sender_public_key, transaction.network);
|
91
|
+
end
|
92
|
+
|
93
|
+
transaction
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The base deserializer for transactions.
|
6
|
+
class Base
|
7
|
+
def initialize(serialized, binary, asset_offset, transaction)
|
8
|
+
@serialized = serialized
|
9
|
+
@binary = binary
|
10
|
+
@asset_offset = asset_offset
|
11
|
+
@transaction = transaction
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for delegate registration transactions.
|
6
|
+
class DelegateRegistration < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {
|
9
|
+
delegate: {}
|
10
|
+
}
|
11
|
+
|
12
|
+
username_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
|
13
|
+
|
14
|
+
username = @serialized[@asset_offset + 2, username_length * 2]
|
15
|
+
|
16
|
+
@transaction.asset[:delegate][:username] = BTC::Data.data_from_hex(username)
|
17
|
+
|
18
|
+
@transaction.parse_signatures(@serialized, @asset_offset + (username_length + 1) * 2)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for delegate resignation transactions.
|
6
|
+
class DelegateResignation < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.parse_signatures(@serialized, @asset_offset)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for IPFS transactions.
|
6
|
+
class IPFS < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {}
|
9
|
+
|
10
|
+
dag_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
|
11
|
+
|
12
|
+
@transaction.asset[:dag] = @serialized[@asset_offset + 2, dag_length * 2]
|
13
|
+
|
14
|
+
@transaction.parse_signatures(@serialized, @asset_offset + 2 + length * 2)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for multi payment transactions.
|
6
|
+
class MultiPayment < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {
|
9
|
+
amount: 0,
|
10
|
+
payments: []
|
11
|
+
}
|
12
|
+
|
13
|
+
total = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
|
14
|
+
offset = @asset_offset / 2 + 1
|
15
|
+
|
16
|
+
i = 0
|
17
|
+
while i < total
|
18
|
+
recipient_id = @binary.unpack("H#{(offset + 1) * 2}H42").last
|
19
|
+
|
20
|
+
payment = {
|
21
|
+
amount: @binary.unpack("C#{@asset_offset / 2}Q<").last,
|
22
|
+
recipient_id: BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
|
23
|
+
}
|
24
|
+
|
25
|
+
@transaction.asset[:payments].push(payment)
|
26
|
+
|
27
|
+
offset += 22
|
28
|
+
|
29
|
+
i += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
products.each { |item| @transaction.amount += item[:amount] }
|
33
|
+
|
34
|
+
@transaction.parse_signatures(@serialized, offset * 2)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for multi signature registrations transactions.
|
6
|
+
class MultiSignatureRegistration < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {
|
9
|
+
multisignature: {
|
10
|
+
keysgroup: []
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
@transaction.asset[:multisignature][:min] = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
|
15
|
+
@transaction.asset[:multisignature][:lifetime] = @binary.unpack("C#{@asset_offset / 2 + 2}Q<").last & 0xff
|
16
|
+
|
17
|
+
count = @binary.unpack("C#{@asset_offset / 2 + 1}Q<").last & 0xff
|
18
|
+
|
19
|
+
i = 0
|
20
|
+
while i < count
|
21
|
+
index_start = @asset_offset + 6 + i * 66
|
22
|
+
|
23
|
+
@transaction.asset[:multisignature][:keysgroup].push(@serialized[index_start, 66])
|
24
|
+
|
25
|
+
i += 1
|
26
|
+
end
|
27
|
+
|
28
|
+
@transaction.parse_signatures(@serialized, @asset_offset + 6 + count * 66)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for second signature registrations transactions.
|
6
|
+
class SecondSignatureRegistration < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {
|
9
|
+
signature: {}
|
10
|
+
}
|
11
|
+
|
12
|
+
@transaction.asset[:signature][:public_key] = @serialized[@asset_offset, 66]
|
13
|
+
|
14
|
+
@transaction.parse_signatures(@serialized, @asset_offset + 66)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for timelock transfer transactions.
|
6
|
+
class TimelockTransfer < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.amount = @binary.unpack("C#{@asset_offset / 2}Q<").last
|
9
|
+
@transaction.timelocktype = @binary.unpack("C#{@asset_offset / 2 + 8}").last & 0xff
|
10
|
+
@transaction.timelock = @binary.unpack("C#{@asset_offset / 2 + 9}V").last
|
11
|
+
|
12
|
+
recipient_id = @binary.unpack("H#{(@asset_offset / 2 + 13) * 2}H42").last
|
13
|
+
@transaction.recipient_id = BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
|
14
|
+
|
15
|
+
@transaction.parse_signatures(@serialized, @asset_offset + (21 + 13) * 2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for transfer transactions.
|
6
|
+
class Transfer < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.amount = @binary.unpack("C#{@asset_offset / 2}Q<").last
|
9
|
+
@transaction.expiration = @binary.unpack("C#{@asset_offset / 2 + 8}").last
|
10
|
+
|
11
|
+
recipient_id = @binary.unpack("H#{(@asset_offset / 2 + 12) * 2}H42").last
|
12
|
+
@transaction.recipient_id = BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
|
13
|
+
|
14
|
+
puts @transaction
|
15
|
+
@transaction.parse_signatures(@serialized, @asset_offset + (21 + 12) * 2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Deserializers
|
5
|
+
# The deserializer for vote transactions.
|
6
|
+
class Vote < Base
|
7
|
+
def deserialize
|
8
|
+
@transaction.asset = {
|
9
|
+
votes: []
|
10
|
+
}
|
11
|
+
|
12
|
+
vote_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
|
13
|
+
|
14
|
+
i = 0
|
15
|
+
while i < vote_length
|
16
|
+
index_start = @asset_offset + 2 + i * 2 * 34
|
17
|
+
index_end = 2 * 34
|
18
|
+
|
19
|
+
vote = @serialized[index_start, index_end]
|
20
|
+
vote = (vote[1] == '1' ? '+' : '-') + vote[2..-1]
|
21
|
+
|
22
|
+
@transaction.asset[:votes].push(vote)
|
23
|
+
|
24
|
+
i += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
@transaction.parse_signatures(@serialized, @asset_offset + 2 + vote_length * 34 * 2)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
# The base serializer for transactions.
|
5
|
+
class Serializer
|
6
|
+
def initialize(transaction)
|
7
|
+
@transaction = transaction
|
8
|
+
|
9
|
+
@handlers = %w[
|
10
|
+
Transfer
|
11
|
+
SecondSignatureRegistration
|
12
|
+
DelegateRegistration
|
13
|
+
Vote
|
14
|
+
MultiSignatureRegistration
|
15
|
+
Ipfs
|
16
|
+
TimelockTransfer
|
17
|
+
MultiPayment
|
18
|
+
DelegateResignation
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
def serialize
|
23
|
+
bytes = ''
|
24
|
+
bytes << [0xff].pack('C')
|
25
|
+
bytes << [@transaction[:version] || 0x01].pack('C')
|
26
|
+
bytes << [@transaction[:network] || ArkEcosystem::Crypto::Configuration::Network.get.version].pack('C')
|
27
|
+
bytes << [@transaction[:type]].pack('C')
|
28
|
+
bytes << [@transaction[:timestamp]].pack('V')
|
29
|
+
bytes << [@transaction[:senderPublicKey]].pack('H*')
|
30
|
+
bytes << [@transaction[:fee]].pack('Q<')
|
31
|
+
|
32
|
+
bytes = handle_vendor_field(bytes)
|
33
|
+
bytes = handle_type(bytes)
|
34
|
+
bytes = handle_signatures(bytes)
|
35
|
+
|
36
|
+
BTC::Data.hex_from_data(bytes)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def handle_type(bytes)
|
42
|
+
serializer = @handlers[@transaction[:type]]
|
43
|
+
serializer = Object.const_get("ArkEcosystem::Crypto::Transactions::Serializers::#{serializer}")
|
44
|
+
serializer.new(@transaction, bytes).serialize
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_vendor_field(bytes)
|
48
|
+
if @transaction[:vendorField]
|
49
|
+
vendor_field_length = @transaction[:vendorField].length
|
50
|
+
|
51
|
+
bytes << [vendor_field_length].pack('C')
|
52
|
+
bytes << @transaction[:vendorField]
|
53
|
+
elsif @transaction[:vendorFieldHex]
|
54
|
+
vendor_field_hex_length = @transaction[:vendorFieldHex].length
|
55
|
+
|
56
|
+
bytes << [vendor_field_hex_length / 2].pack('C')
|
57
|
+
bytes << @transaction[:vendorFieldHex]
|
58
|
+
else
|
59
|
+
bytes << [0x00].pack('C')
|
60
|
+
end
|
61
|
+
|
62
|
+
bytes
|
63
|
+
end
|
64
|
+
|
65
|
+
def handle_signatures(bytes)
|
66
|
+
if @transaction[:signature]
|
67
|
+
bytes << BTC::Data.data_from_hex(@transaction[:signature])
|
68
|
+
end
|
69
|
+
|
70
|
+
if @transaction[:secondSignature]
|
71
|
+
bytes << BTC::Data.data_from_hex(@transaction[:secondSignature])
|
72
|
+
elsif @transaction[:signSignature]
|
73
|
+
bytes << BTC::Data.data_from_hex(@transaction[:signSignature])
|
74
|
+
end
|
75
|
+
|
76
|
+
if @transaction[:signatures]
|
77
|
+
bytes << [0xff].pack('C')
|
78
|
+
bytes << BTC::Data.data_from_hex(@transaction[:signatures].join(''))
|
79
|
+
end
|
80
|
+
|
81
|
+
bytes
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ArkEcosystem
|
2
|
+
module Crypto
|
3
|
+
module Transactions
|
4
|
+
module Serializers
|
5
|
+
# The base serializer for transactions.
|
6
|
+
class Base
|
7
|
+
def initialize(transaction, bytes)
|
8
|
+
@transaction = transaction
|
9
|
+
@bytes = bytes
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|