Struct mock::test_ctx::TestContext
source · pub struct TestContext<const NACC: usize, const NTX: usize> {
pub chain_id: Word,
pub accounts: [Account; NACC],
pub history_hashes: Vec<Word>,
pub eth_block: Block<Transaction>,
pub geth_traces: Vec<GethExecTrace>,
}
Expand description
TestContext is a type that contains all the information from a block required to build the circuit inputs.
It is specifically used to generate Test cases with very precise information details about any specific part of a block. That includes of course, its transactions too and the accounts involved in all of them.
The intended way to interact with the structure is through the fn new
which is designed to return a GethData
which then can be used to query
any specific part of the logs generated by the transactions executed within
this context.
§Example
use eth_types::evm_types::{stack::Stack, OpcodeId};
use eth_types::{address, bytecode, geth_types::GethData, word, Bytecode, ToWord, Word};
use lazy_static::lazy_static;
use mock::test_ctx::{helpers::*, TestContext};
// code_a calls code
// jump to 0x10 which is outside the code (and also not marked with
// JUMPDEST)
let code = bytecode! {
PUSH1(0x10)
JUMP
STOP
};
let code_a = bytecode! {
PUSH1(0x0) // retLength
PUSH1(0x0) // retOffset
PUSH1(0x0) // argsLength
PUSH1(0x0) // argsOffset
PUSH32(address!("0x000000000000000000000000000000000cafe001").to_word()) // addr
PUSH32(0x1_0000) // gas
STATICCALL
PUSH2(0xaa)
};
let index = 8; // JUMP
// Get the execution steps from the external tracer
let block: GethData = TestContext::<3, 2>::new(
None,
|accs| {
accs[0]
.address(address!("0x0000000000000000000000000000000000000000"))
.code(code_a);
accs[1].address(address!("0x000000000000000000000000000000000cafe001")).code(code);
accs[2]
.address(address!("0x000000000000000000000000000000000cafe002"))
.balance(Word::from(1u64 << 30));
},
|mut txs, accs| {
txs[0].to(accs[0].address).from(accs[2].address);
txs[1]
.to(accs[1].address)
.from(accs[2].address);
},
|block, _tx| block.number(0xcafeu64),
)
.unwrap()
.into();
// Now we can start generating the traces and items we need to inspect
// the behaviour of the generated env.
Fields§
§chain_id: Word
chain id
accounts: [Account; NACC]
Account list
history_hashes: Vec<Word>
history hashes contains most recent 256 block hashes in history, where the latest one is at history_hashes[history_hashes.len() - 1].
eth_block: Block<Transaction>
Block from geth
geth_traces: Vec<GethExecTrace>
Execution Trace from geth
Implementations§
source§impl<const NACC: usize, const NTX: usize> TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> TestContext<NACC, NTX>
pub fn new_with_logger_config<FAcc, FTx, Fb>(
history_hashes: Option<Vec<Word>>,
acc_fns: FAcc,
func_tx: FTx,
func_block: Fb,
logger_config: LoggerConfig
) -> Result<Self, Error>where
FTx: FnOnce(Vec<&mut MockTransaction>, [MockAccount; NACC]),
Fb: FnOnce(&mut MockBlock, Vec<MockTransaction>) -> &mut MockBlock,
FAcc: FnOnce([&mut MockAccount; NACC]),
sourcepub fn new<FAcc, FTx, Fb>(
history_hashes: Option<Vec<Word>>,
acc_fns: FAcc,
func_tx: FTx,
func_block: Fb
) -> Result<Self, Error>where
FTx: FnOnce(Vec<&mut MockTransaction>, [MockAccount; NACC]),
Fb: FnOnce(&mut MockBlock, Vec<MockTransaction>) -> &mut MockBlock,
FAcc: FnOnce([&mut MockAccount; NACC]),
pub fn new<FAcc, FTx, Fb>(
history_hashes: Option<Vec<Word>>,
acc_fns: FAcc,
func_tx: FTx,
func_block: Fb
) -> Result<Self, Error>where
FTx: FnOnce(Vec<&mut MockTransaction>, [MockAccount; NACC]),
Fb: FnOnce(&mut MockBlock, Vec<MockTransaction>) -> &mut MockBlock,
FAcc: FnOnce([&mut MockAccount; NACC]),
Create a new TestContext which starts with NACC
default accounts and
NTX
default transactions. Afterwards, we apply the acc_fns
function to the accounts, the func_tx
to the transactions and
the func_block
to the block, where each of these functions can
mutate their target using the builder pattern. Finally an
execution trace is generated of the resulting input block and state.
sourcepub fn simple_ctx_with_bytecode(
bytecode: Bytecode
) -> Result<TestContext<2, 1>, Error>
pub fn simple_ctx_with_bytecode( bytecode: Bytecode ) -> Result<TestContext<2, 1>, Error>
Returns a simple TestContext setup with a single tx executing the
bytecode passed as parameters. The balances of the 2 accounts and
addresses are the ones used in [TestContext:: account_0_code_account_1_no_code
]. Extra accounts, txs and/or block
configs are set as Default
.
Trait Implementations§
source§impl<const NACC: usize, const NTX: usize> Clone for TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> Clone for TestContext<NACC, NTX>
source§fn clone(&self) -> TestContext<NACC, NTX>
fn clone(&self) -> TestContext<NACC, NTX>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl<const NACC: usize, const NTX: usize> RefUnwindSafe for TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> Send for TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> Sync for TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> Unpin for TestContext<NACC, NTX>
impl<const NACC: usize, const NTX: usize> UnwindSafe for TestContext<NACC, NTX>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.