Struct Simulacrum

Source
pub struct Simulacrum<R = OsRng, Store: SimulatorStore = InMemoryStore> { /* private fields */ }
Expand description

A Simulacrum of Sui.

This type represents a simulated instantiation of a Sui blockchain that needs to be driven manually, that is time doesn’t advance and checkpoints are not formed unless explicitly requested.

See module level documentation for more details.

Implementations§

Source§

impl Simulacrum

Source

pub fn new() -> Self

Create a new, random Simulacrum instance using an OsRng as the source of randomness.

Source§

impl<R> Simulacrum<R>
where R: RngCore + CryptoRng,

Source

pub fn new_with_rng(rng: R) -> Self

Create a new Simulacrum instance using the provided rng.

This allows you to create a fully deterministic initial chainstate when a seeded rng is used.

use simulacrum::Simulacrum;
use rand::{SeedableRng, rngs::StdRng};

let mut rng = StdRng::seed_from_u64(1);
let simulacrum = Simulacrum::new_with_rng(rng);
Source

pub fn new_with_protocol_version( rng: R, protocol_version: ProtocolVersion, ) -> Self

Create a new Simulacrum instance with a specific protocol version.

Source

pub fn new_with_protocol_version_and_accounts( rng: R, chain_start_timestamp_ms: u64, protocol_version: ProtocolVersion, account_configs: Vec<AccountConfig>, ) -> Self

Source§

impl<R, S: SimulatorStore> Simulacrum<R, S>

Source

pub fn new_with_network_config_store( config: &NetworkConfig, rng: R, store: S, ) -> Self

Source

pub fn execute_transaction( &mut self, transaction: Transaction, ) -> Result<(TransactionEffects, Option<ExecutionError>)>

Attempts to execute the provided Transaction.

The provided Transaction undergoes the same types of checks that a Validator does prior to signing and executing in the production system. Some of these checks are as follows:

  • User signature is valid
  • Sender owns all OwnedObject inputs
  • etc

If the above checks are successful then the transaction is immediately executed, enqueued to be included in the next checkpoint (the next time create_checkpoint is called) and the corresponding TransactionEffects are returned.

Source

pub fn create_checkpoint(&mut self) -> VerifiedCheckpoint

Creates the next Checkpoint using the Transactions enqueued since the last checkpoint was created.

Source

pub fn advance_clock(&mut self, duration: Duration) -> TransactionEffects

Advances the clock by duration.

This creates and executes a ConsensusCommitPrologue transaction which advances the chain Clock by the provided duration.

Source

pub fn advance_epoch(&mut self, config: AdvanceEpochConfig)

Advances the epoch.

This creates and executes an EndOfEpoch transaction which advances the chain into the next epoch. Since it is required to be the final transaction in an epoch, the final checkpoint in the epoch is also created.

The config parameter controls which special end-of-epoch transactions are created as part of this epoch change.

NOTE: This function does not currently support updating the protocol version

Source

pub fn store(&self) -> &dyn SimulatorStore

Source

pub fn keystore(&self) -> &KeyStore

Source

pub fn epoch_start_state(&self) -> &EpochStartSystemState

Source

pub fn rng(&mut self) -> &mut R

Return a handle to the internally held RNG.

Returns a handle to the RNG used to create this Simulacrum for use as a source of randomness. Using a seeded RNG to build a Simulacrum and then utilizing the stored RNG as a source of randomness can lead to a fully deterministic chain evolution.

Source

pub fn reference_gas_price(&self) -> u64

Return the reference gas price for the current epoch

Source

pub fn funded_account( &mut self, amount: u64, ) -> Result<(SuiAddress, AccountKeyPair, ObjectRef)>

Create a new account and credit it with amount gas units from a faucet account. Returns the account, its keypair, and a reference to the gas object it was funded with.

use simulacrum::Simulacrum;
use sui_types::base_types::SuiAddress;
use sui_types::gas_coin::MIST_PER_SUI;

let mut simulacrum = Simulacrum::new();
let (account, kp, gas) = simulacrum.funded_account(MIST_PER_SUI).unwrap();

// `account` is a fresh SuiAddress that owns a Coin<SUI> object with single SUI in it,
// referred to by `gas`.
// ...
Source

pub fn request_gas( &mut self, address: SuiAddress, amount: u64, ) -> Result<TransactionEffects>

Request that amount Mist be sent to address from a faucet account.

use simulacrum::Simulacrum;
use sui_types::base_types::SuiAddress;
use sui_types::gas_coin::MIST_PER_SUI;

let mut simulacrum = Simulacrum::new();
let address = SuiAddress::generate(simulacrum.rng());
simulacrum.request_gas(address, MIST_PER_SUI).unwrap();

// `account` now has a Coin<SUI> object with single SUI in it.
// ...
Source

pub fn set_data_ingestion_path(&mut self, data_ingestion_path: PathBuf)

Source

pub fn override_next_checkpoint_number( &mut self, number: CheckpointSequenceNumber, )

Source§

impl Simulacrum

Source

pub fn transfer_txn(&mut self, recipient: SuiAddress) -> (Transaction, u64)

Generate a random transfer transaction. TODO: This is here today to make it easier to write tests. But we should utilize all the existing code for generating transactions in sui-test-transaction-builder by defining a trait that both WalletContext and Simulacrum implement. Then we can remove this function.

Trait Implementations§

Source§

impl<T, V: SimulatorStore> ObjectStore for Simulacrum<T, V>

Source§

fn get_object(&self, object_id: &ObjectID) -> Option<Object>

Source§

fn get_object_by_key( &self, object_id: &ObjectID, version: VersionNumber, ) -> Option<Object>

