From 590a3b97c06392b4b2acfefba0f5a0f5582cbbe6 Mon Sep 17 00:00:00 2001
From: cpengilly <29023967+cpengilly@users.noreply.github.com>
Date: Thu, 16 Jan 2025 16:50:15 -0800
Subject: [PATCH 1/3] fp updates
4 pages updated for multithreaded cannon, 64-bit architecture:
* fp-components
* op-challenger explainer
* cannon FPVM
* mips.sol
---
pages/stack/fault-proofs/cannon.mdx | 52 ++---
pages/stack/fault-proofs/challenger.mdx | 18 +-
pages/stack/fault-proofs/fp-components.mdx | 52 +++--
pages/stack/fault-proofs/mips.mdx | 217 +++++----------------
pages/stack/interop/op-supervisor.mdx | 6 +-
words.txt | 13 +-
6 files changed, 144 insertions(+), 214 deletions(-)
diff --git a/pages/stack/fault-proofs/cannon.mdx b/pages/stack/fault-proofs/cannon.mdx
index 4ad45ea78..ca6458663 100644
--- a/pages/stack/fault-proofs/cannon.mdx
+++ b/pages/stack/fault-proofs/cannon.mdx
@@ -46,14 +46,11 @@ dispute game.
### OP-Program \<> Cannon
Once the execution trace bisection begins and Cannon is run, an Executable and Linkable Format (ELF) binary will be loaded and run within Cannon.
-Within Cannon is the `mipsevm` that is built to handle the MIPS R3000, 32-bit Instruction Set Architecture (ISA). The ELF file contains MIPS instructions,
-where the code that has been compiled into MIPS instructions is OP-Program.
+Within Cannon is the `mipsevm` that is built to handle the MIPS R4000, 64-bit Instruction Set Architecture (ISA). The ELF file contains MIPS instructions, where the code that has been compiled into MIPS instructions is OP-Program.
-OP-Program is golang code that will be compiled into MIPS instructions and run within the Cannon FPVM. OP-Program, whether run as standalone
-golang code or in Cannon, fetches all necessary data used for deriving the state of the L2. It is built such that the
-same inputs will produce not only the same outputs, but the same execution trace. This allows all participants in a fault dispute game to run
-OP-Program such that, given the same L2 output root state transition, can generate the same execution traces. This in turn generates the same
-witness proof for the exact same MIPS instruction that will be run onchain.
+OP-Program is golang code that will be compiled into MIPS64 instructions and run within the Cannon FPVM. As mentioned previously, the `mipsevm` is 64-bit, which means the full addressable address range is `[0, 2^64-1]`. The memory layout uses the typical monolithic memory structure, and the VM operates as though it were interacting directly with physical memory.
+
+OP-Program, whether run as standalone golang code or in Cannon, fetches all necessary data used for deriving the state of the L2. It is built such that the same inputs will produce not only the same outputs, but the same execution trace. This allows all participants in a fault dispute game to run OP-Program such that, given the same L2 output root state transition, can generate the same execution traces. This in turn generates the same witness proof for the exact same MIPS instruction that will be run onchain.
## Overview of offchain Cannon components
@@ -65,17 +62,14 @@ most important features / considerations highlighted.
### `mipsevm` state and memory
-As mentioned previously, the `mipsevm` is 32-bit, which means the full addressable address range is `[0, 2^32-1]`. The memory layout
-uses the typical monolithic memory structure, and the VM operates as though it were interacting directly with physical memory.
+For the mipsevm, how memory is stored isn't important, as it can hold the entire monolithic memory within the Go runtime. The addressable memory range is \[0, 2^64-1], as the VM implements a 64-bit address space. The memory layout uses the typical monolithic memory structure, and the VM operates as though it were interacting directly with physical memory.
-For the `mipsevm`, how memory is stored isn't important, as it can hold the entire monolithic memory within the Go runtime.
-In this way, how memory is represented is abstracted away from the VM itself. However, it is important for memory to be represented
-such that only small portions are needed in order to run a MIPS instruction onchain. This is because it is infeasible to represent the
-entire 32-bit memory space onchain due to cost. Therefore, memory is stored in a binary Merkle tree data structure, with the implementation
+In this way, how memory is represented is abstracted away from the VM itself. However, it is important for memory to be represented such that only small portions are needed in order to run a MIPS instruction onchain. This is because it is infeasible to represent the entire 64-bit memory space onchain due to cost.
+Therefore, memory is stored in a binary Merkle tree data structure, with the implementation
spread across [`memory.go`](https://github.com/ethereum-optimism/optimism/blob/develop/cannon/mipsevm/memory/memory.go) and
[`page.go`](https://github.com/ethereum-optimism/optimism/blob/develop/cannon/mipsevm/memory/page.go).
-The tree has a fixed-depth of 27 levels, with leaf values of 32 bytes each. This spans the full 32-bit address space: `2**27 * 32 = 2**32`.
-Each leaf contains the memory for that part of the tree.
+
+The tree has a fixed-depth of 28 levels, with leaf values of 32 bytes each. This spans the full 64-bit address space: 2**28 \* 32 = 2**64. Each leaf contains the memory for that part of the tree.
`memory.go` defines the data structure, `Memory`, which holds pointers to `nodes` and `pages`. A memory `node` holds the calculated Merkle
root of its parent node within the memory binary Merkle tree, where the 'location' of the node is determined by its generalized index.
@@ -111,7 +105,7 @@ The last major component is located in [`state.go`](https://github.com/ethereum-
The `State` struct in `state.go` holds all the execution state that is required for the `mipsevm`.
The information stored is largely identical to the [VM execution state](mips#packed-vm-execution-state) for `MIPS.sol`. The key differences are:
-* Instead of storing just the memory Merkle root, there is a `Memory` Struct pointer for the binary Merkle tree representation of the entire 32-bit memory space.
+* Instead of storing just the memory Merkle root, there is aMemoryStruct pointer for the binary Merkle tree representation of the entire 64-bit memory space.
* There is an optional `LastHint` bytes variable, which can be used to communicate a Pre-image hint to avoid having to load in multiple prior Pre-images.
#### Generating the witness proof
@@ -155,7 +149,7 @@ is used to parse all the symbols stored in the ELF file. Understanding which ELF
they are located is important for other functionality, such as understanding if the current `PC` is running within a specific function.
Another step that occurs while loading the ELF file is patching the binary of any incompatible functions. This step is crucial, as a key design decision
-important**, as a key design decision in both the onchain and offchain `mipsevm` implementations is that neither implementation
+important\*\*, as a key design decision in both the onchain and offchain `mipsevm` implementations is that neither implementation
has access to a kernel. This is primarily due to the limitations within the EVM itself, and since the offchain Cannon
implementation must match functionality exactly with its onchain counterpart, kernel access is also not available within Cannon. This means that the VMs
cannot replicate behavior that would otherwise be performed by a kernel 1:1, which primarily impacts system calls (syscalls).
@@ -188,13 +182,13 @@ certain syscalls. The full list of instructions supported can be found [here](mi
#### `mips.go` vs. `MIPS.sol`
-The offchain `mips.go` and the onchain Cannon `MIPS.sol` behave similarly when it comes to executing 32-bit, MIPS III instructions.
+The offchain `mips.go` and the onchain Cannon `MIPS.sol` behave similarly when it comes to executing 64-bit, MIPS III instructions.
In fact, they must produce **exactly the same results** given the same instruction, memory, and register state.
Consequently, the [witness data](#witness-data) is essential to reproduce the same instruction onchain and offchain.
-However, there are differences between the two:
+However, there are differences between the onchain and offchain implementations:
1. A single instruction will be run onchain in `MIPS.sol`, whereas the offchain `mips.go` will run all MIPS instructions for all state transitions in the disputed L2 state.
-2. The `mipsevm` contains the entire 32-bit monolithic memory space, is responsible for maintaining the memory state based on the results of MIPS instructions, and generates the memory binary Merkle tree, Merkle root, and memory Merkle proofs. `MIPS.sol` is mostly stateless, and does not maintain the full memory space. Instead, it only requires the memory Merkle root, and up to two memory Merkle proofs: 1 for the instruction and 1 for potential load, store, or certain syscall instructions.
+2. The mipsevm contains the entire 64-bit monolithic memory space, is responsible for maintaining the memory state based on the results of MIPS instructions, and generates the memory binary Merkle tree, Merkle root, and memory Merkle proofs. MIPS.sol is mostly stateless, and does not maintain the full memory space. Instead, it only requires the memory Merkle root, and up to two memory Merkle proofs: 1 for the instruction and 1 for potential load, store, or certain syscall instructions.
3. Unlike `MIPS.sol`, `mips.go` is responsible for writing Pre-images to the PreimageOracle Server, and optionally writing hints to the Server.
### PreimageOracle interaction
@@ -212,10 +206,22 @@ define the ABI for communicating pre-images.
This ABI is implemented by the VM by intercepting the `read`/`write` syscalls to specific file descriptors. See [Cannon VM Specs](https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#io) for more details.
-Note that although the oracle provides up to 32 bytes of the pre-image,
-Cannon only supports reading at most 4 bytes at a time, to unify the memory operations with 32-bit load/stores.
+
+ Although the oracle provides up to 32 bytes of the pre-image, Cannon supports reading up to 8 bytes at a time in its 64-bit implementation, unifying memory operations with 64-bit load/stores. This enhancement from the previous 32-bit implementation allows for more efficient memory handling and improved performance.
+
+
+### Multi-threading support
+
+A significant enhancement to Cannon is the introduction of multi-threading capabilities. This upgrade enables:
+
+* Concurrent execution of MIPS instructions across multiple threads
+* Deterministic thread scheduling and state management
+* Asynchronous garbage collection through Go runtime
+* Improved performance through parallel processing
+
+The multi-threaded implementation maintains deterministic execution by carefully managing thread states and context switching, ensuring that the same execution trace can be reproduced both onchain and offchain.
-## Further Reading
+## Next steps
* [Cannon FPVM Specification](https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html)
* [Merkle Proofs Specification](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md)
diff --git a/pages/stack/fault-proofs/challenger.mdx b/pages/stack/fault-proofs/challenger.mdx
index 17be766d5..831c6e60b 100644
--- a/pages/stack/fault-proofs/challenger.mdx
+++ b/pages/stack/fault-proofs/challenger.mdx
@@ -9,7 +9,9 @@ import Image from 'next/image'
# OP-Challenger explainer
-The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/fault-proofs/cannon)).
+The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/fault-proofs/cannon)) that now supports 64-bit MIPS emulation.
+
+The updated 64-bit architecture allows for a significantly larger address space compared to the previous 32-bit implementation, enabling the system to handle more complex state transitions and larger memory requirements. This upgrade to 64-bit addressing provides access to a theoretical 16 exabytes of virtual memory space, though practical limitations and system configurations will typically restrict this to a more manageable size.
Specifically, `op-challenger` performs the following actions:
@@ -20,7 +22,7 @@ Specifically, `op-challenger` performs the following actions:
* claims paid out bonds for both the challenger and proposer
## Architecture
-This diagram illustrates how `op-challenger` monitors dispute games, defends valid proposals, and challenges invalid ones. It also shows its interaction with the `op-proposer` in resolving claims.
+This diagram illustrates how `op-challenger` monitors dispute games, defends valid proposals, and challenges invalid ones. It also shows its interaction with the `op-proposer` in resolving claims. OP-Challenger now leverages a 64-bit MIPS VM with multithreaded capabilities, enabling features like asynchronous garbage collection and deterministic thread management through context switching.
```mermaid
graph TD;
@@ -30,12 +32,20 @@ graph TD;
OP -->|Assists| OPP[OP-Proposer]
OPP -->|Resolves Claims| DG
DG -->|Claims Paid| Bonds[Bonds for Challenger and Proposer]
+
+ subgraph VM[64-bit MIPS VM]
+ MT[Multithreaded Execution] -->|Manages| TS[Thread States]
+ MT -->|Enables| GC[Asynchronous GC]
+ MT -->|Controls| CS[Context Switching]
+ end
+
+ OP -->|Uses| VM
classDef default fill:#00,stroke:#FF0420,stroke-width:2px;
```
- The `cannon` and `op-program` executables are run in the `op-challenger` docker container as sub-processes when required to generate game trace data.
+ The `cannon` and `op-program` executables are run in the `op-challenger` docker container as sub-processes, leveraging 64-bit MIPS emulation and multithreaded capabilities to efficiently generate game trace data.
## Fault detection responses
@@ -97,7 +107,7 @@ Note: An actor would only be pushed down to the bottom half of the game if the b
### How many CPUs should I run for challenger to work efficiently?
-The default `--max-concurrency` setting suits most operators. Increase it if the challenger lags, or decrease it if it overloads with requests.
+The default `--max-concurrency` setting is optimized for the 64-bit MIPS emulation with multithreaded Cannon. The system automatically balances thread allocation, but you can adjust this value if needed - increase it to utilize more parallel processing power, or decrease it if system resources are constrained.
### How much ETH do you need to challenge in a game?
diff --git a/pages/stack/fault-proofs/fp-components.mdx b/pages/stack/fault-proofs/fp-components.mdx
index 6cb238e0b..7649c73ab 100644
--- a/pages/stack/fault-proofs/fp-components.mdx
+++ b/pages/stack/fault-proofs/fp-components.mdx
@@ -9,9 +9,9 @@ import { Callout } from 'nextra/components'
# FP system components
-This page explains the fault proof system components and how they work together to enhance decentralization in the Optimism ecosystem.
+This page explains the fault proof system components and how they work together to enhance decentralization in the Optimism ecosystem. Note that with recent updates, the system now utilizes 64-bit MIPS emulation and supports multithreaded execution in Cannon.
-The Fault Proof System is comprised of three main components: a Fault Proof Program (FPP), a Fault Proof Virtual Machine (FPVM), and a dispute game protocol.
+The Fault Proof System is comprised of three main components: a Fault Proof Program (FPP), a Fault Proof Virtual Machine (FPVM) with 64-bit memory addressing capabilities and multithreading support, and a dispute game protocol.
The system is designed to eventually enable secure bridging without central fallback.
The modular design of the Fault Proof System lays the foundation for a multi-proof future, inclusive of ZK proofs, and significantly increases the opportunities for ecosystem contributors to build alternative fault proof components to secure the system.
@@ -23,15 +23,18 @@ The modular design of the Fault Proof System lays the foundation for a multi-pro
The Fault Proof System is comprised of three main components: a Fault Proof Program (FPP), a Fault Proof Virtual Machine (FPVM), and a dispute game protocol.
These components will work together to challenge malicious or faulty activity on the network to preserve trust and consistency within the system.
-See the video below for a full technical walkthrough of the OP Stack's first fault proof system.
-
+The OP Stack's unique, modular design allows the decoupling of the FPP and FPVM, enabling multiple implementations. Currently there are two fault proof programs:
+
+* `op-program`: The default FPP that implements the state transition function using op-geth and op-node components
+* Kona: A newer Rust-based alternative FPP that uses components from reth, revm, and alloy, with its own implementation of the derivation pipeline
+
+And two FPVMs:
-The OP Stack's unique, modular design allows the decoupling of the FPP and FPVM, resulting in the following:
+* Cannon: The default FPVM that implements 64-bit MIPS emulation with multithreaded capabilities
+* Asterisc: A newer RISC-V based FPVM written in Go that provides an alternative proof system
-* development of multiple proof systems, unique dispute games, and a variety of FPVMs in the future.
-* custom-built Fault Proof Systems comprised of any combination of these isolated components—including validity proofs, attestation proofs, or ZKVM.
-* dispute games in the dispute protocol backed by multiple security mechanisms.
+This multi-implementation approach enhances security by allowing dispute games to be backed by different combinations of FPPs and FPVMs, while maintaining consistent interfaces between components.
## Fault proof program
@@ -42,6 +45,16 @@ The FPP is designed so that it can be run in a deterministic way such that two i
All data is retrieved via the [Preimage Oracle API](https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle). The preimages could be provided via the FPVM when onchain or by a native "host" implementation that can download the required data from nodes via JSON-RPC requests. The native host implementation is also provided by `op-program` but doesn't run as part of the onchain execution. Basically, `op-program` has two halves: the "client" Fault Proof Program part covered in this section and the "host" part used to fetch required preimages.
+### Kona: alternative FPP
+
+Kona serves as an alternative fault proof program implementation written in Rust. It uses components from reth, revm, and alloy, with its own implementation of the derivation pipeline and preimage oracle ABI bindings. Kona has successfully validated output roots on OP mainnet and features several optimizations:
+
+* Uses eth\_getProof for most trie node fetching during execution, reducing RPC hits by around 30x
+* Implements cache-alignment of common data structures to increase cache hits
+* Enables link-time optimizations for improved compilation performance
+
+Like `op-program`, Kona follows a host/client architecture where the client handles core proving logic while the host manages preimage fetching. It is continuously tested and maintained alongside op-program to stay current with protocol updates.
+
## Fault proof virtual machine
The Fault Proof Virtual Machine (FPVM) is one of the modules in the OP Stack's fault proof system.
@@ -50,17 +63,30 @@ OP Stack's modularity decouples the Fault Proof Program (FPP) from the Fault Pro
Through this separation, the VM stays ultra-minimal: Ethereum protocol changes, like EVM op-code additions, do not affect the VM. Instead, when the protocol changes, the FPP can simply be updated to import the new state-transition components from the node software. Similar to playing a new version of a game on the same game console, the L1 proof system can be updated to prove a different program.
The FPVM is tasked with lower-level instruction execution. The FPP needs to be emulated. The VM requirements are low: the program is synchronous, and all inputs are loaded through the same pre-image oracle, but all of this still has to be proven in the L1 EVM onchain.
-To do this, only one instruction is proven at a time. The bisection game will narrow down the task of proving a full execution trace to just a single instruction. Proving the instruction may look different for each FPVM, but generally it looks similar to Cannon, which proves the instruction as follows:
+To do this, only one instruction is proven at a time. The bisection game will narrow down the task of proving a full execution trace to just a single instruction. With multithreaded Cannon, the VM manages thread states and context switching deterministically while proving instructions. Proving the instruction may look different for each FPVM implementation, but generally it looks similar to Cannon, which now supports 64-bit MIPS emulation and multithreaded execution:
* To execute the instruction, the VM emulates something akin to an instruction-cycle of a thread-context: the instruction is read from memory, interpreted, and the register-file and memory may change a little.
* To support the pre-image oracle, and basic program runtime needs like memory-allocation, the execution also supports a subset of linux syscalls. Read/write syscalls allow interaction with the pre-image oracle: the program writes a hash as request for a pre-image, and then reads the value in small chunks at a time.
-[Cannon](cannon) is the default FPVM used in all disputes. [MIPS](mips) is the onchain smart contract implementation of Cannon that can be implemented due to the modularity of the dispute game.
+[Cannon](cannon) is the default FPVM used in all disputes, providing 64-bit MIPS emulation with multithreaded capabilities. [MIPS](mips) is the onchain smart contract implementation of Cannon. Alternatively, Asterisc serves as a RISC-V based FPVM written in Go, offering implementation diversity and enhanced security through its different architectural approach. Both FPVMs can be used due to the modularity of the dispute game.
+
+### Asterisc: alternative FPVM
+
+Alongside Cannon, Asterisc serves as an alternative Fault Proof Virtual Machine implementation. Asterisc is a RISC-V based VM written in Go that provides an additional layer of security through implementation diversity. While Cannon uses 64-bit MIPS emulation, Asterisc implements a 64-bit little-endian RISC-V architecture.
+
+Key characteristics of Asterisc:
+
+* Built as a RISC-V based implementation to provide an alternative proof system
+* Written in Go with a focus on providing implementation diversity from Cannon
+* Supports the same fault proof program interface while using a different VM architecture
+* Enhances system security by allowing dispute games to be backed by multiple VM implementations
+
+Asterisc has been developed to serve as a complementary VM option in Optimism's multi-proof system approach. This multi-VM strategy strengthens the overall security of the fault proof system by enabling verification through different architectural implementations.
## Dispute game protocol
In the Dispute protocol, different types of dispute games can be created, managed, and upgraded through the [DisputeGameFactory](https://github.com/ethereum-optimism/optimism/blob/6a53c7a3294edf140d552962f81c0f742bf445f9/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L4).
-This opens the door to innovative features, like aggregate proof systems and the ability to expand the protocol to allow for disputing things apart from the state of L2, such as a `FaultDisputeGame` geared towards onchain binary verification.
+This opens the door to innovative features, including support for multiple proof implementations like Cannon with its 64-bit MIPS architecture and multithreading capabilities, or Asterisc with its RISC-V based approach. The protocol can also handle various dispute types beyond L2 state verification, such as a `FaultDisputeGame` for onchain binary verification.
A dispute game is a core primitive to the dispute protocol. It models a simple state machine, and it is initialized with a 32 byte commitment to any piece of information of which the validity can be disputed.
They contain a function to resolve this commitment to be true or false, which is left for the implementer of the primitive to define. Dispute games themselves rely on two fundamental properties:
@@ -70,10 +96,10 @@ They contain a function to resolve this commitment to be true or false, which is
The standard is the bisection game. This is a specific type of dispute game, and the first game built in the OP Stack's dispute protocol.
We bisect over output roots (which each correspond to single L2 blocks), until we get to a single block `n -> n+1` state transition. Then, we bisect over a single block state transition's execution trace as described before. This is an optimization to reduce the runtime of the off-chain VM.
-After bisection has reached commitments to the state at individual trace instructions, the `FaultDisputeGame` executes a single instruction step on chain using a generic VM.
+After bisection has reached commitments to the state at individual trace instructions, the `FaultDisputeGame` executes a single instruction step on chain using a generic VM, which now supports multithreaded execution in Cannon's implementation.
The VM's state transition function, which we'll call `T`, can be anything, so long as it adheres to the form `T(s, i) -> s'`, where `s` = the agreed upon prestate, `i` = the state transition inputs, and `s'` = the post state.
-The first full implementation of the VM generic in the bisection game includes a single MIPS thread context on top of the EVM to execute a single instruction within an execution trace generated by `Cannon` and the `op-program`.
+The first full implementation of the VM generic in the bisection game leverages 64-bit MIPS emulation with multithreaded capabilities on top of the EVM, allowing multiple thread contexts to execute instructions within an execution trace generated by `Cannon` and the `op-program`.
## Next steps
diff --git a/pages/stack/fault-proofs/mips.mdx b/pages/stack/fault-proofs/mips.mdx
index 3623ae991..0e6fe8719 100644
--- a/pages/stack/fault-proofs/mips.mdx
+++ b/pages/stack/fault-proofs/mips.mdx
@@ -9,181 +9,72 @@ import { Callout } from 'nextra/components'
# Fault proof VM: MIPS.sol
-The `MIPS.sol` smart contract is an onchain implementation of a virtual machine (VM) that encompasses the 32-bit, Big-Endian, MIPS III Instruction Set Architecture (ISA).
-This smart contract is the counterpart to the off-chain MIPSEVM golang implementation of the same ISA. Together, the onchain and off-chain VM implementations make up [Cannon](cannon),
-Optimism's Fault Proof Virtual Machine (FPVM). Cannon is a singular instance of a FPVM that can be used as part of the Dispute Game for Optimism's (and Base's) optimistic rollup L2 blockchain.
-The Dispute Game itself is modular, allowing for any FPVM to be used in a dispute; however, Cannon is currently the only FPVM implemented and thus will be used in all disputes.
+The `MIPS.sol` smart contract implements an onchain MIPS III virtual machine as part of Optimism's Fault Proof system. This implementation works together with an off-chain Go implementation to form [Cannon](cannon), which enables onchain verification of disputed L2 state transitions.
-## Control flow
+## Architecture and implementation
-The `FaultDisputeGame.sol` interacts with `MIPS.sol` and then `MIPS.sol` calls into `PreimageOracle.sol`. `MIPS.sol` is only called at the max depth of the game when someone needs to call `step`.
-`FaultDisputeGame.sol` is the deployed instance of a Fault Dispute Game for an active dispute, and `PreimageOracle.sol` stores Pre-images.
+The contract is designed to work alongside its offchain Go implementation as a stateless system where all execution state is passed in as parameters. This allows multiple dispute games to share a single deployment while maintaining consistent behavior across environments:
-* Pre-images contain data from both L1 and L2, which includes information such as block headers, transactions, receipts, world state nodes, and more. Pre-images are used as the inputs to the derivation process used to calculate the true L2 state, and subsequently the true L2 state is used to resolve a dispute game.
-* A Fault Dispute Game, at a high-level, will effectively determine what L2 state is currently agreed-upon, and move through L2 state until the first disagreed-upon state is found. How the Pre-images are determined and populated into the `PreimageOracle.sol` contract is out-of-scope for this reference document on the `MIPS.sol` contract, as that contract only consumes Pre-images that have already been populated by the off-chain Cannon implementation.
+* Component architecture
+ * Offchain component executes MIPS instructions across multiple threads for disputed L2 state transitions
+ * Onchain component (MIPS.sol) executes single instructions with provided state and memory proofs
+ * Both maintain deterministic execution through careful thread state management
+* Key implementation features
+ * Single immutable variable - the `PreimageOracle` contract address for L1/L2 state data access
+ * VM state passed as tightly packed struct containing registers, program counter, and thread states
+ * Memory implemented as binary Merkle tree with 27-level depth and 32-byte leaf values
+ * Support for 8-byte reads/writes in 64-bit mode
+ * Big-Endian byte ordering aligned with EVM's native ordering
+ * Minimal syscalls focused on `PreimageOracle` interactions and thread management
-The `MIPS.sol` contract is called by a running instance of a dispute game i.e. by a `FaultDisputeGame.sol` contract, and is only called once a dispute game reaches a leaf node in the state transition tree that is currently being disputed.
-A leaf node represents a single MIPS instruction (in the case that we're using Cannon as the FPVM) that can then be run onchain. Given a Pre-image, which is the previously agreed-upon L2 state up until this instruction, and the instruction
-state to run in the `MIPS.sol` contract, the fault dispute game can determine the true post state (or Post-image). This true post state will then be used to determine the outcome of the fault dispute game by comparing the disputed post-state
-at the leaf node with the post-state proposed by the disputer.
+## Memory and state management
-## Contract state
+The memory and state management system in MIPS.sol implements a sophisticated architecture optimized for 64-bit addressing and multithreaded operations:
-The `MIPS.sol` contract only contains a single immutable variable, which corresponds to the address of the `PreimageOracle.sol` contract.
-Otherwise, the contract is stateless, meaning that all state related to playing a MIPS instruction onchain comes from either the `FaultDisputeGame.sol` instance, or the `PreimageOracle.sol`.
-Having a stateless `MIPS.sol` contract means that it can be used by any fault dispute game that is using the Cannon FPVM; the `MIPS.sol` contract does not need to be re-deployed per fault dispute game instance.
-Subsequently, any fault dispute game that is using the same `MIPS.sol` contract will also share the same `PreimageOracle.sol` contract.
-Note that the `PreimageOracle.sol` contract is stateful, but how state is stored in the contract and differentiated between different fault dispute game instances is out-of-scope for this document.
+* Memory architecture
+ * Binary Merkle tree with fixed depth of 28 levels for full 64-bit address space support
+ * 32-byte leaf values enable efficient memory operations
+ * Thread-safe memory access with deterministic scheduling
+ * Supports up to 8-byte atomic operations in 64-bit mode
+* State management
+ * Stateless contract design with execution state passed as parameters
+ * Enhanced 64-bit memory addressing supporting theoretical 16 exabytes of virtual memory
+ * Thread states include register contexts, program counter, and memory management data
+ * Maintains consistent thread states between onchain and offchain implementations
-While the `MIPS.sol` contract is stateless, meaning it does not store state in the contract directly, the contract does require up to 3 different types of witness data in order to perform a single MIPS instruction onchain:
+## Thread management and `PreimageOracle` integration
-* Packed VM execution state
-* Memory proofs
-* Pre-images
+The implementation features sophisticated thread management integrated with `PreimageOracle` interactions:
-The Pre-images have already been discussed above, so we will discuss the packed VM execution state and the memory proofs.
-As a final note on Pre-images during onchain execution, it is entirely possible that the `MIPS.sol` contract never runs a MIPS instruction onchain that requires the contract to read from `PreimageOracle.sol` .
-There is no requirement to read from the `PreimageOracle.sol` during instruction execution, but that doesn't mean the `PreimageOracle.sol` contract is not being used.
-The Pre-image information that has been read in previous off-chain instructions leading up to the execution of a single instruction onchain may still reside in the constructed VM memory.
-Thus, even when the instruction run onchain does not explicitly read from `PreimageOracle.sol` , Pre-image data may still influence the merkle root that represents the VM's memory.
+* Thread control and scheduling
+ * Deterministic multi-threading using fixed sequence traversal
+ * Context switching with sleep, yield, and wait operations
+ * Wake signals for thread activation based on memory conditions
+ * Forced thread preemption to prevent starvation
+* `PreimageOracle` integration
+ * Specialized syscalls for `PreimageOracle` communication
+ * Support for concurrent `PreimageOracle` interactions
+ * Thread-safe state access and verification
+ * Up to 8-byte reads for improved efficiency
-### Packed VM execution state
+## Key Functions
-In order to execute a MIPS instruction onchain, the `MIPS.sol` contract needs to know important state information such as the instruction to run, the values in each of the general purpose registers, etc.
-More specifically, a tightly-packed `State` struct contains all the relevant information that the `MIPS.sol` contract needs to know. This struct is passed to the contract from the `FaultDisputeGame.sol` contract when it invokes the `step` function in `MIPS.sol` (which in-turn executes a single MIPS instruction onchain).
-The following information is stored in the `State` struct. See [doc reference](https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#state) and [code reference](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L26) for details:
+The main external interface is the `step` function which executes a single MIPS instruction:
-1. `memRoot` - The merkle root hash of the binary merkle tree that represents the MIPS VM's monolithic 32-bit memory space.
-2. `preimageKey` - Key that uniquely identifies the Pre-image data to be read (if applicable) from the `PreimageOracle.sol` contract.
-3. `preimageOffset` - Each Pre-image is 32 bytes long, however the word size for 32-bit MIPS is 4 bytes. Therefore, only 4 bytes from a Pre-image will be read during a read syscall. The `preimageOffset` serves as the offset into the Pre-image being read, so that an instruction can continue reading a Pre-image 4 bytes at a time.
-4. `pc` - The program counter, which points to the memory location that contains the MIPS instruction to execute onchain.
-5. `nextPC` - The next program counter, which functions similarly to the program counter except that it points to the next instruction to be executed onchain. Note that the next instruction may or may not be `PC + 8` in the event of a branch or jump instruction. Additionally, the `nextPC` effectively functions as the [branch delay slot](https://en.wikipedia.org/wiki/MIPS_architecture#cpu_instructions) for the MIPS ISA.
-6. `lo` - Special purpose 32-bit register that stores the low-order 32-bits from certain multiplication instructions (or special move instructions that store into this register).
-7. `hi` - Special purpose 32-bit register that stores the high-order 32-bits from certain multiplication instructions (or special move instructions that store into this register)
-8. `heap` - Pointer to the most recent memory allocation returned via the `mmap` syscall.
-9. `exitCode` - `uint8` value that represents UNIX exit status code of the VM.
-10. `exited` - Boolean that indicates whether the VM has exited or not.
-11. `step` - Counts the total number of instructions that have been executed.
-12. `registers` - Array of 32, 32-bit values that represent the general purpose registers for the MIPS ISA.
+* Takes packed VM state and memory proofs as input
+* Executes one instruction according to MIPS III spec
+* Returns a state hash incorporating execution status
+* Handles memory access via Merkle proofs
+* Manages `PreimageOracle` interactions for system calls
-### State hash
+Internal functions handle specific instruction types:
-The state hash is the `bytes32` value returned to the active Fault Dispute Game upon the completion of a single MIPS instruction in the `MIPS.sol` contract.
-The hash is derived by taking the `keccak256` of the above packed VM execution `State` struct, and then replacing the first byte of the hash with a value that represents the status of the VM.
-This value is derived from the `exitCode` and `exited` values, and can be:
+* `handleBranch` - Implements branch instructions
+* `handleJump` - Handles jump operations
+* `handleHiLo` - Manages HI/LO register operations
+* `handleSyscall` - Processes system calls
-* Valid (0)
-* Invalid (1)
-* Panic (2) or
-* Unfinished (3)
-
-The reason for adding the VM status to the state hash is to communicate to the dispute game whether the VM determined the proposed output root was valid or not.
-This in turn prevents a user from disputing an output root during a dispute game, but provides the state hash from a cannon trace that actually proves the output root is valid.
-
-### Memory proofs
-
-Using a 32-bit ISA means that the total size of the address space (assuming no virtual address space) is `2^32 = 4GiB`. Additionally, the `MIPS.sol` contract is stateless, so it does not store the MIPS memory in contract storage. The primary reason for this is because having to load the entire memory into the `MIPS.sol` contract in order to execute a single instruction onchain is prohibitively expensive. Additionally, the entire memory would need to be loaded per fault proof game, requiring multiple instances of the `MIPS.sol` contract. Therefore, in order to optimize the amount of data that needs to be provided per onchain instruction execution while still maintaining integrity over the entire 32-bit address space, Optimism has converted the memory into a binary merkle tree.
-
-The binary merkle tree (or hash tree) used to store the memory of the MIPS VM has leaf values that are 32 bytes and has a fixed depth of 27 levels. This in turn allows the binary merkle tree to span the full 32-bit address space: `2^27 * 32 = 2^32` (See [memory proofs](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/cannon/docs/README.md#memory-proofs) for more details). In order to ensure the integrity of the entire address space each time memory is read or written to, one or more memory proofs are provided by the FaultDisputeGame.sol contract each time a MIPS instruction is executed onchain in MIPS.sol. A memory proof consists of the current leaf value and 27 sibling nodes (28, 32-byte values in total), where the sibling nodes are the `keccak256` hash of its own child nodes. Using the leaf value, its 27 sibling nodes, and the memory address converted to its binary representation as a guide (0 or 1 tells the order to concatenate left and right values), we can calculate a merkle root. This merkle root should be exactly the same as the merkle root stored in the VM execution State struct.
-
-Reading to memory and writing to memory work similarly, both involve calculating the merkle root. In the case of a memory write, `MIPS.sol` must take care to verify the provided proof for the memory location to write to is correct. Additionally, writing to memory will change the merkle root stored in the VM execution `State` struct.
-
-### State calculation
-
-While the `MIPS.sol` contract may only execute a single instruction onchain, the off-chain Cannon implementation executes all prerequisite MIPS instructions for all state transitions in the disputed L2 state required to reach the disputed instruction that will be executed onchain. This ensures that the MIPS instruction executed onchain has the correct VM state and necessary Pre-images stored in the `PreimageOracle.sol` contract to generate the true post-state that can be used to resolve the dispute game.
-
-## Functions
-
-### oracle
-
-The external view [`oracle`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L65) function is a getter function that returns the PreimageOracle address cast as a `IPreimageOracle` interface.
-
-### SE
-
-The internal pure [`SE`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L70) function performs a sign-extension (SE) on the provided `uint32` value given the number of bits that currently represents the value. While the function operates over an unsigned integer, it follows the typical procedure for [sign-extension of signed values](https://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension) represented using two's complement.
-
-### outputState
-
-The internal [`outputState`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L81) function computes the `keccak256` hash of all values in the VM execution `State` struct, and then masks the first two bits of the hash with the current status of the VM as derived from the `exitCode` and `exited` values. Despite the complexity of the function (due to the use of assembly), the implementation is effectively tightly packing all the variables in the `State` struct together, then taking the `keccak256` of the packed bytes. A Solidity equivalent implementation can be viewed in the [`outputState`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/test/MIPS.t.sol#L1574) function located in the foundry test suite.
-
-### handleSyscall
-
-The internal [`handleSyscall`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L145) function handles the syscall MIPS instruction. Only a subset of all syscall numbers are supported by the `MIPS.sol` contract; however, any syscall that is not explicitly supported will return 0s instead of reverting. Most syscalls that are supported partially mimic the behavior specified by the linux manual pages. The two most important syscall numbers that are supported are read and write.
-
-#### syscall read
-
-When given file descriptor 5 as the target of the read syscall, `handleSyscall` will call the `PreimageOracle.sol` contract to read a 32-byte Pre-image at the current location determined by the `preimageKey` stored in the VM execution `State` struct. Once the 32-byte Pre-image has been read, the function will then determine the number of bytes to read (up to 4 bytes) and the location in memory to store the bytes. The number of bytes to read may be any value between 1 and 4, depending on the alignment of the offset in the returned Pre-image and the alignment of the memory position to write the data to.
-
-#### syscall write
-
-When given the file descriptor 6 as the target of the write syscall, `handleSyscall` will not call the `PreimageOracle.sol` contract to write a new Pre-image. Only the off-chain Cannon implementation writes to the `PreimageOracle.sol` contract. Instead, the function computes the new value of the `preimageKey` given the 4-byte value that would be written to the `PreimageOracle.sol` contract. Additionally, the function resets the `preimageOffset` to 0. It is expected that the off-chain Cannon implementation has already written the data to the `PreimageOracle.sol` contract at the location of the newly-derived `preimageKey`.
-
-### handleBranch
-
-The internal [`handleBranch`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L313) function handles the multiple branch opcodes and conforms to the MIPS specification for the instructions.
-
-### handleHiLo
-
-The internal [`handleHiLo`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L377) function handles the multiplication, division, and move opcodes that interact with the `hi` and `lo` registers and conforms to the MIPS specification for the instructions.
-
-### handleJump
-
-The internal [`handleJump`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L448) function handles J-type opcodes and conforms to the MIPS specification for the instructions.
-
-### handleRd
-
-The internal [`handleRd`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L480) function handles storing a value into a specified register. Certain instructions may include a conditional value, which determines whether the value is stored in the register or not.
-
-### proofOffset
-
-The internal pure [`proofOffset`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L508) function handles calculating the offset in calldata to the start of a memory proof given an index. The calldata is provided to this function via the top-level `step` function call. Looking at the calldata, there are two bytes values passed: `stateData` and `proof`. The `bytes stateData` value is the packed VM execution `State` struct, and the `bytes proof` value represents one or more memory proofs that may be necessary for the onchain execution of the MIPS instruction. The `stateData` and memory proof(s) are encoded in calldata using the [Solidity ABI encoding specification](https://docs.soliditylang.org/en/develop/abi-spec.html). Using this information, we can derive the hardcoded values that are being used in the `proofOffset` function:
-
-| Offset Description | Num. Bytes | Notes |
-| -------------------------------------------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| Start of the calldata | 4 | Function selector |
-| | 32 | Contains the offset to the first dynamic bytes argument aka `stateData` |
-| | 32 | Contains the offset to the second dynamic bytes argument aka `proof` |
-| | 32 | Contains the length of the first dynamic bytes argument `stateData` |
-| Start + 100 bytes = Offset to the start of the packed `State` struct | 256 | 226 bytes for the packed VM execution `State` struct + 32-byte word alignment for calldata = 256 bytes |
-| | 32 | Contains the length of the `bytes calldata proof` |
-| Start + 388 bytes = Offset to the start of the memory proof(s) | 28 \* 32 = 896 | The first memory proof (required), which is 28, 32-byte values where the first value is the leaf node and the 27 proceeding values are the sibling nodes used to calculate the merkle root |
-| | 28 \* 32 = 896 | Within the `bytes calldata proof` parameter, there can be either 1 or 2 memory proofs |
-
-### readMem
-
-The internal pure [`readMem`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L526) function is a helper function that, given a 32-bit address and an index to a memory proof in calldata, validates the leaf node using the memory proof and then returns the specific 4-byte value to read. Note that a leaf node is 32-bytes so at most `readMem` will only read 4-bytes due to the 32-bit MIPS architecture. The validation given a leaf node and its 27 sibling nodes follows the standard logic for verifying inclusion in a merkle tree. The address is used as the path in order to determine the order for hashing two nodes (or the leaf and a node) together. Once the top of the tree has been reached, and the merkle root calculated, the calculated root is checked against the merkle root stored in the VM execution `State` struct. Once the leaf node has been verified, the logic will shift to the correct location within the 32-bytes value to read from. Also note that `readMem` will always start at an aligned 4-byte location; therefore it is up to subsequent logic to determine the correct position within a 4-byte word in unaligned memory read or write situations.
-
-### writeMem
-
-The internal pure [`writeMem`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L580) function is a helper function that, given a 32-bit address, an index to a memory proof in calldata, and a 32-bit value to write, calculates the new merkle root of the VM execution `State` struct.
-Calculating the new merkle root follows the same logic as in the `readMem` function, except that the new value will be stored in the State struct. Note that `writeMem` does not verify the proof used to calculate the new merkle root.
-
-
- It is **critically important** that the memory proof being used is verified beforehand by calling the `readMem` function.
-
-
-Also note that `writeMem`, similar to `readMem`, only works over 4-byte aligned words. Therefore, it is up to the logic that calls `writeMem` to generate a value to write such that if an unaligned memory write occurs, the value already reflects that.
-
-### step
-
-The public [`step`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L624) function is the top-level call that executes a single MIPS instruction. This function will be called by an active dispute game in order to determine the true post state given a pre state and a MIPS instruction to run. At a high-level, the function performs the following steps:
-
-1. Verifies and unpacks the stateData variable into the VM execution `State` struct (in memory).
-2. Reads the instruction located at the program counter (`pc`).
-3. Interprets and executes the MIPS instruction according to the MIPS specification.
-4. Writes results to registers or memory (if applicable) and updates the VM execution `State` struct accordingly.
-
-### execute
-
-The internal pure [`execute`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L793) function handles the execution of MIPS instructions that are not handled by other functions. The `execute` function primarily handles R-type instructions according to the MIPS specification, however other instructions will pass through this function. Instructions handled by other functions will simply return. Invalid or unsupported instructions will cause the `execute` function to revert.
-
-## Common bitwise operation use cases
-
-1. Isolating certain bits from a number can be done using the & operator (and(x,y) in Yul), this is also known as generating a bitmask.
-2. Combining bits from two numbers together can be done using the | operator (or(x, y) in Yul).
-3. Modulo arithmetic can be expressed using the following bitwise operation: `x % y = x & (y - 1), ex. x % 4 = x & 3.` Note this is only equivalent for unsigned integers.
-4. Multiplication using a value with a base of 2 can be expressed using the following bitwise operation: `x * y = x << z, where y = 2^z`
- Ex. `x * 8 = x << 3, where 8 = 2^3`
+The implementation prioritizes gas efficiency while maintaining the minimal functionality needed for fault proof verification.
## Table of supported MIPS instructions
@@ -255,11 +146,7 @@ The internal pure [`execute`](https://github.com/ethereum-optimism/optimism/blob
## Further reading
-* [Cannon Overview](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/cannon/docs/README.md)
+* [Cannon Overview](cannon)
* [Cannon FPVM Specification](https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html)
* [MIPS IV ISA Specification](https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf)
-* [MIPS32 Architecture For Programmers Volume II (for SPECIAL2 opcodes)](https://www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf)
-* [MIPS Assembly Wiki Book](https://en.wikibooks.org/wiki/MIPS_Assembly)
-* [MIPS syscall numbers](https://github.com/torvalds/linux/blob/e2be04c7f9958dde770eeb8b30e829ca969b37bb/arch/mips/include/uapi/asm/unistd.h#L23)
-* [Yul Instructions](https://docs.soliditylang.org/en/latest/yul.html#evm-dialect)
* [Solidity ABI Encoding Specification](https://docs.soliditylang.org/en/develop/abi-spec.html)
diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx
index 3382811fe..b130e13ed 100644
--- a/pages/stack/interop/op-supervisor.mdx
+++ b/pages/stack/interop/op-supervisor.mdx
@@ -46,11 +46,11 @@ OP Supervisor provides an interface for `op-node` to query cross-chain safety in
Key API methods include:
-| Method(s) | Description |
+| Method(s) | Description |
| ----------------------------------------- | ------------------------------------------------------------------------------------- |
-| `UnsafeView` and `SafeView` | Return the Local and Cross heads for their respective levels |
+| `UnsafeView` and `SafeView` | Return the Local and Cross heads for their respective levels |
| `DerivedFrom` | OP Nodes use to check the L1 source of the Supervisor (needed for Safe Head tracking) |
-| `UpdateLocalSafe` and `UpdateLocalUnsafe` | Tell the Supervisor when the Node's heads change |
+| `UpdateLocalSafe` and `UpdateLocalUnsafe` | Tell the Supervisor when the Node's heads change |
| `Finalized` | Returns the Finalized Head |
| `UpdateFinalizedL1` | Signals to the Supervisor new finality signals |
| `CheckMessage` | Checks logs in the DB directly in tests |
diff --git a/words.txt b/words.txt
index 394b16e16..9078b83a0 100644
--- a/words.txt
+++ b/words.txt
@@ -13,6 +13,7 @@ ANDI
Ankr
Apeworx
Arweave
+Asterisc
authrpc
Badgeholder's
Badgeholders
@@ -78,7 +79,7 @@ DATACAP
datacap
DATADIR
datadir
-dependencies
+dependecies
Devnet
devnet
devnets
@@ -103,6 +104,7 @@ etherbase
Ethernow
ETHSTATS
ethstats
+EVM's
EVMTIMEOUT
evmtimeout
executability
@@ -175,6 +177,7 @@ JSPATH
jspath
jwtsecret
Keccak
+Kona
leveldb
lightkdf
logfile
@@ -192,7 +195,6 @@ maxprice
MEMPROFILERATE
memprofilerate
Merkle
-merkle
MFHI
MFLO
Minato
@@ -202,7 +204,7 @@ MINSUGGESTEDPRIORITYFEE
minsuggestedpriorityfee
Mintable
Mintplex
-MIPSEVM
+mipsevm
Mitigations
Monitorism
monitorism
@@ -289,6 +291,7 @@ preinstalls
Prestate
prestate
prestates
+PREVRENDAO
PRICEBUMP
pricebump
PRICELIMIT
@@ -299,14 +302,12 @@ Protip
Proxied
Proxyd
proxyd
-pseudorandomly
Pyth
Pyth's
QRNG
Quicknode
quicknode
quickstarts
-RANDAO
rebalance
Regenesis
regenesis
@@ -320,6 +321,7 @@ replayability
replayor
REQUIREDBLOCKS
requiredblocks
+revm
rollouts
Rollups
rollups
@@ -422,6 +424,5 @@ xlarge
XORI
xtensibility
ZKPs
-ZKVM
Zora
zora
From 86d1deefd362b6926d971cb06794976c6a67a22d Mon Sep 17 00:00:00 2001
From: cpengilly <29023967+cpengilly@users.noreply.github.com>
Date: Thu, 16 Jan 2025 16:57:03 -0800
Subject: [PATCH 2/3] remove misspelling from dictionary
---
pages/stack/interop/security.mdx | 2 +-
words.txt | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx
index a0b488677..f9415c1b2 100644
--- a/pages/stack/interop/security.mdx
+++ b/pages/stack/interop/security.mdx
@@ -87,7 +87,7 @@ sequenceDiagram
### Safe initiating messages
Alternatively, a sequencer can be configured to only accept executing messages once the initiating message is in a cross safe block.
-A cross safe block is one that is written to L1, and whose dependecies (direct or indirect, including dependencies of previous blocks in the same chain) are all written to L1.
+A cross safe block is one that is written to L1, and whose dependencies (direct or indirect, including dependencies of previous blocks in the same chain) are all written to L1.
When a block is cross safe, the source sequencer cannot equivocate, and the state will only need to be recalculated if there's an [L1 reorg](https://www.alchemy.com/overviews/what-is-a-reorg#what-happens-to-reorgs-after-the-merge).
The cost of this enhanced security that it would take longer for a message to pass from one blockchain to the other.
diff --git a/words.txt b/words.txt
index 9078b83a0..c222214df 100644
--- a/words.txt
+++ b/words.txt
@@ -79,7 +79,6 @@ DATACAP
datacap
DATADIR
datadir
-dependecies
Devnet
devnet
devnets
From e35a703f4d644ed36c5978796b1b7bbe32e50e35 Mon Sep 17 00:00:00 2001
From: cpengilly <29023967+cpengilly@users.noreply.github.com>
Date: Wed, 22 Jan 2025 11:44:19 -0800
Subject: [PATCH 3/3] Update cannon.mdx
---
pages/stack/fault-proofs/cannon.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/stack/fault-proofs/cannon.mdx b/pages/stack/fault-proofs/cannon.mdx
index a9cb217f9..fa1625164 100644
--- a/pages/stack/fault-proofs/cannon.mdx
+++ b/pages/stack/fault-proofs/cannon.mdx
@@ -214,7 +214,7 @@ This ABI is implemented by the VM by intercepting the `read`/`write` syscalls to
A significant enhancement to Cannon is the introduction of multi-threading capabilities. This upgrade enables:
-* Concurrent execution of MIPS instructions across multiple threads
+* Execution of MIPS instructions across multiple threads
* Deterministic thread scheduling and state management
* Asynchronous garbage collection through Go runtime
* Improved performance through parallel processing