Skip to main content

MockChain

Struct MockChain 

Source
pub struct MockChain { /* private fields */ }
Expand description

The MockChain simulates a simplified blockchain environment for testing purposes.

The typical usage of a mock chain is:

  • Creating it using a MockChainBuilder, which allows adding accounts and notes to the genesis state.
  • Creating transactions against the chain state and executing them.
  • Adding executed or proven transactions to the set of pending transactions (the “mempool”), e.g. using MockChain::add_pending_executed_transaction.
  • Proving a block, which adds all pending transactions to the chain state, e.g. using MockChain::prove_next_block.

The mock chain uses the batch and block provers underneath to process pending transactions, so the generated blocks are realistic and indistinguishable from a real node. The only caveat is that no real ZK proofs are generated or validated as part of transaction, batch or block building.

§Examples

§Executing a simple transaction

// Build a genesis state for a mock chain using a MockChainBuilder.
// --------------------------------------------------------------------------------------------

let mut builder = MockChain::builder();

// Add a recipient wallet.
let receiver = builder.add_existing_wallet(Auth::BasicAuth)?;

// Add a wallet with assets.
let sender = builder.add_existing_wallet(Auth::IncrNonce)?;

let fungible_asset = FungibleAsset::mock(10).unwrap_fungible();
// Add a P2ID note with a fungible asset to the chain.
let note = builder.add_p2id_note(
    sender.id(),
    receiver.id(),
    &[Asset::Fungible(fungible_asset)],
    NoteType::Public,
)?;

let mut mock_chain: MockChain = builder.build()?;

// Create a transaction against the receiver account consuming the note.
// --------------------------------------------------------------------------------------------

let transaction = mock_chain
    .build_tx_context(receiver.id(), &[note.id()], &[])?
    .build()?
    .execute()
    .await?;

// Add the transaction to the chain state.
// --------------------------------------------------------------------------------------------

// Add the transaction to the mock chain's "mempool" of pending transactions.
mock_chain.add_pending_executed_transaction(&transaction)?;

// Prove the next block to include the transaction in the chain state.
mock_chain.prove_next_block()?;

// The receiver account should now have the asset in its account vault.
assert_eq!(
    mock_chain
        .committed_account(receiver.id())?
        .vault()
        .get_balance(fungible_asset.faucet_id())?,
    fungible_asset.amount()
);

§Create mock objects and build a transaction context

let mut builder = MockChain::builder();

let faucet = builder.create_new_faucet(Auth::BasicAuth, "USDT", 100_000)?;
let asset = Asset::from(FungibleAsset::new(faucet.id(), 10)?);

let sender = builder.create_new_wallet(Auth::BasicAuth)?;
let target = builder.create_new_wallet(Auth::BasicAuth)?;

let note = builder.add_p2id_note(faucet.id(), target.id(), &[asset], NoteType::Public)?;

let mock_chain = builder.build()?;

// The target account is a new account so we move it into the build_tx_context, since the
// chain's committed accounts do not yet contain it.
let tx_context = mock_chain.build_tx_context(target, &[note.id()], &[])?.build()?;
let executed_transaction = tx_context.execute().await?;

Implementations§

Source§

impl MockChain

Source

pub const TIMESTAMP_START_SECS: u32 = 1700000000

The timestamp of the genesis block of the chain. Chosen as an easily readable number.

Source

pub const TIMESTAMP_STEP_SECS: u32 = 10

The number of seconds by which a block’s timestamp increases over the previous block’s timestamp, unless overwritten when calling Self::prove_next_block_at.

Source

pub fn new() -> Self

Creates a new MockChain with an empty genesis block.

Source

pub fn builder() -> MockChainBuilder

Returns a new, empty MockChainBuilder.

Source

pub fn blockchain(&self) -> &Blockchain

Returns a reference to the current Blockchain.

Source

pub fn latest_partial_blockchain(&self) -> PartialBlockchain

Returns a PartialBlockchain instantiated from the current Blockchain and with authentication paths for all all blocks in the chain.

Source

pub fn latest_selective_partial_blockchain( &self, reference_blocks: impl IntoIterator<Item = BlockNumber>, ) -> Result<(BlockHeader, PartialBlockchain)>

Creates a new PartialBlockchain with all reference blocks in the given iterator except for the latest block header in the chain and returns that latest block header.

The intended use for the latest block header is to become the reference block of a new transaction batch or block.

Source