Source§

fn multi_get_objects(&self, object_ids: &[ObjectID]) -> Vec<Option<Object>>

Source§

fn multi_get_objects_by_key( &self, object_keys: &[ObjectKey], ) -> Vec<Option<Object>>

Source§

impl<T, V: SimulatorStore> ReadStore for Simulacrum<T, V>

Source§

fn get_committee(&self, _epoch: EpochId) -> Option<Arc<Committee>>

Source§

fn get_latest_checkpoint(&self) -> Result<VerifiedCheckpoint>

Get the latest available checkpoint. This is the latest executed checkpoint. Read more
Source§

fn get_latest_epoch_id(&self) -> Result<EpochId>

Get the epoch of the latest checkpoint
Source§

fn get_highest_verified_checkpoint(&self) -> Result<VerifiedCheckpoint>

Get the highest verified checkpint. This is the highest checkpoint summary that has been verified, generally by state-sync. Only the checkpoint header is guaranteed to be present in the store.
Source§

fn get_highest_synced_checkpoint(&self) -> Result<VerifiedCheckpoint>

Get the highest synced checkpint. This is the highest checkpoint that has been synced from state-synce. The checkpoint header, contents, transactions, and effects of this checkpoint are guaranteed to be present in the store
Source§

fn get_lowest_available_checkpoint(&self) -> Result<CheckpointSequenceNumber>

Lowest available checkpoint for which transaction and checkpoint data can be requested. Read more
Source§

fn get_checkpoint_by_digest( &self, digest: &CheckpointDigest, ) -> Option<VerifiedCheckpoint>

Source§

fn get_checkpoint_by_sequence_number( &self, sequence_number: CheckpointSequenceNumber, ) -> Option<VerifiedCheckpoint>

Source§

fn get_checkpoint_contents_by_digest( &self, digest: &CheckpointContentsDigest, ) -> Option<CheckpointContents>

Source§

fn get_checkpoint_contents_by_sequence_number( &self, _sequence_number: CheckpointSequenceNumber, ) -> Option<CheckpointContents>

Source§

fn get_transaction( &self, tx_digest: &TransactionDigest, ) -> Option<Arc<VerifiedTransaction>>

Source§

fn get_transaction_effects( &self, tx_digest: &TransactionDigest, ) -> Option<TransactionEffects>

Source§

fn get_events( &self, event_digest: &TransactionDigest, ) -> Option<TransactionEvents>

Source§

fn get_full_checkpoint_contents( &self, _sequence_number: Option<CheckpointSequenceNumber>, _digest: &CheckpointContentsDigest, ) -> Option<VersionedFullCheckpointContents>

Get a “full” checkpoint for purposes of state-sync “full” checkpoints include: header, contents, transactions, effects. sequence_number is optional since we can always query it using the digest. However if it is provided, we can avoid an extra db lookup.
Source§

fn get_unchanged_loaded_runtime_objects( &self, _digest: &TransactionDigest, ) -> Option<Vec<ObjectKey>>

Source§

fn get_transaction_checkpoint( &self, _digest: &TransactionDigest, ) -> Option<CheckpointSequenceNumber>

Source§

fn get_latest_checkpoint_sequence_number(&self) -> Result<u64, Error>

Get the latest available checkpoint sequence number. This is the sequence number of the latest executed checkpoint.
Source§

fn multi_get_transactions( &self, tx_digests: &[TransactionDigest], ) -> Vec<Option<Arc<VerifiedEnvelope<SenderSignedData, EmptySignInfo>>>>

Source§

fn multi_get_transaction_effects( &self, tx_digests: &[TransactionDigest], ) -> Vec<Option<TransactionEffects>>

Source§

fn multi_get_events( &self, event_digests: &[TransactionDigest], ) -> Vec<Option<TransactionEvents>>

Source§

fn get_checkpoint_data( &self, checkpoint: VerifiedEnvelope<CheckpointSummary, AuthorityQuorumSignInfo<true>>, checkpoint_contents: CheckpointContents, ) -> Result<Checkpoint, Error>

Source§

impl<T: Send + Sync, V: SimulatorStore + Send + Sync> RpcStateReader for Simulacrum<T, V>

Source§

fn get_lowest_available_checkpoint_objects( &self, ) -> Result<CheckpointSequenceNumber>

Lowest available checkpoint for which object data can be requested. Read more
Source§

fn get_chain_identifier(&self) -> Result<ChainIdentifier>

Source§

fn indexes(&self) -> Option<&dyn RpcIndexes>

Source§

fn get_struct_layout(&self, _: &StructTag) -> Result<Option<MoveTypeLayout>>

Source§

fn get_type_layout( &self, type_tag: &TypeTag, ) -> Result<Option<MoveTypeLayout>, Error>

Auto Trait Implementations§

§

impl<R = OsRng, Store = InMemoryStore> !Freeze for Simulacrum<R, Store>

§

impl<R = OsRng, Store = InMemoryStore> !RefUnwindSafe for Simulacrum<R, Store>

§

impl<R, Store> Send for Simulacrum<R, Store>
where R: Send, Store: Send,

§

impl<R, Store> Sync for Simulacrum<R, Store>
where R: Sync, Store: Sync,

§

impl<R, Store> Unpin for Simulacrum<R, Store>
where R: Unpin, Store: Unpin,

§

impl<R = OsRng, Store = InMemoryStore> !UnwindSafe for Simulacrum<R, Store>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Any for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

§

fn type_name(&self) -> &'static str

§

impl<T> AnySync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a Request
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> ToAst for T

§

fn ast(self, begin: usize, end: usize) -> Spanned<Self>

§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSendSync for T