Class: MixinBot::Transaction::Encoder

Inherits:
Object
  • Object
show all
Defined in:
lib/mixin_bot/transaction/encoder.rb

Overview

Builds the binary encoding for a MixinBot::Transaction instance.

Instance Method Summary collapse

Constructor Details

#initialize(transaction) ⇒ Encoder

Returns a new instance of Encoder.



9
10
11
# File 'lib/mixin_bot/transaction/encoder.rb', line 9

def initialize(transaction)
  @tx = transaction
end

Instance Method Details

#encodeObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/mixin_bot/transaction/encoder.rb', line 13

def encode
  raise InvalidTransactionFormatError, 'asset is required' if @tx.asset.blank?
  raise InvalidTransactionFormatError, 'inputs is required' if @tx.inputs.blank?
  raise InvalidTransactionFormatError, 'outputs is required' if @tx.outputs.blank?

  bytes = []

  bytes += Transaction::MAGIC
  bytes += [0, @tx.version]
  bytes += [@tx.asset].pack('H*').bytes

  bytes += encode_inputs
  bytes += encode_outputs
  bytes += encode_references if @tx.version >= Transaction::REFERENCES_TX_VERSION && @tx.references.present?

  extra_bytes = @tx.extra.bytes
  raise InvalidTransactionFormatError, 'extra is too long' if extra_bytes.size > Transaction::MAX_EXTRA_SIZE

  bytes += MixinBot.utils.encode_uint32 extra_bytes.size
  bytes += extra_bytes

  bytes += if @tx.aggregated.nil?
             encode_signatures
           else
             encode_aggregated_signature
           end

  @tx.hash = SHA3::Digest::SHA256.hexdigest bytes.pack('C*')
  @tx.hex = bytes.pack('C*').unpack1('H*')

  @tx
end