Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions api/src/transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1294,6 +1294,13 @@ impl TransactionsApi {
}
},
},
TransactionPayload::EncryptedPayload(_) => {
return Err(SubmitTransactionError::bad_request_with_code(
"Encrypted Transaction is not supported yet",
AptosErrorCode::InvalidInput,
ledger_info,
));
},
}
// TODO: Verify script args?

Expand Down Expand Up @@ -1580,6 +1587,18 @@ impl TransactionsApi {
));
}

if txn
.raw_transaction_ref()
.payload_ref()
.is_encrypted_variant()
{
return Err(SubmitTransactionError::bad_request_with_code(
"Encrypted transactions cannot be simulated",
AptosErrorCode::InvalidInput,
&ledger_info,
));
}

// Simulate transaction
let state_view = self.context.latest_state_view_poem(&ledger_info)?;
let (vm_status, output) =
Expand Down Expand Up @@ -1639,6 +1658,9 @@ impl TransactionsApi {
};
stats_key
},
TransactionPayload::EncryptedPayload(_) => {
unreachable!("Encrypted transactions must not be simulated")
},
};
self.context
.simulate_txn_stats()
Expand Down
3 changes: 3 additions & 0 deletions api/types/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,9 @@ impl<'a, S: StateView> MoveConverter<'a, S> {
},
// Deprecated.
ModuleBundle(_) => bail!("Module bundle payload has been removed"),
EncryptedPayload(_) => {
bail!("Encrypted payload isn't supported yet")
},
};
Ok(ret)
}
Expand Down
6 changes: 5 additions & 1 deletion consensus/src/quorum_store/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,11 @@ impl Batch {
ensure!(
txn.gas_unit_price() >= self.gas_bucket_start(),
"Payload gas unit price doesn't match batch info"
)
);
ensure!(
!txn.payload().is_encrypted_variant(),
"Encrypted transaction is not supported yet"
);
}
Ok(())
}
Expand Down
51 changes: 49 additions & 2 deletions crates/aptos-transaction-filters/src/transaction_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
use aptos_crypto::{ed25519::Ed25519PublicKey, HashValue};
use aptos_types::transaction::{
authenticator::{AccountAuthenticator, AnyPublicKey, TransactionAuthenticator},
EntryFunction, MultisigTransactionPayload, Script, SignedTransaction, TransactionExecutableRef,
TransactionExtraConfig, TransactionPayload, TransactionPayloadInner,
encrypted_payload::{EncryptedPayload, EncryptedPayloadV1},
EntryFunction, MultisigTransactionPayload, Script, SignedTransaction, TransactionExecutable,
TransactionExecutableRef, TransactionExtraConfig, TransactionPayload, TransactionPayloadInner,
};
use move_core_types::{account_address::AccountAddress, transaction_argument::TransactionArgument};
use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -343,6 +344,18 @@ fn matches_entry_function(
},
}
},
TransactionPayload::EncryptedPayload(EncryptedPayload::V1(payload)) => {
if let Ok(executable) = payload.executable_ref() {
match executable {
TransactionExecutableRef::Script(_) | TransactionExecutableRef::Empty => false,
TransactionExecutableRef::EntryFunction(entry_function) => {
compare_entry_function(entry_function, address, module_name, function)
},
}
} else {
false
}
},
}
}

Expand Down Expand Up @@ -374,6 +387,18 @@ fn matches_entry_function_module_address(
},
}
},
TransactionPayload::EncryptedPayload(EncryptedPayload::V1(payload)) => {
if let Ok(executable) = payload.executable_ref() {
match executable {
TransactionExecutableRef::Script(_) | TransactionExecutableRef::Empty => false,
TransactionExecutableRef::EntryFunction(entry_function) => {
compare_entry_function_module_address(entry_function, module_address)
},
}
} else {
false
}
},
}
}

Expand All @@ -397,6 +422,15 @@ fn matches_multisig_address(
.unwrap_or(false),
}
},
TransactionPayload::EncryptedPayload(EncryptedPayload::V1(payload)) => {
match payload.extra_config() {
TransactionExtraConfig::V1 {
multisig_address, ..
} => multisig_address
.map(|multisig_address| multisig_address == *address)
.unwrap_or(false),
}
},
}
}

Expand All @@ -421,6 +455,19 @@ fn matches_script_argument_address(
},
}
},
TransactionPayload::EncryptedPayload(EncryptedPayload::V1(payload)) => {
if let Ok(executable) = payload.executable_ref() {
match executable {
TransactionExecutableRef::EntryFunction(_)
| TransactionExecutableRef::Empty => false,
TransactionExecutableRef::Script(script) => {
compare_script_argument_address(script, address)
},
}
} else {
false
}
},
}
}

Expand Down
79 changes: 79 additions & 0 deletions types/src/transaction/encrypted_payload.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright (c) Aptos Foundation
// SPDX-License-Identifier: Apache-2.0

use crate::transaction::{TransactionExecutable, TransactionExecutableRef, TransactionExtraConfig};
use anyhow::{bail, Result};
use aptos_crypto::HashValue;
use serde::{Deserialize, Serialize};
use std::ops::Deref;

pub type CipherText = Vec<u8>;
pub type EvalProof = Vec<u8>;

#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
pub enum EncryptedPayload {
V1(EncryptedPayloadV1),
}

