ExecutionWitness

Struct ExecutionWitness 

Source
pub struct ExecutionWitness {
    pub state: Vec<Bytes>,
    pub codes: Vec<Bytes>,
    pub keys: Vec<Bytes>,
    pub headers: Vec<Bytes>,
}
Expand description

Represents the execution witness of a block. Contains an optional map of state preimages.

Fields§

§state: Vec<Bytes>

List of all hashed trie nodes preimages that were required during the execution of the block, including during state root recomputation.

§codes: Vec<Bytes>

List of all contract codes (created / accessed) preimages that were required during the execution of the block, including during state root recomputation.

§keys: Vec<Bytes>

List of all hashed account and storage keys (addresses and slots) preimages (unhashed account addresses and storage slots, respectively) that were required during the execution of the block.

§headers: Vec<Bytes>

Block headers required for proving correctness of stateless execution.

This collection stores ancestor(parent) block headers needed to verify:

  • State reads are correct (ie the code and accounts are correct wrt the pre-state root)
  • BLOCKHASH opcode execution results are correct

§Why this field will be empty in the future

This field is expected to be empty in the future because:

  • EIP-2935 (Prague) will include block hashes directly in the state
  • Verkle/Delayed execution will change the block structure to contain the pre-state root instead of the post-state root.

Once both of these upgrades have been implemented, this field will be empty moving forward because the data that this was proving will either be in the current block or in the state.

§State Read Verification

To verify state reads are correct, we need the pre-state root of the current block, which is (currently) equal to the post-state root of the previous block. We therefore need the previous block’s header in order to prove that the state reads are correct.

Note: While the pre-state root is located in the previous block, this field will always have one or more items.

§BLOCKHASH Opcode Verification

The BLOCKHASH opcode returns the block hash for a given block number, but it only works for the 256 most recent blocks, not including the current block. To verify that a block hash is indeed correct wrt the BLOCKHASH opcode and not an arbitrary set of block hashes, we need a contiguous set of block headers starting from the current block.

§Example

Consider a blockchain at block 200, and inside of block 200, a transaction calls BLOCKHASH(100):

  • This is valid because block 100 is within the 256-block lookback window
  • To verify this, we need all of the headers from block 100 through block 200
  • These headers form a chain proving the correctness of block 100’s hash.

The naive way to construct the headers would be to unconditionally include the last 256 block headers. However note, we may not need all 256, like in the example above.

Trait Implementations§

Source§

impl Clone for ExecutionWitness

Source§

fn clone(&self) -> ExecutionWitness

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 ExecutionWitness

Source§

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

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

impl Default for ExecutionWitness

Source§

fn default() -> ExecutionWitness

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

impl<'de> Deserialize<'de> for ExecutionWitness

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for ExecutionWitness

Source§

fn eq(&self, other: &ExecutionWitness) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for ExecutionWitness

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for ExecutionWitness

Source§

impl StructuralPartialEq for ExecutionWitness

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, 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> 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<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 48 bytes