Eos源码阅读(RPC接口-get_transaction)

1.get_transaction_result

Eos源码阅读(RPC接口-get_transaction)_第1张图片
get_transaction_result

eos_read/plugins/history_plugin/include/eosio/history_plugin/history_plugin.hpp

struct get_transaction_result {
         transaction_id_type                   id;      //交易hash
         fc::variant                           trx;
         chain::block_timestamp_type           block_time;  //区块时间
         uint32_t                              block_num = 0;  //区块高度
         uint32_t                              last_irreversible_block = 0;
         vector                   traces;
      };

transaction id的生成方式

eos_read/libraries/chain/transaction.cpp

transaction_id_type transaction::id() const {
   digest_type::encoder enc;
   fc::raw::pack( enc, *this );
   return enc.result();
}

2.trx

trx
2.1recipt
Eos源码阅读(RPC接口-get_transaction)_第2张图片
recipt
transaction_receipt_header

eos_read/libraries/chain/include/eosio/chain/block.hpp

struct transaction_receipt_header {
      enum status_enum {
         executed  = 0, ///< succeed, no error handler executed
         soft_fail = 1, ///< objectively failed (not executed), error handler executed
         hard_fail = 2, ///< objectively failed and error handler objectively failed thus no state change
         delayed   = 3, ///< transaction delayed/deferred/scheduled for future execution
         expired   = 4  ///< transaction expired and storage space refuned to user
      };

      transaction_receipt_header():status(hard_fail){}
      transaction_receipt_header( status_enum s ):status(s){}

      friend inline bool operator ==( const transaction_receipt_header& lhs, const transaction_receipt_header& rhs ) {
         return std::tie(lhs.status, lhs.cpu_usage_us, lhs.net_usage_words) == std::tie(rhs.status, rhs.cpu_usage_us, rhs.net_usage_words);
      }

      fc::enum_type   status;
      uint32_t                             cpu_usage_us; ///< total billed CPU usage (microseconds)
      fc::unsigned_int                     net_usage_words; ///<  total billed NET usage, so we can reconstruct resource state when skipping context free data... hard failures...
   };
packed_transaction
struct packed_transaction {
      vector                  signatures;
      fc::enum_type compression;
      bytes                                   packed_context_free_data;
      bytes                                   packed_trx;
}
2.2.1 transaction_header
Eos源码阅读(RPC接口-get_transaction)_第3张图片
transaction

eos_read/libraries/chain/include/eosio/chain/transaction.hpp

struct transaction_header {
      time_point_sec         expiration;   ///< the time at which a transaction expires(交易过期时间)
      uint16_t               ref_block_num       = 0U; ///< specifies a block num in the last 2^16 blocks.
      uint32_t               ref_block_prefix    = 0UL; ///< specifies the lower 32 bits of the blockid at get_ref_blocknum
      fc::unsigned_int       max_net_usage_words = 0UL; /// upper limit on total network bandwidth (in 8 byte words) billed for this transaction
      uint8_t                max_cpu_usage_ms    = 0; /// upper limit on the total CPU time billed for this transaction
      fc::unsigned_int       delay_sec           = 0UL; /// number of seconds to delay this transaction for during which it may be canceled.

      /**
       * @return the absolute block number given the relative ref_block_num
       */
      block_num_type get_ref_blocknum( block_num_type head_blocknum )const {
         return ((head_blocknum/0xffff)*0xffff) + head_blocknum%0xffff;
      }
      void set_reference_block( const block_id_type& reference_block );
      bool verify_reference_block( const block_id_type& reference_block )const;
      void validate()const;
   };
2.2.2 transaction

eos_read/libraries/chain/include/eosio/chain/transaction.hpp

/**
    *  A transaction consits of a set of messages which must all be applied or
    *  all are rejected. These messages have access to data within the given
    *  read and write scopes.
    */
   struct transaction : public transaction_header {
      vector         context_free_actions;
      vector         actions;
      extensions_type        transaction_extensions;

      transaction_id_type        id()const;
      digest_type                sig_digest( const chain_id_type& chain_id, const vector& cfd = vector() )const;
      flat_set  get_signature_keys( const vector& signatures,
                                                     const chain_id_type& chain_id,
                                                     const vector& cfd = vector(),
                                                     bool allow_duplicate_keys = false,
                                                     bool use_cache = true )const;

      uint32_t total_actions()const { return context_free_actions.size() + actions.size(); }
      account_name first_authorizor()const {
         for( const auto& a : actions ) {
            for( const auto& u : a.authorization )
               return u.actor;
         }
         return account_name();
      }

   };
2.2.3.signed_transaction
struct signed_transaction : public transaction
   {
      signed_transaction() = default;
//      signed_transaction( const signed_transaction& ) = default;
//      signed_transaction( signed_transaction&& ) = default;
      signed_transaction( transaction&& trx, const vector& signatures, const vector& context_free_data)
      : transaction(std::move(trx))
      , signatures(signatures)
      , context_free_data(context_free_data)
      {
      }

      vector    signatures;
      vector             context_free_data; ///< for each context-free action, there is an entry here

      const signature_type&     sign(const private_key_type& key, const chain_id_type& chain_id);
      signature_type            sign(const private_key_type& key, const chain_id_type& chain_id)const;
      flat_set get_signature_keys( const chain_id_type& chain_id, bool allow_duplicate_keys = false, bool use_cache = true )const;
   };
2.2.4.action
Eos源码阅读(RPC接口-get_transaction)_第4张图片
action

eos_read/libraries/chain/include/eosio/chain/action.hpp

struct action {
      account_name               account;
      action_name                name;
      vector   authorization;
      bytes                      data;

      action(){}

      template::value, int> = 1>
      action( vector auth, const T& value ) {
         account     = T::get_account();
         name        = T::get_name();
         authorization = move(auth);
         data.assign(value.data(), value.data() + value.size());
      }

      template::value, int> = 1>
      action( vector auth, const T& value ) {
         account     = T::get_account();
         name        = T::get_name();
         authorization = move(auth);
         data        = fc::raw::pack(value);
      }

      action( vector auth, account_name account, action_name name, const bytes& data )
            : account(account), name(name), authorization(move(auth)), data(data) {
      }

      template
      T data_as()const {
         EOS_ASSERT( account == T::get_account(), action_type_exception, "account is not consistent with action struct" );
         EOS_ASSERT( name == T::get_name(), action_type_exception, "action name is not consistent with action struct"  );
         return fc::raw::unpack(data);
      }
   };

你可能感兴趣的:(Eos源码阅读(RPC接口-get_transaction))