runtime_transaction.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //! RuntimeTransaction is `runtime` facing representation of transaction, while
  2. //! solana_transaction::sanitized::SanitizedTransaction is client facing representation.
  3. //!
  4. //! It has two states:
  5. //! 1. Statically Loaded: after receiving `packet` from sigverify and deserializing
  6. //! it into `solana_transaction::versioned::VersionedTransaction`, then sanitizing into
  7. //! `solana_transaction::versioned::sanitized::SanitizedVersionedTransaction`, which can be wrapped into
  8. //! `RuntimeTransaction` with static transaction metadata extracted.
  9. //! 2. Dynamically Loaded: after successfully loaded account addresses from onchain
  10. //! ALT, RuntimeTransaction<SanitizedMessage> transits into Dynamically Loaded state,
  11. //! with its dynamic metadata loaded.
  12. use {
  13. crate::transaction_meta::{DynamicMeta, StaticMeta, TransactionMeta},
  14. core::ops::Deref,
  15. solana_compute_budget_instruction::compute_budget_instruction_details::*,
  16. solana_hash::Hash,
  17. solana_message::{AccountKeys, TransactionSignatureDetails},
  18. solana_pubkey::Pubkey,
  19. solana_signature::Signature,
  20. solana_svm_transaction::{
  21. instruction::SVMInstruction, message_address_table_lookup::SVMMessageAddressTableLookup,
  22. svm_message::SVMMessage, svm_transaction::SVMTransaction,
  23. },
  24. };
  25. mod sdk_transactions;
  26. mod transaction_view;
  27. #[cfg_attr(feature = "dev-context-only-utils", derive(Clone))]
  28. #[derive(Debug)]
  29. pub struct RuntimeTransaction<T> {
  30. transaction: T,
  31. // transaction meta is a collection of fields, it is updated
  32. // during message state transition
  33. meta: TransactionMeta,
  34. }
  35. impl<T> StaticMeta for RuntimeTransaction<T> {
  36. fn message_hash(&self) -> &Hash {
  37. &self.meta.message_hash
  38. }
  39. fn is_simple_vote_transaction(&self) -> bool {
  40. self.meta.is_simple_vote_transaction
  41. }
  42. fn signature_details(&self) -> &TransactionSignatureDetails {
  43. &self.meta.signature_details
  44. }
  45. fn compute_budget_instruction_details(&self) -> &ComputeBudgetInstructionDetails {
  46. &self.meta.compute_budget_instruction_details
  47. }
  48. }
  49. impl<T: SVMMessage> DynamicMeta for RuntimeTransaction<T> {}
  50. impl<T> Deref for RuntimeTransaction<T> {
  51. type Target = T;
  52. fn deref(&self) -> &Self::Target {
  53. &self.transaction
  54. }
  55. }
  56. impl<T: SVMMessage> SVMMessage for RuntimeTransaction<T> {
  57. // override to access from the cached meta instead of re-calculating
  58. fn num_total_signatures(&self) -> u64 {
  59. self.meta.signature_details.total_signatures()
  60. }
  61. fn num_write_locks(&self) -> u64 {
  62. self.transaction.num_write_locks()
  63. }
  64. fn recent_blockhash(&self) -> &Hash {
  65. self.transaction.recent_blockhash()
  66. }
  67. fn num_instructions(&self) -> usize {
  68. self.transaction.num_instructions()
  69. }
  70. fn instructions_iter(&self) -> impl Iterator<Item = SVMInstruction> {
  71. self.transaction.instructions_iter()
  72. }
  73. fn program_instructions_iter(&self) -> impl Iterator<Item = (&Pubkey, SVMInstruction)> + Clone {
  74. self.transaction.program_instructions_iter()
  75. }
  76. fn account_keys(&self) -> AccountKeys {
  77. self.transaction.account_keys()
  78. }
  79. fn fee_payer(&self) -> &Pubkey {
  80. self.transaction.fee_payer()
  81. }
  82. fn is_writable(&self, index: usize) -> bool {
  83. self.transaction.is_writable(index)
  84. }
  85. fn is_signer(&self, index: usize) -> bool {
  86. self.transaction.is_signer(index)
  87. }
  88. fn is_invoked(&self, key_index: usize) -> bool {
  89. self.transaction.is_invoked(key_index)
  90. }
  91. fn num_lookup_tables(&self) -> usize {
  92. self.transaction.num_lookup_tables()
  93. }
  94. fn message_address_table_lookups(&self) -> impl Iterator<Item = SVMMessageAddressTableLookup> {
  95. self.transaction.message_address_table_lookups()
  96. }
  97. }
  98. impl<T: SVMTransaction> SVMTransaction for RuntimeTransaction<T> {
  99. fn signature(&self) -> &Signature {
  100. self.transaction.signature()
  101. }
  102. fn signatures(&self) -> &[Signature] {
  103. self.transaction.signatures()
  104. }
  105. }