pub fn selective_partial_blockchain( &self, reference_block: BlockNumber, reference_blocks: impl IntoIterator<Item = BlockNumber>, ) -> Result<(BlockHeader, PartialBlockchain)>

Creates a new PartialBlockchain with all reference blocks in the given iterator except for the reference block header in the chain and returns that reference block header.

The intended use for the reference block header is to become the reference block of a new transaction batch or block.

Source

pub fn account_witnesses( &self, account_ids: impl IntoIterator<Item = AccountId>, ) -> BTreeMap<AccountId, AccountWitness>

Returns a map of AccountWitnesses for the requested account IDs from the current AccountTree in the chain.

Source

pub fn nullifier_witnesses( &self, nullifiers: impl IntoIterator<Item = Nullifier>, ) -> BTreeMap<Nullifier, NullifierWitness>

Returns a map of NullifierWitnesses for the requested nullifiers from the current NullifierTree in the chain.

Source

pub fn unauthenticated_note_proofs( &self, notes: impl IntoIterator<Item = NoteId>, ) -> BTreeMap<NoteId, NoteInclusionProof>

Returns all note inclusion proofs for the requested note IDs, if they are available for consumption. Therefore, not all of the requested notes will be guaranteed to have an entry in the returned map.

Source

pub fn genesis_block_header(&self) -> BlockHeader

Returns the genesis BlockHeader of the chain.

Source

pub fn latest_block_header(&self) -> BlockHeader

Returns the latest BlockHeader in the chain.

Source

pub fn latest_block(&self) -> ProvenBlock

Returns the latest ProvenBlock in the chain.

Source

pub fn block_header(&self, block_number: usize) -> BlockHeader

Returns the BlockHeader with the specified block_number.

§Panics
  • If the block number does not exist in the chain.
Source

pub fn proven_blocks(&self) -> &[ProvenBlock]

Returns a reference to slice of all created proven blocks.

Source

pub fn native_asset_id(&self) -> AccountId

Returns the AccountId of the faucet whose assets are accepted for fee payments in the transaction kernel, or in other words, the native asset of the blockchain.

This value is taken from the genesis block because it is assumed not to change throughout the chain’s lifecycle.

Source

pub fn nullifier_tree(&self) -> &NullifierTree

Returns a reference to the nullifier tree.

Source

pub fn committed_notes(&self) -> &BTreeMap<NoteId, MockChainNote>

Returns the map of note IDs to committed notes.

These notes are committed for authenticated consumption.

Source

pub fn get_public_note(&self, note_id: &NoteId) -> Option<InputNote>

Returns an InputNote for the given note ID. If the note does not exist or is not public, None is returned.

Source

pub fn committed_account(&self, account_id: AccountId) -> Result<&Account>

Returns a reference to the account identified by the given account ID.

The account is retrieved with the latest state known to the MockChain.

Source

pub fn account_tree(&self) -> &AccountTree

Returns a reference to the AccountTree of the chain.

Source

pub fn propose_transaction_batch<I>( &self, txs: impl IntoIterator<Item = ProvenTransaction, IntoIter = I>, ) -> Result<ProposedBatch>
where I: Iterator<Item = ProvenTransaction> + Clone,

Proposes a new transaction batch from the provided transactions and returns it.

This method does not modify the chain state.

Source

pub fn prove_transaction_batch( &self, proposed_batch: ProposedBatch, ) -> Result<ProvenBatch>

Mock-proves a proposed transaction batch from the provided ProposedBatch and returns it.

This method does not modify the chain state.

Source

pub fn propose_block_at<I>( &self, batches: impl IntoIterator<Item = ProvenBatch, IntoIter = I>, timestamp: u32, ) -> Result<ProposedBlock>
where I: Iterator<Item = ProvenBatch> + Clone,

Proposes a new block from the provided batches with the given timestamp and returns it.

This method does not modify the chain state.

Source

pub fn propose_block<I>( &self, batches: impl IntoIterator<Item = ProvenBatch, IntoIter = I>, ) -> Result<ProposedBlock>
where I: Iterator<Item = ProvenBatch> + Clone,

Proposes a new block from the provided batches and returns it.

This method does not modify the chain state.

Source

pub fn build_tx_context_at( &self, reference_block: impl Into<BlockNumber>, input: impl Into<TxContextInput>, note_ids: &[NoteId], unauthenticated_notes: &[Note], ) -> Result<TransactionContextBuilder>

Initializes a TransactionContextBuilder for executing against a specific block number.

Depending on the provided input, the builder is initialized differently:

