소스 검색

feat(runtime-transaction): support borrowed sanitized views (#9190)

OliverNChalk 7 시간 전
부모
커밋
43e34eee2e
2개의 변경된 파일97개의 추가작업 그리고 31개의 파일을 삭제
  1. 51 31
      runtime-transaction/src/runtime_transaction/transaction_view.rs
  2. 46 0
      transaction-view/src/transaction_view.rs

+ 51 - 31
runtime-transaction/src/runtime_transaction/transaction_view.rs

@@ -44,40 +44,60 @@ impl<D: TransactionData> RuntimeTransaction<SanitizedTransactionView<D>> {
         message_hash: MessageHash,
         is_simple_vote_tx: Option<bool>,
     ) -> Result<Self> {
-        let message_hash = match message_hash {
-            MessageHash::Precomputed(hash) => hash,
-            MessageHash::Compute => VersionedMessage::hash_raw_message(transaction.message_data()),
-        };
-        let is_simple_vote_tx =
-            is_simple_vote_tx.unwrap_or_else(|| is_simple_vote_transaction(&transaction));
-
-        let InstructionMeta {
-            precompile_signature_details,
-            instruction_data_len,
-        } = InstructionMeta::try_new(transaction.program_instructions_iter())?;
-
-        let signature_details = TransactionSignatureDetails::new(
-            u64::from(transaction.num_required_signatures()),
-            precompile_signature_details.num_secp256k1_instruction_signatures,
-            precompile_signature_details.num_ed25519_instruction_signatures,
-            precompile_signature_details.num_secp256r1_instruction_signatures,
-        );
-        let compute_budget_instruction_details =
-            ComputeBudgetInstructionDetails::try_from(transaction.program_instructions_iter())?;
-
-        Ok(Self {
-            transaction,
-            meta: TransactionMeta {
-                message_hash,
-                is_simple_vote_transaction: is_simple_vote_tx,
-                signature_details,
-                compute_budget_instruction_details,
-                instruction_data_len,
-            },
-        })
+        from_sanitized_transaction_view(&transaction, message_hash, is_simple_vote_tx)
+            .map(|meta| RuntimeTransaction { transaction, meta })
     }
 }
 
+impl<'a, D: TransactionData> RuntimeTransaction<&'a SanitizedTransactionView<D>> {
+    pub fn try_new(
+        transaction: &'a SanitizedTransactionView<D>,
+        message_hash: MessageHash,
+        is_simple_vote_tx: Option<bool>,
+    ) -> Result<Self> {
+        from_sanitized_transaction_view(transaction, message_hash, is_simple_vote_tx)
+            .map(|meta| RuntimeTransaction { transaction, meta })
+    }
+}
+
+fn from_sanitized_transaction_view<D>(
+    transaction: &SanitizedTransactionView<D>,
+    message_hash: MessageHash,
+    is_simple_vote_tx: Option<bool>,
+) -> Result<TransactionMeta>
+where
+    D: TransactionData,
+{
+    let message_hash = match message_hash {
+        MessageHash::Precomputed(hash) => hash,
+        MessageHash::Compute => VersionedMessage::hash_raw_message(transaction.message_data()),
+    };
+    let is_simple_vote_tx =
+        is_simple_vote_tx.unwrap_or_else(|| is_simple_vote_transaction(transaction));
+
+    let InstructionMeta {
+        precompile_signature_details,
+        instruction_data_len,
+    } = InstructionMeta::try_new(transaction.program_instructions_iter())?;
+
+    let signature_details = TransactionSignatureDetails::new(
+        u64::from(transaction.num_required_signatures()),
+        precompile_signature_details.num_secp256k1_instruction_signatures,
+        precompile_signature_details.num_ed25519_instruction_signatures,
+        precompile_signature_details.num_secp256r1_instruction_signatures,
+    );
+    let compute_budget_instruction_details =
+        ComputeBudgetInstructionDetails::try_from(transaction.program_instructions_iter())?;
+
+    Ok(TransactionMeta {
+        message_hash,
+        is_simple_vote_transaction: is_simple_vote_tx,
+        signature_details,
+        compute_budget_instruction_details,
+        instruction_data_len,
+    })
+}
+
 impl<D: TransactionData> RuntimeTransaction<ResolvedTransactionView<D>> {
     /// Create a new `RuntimeTransaction<ResolvedTransactionView>` from a
     /// `RuntimeTransaction<SanitizedTransactionView>` that already has

+ 46 - 0
transaction-view/src/transaction_view.rs

@@ -301,6 +301,52 @@ impl<D: TransactionData> SVMStaticMessage for TransactionView<true, D> {
     }
 }
 
+impl<D: TransactionData> SVMStaticMessage for &TransactionView<true, D> {
+    fn num_transaction_signatures(&self) -> u64 {
+        <TransactionView<true, D> as SVMStaticMessage>::num_transaction_signatures(self)
+    }
+
+    fn num_write_locks(&self) -> u64 {
+        <TransactionView<true, D> as SVMStaticMessage>::num_write_locks(self)
+    }
+
+    fn recent_blockhash(&self) -> &Hash {
+        <TransactionView<true, D> as SVMStaticMessage>::recent_blockhash(self)
+    }
+
+    fn num_instructions(&self) -> usize {
+        <TransactionView<true, D> as SVMStaticMessage>::num_instructions(self)
+    }
+
+    fn instructions_iter(&self) -> impl Iterator<Item = SVMInstruction<'_>> {
+        <TransactionView<true, D> as SVMStaticMessage>::instructions_iter(self)
+    }
+
+    fn program_instructions_iter(
+        &self,
+    ) -> impl Iterator<Item = (&Pubkey, SVMInstruction<'_>)> + Clone {
+        <TransactionView<true, D> as SVMStaticMessage>::program_instructions_iter(self)
+    }
+
+    fn static_account_keys(&self) -> &[Pubkey] {
+        <TransactionView<true, D> as SVMStaticMessage>::static_account_keys(self)
+    }
+
+    fn fee_payer(&self) -> &Pubkey {
+        <TransactionView<true, D> as SVMStaticMessage>::fee_payer(self)
+    }
+
+    fn num_lookup_tables(&self) -> usize {
+        <TransactionView<true, D> as SVMStaticMessage>::num_lookup_tables(self)
+    }
+
+    fn message_address_table_lookups(
+        &self,
+    ) -> impl Iterator<Item = SVMMessageAddressTableLookup<'_>> {
+        <TransactionView<true, D> as SVMStaticMessage>::message_address_table_lookups(self)
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use {