|
2 | 2 | // Copyright (c) Mysten Labs, Inc. |
3 | 3 | // SPDX-License-Identifier: Apache-2.0 |
4 | 4 |
|
| 5 | +use crate::accumulators::AccumulatorSettlementTxBuilder; |
5 | 6 | use crate::accumulators::balance_read::AccountBalanceRead; |
6 | 7 | use crate::checkpoints::CheckpointBuilderError; |
7 | 8 | use crate::checkpoints::CheckpointBuilderResult; |
@@ -3909,6 +3910,82 @@ impl AuthorityState { |
3909 | 3910 | Ok(new_epoch_store) |
3910 | 3911 | } |
3911 | 3912 |
|
| 3913 | + pub async fn settle_transactions_for_testing( |
| 3914 | + &self, |
| 3915 | + ckpt_seq: CheckpointSequenceNumber, |
| 3916 | + effects: &[TransactionEffects], |
| 3917 | + ) { |
| 3918 | + let builder = AccumulatorSettlementTxBuilder::new( |
| 3919 | + Some(self.get_transaction_cache_reader().as_ref()), |
| 3920 | + effects, |
| 3921 | + ckpt_seq, |
| 3922 | + 0, |
| 3923 | + ); |
| 3924 | + let epoch_store = self.epoch_store_for_testing(); |
| 3925 | + let epoch = epoch_store.epoch(); |
| 3926 | + let (settlements, barrier) = builder.build_tx( |
| 3927 | + epoch_store.protocol_config(), |
| 3928 | + epoch, |
| 3929 | + epoch_store |
| 3930 | + .epoch_start_config() |
| 3931 | + .accumulator_root_obj_initial_shared_version() |
| 3932 | + .unwrap(), |
| 3933 | + ckpt_seq, |
| 3934 | + ckpt_seq, |
| 3935 | + ); |
| 3936 | + |
| 3937 | + let settlements: Vec<_> = settlements |
| 3938 | + .into_iter() |
| 3939 | + .map(|tx| { |
| 3940 | + VerifiedExecutableTransaction::new_system( |
| 3941 | + VerifiedTransaction::new_system_transaction(tx), |
| 3942 | + epoch, |
| 3943 | + ) |
| 3944 | + }) |
| 3945 | + .collect(); |
| 3946 | + let barrier = VerifiedExecutableTransaction::new_system( |
| 3947 | + VerifiedTransaction::new_system_transaction(barrier), |
| 3948 | + epoch, |
| 3949 | + ); |
| 3950 | + |
| 3951 | + let assigned_versions = epoch_store |
| 3952 | + .assign_shared_object_versions_for_tests( |
| 3953 | + self.get_object_cache_reader().as_ref(), |
| 3954 | + &settlements, |
| 3955 | + ) |
| 3956 | + .unwrap(); |
| 3957 | + |
| 3958 | + let version_map = assigned_versions.into_map(); |
| 3959 | + |
| 3960 | + for tx in settlements { |
| 3961 | + let env = ExecutionEnv::new() |
| 3962 | + .with_assigned_versions(version_map.get(&tx.key()).unwrap().clone()); |
| 3963 | + let (effects, _) = self |
| 3964 | + .try_execute_immediately(&tx, env, &epoch_store) |
| 3965 | + .await |
| 3966 | + .unwrap(); |
| 3967 | + assert!(effects.status().is_ok()); |
| 3968 | + } |
| 3969 | + |
| 3970 | + let assigned_versions = epoch_store |
| 3971 | + .assign_shared_object_versions_for_tests( |
| 3972 | + self.get_object_cache_reader().as_ref(), |
| 3973 | + std::slice::from_ref(&barrier), |
| 3974 | + ) |
| 3975 | + .unwrap() |
| 3976 | + .0 |
| 3977 | + .into_iter() |
| 3978 | + .next() |
| 3979 | + .unwrap() |
| 3980 | + .1; |
| 3981 | + let env = ExecutionEnv::new().with_assigned_versions(assigned_versions); |
| 3982 | + let (effects, _) = self |
| 3983 | + .try_execute_immediately(&barrier, env, &epoch_store) |
| 3984 | + .await |
| 3985 | + .unwrap(); |
| 3986 | + assert!(effects.status().is_ok()); |
| 3987 | + } |
| 3988 | + |
3912 | 3989 | /// Advance the epoch store to the next epoch for testing only. |
3913 | 3990 | /// This only manually sets all the places where we have the epoch number. |
3914 | 3991 | /// It doesn't properly reconfigure the node, hence should be only used for testing. |
|
0 commit comments