impl Deref for EncryptedPayload {
type Target = EncryptedPayloadV1;

fn deref(&self) -> &Self::Target {
let Self::V1(payload) = self;
payload
}
}

#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
pub enum EncryptedPayloadV1 {
Encrypted {
ciphertext: CipherText,
extra_config: TransactionExtraConfig,
payload_hash: HashValue,
},
FailedDecryption {
ciphertext: CipherText,
extra_config: TransactionExtraConfig,
payload_hash: HashValue,

eval_proof: EvalProof,
},
Decrypted {
ciphertext: CipherText,
extra_config: TransactionExtraConfig,
payload_hash: HashValue,
eval_proof: EvalProof,

// decrypted things
executable: TransactionExecutable,
decryption_nonce: u64,
},
}

impl EncryptedPayloadV1 {
pub fn executable(&self) -> Result<TransactionExecutable> {
let Self::Decrypted { executable, .. } = self else {
bail!("Transaction is encrypted");
};
Ok(executable.clone())
}

pub fn executable_ref(&self) -> Result<TransactionExecutableRef<'_>> {
let Self::Decrypted { executable, .. } = self else {
bail!("Transaction is encrypted");
};
Ok(executable.as_ref())
}

pub fn extra_config(&self) -> &TransactionExtraConfig {
match self {
EncryptedPayloadV1::Encrypted { extra_config, .. } => extra_config,
EncryptedPayloadV1::FailedDecryption { extra_config, .. } => extra_config,
EncryptedPayloadV1::Decrypted { extra_config, .. } => extra_config,
}
}

pub fn is_encrypted(&self) -> bool {
matches!(self, Self::Encrypted { .. })
}
}
32 changes: 29 additions & 3 deletions types/src/transaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ use crate::{
keyless::{KeylessPublicKey, KeylessSignature},
ledger_info::LedgerInfo,
proof::{TransactionInfoListWithProof, TransactionInfoWithProof},
transaction::authenticator::{
AASigningData, AccountAuthenticator, AnyPublicKey, AnySignature, SingleKeyAuthenticator,
TransactionAuthenticator,
transaction::{
authenticator::{
AASigningData, AccountAuthenticator, AnyPublicKey, AnySignature,
SingleKeyAuthenticator, TransactionAuthenticator,
},
encrypted_payload::EncryptedPayload,
},
vm_status::{DiscardedVMStatus, KeptVMStatus, StatusCode, StatusType, VMStatus},
write_set::{HotStateOp, WriteSet},
Expand Down Expand Up @@ -46,6 +49,7 @@ pub mod authenticator;
pub mod block_epilogue;
mod block_output;
mod change_set;
pub mod encrypted_payload;
mod module;
mod multisig;
mod script;
Expand Down Expand Up @@ -546,6 +550,10 @@ impl RawTransaction {
self.payload
}

pub fn payload_ref(&self) -> &TransactionPayload {
&self.payload
}

pub fn executable_ref(&self) -> Result<TransactionExecutableRef<'_>> {
self.payload.executable_ref()
}
Expand Down Expand Up @@ -679,6 +687,8 @@ pub enum TransactionPayload {
/// Contains an executable (script/entry function) along with extra configuration.
/// Once this new format is fully rolled out, above payload variants will be deprecated.
Payload(TransactionPayloadInner),
/// Represents an encrypted transaction payload
EncryptedPayload(EncryptedPayload),
}

#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
Expand Down Expand Up @@ -761,6 +771,9 @@ impl TransactionPayload {
TransactionPayload::Payload(TransactionPayloadInner::V1 { extra_config, .. }) => {
extra_config.is_multisig()
},
TransactionPayload::EncryptedPayload(encrypted_payload) => {
encrypted_payload.extra_config().is_multisig()
},
}
}

Expand Down Expand Up @@ -793,6 +806,9 @@ impl TransactionPayload {
TransactionPayload::ModuleBundle(_) => {
Err(format_err!("ModuleBundle variant is deprecated"))
},
TransactionPayload::EncryptedPayload(encrypted_payload) => {
encrypted_payload.executable()
},
}
}

Expand All @@ -809,6 +825,9 @@ impl TransactionPayload {
TransactionPayload::ModuleBundle(_) => {
Err(format_err!("ModuleBundle variant is deprecated"))
},
TransactionPayload::EncryptedPayload(encrypted_payload) => {
encrypted_payload.executable_ref()
},
}
}

Expand All @@ -827,6 +846,9 @@ impl TransactionPayload {
TransactionPayload::Payload(TransactionPayloadInner::V1 { extra_config, .. }) => {
extra_config.clone()
},
TransactionPayload::EncryptedPayload(encrypted_payload) => {
encrypted_payload.extra_config().clone()
},
}
}

Expand Down Expand Up @@ -919,6 +941,10 @@ impl TransactionPayload {
extra_config,
})
}

pub fn is_encrypted_variant(&self) -> bool {
matches!(self, Self::EncryptedPayload(_))
}
}

impl TransactionExtraConfig {
Expand Down
9 changes: 9 additions & 0 deletions types/src/transaction/use_case.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ fn parse_use_case(payload: &TransactionPayload) -> UseCaseKey {
None
}
},
EncryptedPayload(encrypted_payload) => {
if let Ok(TransactionExecutableRef::EntryFunction(entry_fun)) =
encrypted_payload.executable_ref()
{
Some(entry_fun)
} else {
None
}
},
};

match maybe_entry_func {
Expand Down
Loading