diff --git a/crates/simulacrum/src/epoch_state.rs b/crates/simulacrum/src/epoch_state.rs index cb07fade99580..205c245278c79 100644 --- a/crates/simulacrum/src/epoch_state.rs +++ b/crates/simulacrum/src/epoch_state.rs @@ -134,7 +134,7 @@ impl EpochState { )?; let transaction_data = transaction.data().transaction_data(); - let (kind, signer, gas) = transaction_data.execution_parts(); + let (kind, signer, gas_data) = transaction_data.execution_parts(); let (inner_temp_store, gas_status, effects, _timings, result) = self.executor.execute_transaction_to_effects( store.backing_store(), @@ -145,7 +145,7 @@ impl EpochState { &self.epoch_start_state.epoch(), self.epoch_start_state.epoch_start_timestamp_ms(), checked_input_objects, - gas, + gas_data, gas_status, kind, signer, diff --git a/crates/sui-core/src/authority.rs b/crates/sui-core/src/authority.rs index fb8c0c6ecd987..a040d9b39ca1a 100644 --- a/crates/sui-core/src/authority.rs +++ b/crates/sui-core/src/authority.rs @@ -1664,7 +1664,7 @@ impl AuthorityState { let tx_digest = *certificate.digest(); let protocol_config = epoch_store.protocol_config(); let transaction_data = &certificate.data().intent_message().value; - let (kind, signer, gas) = transaction_data.execution_parts(); + let (kind, signer, gas_data) = transaction_data.execution_parts(); #[allow(unused_mut)] let (inner_temp_store, _, mut effects, timings, execution_error_opt) = @@ -1684,7 +1684,7 @@ impl AuthorityState { .epoch_data() .epoch_start_timestamp(), input_objects, - gas, + gas_data, gas_status, kind, signer, @@ -1813,7 +1813,7 @@ impl AuthorityState { )?; // make a gas object if one was not provided - let mut gas_object_refs = transaction.gas().to_vec(); + let mut gas_data = transaction.gas_data().clone(); let ((gas_status, checked_input_objects), mock_gas) = if transaction.gas().is_empty() { let sender = transaction.sender(); // use a 1B sui coin @@ -1827,7 +1827,7 @@ impl AuthorityState { TransactionDigest::genesis_marker(), ); let gas_object_ref = gas_object.compute_object_reference(); - gas_object_refs = vec![gas_object_ref]; + gas_data.payment = vec![gas_object_ref]; ( sui_transaction_checks::check_transaction_input_with_given_gas( epoch_store.protocol_config(), @@ -1877,7 +1877,7 @@ impl AuthorityState { .epoch_data() .epoch_start_timestamp(), checked_input_objects, - gas_object_refs, + gas_data, gas_status, kind, signer, @@ -2004,7 +2004,7 @@ impl AuthorityState { )?; // make a gas object if one was not provided - let mut gas_object_refs = transaction.gas().to_vec(); + let mut gas_data = transaction.gas_data().clone(); let ((gas_status, checked_input_objects), mock_gas) = if transaction.gas().is_empty() { let sender = transaction.sender(); // use a 1B sui coin @@ -2018,7 +2018,7 @@ impl AuthorityState { TransactionDigest::genesis_marker(), ); let gas_object_ref = gas_object.compute_object_reference(); - gas_object_refs = vec![gas_object_ref]; + gas_data.payment = vec![gas_object_ref]; ( sui_transaction_checks::check_transaction_input_with_given_gas( epoch_store.protocol_config(), @@ -2068,7 +2068,7 @@ impl AuthorityState { .epoch_data() .epoch_start_timestamp(), checked_input_objects, - gas_object_refs, + gas_data, gas_status, kind, signer, @@ -2124,7 +2124,7 @@ impl AuthorityState { let owner = gas_sponsor.unwrap_or(sender); // Payment might be empty here, but it's fine we'll have to deal with it later after reading all the input objects. let payment = gas_objects.unwrap_or_default(); - let transaction = TransactionData::V1(TransactionDataV1 { + let mut transaction = TransactionData::V1(TransactionDataV1 { kind: transaction_kind.clone(), sender, gas_data: GasData { @@ -2170,26 +2170,20 @@ impl AuthorityState { .unwrap_or(false), )?; - // Create and use a dummy gas object if there is no gas object provided. - let dummy_gas_object = Object::new_gas_with_balance_and_owner_for_testing( - DEV_INSPECT_GAS_COIN_VALUE, - transaction.gas_owner(), - ); - - let gas_objects = if transaction.gas().is_empty() { - let gas_object_ref = dummy_gas_object.compute_object_reference(); - vec![gas_object_ref] - } else { - transaction.gas().to_vec() - }; - let (gas_status, checked_input_objects) = if skip_checks { // If we are skipping checks, then we call the check_dev_inspect_input function which will perform // only lightweight checks on the transaction input. And if the gas field is empty, that means we will // use the dummy gas object so we need to add it to the input objects vector. if transaction.gas().is_empty() { + // Create and use a dummy gas object if there is no gas object provided. + let dummy_gas_object = Object::new_gas_with_balance_and_owner_for_testing( + DEV_INSPECT_GAS_COIN_VALUE, + transaction.gas_owner(), + ); + let gas_object_ref = dummy_gas_object.compute_object_reference(); + transaction.gas_data_mut().payment = vec![gas_object_ref]; input_objects.push(ObjectReadResult::new( - InputObjectKind::ImmOrOwnedMoveObject(gas_objects[0]), + InputObjectKind::ImmOrOwnedMoveObject(gas_object_ref), dummy_gas_object.into(), )); } @@ -2211,6 +2205,13 @@ impl AuthorityState { // If we are not skipping checks, then we call the check_transaction_input function and its dummy gas // variant which will perform full fledged checks just like a real transaction execution. if transaction.gas().is_empty() { + // Create and use a dummy gas object if there is no gas object provided. + let dummy_gas_object = Object::new_gas_with_balance_and_owner_for_testing( + DEV_INSPECT_GAS_COIN_VALUE, + transaction.gas_owner(), + ); + let gas_object_ref = dummy_gas_object.compute_object_reference(); + transaction.gas_data_mut().payment = vec![gas_object_ref]; sui_transaction_checks::check_transaction_input_with_given_gas( epoch_store.protocol_config(), epoch_store.reference_gas_price(), @@ -2236,6 +2237,7 @@ impl AuthorityState { let executor = sui_execution::executor(protocol_config, /* silent */ true, None) .expect("Creating an executor should not fail here"); + let gas_data = transaction.gas_data().clone(); let intent_msg = IntentMessage::new( Intent { version: IntentVersion::V0, @@ -2257,7 +2259,7 @@ impl AuthorityState { .epoch_data() .epoch_start_timestamp(), checked_input_objects, - gas_objects, + gas_data, gas_status, transaction_kind, sender, diff --git a/crates/sui-core/src/unit_tests/authority_tests.rs b/crates/sui-core/src/unit_tests/authority_tests.rs index c3c1e67123176..a7de998db8bc7 100644 --- a/crates/sui-core/src/unit_tests/authority_tests.rs +++ b/crates/sui-core/src/unit_tests/authority_tests.rs @@ -1690,8 +1690,14 @@ async fn test_publish_dependent_module_ok() { ); let transaction = to_sender_signed_transaction(data, &sender_key); - let dependent_module_id = - TxContext::new(&sender, transaction.digest(), &EpochData::new_test()).fresh_id(); + let dependent_module_id = TxContext::new( + &sender, + transaction.digest(), + &EpochData::new_test(), + rgp, + None, + ) + .fresh_id(); // Object does not exist assert!(authority.get_object(&dependent_module_id).await.is_none()); @@ -1739,8 +1745,14 @@ async fn test_publish_module_no_dependencies_ok() { rgp, ); let transaction = to_sender_signed_transaction(data, &sender_key); - let _module_object_id = - TxContext::new(&sender, transaction.digest(), &EpochData::new_test()).fresh_id(); + let _module_object_id = TxContext::new( + &sender, + transaction.digest(), + &EpochData::new_test(), + rgp, + None, + ) + .fresh_id(); let signed_effects = send_and_confirm_transaction(&authority, transaction) .await .unwrap() diff --git a/crates/sui-genesis-builder/src/lib.rs b/crates/sui-genesis-builder/src/lib.rs index a96f317bc0eb0..fa0c6c0d66bf3 100644 --- a/crates/sui-genesis-builder/src/lib.rs +++ b/crates/sui-genesis-builder/src/lib.rs @@ -914,7 +914,8 @@ fn create_genesis_transaction( let expensive_checks = false; let certificate_deny_set = HashSet::new(); let transaction_data = &genesis_transaction.data().intent_message().value; - let (kind, signer, _) = transaction_data.execution_parts(); + let (kind, signer, mut gas_data) = transaction_data.execution_parts(); + gas_data.payment = vec![]; let input_objects = CheckedInputObjects::new_for_genesis(vec![]); let (inner_temp_store, _, effects, _timings, _execution_error) = executor .execute_transaction_to_effects( @@ -926,7 +927,7 @@ fn create_genesis_transaction( &epoch_data.epoch_id(), epoch_data.epoch_start_timestamp(), input_objects, - vec![], + gas_data, SuiGasStatus::new_unmetered(), kind, signer, diff --git a/crates/sui-replay/src/replay.rs b/crates/sui-replay/src/replay.rs index cdccf8a6800b0..53d41fc7807ae 100644 --- a/crates/sui-replay/src/replay.rs +++ b/crates/sui-replay/src/replay.rs @@ -41,6 +41,7 @@ use sui_sdk::{SuiClient, SuiClientBuilder}; use sui_types::in_memory_storage::InMemoryStorage; use sui_types::message_envelope::Message; use sui_types::storage::{get_module, PackageObject}; +use sui_types::transaction::GasData; use sui_types::transaction::TransactionKind::ProgrammableTransaction; use sui_types::SUI_DENY_LIST_OBJECT_ID; use sui_types::{ @@ -764,6 +765,12 @@ impl LocalExec { ) .expect("Failed to create gas status") }; + let gas_data = GasData { + payment: tx_info.gas.clone(), + owner: tx_info.gas_owner.unwrap_or(tx_info.sender), + price: tx_info.gas_price, + budget: tx_info.gas_budget, + }; let (inner_store, gas_status, effects, _timings, result) = executor .execute_transaction_to_effects( &self, @@ -774,7 +781,7 @@ impl LocalExec { &tx_info.executed_epoch, tx_info.epoch_start_timestamp, CheckedInputObjects::new_for_replay(input_objects.clone()), - tx_info.gas.clone(), + gas_data, gas_status, transaction_kind.clone(), tx_info.sender, @@ -823,6 +830,12 @@ impl LocalExec { trace!(target: "replay_gas_info", "{}", Pretty(gas_status)); let skip_checks = true; + let gas_data = GasData { + payment: tx_info.gas.clone(), + owner: tx_info.gas_owner.unwrap_or(tx_info.sender), + price: tx_info.gas_price, + budget: tx_info.gas_budget, + }; if let ProgrammableTransaction(pt) = transaction_kind { trace!( target: "replay_ptb_info", @@ -841,7 +854,7 @@ impl LocalExec { &tx_info.executed_epoch, tx_info.epoch_start_timestamp, CheckedInputObjects::new_for_replay(input_objects), - tx_info.gas.clone(), + gas_data, SuiGasStatus::new( tx_info.gas_budget, tx_info.gas_price, @@ -924,7 +937,7 @@ impl LocalExec { reference_gas_price, ) .unwrap(); - let (kind, signer, gas) = executable.transaction_data().execution_parts(); + let (kind, signer, gas_data) = executable.transaction_data().execution_parts(); let executor = sui_execution::executor(&protocol_config, true, None).unwrap(); let (_, _, effects, _timings, exec_res) = executor.execute_transaction_to_effects( &store, @@ -935,7 +948,7 @@ impl LocalExec { &executed_epoch, epoch_start_timestamp, input_objects, - gas, + gas_data, gas_status, kind, signer, @@ -1530,8 +1543,9 @@ impl LocalExec { input_objects: input_objs, shared_object_refs, gas: gas_object_refs, - gas_budget: gas_data.budget, + gas_owner: (gas_data.owner != sender).then_some(gas_data.owner), gas_price: gas_data.price, + gas_budget: gas_data.budget, executed_epoch: epoch_id, dependencies: effects.dependencies().to_vec(), effects: SuiTransactionBlockEffects::V1(effects), @@ -1592,8 +1606,6 @@ impl LocalExec { } }) .collect(); - let gas_data = orig_tx.transaction_data().gas_data(); - let gas_object_refs: Vec<_> = gas_data.clone().payment.into_iter().collect(); let receiving_objs = orig_tx .transaction_data() .receiving_objects() @@ -1611,6 +1623,8 @@ impl LocalExec { let (epoch_start_timestamp, reference_gas_price) = self .get_epoch_start_timestamp_and_rgp(epoch_id, tx_digest) .await?; + let gas_data = orig_tx.transaction_data().gas_data(); + let gas_object_refs: Vec<_> = gas_data.clone().payment.into_iter().collect(); Ok(OnChainTransactionInfo { kind: tx_kind_orig.clone(), @@ -1619,8 +1633,9 @@ impl LocalExec { input_objects: input_objs, shared_object_refs, gas: gas_object_refs, - gas_budget: gas_data.budget, + gas_owner: (gas_data.owner != sender).then_some(gas_data.owner), gas_price: gas_data.price, + gas_budget: gas_data.budget, executed_epoch: epoch_id, dependencies: effects.dependencies().to_vec(), effects, diff --git a/crates/sui-replay/src/types.rs b/crates/sui-replay/src/types.rs index 320fda9b857df..ab8c55d0a5622 100644 --- a/crates/sui-replay/src/types.rs +++ b/crates/sui-replay/src/types.rs @@ -44,6 +44,8 @@ pub struct OnChainTransactionInfo { pub modified_at_versions: Vec<(ObjectID, SequenceNumber)>, pub shared_object_refs: Vec, pub gas: Vec<(ObjectID, SequenceNumber, ObjectDigest)>, + #[serde(default)] + pub gas_owner: Option, pub gas_budget: u64, pub gas_price: u64, pub executed_epoch: u64, diff --git a/crates/sui-single-node-benchmark/src/single_node.rs b/crates/sui-single-node-benchmark/src/single_node.rs index c2983297983ae..98db30e91b36c 100644 --- a/crates/sui-single-node-benchmark/src/single_node.rs +++ b/crates/sui-single-node-benchmark/src/single_node.rs @@ -204,7 +204,7 @@ impl SingleValidator { self.epoch_store.reference_gas_price(), ) .unwrap(); - let (kind, signer, gas) = executable.transaction_data().execution_parts(); + let (kind, signer, gas_data) = executable.transaction_data().execution_parts(); let (inner_temp_store, _, effects, _timings, _) = self.epoch_store.executor().execute_transaction_to_effects( &store, @@ -215,7 +215,7 @@ impl SingleValidator { &self.epoch_store.epoch(), 0, input_objects, - gas, + gas_data, gas_status, kind, signer, diff --git a/crates/sui-swarm-config/src/network_config_builder.rs b/crates/sui-swarm-config/src/network_config_builder.rs index 8ae6e82c30d35..55ea1dd11e196 100644 --- a/crates/sui-swarm-config/src/network_config_builder.rs +++ b/crates/sui-swarm-config/src/network_config_builder.rs @@ -599,7 +599,8 @@ mod test { let certificate_deny_set = HashSet::new(); let epoch = EpochData::new_test(); let transaction_data = &genesis_transaction.data().intent_message().value; - let (kind, signer, _) = transaction_data.execution_parts(); + let (kind, signer, mut gas_data) = transaction_data.execution_parts(); + gas_data.payment = vec![]; let input_objects = CheckedInputObjects::new_for_genesis(vec![]); let (_inner_temp_store, _, effects, _timings, _execution_error) = executor @@ -612,7 +613,7 @@ mod test { &epoch.epoch_id(), epoch.epoch_start_timestamp(), input_objects, - vec![], + gas_data, SuiGasStatus::new_unmetered(), kind, signer, diff --git a/crates/sui-types/src/base_types.rs b/crates/sui-types/src/base_types.rs index 2329944999fe1..f5efa88d1eba8 100644 --- a/crates/sui-types/src/base_types.rs +++ b/crates/sui-types/src/base_types.rs @@ -1017,6 +1017,10 @@ pub struct TxContext { epoch_timestamp_ms: CheckpointTimestamp, /// Number of `ObjectID`'s generated during execution of the current transaction ids_created: u64, + // gas price passed to transaction as input + gas_price: u64, + // address of the sponsor if any + sponsor: Option, } #[derive(PartialEq, Eq, Clone, Copy)] @@ -1030,12 +1034,20 @@ pub enum TxContextKind { } impl TxContext { - pub fn new(sender: &SuiAddress, digest: &TransactionDigest, epoch_data: &EpochData) -> Self { + pub fn new( + sender: &SuiAddress, + digest: &TransactionDigest, + epoch_data: &EpochData, + gas_price: u64, + sponsor: Option, + ) -> Self { Self::new_from_components( sender, digest, &epoch_data.epoch_id(), epoch_data.epoch_start_timestamp(), + gas_price, + sponsor, ) } @@ -1044,6 +1056,8 @@ impl TxContext { digest: &TransactionDigest, epoch_id: &EpochId, epoch_timestamp_ms: u64, + gas_price: u64, + sponsor: Option, ) -> Self { Self { sender: AccountAddress::new(sender.0), @@ -1051,6 +1065,8 @@ impl TxContext { epoch: *epoch_id, epoch_timestamp_ms, ids_created: 0, + gas_price, + sponsor: sponsor.map(|s| s.into()), } } @@ -1126,20 +1142,6 @@ impl TxContext { self.ids_created = other.ids_created; Ok(()) } - - // Generate a random TxContext for testing. - pub fn random_for_testing_only() -> Self { - Self::new( - &SuiAddress::random_for_testing_only(), - &TransactionDigest::random(), - &EpochData::new_test(), - ) - } - - /// Generate a TxContext for testing with a specific sender. - pub fn with_sender_for_testing_only(sender: &SuiAddress) -> Self { - Self::new(sender, &TransactionDigest::random(), &EpochData::new_test()) - } } // TODO: rename to version diff --git a/crates/sui-types/src/gas.rs b/crates/sui-types/src/gas.rs index 5ab5ec6749d4e..bd98f34da80eb 100644 --- a/crates/sui-types/src/gas.rs +++ b/crates/sui-types/src/gas.rs @@ -32,6 +32,7 @@ pub mod checked { fn bucketize_computation(&mut self) -> Result<(), ExecutionError>; fn summary(&self) -> GasCostSummary; fn gas_budget(&self) -> u64; + fn gas_price(&self) -> u64; fn storage_gas_units(&self) -> u64; fn storage_rebate(&self) -> u64; fn unmetered_storage_rebate(&self) -> u64; @@ -107,6 +108,12 @@ pub mod checked { Self::V2(status) => status.check_gas_balance(gas_objs, gas_budget), } } + + pub fn gas_price(&self) -> u64 { + match self { + Self::V2(status) => status.gas_price(), + } + } } /// Summary of the charges in a transaction. diff --git a/crates/sui-types/src/gas_model/gas_v2.rs b/crates/sui-types/src/gas_model/gas_v2.rs index 7b3ed4431c060..7e3560301c347 100644 --- a/crates/sui-types/src/gas_model/gas_v2.rs +++ b/crates/sui-types/src/gas_model/gas_v2.rs @@ -408,6 +408,10 @@ mod checked { self.gas_budget } + fn gas_price(&self) -> u64 { + self.gas_price + } + fn storage_gas_units(&self) -> u64 { self.per_object_storage .iter() diff --git a/crates/sui-types/src/transaction.rs b/crates/sui-types/src/transaction.rs index 89570ac15e101..988c7fe26b619 100644 --- a/crates/sui-types/src/transaction.rs +++ b/crates/sui-types/src/transaction.rs @@ -1983,12 +1983,8 @@ impl TransactionData { } } - pub fn execution_parts(&self) -> (TransactionKind, SuiAddress, Vec) { - ( - self.kind().clone(), - self.sender(), - self.gas_data().payment.clone(), - ) + pub fn execution_parts(&self) -> (TransactionKind, SuiAddress, GasData) { + (self.kind().clone(), self.sender(), self.gas_data().clone()) } pub fn uses_randomness(&self) -> bool { diff --git a/sui-execution/latest/sui-adapter/src/execution_engine.rs b/sui-execution/latest/sui-adapter/src/execution_engine.rs index 60b803d02b469..21aa916b65e87 100644 --- a/sui-execution/latest/sui-adapter/src/execution_engine.rs +++ b/sui-execution/latest/sui-adapter/src/execution_engine.rs @@ -67,12 +67,12 @@ mod checked { use sui_types::sui_system_state::{AdvanceEpochParams, ADVANCE_EPOCH_SAFE_MODE_FUNCTION_NAME}; use sui_types::transaction::{ Argument, AuthenticatorStateExpire, AuthenticatorStateUpdate, CallArg, ChangeEpoch, - Command, EndOfEpochTransactionKind, GenesisTransaction, ObjectArg, ProgrammableTransaction, - StoredExecutionTimeObservations, TransactionKind, + Command, EndOfEpochTransactionKind, GasData, GenesisTransaction, ObjectArg, + ProgrammableTransaction, StoredExecutionTimeObservations, TransactionKind, }; use sui_types::transaction::{CheckedInputObjects, RandomnessStateUpdate}; use sui_types::{ - base_types::{ObjectID, ObjectRef, SuiAddress, TransactionDigest, TxContext}, + base_types::{ObjectID, SuiAddress, TransactionDigest, TxContext}, object::{Object, ObjectInner}, sui_system_state::{ADVANCE_EPOCH_FUNCTION_NAME, SUI_SYSTEM_MODULE_NAME}, SUI_AUTHENTICATOR_STATE_OBJECT_ID, SUI_FRAMEWORK_ADDRESS, SUI_FRAMEWORK_PACKAGE_ID, @@ -83,7 +83,7 @@ mod checked { pub fn execute_transaction_to_effects( store: &dyn BackingStore, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas_data: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -124,14 +124,29 @@ mod checked { *epoch_id, ); - let mut gas_charger = - GasCharger::new(transaction_digest, gas_coins, gas_status, protocol_config); + let sponsor = { + let gas_owner = gas_data.owner; + if gas_owner == transaction_signer { + None + } else { + Some(gas_owner) + } + }; + let gas_price = gas_status.gas_price(); + let mut gas_charger = GasCharger::new( + transaction_digest, + gas_data.payment, + gas_status, + protocol_config, + ); let mut tx_ctx = TxContext::new_from_components( &transaction_signer, &transaction_digest, epoch_id, epoch_timestamp_ms, + gas_price, + sponsor, ); let is_epoch_change = transaction_kind.is_end_of_epoch_tx(); diff --git a/sui-execution/src/executor.rs b/sui-execution/src/executor.rs index cece755b95161..9a596dc2cdc3a 100644 --- a/sui-execution/src/executor.rs +++ b/sui-execution/src/executor.rs @@ -6,8 +6,9 @@ use std::{collections::HashSet, sync::Arc}; use sui_protocol_config::ProtocolConfig; use sui_types::execution::ExecutionTiming; use sui_types::storage::BackingStore; +use sui_types::transaction::GasData; use sui_types::{ - base_types::{ObjectRef, SuiAddress}, + base_types::SuiAddress, committee::EpochId, digests::TransactionDigest, effects::TransactionEffects, @@ -36,7 +37,7 @@ pub trait Executor { // Transaction Inputs input_objects: CheckedInputObjects, // Gas related - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, // Transaction transaction_kind: TransactionKind, @@ -65,7 +66,7 @@ pub trait Executor { // Transaction Inputs input_objects: CheckedInputObjects, // Gas related - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, // Transaction transaction_kind: TransactionKind, diff --git a/sui-execution/src/latest.rs b/sui-execution/src/latest.rs index 5b874377ff1c4..3709fcbcca22a 100644 --- a/sui-execution/src/latest.rs +++ b/sui-execution/src/latest.rs @@ -1,16 +1,15 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -use std::path::PathBuf; -use std::{collections::HashSet, sync::Arc}; - use move_binary_format::CompiledModule; use move_trace_format::format::MoveTraceBuilder; use move_vm_config::verifier::{MeterConfig, VerifierConfig}; +use std::{collections::HashSet, path::PathBuf, sync::Arc}; use sui_protocol_config::ProtocolConfig; use sui_types::execution::ExecutionTiming; +use sui_types::transaction::GasData; use sui_types::{ - base_types::{ObjectRef, SuiAddress, TxContext}, + base_types::{SuiAddress, TxContext}, committee::EpochId, digests::TransactionDigest, effects::TransactionEffects, @@ -76,7 +75,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -92,7 +91,7 @@ impl executor::Executor for Executor { execute_transaction_to_effects::( store, input_objects, - gas_coins, + gas, gas_status, transaction_kind, transaction_signer, @@ -118,7 +117,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -134,7 +133,7 @@ impl executor::Executor for Executor { execute_transaction_to_effects::>( store, input_objects, - gas_coins, + gas, gas_status, transaction_kind, transaction_signer, @@ -152,7 +151,7 @@ impl executor::Executor for Executor { execute_transaction_to_effects::>( store, input_objects, - gas_coins, + gas, gas_status, transaction_kind, transaction_signer, @@ -186,6 +185,9 @@ impl executor::Executor for Executor { transaction_digest, &epoch_id, epoch_timestamp_ms, + // genesis transaction: RGP: 1, sponsor: None + 1, + None, ); execute_genesis_state_update( store, diff --git a/sui-execution/src/v0.rs b/sui-execution/src/v0.rs index ccff6987c38ce..5f9a9618d8bae 100644 --- a/sui-execution/src/v0.rs +++ b/sui-execution/src/v0.rs @@ -9,8 +9,9 @@ use move_trace_format::format::MoveTraceBuilder; use move_vm_config::verifier::{MeterConfig, VerifierConfig}; use sui_protocol_config::ProtocolConfig; use sui_types::execution::ExecutionTiming; +use sui_types::transaction::GasData; use sui_types::{ - base_types::{ObjectRef, SuiAddress, TxContext}, + base_types::{SuiAddress, TxContext}, committee::EpochId, digests::TransactionDigest, effects::TransactionEffects, @@ -76,7 +77,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -89,6 +90,7 @@ impl executor::Executor for Executor { Vec, Result<(), ExecutionError>, ) { + let gas_coins = gas.payment; let (inner_temp_store, gas_status, effects, result) = execute_transaction_to_effects::( store, @@ -120,7 +122,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -132,6 +134,7 @@ impl executor::Executor for Executor { TransactionEffects, Result, ExecutionError>, ) { + let gas_coins = gas.payment; if skip_all_checks { execute_transaction_to_effects::>( store, @@ -185,6 +188,10 @@ impl executor::Executor for Executor { transaction_digest, &epoch_id, epoch_timestamp_ms, + // genesis transaction: RGP: 1, sponsor: None + // Those values are unused anyway in execution versions before 3 (or latest) + 1, + None, ); execute_genesis_state_update( store, diff --git a/sui-execution/src/v1.rs b/sui-execution/src/v1.rs index 5d95310e76b5f..026a686a88d06 100644 --- a/sui-execution/src/v1.rs +++ b/sui-execution/src/v1.rs @@ -9,8 +9,9 @@ use move_trace_format::format::MoveTraceBuilder; use move_vm_config::verifier::{MeterConfig, VerifierConfig}; use sui_protocol_config::ProtocolConfig; use sui_types::execution::ExecutionTiming; +use sui_types::transaction::GasData; use sui_types::{ - base_types::{ObjectRef, SuiAddress, TxContext}, + base_types::{SuiAddress, TxContext}, committee::EpochId, digests::TransactionDigest, effects::TransactionEffects, @@ -76,7 +77,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -89,6 +90,7 @@ impl executor::Executor for Executor { Vec, Result<(), ExecutionError>, ) { + let gas_coins = gas.payment; let (inner_temp_store, gas_status, effects, result) = execute_transaction_to_effects::( store, @@ -120,7 +122,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -132,6 +134,7 @@ impl executor::Executor for Executor { TransactionEffects, Result, ExecutionError>, ) { + let gas_coins = gas.payment; if skip_all_checks { execute_transaction_to_effects::>( store, @@ -185,6 +188,10 @@ impl executor::Executor for Executor { transaction_digest, &epoch_id, epoch_timestamp_ms, + // genesis transaction: RGP: 1, sponsor: None + // Those values are unused anyway in execution versions before 3 (or latest) + 1, + None, ); execute_genesis_state_update( store, diff --git a/sui-execution/src/v2.rs b/sui-execution/src/v2.rs index 0ecf0a597139c..c2e06de3aa581 100644 --- a/sui-execution/src/v2.rs +++ b/sui-execution/src/v2.rs @@ -9,8 +9,9 @@ use move_trace_format::format::MoveTraceBuilder; use move_vm_config::verifier::{MeterConfig, VerifierConfig}; use sui_protocol_config::ProtocolConfig; use sui_types::execution::ExecutionTiming; +use sui_types::transaction::GasData; use sui_types::{ - base_types::{ObjectRef, SuiAddress, TxContext}, + base_types::{SuiAddress, TxContext}, committee::EpochId, digests::TransactionDigest, effects::TransactionEffects, @@ -76,7 +77,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -89,6 +90,7 @@ impl executor::Executor for Executor { Vec, Result<(), ExecutionError>, ) { + let gas_coins = gas.payment; let (inner_temp_store, gas_status, effects, result) = execute_transaction_to_effects::( store, @@ -120,7 +122,7 @@ impl executor::Executor for Executor { epoch_id: &EpochId, epoch_timestamp_ms: u64, input_objects: CheckedInputObjects, - gas_coins: Vec, + gas: GasData, gas_status: SuiGasStatus, transaction_kind: TransactionKind, transaction_signer: SuiAddress, @@ -132,6 +134,7 @@ impl executor::Executor for Executor { TransactionEffects, Result, ExecutionError>, ) { + let gas_coins = gas.payment; if skip_all_checks { execute_transaction_to_effects::>( store, @@ -185,6 +188,10 @@ impl executor::Executor for Executor { transaction_digest, &epoch_id, epoch_timestamp_ms, + // genesis transaction: RGP: 1, sponsor: None + // Those values are unused anyway in execution versions before 3 (or latest) + 1, + None, ); execute_genesis_state_update( store, diff --git a/sui-execution/v0/sui-adapter/src/execution_engine.rs b/sui-execution/v0/sui-adapter/src/execution_engine.rs index 816ccf814e431..920e1552cd733 100644 --- a/sui-execution/v0/sui-adapter/src/execution_engine.rs +++ b/sui-execution/v0/sui-adapter/src/execution_engine.rs @@ -87,6 +87,9 @@ mod checked { &transaction_digest, epoch_id, epoch_timestamp_ms, + // Those values are unused in execution versions before 3 (or latest) + 1, + None, ); let is_epoch_change = matches!(transaction_kind, TransactionKind::ChangeEpoch(_)); diff --git a/sui-execution/v1/sui-adapter/src/execution_engine.rs b/sui-execution/v1/sui-adapter/src/execution_engine.rs index edca8b5936693..1670794ed301e 100644 --- a/sui-execution/v1/sui-adapter/src/execution_engine.rs +++ b/sui-execution/v1/sui-adapter/src/execution_engine.rs @@ -103,6 +103,9 @@ mod checked { &transaction_digest, epoch_id, epoch_timestamp_ms, + // Those values are unused in execution versions before 3 (or latest) + 1, + None, ); let is_epoch_change = transaction_kind.is_end_of_epoch_tx(); diff --git a/sui-execution/v2/sui-adapter/src/execution_engine.rs b/sui-execution/v2/sui-adapter/src/execution_engine.rs index e7e36bf92b90a..1cf536717eb6c 100644 --- a/sui-execution/v2/sui-adapter/src/execution_engine.rs +++ b/sui-execution/v2/sui-adapter/src/execution_engine.rs @@ -114,6 +114,9 @@ mod checked { &transaction_digest, epoch_id, epoch_timestamp_ms, + // Those values are unused in execution versions before 3 (or latest) + 1, + None, ); let is_epoch_change = transaction_kind.is_end_of_epoch_tx();