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
# 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.concat Transaction::MAGIC
  bytes.push(0, @tx.version)
  bytes.concat [@tx.asset].pack('H*').bytes

  bytes.concat encode_inputs
  bytes.concat encode_outputs
  bytes.concat encode_references if @tx.version >= Transaction::REFERENCES_TX_VERSION

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

  bytes.concat MixinBot.utils.encode_uint32 extra_bytes.size
  bytes.concat extra_bytes

  bytes.concat(@tx.aggregated.nil? ? encode_signatures : encode_aggregated_signature)

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

  @tx
end