From a4b382099c689e6acad401b95f29b1edd5d19a54 Mon Sep 17 00:00:00 2001 From: Dario Russi <113150618+dariorussi@users.noreply.github.com> Date: Wed, 23 Oct 2024 18:51:07 -0500 Subject: [PATCH] tx context --- crates/sui-genesis-builder/src/lib.rs | 46 +++++++++--------- crates/sui-types/src/base_types.rs | 4 ++ .../sui-adapter/src/execution_engine.rs | 48 ++++++++++--------- .../src/programmable_transactions/context.rs | 4 +- .../programmable_transactions/execution.rs | 2 +- .../latest/sui-adapter/src/temporary_store.rs | 4 ++ 6 files changed, 60 insertions(+), 48 deletions(-) diff --git a/crates/sui-genesis-builder/src/lib.rs b/crates/sui-genesis-builder/src/lib.rs index 7d440f701f309b..0496ebf089a756 100644 --- a/crates/sui-genesis-builder/src/lib.rs +++ b/crates/sui-genesis-builder/src/lib.rs @@ -681,16 +681,15 @@ impl Builder { } } -// Create a Genesis Txn Context to be used when generating genesis objects by hashing all of the +// Create a Genesis Txn Digest to be used when generating genesis objects by hashing all of the // inputs into genesis ans using that as our "Txn Digest". This is done to ensure that coin objects // created between chains are unique -fn create_genesis_context( - epoch_data: &EpochData, +fn create_genesis_digest( genesis_chain_parameters: &GenesisChainParameters, genesis_validators: &[GenesisValidatorMetadata], token_distribution_schedule: &TokenDistributionSchedule, system_packages: &[SystemPackage], -) -> TxContext { +) -> TransactionDigest { let mut hasher = DefaultHash::default(); hasher.update(b"sui-genesis"); hasher.update(bcs::to_bytes(genesis_chain_parameters).unwrap()); @@ -701,13 +700,7 @@ fn create_genesis_context( } let hash = hasher.finalize(); - let genesis_transaction_digest = TransactionDigest::new(hash.into()); - - TxContext::new( - &SuiAddress::default(), - &genesis_transaction_digest, - epoch_data, - ) + TransactionDigest::new(hash.into()) } fn get_genesis_protocol_config(version: ProtocolVersion) -> ProtocolConfig { @@ -755,8 +748,7 @@ fn build_unsigned_genesis_data( // This is a no-op under normal conditions and only an issue with certain tests. update_system_packages_from_objects(&mut system_packages, objects); - let mut genesis_ctx = create_genesis_context( - &epoch_data, + let genesis_digest = create_genesis_digest( &genesis_chain_parameters, &genesis_validators, token_distribution_schedule, @@ -768,7 +760,8 @@ fn build_unsigned_genesis_data( let metrics = Arc::new(LimitsMetrics::new(®istry)); let objects = create_genesis_objects( - &mut genesis_ctx, + &epoch_data, + &genesis_digest, objects, &genesis_validators, &genesis_chain_parameters, @@ -957,7 +950,8 @@ fn create_genesis_transaction( } fn create_genesis_objects( - genesis_ctx: &mut TxContext, + epoch_data: &EpochData, + genesis_digest: &TransactionDigest, input_objects: &[Object], validators: &[GenesisValidatorMetadata], parameters: &GenesisChainParameters, @@ -982,8 +976,9 @@ fn create_genesis_objects( process_package( &mut store, executor.as_ref(), - genesis_ctx, - &system_package.modules(), + epoch_data, + genesis_digest, + &system_package.modules(), system_package.dependencies().to_vec(), &protocol_config, metrics.clone(), @@ -1001,8 +996,9 @@ fn create_genesis_objects( &mut store, executor.as_ref(), validators, - genesis_ctx, - parameters, + epoch_data, + genesis_digest, + parameters, token_distribution_schedule, metrics, ) @@ -1014,7 +1010,8 @@ fn create_genesis_objects( fn process_package( store: &mut InMemoryStorage, executor: &dyn Executor, - ctx: &mut TxContext, + epoch_data: &EpochData, + genesis_digest: &TransactionDigest, modules: &[CompiledModule], dependencies: Vec, protocol_config: &ProtocolConfig, @@ -1066,11 +1063,12 @@ fn process_package( builder.command(Command::Publish(module_bytes, dependencies)); builder.finish() }; + let mut genesis_ctx = TxContext::new(&SuiAddress::default(), genesis_digest, epoch_data); let InnerTemporaryStore { written, .. } = executor.update_genesis_state( &*store, protocol_config, metrics, - ctx, + &mut genesis_ctx, CheckedInputObjects::new_for_genesis(loaded_dependencies), pt, )?; @@ -1084,7 +1082,8 @@ pub fn generate_genesis_system_object( store: &mut InMemoryStorage, executor: &dyn Executor, genesis_validators: &[GenesisValidatorMetadata], - genesis_ctx: &mut TxContext, + epoch_data: &EpochData, + genesis_digest: &TransactionDigest, genesis_chain_parameters: &GenesisChainParameters, token_distribution_schedule: &TokenDistributionSchedule, metrics: Arc, @@ -1192,11 +1191,12 @@ pub fn generate_genesis_system_object( builder.finish() }; + let mut genesis_ctx = TxContext::new(&SuiAddress::default(), genesis_digest, epoch_data); let InnerTemporaryStore { mut written, .. } = executor.update_genesis_state( &*store, &protocol_config, metrics, - genesis_ctx, + &mut genesis_ctx, CheckedInputObjects::new_for_genesis(vec![]), pt, )?; diff --git a/crates/sui-types/src/base_types.rs b/crates/sui-types/src/base_types.rs index 9c28ad12d17666..c1b3001030382b 100644 --- a/crates/sui-types/src/base_types.rs +++ b/crates/sui-types/src/base_types.rs @@ -1045,6 +1045,10 @@ impl TxContext { Ok(()) } + pub fn add_ids_created(&mut self, ids_created: u64) { + self.ids_created += ids_created; + } + // Generate a random TxContext for testing. pub fn random_for_testing_only() -> Self { Self::new( diff --git a/sui-execution/latest/sui-adapter/src/execution_engine.rs b/sui-execution/latest/sui-adapter/src/execution_engine.rs index 306e2a9d251263..9dce310e2967ea 100644 --- a/sui-execution/latest/sui-adapter/src/execution_engine.rs +++ b/sui-execution/latest/sui-adapter/src/execution_engine.rs @@ -122,7 +122,7 @@ mod checked { let mut gas_charger = GasCharger::new(transaction_digest, gas_coins, gas_status, protocol_config); - let mut tx_ctx = TxContext::new_from_components( + let tx_ctx = TxContext::new_from_components( &transaction_signer, &transaction_digest, epoch_id, @@ -136,7 +136,7 @@ mod checked { &mut temporary_store, transaction_kind, &mut gas_charger, - &mut tx_ctx, + tx_ctx, move_vm, protocol_config, metrics, @@ -257,7 +257,7 @@ mod checked { metrics, move_vm, &mut temporary_store, - tx_context, + tx_context.clone(), &mut gas_charger, pt, )?; @@ -270,7 +270,7 @@ mod checked { temporary_store: &mut TemporaryStore<'_>, transaction_kind: TransactionKind, gas_charger: &mut GasCharger, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &Arc, protocol_config: &ProtocolConfig, metrics: Arc, @@ -292,6 +292,7 @@ mod checked { let is_genesis_tx = matches!(transaction_kind, TransactionKind::Genesis(_)); let advance_epoch_gas_summary = transaction_kind.get_advance_epoch_tx_gas_summary(); + let digest = tx_ctx.digest(); // We must charge object read here during transaction execution, because if this fails // we must still ensure an effect is committed and all objects versions incremented @@ -371,7 +372,7 @@ mod checked { if let Err(e) = run_conservation_checks::( temporary_store, gas_charger, - tx_ctx, + digest, move_vm, protocol_config.simple_conservation_checks(), enable_expensive_checks, @@ -390,7 +391,7 @@ mod checked { fn run_conservation_checks( temporary_store: &mut TemporaryStore<'_>, gas_charger: &mut GasCharger, - tx_ctx: &mut TxContext, + tx_digest: TransactionDigest, move_vm: &Arc, simple_conservation_checks: bool, enable_expensive_checks: bool, @@ -449,7 +450,7 @@ mod checked { // we will create or destroy SUI otherwise panic!( "SUI conservation fail in tx block {}: {}\nGas status is {}\nTx was ", - tx_ctx.digest(), + tx_digest, recovery_err, gas_charger.summary() ) @@ -545,7 +546,7 @@ mod checked { fn execution_loop( temporary_store: &mut TemporaryStore<'_>, transaction_kind: TransactionKind, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &Arc, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, @@ -855,7 +856,7 @@ mod checked { builder: ProgrammableTransactionBuilder, change_epoch: ChangeEpoch, temporary_store: &mut TemporaryStore<'_>, - tx_ctx: &mut TxContext, + mut tx_ctx: TxContext, move_vm: &Arc, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, @@ -878,21 +879,22 @@ mod checked { metrics.clone(), move_vm, temporary_store, - tx_ctx, + tx_ctx.clone(), gas_charger, advance_epoch_pt, ); + tx_ctx.add_ids_created(temporary_store.objects_created_count() as u64); #[cfg(msim)] let result = maybe_modify_result(result, change_epoch.epoch); if result.is_err() { tracing::error!( - "Failed to execute advance epoch transaction. Switching to safe mode. Error: {:?}. Input objects: {:?}. Tx data: {:?}", - result.as_ref().err(), - temporary_store.objects(), - change_epoch, - ); + "Failed to execute advance epoch transaction. Switching to safe mode. Error: {:?}. Input objects: {:?}. Tx data: {:?}", + result.as_ref().err(), + temporary_store.objects(), + change_epoch, + ); temporary_store.drop_writes(); // Must reset the storage rebate since we are re-executing. gas_charger.reset_storage_cost_and_rebate(); @@ -907,11 +909,12 @@ mod checked { metrics.clone(), move_vm, temporary_store, - tx_ctx, + tx_ctx.clone(), gas_charger, advance_epoch_safe_mode_pt, ) .expect("Advance epoch with safe mode must succeed"); + tx_ctx.add_ids_created(temporary_store.objects_created_count() as u64); } } @@ -948,12 +951,13 @@ mod checked { fn process_system_packages( change_epoch: ChangeEpoch, temporary_store: &mut TemporaryStore<'_>, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &MoveVM, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, metrics: Arc, ) { + let digest = tx_ctx.digest(); let binary_config = to_binary_config(protocol_config); for (version, modules, dependencies) in change_epoch.system_packages.into_iter() { let deserialized_modules: Vec<_> = modules @@ -976,7 +980,7 @@ mod checked { metrics.clone(), move_vm, temporary_store, - tx_ctx, + tx_ctx.clone(), gas_charger, publish_pt, ) @@ -986,7 +990,7 @@ mod checked { &deserialized_modules, version, dependencies, - tx_ctx.digest(), + digest, ); info!( @@ -1015,7 +1019,7 @@ mod checked { fn setup_consensus_commit( consensus_commit_timestamp_ms: CheckpointTimestamp, temporary_store: &mut TemporaryStore<'_>, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &Arc, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, @@ -1152,7 +1156,7 @@ mod checked { fn setup_authenticator_state_update( update: AuthenticatorStateUpdate, temporary_store: &mut TemporaryStore<'_>, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &Arc, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, @@ -1217,7 +1221,7 @@ mod checked { fn setup_randomness_state_update( update: RandomnessStateUpdate, temporary_store: &mut TemporaryStore<'_>, - tx_ctx: &mut TxContext, + tx_ctx: TxContext, move_vm: &Arc, gas_charger: &mut GasCharger, protocol_config: &ProtocolConfig, diff --git a/sui-execution/latest/sui-adapter/src/programmable_transactions/context.rs b/sui-execution/latest/sui-adapter/src/programmable_transactions/context.rs index f80465b0256012..fce24abd06712d 100644 --- a/sui-execution/latest/sui-adapter/src/programmable_transactions/context.rs +++ b/sui-execution/latest/sui-adapter/src/programmable_transactions/context.rs @@ -79,7 +79,7 @@ mod checked { pub state_view: &'state dyn ExecutionState, /// A shared transaction context, contains transaction digest information and manages the /// creation of new object IDs - pub tx_context: &'a mut TxContext, + pub tx_context: TxContext, /// The gas charger used for metering pub gas_charger: &'a mut GasCharger, /// Additional transfers not from the Move runtime @@ -121,7 +121,7 @@ mod checked { metrics: Arc, vm: &'vm MoveVM, state_view: &'state dyn ExecutionState, - tx_context: &'a mut TxContext, + tx_context: TxContext, gas_charger: &'a mut GasCharger, inputs: Vec, ) -> Result diff --git a/sui-execution/latest/sui-adapter/src/programmable_transactions/execution.rs b/sui-execution/latest/sui-adapter/src/programmable_transactions/execution.rs index 2b72db72220217..9c4a785df97c6a 100644 --- a/sui-execution/latest/sui-adapter/src/programmable_transactions/execution.rs +++ b/sui-execution/latest/sui-adapter/src/programmable_transactions/execution.rs @@ -71,7 +71,7 @@ mod checked { metrics: Arc, vm: &MoveVM, state_view: &mut dyn ExecutionState, - tx_context: &mut TxContext, + tx_context: TxContext, gas_charger: &mut GasCharger, pt: ProgrammableTransaction, ) -> Result { diff --git a/sui-execution/latest/sui-adapter/src/temporary_store.rs b/sui-execution/latest/sui-adapter/src/temporary_store.rs index 8e4223f2485ed3..b172ed3e791809 100644 --- a/sui-execution/latest/sui-adapter/src/temporary_store.rs +++ b/sui-execution/latest/sui-adapter/src/temporary_store.rs @@ -123,6 +123,10 @@ impl<'backing> TemporaryStore<'backing> { &self.input_objects } + pub fn objects_created_count(&self) -> usize { + self.execution_results.created_object_ids.len() + } + pub fn update_object_version_and_prev_tx(&mut self) { self.execution_results.update_version_and_previous_tx( self.lamport_timestamp,