In all cases, if the chain contains authenticator for the account, they are added to the builder.

TxContextInput::Account can be used to build a chain of transactions against the same account that build on top of each other. For example, transaction A modifies an account from state 0 to 1, and transaction B modifies it from state 1 to 2.

Source

pub fn build_tx_context( &self, input: impl Into<TxContextInput>, note_ids: &[NoteId], unauthenticated_notes: &[Note], ) -> Result<TransactionContextBuilder>

Initializes a TransactionContextBuilder for executing against the last block header.

This is a wrapper around Self::build_tx_context_at which uses the latest block as the reference block. See that function’s docs for details.

Source

pub fn get_transaction_inputs_at( &self, reference_block: BlockNumber, account: impl Into<PartialAccount>, notes: &[NoteId], unauthenticated_notes: &[Note], ) -> Result<TransactionInputs>

Returns a valid TransactionInputs for the specified entities, executing against a specific block number.

Source

pub fn get_transaction_inputs( &self, account: impl Into<PartialAccount>, notes: &[NoteId], unauthenticated_notes: &[Note], ) -> Result<TransactionInputs>

Returns a valid TransactionInputs for the specified entities.

Source

pub fn get_batch_inputs( &self, tx_reference_blocks: impl IntoIterator<Item = BlockNumber>, unauthenticated_notes: impl Iterator<Item = NoteId>, ) -> Result<(BlockHeader, PartialBlockchain, BTreeMap<NoteId, NoteInclusionProof>)>

Returns inputs for a transaction batch for all the reference blocks of the provided transactions.

Source

pub fn get_foreign_account_inputs( &self, account_id: AccountId, ) -> Result<(Account, AccountWitness)>

Gets foreign account inputs to execute FPI transactions.

Used in tests to get foreign account inputs for FPI calls.

Source

pub fn get_block_inputs<'batch, I>( &self, batch_iter: impl IntoIterator<Item = &'batch ProvenBatch, IntoIter = I>, ) -> Result<BlockInputs>
where I: Iterator<Item = &'batch ProvenBatch> + Clone,

Gets the inputs for a block for the provided batches.

Source

pub fn prove_next_block(&mut self) -> Result<ProvenBlock>

Proves the next block in the mock chain.

This will commit all the currently pending transactions into the chain state.

Source

pub fn prove_next_block_at(&mut self, timestamp: u32) -> Result<ProvenBlock>

Proves the next block in the mock chain at the given timestamp.

This will commit all the currently pending transactions into the chain state.

Source

pub fn prove_until_block( &mut self, target_block_num: impl Into<BlockNumber>, ) -> Result<ProvenBlock>

Proves new blocks until the block with the given target block number has been created.

For example, if the latest block is 5 and this function is called with 10, then blocks 6..=10 will be created and block 10 will be returned.

§Panics

Panics if:

  • the given block number is smaller or equal to the number of the latest block in the chain.
Source

pub fn add_pending_executed_transaction( &mut self, transaction: &ExecutedTransaction, ) -> Result<()>

Adds the given ExecutedTransaction to the list of pending transactions.

A block has to be created to apply the transaction effects to the chain state, e.g. using MockChain::prove_next_block.

Source

pub fn add_pending_proven_transaction(&mut self, transaction: ProvenTransaction)

Adds the given ProvenTransaction to the list of pending transactions.

A block has to be created to apply the transaction effects to the chain state, e.g. using MockChain::prove_next_block.

Source

pub fn prove_block(&self, proposed_block: ProposedBlock) -> Result<ProvenBlock>

Proves proposed block alongside a corresponding list of batches.

Trait Implementations§

Source§

impl Clone for MockChain

Source§

fn clone(&self) -> MockChain

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MockChain

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MockChain

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Deserializable for MockChain

Source§

fn read_from<R: ByteReader>( source: &mut R, ) -> Result<Self, DeserializationError>

Reads a sequence of bytes from the provided source, attempts to deserialize these bytes into Self, and returns the result. Read more
Source§

fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>

Attempts to deserialize the provided bytes into Self and returns the result. Read more
Source§

impl Serializable for MockChain

Source§

fn write_into<W: ByteWriter>(&self, target: &mut W)

Serializes self into bytes and writes these bytes into the target.
Source§

fn to_bytes(&self) -> Vec<u8>

Serializes self into a vector of bytes.
Source§

fn get_size_hint(&self) -> usize

Returns an estimate of how many bytes are needed to represent self. Read more

Auto Trait Implementations§

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
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
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.
Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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