class IOSTSdk::Models::Query::SignedTransaction

This represents the signed transaction payload for developers.iost.io/docs/en/6-reference/API.html#sendtx

Public Class Methods

from_transaction(transaction:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 16
def self.from_transaction(transaction:)
  raise ArgumentError.new('tx must be an instance of IOSTSdk::Models::Query::Transaction') unless
    transaction.is_a?(IOSTSdk::Models::Query::Transaction)

  # assign fields and values from tx
  signed_tx = SignedTransaction.new
  transaction.instance_variables.each do |var_name|
    n = var_name.to_s[1..-1].to_sym
    signed_tx.instance_variable_set(var_name, transaction.send(n))
    signed_tx.class.send(:define_method, n) do
      instance_variable_get(var_name)
    end
  end

  signed_tx
end

Public Instance Methods

sign(account_name:, key_pair:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 33
def sign(account_name:, key_pair:)
  add_publisher_sig(account_name: account_name, key_pair: key_pair)
  self
end

Private Instance Methods

add_publisher_sig(account_name:, key_pair:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 90
def add_publisher_sig(account_name:, key_pair:)
  signature = gen_sig(key_pair: key_pair)
  # set "publisher"
  instance_variable_set('@publisher', account_name)
  self.class.send(:define_method, :publisher) { instance_variable_get('@publisher') }
  # set "publisher_sigs"
  instance_variable_set(
    '@publisher_sigs',
    [
      IOSTSdk::Models::Signature.new.populate(
        model_data: {
          'algorithm' => key_pair.algo,
          'public_key' => [key_pair.public_key_raw].pack('m0'),
          'signature' => [signature].pack('m0')
        }
      )
    ]
  )
  self.class.send(:define_method, :publisher_sigs) { instance_variable_get('@publisher_sigs') }
  self
end
add_sig(key_pair:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 76
def add_sig(key_pair:)
  signature = gen_sig(key_pair: key_pair)
  @signatures ||= []
  @signatures << IOSTSdk::Models::Signature.new.populate(
    model_data: {
      'algorithm' => key_pair.algo,
      'public_key' => [key_pair.public_key_raw].pack('m0'),
      'signature' => [signature].pack('m0')
    }
  )

  self
end
bytes_for_signature() click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 40
def bytes_for_signature
  serializer = IOSTSdk::Models::Util::Serializer
  tx_bytes = serializer.int64_to_bytes(time) +
    serializer.int64_to_bytes(expiration) +
    serializer.int64_to_bytes(gas_ratio * 100) +
    serializer.int64_to_bytes(gas_limit * 100) +
    serializer.int64_to_bytes(delay) +
    serializer.int32_to_bytes(chain_id)
  tx_bytes += serializer.int32_to_bytes(0) unless reserved
  tx_bytes += serializer.array_to_bytes(signers) +
    serializer.array_to_bytes(actions) +
    serializer.array_to_bytes(amount_limit)

  tx_bytes
end
gen_sig(key_pair:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 72
def gen_sig(key_pair:)
  key_pair.sign(message: hash_value(include_signatures: true))
end
hash_value(include_signatures:) click to toggle source
# File lib/iost_sdk/models/query/signed_transaction.rb, line 56
def hash_value(include_signatures:)
  byte_string = bytes_for_signature
  if include_signatures
    serializer = IOSTSdk::Models::Util::Serializer
    byte_string = byte_string +
      serializer.int32_to_bytes(signatures.size) +
      signatures.map { |sig| serializer.int32_to_bytes(sig.bytes.size) + sig.bytes }.flatten

    byte_string
  end

  SHA3::Digest.new(:sha256)
              .update(byte_string.pack('C*'))
              .digest
end