From 7c81f237c1dc36ffa032fa608ac21cbc5a1529f0 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 9 Dec 2024 14:50:19 +0100 Subject: [PATCH 01/75] Added opstack network topology --- pages/stack/_meta.json | 1 + pages/stack/network-topology.mdx | 166 ++++++++++++++++++ .../protocol/opstack-network-topology.png | Bin 0 -> 440313 bytes words.txt | 4 + 4 files changed, 171 insertions(+) create mode 100644 pages/stack/network-topology.mdx create mode 100644 public/img/op-stack/protocol/opstack-network-topology.png diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index fb6fe060f..5b49e2aae 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -4,6 +4,7 @@ "explainer": "Superchain explainer", "design-principles": "Design philosophy & principles", "components": "OP Stack components", + "network-topology": "OP Stack network topologies", "smart-contracts": "Smart contracts", "rollup": "Rollup", "fault-proofs": "Fault proofs", diff --git a/pages/stack/network-topology.mdx b/pages/stack/network-topology.mdx new file mode 100644 index 000000000..649c20f2b --- /dev/null +++ b/pages/stack/network-topology.mdx @@ -0,0 +1,166 @@ +--- +title: OP Stack Network Topologies +lang: en-US +tags: ["eng-protocol"] +description: A guide to acceptable network configurations for deploying OP Stack networks. +--- + +import { Callout } from 'nextra/components' + +# OP Stack network topologies + +This guide provides an example configuration for deploying OP Stack networks, addressing key components, best practices, and recommended setups. + +## Network architecture overview + +The architecture for OP Stack networks includes several node types, each serving a specific role in maintaining network functionality. Below is an example configuration: + +![OP Stack network diagram.](/img/op-stack/protocol/opstack-network-topology.png) + +## Key components + +### Sequencers + +Sequencers process transactions and maintain the rollup chain. + +* Configuration recommendations: + + * Use at least one archive sequencer as a backup to recover from deep L1 reorgs. + * Disable P2P discovery and define a static peer list for internal nodes. + +```yaml +OP_NODE_P2P_NO_DISCOVERY: "true" +OP_NODE_P2P_PEER_BANNING: "false" +OP_NODE_P2P_STATIC: "" +GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" +GETH_TXPOOL_JOURNAL: "" +GETH_TXPOOL_LIFETIME: "1h" +GETH_TXPOOL_NOLOCALS: "true" +GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs +``` + + + Transactions are received via P2P gossip from Tx Ingress Nodes. + Use the op-conductor RPC as a leader-aware proxy for [op-batcher](/builders/chain-operators/tools/chain-monitoring#op-batcher). + + +### Tx Ingress nodes + +These nodes handle incoming transactions from the public and gossip them internally. + +Configuration recommendations: + +```yaml +GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" +GETH_TXPOOL_JOURNALREMOTES: "false" +GETH_TXPOOL_LIFETIME: "1h" +GETH_TXPOOL_NOLOCALS: "true" +GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs +``` + +Node Type: Can be either full or archive nodes. + +### Archive RPC nodes + +Archive nodes provide data to internal systems like the challenger, proposer, and monitoring tools. + +Configuration Recommendations: + +```yaml + +GETH_GCMODE: "archive" +GETH_DB_ENGINE: "pebble" +GETH_STATE_SCHEME: "hash" +``` + +### Use cases: + +* Internal RPC usage. +* Creating disk snapshots for disaster recovery. + +### Full snapsync nodes + +These nodes support the network by providing peers for snap sync. + +Configuration Recommendations: + +```yaml +GETH_GCMODE: "full" +GETH_DB_ENGINE: "pebble" +GETH_STATE_SCHEME: "path" +GETH_SYNCMODE: "snap" +``` + +### Snapsync bootnodes + +Bootnodes facilitate peer discovery for public nodes using snap sync. + +Recommendations: +Use the Geth bootnode tool. +Optionally, configure full Snapsync Nodes to also serve as bootnodes. + +### P2P bootnodes + +These nodes act as the discovery backbone for the op-node P2P network. + +Recommendations: +Use the Geth Bootnode Tool with discovery v5 enabled. + +### Public RPC nodes + +Public RPC nodes provide external access to the network but do not participate in internal transaction gossip. + +Configuration recommendations: + +Do not include Public RPC nodes in the internal Tx pool P2P network. +Use proxyd in consensus\_aware mode for routing and whitelist desired RPCs. + +```yaml +GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" +GETH_TXPOOL_JOURNALREMOTES: "false" +GETH_TXPOOL_NOLOCALS: "true" +GETH_NETRESTRICT: "10.0.0.0/8" +``` + + + Avoid running Public RPC nodes from the same instance as Tx Ingress Nodes to mitigate risks of transaction pool data leakage. + + +## Best practices + +* Redundancy: Always have backup nodes for critical roles like sequencers and archive nodes. +* Security: + * Restrict P2P to internal IPs. + * Regularly test disaster recovery setups. +* Monitoring: Use tools like [Monitorism](/builders/chain-operators/tools/chain-monitoring#monitorism) for network health. + +### Example configuration files + +Here are sample YAML snippets for various node setups: + +Sequencer Node + +```yaml +OP_NODE_P2P_NO_DISCOVERY: "true" +OP_NODE_P2P_PEER_BANNING: "false" +OP_NODE_P2P_STATIC: "" +GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" +GETH_TXPOOL_NOLOCALS: "true" +GETH_NETRESTRICT: "10.0.0.0/8" +``` + +Archive RPC node + +```yaml +GETH_GCMODE: "archive" +GETH_DB_ENGINE: "pebble" +GETH_STATE_SCHEME: "hash" +``` + +## FAQs + +1. Why should Public RPC nodes avoid the Tx pool P2P network? + Including Public RPC nodes in the Tx pool P2P network poses security risks, such as transaction data leakage. + +2. What is the purpose of snapsync bootnodes? + These nodes facilitate peer discovery for public nodes performing snap sync. diff --git a/public/img/op-stack/protocol/opstack-network-topology.png b/public/img/op-stack/protocol/opstack-network-topology.png new file mode 100644 index 0000000000000000000000000000000000000000..9e39a784fbbef3fc286043036e551f68e5431c8b GIT binary patch literal 440313 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%0Al90)EJ1NiCn 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�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
+ + What are deposit only blocks? + + Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. + However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they are replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. + + The way this works is that there are two types of user transactions in an OP Stack block: + + - Sequencer transactions, which go through the sequencer. + These transactions are extremely cheap, but in theory a sequencer could censor them. + - Deposit transactions, which users submit through L1. + These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. + + A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. + + For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list). + +
+ + ## The latency/security tradeoff +The initiating message comes from a block on a different blockchain. +If we accept initiating messages as soon as the block is available through the gossip protocol, we have minimal latency but at a security cost (because the source sequencer can send incorrect information through gossip). +Alternatively, we can wait until the source sequencer posts the block to L1. +In that case we can be more certain that the block is correct, but at the cost of higher latency. + +There are three different possibilities, at different levels of latency and security. + ### Unsafe initiating messages L2 blocks start as unsafe, meaning that there is no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. -However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), once all the source blocks of the messages are written to L1 as well. -The cost of this approach is that the state calculated by the sequencer may not be correct, and it will have to be recalculated if the other sequencer equivocates. +However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), for itself and the previous blocks in its blockchain are also written to L1. ```mermaid @@ -41,15 +80,16 @@ sequenceDiagram end src->>l1: Write block src_n without txn_0 (so no evt_0) l1->>dst: This is the safe block src_n - note left of dst: No evt_0, so txn_1 fails.
The state after dst_m is incorrect
So is the state after dst_m+1, dst_m+2... . - + note left of dst: No evt_0, so block dst_m is incorrect
and so is every subsequent block.
All those blocks are replaced with
deposit only blocks. ``` ### Safe initiating messages -Alternatively, a sequencer can be configured to only accept executing messages once the initiating message is in a cross safe block (one which is written to L1, and whose own dependencies are all written to L1). -In this case, the source sequencer cannot equivocate, and the state will only need to be recalculated if there is an [L1 reorg](https://www.alchemy.com/overviews/what-is-a-reorg#what-happens-to-reorgs-after-the-merge). -The cost is that it would take longer for a message to pass from one blockchain to the other. +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. + +When a block is cross safe, the source sequencer cannot equivocate, and the state will only need to be recalculated if there is 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. Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. You can use [this dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity#submission-frequency) to see how often OP Stack chains submit batches. @@ -93,17 +133,6 @@ Even if a sequencer accepts unsafe initiating messages, the blocks it constructs -## The trust model - -Barring L1 reorgs, there are two ways in which interop can fail. - -- *Equivocation*: A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - Equivocation is solved by the distinction between blocks that are cross safe (written to L1, along with all of the ones on which the block depends) and those that aren't. -- *Faulty information*: The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. - To save on resources, the operator can choose to query other nodes of the source blockchain. - In that case, the cross-safe blocks depend on the accuracy of the information reported by those nodes. - - {/* ## What is stopping a sequencer from censoring a cross-chain message? There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. From 661fd47bdbaa348e51ade8662ec5650814d0199f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 6 Jan 2025 17:25:05 +0100 Subject: [PATCH 11/75] Update pages/stack/interop/security.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/security.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index a31235893..06f0c8e9a 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -1,7 +1,7 @@ --- title: Security considerations lang: en-US -description: What we do to make it safe +description: Security measures for safe interoperability --- import { Callout } from 'nextra/components' From b1ff9c3f42121c20d42411227da114f4a6df6f78 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 6 Jan 2025 17:25:38 +0100 Subject: [PATCH 12/75] Update pages/stack/interop/explainer.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 105b61709..26bb99f2b 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -17,7 +17,7 @@ import { InteropCallout } from '@/components/WipCallout' It is easy for a blockchain to be certain about information it generates itself. Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). -We would like the Superchain to appear as a single blockchain to the lay user, which requires quick, seamless message and asset bridging. +The Superchain should appear as a single blockchain to the lay user, which requires quick, seamless message and asset bridging. *Interoperability* is a set of protocols and services that lets OP Stack blockchains read each others' state. Interoperability provides the following benefits: From fb2c5412c1121f3bc73be8e15ec369babec58e32 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 7 Jan 2025 19:04:18 +0200 Subject: [PATCH 13/75] some @zainbacchus comments --- pages/stack/interop/architecture.mdx | 6 +++--- pages/stack/interop/explainer.mdx | 22 ++++++++++++---------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/pages/stack/interop/architecture.mdx b/pages/stack/interop/architecture.mdx index c068cdf61..7fdb5bc20 100644 --- a/pages/stack/interop/architecture.mdx +++ b/pages/stack/interop/architecture.mdx @@ -44,7 +44,7 @@ graph LR ``` OP-Supervisor holds a database of all the log events of all the chains in the interoperability cluster. -Every event can potentially initiate a cross domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. +Every event can potentially initiate a cross-domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. Additionally, OP-Supervisor reads information from L1's consensus layer to determine the transaction safety of L2 blocks. ## How messages get from one chain to the other @@ -72,13 +72,13 @@ sequenceDiagram note over dst-geth: Executing Message ``` -Cross domain messages require two transactions. +Cross-domain messages require two transactions. The first transaction creates an *initiating message* on the source chain. The second transaction creates an *executing message* on the destination chain. This executing message could result in a contract function being executed on the destination chain. The initiating message is simply a log event. -Any log event on any chain that inteoperates with the destination can initiate a cross domain message. +Any log event on any chain that inteoperates with the destination can initiate a cross-domain message. The transaction that receives the message on the destination chain calls a contract called [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox). This call can be at the top level, directly from the externally owned account, or come through a smart contract. diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 26bb99f2b..afb277207 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -17,7 +17,8 @@ import { InteropCallout } from '@/components/WipCallout' It is easy for a blockchain to be certain about information it generates itself. Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). -The Superchain should appear as a single blockchain to the lay user, which requires quick, seamless message and asset bridging. +The next major scalability improvement to the OP Stack is to enable a network of chains to feel like a single blockchain. +This goal requires low-latency, seamless message passing and asset bridging. *Interoperability* is a set of protocols and services that lets OP Stack blockchains read each others' state. Interoperability provides the following benefits: @@ -61,12 +62,12 @@ graph LR ``` OP-Supervisor holds a database of all the log events of all the chains in the interoperability cluster. -Every event can potentially initiate a cross domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. +Every event can potentially initiate a cross-domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. Additionally, OP-Supervisor reads information from L1's consensus layer to determine the transaction safety of L2 blocks. ## How messages get from one chain to the other -To understand *why* we need this additional service, it is useful to know how interop messages get from one blockchain to another. +To understand *why* we need this additional service, it is useful to know how interop messages get from one OP Stack chain to another. ```mermaid @@ -89,13 +90,13 @@ sequenceDiagram note over dst-geth: Executing Message ``` -Cross domain messages require two transactions. +Cross-domain messages require two transactions. The first transaction creates an *initiating message* on the source chain. The second transaction creates an *executing message* on the destination chain. This executing message could result in a contract function being executed on the destination chain. The initiating message is simply a log event. -Any log event on any chain that inteoperates with the destination can initiate a cross domain message. +Any log event on any chain that inteoperates with the destination can initiate a cross-domain message. The transaction that receives the message on the destination chain calls a contract called [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox). This call can be at the top level, directly from the externally owned account, or come through a smart contract. @@ -140,19 +141,19 @@ flowchart LR B1 --> C0 ``` -Interop expands the scope of trust for unsafe blocks, blocks that are shared through [the gossip protocol](/builders/chain-operators/architecture#sequencer). +Interop expands the scope of trust for unsafe blocks (blocks that are shared through [the gossip protocol](/builders/chain-operators/architecture#sequencer)). To trust that an unsafe block is valid and is going to become safe and then finalized, you need to trust not only the sequencer that produces it, but also all the other sequencers that produce other blocks that are still unsafe, but that include initiating messages that are executed in that block. -However, this is only for *unsafe* blocks, and only if the sequencer allows messages from unsafe blocks to be processed. +Notably this trust assumption is only for *unsafe* blocks, and *only* if the sequencer allows messages from unsafe blocks to be processed. -In interop, the traditional safe level of is divided into two types of safety. -A block *local safe* once it is written to L1. +In interop, [the traditional safe level](https://docs.optimism.io/stack/transactions/transaction-finality#steps-to-finality) of is divided into two types of safety. +A block is *local safe* once it is written to L1. But it is only *cross safe* when in addition to the block itself all of the blocks on which it depends (directly or indirectly) are written to L1, including the dependencies of previous blocks in the same chain. For example, in the image above, most blocks are safe. Block `n` in chain `A` is even finalized, and immune from reorgs. However, block `n+105` in chain `A` is unsafe, it (or a block on which it depends) is not written to L1. -Because the new block depends upon it, it is also unsafe. +Because the new block depends upon it, it can be either unsafe or local safe, but it cannot be cross safe. ## Interop clusters @@ -172,6 +173,7 @@ flowchart LR ``` For example, in the illustration above, the dependency set of chain B is chains A and C. +To move an asset from chain E to chain B, it is necessary to move the asset from chain E to chain A, and then from chain A to chain C, because there is no direct dependency between B and E. ### Superchain interop cluster From cb040cc4b7dade69611a3f0807ca37a3c00740af Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 7 Jan 2025 19:13:50 +0200 Subject: [PATCH 14/75] @zainbacchus comments --- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/predeploy.mdx | 4 +++- pages/stack/interop/security.mdx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index adde4432c..51cdc9c6e 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -7,5 +7,5 @@ "op-supervisor": "OP Supervisor", "assets": "Assets", "connectivity": "Connectivity considerations", - "security": "Security considerations" + "security": "Cross-chain security" } \ No newline at end of file diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx index f942cf79c..520e136f5 100644 --- a/pages/stack/interop/predeploy.mdx +++ b/pages/stack/interop/predeploy.mdx @@ -36,6 +36,7 @@ Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain recei - **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) - **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) +{/* ## OptimismSuperchainERC20Factory `OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge`, and includes a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. @@ -44,7 +45,6 @@ Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain recei - **Specs:** [`OptimismSuperchainERC20Factory`](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) - **Source code:** [`OptimismSuperchainERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol) - ## OptimismSuperchainERC20Beacon To enable upgrades, `OptimismSuperchainERC20` contracts use [the `BeaconProxy` pattern](https://docs.openzeppelin.com/contracts/3.x/api/proxy#beacon). @@ -54,6 +54,8 @@ This contract is the `Beacon` part, which provides the implementation address fo - **Specs:** [`OptimismSuperchainERC20Beacon`](https://specs.optimism.io/interop/predeploys.html#beaconcontract) - **Source code:** [`OptimismSuperchainERC20Beacon`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol) +*/} + ## SuperchainTokenBridge The `SuperchainTokenBridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `OptimismSuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 06f0c8e9a..51d1f0ecc 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -1,5 +1,5 @@ --- -title: Security considerations +title: Cross-chain security lang: en-US description: Security measures for safe interoperability --- From d00818e1b5a975c158e7277b0ae34169d2fc54d1 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Wed, 8 Jan 2025 16:57:12 +0200 Subject: [PATCH 15/75] Ready for review --- pages/stack/interop/_meta.json | 1 - pages/stack/interop/connectivity.mdx | 31 ---------------------------- pages/stack/interop/explainer.mdx | 27 +++++++++++++++++++++++- pages/stack/interop/security.mdx | 10 ++++++--- 4 files changed, 33 insertions(+), 36 deletions(-) delete mode 100644 pages/stack/interop/connectivity.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 51cdc9c6e..4a9c17bac 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -6,6 +6,5 @@ "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", "assets": "Assets", - "connectivity": "Connectivity considerations", "security": "Cross-chain security" } \ No newline at end of file diff --git a/pages/stack/interop/connectivity.mdx b/pages/stack/interop/connectivity.mdx deleted file mode 100644 index 876cdaa3c..000000000 --- a/pages/stack/interop/connectivity.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Connectivity considerations -lang: en-US -description: What types of connectivity can we support? ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -import { InteropCallout } from '@/components/WipCallout' - - - -# Connectivity considerations - -## Interop between chains with non-fungible blockspace - -Chains that have *non-fungible blockspace* are chains that have different features - for example, chains that use Plasma for data availability, a custom gas paying token, or have a large execution gas limit. -As long as the chain can be fault proven, it can work with Superchain interoperability. -However, at the application layer, it is important for chains to have legibility into the type of chain that the message originated from. -This ensures that applications do not accept messages from chains they consider not secure enough. -See [this discussion](https://github.com/ethereum-optimism/specs/issues/121) for additional thoughts. - -When it comes to chains that have different gas limits that are interoperable, it creates a set of transactions that can execute on one chain but not the other. -This happens when the transaction consumes more than the gas limit of the smaller chain but less than of the bigger chain. At 2024 usages levels, these sorts of transactions are very rare. -In the future, it may be the case that these transactions become more common, it will be up to the chain operators to ensure quality of service for their users. - -## Are callback style transactions possible? - -If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. -This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. \ No newline at end of file diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index afb277207..4de32d7fd 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -142,7 +142,32 @@ flowchart LR ``` Interop expands the scope of trust for unsafe blocks (blocks that are shared through [the gossip protocol](/builders/chain-operators/architecture#sequencer)). -To trust that an unsafe block is valid and is going to become safe and then finalized, you need to trust not only the sequencer that produces it, but also all the other sequencers that produce other blocks that are still unsafe, but that include initiating messages that are executed in that block. +If a sequencer chooses to accept unsafe messages, the sequencer must trust the sequencer that produces the inbound message as well as any referenced unsafe messages produced from sequencers in the transitive dependency set. + +
+ +What is the transitive dependency set? + +The transitive dependency set of a blockchain is all the chains on which it depends, and all the chains that depend on them, and so on. +For example, in the illustration above, the dependency set of chain A is just chain B. +However, the *transitive* dependency set includes chain B, the chains that depend on it (C and D) and the chains that depend on them (E). +If there was a chain that depended on E, that chain would be part of the transitive dependency set too. + +```mermaid + +flowchart LR + A[Chain A] <--> B[Chain B] + B <--> C[Chain C] + B <--> D[Chain D] + D <--> E[Chain E] + F[Chain F] <--> G[Chain G] +``` + +For example, there could be a block in chain D that depends on an initiating message in chain E> +If the block with that initiating message is still unsafe (not written to L1), then the block in chain D is also usafe, even if it has been written to L1. +As a result, a block in chain B that depends on the chain D block can also be unsafe, as can a block in chain A that depends on the block in chain B. + +
Notably this trust assumption is only for *unsafe* blocks, and *only* if the sequencer allows messages from unsafe blocks to be processed. diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 51d1f0ecc..946616168 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -15,10 +15,14 @@ import { InteropCallout } from '@/components/WipCallout' ## The trust model -Barring L1 reorgs, there are two ways in which interop can fail. +The vulnerability in interop is what happens when there appears to be an initiating message, and therefore we process the executing message, but then it turns out the initiating message is not there in the cannonical chain. +Barring L1 reorgs, there are two ways this can happen: - *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - Equivocation is solved by the distinction between blocks that are cross safe (written to L1, along with all of the ones on which the block depends) and those that aren't. + The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) does not. + The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. + It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. + - *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. To save on resources, the sequencer can choose to query existing nodes of the source blockchain. In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. @@ -128,7 +132,7 @@ Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-s -Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them cannot be promoted until equivocation is impossible. +Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. From 71c6ce64cc4b3ba5f1df6d48e9d6e69cfd0b7347 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 10 Jan 2025 16:22:58 +0100 Subject: [PATCH 16/75] updating EAS contracts --- pages/stack/smart-contracts.mdx | 123 ++++++++++++++++++++------------ public/_redirects | 3 +- 2 files changed, 80 insertions(+), 46 deletions(-) diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index 07b18dd2b..cb1f30f2b 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -66,7 +66,6 @@ The upgrade was coupled with the [Granite network upgrade](/builders/node-operat * DisputeGameFactory: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L25) * SuperchainConfig: [1.1.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/SuperchainConfig.sol#L38) * ProtocolVersions: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/ProtocolVersions.sol#L39) - #### op-contracts/v1.5.0 - Safe extensions @@ -74,18 +73,18 @@ The upgrade was coupled with the [Granite network upgrade](/builders/node-operat The Safe Extensions protocol upgrade is intended to increase the security and decentralization of the Superchain by: -1. Increasing the Security Council Safe's signing threshold, from 4 to 10, out -of 13 owners. This meets the 75% threshold requirement for a Stage 1 rollup -outlined in [L2Beat's Stages framework](https://medium.com/l2beat/stages-update-security-council-requirements-4c79cea8ef52) -2. Reassigning the role of Guardian from the Foundation to a new Guardian Safe -with the Security Council Safe as its sole owner. This moves the Superchain -closer to satisfying the 1 week exit window 5 requirement for Stage 1. - * Additionally the Foundation is appointed to the new DeputyGuardian role - which is able to act as Guardian through the Guardian Safe. This +1. Increasing the Security Council Safe's signing threshold, from 4 to 10, out + of 13 owners. This meets the 75% threshold requirement for a Stage 1 rollup + outlined in [L2Beat's Stages framework](https://medium.com/l2beat/stages-update-security-council-requirements-4c79cea8ef52) +2. Reassigning the role of Guardian from the Foundation to a new Guardian Safe + with the Security Council Safe as its sole owner. This moves the Superchain + closer to satisfying the 1 week exit window 5 requirement for Stage 1. + * Additionally the Foundation is appointed to the new DeputyGuardian role + which is able to act as Guardian through the Guardian Safe. This appointment can be revoked by the Security Council Safe at any time. -3. Reassigning the owner of the L2ProxyAdmin contract from the Foundation to -the Security Council. This ensures the Security Council Safe has a blocking -vote for L2 predeploy upgrades and is a requirement for Stage 1. +3. Reassigning the owner of the L2ProxyAdmin contract from the Foundation to + the Security Council. This ensures the Security Council Safe has a blocking + vote for L2 predeploy upgrades and is a requirement for Stage 1. * [Official - Safe Extensions Release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.5.0) * [Governance Post](https://gov.optimism.io/t/final-protocol-upgrade-8-guardian-security-council-threshold-and-l2-proxyadmin-ownership-changes-for-stage-1-decentralization/8157) @@ -116,7 +115,6 @@ vote for L2 predeploy upgrades and is a requirement for Stage 1. * PreimageOracle: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/cannon/PreimageOracle.sol#L33) * SuperchainConfig: [1.1.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/SuperchainConfig.sol#L38) * ProtocolVersions: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/ProtocolVersions.sol#L39) - #### op-contracts/v1.4.0 - Fault proofs @@ -303,16 +301,16 @@ and most importantly making the stack modular. ### L1 Contract Details -#### AddressManager +#### AddressManager -`AddressManager` is a legacy contract that was used in the old version of the +`AddressManager` is a legacy contract that was used in the old version of the Optimism system to manage a registry of string names to addresses. We now use a more standard proxy system for most contracts, but this contract is still used for the L1CrossDomainMessenger, via ResolvedDelegateProxy #### SuperchainConfig -The `SuperchainConfig` contract is used to manage configuration of global +The `SuperchainConfig` contract is used to manage configuration of global superchain values. It has the ability to pause and unpause all withdrawals in the Superchain. @@ -338,7 +336,7 @@ contract acts as an escrow for ERC721 tokens deposited into L2. The `L1StandardBridge` is responsible for transferring ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L1, it will be escrowed within this -contract. If the ERC20 token is native to L2, it will be burnt. +contract. If the ERC20 token is native to L2, it will be burnt. #### OptimismPortal @@ -348,53 +346,53 @@ Users are encouraged to use the `L1CrossDomainMessenger` for a higher-level inte #### ProtocolVersions -The `ProtocolVersions` contract is used to manage Superchain protocol version +The `ProtocolVersions` contract is used to manage Superchain protocol version information. It exposes a recommended and required version for node operators. -The recommended/required versions are changed with each hard fork. Nodes can +The recommended/required versions are changed with each hard fork. Nodes can optionally halt if using the wrong version. #### SystemConfig -The `SystemConfig` contract is helps manage configuration of an OP Stack -network. Much of the network's configuration is stored on L1 and picked up by -L2 as part of the derivation of the L2 chain. The contract also contains +The `SystemConfig` contract is helps manage configuration of an OP Stack +network. Much of the network's configuration is stored on L1 and picked up by +L2 as part of the derivation of the L2 chain. The contract also contains references to all other contract addresses for the chain. #### DisputeGameFactory -The `DisputeGameFactory` contract generates `FaultDisputeGame` contract +The `DisputeGameFactory` contract generates `FaultDisputeGame` contract instances. -#### FaultDisputeGame +#### FaultDisputeGame -The `FaultDisputeGame` contract is deployed by the `DisputeGameFactory`. Each -deployed instance of the contract acts as a host to a proposal about the state +The `FaultDisputeGame` contract is deployed by the `DisputeGameFactory`. Each +deployed instance of the contract acts as a host to a proposal about the state of the OP Stack chain at a given block number. #### PermissionedDisputeGame -The `Guardian` can also choose to revert to a `PermissionedDisputeGame` +The `Guardian` can also choose to revert to a `PermissionedDisputeGame` contract that only allows specific roles to submit and challenge proposals. #### AnchorStateRegistry -The `AnchorStateRegistry` is a contract that stores the latest "anchor" state -for each available `FaultDisputeGame` type. The anchor state is the latest -state that has been proposed on L1 and was not challenged within the challenge +The `AnchorStateRegistry` is a contract that stores the latest "anchor" state +for each available `FaultDisputeGame` type. The anchor state is the latest +state that has been proposed on L1 and was not challenged within the challenge period. By using stored anchor states, new `FaultDisputeGame` instances can -be initialized with a more recent starting state which reduces the amount of +be initialized with a more recent starting state which reduces the amount of required offchain computation. #### DelayedWETH -The `DelayedWETH` contract has been set up to hold the bonds and only allow -payouts after a delay, so that bonds can be redirected towards the correct +The `DelayedWETH` contract has been set up to hold the bonds and only allow +payouts after a delay, so that bonds can be redirected towards the correct recipient in the case that a game resolves incorrectly. -#### MIPS +#### MIPS -The `MIPS` smart contract is an onchain implementation of a virtual machine -(VM) that encompasses the 32-bit, Big-Endian, MIPS III Instruction Set +The `MIPS` smart contract is an onchain implementation of a virtual machine +(VM) that encompasses the 32-bit, Big-Endian, MIPS III Instruction Set Architecture (ISA). #### PreimageOracle @@ -484,10 +482,10 @@ user is depositing from L1 to L2 or withdrawing from L2 to L1. ### GasPriceOracle The `GasPriceOracle` is no longer a permissioned contract like in the legacy -system. It only exists to preserve the API for offchain gas estimation. The -function `getL1Fee(bytes)` accepts an unsigned RLP transaction and will return -the L1 portion of the fee. This fee pays for using L1 as a data availability -layer and should be added to the L2 portion of the fee, which pays for +system. It only exists to preserve the API for offchain gas estimation. The +function `getL1Fee(bytes)` accepts an unsigned RLP transaction and will return +the L1 portion of the fee. This fee pays for using L1 as a data availability +layer and should be added to the L2 portion of the fee, which pays for execution, to compute the total transaction fee. Following the Ecotone upgrade, the values used for L1 fee computation are: @@ -606,15 +604,18 @@ withdrawn to an immutable address on L1. ### SchemaRegistry -The `SchemaRegistry` predeploy implements the global attestation schemas for -the Ethereum Attestation Service protocol. +The `SchemaRegistry` predeploy implements the global attestation schemas for the Ethereum Attestation Service protocol. * **Address:** `0x4200000000000000000000000000000000000020` * **Introduced:** Bedrock * **Deprecated:** no * **Proxied:** yes -### EAS +The SchemaRegistry works alongside the Ethereum Attestation Service (EAS) to enable attestations. See [Build Decentralized Identity Apps with Attestations](about-attestations) for more details on schemas and usage. + +### EAS (Ethereum Attestation Service) + +The [Ethereum Attestation Service (EAS)](https://attest.sh/) is an open-source public good included as a predeploy in the OP Stack. It allows developers to issue and manage attestations on-chain, supporting use cases such as decentralized identity and other data integrity scenarios. The `EAS` predeploy implements the Ethereum Attestation Service protocol. @@ -623,6 +624,39 @@ The `EAS` predeploy implements the Ethereum Attestation Service protocol. * **Deprecated:** no * **Proxied:** yes +### Contract addresses + +EAS contracts are deployed on these networks: + +| Network | Attestation Contract | Schema Registry Contract | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| OP Sepolia | [0x4200000000000000000000000000000000000021](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000020) | +| OP Mainnet | [0x4200000000000000000000000000000000000021](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000020) | + +### How to use EAS + +You can interact with the Ethereum Attestation Service in several ways: + +1. **Using the EAS Scan UI:** + * [EAS Scan for OP Mainnet](https://optimism.easscan.org/) + * [EAS Scan for OP Sepolia](https://optimism-sepolia.easscan.org/) + +2. **Using the JavaScript SDK:** + * [EAS SDK Documentation](https://docs.attest.sh/docs/developer-tools/eas-sdk) + +3. **Access Directly Onchain:** + * See the [EAS Smart Contract Implementation](https://github.com/ethereum-attestation-service/eas-contracts/blob/master/contracts/EAS.sol). + +### Indexing Attestations + +Attestations made via EAS can be indexed through the following tools: + +* [GraphQL Endpoint](https://docs.attest.sh/docs/developer-tools/api) +* [Ponder Graph](https://github.com/ethereum-attestation-service/eas-ponder-graph) +* [Open Source Indexer](https://github.com/ethereum-attestation-service/eas-indexing-service) + +For more information on working with attestations, see [Build Decentralized Identity Apps with Attestations](about-attestations). + ### BeaconBlockRoot The `BeaconBlockRoot` predeploy provides access to the L1 beacon block roots. @@ -634,8 +668,7 @@ This was added during the Ecotone network upgrade and is specified in * **Deprecated:** no * **Proxied:** no -### DEPRECATED Contracts - +### DEPRECATED Contracts #### DEPRECATED - LegacyMessagePasser diff --git a/public/_redirects b/public/_redirects index 753e33de4..eb5db867a 100644 --- a/public/_redirects +++ b/public/_redirects @@ -117,4 +117,5 @@ /stack/interop/transfer-superchainERC20 /stack/interop/assets/transfer-superchainERC20 /builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 /builders/chain-operators/tutorials/sdk /builders/app-developers/overview -/stack/explainer /superchain/superchain-explainer \ No newline at end of file +/stack/explainer /superchain/superchain-explainer +/chain/identity/contracts-eas /stack/smart-contracts#eas-ethereum-attestation-service \ No newline at end of file From 5ed8f029c2380d0969007f36724391d05ac61ac8 Mon Sep 17 00:00:00 2001 From: minds <0xminds@gmail.com> Date: Sat, 11 Jan 2025 15:21:56 +0300 Subject: [PATCH 17/75] docs: Fix grammatical issues Update glossary.mdx --- pages/connect/resources/glossary.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/connect/resources/glossary.mdx b/pages/connect/resources/glossary.mdx index e1c411053..c5a56d8af 100644 --- a/pages/connect/resources/glossary.mdx +++ b/pages/connect/resources/glossary.mdx @@ -115,7 +115,7 @@ derivation then acts as a sanity check and a way to detect L1 chain re-orgs. #### Time slot -On L2, there is a block every 2 second (this duration is known as the [block time](#block-time)). +On L2, there is a block every 2 seconds (this duration is known as the [block time](#block-time)). We say that there is a "time slot" every multiple of 2s after the timestamp of the [L2 genesis block](#l2-genesis-block). On L1, post-merge, the time slots are every 12s. However, an L1 block may not be produced for every time slot, in case of even benign consensus issues. @@ -265,7 +265,7 @@ pre-confirm the transactions before the L1 confirms the data. #### Sequencer -The specific entity or smart contract which has priority when submitting transactions to an OP Chain, can be either a [rollup node](#rollup-node) ran in sequencer mode or the operator of this rollup node. +The specific entity or smart contract which has priority when submitting transactions to an OP Chain, can be either a [rollup node](#rollup-node) run in sequencer mode or the operator of this rollup node. The sequencer receives L2 transactions from L2 users, creates L2 blocks using them, which it then submits to [data availability provider](#data-availability-provider) (via a [batcher](#batcher)). It also submits [output roots](#l2-output-root) to L1. @@ -359,7 +359,7 @@ of the channel are seen, or else these frames are ignored.) Guarantee that some data will be "available" (i.e. *retrievable*) during a reasonably long time window. In Optimism's case, the data in question are [sequencer batches](#sequencer-batch) that [validators](#validator) -needs in order to verify the sequencer's work and validate the L2 chain. The [finalization period](#finalization-period) +need in order to verify the sequencer's work and validate the L2 chain. The [finalization period](#finalization-period) should be taken as the lower bound on the availability window, since that is when data availability is the most crucial, as it is needed to perform a [fault proof](#fault-proof). "Availability" **does not** mean guaranteed long-term storage of the data. From a38a8c47102150ce3ec398abe86c20a80267a46b Mon Sep 17 00:00:00 2001 From: teenager-ETH Date: Sun, 12 Jan 2025 12:25:15 +0100 Subject: [PATCH 18/75] Minor fix typo key-management.mdx --- pages/builders/chain-operators/management/key-management.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/management/key-management.mdx b/pages/builders/chain-operators/management/key-management.mdx index 0fb1a031d..479b6ba0c 100644 --- a/pages/builders/chain-operators/management/key-management.mdx +++ b/pages/builders/chain-operators/management/key-management.mdx @@ -28,7 +28,7 @@ RPC method. You can take a look at the signer client [source code](https://github.com/ethereum-optimism/optimism/blob/develop/op-service/signer/client.go) - if you're interested in whats happening under the hood. + if you're interested in what's happening under the hood. ## Cold wallets From 4135090f53e8e5cd4a16440bba9c6f972097ed51 Mon Sep 17 00:00:00 2001 From: Richard Gregory Date: Sun, 12 Jan 2025 18:19:36 +0100 Subject: [PATCH 19/75] Update chain deployment overview page --- .../chain-operators/deploy/overview.mdx | 46 +++++++------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/pages/builders/chain-operators/deploy/overview.mdx b/pages/builders/chain-operators/deploy/overview.mdx index 1d3617644..532c99b96 100644 --- a/pages/builders/chain-operators/deploy/overview.mdx +++ b/pages/builders/chain-operators/deploy/overview.mdx @@ -1,18 +1,18 @@ --- title: OP Stack deployment overview lang: en-US -description: Learn about the different components of deploying the OP Stack. +description: Learn about the different components of deploying a standard OP Stack chain. --- import { Callout } from 'nextra/components' # OP Stack deployment overview -When deploying an OP Stack chain, you'll be setting up four different +When deploying a **standard OP Stack chain**, you'll be setting up several key components. It's useful to understand what each of these components does before -you start deploying your chain. The OP Stack can be deployed as a L3, which -includes additional considerations. The following information assumes you're -deploying a L2 Rollup on Ethereum. +you start deploying your chain. The following information assumes you're +deploying a Rollup on Ethereum, but most concepts apply generally to any +standard OP Stack deployment. ## Smart contracts @@ -24,7 +24,7 @@ contracts that are deployed when the chain is created. Standard OP Stack chains should only use governance approved and audited smart contracts. The monorepo has them tagged with the following pattern `op-contracts/vX.X.X` and you can review the release notes for details on the - changes. Read more about the details on our [Smart Contract Release Section](/stack/smart-contracts#official-releases). + changes. Read more about the details in our [Smart Contract Release Section](/stack/smart-contracts#official-releases). ## Sequencer node @@ -48,9 +48,9 @@ a16z) and [`hildr`](https://github.com/optimism-java/hildr) (maintained by Optim OP Stack nodes, like Ethereum nodes, also have an execution client. The execution client is responsible for executing transactions and maintaining the state of the blockchain. Various implementations of the OP Stack execution -client exist, including `op-geth` (maintained by Optimism Foundation), -[`op-erigon`](https://github.com/testinprod-io/op-erigon) -(maintained by Test in Prod), and [`op-nethermind`](https://docs.nethermind.io/get-started/installing-nethermind/#supported-networks). +client exist, including `op-geth` (maintained by the Optimism Foundation), +[`op-erigon`](https://github.com/testinprod-io/op-erigon) (maintained by Test +in Prod), and [`op-nethermind`](https://docs.nethermind.io/get-started/installing-nethermind/#supported-networks). ## Batcher @@ -65,6 +65,13 @@ the form of L2 state roots) to the L1 blockchain. This allows smart contracts on L1 to read the state of the L2, which is necessary for cross-chain communication and reconciliation between state changes. +## Challenger + +The Challenger enforces network security by disputing invalid state roots (if +any) that have been posted by the Proposer. It monitors on-chain data and, in +the event of a suspected fraud, triggers a fault proof or another dispute +mechanism to invalidate the erroneous data. + ## Software dependencies | Dependency | Version | Version Check Command | @@ -76,7 +83,6 @@ communication and reconciliation between state changes. | [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | | [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | -| [direnv](https://direnv.net) | `^2` | `direnv --version` | ### Notes on specific dependencies @@ -94,26 +100,6 @@ managing `foundry` to ensure you're always working with the correct version. This approach simplifies the installation, update, and version checking process. -#### `direnv` - -Parts of our tutorial use [`direnv`](https://direnv.net) as a way of loading -environment variables from `.envrc` files into your shell. This means you won't -have to manually export environment variables every time you want to use them. -`direnv` only ever has access to files that you explicitly allow it to see. - -After [installing `direnv`](https://direnv.net/docs/installation.html), you -will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. -Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), -then **close your terminal and reopen it** so that the changes take effect (or -`source` your config file if you know how to do that). - - - Make sure that you have correctly hooked `direnv` into your shell by modifying - your shell configuration file (like `~/.bashrc` or `~/.zshrc`). If you haven't - edited a config file then you probably haven't configured `direnv` properly - (and things might not work later). - - ## Next steps * Discover how to [deploy the smart contracts](/builders/chain-operators/deploy/smart-contracts). From 150fd658e8353f489f7735d79fdf54ac33f90af7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 13 Jan 2025 18:37:36 +0100 Subject: [PATCH 20/75] improved lychee --- lychee.toml | 34 +++++++++++-------- .../chain-operators/tools/op-deployer.mdx | 2 +- pages/builders/tools/build/nft-tools.mdx | 1 - pages/builders/tools/build/oracles.mdx | 8 ++--- .../assets/transfer-superchainERC20.mdx | 6 ++-- pages/stack/interop/message-passing.mdx | 6 ++-- pages/stack/interop/supersim.mdx | 2 +- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lychee.toml b/lychee.toml index 73b34c1e3..020972dde 100644 --- a/lychee.toml +++ b/lychee.toml @@ -1,18 +1,19 @@ ############################# Display ############################# - -# Verbose program output -verbose = "info" - +# Use error level to only show failed requests +verbose = "error" # Don't show interactive progress bar while checking links. no_progress = true +# Don't show the source file of links +no_show_source = true ############################# Requests ############################ - # URL remapping rules. remap = [ - "file:///(.*?)/pages/img/(.*) file:///$1/public/img/$2", - "file:///(.*?)/pages/resources/(.*) file:///$1/public/resources/$2", - "file:///([^#.?]+)(#.*)?$ file:///$1.mdx$2", + "file:///(.*?)/img/(.*) file:///$1/public/img/$2", + "file:///(.*?)/icons/(.*) file:///$1/public/icons/$2", + "file:///(.*?)/resources/(.*) file:///$1/public/resources/$2", + "file:///(.*?)/audit-reports/(.*) file:///$1/public/audit-reports/$2", + "file:///([^#.?]+)(#.*)?$ file:///$1.mdx$2", "\\\\& &" ] @@ -20,13 +21,10 @@ remap = [ base = "./pages" ############################# Exclusions ########################## - # Exclude loopback IP address range and localhost from checking. exclude_loopback = true - # Exclude all mail addresses from checking. exclude_mail = true - # Exclude RPC URLs from checking. exclude = [ 'https://mainnet.optimism.io', @@ -37,8 +35,16 @@ exclude = [ 'https://web.archive.org', 'https://mainnet.base.org', 'https://sepolia.base.org', - 'https://optimism.easscan.org' + 'https://optimism.easscan.org', + '\.(pdf|zip|png|jpg|jpeg|gif|svg)$' +] + +# Accept all status codes except 404 +accept = [ + "100..=399", + "401..=403", + "405..=999" ] -# Accept these status codes -accept = ["100..=103", "200..=299", "403..=403", "502..=502"] \ No newline at end of file +# Use compact format for cleaner output +format = "compact" \ No newline at end of file diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 0a814a46e..c611d27a6 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -101,7 +101,7 @@ op-deployer apply --workdir .deployer --l1-rpc-url --private-key - The transfer isn't complete until the message is successfully relayed on the destination chain. See the [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) for specific relay instructions. + The transfer isn't complete until the message is successfully relayed on the destination chain. See the [technical reference guide](https://supersim.pages.dev/guides/interop/viem?#viem-to-send-and-relay-interop-messages) for specific relay instructions. ### Step 4: Verify completion @@ -103,13 +103,13 @@ sequenceDiagram 3. The tokens should now be available for use on the destination chain -For detailed technical instructions including contract addresses, specific commands, and message relaying details, refer to our [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast). +For detailed technical instructions including contract addresses, specific commands, and message relaying details, refer to our [technical reference guide](https://supersim.pages.dev/guides/interop/viem?#viem-to-send-and-relay-interop-messages). ## Alternative methods You can also use: -* [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem) for TypeScript integration +* [viem bindings/actions](https://supersim.pages.dev/guides/interop/viem) for TypeScript integration ## Next steps diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index 3be6ed39c..af661135b 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -48,7 +48,7 @@ Cross-chain messaging involves four main phases: 4. **Message Execution**: The destination chain receives and processes the message, executing any associated actions or state changes specified in the original message. -For detailed implementation steps and code examples, see our [message passing implementation guide](https://supersim.pages.dev/guides/interop/relay-using-viem.html). +For detailed implementation steps and code examples, see our [message passing implementation guide](https://supersim.pages.dev/guides/interop/viem). ## Common Use Cases @@ -57,10 +57,10 @@ For detailed implementation steps and code examples, see our [message passing im * Cross-chain state synchronization * Token transfers and bridging -For a practical example, see our [cross-chain ping pong tutorial](https://supersim.pages.dev/guides/interop/cross-chain-contract-via-l2cdm). +For a practical example, see our [cross-chain ping pong tutorial](https://supersim.pages.dev/guides/interop/cross-chain-contract-calls-pingpong). ## Next steps * Read about the [anatomy of a cross-chain message](/stack/interop/cross-chain-message) * Try [Supersim](supersim) for testing cross-chain messages locally -* Learn about [manually relaying messages](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) +* Learn about [manually relaying messages](https://supersim.pages.dev/guides/interop/viem?#viem-to-send-and-relay-interop-messages) diff --git a/pages/stack/interop/supersim.mdx b/pages/stack/interop/supersim.mdx index 674485a66..5bc896d51 100644 --- a/pages/stack/interop/supersim.mdx +++ b/pages/stack/interop/supersim.mdx @@ -57,5 +57,5 @@ This diagram illustrates how developers interact with Supersim through the CLI, ## Next steps * Check out the dedicated [Supersim docs](https://Supersim.pages.dev/) for tutorials and specific use cases. -* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/interop/explainer.mdx#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From 4a7168c0c38fe2eab78a1090f877a7ee711c208d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 13 Jan 2025 18:51:51 +0100 Subject: [PATCH 21/75] update internal links --- lychee.toml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lychee.toml b/lychee.toml index 020972dde..c6d12ae72 100644 --- a/lychee.toml +++ b/lychee.toml @@ -9,16 +9,18 @@ no_show_source = true ############################# Requests ############################ # URL remapping rules. remap = [ - "file:///(.*?)/img/(.*) file:///$1/public/img/$2", - "file:///(.*?)/icons/(.*) file:///$1/public/icons/$2", - "file:///(.*?)/resources/(.*) file:///$1/public/resources/$2", - "file:///(.*?)/audit-reports/(.*) file:///$1/public/audit-reports/$2", - "file:///([^#.?]+)(#.*)?$ file:///$1.mdx$2", + # First handle the resource paths relative to pages directory + "file:///(.*?)/img/(.*) file:///./$1/public/img/$2", + "file:///(.*?)/icons/(.*) file:///./$1/public/icons/$2", + "file:///(.*?)/resources/(.*) file:///./$1/public/resources/$2", + "file:///(.*?)/audit-reports/(.*) file:///./$1/public/audit-reports/$2", + # Then handle the internal links for mdx files + "file:///([^#.?]+)(#.*)?$ file:///./pages/$1.mdx$2", "\\\\& &" ] -# Base URL or website root directory to check relative URLs. -base = "./pages" +# Base URL or website root directory to check relative URLs +base = "." ############################# Exclusions ########################## # Exclude loopback IP address range and localhost from checking. From 0ed0f49512f6ffef16f3b4cc7a173980ca423528 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 13 Jan 2025 19:51:52 +0100 Subject: [PATCH 22/75] Narrowed down the lychee rule --- lychee.toml | 21 ++++++++++++------- .../builders/chain-operators/self-hosted.mdx | 6 +++--- pages/builders/tools/build/oracles.mdx | 4 ++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lychee.toml b/lychee.toml index c6d12ae72..f3c5399f3 100644 --- a/lychee.toml +++ b/lychee.toml @@ -9,13 +9,14 @@ no_show_source = true ############################# Requests ############################ # URL remapping rules. remap = [ - # First handle the resource paths relative to pages directory - "file:///(.*?)/img/(.*) file:///./$1/public/img/$2", - "file:///(.*?)/icons/(.*) file:///./$1/public/icons/$2", - "file:///(.*?)/resources/(.*) file:///./$1/public/resources/$2", - "file:///(.*?)/audit-reports/(.*) file:///./$1/public/audit-reports/$2", - # Then handle the internal links for mdx files - "file:///([^#.?]+)(#.*)?$ file:///./pages/$1.mdx$2", + # Handle URL-encoded anchors (%23) first + "file:///([^%]+)%23(.*) file:///./pages/$1.mdx#$2", + # Handle regular anchors + "file:///([^#]+)#(.*) file:///./pages/$1.mdx#$2", + # Handle the resource paths relative to pages directory + + # Handle regular files without anchors + "file:///([^#%]+) file:///./pages/$1.mdx", "\\\\& &" ] @@ -49,4 +50,8 @@ accept = [ ] # Use compact format for cleaner output -format = "compact" \ No newline at end of file +format = "compact" + +############################# Anchors ############################# +# Enable checking for anchors in local files +check_anchors = true \ No newline at end of file diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index 31dc22ac9..f206a840f 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -22,8 +22,8 @@ There are two main steps to get started building your own self-hosted OP Chain: * **Chain Architecture**: OP Chains use execution and consensus clients as well as the OP Stack's privileged roles. For more details, see the [Chain Architecture](/builders/chain-operators/architecture) guide. * **Smart Contracts**: OP Chains use several smart contracts on the L1 blockchain to manage aspects of the Rollup. Each OP Stack chain has its own - set of [L1 smart contracts](/stack/smart-contracts#layer-1-contracts), - [L2 predeploy contracts](/stack/smart-contracts#layer-2-contracts-predeploys), + set of [L1 smart contracts](/stack/smart-contracts), + [L2 predeploy contracts](/stack/smart-contracts), and [L2 preinstall contracts](/builders/chain-operators/features/preinstalls) that are deployed when the chain is created. * **Preinstalls**: OP Chains come with [preinstalled core contracts](/builders/chain-operators/features/preinstalls), making them usable as soon as a chain is initialized on the OP Stack. @@ -56,7 +56,7 @@ OP Chains can be configured for throughput, cost, and other decentralization tra {

Set Public RPC Endpoint

} - * Set the [public RPC Endpoint](/builders/chain-operators/architecture#ingress-traffic), so your OP Chain can handle large volumes of RPC requests from your users. + * Set the [public RPC Endpoint](/builders/chain-operators/architecture), so your OP Chain can handle large volumes of RPC requests from your users. {

Enable Analytics for Onchain Data

} diff --git a/pages/builders/tools/build/oracles.mdx b/pages/builders/tools/build/oracles.mdx index 277c8c03e..8b45115e0 100644 --- a/pages/builders/tools/build/oracles.mdx +++ b/pages/builders/tools/build/oracles.mdx @@ -115,10 +115,10 @@ Ready to integrate? Head over to the [Gelato VRF Quick Start Guide](https://docs The Pyth Network is a financial oracle network which delivers over 400 low-latency, high-fidelity price feeds across cryptocurrencies, FX pairs, equities, ETFs, and commodities. * Pyth's price data is sourced from over [95 first-party sources](https://pyth.network/publishers) including exchanges, market makers, and financial services providers. -* Pyth [Price Feeds](https://pyth.network/price-feeds) offer both the real-time spot price of the asset as well as an accompanying confidence interval band around that price +* Pyth [Price Feeds](https://www.pyth.network/developers/price-feed-ids) offer both the real-time spot price of the asset as well as an accompanying confidence interval band around that price * The Pyth [TradingView](https://docs.pyth.network/guides/how-to-create-tradingview-charts) integration allows users to view and display Pyth prices on their own website and UI. -You can explore the full catalog of Pyth Price Feed IDs for [OP Mainnet and Sepolia (EVM Stable)](https://pyth.network/developers/price-feed-ids#pyth-evm-stable). +You can explore the full catalog of Pyth Price Feed IDs for [OP Mainnet and Sepolia (EVM Stable)](https://www.pyth.network/developers/price-feed-ids). * Pyth Entropy allows developers to quickly and easily generate secure random numbers on the blockchain. More details [here](https://pyth.network/blog/secure-random-numbers-for-blockchains) From 55284c7b1ddeca90b2df12b1af947549873cb6cf Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 09:02:39 -0600 Subject: [PATCH 23/75] Update pages/stack/interop/predeploy.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/stack/interop/predeploy.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx index 520e136f5..8dd1e49ee 100644 --- a/pages/stack/interop/predeploy.mdx +++ b/pages/stack/interop/predeploy.mdx @@ -29,7 +29,7 @@ Anyone can trigger the execution or validation of cross chain messages, on behal ## L2ToL2CrossDomainMessenger The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing. -It is utilized, among other things, for secure transfers ERC20 tokens between L2 chains. +It's utilized for secure ERC20 token transfers between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding (the executing transaction can only be valid on a single chain). - **Address:** `0x4200000000000000000000000000000000000023` From c2fb6e31ab85a3f4f5853220d6f2eb8f93ef0d93 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 09:18:31 -0600 Subject: [PATCH 24/75] Apply suggestions from code review Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/stack/interop/architecture.mdx | 2 +- pages/stack/interop/predeploy.mdx | 2 +- pages/stack/interop/security.mdx | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/stack/interop/architecture.mdx b/pages/stack/interop/architecture.mdx index 7fdb5bc20..e0bbaba4b 100644 --- a/pages/stack/interop/architecture.mdx +++ b/pages/stack/interop/architecture.mdx @@ -44,7 +44,7 @@ graph LR ``` OP-Supervisor holds a database of all the log events of all the chains in the interoperability cluster. -Every event can potentially initiate a cross-domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. +Every event can potentially initiate a cross-domain message, and it's the job of OP-Supervisor to validate that the log event really happened on the source chain. Additionally, OP-Supervisor reads information from L1's consensus layer to determine the transaction safety of L2 blocks. ## How messages get from one chain to the other diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx index 8dd1e49ee..d89f3b4ee 100644 --- a/pages/stack/interop/predeploy.mdx +++ b/pages/stack/interop/predeploy.mdx @@ -15,7 +15,7 @@ import { InteropCallout } from '@/components/WipCallout' The following predeploys have been added to enable interoperability. *Predeployed smart contracts* exist at predetermined addresses, coming from the genesis state. -They are similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. +They're similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. ## CrossL2Inbox diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 946616168..7dec4e67a 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -15,11 +15,11 @@ import { InteropCallout } from '@/components/WipCallout' ## The trust model -The vulnerability in interop is what happens when there appears to be an initiating message, and therefore we process the executing message, but then it turns out the initiating message is not there in the cannonical chain. -Barring L1 reorgs, there are two ways this can happen: +This interop vulnerability arises when an initiating message seems to exist, prompting the processing of the executing message. However, the initiating message ends up not actually appear in the canonical chain. +Excluding L1 reorgs, this can happen in two ways: - *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) does not. + The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. @@ -27,14 +27,14 @@ Barring L1 reorgs, there are two ways this can happen: To save on resources, the sequencer can choose to query existing nodes of the source blockchain. In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. - Note that in this case the blocks posted by the sequencer will be invalid, and other verifiers will be able to see they are invalid and replace them with *deposit only* blocks. + In this case, invalid blocks will be replaced with deposit only blocks by other verifiers.
What are deposit only blocks? Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. - However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they are replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. + However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. The way this works is that there are two types of user transactions in an OP Stack block: @@ -61,7 +61,7 @@ There are three different possibilities, at different levels of latency and secu ### Unsafe initiating messages -L2 blocks start as unsafe, meaning that there is no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. +L2 blocks start as unsafe, meaning that there's no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. @@ -92,7 +92,7 @@ sequenceDiagram 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. -When a block is cross safe, the source sequencer cannot equivocate, and the state will only need to be recalculated if there is an [L1 reorg](https://www.alchemy.com/overviews/what-is-a-reorg#what-happens-to-reorgs-after-the-merge). +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. Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. @@ -123,7 +123,7 @@ sequenceDiagram ### Finalized initiating messages -A sequencer can also be configured to reject all executing messages until the initiating message is *finalized*, meaning it is irrevocably on L1 and immune to reorgs. +A sequencer can also be configured to reject all executing messages until the initiating message is *finalized*, meaning it's irrevocably on L1 and immune to reorgs. Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-slot-finality/) to the message latency.
From 16d4477047d527d14abdeda835e802cebe0e1b29 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 14 Jan 2025 16:29:22 +0100 Subject: [PATCH 25/75] clear errors --- lychee.toml | 21 +- .../transactions/parameters.mdx | 2 +- .../transactions/troubleshooting.mdx | 1 - .../tools/chain-monitoring.mdx | 4 +- pages/chain/security/privileged-roles.mdx | 2 +- pages/connect/resources/glossary.mdx | 184 +++++++++--------- pages/stack/transactions/fees.mdx | 2 +- 7 files changed, 107 insertions(+), 109 deletions(-) diff --git a/lychee.toml b/lychee.toml index f3c5399f3..9c8c225bb 100644 --- a/lychee.toml +++ b/lychee.toml @@ -9,15 +9,14 @@ no_show_source = true ############################# Requests ############################ # URL remapping rules. remap = [ - # Handle URL-encoded anchors (%23) first - "file:///([^%]+)%23(.*) file:///./pages/$1.mdx#$2", - # Handle regular anchors - "file:///([^#]+)#(.*) file:///./pages/$1.mdx#$2", - # Handle the resource paths relative to pages directory - - # Handle regular files without anchors - "file:///([^#%]+) file:///./pages/$1.mdx", - "\\\\& &" + # Handle resource files without adding .mdx extension + "file:///pages/(.*?)\\.(pdf|png|jpg|jpeg|gif|svg|json)$ file:///./pages/$1.$2", + # Handle URL-encoded anchors (%23) for mdx files + "file:///([^%\\.]+)%23(.*) file:///./pages/$1.mdx#$2", + # Handle regular anchors (#) for mdx files + "file:///([^#\\.]+)#(.*) file:///./pages/$1.mdx#$2", + # Handle regular mdx files without anchors + "file:///([^#%\\.]+)$ file:///./pages/$1.mdx", ] # Base URL or website root directory to check relative URLs @@ -28,7 +27,7 @@ base = "." exclude_loopback = true # Exclude all mail addresses from checking. exclude_mail = true -# Exclude RPC URLs from checking. +# Exclude RPC URLs from checking exclude = [ 'https://mainnet.optimism.io', 'https://mainnet-sequencer.optimism.io', @@ -39,7 +38,7 @@ exclude = [ 'https://mainnet.base.org', 'https://sepolia.base.org', 'https://optimism.easscan.org', - '\.(pdf|zip|png|jpg|jpeg|gif|svg)$' + '\.(pdf|zip|png|jpg|jpeg|gif|svg|json)$' ] # Accept all status codes except 404 diff --git a/pages/builders/app-developers/transactions/parameters.mdx b/pages/builders/app-developers/transactions/parameters.mdx index 22e450911..1f1da0aa2 100644 --- a/pages/builders/app-developers/transactions/parameters.mdx +++ b/pages/builders/app-developers/transactions/parameters.mdx @@ -42,7 +42,7 @@ From the block, retrieve the `baseFeePerGas` and `gasUsed` fields. OP Mainnet adjusts the base fee based on the amount of gas used in the previous block. If the previous block used more than 5m gas (of the 30m gas limit), then the base fee will increase by up to 10%. If the previous block used less than 5m gas, then the base fee will decrease by up to 10%. -Refer to the [OP Mainnet EIP-1559 Parameters](/chain/differences#eip-1559-parameters) section for more details. +Refer to the [OP Mainnet EIP-1559 Parameters](/stack/differences#eip-1559-parameters) section for more details. {

Select a base fee per gas

} diff --git a/pages/builders/app-developers/transactions/troubleshooting.mdx b/pages/builders/app-developers/transactions/troubleshooting.mdx index 2a40d74e4..9ab4daeb4 100644 --- a/pages/builders/app-developers/transactions/troubleshooting.mdx +++ b/pages/builders/app-developers/transactions/troubleshooting.mdx @@ -22,7 +22,6 @@ We have a workaround that users and wallet operators can implement immediately, Set the maximum fee per gas for transactions to a relatively high value, such as 0.1 gwei. This will *not* increase the transaction cost because the same base fee, determined by a formula, is charged to all the transactions in the block. -[See here for more details](/builders/cex-wallet-developers/wallet-support#base-fee). To save on the cost of L2 gas you want to minimize the max priority fee. Also, if the [current base fee](https://optimistic.grafana.net/public-dashboards/c84a5a9924fe4e14b270a42a8651ceb8?orgId=1&refresh=5m) is comparable to 0.1 gwei or higher, you might want to suggest to users a higher multiple of the base fee than you would on L1 Ethereum because it can grow faster in the time interval between transaction creation and transaction signing and submission. diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 14da3c81b..1dac6ef35 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -97,13 +97,13 @@ To enable metrics, pass the `--metrics.enabled` flag to the op-geth. You can cus To enable metrics, pass the `--metrics.enabled` flag to the op-proposer. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. -You can find more information about these flags in our [Proposer configuration doc](https://docs.optimism.io/builders/chain-operators/configuration/proposer#metricsenabled). +You can find more information about these flags in our [Proposer configuration doc](/builders/chain-operators/configuration/proposer#metricsenabled). ### `op-batcher` To enable metrics, pass the `--metrics.enabled` flag to the op-batcher. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. -You can find more information about these flags in our [Batcher configuration doc](https://docs.optimism.io/builders/chain-operators/configuration/batcher#metricsenabled). +You can find more information about these flags in our [Batcher configuration doc](/builders/chain-operators/configuration/proposer#metricsenabled). ### `op-challenger` diff --git a/pages/chain/security/privileged-roles.mdx b/pages/chain/security/privileged-roles.mdx index 040d2b940..afc4ab129 100644 --- a/pages/chain/security/privileged-roles.mdx +++ b/pages/chain/security/privileged-roles.mdx @@ -33,7 +33,7 @@ The L1 Proxy Admin is an address that can be used to upgrade most OP Mainnet sys ## L2 Proxy Admin -The L2 Proxy Admin is an address that can be used to upgrade most OP Mainnet system contracts on L2. The L2 Proxy Admin owner is the [aliased address](/chain/differences#address-aliasing) of the L1ProxyAdmin owner, which means the L2 ProxyAdmin Owner is equal to the L1 ProxyAdmin Owner, but due to aliasing it's a different address. Here's how that works: +The L2 Proxy Admin is an address that can be used to upgrade most OP Mainnet system contracts on L2. The L2 Proxy Admin owner is the [aliased address](/stack/differences#address-aliasing) of the L1ProxyAdmin owner, which means the L2 ProxyAdmin Owner is equal to the L1 ProxyAdmin Owner, but due to aliasing it's a different address. Here's how that works: * Given an L1 contract address, the aliased L2 address is equal to `L1_contract_address` + `0x1111000000000000000000000000000000001111`. * Using `0x6B1BAE59D09fCcbdDB6C6cceb07B7279367C4E3b` as an example, the `0x6B` address is the L2 address that's been aliased, so to figure out the original L1 address you calculate `0x6B1BAE59D09fCcbdDB6C6cceb07B7279367C4E3b` - `0x1111000000000000000000000000000000001111`. diff --git a/pages/connect/resources/glossary.mdx b/pages/connect/resources/glossary.mdx index c5a56d8af..e854e770b 100644 --- a/pages/connect/resources/glossary.mdx +++ b/pages/connect/resources/glossary.mdx @@ -19,35 +19,35 @@ The glossary provides definitions of important terminology used throughout the O ## General terms -#### Address aliasing +### Address aliasing When a contract submits a [deposit](#deposit) from L1 to L2, it's address (as returned by `ORIGIN` and `CALLER`) will be aliased with a modified representation of the address of a contract. -#### Block +### Block A sequential list of transactions, along with a couple of properties stored in the '''header''' of the block; can refer to an [L1](#layer-1-l1) block, or to an [L2](#layer-2-l2) block, which are structured similarly. It is useful to distinguish between input block properties, which are known before executing the transactions in the block, and output block properties, which are derived after executing the block's transactions (e.g., [Merkle Patricia Trie roots](#merkle-patricia-trie)). -#### Block time +### Block time L2 block time is 2 seconds, meaning there is an L2 block at every 2s [time slot](#time-slot). *Post-merge*, it could be said that L1 block time is 12s as that is the L1 [time slot](#time-slot). However, in reality the block time is variable as some time slots might be skipped. Pre-merge, the L1 block time is variable, though it is on average 13s. -#### Delegation +### Delegation Refers to the process of assigning the voting power of your tokens to a designated community member, known as a delegate. Delegates are individuals who have volunteered to actively participate in the governance of the Optimism Token House. By delegating your voting power, you enable these delegates to vote on governance matters on your behalf, while you retain full ownership of your tokens and the freedom to use them as you wish. You can also change your chosen delegate at any time, allowing for flexibility in how your voting power is represented in the governance process. -#### EOA or externally owned account +### EOA or externally owned account Ethereum term to designate addresses operated by users, as opposed to contract addresses. -#### Execution engine +### Execution engine Responsible for executing transactions in blocks and computing the resulting state roots, receipts roots, and block hash. Both L1 (*post-merge*) and L2 have an execution engine. On L1, the executed blocks can @@ -55,38 +55,38 @@ come from L1 block synchronization or from a block freshly minted by the executi at the request of the L1 consensus layer. On L2, the executed blocks are freshly minted by the execution engine at the request of the [rollup node](#rollup-node), using transactions [derived from L1 blocks](#l2-chain-derivation). -#### Optimism collective +### Optimism collective The Optimism Collective is a band of people, projects, and companies working together to build a better economy for everyone, united by a mutually beneficial pact to adhere to the axiom of impact=profit — the principle that positive impact to the collective should be rewarded with profit to the individual. New model of digital democratic governance optimized to drive rapid and sustained growth of a decentralized ecosystem. -#### OP token +### OP token A governance token, referred to as "OP." Content should not discuss the token price or speculate on the price, and content that refers to OP incorrectly will be removed from Optimism platforms and will not be eligible for promotion. -#### Layer 1 (L1) +### Layer 1 (L1) Refers the Ethereum blockchain, used in contrast to [layer 2](#layer-2-l2), which refers to Optimism. -#### Layer 2 (L2) +### Layer 2 (L2) Refers to the Optimism blockchain and is used in contrast to [layer 1](#layer-1-l1), which refers to the Ethereum blockchain. -#### L2 output root +### L2 output root 32 byte value which serves as a commitment to the current state of the L2 chain. -#### L2 output oracle contract +### L2 output oracle contract L1 contract to which [L2 output roots](#l2-output-root) are posted by the [sequencer](#sequencer). -#### Predeployed contract +### Predeployed contract A contract placed in the L2 genesis state (i.e. at the start of the chain). -#### PGA or priority gas auction +### PGA or priority gas auction Transactions in ethereum are ordered by the price that the transaction pays to the miner. Priority Gas Auctions (PGAs) occur when multiple parties are competing to be the first transaction in a block. Each party continuously @@ -95,44 +95,44 @@ parties (like being the first deposit or submitting a deposit before there is no PGAs tend to have negative externalities on the network due to a large amount of transactions being submitted in a very short amount of time. -#### Receipt +### Receipt The output generated by a transaction, comprising a status code, the amount of gas used, a list of log entries, and a [bloom filter](https://en.wikipedia.org/wiki/Bloom_filter) indexing these entries. Log entries are most notably used to encode Solidity events. Receipts are not stored in blocks, but blocks store a [Merkle Patricia Trie root](#merkle-patricia-trie) for a tree containing the receipt for every transaction in the block. -#### Rollup Node +### Rollup Node The node responsible for [deriving the L2 chain](#l2-chain-derivation) from the L1 chain (L1 [blocks](#block) and their associated [receipts](#receipt). The rollup node can run either in *[validator](#validator-mode)* or *[sequencer](#sequencer-mode)* mode. -#### Sequencer mode +### Sequencer mode The rollup node receives L2 transactions from users, which it uses to create L2 blocks. These are then submitted to a [data availability provider](#data-availability-provider) via [batch submission](#batch-submission). The L2 chain derivation then acts as a sanity check and a way to detect L1 chain re-orgs. -#### Time slot +### Time slot On L2, there is a block every 2 seconds (this duration is known as the [block time](#block-time)). We say that there is a "time slot" every multiple of 2s after the timestamp of the [L2 genesis block](#l2-genesis-block). On L1, post-merge, the time slots are every 12s. However, an L1 block may not be produced for every time slot, in case of even benign consensus issues. -#### Transaction Type +### Transaction Type Ethereum provides a mechanism as described in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) for defining different transaction types. Different transaction types can contain different payloads and be handled differently by the protocol. -#### Validator +### Validator An entity (individual or organization) that runs a [rollup node](#rollup-node) in validator mode. Doing so grants a lot of benefits similar to running an Ethereum node, such as the ability to simulate L2 transactions locally, without rate limiting. It also lets the validator verify the work of the [sequencer](#sequencer), by re-deriving [output roots](#l2-output-root) and comparing them against those submitted by the sequencer. In case of a mismatch, the validator can perform a [fault proof](#fault-proof). -#### Validator mode +### Validator mode The rollup node performs derivation as indicated in sequencer mode, but is also able to "run ahead" of the L1 chain by getting blocks directly from the sequencer, in which case derivation serves to validate the sequencer's @@ -142,40 +142,40 @@ behavior. A rollup node running in validator mode is sometimes called *a replica ## OP profile & identity -#### Attestations +### Attestations Statements or evidence of information made by anyone about anything. -#### Attestation recipient +### Attestation recipient The entity or individual that receives the [attestation](#attestations) from the attester. In decentralized identity, the attestation recipient can be a service provider, website, or any other entity that requires verification of a person's identity or personal information. -#### Attestation issuer +### Attestation issuer The entity or individual that performs the attestation process and issues the [attestation](#attestations). In decentralized identity, the attestation issuer can be a government agency, financial institution, or any other trusted entity that is authorized to verify a person's identity or personal information. -#### Attestation verifier +### Attestation verifier The entity or individual that verifies the [attestation](#attestations) and ensures that it is valid and accurate. In decentralized identity, the attestation verifier can be a service provider, website, or any other entity that requires verification of a person's identity or personal information. -#### Decentralized identity +### Decentralized identity A system that enables individuals to have greater control and ownership over their personal data and identity. In decentralized identity, personal information is stored on a blockchain or other decentralized system, and individuals have the ability to grant or revoke access to their data as they see fit. This allows for greater privacy, security, and control over personal information. -#### Ethereum attestation service (EAS) +### Ethereum attestation service (EAS) An Ethereum infrastructure public good for making attestations on or off-chain about anything. -#### Sybil-resistance +### Sybil-resistance A defense mechanism that prevents someone from creating multiple fake identities in a decentralized identity system. -#### Web of trust +### Web of trust A decentralized model used to establish trust among participants in a network. It relies on the concept of participants vouching for the authenticity or trustworthiness of other participants. In a web of trust, trust is built through the accumulation of attestations from trusted individuals. @@ -183,93 +183,93 @@ A decentralized model used to establish trust among participants in a network. I ## OP Stack & OP Superchain -#### Attestation-based fault proof +### Attestation-based fault proof A fault proof where challenges can be successfully made by supplying an [attestation proof](#attestation-proof) which disagrees with the original withdrawal claim. -#### Attestation-based validity proof +### Attestation-based validity proof A validity proof which can be verified by supplying an [attestation proof](#attestation-proof) which agrees with the withdrawal claim. -#### Attestation proof +### Attestation proof A proof which consists of some number of signatures from a pre-agreed upon set of chain attestors. -#### Cannon fault proof +### Cannon fault proof A fault proof where challenges are evaluated using an onchain game which is guaranteed to result in a truthful outcome, given economic rationality assumptions. -#### Chain +### Chain A state [transition system](https://en.wikipedia.org/wiki/Transition_system) consisting of an initial state, a state transition function, and a list of inputs (transactions)—which is cryptographically committed to and can be independently replicated with commodity computer hardware and internet connection. -#### Chain proof +### Chain proof Difficult to forge evidence of the validity of a particular withdrawal claim. Proofs are commonly used to enable chains to communicate with each other. -#### Challenge period +### Challenge period The window of time in which a challenge can be made to disprove a fault proof. -#### Fault proof +### Fault proof A proof which relies on the absence of counter-evidence to prove correctness. -#### L1 origin +### L1 origin the L1 origin of an L2 block is the L1 block corresponding to its [sequencing epoch](#sequencing-epoch). -#### Merkle patricia trie +### Merkle patricia trie sparse [trie](https://en.wikipedia.org/wiki/Trie), which is a tree-like structure that maps keys to values. The root hash of a MPT is a commitment to the contents of the tree, which allows a proof to be constructed for any key-value mapping encoded in the tree. Such a proof is called a Merkle proof, and can be verified against the Merkle root. -#### Modular proof +### Modular proof The ability to use multiple proof systems for the same OP Chain. For instance, it should be possible to prove an OP Chain using a fault proof or a validity proof. -#### Modular sequencing +### Modular sequencing The ability to configure the sequencer address during OP Chain deployment. This value can be configured by the OP Chain deployer. -#### OP Chain +### OP Chain An individual chain within the Optimism Superchain. All chains, regardless of their specific properties are considered OP Chains if they are officially governed by the Optimism Collective, and therefore part of the Superchain. -#### OP Mainnet +### OP Mainnet Layer 2 blockchain powered by the OP Stack. Previously known as just "Optimism,"OP Mainnet is where it all started, and the first chain to commit to the Superchain vision. -#### OP Stack +### OP Stack the modular, open source, MIT-licensed development stack that powers the OP Mainnet, OP Chains, and, in the future, the Superchain. The OP Stack is maintained by the Optimism Collective. -#### OP Stack Fork +### OP Stack Fork Layer 2 blockchain that has been built using the MIT-licensed OP Stack, but is not governed by Optimism's governance or contributing sequencer revenue back to the Collective (and therefore is not on track to become part of the Superchain). This means OP Stack Forks won't necessarily share security or interoperability with OP Chains in the Superchain. -#### Plasma Chain +### Plasma Chain A chain where transaction data is committed to on L1 but not supplied to L1 directly, with a data availability challenge fallback. -#### Rollup Chain +### Rollup Chain A chain where all transaction data is submitted to L1. -#### Rollup transactions +### Rollup transactions Rollup transactions can be included in two ways: through a [deposited transaction](#deposited-transaction) enforced by the system and through a regular transaction embedded in a [sequencer batch](#sequencer-batch). Submitting transactions for inclusion in a batch saves costs by reducing overhead, and enables the sequencer to pre-confirm the transactions before the L1 confirms the data. -#### Sequencer +### Sequencer The specific entity or smart contract which has priority when submitting transactions to an OP Chain, can be either a [rollup node](#rollup-node) run in sequencer mode or the operator of this rollup node. The sequencer receives L2 transactions from L2 users, creates L2 blocks using them, which it then submits to [data availability provider](#data-availability-provider) (via a [batcher](#batcher)). It also submits [output roots](#l2-output-root) to L1. -#### Sequencing Window +### Sequencing Window Range of L1 blocks from which a [sequencing epoch](#sequencing-epoch) can be derived. A sequencing window whose first L1 block has number `N` contains [batcher transactions](#batcher-transaction) for epoch @@ -278,29 +278,29 @@ The current default `SWS` is 3600 epochs. Additionally, the first block in the window defines the [depositing transactions](#depositing-transaction) which determine the [deposits](#deposit) to be included in the first L2 block of the epoch. -#### Sequencing Epoch +### Sequencing Epoch sequential range of L2 blocks derived from a [sequencing window](#sequencing-window) of L1 blocks. Each epoch is identified by an epoch number, which is equal to the block number of the first L1 block in the sequencing window. Epochs can have variable size, subject to some constraints. -#### Superchain +### Superchain A decentralized blockchain platform which consists of many chains that share security and a technology stack (OP Stack). The interoperability and standardization enables individual chains to be treated identically by tools and wallets. -#### Superchain Bridge +### Superchain Bridge The L1 bridge contracts which govern all OP Chains in the Superchain. This bridge can be upgraded by the Optimism Collective. -#### Validity Proof +### Validity Proof A proof of a withdrawal claim which can be immediately validated, without a challenge period. -#### Withdrawal Claim +### Withdrawal Claim A claim about the state of one chain made on another chain. For instance, I can claim that in OP Mainnet I have burned my tokens with the intent to withdraw those tokens back to L1. -#### Zero Knowledge Proof +### Zero Knowledge Proof A validity proof which relies on cryptographic properties and low error margins. @@ -308,20 +308,20 @@ A validity proof which relies on cryptographic properties and low error margins. ## Protocol -#### Batcher +### Batcher Software component (independent program) that is responsible to make channels available on a data availability provider. The batcher communicates with the rollup node in order to retrieve the channels. The channels are then made available using [batcher transactions](#batcher-transaction). -#### Batcher Transaction +### Batcher Transaction Transaction submitted by a [batcher](#batcher) to a data availability provider, in order to make channels available. These transactions carry one or more full frames, which may belong to different channels. A channel's frame may be split between multiple batcher transactions. When submitted to Ethereum calldata, the batcher transaction's receiver must be the sequencer inbox address. The transaction must also be signed by a recognized batch submitter account. -#### Channel +### Channel Sequence of [sequencer batches](#sequencer-batch) (for sequential blocks) compressed together; uniquely identified by its timestamp (UNIX time at which the channel was created) and a random value. The reason to group multiple batches together is simply to obtain @@ -332,13 +332,13 @@ a better compression rate, hence reducing data availability costs. * On the side of the [rollup node](#rollup-node) (which is the consumer of channels), a channel is considered to be *opened* if its final frame (explicitly marked as such) has not been read, or closed otherwise. -#### Channel Frame +### Channel Frame Chunk of data belonging to a [channel](#channel). [Batcher transactions](#batcher-transaction) carry one or multiple frames. The reason to split a channel into frames is that a channel might be too large to include in a single batcher transaction. -#### Channel Timeout +### Channel Timeout Duration (in L1 blocks) during which [channel frames](#channel-frame) may land on L1 within [batcher transactions](#batcher-transaction). The acceptable time range for the frames of a [channel](#channel) is `[channel_id.timestamp, channel_id.timestamp + @@ -355,7 +355,7 @@ of the channel are seen, or else these frames are ignored.) channels. This is particularly relevant during L1 re-orgs. -#### Data Availability +### Data Availability Guarantee that some data will be "available" (i.e. *retrievable*) during a reasonably long time window. In Optimism's case, the data in question are [sequencer batches](#sequencer-batch) that [validators](#validator) @@ -363,17 +363,17 @@ need in order to verify the sequencer's work and validate the L2 chain. The [fin should be taken as the lower bound on the availability window, since that is when data availability is the most crucial, as it is needed to perform a [fault proof](#fault-proof). "Availability" **does not** mean guaranteed long-term storage of the data. -#### Data Availability Provider +### Data Availability Provider Service that can be used to make [data available](#data-availability). Ideally, a good data availability provider provides strong *verifiable* guarantees of data availability, such as Ethereum call data and EIP4844. -#### Deposit +### Deposit L2 transaction derived from an L1 block (by the rollup driver). While transaction deposits are notably (but not only) used to "deposit" (bridge) ETH and tokens to L2, the word *deposit* should be understood as "a transaction *deposited* to L2 from L1". -#### Deposit contract +### Deposit contract L1 contract to which [EOAs](#eoa-or-externally-owned-account) and contracts may send deposits. The deposits are emitted as log records (in Solidity, these are called *events*) for consumption by [rollup nodes](#rollup-node). @@ -384,91 +384,91 @@ emitted as log records (in Solidity, these are called *events*) for consumption [Merkle Patricia Trie roots](#merkle-patricia-trie) included in the L1 block. -#### Deposited Transaction +### Deposited Transaction L2 transaction that was derived from L1 and included in a L2 block. There are two kinds of deposited transactions: L1 attributes deposited transaction (submits the L1 block's attributes to the L1 Attributes Predeployed Contract) and User deposited transactions (transactions derived from an L1 call to the deposit contract). -#### Depositor +### Depositor L1 address (contract or \[EOA]) that makes (is the `msg.sender` of) the [depositing call](#depositing-call). The *depositor* is **NOT** the originator of the [depositing transaction](#depositing-transaction) (i.e. `tx.origin`). -#### Depositing Call +### Depositing Call L1 call to the deposit contract, which will be derived to a [user-deposited transaction](#user-deposited-transaction) by the rollup driver. This call specifies all the data (destination, value, calldata, ...) for the deposited transaction. -#### Depositing Transaction +### Depositing Transaction L1 transaction that makes one or more [depositing calls](#depositing-call). -#### Deposited transaction type +### Deposited transaction type EIP-2718 transaction type, which specifies the input fields and correct handling of a deposited transaction. -#### Event or log data +### Event or log data Data generated by the [depositing call](#depositing-call) and read by the rollup driver to derive the [deposited transaction](#deposited-transaction). -#### Finalized L2 Head +### Finalized L2 Head Highest L2 block that can be derived from *finalized* L1 blocks — i.e. L1 blocks older than two L1 epochs (64 L1 [time slots](#time-slot)). -#### Finalization Period +### Finalization Period The minimum amount of time (in seconds) that must elapse before a withdrawal can be finalized, sometimes called **withdrawal delay**. The finalization period is necessary to afford sufficient time for validators to make a fault proof. -#### L1 Attributes Deposited Transaction +### L1 Attributes Deposited Transaction A [deposited transaction](#deposited-transaction) that is used to register the L1 block attributes (number, timestamp, ...) on L2 via a call to the [L1 Attributes Predeployed Contract](#l1-attributes-predeployed-contract). That contract can then be used to read the attributes of the L1 block corresponding to the current L2 block. -#### L1 Attributes Predeployed Contract +### L1 Attributes Predeployed Contract A [predeployed contract](#predeployed-contract) on L2 that can be used to retrieve the L1 block attributes of L1 blocks with a given block number or a given block hash. -#### L2 Chain Derivation +### L2 Chain Derivation The process that reads [L2 derivation inputs](#l2-derivation-inputs) from L1 in order to derive the L2 chain. -#### L2 Chain Inception +### L2 Chain Inception L1 block number at which the output roots for the [genesis block](#l2-genesis-block) were proposed on the [output oracle](#l2-output-oracle-contract) contract. In the current implementation, this is the L1 block number at which the output oracle contract was deployed or upgraded. -#### L2 Derivation Inputs +### L2 Derivation Inputs Data that is found in L1 blocks and is read by the [rollup node](#rollup-node) to construct [payload attributes](#payload-attributes). L2 derivation inputs include: L1 block attributes (block number, timestamp, basefee), deposits (as log data), sequencer batches (as transaction data), and system configuration updates (as log data). -#### Payload Attributes +### Payload Attributes Object that can be derived from [L2 chain derivation inputs](#l2-derivation-inputs) found on L1, which are then passed to the [execution engine](#execution-engine) to construct L2 blocks. The payload attributes object essentially encodes a [block](#block) without output properties. -#### Relayer +### Relayer EOA on L1 which finalizes a withdrawal by submitting the data necessary to verify its inclusion on L2. -#### Safe L2 Block +### Safe L2 Block L2 block that can be derived entirely from L1 by a [rollup node](#rollup-node). This can vary between different nodes, based on their view of the L1 chain. -#### Safe L2 Head +### Safe L2 Head Highest [safe L2 block](#safe-l2-block) that a [rollup node](#rollup-node) knows about. -#### Sequencer Batch +### Sequencer Batch List of L2 transactions (that were submitted to a sequencer) tagged with an [epoch number](#sequencing-epoch) and an L2 block timestamp (which can trivially be converted to a block number, given our @@ -476,48 +476,48 @@ block time is constant). Sequencer batches are part of the [L2 derivation inputs **one** L2 block (given the existing L2 chain state) — except for the first block of each epoch, which also needs information about deposits (cf. the section on [L2 derivation inputs](#l2-derivation-inputs)). -#### System Configuration +### System Configuration Collection of dynamically configurable rollup parameters maintained by the [`SystemConfig`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/L1/SystemConfig.sol) contract on L1 and read by the L2 [derivation](#l2-chain-derivation) process. These parameters enable keys to be rotated regularly and external cost parameters to be adjusted without the network upgrade overhead of a hardfork. -#### Unsafe L2 Block +### Unsafe L2 Block L2 block that a [rollup node](#rollup-node) knows about, but which was not derived from the L1 chain. In sequencer mode, this will be a block sequenced by the sequencer itself. In validator mode, this will be a block acquired from the sequencer via [unsafe sync](#unsafe-sync). -#### Unsafe L2 Head +### Unsafe L2 Head Highest [unsafe L2 block](#unsafe-l2-block) that a [rollup node](#rollup-node) knows about. -#### Unsafe Block Consolidation +### Unsafe Block Consolidation Process through which the [rollup node](#rollup-node) attempts to move the [safe L2 head](#safe-l2-head) a block forward, so that the oldest [unsafe L2 block](#unsafe-l2-block) becomes the new safe L2 head. In order to perform consolidation, the node verifies that the [payload attributes](#payload-attributes) derived from the L1 chain match the oldest unsafe L2 block exactly. -#### Unsafe Sync +### Unsafe Sync Process through which a [validator](#validator) learns about [unsafe L2 blocks](#unsafe-l2-block) from the [sequencer](#sequencer). These unsafe blocks will later need to be confirmed by the L1 chain (via [unsafe block consolidation](#unsafe-block-consolidation)). -#### User-Deposited Transaction +### User-Deposited Transaction Deposited transaction which is derived from an L1 call to the deposit contract and [depositing call](#depositing-call); explicitly excludes [L1 attributes deposited transactions](#l1-attributes-depositedtransaction). -#### Withdrawal transaction +### Withdrawal transaction Sent from L2 to L1 that may transfer data and/or value; these "transactions" exist at multiple levels (see withdrawal initiating transaction and withdrawal finalizing transaction for details). -#### Withdrawal initiating transaction +### Withdrawal initiating transaction A specific transaction on L2 sent to the Withdrawals predeploy. -#### Withdrawal finalizing transaction +### Withdrawal finalizing transaction A specific L1 transaction which finalizes and relays the withdrawal. diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 0c8ed183d..cba93d183 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -44,7 +44,7 @@ Transactions must specify a maximum base fee higher than the block base fee to b The actual fee charged is the block base fee, even if the transaction specifies a higher maximum base fee. The OP Mainnet base fee behaves exactly like the Ethereum base fee with a few small parameter changes to account for the much shorter block times on OP Mainnet. -None of these parameters should significantly impact your application, but you can read more about each of these parameters on the [OP Mainnet differences](/chain/differences#eip-1559) page. +None of these parameters should significantly impact your application, but you can read more about each of these parameters on the [OP Mainnet differences](/stack/differences#eip-1559-parameters) page. Read more about the base fee in the [Ethereum.org documentation](https://ethereum.org/en/developers/docs/gas/#base-fee). ### Priority fee From c61aa87ccf4f311c596cc04182aff738028f0190 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 14 Jan 2025 16:49:17 +0100 Subject: [PATCH 26/75] Complete Lychee config --- pages/builders/chain-operators/features/custom-gas-token.mdx | 2 +- pages/chain/identity/about-attestations.mdx | 1 - pages/chain/identity/projects.mdx | 2 +- pages/stack/differences.mdx | 2 +- pages/stack/interop/supersim.mdx | 2 +- pages/stack/rollup/outages.mdx | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pages/builders/chain-operators/features/custom-gas-token.mdx b/pages/builders/chain-operators/features/custom-gas-token.mdx index b62405f19..59064c2ee 100644 --- a/pages/builders/chain-operators/features/custom-gas-token.mdx +++ b/pages/builders/chain-operators/features/custom-gas-token.mdx @@ -48,7 +48,7 @@ An OP Stack chain that uses the custom gas token feature enables an end user to * The [`v2.0.0-beta.3` release](https://github.com/ethereum-optimism/optimism/tree/op-contracts/v2.0.0-beta.3) -enables fee withdrawals to L1 and L2. For more details on these values, see the [Withdrawal Network](/builders/chain-operators/configuration/rollup.mdx#withdrawal-network) +enables fee withdrawals to L1 and L2. For more details on these values, see the [Withdrawal Network](/builders/chain-operators/configuration/rollup#withdrawal-network) section of the docs. * Deploy the L1 contracts from `contracts-bedrock` using the following command: diff --git a/pages/chain/identity/about-attestations.mdx b/pages/chain/identity/about-attestations.mdx index 4c2bdfbba..65f4fc8b3 100644 --- a/pages/chain/identity/about-attestations.mdx +++ b/pages/chain/identity/about-attestations.mdx @@ -33,7 +33,6 @@ Attestations create log entries that become part of the permanent record of the Here are some best practices to avoid violating users' privacy: * Obtain explicit consent from users for [personal information](https://csrc.nist.gov/glossary/term/PII), which includes a user's legal name and birthdate. - Clearly [inform users](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/personal-information-what-is-it/what-is-personal-information-a-guide/) what data is being collected, why it is being collected, and how it will be used. * Sensitive data should not be stored onchain, in any way. If you need a smart contract to verify it in the future, you can use the hash of the sensitive data rather than the data itself. * Even when storing sensitive data offchain, you need to ensure it is stored securely using encryption, proper authentication and authorization, etc. diff --git a/pages/chain/identity/projects.mdx b/pages/chain/identity/projects.mdx index 98ae2a849..08272ea3b 100644 --- a/pages/chain/identity/projects.mdx +++ b/pages/chain/identity/projects.mdx @@ -22,4 +22,4 @@ All other project metadata is stored or referenced in the [Project Metadata Atte ## Further reading -For more information about identity in the Optimism Collective, see the [Identity Overview](/chain/identity/overview.mdx). +For more information about identity in the Optimism Collective, see the [Identity Overview](/chain/identity/overview). diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 5f370f4b0..ceb510744 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -81,7 +81,7 @@ The Sequencer executes transactions from the mempool in priority fee order (high ## Chain Finality -Unlike L1s such as Ethereum, OP Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). +Unlike L1s such as Ethereum, OP Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/connect/resources/glossary#unsafe-l2-block). ## What's Next diff --git a/pages/stack/interop/supersim.mdx b/pages/stack/interop/supersim.mdx index 5bc896d51..674485a66 100644 --- a/pages/stack/interop/supersim.mdx +++ b/pages/stack/interop/supersim.mdx @@ -57,5 +57,5 @@ This diagram illustrates how developers interact with Supersim through the CLI, ## Next steps * Check out the dedicated [Supersim docs](https://Supersim.pages.dev/) for tutorials and specific use cases. -* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/interop/explainer.mdx#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/rollup/outages.mdx b/pages/stack/rollup/outages.mdx index 4f20970e9..70faa381c 100644 --- a/pages/stack/rollup/outages.mdx +++ b/pages/stack/rollup/outages.mdx @@ -83,7 +83,7 @@ As a security measure, transactions sent via the `OptimismPortal` are indistingu Transactions triggered via the `OptimismPortal` contract will appear to have been sent by the L1 address that triggered the transaction **unless** the transaction was sent by a smart contract. L2 transactions sent by smart contracts via the `OptimismPortal` contract will appear to have been sent by an "aliased" version of the smart contract's address. -Refer to the [address aliasing](/chain/differences#address-aliasing) explainer for more information about address aliasing. +Refer to the [address aliasing](/stack/differences#address-aliasing) explainer for more information about address aliasing. ### Inclusion rules From eea9d4d29c61f294186d6eab13ac7e7c4c47c4b8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 14 Jan 2025 16:56:12 +0100 Subject: [PATCH 27/75] Update pages/connect/resources/glossary.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/connect/resources/glossary.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/connect/resources/glossary.mdx b/pages/connect/resources/glossary.mdx index e854e770b..88262b47c 100644 --- a/pages/connect/resources/glossary.mdx +++ b/pages/connect/resources/glossary.mdx @@ -470,7 +470,7 @@ Highest [safe L2 block](#safe-l2-block) that a [rollup node](#rollup-node) knows ### Sequencer Batch -List of L2 transactions (that were submitted to a sequencer) tagged with an [epoch +A list of L2 transactions (that were submitted to a sequencer) tagged with an [epoch number](#sequencing-epoch) and an L2 block timestamp (which can trivially be converted to a block number, given our block time is constant). Sequencer batches are part of the [L2 derivation inputs](#l2-derivation-inputs). Each batch represents the inputs needed to build **one** L2 block (given the existing L2 chain state) — except for the first block of each epoch, which also needs From 1dd7b8b1c12764d372518cfb6d6b31b8e60cccc4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 14 Jan 2025 17:14:18 +0100 Subject: [PATCH 28/75] fix lint issues --- pages/builders/tools/build/oracles.mdx | 3 +-- pages/chain/identity/schemas.mdx | 2 +- words.txt | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pages/builders/tools/build/oracles.mdx b/pages/builders/tools/build/oracles.mdx index 8b45115e0..d9802c4a6 100644 --- a/pages/builders/tools/build/oracles.mdx +++ b/pages/builders/tools/build/oracles.mdx @@ -60,13 +60,12 @@ The L1 gas price, which can be volatile, is only pushed once every 5 minutes, an * [Blocknative](https://docs.blocknative.com/gas-prediction) provides real-time gas estimation powered by predictive modeling to forecast gas price distribution for select OP Stack chains, including OP Mainnet and Base. The [API](https://docs.blocknative.com/gas-prediction) is also available on Ethereum Mainnet to estimate base fee costs. - ### API3 The [API3 Market](https://market.api3.org/optimism) provides access to 200+ price feeds on [Optimism Mainnet](https://market.api3.org/optimism) and [Testnet](https://market.api3.org/optimism-sepolia-testnet). The price feeds operate as a native push oracle and can be activated instantly via the Market UI. The price feeds are delivered by an aggregate of [first-party oracles](https://docs.api3.org/oev-searchers/glossary.html#first-party-oracles) using signed data and support [OEV recapture](). -https://docs.api3.org/dapps/integration/security-considerations.html#oracle-extractable-value-oev +[https://docs.api3.org/dapps/integration/security-considerations.html#oracle-extractable-value-oev](https://docs.api3.org/dapps/integration/security-considerations.html#oracle-extractable-value-oev) Unlike traditional data feeds, reading [API3 price feeds](https://docs.api3.org/oev-searchers/in-depth/dapis/#dapis) enables dApps to auction off the right to update the price feeds to searcher bots which facilitates more efficient liquidation processes for users and LPs of DeFi money markets. The OEV recaptured is returned to the dApp. API3's QRNG provides dApps with truly random numbers based on quantum mechanics at no charge. More details [here](https://api3.org/) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 4e5d2ea8c..a44565c54 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -39,7 +39,7 @@ Used to associate metadata to an organization. Re-issued each time there is a ch | farcasterID | The Farcaster id of the individual who published the organization metadata | | name | The name of the organization | | projects | The array of projects that belong to this organization | -| parentOrgUID | The attestation UID of this organization's parent, in case it has one | +| parentOrgUID | The attestation UID of this organization's parent, in case it has one | | metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | | metadataUrl | The storage location where the metadata can be retrieved | diff --git a/words.txt b/words.txt index 61eb8abc2..19f670b5c 100644 --- a/words.txt +++ b/words.txt @@ -249,7 +249,6 @@ Openfort oplabs opnode's opstack -Opti Pausability pausable pcscdpath @@ -271,7 +270,6 @@ pprof Precommitments precommitments preconfigured -Predeploy predeploy Predeployed predeployed From 13fbb3f143bf929af4938cf17c4a7c7bb14c8aab Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 14 Jan 2025 17:44:46 +0100 Subject: [PATCH 29/75] resolve comments --- pages/builders/chain-operators/architecture.mdx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 0d27af0b6..c51beba9e 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -45,6 +45,14 @@ its view of the world from `op-geth`. for verifiers. To reduce the cost of writing to the L1, it only posts the minimal amount of data required to reproduce L2 blocks. +### op-batcher + +`op-deployer` is a tool that simplifies the process of deploying standardized OP Stack chains that comply with Superchain specifications. +It compares the state of your chain against the intent, +and make whatever changes are necessary for them to match. In its current state, +it is intended to deploy new standard chains that utilize the Superchain wide contracts. + + ### op-proposer @@ -97,9 +105,7 @@ the batcher to handle block creation. To allow the Sequencer to focus on that jo you can peer replica nodes to handle the rest of the work. An example of this would be to configure [proxyd](https://github.com/ethereum-optimism/infra/tree/main/proxyd) -to route RPC methods, retry failed requests, load balance, etc. Users sending -`eth_sendRawTransaction` requests can have their requests forwarded directly to the -Sequencer. All other RPC requests can be forwarded to replica nodes. +to route RPC methods, retry failed requests, load balance, etc. Configuration recommendations: @@ -111,8 +117,6 @@ GETH_TXPOOL_NOLOCALS: "true" GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs ``` -Ingress Traffic Diagram - ## Bootnodes Bootnodes facilitate peer discovery for network nodes. They help initialize peer connections for both public and private nodes in the network. From 18e6f9936b847f1279460c794a7f16b12a21d4bb Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 14 Jan 2025 17:50:43 +0100 Subject: [PATCH 30/75] fix lint issues --- pages/chain/identity/schemas.mdx | 2 +- words.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 4e5d2ea8c..a44565c54 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -39,7 +39,7 @@ Used to associate metadata to an organization. Re-issued each time there is a ch | farcasterID | The Farcaster id of the individual who published the organization metadata | | name | The name of the organization | | projects | The array of projects that belong to this organization | -| parentOrgUID | The attestation UID of this organization's parent, in case it has one | +| parentOrgUID | The attestation UID of this organization's parent, in case it has one | | metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | | metadataUrl | The storage location where the metadata can be retrieved | diff --git a/words.txt b/words.txt index c2683e014..92f79e7e6 100644 --- a/words.txt +++ b/words.txt @@ -42,7 +42,6 @@ BLOOMFILTER bloomfilter BLTZ Bootcamp -Bootnode bootnode BOOTNODES Bootnodes @@ -274,7 +273,6 @@ pprof Precommitments precommitments preconfigured -Predeploy predeploy Predeployed predeployed @@ -351,6 +349,8 @@ SLTIU SLTU smartcard snapshotlog +Snapsync +snapsync Soneium soulbound soyboy From eecd7d73d7c29acf7df82642a53ba58c1934e9b9 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 11:45:20 -0600 Subject: [PATCH 31/75] Redirects --- next.config.mjs | 14 ++- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/architecture.mdx | 144 --------------------------- 3 files changed, 14 insertions(+), 146 deletions(-) delete mode 100644 pages/stack/interop/architecture.mdx diff --git a/next.config.mjs b/next.config.mjs index 9f1975d6c..87c4fc034 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -9,7 +9,7 @@ const withNextra = nextra({ remarkPlugins: [ remarkCodeImport, ] - } + }, }) export default { @@ -17,4 +17,16 @@ export default { eslint: { ignoreDuringBuilds: true, }, + redirects: async () => [ + { + source: '/stack/interop/architecture', + destination: '/stack/interop/explainer#interoperability-architecture', + permanent: false, + }, + { + source: '/stack/interop/cross-chain-message', + destination: '/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other', + permanent: false, + }, + ], } diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 4a9c17bac..47dd45d5f 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -7,4 +7,4 @@ "op-supervisor": "OP Supervisor", "assets": "Assets", "security": "Cross-chain security" -} \ No newline at end of file +} diff --git a/pages/stack/interop/architecture.mdx b/pages/stack/interop/architecture.mdx deleted file mode 100644 index e0bbaba4b..000000000 --- a/pages/stack/interop/architecture.mdx +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: Interoperability architecture -lang: en-US -description: How it works. ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -import { InteropCallout } from '@/components/WipCallout' - - - -# Interoperability architecture - -An OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks. Interoperability among OP Stack chains is enabled via a new service called -[*OP Supervisor*](/stack/interop/op-supervisor). Every node operator is expected to run this service in addition to the [rollup node](/builders/node-operators/architecture#rollup-node) and [execution client](/builders/node-operators/architecture#execution-client). - -```mermaid - -graph LR - - classDef chain fill:#FFE - classDef transparent fill:none, stroke:none - - subgraph chain1[OP Stack chain #1] - node1[OP Node] - super1[OP-Supervisor] - geth1[Execution Engine] - node1<-->super1<-->geth1<-->node1 - end - subgraph X[ ] - chain2[OP Stack chain #2] - chain3[OP Stack chain #3] - l1node[L1 Consensus Layer] - end - - chain2-->|log events|super1 - chain3-->|log events|super1 - l1node-->|block status|super1 - - class chain1,chain2,chain3 chain - class X transparent -``` - -OP-Supervisor holds a database of all the log events of all the chains in the interoperability cluster. -Every event can potentially initiate a cross-domain message, and it's the job of OP-Supervisor to validate that the log event really happened on the source chain. -Additionally, OP-Supervisor reads information from L1's consensus layer to determine the transaction safety of L2 blocks. - -## How messages get from one chain to the other - -To understand *why* we need this additional service, it is useful to know how interop messages get from one blockchain to another. - -```mermaid - -sequenceDiagram - participant app as Application - participant src as Source Chain - box rgba(0,0,0,0.1) Destination Chain - participant dst-sup as OP-Supervisor - participant dst-geth as Execution Engine - end - app->>src: Transaction - src->>dst-sup: Log Event - note over src,dst-sup: Log Event = Initializing Message - app->>dst-geth: Transaction - dst-geth->>dst-geth: Call to CrossL2Inbox to execute or verify a message. - dst-geth->>dst-sup: Did you receive this initiating message? - dst-sup->>dst-geth: Yes - note left of dst-geth: Call is successful - dst-geth->>dst-geth: CrossL2Inbox emits ExecutingMessage. - note over dst-geth: Executing Message -``` - -Cross-domain messages require two transactions. -The first transaction creates an *initiating message* on the source chain. -The second transaction creates an *executing message* on the destination chain. -This executing message could result in a contract function being executed on the destination chain. - -The initiating message is simply a log event. -Any log event on any chain that inteoperates with the destination can initiate a cross-domain message. - -The transaction that receives the message on the destination chain calls a contract called [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox). -This call can be at the top level, directly from the externally owned account, or come through a smart contract. -The call to `CrossL2Inbox`, also known as the *executing message*, needs to [identify the initiating message uniquely](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L35-L42), using the chain ID of the source chain, the block number, and the index of the log event within that block, as well as a few other fields as a sanity check. - -`CrossL2Inbox` can either [validate the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185), or [call a contract if the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185). - -[For more information, see the cross-chain messages anatomy page](./cross-chain-message). - -## Safety levels - -```mermaid - -flowchart LR - classDef finalized fill:#CCC - classDef safe fill:#8F8 - classDef unsafe fill:#F89 - subgraph I[Blocks with Initiating Messages] - style I fill:none - subgraph A[Chain A] - A0[Block n] - A1[Block n+100] - A2[Block n+105] - class A0 finalized - class A1 safe - class A2 unsafe - end - subgraph B[Chain B] - B0[Block m] - B1[Block m+3] - class B0,B1 safe - end - end - subgraph C[Chain C] - C0[Block with executing messages] - class C0 unsafe - end - A0 --> C0 - A1 --> C0 - A2 --> C0 - B0 --> C0 - B1 --> C0 -``` - -Interop expands the scope of trust for unsafe blocks, blocks that are shared through [the gossip protocol](/builders/chain-operators/architecture#sequencer). -To trust that an unsafe block is valid and is going to become safe and then finalized, you need to trust not only the sequencer that produces it, but also all the other sequencers that produce other blocks that are still unsafe, but that include initiating messages that are executed in that block. - -However, this is only for *unsafe* blocks, and only if the sequencer allows messages from unsafe blocks to be processed. -A block is only considered promotable to *safe*, and therefore ready to be written to L1, when all the blocks on which it depends are safe. - -For example, in the image below, most blocks are safe. -Block `n` in chain `A` is even finalized, and immune from reorgs. -However, block `n+105` in chain `A` is unsafe, it (or a block on which it depends) is not written to L1. -Because the new block depends upon it, it is also unsafe. - -## Next steps - -* Want to learn more? - Read our guide on the anatomy of a [cross-chain message](./cross-chain-message) or check out this - [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](./supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* For more info about how OP Stack interoperability works under the hood, - [check out the specs](https://specs.optimism.io/interop/overview.html). From b59d359fb27fd10d25dbead4d39ec39a0f8fc1a1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 14 Jan 2025 18:45:44 +0100 Subject: [PATCH 32/75] update HTTP status codes --- lychee.toml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lychee.toml b/lychee.toml index 9c8c225bb..d012db1b1 100644 --- a/lychee.toml +++ b/lychee.toml @@ -4,7 +4,7 @@ verbose = "error" # Don't show interactive progress bar while checking links. no_progress = true # Don't show the source file of links -no_show_source = true +no_show_source = false ############################# Requests ############################ # URL remapping rules. @@ -41,11 +41,9 @@ exclude = [ '\.(pdf|zip|png|jpg|jpeg|gif|svg|json)$' ] -# Accept all status codes except 404 +# Accept all status codes accept = [ - "100..=399", - "401..=403", - "405..=999" + "200..=299", ] # Use compact format for cleaner output From c27466ffecb9ca3f70c0d47cac0b3a35df2c5702 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 16:26:21 -0600 Subject: [PATCH 33/75] Move tools to their own directory --- next.config.mjs | 10 ++++++++++ pages/stack/interop/_meta.json | 5 ++--- pages/stack/interop/tools/_meta.json | 4 ++++ pages/stack/interop/{ => tools}/devnet.mdx | 7 +++++-- pages/stack/interop/{ => tools}/supersim.mdx | 0 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 pages/stack/interop/tools/_meta.json rename pages/stack/interop/{ => tools}/devnet.mdx (97%) rename pages/stack/interop/{ => tools}/supersim.mdx (100%) diff --git a/next.config.mjs b/next.config.mjs index 87c4fc034..f2bbcff44 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -28,5 +28,15 @@ export default { destination: '/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other', permanent: false, }, + { + source: '/stack/interop/supersim', + destination: '/stack/interop/tools/supersim', + permanent: false, + }, + { + source: '/stack/interop/devnet', + destination: '/stack/interop/tools/devnet', + permanent: false, + }, ], } diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 47dd45d5f..79b57c20b 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,10 +1,9 @@ { "explainer": "Interop explainer", "predeploy": "Interop predeploys", - "devnet": "Interop devnet", - "supersim": "Supersim Multichain Development Environment", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", "assets": "Assets", - "security": "Cross-chain security" + "security": "Cross-chain security", + "tools": "Tools" } diff --git a/pages/stack/interop/tools/_meta.json b/pages/stack/interop/tools/_meta.json new file mode 100644 index 000000000..5006c7465 --- /dev/null +++ b/pages/stack/interop/tools/_meta.json @@ -0,0 +1,4 @@ +{ + "supersim": "Supersim Multichain Development Environment", + "devnet": "Interop devnet - coming soon" +} diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/tools/devnet.mdx similarity index 97% rename from pages/stack/interop/devnet.mdx rename to pages/stack/interop/tools/devnet.mdx index 3edbca365..17c19a74b 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -1,17 +1,18 @@ --- -title: Interop devnet +title: Interop Devnet - Coming Soon lang: en-US description: Details on the public interoperability devnets. --- import { Callout, Tabs, Steps } from 'nextra/components' -# Interop devnet +# Interop Devnet - Coming Soon Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. +{/* The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. NOTE: The current Interop devnet has been deprecated. This page will be updated once the next Interop devnet is live. @@ -63,3 +64,5 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated * Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * Read about [interop message passing](/stack/interop/cross-chain-message) to see how you can implement it yourself on this devnet. + +*/} diff --git a/pages/stack/interop/supersim.mdx b/pages/stack/interop/tools/supersim.mdx similarity index 100% rename from pages/stack/interop/supersim.mdx rename to pages/stack/interop/tools/supersim.mdx From 4fd96f804aed5097d1ba7c34eb7c8f36c917c7d3 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 16:46:06 -0600 Subject: [PATCH 34/75] moved redirects --- next.config.mjs | 25 +++---------------------- public/_redirects | 6 +++++- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index f2bbcff44..cccf4b58d 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -17,26 +17,7 @@ export default { eslint: { ignoreDuringBuilds: true, }, - redirects: async () => [ - { - source: '/stack/interop/architecture', - destination: '/stack/interop/explainer#interoperability-architecture', - permanent: false, - }, - { - source: '/stack/interop/cross-chain-message', - destination: '/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other', - permanent: false, - }, - { - source: '/stack/interop/supersim', - destination: '/stack/interop/tools/supersim', - permanent: false, - }, - { - source: '/stack/interop/devnet', - destination: '/stack/interop/tools/devnet', - permanent: false, - }, - ], + + // Don't put redirects here + // they go in public/_redirects } diff --git a/public/_redirects b/public/_redirects index 753e33de4..8c3d7557f 100644 --- a/public/_redirects +++ b/public/_redirects @@ -117,4 +117,8 @@ /stack/interop/transfer-superchainERC20 /stack/interop/assets/transfer-superchainERC20 /builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 /builders/chain-operators/tutorials/sdk /builders/app-developers/overview -/stack/explainer /superchain/superchain-explainer \ No newline at end of file +/stack/explainer /superchain/superchain-explainer +/stack/interop/architecture /stack/interop/explainer#interoperability-architecture +/stack/interop/cross-chain-message /stack/interop/explainer#how-messages-get-from-one-chain-to-the-other +/stack/interop/supersim /stack/interop/tools/supersim +/stack/interop/devnet /stack/interop/tools/devnet From 82a99b5a51e0f706e8cd60bddfaaf90718052859 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 14 Jan 2025 16:53:36 -0600 Subject: [PATCH 35/75] fixed redirects --- pages/builders/app-developers/tools/supersim.mdx | 2 +- public/_redirects | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index 57a0d8e40..b08c29d10 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -6,6 +6,6 @@ description: >- information and resources about supersim. --- -import Supersim from '@/pages/stack/interop/supersim.mdx' +import Supersim from '@/pages/stack/interop/tools/supersim.mdx' diff --git a/public/_redirects b/public/_redirects index 8c3d7557f..2beb892c7 100644 --- a/public/_redirects +++ b/public/_redirects @@ -86,7 +86,7 @@ /stack/protocol/fault-proofs/fp-components /stack/fault-proofs/fp-components /stack/protocol/fault-proofs/explainer /stack/fault-proofs/explainer /stack/protocol/fault-proofs/cannon /stack/fault-proofs/cannon -/stack/protocol/interop/supersim /stack/interop/supersim +/stack/protocol/interop/supersim /stack/interop/tools/supersim /stack/protocol/interop/superchain-erc20 /stack/interop/superchain-erc20 /stack/protocol/interop/explainer /stack/interop/explainer /stack/protocol/interop/cross-chain-message /stack/interop/cross-chain-message @@ -120,5 +120,3 @@ /stack/explainer /superchain/superchain-explainer /stack/interop/architecture /stack/interop/explainer#interoperability-architecture /stack/interop/cross-chain-message /stack/interop/explainer#how-messages-get-from-one-chain-to-the-other -/stack/interop/supersim /stack/interop/tools/supersim -/stack/interop/devnet /stack/interop/tools/devnet From 0072bcea685721220a85dfdb5fe025ddfcc69693 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 15 Jan 2025 14:23:36 +0100 Subject: [PATCH 36/75] updated lychee config --- lychee.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lychee.toml b/lychee.toml index d012db1b1..0ad13b998 100644 --- a/lychee.toml +++ b/lychee.toml @@ -41,9 +41,11 @@ exclude = [ '\.(pdf|zip|png|jpg|jpeg|gif|svg|json)$' ] -# Accept all status codes +# Accept all status codes except 404 accept = [ - "200..=299", + "100..=399", + "401..=403", + "405..=999" ] # Use compact format for cleaner output From b18cf994a3f4ac074b936443167cab9c2ac05cc1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 15 Jan 2025 16:24:47 +0100 Subject: [PATCH 37/75] Add redirections for redirects --- public/_redirects | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/public/_redirects b/public/_redirects index eb5db867a..1062ad0ed 100644 --- a/public/_redirects +++ b/public/_redirects @@ -118,4 +118,12 @@ /builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 /builders/chain-operators/tutorials/sdk /builders/app-developers/overview /stack/explainer /superchain/superchain-explainer -/chain/identity/contracts-eas /stack/smart-contracts#eas-ethereum-attestation-service \ No newline at end of file +/chain/identity/contracts-eas /stack/smart-contracts#eas-ethereum-attestation-service +/chain/identity/about-attestations https://community.optimism.io/identity/about-attestations +/chain/identity/applications https://community.optimism.io/identity/applications +/chain/identity/contracts-eas https://community.optimism.io/identity/contracts-eas +/chain/identity/individuals https://community.optimism.io/identity/individuals +/chain/identity/organizations https://community.optimism.io/identity/organizations +/chain/identity/overview https://community.optimism.io/identity/overview +/chain/identity/projects https://community.optimism.io/identity/projects +/chain/identity/schemas https://community.optimism.io/identity/schemas From 2cc8f9c533a0351780f121b17d569d2d5b907b3e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 15 Jan 2025 16:34:48 +0100 Subject: [PATCH 38/75] Remove identity files --- pages/chain/identity.mdx | 29 --- pages/chain/identity/_meta.json | 9 - pages/chain/identity/about-attestations.mdx | 63 ------ pages/chain/identity/applications.mdx | 23 -- pages/chain/identity/contracts-eas.mdx | 40 ---- pages/chain/identity/individuals.mdx | 30 --- pages/chain/identity/organizations.mdx | 15 -- pages/chain/identity/overview.mdx | 47 ---- pages/chain/identity/projects.mdx | 25 --- pages/chain/identity/schemas.mdx | 236 -------------------- 10 files changed, 517 deletions(-) delete mode 100644 pages/chain/identity.mdx delete mode 100644 pages/chain/identity/_meta.json delete mode 100644 pages/chain/identity/about-attestations.mdx delete mode 100644 pages/chain/identity/applications.mdx delete mode 100644 pages/chain/identity/contracts-eas.mdx delete mode 100644 pages/chain/identity/individuals.mdx delete mode 100644 pages/chain/identity/organizations.mdx delete mode 100644 pages/chain/identity/overview.mdx delete mode 100644 pages/chain/identity/projects.mdx delete mode 100644 pages/chain/identity/schemas.mdx diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx deleted file mode 100644 index 87c4b79e5..000000000 --- a/pages/chain/identity.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Identity -description: This guide explains the role of decentralized identity in the Optimism Collective and its key components. -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Identity - -This guide explains the role of decentralized identity in the Optimism Collective and its key components. - - - - - - - - - - - - - - - - - - diff --git a/pages/chain/identity/_meta.json b/pages/chain/identity/_meta.json deleted file mode 100644 index 8fb1817c3..000000000 --- a/pages/chain/identity/_meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "overview": "Overview", - "about-attestations": "About attestations", - "contracts-eas": "Contracts (EAS)", - "schemas": "Schemas", - "applications": "Apps", - "organizations": "Organization", - "projects": "Projects" -} \ No newline at end of file diff --git a/pages/chain/identity/about-attestations.mdx b/pages/chain/identity/about-attestations.mdx deleted file mode 100644 index 4c2bdfbba..000000000 --- a/pages/chain/identity/about-attestations.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: About attestations -lang: en-US -description: Learn about building decentralized identity apps using Ethereum Attestation Service. ---- - -import { Callout } from 'nextra/components' - -# Build decentralized identity apps with attestations - -This guide explains how to build decentralized identity apps using attestations. -It will define attestations and review the benefits of using Ethereum Attestation Service for Optimism developers. - -## About attestations - -Attestations are signed statements about a person, entity, or thing, made by an individual, company, or organization and are one of the building blocks of decentralized identity. - -Our journey towards decentralized identity begins with the [Ethereum Attestation Service](https://optimism.easscan.org), a set of smart contracts for creating, verifying, and revoking on/off-chain attestations. -You can think of Ethereum Attestation Service as a multiplayer database for streamlining the attestation process and enabling a robust web of trust on any OP Chain in the Superchain. - -![attestation logo.](/img/op-mainnet/identity/atst-logo.png) - -## Benefits of using Ethereum attestation service - -EAS makes it easy to sign any piece of data. In addition, here are a few key benefits: - -* **Permissionless**: The AttestationStation is a public contract, which means that it is not owned or controlled by any one person or organization. Anyone can use the contract to verify and attest anything. -* **Tooling:** Indexing, various access-management integrations, and more are already available for the AttestationStation. - -## Privacy - -Attestations create log entries that become part of the permanent record of the blockchain. -Here are some best practices to avoid violating users' privacy: - -* Obtain explicit consent from users for [personal information](https://csrc.nist.gov/glossary/term/PII), which includes a user's legal name and birthdate. - Clearly [inform users](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/personal-information-what-is-it/what-is-personal-information-a-guide/) what data is being collected, why it is being collected, and how it will be used. -* Sensitive data should not be stored onchain, in any way. - If you need a smart contract to verify it in the future, you can use the hash of the sensitive data rather than the data itself. -* Even when storing sensitive data offchain, you need to ensure it is stored securely using encryption, proper authentication and authorization, etc. - - - You are encouraged to consult a lawyer or other professional advisors if you are uncertain about your obligations. - Global data privacy laws are complex and multifaceted, and the violations of user privacy can have meaningful compliance as well as practical implications. - - -## Common questions - -**Q: Are attestations replacements for verifiable credentials?** - -**A:** Attestations should not be viewed as a replacement for verifiable credentials or decentralized identifiers. Rather developers can use attestations to create [decentralized identifiers](https://www.w3.org/TR/did-core/), credentials, claims, and more. - -**Q: Are attestations replacements for proof of personhood?** - -**A:** Attestations and the associated web of trust are complementary with proof of personhood like [WorldID](https://worldcoin.org/blog/announcements/worldcoin-commits-optimism-superchain-vision-ahead-mainnet-launch) and similar solutions. Without proof of personhood, agents could sybil-attack the web of trust to build their reputation. On the other hand, web of trust extends proof of personhood to confer more information about the person you're interacting with which is critical in governance and other use-cases that require knowledge of the person's reputation. - -**Q: Why attestations instead of soulbound / non-transferable tokens?** - -**A:** Attestations have two key benefits over soulbound / non-transferable tokens: flexibility of whether the attestations is onchain or offchain and composability. While there is a canonical [decentralized schema registry for attestations](https://optimism.easscan.org/schemas), there is no central registry or specification for soulbound / non-transferable tokens which can lead to poor interoperability between systems and protocols. - -## Next steps - -Are you inspired and don't know what to build? We have a [project idea list](https://github.com/ethereum-optimism/ecosystem-contributions). -Do you have a good idea, but you know you're not the right person to build it? Please open a PR on that list and suggest it. diff --git a/pages/chain/identity/applications.mdx b/pages/chain/identity/applications.mdx deleted file mode 100644 index 7375f3a4b..000000000 --- a/pages/chain/identity/applications.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Attestation Apps -lang: en-US -description: Learn some of the applications that use attestations. ---- - -# Attestation apps - -This guide lists some of the applications that use attestations. - -## Ethereum attestation service - -These are some of the applications that use the attestations: - -* [EAS Scan](https://optimism.easscan.org/): This no-code interface lets you build schemas, query, and submit attestations. -* [Citizen Attestations](https://citizen-attestations.xyz/): An attestation explorer for Optimism focusing on attestations that are relevant for the OP Citizens eligibility process. -* [Attest Fest](https://attest-fest.party/): Create multiple EAS attestations using the power of CSV and Safe multisig wallets. It's an attest fest, yay! -* [Optimist Profile](https://app.optimism.io/retropgf-signup): The Optimist Profile allows contributors to share the contributions and impact they've made to the Optimism Collective. -* [Ethereum Ecosystem onchain reviews](https://www.ethereum-ecosystem.com/new-review): The goal of this Attestation-Based Dapp Rating web app is to allow anyone to review dApps and tools 100% onchain. - -## Building with attestations - -Are you building with attestations? Feel free to add your app to this page using the [attestation GitHub issue template](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=documentation%2Cattestation%2Ccommunity-request\&projects=\&template=suggest_attestation.yaml\&title=%5BATT%5D+Add+PR+title). diff --git a/pages/chain/identity/contracts-eas.mdx b/pages/chain/identity/contracts-eas.mdx deleted file mode 100644 index 9c6498d4d..000000000 --- a/pages/chain/identity/contracts-eas.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Contracts (EAS) -lang: en-US -description: Learn the basics of contracts for EAS, EAS contract addresses, and how to read and write attestations. ---- - -# EAS contracts - -This guide covers [Ethereum Attestation Service ("EAS")](https://attest.sh/), an open-source public good that is included as a predeploy in the OP Stack. -It also covers EAS contract addresses, how to read and write attestations, and indexing. - -## EAS contract addresses - -The [Ethereum Attestation Service](https://docs.attest.sh/docs/welcome) is deployed on these addresses: - -| Network | Attestation Contract | Schema Registry Contract | -| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| OP Sepolia | [0x4200000000000000000000000000000000000021](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000020) | -| OP Mainnet | [0x4200000000000000000000000000000000000021](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000020) | - -## How to read and write attestations - -You can read and write attestations in several ways: - -* [EAS scan user interface (OP Mainnet)](https://optimism.easscan.org/) -* [EAS scan user interface (OP Sepolia)](https://optimism-sepolia.easscan.org/) -* [JavaScript SDK](https://docs.attest.sh/docs/developer-tools/eas-sdk) -* [Access directly onchain](https://github.com/ethereum-attestation-service/eas-contracts/blob/master/contracts/EAS.sol) (if you need to attest from a smart contract) - -## Indexing - -Indexing is available via: - -* [GraphQL endpoint](https://docs.attest.sh/docs/developer-tools/api) -* [Ponder graph](https://github.com/ethereum-attestation-service/eas-ponder-graph) -* [Open source indexer](https://github.com/ethereum-attestation-service/eas-indexing-service) - -## Next steps - -For more information on working with attestations, see [Build Decentralized Identity Apps with Attestations](about-attestations). diff --git a/pages/chain/identity/individuals.mdx b/pages/chain/identity/individuals.mdx deleted file mode 100644 index b7b234e86..000000000 --- a/pages/chain/identity/individuals.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Individual identity -lang: en-US -description: Learn about how individual identity is represented in the Optimism Collective. ---- - -## Individual identity - -The Optimism Collective represents individuals using unique identifiers generated through the [Farcaster protocol id registry](https://docs.farcaster.xyz/reference/contracts/reference/id-registry). This system ensures a secure approach to identity management within the collective. - -### Registering a user ID - -To obtain a unique identifier: - -1. Use the **[Farcaster Id Gateway](https://docs.farcaster.xyz/reference/contracts/reference/id-gateway)** -2. Use the Warpcast app, which: - -* Creates a new custody address -* Acts as a wallet - -### Making attestations - -When you make attestations about individuals: - -* Leave the recipient address blank -* Enter the users id into the attestation metadata - -### Further reading - -For more details on individual identity in the Optimism Collective, refer to **[the governance docs](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/#building-a-digital-identity)** on building a digital identity. diff --git a/pages/chain/identity/organizations.mdx b/pages/chain/identity/organizations.mdx deleted file mode 100644 index 558e73de0..000000000 --- a/pages/chain/identity/organizations.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Organizations -lang: en-US -description: Learn about the organization entity within the Optimism Collective's identity stack. ---- - -## Organizations - -Within the Optimism Collective, the organization entity is used to represent teams, squads, DAOs and other organizations that may work on multiple projects. Organizations can apply to Retroactive Public Goods Funding (Retro Funding) with specific [projects](https://docs.optimism.io/chain/identity/projects), never with just the organization. This is because projects represent contributions that created impact in the Collective, and Retro Rounds award OP to past impact. - -The organization entity is represented onchain by an attestation. The attestation UID is the organization's unique identifier for its lifecycle in the Collective. To create a new organization, an attestation is issued using [this schema](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0). The only metadata included in the schema is the Farcaster Id of the person who created the organization, and the entity type (in this case "organization"). - -All other organization metadata is stored or referenced in the [Organization Metadata Attestation](https://optimism.easscan.org/schema/view/0xc2b376d1a140287b1fa1519747baae1317cf37e0d27289b86f85aa7cebfd649f). The Organization Metadata Attestation is re-issued anytime there is a change in metadata. Apps displaying organization metadata should look to the most recent attestation for the up-to-date metadata. - -See the [attestation schemas page](https://docs.optimism.io/chain/identity/schemas) for more details on the schemas and their metadata. diff --git a/pages/chain/identity/overview.mdx b/pages/chain/identity/overview.mdx deleted file mode 100644 index efa96fd28..000000000 --- a/pages/chain/identity/overview.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Identity overview -lang: en-US -description: Learn about the basics of decentralized identity solutions. ---- - -import { Callout } from 'nextra/components' - -# Introduction - -This guide explains the role of decentralized identity in the Optimism Collective and its key components. - - -## Identity in the Optimism Collective - -Decentralized identity solutions empower individuals to customize their identity according to their preferences, move it seamlessly across services, and regain control of their personal information from centralized platforms. These solutions are designed to enable users to prove specific attributes about themselves in a trustworthy and verifiable way, without compromising their privacy or security. - -The Optimism Collective is [building a better economic engine that fuels positive-sum games](https://www.optimism.io/vision). Decentralized identity is central to that mission. For example, the two-house governance system of the Optimism Collective consists of: - -1. Token holders, who vote by delegating their OP tokens to delegates. -2. Community members who participate in a one-person-one-vote system based on reputation and community contributions. - -Decentralized identity expands the design space for innovation. It aims to give individuals greater control over their finances and easier participation in the global economy on their own terms. - -For more information about identity in the Optimism Collective, see [the governance docs post on the identity stack](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/). - -## Key components of identity - -There are three important components to identity within the Optimism Collective: - -1. [Individuals](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/#people-and-projects) -2. [Projects](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/#people) -3. [Attestations](https://community.optimism.io/docs/identity/attestations-best-practices/) - -Individuals and projects are the relevant entities in the Optimism Collective about which statements might be made. Attestations are the way in which these statements are made. - - - Decentralized identity not only supports democratic governance but also enhances innovation and individual financial control within the Optimism Collective ecosystem. - - -## Next steps - -To learn more about identity in the Optimism Collective: - -* Explore the [governance docs on project and individual identity](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/) -* Read about [attestation best practices](https://community.optimism.io/docs/identity/attestations-best-practices/) -* Understand how [identity contributes to the Optimism vision](https://www.optimism.io/vision) diff --git a/pages/chain/identity/projects.mdx b/pages/chain/identity/projects.mdx deleted file mode 100644 index 98ae2a849..000000000 --- a/pages/chain/identity/projects.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Projects -lang: en-US -description: Learn about the project entity within the Optimism Collective's identity stack. ---- - -## Projects - -Within the Optimism Collective, [the project entity](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/#people) represents contributions to the Optimism Collective and can be used to apply for Retroactive Public Goods Funding (Retro Funding). -## Project Representation - -The project entity is represented onchain by an attestation from the [following schema](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0). Projects are identified by the type "project". The attestation UID serves as the project's unique identifier throughout its lifecycle in the Collective. - -## Project metadata - -All other project metadata is stored or referenced in the [Project Metadata Attestation](https://optimism.easscan.org/schema/view/0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac). - -### Updating metadata - -* The Project Metadata Attestation is re-issued whenever there's a change in metadata. -* Apps displaying project metadata should refer to the most recent attestation for up-to-date information. - -## Further reading - -For more information about identity in the Optimism Collective, see the [Identity Overview](/chain/identity/overview.mdx). diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx deleted file mode 100644 index 4e5d2ea8c..000000000 --- a/pages/chain/identity/schemas.mdx +++ /dev/null @@ -1,236 +0,0 @@ ---- -title: Schemas -lang: en-US -description: Learn about schema structures and the type of data that can be included in attestations. ---- - -# Schemas - -Schemas define the structure and type of data that can be included in an attestation. - -Below you will find a list of relevant schemas that are being used on OP Mainnet. Schemas are built using the [Ethereum Attestation Service](https://docs.attest.sh/docs/welcome). - -## General schemas - -* **[Gitcoin Passport V1 scores schema UID](https://optimism.easscan.org/schema/view/0x6ab5d34260fca0cfcf0e76e96d439cace6aa7c3c019d7c4580ed52c6845e9c89):** `0x6ab5d34260fca0cfcf0e76e96d439cace6aa7c3c019d7c4580ed52c6845e9c89` -* **[Superchain Faucet schema UID](https://optimism.easscan.org/schema/view/0x98ef220cd2f94de79fbc343ef982bfa8f5b315dec6a08f413680ecb7085624d7)**: `0x98ef220cd2f94de79fbc343ef982bfa8f5b315dec6a08f413680ecb7085624d7` - -## Schemas related to project creation and Retro funding application - -### [Project and organization identifier](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0) - -Used as the unique identifier for projects and organizations created on or after 23 August 2024. For projects created earlier, please see the archived section at the bottom of this page. - -| Schema UID | `0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0` | -| ----------- | --------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| farcasterID | The Farcaster id of the individual who created the project or organization | -| type | "Project" or "Organization" | - -### [Organization metadata](https://optimism.easscan.org/schema/view/0xc2b376d1a140287b1fa1519747baae1317cf37e0d27289b86f85aa7cebfd649f) - -Used to associate metadata to an organization. Re-issued each time there is a change to metadata - -| Schema UID | `0xc2b376d1a140287b1fa1519747baae1317cf37e0d27289b86f85aa7cebfd649f` | -| ------------ | --------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| Recipient | Null | -| RefUID | The attestation UID of the organization this metadata relates to | -| farcasterID | The Farcaster id of the individual who published the organization metadata | -| name | The name of the organization | -| projects | The array of projects that belong to this organization | -| parentOrgUID | The attestation UID of this organization's parent, in case it has one | -| metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | -| metadataUrl | The storage location where the metadata can be retrieved | - -### [Project metadata](https://optimism.easscan.org/schema/view/0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac) - -Used to associate metadata to a project. Re-issued each time there is a change to metadata. - -| Schema UID | `0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac` | -| -------------------- | --------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| Recipient | Null | -| projectRefUID | The attestation UID of the project this metadata relates to | -| farcasterID | The Farcaster id of the individual who published the project metadata | -| name | The name of the project | -| category | The category of the project | -| parentProject RefUID | The attestation UID of this project's parent project, in case it has a parent | -| metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | -| metadataUrl | The storage location where the metadata can be retrieved | - -### [Retro funding application](https://optimism.easscan.org/schema/view/0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80) - -Used to identify a project's application to a specific Retro Funding Round. This attestation is used for Retro Funding Round 6 and beyond. - -| Schema UID | `0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80` | -| ----------------------- | ---------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by: `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| Recipient | Null | -| round | The round number for which this application was submitted | -| metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | -| metadataUrl | The storage location where the metadata can be retrieved | -| farcasterID | The individual that submitted this application on behalf of the project. | -| metadataSnapshot RefUID | The project metadata at the time the application was submitted. | - -### [Retro funding application approval/rejection](https://optimism.easscan.org/schema/view/0x683b1b399d47aabed79c9aa8f2674729021174b6e5cce1e20675eab404fc82d6) - -Used to identify which Retro Funding applications have been approved or rejected. - -| Schema UID | `0x683b1b399d47aabed79c9aa8f2674729021174b6e5cce1e20675eab404fc82d6` | -| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from the following address: `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` | -| Recipient | Null | -| projectApplicationUID | The unique identifier of the projects Retro Funding application. | -| Status | The status of the Retro Funding application. | -| Reason | Identifier for the reason an application was rejected. 1 = "Duplicate Application", 2 = "Deceiving Badgeholders", 3 = "Spam", 4 = "Not meeting eligibility criteria" | - -### [Retro funding rewards](https://optimism.easscan.org/schema/view/0x670ad6e6ffb842d37e050ea6d3a5ab308195c6f584cf2121076067e0d8adde18) - -Used to identify the reward amount each approved project received in a Retro Funding round - -| Schema UID | `0x670ad6e6ffb842d37e050ea6d3a5ab308195c6f584cf2121076067e0d8adde18` | -| ------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one the following address: `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` | -| Recipient | Null | -| refUID | The UID of the Retro Funding application | -| projectRefUID | The unique identifier of the project | -| round | The retro round for which the project was rewarded | -| OPamount | The amount of OP awarded to the project | - -## Schemas related to token house grants - -### [Token house grant approved](https://optimism.easscan.org/schema/view/0x8aef6b9adab6252367588ad337f304da1c060cc3190f01d7b72c7e512b9bfb38) - -Issued by the Grants Council when a project is approved for a grant. Does not indicate that the grant has been completed. - -| Schema UID | `0x8aef6b9adab6252367588ad337f304da1c060cc3190f01d7b72c7e512b9bfb38` | -| ---------------- | --------------------------------------------------------------------------------- | -| Issuer | Currently issued by the Grants Council lead. | -| Recipient | The address where the tokens will be delivered once the grant has been completed. | -| refUID | Currently null | -| projectRefUID | The unique identifier of the project that was approved for the grant. | -| UserIncentivesOP | The OP amount approved for user incentives. | -| BuildersOP | The OP amount approved for the builder. | -| Season | The season (number) in which the grant was approved | -| Intent | The intent (number) to which the mission belongs | -| Mission | The name of the mission (in words) under which this grant was made. | -| Approval date | The date the grant was approved, in the following format MM/DD/YYYY | -| MetadataUrl | Currently null | - -## Schemas related to roles and contributions - -### [Citizens](https://optimism.easscan.org/schema/view/0xc35634c4ca8a54dce0a2af61a9a9a5a3067398cb3916b133238c4f6ba721bc8a) - -Citizen attestations were first issued in Season 6 and are used to represent Citizenship separately from the ability to vote in a specific Retro Round. The resolver contract checks that the issuer is the Foundation with following address `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` - -| Schema UID | `0xc35634c4ca8a54dce0a2af61a9a9a5a3067398cb3916b133238c4f6ba721bc8a` | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| FarcasterID | The Citizen's unique identifier | -| SelectionMethod | A Code representing the method through which the Citizen was selected. Codes beginning with the number 1 refer to various flavours of Web of Trust selection. | - -### [Retro funding voters](https://optimism.easscan.org/schema/view/0x41513aa7b99bfea09d389c74aacedaeb13c28fb748569e9e2400109cbe284ee5) - -These attestations are voting Badges issued for Retro Round 5 and beyond. They are different from the [previous schema](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) to include new fields like votingGroup, used to assign voters to sub-categories in the round. - -| Schema UID | `0x41513aa7b99bfea09d389c74aacedaeb13c28fb748569e9e2400109cbe284ee5` | -| --------------- | -------------------------------------------------------------------------- | -| FarcasterID | The voter's unique identifier | -| Round | The round number for which this voting Badge was valid | -| voterType | Guest or Citizen | -| votingGroup | Used to assign voters to subcategories in case the Round has subcategories | -| selectionMethod | The method in which this voter was selected | - -### [MetaGov contribution](https://optimism.easscan.org/schema/view/0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1) - -| Schema UID | `0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1` | -| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| Recipient | The address of the individual who made the contribution | -| refUID | The UID of the project, in case this contribution is represented as a project | -| FarcasterID | The id of the individual who made the contribution, if known | -| Impact | This field is not currently being used | -| Season | The season in which the contribution was made | -| Decision Module | The decision module to which the contribution relates | -| Contribution Type | The type of contribution | -| MetadataUrl | This field is not currently being used | - -### [Foundation mission request completed](https://optimism.easscan.org/schema/view/0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457) - -| Schema UID | `0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457` | -| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| projectRefUID | The UID of the project that represents the work completed as part of the Foundation Mission Request | -| OP Amount | The OP Amount that was awarded for the completion of this Mission Request | -| Season | The season in which this Mission Request was completed | - -### [Retro funding governance contribution](https://optimism.easscan.org/schema/view/0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3) - -| Schema UID | `0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3` | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| Recipient | The address of the individual who made the contribution | -| Rpgf\_round | The round number for which this contribution was made | -| RetroPGF\_Contribution | The type of contribution made | - -### [Governance contribution](https://optimism.easscan.org/schema/view/0xef874554718a2afc254b064e5ce9c58c9082fb9f770250499bf406fc112bd315) - -Issued to those who held governance roles in the Collective, such as Grants Council members. - -| Schema UID | `0xef874554718a2afc254b064e5ce9c58c9082fb9f770250499bf406fc112bd315` | -| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` | -| Recipient | The address of the individual who made the contribution | -| govSeason | The season the individual held the role | -| govRole | The role held by the individual | - -## Archived schemas - -These schemas are no longer being actively issued, but capture valuable historical data. - -### [Retro funding application](https://optimism.easscan.org/schema/view/0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32) - -Used to identify a project's application to a specific Retro Funding Round. This attestation was used for Retro Funding Rounds 4 and 5. - -| Schema UID | `0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32` | -| ----------------------- | ---------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by: `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| Recipient | Null | -| round | The round number for which this application was submitted | -| projectRefUID | The unique identifier of the project that submitted this application | -| farcasterID | The individual that submitted this application on behalf of the project. | -| metadataSnapshot RefUID | The project metadata at the time the application was submitted. | - -### [Retro funding badgeholders](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) - -These attestations are considered "voting Badges" and allow an individual to vote in any given iteration of Retro Funding. They were used up to and including Retro Round 4. - -| Schema UID | `0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b` | -| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` | -| Recipient | The Badgeholder's address | -| rpgfRound | The round number for which this voting Badge was valid | -| referredBy | In early rounds, new Badges were issued by referral. This field captures the address of the referrer, if there was one | -| referredMethod | If this voting Badge was issued by referral, this field captures the referral method | - -### [Project identifier](https://optimism.easscan.org/schema/view/0x7ae9f4adabd9214049df72f58eceffc48c4a69e920882f5b06a6c69a3157e5bd) - -Used as the unique identifier for projects created in the Collective before 23 August 2024. Attestations issued from this schema prior to 23 August 2024 are still used as the unique identifier for projects. New projects created after 23 August 2024 use the new entity identifier (see above). - -| Schema UID | `0x7ae9f4adabd9214049df72f58eceffc48c4a69e920882f5b06a6c69a3157e5bd` | -| ----------- | --------------------------------------------------------------------------------------------------------------- | -| Issuer | Attestations issued as part of Retro Funding sign up are issued by `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | -| Recipient | Null | -| farcasterID | The Farcaster id of the individual who created the project | - -* **[RetroPGF 3 Approved Application schema UID](https://optimism.easscan.org/schema/view/0xebbf697d5d3ca4b53579917ffc3597fb8d1a85b8c6ca10ec10039709903b9277):**`0xebbf697d5d3ca4b53579917ffc3597fb8d1a85b8c6ca10ec10039709903b9277`. Important: Remember to verify the attester address is `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` -* **[RetroPGF 3 Application schema UID](https://optimism.easscan.org/schema/view/0x76e98cce95f3ba992c2ee25cef25f756495147608a3da3aa2e5ca43109fe77cc):** `0x76e98cce95f3ba992c2ee25cef25f756495147608a3da3aa2e5ca43109fe77cc` -* **[RetroPGF 3 Lists schema UID](https://optimism.easscan.org/schema/view/0x3e3e2172aebb902cf7aa6e1820809c5b469af139e7a4265442b1c22b97c6b2a5):** `0x3e3e2172aebb902cf7aa6e1820809c5b469af139e7a4265442b1c22b97c6b2a5` -* **[Season 4 Co-grant participant schema UID](https://optimism.easscan.org/schema/view/0x401a80196f3805c57b00482ae2b575a9f270562b6b6de7711af9837f08fa0faf)**: `0x401a80196f3805c57b00482ae2b575a9f270562b6b6de7711af9837f08fa0faf`. Important: Remember to verify the attester address is `0x3C7820f2874b665AC7471f84f5cbd6E12871F4cC` or `0x2a0eB7cAE52B68e94FF6ab0bFcf0dF8EeEB624be` -* **[Optimist Profile schema UID](https://optimism.easscan.org/schema/view/0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929):** `​​0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929` - -## Next steps - -* For more information on working with attestations, see [Build Decentralized Identity Apps with Attestations](/chain/identity/about-attestations). -* To see a list of applications using EAS, see [Attestation Apps](/chain/identity/applications). From f50e27c3e45ce5a21d7ac4dca8dc34bcb126d314 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 15 Jan 2025 18:36:44 +0100 Subject: [PATCH 39/75] fix breadcrumbs --- pages/stack/interop.mdx | 5 +++ pages/stack/interop/explainer.mdx | 69 ++++++++++++++----------------- pages/stack/interop/predeploy.mdx | 20 ++++----- pages/stack/interop/security.mdx | 50 ++++++++++------------ words.txt | 15 ++----- 5 files changed, 73 insertions(+), 86 deletions(-) diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index c601fdb88..f867c5124 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -27,4 +27,9 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super + + + + + diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 4de32d7fd..2b9685b90 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -11,11 +11,11 @@ import { InteropCallout } from '@/components/WipCallout' -# Interoperability explainer +# Interoperability explainer ## Why do we need interoperability? -It is easy for a blockchain to be certain about information it generates itself. +It is easy for a blockchain to be certain about information it generates itself. Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). The next major scalability improvement to the OP Stack is to enable a network of chains to feel like a single blockchain. This goal requires low-latency, seamless message passing and asset bridging. @@ -23,15 +23,15 @@ This goal requires low-latency, seamless message passing and asset bridging. *Interoperability* is a set of protocols and services that lets OP Stack blockchains read each others' state. Interoperability provides the following benefits: -- 1-block latency asset movement, removing the problem of capital fragmentation leading to better capital efficiency. -- Improved experience for both users and developers. -- Secure transfer of assets, such as ETH and ERC-20 tokens, across L2s. -- Horizontal scalability for applications that need it. +* 1-block latency asset movement, removing the problem of capital fragmentation leading to better capital efficiency. +* Improved experience for both users and developers. +* Secure transfer of assets, such as ETH and ERC-20 tokens, across L2s. +* Horizontal scalability for applications that need it. ## Interoperability architecture A pre-interop OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks (e.g. op-geth). -Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). +Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). Every node operator is expected to run this service in addition to the [rollup node](/builders/node-operators/architecture#rollup-node) and [execution client](/builders/node-operators/architecture#execution-client). ```mermaid @@ -145,28 +145,26 @@ Interop expands the scope of trust for unsafe blocks (blocks that are shared thr If a sequencer chooses to accept unsafe messages, the sequencer must trust the sequencer that produces the inbound message as well as any referenced unsafe messages produced from sequencers in the transitive dependency set.
- -What is the transitive dependency set? - -The transitive dependency set of a blockchain is all the chains on which it depends, and all the chains that depend on them, and so on. -For example, in the illustration above, the dependency set of chain A is just chain B. -However, the *transitive* dependency set includes chain B, the chains that depend on it (C and D) and the chains that depend on them (E). -If there was a chain that depended on E, that chain would be part of the transitive dependency set too. - -```mermaid - -flowchart LR - A[Chain A] <--> B[Chain B] - B <--> C[Chain C] - B <--> D[Chain D] - D <--> E[Chain E] - F[Chain F] <--> G[Chain G] -``` - -For example, there could be a block in chain D that depends on an initiating message in chain E> -If the block with that initiating message is still unsafe (not written to L1), then the block in chain D is also usafe, even if it has been written to L1. -As a result, a block in chain B that depends on the chain D block can also be unsafe, as can a block in chain A that depends on the block in chain B. - + What is the transitive dependency set? + + The transitive dependency set of a blockchain is all the chains on which it depends, and all the chains that depend on them, and so on. + For example, in the illustration above, the dependency set of chain A is just chain B. + However, the *transitive* dependency set includes chain B, the chains that depend on it (C and D) and the chains that depend on them (E). + If there was a chain that depended on E, that chain would be part of the transitive dependency set too. + + ```mermaid + + flowchart LR + A[Chain A] <--> B[Chain B] + B <--> C[Chain C] + B <--> D[Chain D] + D <--> E[Chain E] + F[Chain F] <--> G[Chain G] + ``` + + For example, there could be a block in chain D that depends on an initiating message in chain E> + If the block with that initiating message is still unsafe (not written to L1), then the block in chain D is also usafe, even if it has been written to L1. + As a result, a block in chain B that depends on the chain D block can also be unsafe, as can a block in chain A that depends on the block in chain B.
Notably this trust assumption is only for *unsafe* blocks, and *only* if the sequencer allows messages from unsafe blocks to be processed. @@ -202,8 +200,8 @@ To move an asset from chain E to chain B, it is necessary to move the asset from ### Superchain interop cluster -The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. -In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. +The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. +In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This model provides the highest level of interoperability, as any blockchain can transact directly with any other. ```mermaid @@ -213,10 +211,8 @@ flowchart LR A <--> C <--> E <--> B <--> D <--> A ``` - Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. - {/* ## Interop assets @@ -229,8 +225,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte */} ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). - +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx index d89f3b4ee..672938171 100644 --- a/pages/stack/interop/predeploy.mdx +++ b/pages/stack/interop/predeploy.mdx @@ -13,7 +13,7 @@ import { InteropCallout } from '@/components/WipCallout' # Interoperability predeploys -The following predeploys have been added to enable interoperability. +The following predeploys have been added to enable interoperability. *Predeployed smart contracts* exist at predetermined addresses, coming from the genesis state. They're similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. @@ -22,9 +22,9 @@ They're similar to [precompiles](https://www.evm.codes/precompiled) but run dire The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. -- **Address:** `0x4200000000000000000000000000000000000022` -- **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) -- **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) +* **Address:** `0x4200000000000000000000000000000000000022` +* **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) +* **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) ## L2ToL2CrossDomainMessenger @@ -32,9 +32,9 @@ The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `Cr It's utilized for secure ERC20 token transfers between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding (the executing transaction can only be valid on a single chain). -- **Address:** `0x4200000000000000000000000000000000000023` -- **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) -- **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) +* **Address:** `0x4200000000000000000000000000000000000023` +* **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) +* **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) {/* ## OptimismSuperchainERC20Factory @@ -60,6 +60,6 @@ This contract is the `Beacon` part, which provides the implementation address fo The `SuperchainTokenBridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `OptimismSuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). -- **Address:** `0x4200000000000000000000000000000000000028` -- **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) -- **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) +* **Address:** `0x4200000000000000000000000000000000000028` +* **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) +* **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 7dec4e67a..a0b488677 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -18,37 +18,34 @@ import { InteropCallout } from '@/components/WipCallout' This interop vulnerability arises when an initiating message seems to exist, prompting the processing of the executing message. However, the initiating message ends up not actually appear in the canonical chain. Excluding L1 reorgs, this can happen in two ways: -- *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. - The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. - It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. +* *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. + The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. + The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. + It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. -- *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. - To save on resources, the sequencer can choose to query existing nodes of the source blockchain. - In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. +* *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. + To save on resources, the sequencer can choose to query existing nodes of the source blockchain. + In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. - In this case, invalid blocks will be replaced with deposit only blocks by other verifiers. + In this case, invalid blocks will be replaced with deposit only blocks by other verifiers.
+ What are deposit only blocks? - What are deposit only blocks? + Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. + However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. - Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. - However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. + The way this works is that there are two types of user transactions in an OP Stack block: - The way this works is that there are two types of user transactions in an OP Stack block: + * Sequencer transactions, which go through the sequencer. + These transactions are extremely cheap, but in theory a sequencer could censor them. + * Deposit transactions, which users submit through L1. + These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. - - Sequencer transactions, which go through the sequencer. - These transactions are extremely cheap, but in theory a sequencer could censor them. - - Deposit transactions, which users submit through L1. - These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. - - A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. - - For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list). + A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. + For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list).
- ## The latency/security tradeoff @@ -62,7 +59,7 @@ There are three different possibilities, at different levels of latency and secu ### Unsafe initiating messages L2 blocks start as unsafe, meaning that there's no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. -Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. +Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), for itself and the previous blocks in its blockchain are also written to L1. @@ -92,7 +89,7 @@ sequenceDiagram 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. -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). +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. Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. @@ -131,12 +128,9 @@ Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-s Safe and Unsafe Security Diagram - -Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. - + Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. - {/* ## What is stopping a sequencer from censoring a cross-chain message? There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. @@ -146,4 +140,4 @@ There is nothing stopping a sequencer from censoring a transaction when it is se ## What is stopping a shared sequencer from including just the executing message and not the initiating message? The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. -*/} \ No newline at end of file +*/} diff --git a/words.txt b/words.txt index 92f79e7e6..a76e42839 100644 --- a/words.txt +++ b/words.txt @@ -14,14 +14,10 @@ Ankr Apeworx Arweave authrpc -Badgeholder's -Badgeholders -badgeholders basefee BGEZ BGTZ Biconomy -birthdate BLEZ BLOBPOOL blobpool @@ -78,6 +74,7 @@ DATACAP datacap DATADIR datadir +dependecies Devnet devnet devnets @@ -111,7 +108,6 @@ exitwhensynced EXTRADATA extradata Farcaster -farcaster Faultproof FDLIMIT fdlimit @@ -158,6 +154,7 @@ Inator inator INFLUXDBV influxdbv +inteoperates interchain IPCDISABLE ipcdisable @@ -165,7 +162,6 @@ ipcfile IPCPATH ipcpath IPFS -ipfs JALR JOURNALREMOTES journalremotes @@ -264,7 +260,6 @@ Permissionless permissionless permissionlessly Perps -personhood Pimlico POAP POAPs @@ -328,8 +323,6 @@ RPCPREFIX rpcprefix rpcs RPGF -Rpgf -rpgf Runbooks runbooks RWAs @@ -352,7 +345,6 @@ snapshotlog Snapsync snapsync Soneium -soulbound soyboy spacebar Spearbit @@ -395,6 +387,7 @@ TXPOOL txpool txproxy txproxyd +uncensorable uncountered undercollateralize Unichain @@ -402,6 +395,7 @@ unmetered Unprotect unsubmitted UPNP +usafe VERKLE verkle VHOSTS @@ -414,7 +408,6 @@ vmdebug VMODULE vmodule voxel -Warpcast xlarge XORI xtensibility From 0d0b02a45b40c1ec5472da784aa23fae3ce02558 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:10:07 +0300 Subject: [PATCH 40/75] fix: Fix incorrect usage of "signup" Update WipCallout.tsx --- components/WipCallout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index ae3600044..aaa5b1c57 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -31,7 +31,7 @@ export function WipCallout({ context }: Props): ReactElement { href="https://github.com/ethereum-optimism/docs/issues" className="callout-link" > - signup to help us revise this page + sign up to help us revise this page
. We welcome your contribution! ❤️ From c6331fe2cb4f270b74c23bf058f7530c24ae451e Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:25:47 -0600 Subject: [PATCH 41/75] Small grammatical fixes to op-supervisor.mdx --- pages/stack/interop/op-supervisor.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 7afafb83b..3382811fe 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -33,7 +33,7 @@ OP Supervisor verifies messages between different chains in the OP Stack, reduci ## Log data indexing and management -OP Supervisor acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. Maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ +OP Supervisor acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. It maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ `op-supervisor` indexes two types of cross-chain dependencies: @@ -46,11 +46,11 @@ OP Supervisor provides an interface for `op-node` to query cross-chain safety in Key API methods include: -| Method | Description | +| Method(s) | Description | | ----------------------------------------- | ------------------------------------------------------------------------------------- | -| `UnsafeView` and `SafeView` | Returns 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` | Tells 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 | From 40c77e5b0efda4d0bc55f9259b9bea11d19ec4f4 Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:26:52 -0600 Subject: [PATCH 42/75] Rearrange link cards in assets.mdx to match the sequence of the navbar --- pages/stack/interop/assets.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/assets.mdx b/pages/stack/interop/assets.mdx index 4d287b5f9..87950ceb6 100644 --- a/pages/stack/interop/assets.mdx +++ b/pages/stack/interop/assets.mdx @@ -13,11 +13,11 @@ Documentation covering SuperchainERC20, Superchain WETH, Supersim, and how to tr - - + + From ff7c6b385d1cbef55359d54d071ec5ec28c51fb6 Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:11:19 -0600 Subject: [PATCH 43/75] Clarify PREVRANDAO description to specify pseudorandomness --- pages/stack/differences.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 5f370f4b0..0e5fb4120 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -27,7 +27,7 @@ Withdrawal transactions are how the state of the L2 rollup can be proven to the | Opcode | Solidity Equivalent | Behavior | | ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `COINBASE` | `block.coinbase` | Returns the address of the current Sequencer's fee wallet. Effectively the same as Ethereum with the caveat that the value typically does not change from block to block. | -| `PREVRANDAO` | `block.prevrandao` | Set **pseudorandomly** for each block by the Sequencer as opposed to the stronger guarantees provided by [RANDAO](https://eips.ethereum.org/EIPS/eip-4399) on Ethereum. | +| `PREVRANDAO` | `block.prevrandao` | Set **pseudorandomness** for each block by the Sequencer as opposed to the stronger guarantees provided by [RANDAO](https://eips.ethereum.org/EIPS/eip-4399) on Ethereum. | | `ORIGIN` | `tx.origin` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, then `tx.origin` is set to the [aliased address](#address-aliasing) of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally. | | `CALLER` | `msg.sender` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, and this is the first call frame (rather than an internal transaction from one contract to another), the same [address aliasing](#address-aliasing) behavior applies. | From a9ab3a7c9c63a5c8f49e0352a8b85ea6e250cc4d Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 20:00:50 -0600 Subject: [PATCH 44/75] Remove unnecessary character --- pages/stack/smart-contracts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index 07b18dd2b..6bf906f13 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -79,7 +79,7 @@ of 13 owners. This meets the 75% threshold requirement for a Stage 1 rollup outlined in [L2Beat's Stages framework](https://medium.com/l2beat/stages-update-security-council-requirements-4c79cea8ef52) 2. Reassigning the role of Guardian from the Foundation to a new Guardian Safe with the Security Council Safe as its sole owner. This moves the Superchain -closer to satisfying the 1 week exit window 5 requirement for Stage 1. +closer to satisfying the 1 week exit window requirement for Stage 1. * Additionally the Foundation is appointed to the new DeputyGuardian role which is able to act as Guardian through the Guardian Safe. This appointment can be revoked by the Security Council Safe at any time. From ce2e4a46b0257134102ae88ece148026cc7db7e6 Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 20:07:18 -0600 Subject: [PATCH 45/75] Remove unnecessary word --- pages/stack/smart-contracts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index 6bf906f13..ba91f376f 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -355,7 +355,7 @@ optionally halt if using the wrong version. #### SystemConfig -The `SystemConfig` contract is helps manage configuration of an OP Stack +The `SystemConfig` contract helps manage configuration of an OP Stack network. Much of the network's configuration is stored on L1 and picked up by L2 as part of the derivation of the L2 chain. The contract also contains references to all other contract addresses for the chain. From 6ad6a3ad25d75e650d9a4caf6a03cb2a0429a375 Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 20:13:02 -0600 Subject: [PATCH 46/75] Add missing words --- pages/stack/smart-contracts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index ba91f376f..d036fe68c 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -399,7 +399,7 @@ Architecture (ISA). #### PreimageOracle -The `PreimageOracle` contract for storing permissioned pre-images. +The `PreimageOracle` contract is used for storing permissioned pre-images. #### DEPRECATED - L2OutputOracle From 33979385b80210c908786a4215736cd5027194a0 Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:35:40 -0600 Subject: [PATCH 47/75] Remove unnecessary character --- pages/stack/differences.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 0e5fb4120..6976b0515 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -16,7 +16,7 @@ However, there are some minor differences between the behavior of Ethereum and O ### Bridging - Deposit Transactions -Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP Stack chain. You can read more on deposit transactions [here](/stack/transactions/deposit-flow). +Deposit transactions don't exist on L1s, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP Stack chain. You can read more on deposit transactions [here](/stack/transactions/deposit-flow). ### Bridging - Withdrawal Transactions and Fault Proofs From d732a536f3c10fcf9cdebdf1839a467d8c30371b Mon Sep 17 00:00:00 2001 From: David <165518730+Red-Pandaz@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:27:46 -0600 Subject: [PATCH 48/75] Add a more accurate definition of PREVRANDAO --- pages/stack/differences.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 6976b0515..62060359f 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -27,7 +27,7 @@ Withdrawal transactions are how the state of the L2 rollup can be proven to the | Opcode | Solidity Equivalent | Behavior | | ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `COINBASE` | `block.coinbase` | Returns the address of the current Sequencer's fee wallet. Effectively the same as Ethereum with the caveat that the value typically does not change from block to block. | -| `PREVRANDAO` | `block.prevrandao` | Set **pseudorandomness** for each block by the Sequencer as opposed to the stronger guarantees provided by [RANDAO](https://eips.ethereum.org/EIPS/eip-4399) on Ethereum. | +| `PREVRANDAO` | `block.prevrandao` | Returns the PREVRENDAO (the most recent [RANDAO](https://eips.ethereum.org/EIPS/eip-4399)) value of L1 at the current L1 origin block. | | `ORIGIN` | `tx.origin` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, then `tx.origin` is set to the [aliased address](#address-aliasing) of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally. | | `CALLER` | `msg.sender` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, and this is the first call frame (rather than an internal transaction from one contract to another), the same [address aliasing](#address-aliasing) behavior applies. | From 9c08b3e0cc7a11a286c2e986f38e747ad6fe1a13 Mon Sep 17 00:00:00 2001 From: hash1go Date: Thu, 16 Jan 2025 19:23:34 +0900 Subject: [PATCH 49/75] fix: correct section header from op-batcher to op-deployer --- pages/builders/chain-operators/architecture.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 327fbe1d3..bfbdd50d1 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -45,7 +45,7 @@ its view of the world from `op-geth`. for verifiers. To reduce the cost of writing to the L1, it only posts the minimal amount of data required to reproduce L2 blocks. -### op-batcher +### op-deployer `op-deployer` is a tool that simplifies the process of deploying standardized OP Stack chains that comply with Superchain specifications. It compares the state of your chain against the intent, From 67302d9dcbb289f3fd1d78c3b3506afafed6c945 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 11:33:36 +0100 Subject: [PATCH 50/75] Update words.txt Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- words.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/words.txt b/words.txt index a76e42839..6ea2c3d0a 100644 --- a/words.txt +++ b/words.txt @@ -395,7 +395,7 @@ unmetered Unprotect unsubmitted UPNP -usafe +unsafe VERKLE verkle VHOSTS From 252b4c924cae8ca2387a7c789c7229797f3e535e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 11:33:53 +0100 Subject: [PATCH 51/75] Update words.txt Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- words.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/words.txt b/words.txt index 6ea2c3d0a..ef9144cc5 100644 --- a/words.txt +++ b/words.txt @@ -74,7 +74,7 @@ DATACAP datacap DATADIR datadir -dependecies +dependencies Devnet devnet devnets From 24a28f2e1186137effc84295f0103f59c62cf4aa Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 14:44:36 +0100 Subject: [PATCH 52/75] Update words.txt Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- words.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/words.txt b/words.txt index ef9144cc5..2079624f2 100644 --- a/words.txt +++ b/words.txt @@ -154,7 +154,7 @@ Inator inator INFLUXDBV influxdbv -inteoperates +interoperates interchain IPCDISABLE ipcdisable From 2840df413b9292b8821bfffc07a36ef8bc7df983 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 14:45:16 +0100 Subject: [PATCH 53/75] updated word --- pages/stack/interop/explainer.mdx | 2 +- pages/stack/interop/security.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 2b9685b90..ead383e48 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -96,7 +96,7 @@ The second transaction creates an *executing message* on the destination chain. This executing message could result in a contract function being executed on the destination chain. The initiating message is simply a log event. -Any log event on any chain that inteoperates with the destination can initiate a cross-domain message. +Any log event on any chain that interoperates with the destination can initiate a cross-domain message. The transaction that receives the message on the destination chain calls a contract called [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox). This call can be at the top level, directly from the externally owned account, or come through a smart contract. diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index a0b488677..b6c7f819d 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 (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. From f11c6dd362f9b31a222132c8473e2c003900286e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 15:32:42 +0100 Subject: [PATCH 54/75] fix error in tutorial --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 4 ++-- public/tutorials/cross-dom-bridge-eth.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 4d5e6a95c..cae425c9c 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -167,7 +167,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Wait for the L1 transaction to be processed and log the receipt. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=0de1fe6dd17f753ab80d356b38d9ca41 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=bfe4a04887605d695e172961bbad3837 ``` {

Extract the L2 transaction hash

} @@ -188,7 +188,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=b7d72a54dcdbb9b89c6874e2862fde00 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=05887926cd297c83f77765c277f54ed5 ``` diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 82abb4d6e..8169e4900 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -49,7 +49,7 @@ const depositArgs = await publicClientL2.buildDepositTransaction({ const depositHash = await walletClientL1.depositTransaction(depositArgs); console.log(`Deposit transaction hash on L1: ${depositHash}`); -const depositReceipt = await publicClientL1.waitForTransactionReceipt({ depositHash }); +const depositReceipt = await publicClientL1.waitForTransactionReceipt({ hash: depositHash }); console.log('L1 transaction confirmed:', depositReceipt); const [l2Hash] = getL2TransactionHashes(depositReceipt); From 26618add94e8bd76f92db94a462652aa79c20ecb Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 15:39:55 +0100 Subject: [PATCH 55/75] updated contract --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index cae425c9c..35517e9c0 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -133,7 +133,7 @@ You can get some Sepolia ETH from [this faucet](https://sepoliafaucet.com). ## Deposit ETH -Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBridge` contract. You'll then receive the same number of ETH on L2 in return. +Now that you have some ETH on L1 you can deposit that ETH into the `OptimismPortalProxy` contract. You'll then receive the same number of ETH on L2 in return. From b02221f1571bf2d29b92d14dc14532cf97a609f1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 15:47:37 +0100 Subject: [PATCH 56/75] fix file import issues --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 35517e9c0..3cbe5253e 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -167,7 +167,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `OptimismPort Wait for the L1 transaction to be processed and log the receipt. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=bfe4a04887605d695e172961bbad3837 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=bccea143ce3571de154531c40e9a0d04 ``` {

Extract the L2 transaction hash

} @@ -188,7 +188,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `OptimismPort
- ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=05887926cd297c83f77765c277f54ed5 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=1198e2379e95a0e6c72c03692f10e9ee ```
From cc430a6333774e26edd1c5a775009a325912a79b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 16:47:37 +0100 Subject: [PATCH 57/75] fix breadcrumbs --- pages/stack/interop.mdx | 5 +++ pages/stack/interop/explainer.mdx | 69 ++++++++++++++----------------- pages/stack/interop/predeploy.mdx | 20 ++++----- pages/stack/interop/security.mdx | 50 ++++++++++------------ words.txt | 4 ++ 5 files changed, 73 insertions(+), 75 deletions(-) diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index c601fdb88..4e2ff4222 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -27,4 +27,9 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super + + + + + diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 4de32d7fd..2b9685b90 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -11,11 +11,11 @@ import { InteropCallout } from '@/components/WipCallout' -# Interoperability explainer +# Interoperability explainer ## Why do we need interoperability? -It is easy for a blockchain to be certain about information it generates itself. +It is easy for a blockchain to be certain about information it generates itself. Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). The next major scalability improvement to the OP Stack is to enable a network of chains to feel like a single blockchain. This goal requires low-latency, seamless message passing and asset bridging. @@ -23,15 +23,15 @@ This goal requires low-latency, seamless message passing and asset bridging. *Interoperability* is a set of protocols and services that lets OP Stack blockchains read each others' state. Interoperability provides the following benefits: -- 1-block latency asset movement, removing the problem of capital fragmentation leading to better capital efficiency. -- Improved experience for both users and developers. -- Secure transfer of assets, such as ETH and ERC-20 tokens, across L2s. -- Horizontal scalability for applications that need it. +* 1-block latency asset movement, removing the problem of capital fragmentation leading to better capital efficiency. +* Improved experience for both users and developers. +* Secure transfer of assets, such as ETH and ERC-20 tokens, across L2s. +* Horizontal scalability for applications that need it. ## Interoperability architecture A pre-interop OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks (e.g. op-geth). -Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). +Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). Every node operator is expected to run this service in addition to the [rollup node](/builders/node-operators/architecture#rollup-node) and [execution client](/builders/node-operators/architecture#execution-client). ```mermaid @@ -145,28 +145,26 @@ Interop expands the scope of trust for unsafe blocks (blocks that are shared thr If a sequencer chooses to accept unsafe messages, the sequencer must trust the sequencer that produces the inbound message as well as any referenced unsafe messages produced from sequencers in the transitive dependency set.
- -What is the transitive dependency set? - -The transitive dependency set of a blockchain is all the chains on which it depends, and all the chains that depend on them, and so on. -For example, in the illustration above, the dependency set of chain A is just chain B. -However, the *transitive* dependency set includes chain B, the chains that depend on it (C and D) and the chains that depend on them (E). -If there was a chain that depended on E, that chain would be part of the transitive dependency set too. - -```mermaid - -flowchart LR - A[Chain A] <--> B[Chain B] - B <--> C[Chain C] - B <--> D[Chain D] - D <--> E[Chain E] - F[Chain F] <--> G[Chain G] -``` - -For example, there could be a block in chain D that depends on an initiating message in chain E> -If the block with that initiating message is still unsafe (not written to L1), then the block in chain D is also usafe, even if it has been written to L1. -As a result, a block in chain B that depends on the chain D block can also be unsafe, as can a block in chain A that depends on the block in chain B. - + What is the transitive dependency set? + + The transitive dependency set of a blockchain is all the chains on which it depends, and all the chains that depend on them, and so on. + For example, in the illustration above, the dependency set of chain A is just chain B. + However, the *transitive* dependency set includes chain B, the chains that depend on it (C and D) and the chains that depend on them (E). + If there was a chain that depended on E, that chain would be part of the transitive dependency set too. + + ```mermaid + + flowchart LR + A[Chain A] <--> B[Chain B] + B <--> C[Chain C] + B <--> D[Chain D] + D <--> E[Chain E] + F[Chain F] <--> G[Chain G] + ``` + + For example, there could be a block in chain D that depends on an initiating message in chain E> + If the block with that initiating message is still unsafe (not written to L1), then the block in chain D is also usafe, even if it has been written to L1. + As a result, a block in chain B that depends on the chain D block can also be unsafe, as can a block in chain A that depends on the block in chain B.
Notably this trust assumption is only for *unsafe* blocks, and *only* if the sequencer allows messages from unsafe blocks to be processed. @@ -202,8 +200,8 @@ To move an asset from chain E to chain B, it is necessary to move the asset from ### Superchain interop cluster -The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. -In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. +The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. +In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This model provides the highest level of interoperability, as any blockchain can transact directly with any other. ```mermaid @@ -213,10 +211,8 @@ flowchart LR A <--> C <--> E <--> B <--> D <--> A ``` - Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. - {/* ## Interop assets @@ -229,8 +225,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte */} ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). - +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx index d89f3b4ee..672938171 100644 --- a/pages/stack/interop/predeploy.mdx +++ b/pages/stack/interop/predeploy.mdx @@ -13,7 +13,7 @@ import { InteropCallout } from '@/components/WipCallout' # Interoperability predeploys -The following predeploys have been added to enable interoperability. +The following predeploys have been added to enable interoperability. *Predeployed smart contracts* exist at predetermined addresses, coming from the genesis state. They're similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. @@ -22,9 +22,9 @@ They're similar to [precompiles](https://www.evm.codes/precompiled) but run dire The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. -- **Address:** `0x4200000000000000000000000000000000000022` -- **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) -- **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) +* **Address:** `0x4200000000000000000000000000000000000022` +* **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) +* **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) ## L2ToL2CrossDomainMessenger @@ -32,9 +32,9 @@ The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `Cr It's utilized for secure ERC20 token transfers between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding (the executing transaction can only be valid on a single chain). -- **Address:** `0x4200000000000000000000000000000000000023` -- **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) -- **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) +* **Address:** `0x4200000000000000000000000000000000000023` +* **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) +* **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) {/* ## OptimismSuperchainERC20Factory @@ -60,6 +60,6 @@ This contract is the `Beacon` part, which provides the implementation address fo The `SuperchainTokenBridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `OptimismSuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). -- **Address:** `0x4200000000000000000000000000000000000028` -- **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) -- **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) +* **Address:** `0x4200000000000000000000000000000000000028` +* **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) +* **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 7dec4e67a..a0b488677 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -18,37 +18,34 @@ import { InteropCallout } from '@/components/WipCallout' This interop vulnerability arises when an initiating message seems to exist, prompting the processing of the executing message. However, the initiating message ends up not actually appear in the canonical chain. Excluding L1 reorgs, this can happen in two ways: -- *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. - The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. - It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. +* *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. + The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. + The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. + It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. -- *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. - To save on resources, the sequencer can choose to query existing nodes of the source blockchain. - In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. +* *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. + To save on resources, the sequencer can choose to query existing nodes of the source blockchain. + In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. - In this case, invalid blocks will be replaced with deposit only blocks by other verifiers. + In this case, invalid blocks will be replaced with deposit only blocks by other verifiers.
+ What are deposit only blocks? - What are deposit only blocks? + Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. + However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. - Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. - However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. + The way this works is that there are two types of user transactions in an OP Stack block: - The way this works is that there are two types of user transactions in an OP Stack block: + * Sequencer transactions, which go through the sequencer. + These transactions are extremely cheap, but in theory a sequencer could censor them. + * Deposit transactions, which users submit through L1. + These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. - - Sequencer transactions, which go through the sequencer. - These transactions are extremely cheap, but in theory a sequencer could censor them. - - Deposit transactions, which users submit through L1. - These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. - - A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. - - For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list). + A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. + For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list).
- ## The latency/security tradeoff @@ -62,7 +59,7 @@ There are three different possibilities, at different levels of latency and secu ### Unsafe initiating messages L2 blocks start as unsafe, meaning that there's no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. -Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. +Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), for itself and the previous blocks in its blockchain are also written to L1. @@ -92,7 +89,7 @@ sequenceDiagram 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. -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). +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. Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. @@ -131,12 +128,9 @@ Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-s Safe and Unsafe Security Diagram - -Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. - + Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. - {/* ## What is stopping a sequencer from censoring a cross-chain message? There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. @@ -146,4 +140,4 @@ There is nothing stopping a sequencer from censoring a transaction when it is se ## What is stopping a shared sequencer from including just the executing message and not the initiating message? The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. -*/} \ No newline at end of file +*/} diff --git a/words.txt b/words.txt index 92f79e7e6..260236dfc 100644 --- a/words.txt +++ b/words.txt @@ -78,6 +78,7 @@ DATACAP datacap DATADIR datadir +dependencies Devnet devnet devnets @@ -158,6 +159,7 @@ Inator inator INFLUXDBV influxdbv +inteoperates interchain IPCDISABLE ipcdisable @@ -395,6 +397,7 @@ TXPOOL txpool txproxy txproxyd +uncensorable uncountered undercollateralize Unichain @@ -402,6 +405,7 @@ unmetered Unprotect unsubmitted UPNP +usafe VERKLE verkle VHOSTS From 3d36097aac3ecbb11dfac409c6023265a3cb8341 Mon Sep 17 00:00:00 2001 From: thusaras-vc <131273127+thusaras-vc@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:21:33 -0500 Subject: [PATCH 58/75] Fix beacon ignore env var --- .../builders/node-operators/configuration/consensus-config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/node-operators/configuration/consensus-config.mdx b/pages/builders/node-operators/configuration/consensus-config.mdx index cac398c3f..48246b162 100644 --- a/pages/builders/node-operators/configuration/consensus-config.mdx +++ b/pages/builders/node-operators/configuration/consensus-config.mdx @@ -86,7 +86,7 @@ When false, halts op-node startup if the healthcheck to the Beacon-node endpoint `--l1.beacon.ignore=` `--l1.beacon.ignore=false` - `OP_NODE_L1_BEACON=false` + `OP_NODE_L1_BEACON_IGNORE=false` ### l1.epoch-poll-interval From ca581a3711e3894447091a565944aabd7e10c2ff Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 19:30:03 +0100 Subject: [PATCH 59/75] remove identity nav link --- pages/chain/_meta.json | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/chain/_meta.json b/pages/chain/_meta.json index 6c45f77d2..cf2e338d0 100644 --- a/pages/chain/_meta.json +++ b/pages/chain/_meta.json @@ -3,7 +3,6 @@ "networks": "Networks and RPC Endpoints", "addresses": "Contract addresses", "tokenlist": "Bridged token addresses", - "identity": "Identity", "testing": "Testing", "security": "Security" } \ No newline at end of file From f3a14bdf16e7175098ad61ea0aee74a8b232020f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 19:34:53 +0100 Subject: [PATCH 60/75] fix lint issue --- pages/stack/interop/op-supervisor.mdx | 6 +++--- words.txt | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) 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 38dfbe8a5..23795ef2b 100644 --- a/words.txt +++ b/words.txt @@ -74,7 +74,6 @@ DATACAP datacap DATADIR datadir -dependencies Devnet devnet devnets @@ -154,7 +153,6 @@ Inator inator INFLUXDBV influxdbv -inteoperates interchain IPCDISABLE ipcdisable @@ -282,6 +280,7 @@ preinstalls Prestate prestate prestates +PREVRENDAO PRICEBUMP pricebump PRICELIMIT @@ -292,14 +291,12 @@ Protip Proxied Proxyd proxyd -pseudorandomly Pyth Pyth's QRNG Quicknode quicknode quickstarts -RANDAO rebalance Regenesis regenesis From 46689ddf6ac27a8095a5052017813766cda96778 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 20:19:27 +0100 Subject: [PATCH 61/75] fix redirect links --- public/_redirects | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/_redirects b/public/_redirects index 2beb892c7..53f42325d 100644 --- a/public/_redirects +++ b/public/_redirects @@ -120,3 +120,12 @@ /stack/explainer /superchain/superchain-explainer /stack/interop/architecture /stack/interop/explainer#interoperability-architecture /stack/interop/cross-chain-message /stack/interop/explainer#how-messages-get-from-one-chain-to-the-other +/chain/identity/contracts-eas /stack/smart-contracts#eas-ethereum-attestation-service +/chain/identity/about-attestations https://community.optimism.io/identity/about-attestations +/chain/identity/applications https://community.optimism.io/identity/applications +/chain/identity/contracts-eas https://community.optimism.io/identity/contracts-eas +/chain/identity/individuals https://community.optimism.io/identity/individuals +/chain/identity/organizations https://community.optimism.io/identity/organizations +/chain/identity/overview https://community.optimism.io/identity/overview +/chain/identity/projects https://community.optimism.io/identity/projects +/chain/identity/schemas https://community.optimism.io/identity/schemas From befdb5e219bd752ea252183fd453a5b3d85c5547 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Thu, 16 Jan 2025 14:36:47 -0600 Subject: [PATCH 62/75] Update next steps in explainer - Fix link to Supersim - Add link to predeploy --- pages/stack/interop/explainer.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index ead383e48..3dc143a2f 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -211,7 +211,7 @@ flowchart LR A <--> C <--> E <--> B <--> D <--> A ``` -Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. +Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](superchain/blockspace-charter), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. {/* ## Interop assets @@ -226,6 +226,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Watch this video that gives an [overview of OP Stack interoperability](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Learn more about the [predeploys that have been added to the OP Stack to enable interoperability](stack/interop/predeploy). +* Use [Supersim](stack/interop/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From 0aff2f680a7a919222aa1aa0c5c0b680a118ee12 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 21:44:38 +0100 Subject: [PATCH 63/75] Revert "Update next steps in explainer" --- pages/stack/interop/explainer.mdx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 3dc143a2f..ead383e48 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -211,7 +211,7 @@ flowchart LR A <--> C <--> E <--> B <--> D <--> A ``` -Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](superchain/blockspace-charter), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. +Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. {/* ## Interop assets @@ -226,7 +226,6 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte ## Next steps -* Watch this video that gives an [overview of OP Stack interoperability](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Learn more about the [predeploys that have been added to the OP Stack to enable interoperability](stack/interop/predeploy). -* Use [Supersim](stack/interop/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From baff61aa7eccc5f1286e8b623df13fa5276fc9af Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:35:47 +0100 Subject: [PATCH 64/75] fix broken links --- pages/stack/interop.mdx | 3 --- pages/stack/interop/explainer.mdx | 8 ++++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index 0fa84217b..176269c78 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -15,9 +15,6 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super - - - diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index ead383e48..5911e86df 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -104,7 +104,7 @@ The call to `CrossL2Inbox`, also known as the *executing message*, needs to [ide `CrossL2Inbox` can either [validate the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185), or [call a contract if the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185). -[For more information, see the cross-chain messages anatomy page](./cross-chain-message). +[For more information, see the cross-chain messages anatomy page](#how-messages-get-from-one-chain-to-the-other). ## Block safety levels @@ -211,7 +211,7 @@ flowchart LR A <--> C <--> E <--> B <--> D <--> A ``` -Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. +Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](/superchain/blockspace-charter), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. {/* ## Interop assets @@ -226,6 +226,6 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](#how-messages-get-from-one-chain-to-the-other) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [Supersim](/builders/app-developers/tools/supersim.mdx), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From ade1888adf5bc08feaa0b7668ccdab4fe600b306 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:49:31 +0100 Subject: [PATCH 65/75] fix breadcrumbs errors --- pages/stack/interop.mdx | 4 +++- pages/stack/interop/message-passing.mdx | 2 +- pages/stack/interop/op-supervisor.mdx | 2 +- pages/stack/interop/tools.mdx | 18 ++++++++++++++++++ pages/stack/interop/tools/_meta.json | 2 +- pages/stack/interop/tools/devnet.mdx | 6 +++--- 6 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 pages/stack/interop/tools.mdx diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index 176269c78..fbfffe6f7 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -13,7 +13,7 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super - + @@ -28,4 +28,6 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super + + diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index af661135b..8bcd46889 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -61,6 +61,6 @@ For a practical example, see our [cross-chain ping pong tutorial](https://supers ## Next steps -* Read about the [anatomy of a cross-chain message](/stack/interop/cross-chain-message) +* Read about the [anatomy of a cross-chain message](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) * Try [Supersim](supersim) for testing cross-chain messages locally * Learn about [manually relaying messages](https://supersim.pages.dev/guides/interop/viem?#viem-to-send-and-relay-interop-messages) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index b130e13ed..3defbd5e8 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -68,5 +68,5 @@ Benefits: ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](/stack/interop/cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/interop/tools.mdx b/pages/stack/interop/tools.mdx new file mode 100644 index 000000000..54f8f1e8d --- /dev/null +++ b/pages/stack/interop/tools.mdx @@ -0,0 +1,18 @@ +--- +title: Assets +description: Documentation covering Interop devnet, Supersim in the Interop section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Interop + +Documentation covering Interop devnet, Supersim in the Interop section of the OP Stack ecosystem. + + + + + + + diff --git a/pages/stack/interop/tools/_meta.json b/pages/stack/interop/tools/_meta.json index 5006c7465..d1cc958eb 100644 --- a/pages/stack/interop/tools/_meta.json +++ b/pages/stack/interop/tools/_meta.json @@ -1,4 +1,4 @@ { "supersim": "Supersim Multichain Development Environment", - "devnet": "Interop devnet - coming soon" + "devnet": "Interop devnet(Beta)" } diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index 17c19a74b..819beb27c 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -1,12 +1,12 @@ --- -title: Interop Devnet - Coming Soon +title: Interop devnet(Beta) lang: en-US description: Details on the public interoperability devnets. --- import { Callout, Tabs, Steps } from 'nextra/components' -# Interop Devnet - Coming Soon +# Interop devnet(Beta) Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. @@ -63,6 +63,6 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated ## Next steps * Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* Read about [interop message passing](/stack/interop/cross-chain-message) to see how you can implement it yourself on this devnet. +* Read about [interop message passing](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) to see how you can implement it yourself on this devnet. */} From d5864b1340f0da6bd0573840426693be8f61e5d1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:56:54 +0100 Subject: [PATCH 66/75] updated links --- pages/stack/interop/explainer.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 5911e86df..5020d0e0c 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -226,6 +226,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](#how-messages-get-from-one-chain-to-the-other) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](/builders/app-developers/tools/supersim.mdx), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Watch this video that gives an [overview of OP Stack interoperability](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Learn more about the [predeploys that have been added to the OP Stack to enable interoperability](/stack/interop/predeploy). +* Use [Supersim](/builders/app-developers/tools/supersim.mdx), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From e1555d1e2115569bc27fe99cd3c861034e80e7d6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:59:07 +0100 Subject: [PATCH 67/75] Update pages/stack/interop/tools/devnet.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/tools/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index 819beb27c..a136e468f 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -63,6 +63,6 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated ## Next steps * Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* Read about [interop message passing](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) to see how you can implement it yourself on this devnet. +* Read about [Interop message passing](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) to see how you can implement it yourself on this devnet. */} From 02577b12264c5c507eb00d6269e560ed500469ae Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:59:20 +0100 Subject: [PATCH 68/75] Update pages/stack/interop/tools/devnet.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/tools/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index a136e468f..715808992 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -6,7 +6,7 @@ description: Details on the public interoperability devnets. import { Callout, Tabs, Steps } from 'nextra/components' -# Interop devnet(Beta) +# Interop devnet (Beta) Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. From 96cdde946591ede1717873afe6d0aa2a27bfb6ce Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 22:59:33 +0100 Subject: [PATCH 69/75] Update pages/stack/interop/tools/devnet.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/tools/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index 715808992..a7f6ba083 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -1,5 +1,5 @@ --- -title: Interop devnet(Beta) +title: Interop Devnet (Beta) lang: en-US description: Details on the public interoperability devnets. --- From 789a1d214a46ec4e88bc8f7f0afc46159f826211 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 23:05:30 +0100 Subject: [PATCH 70/75] Used comming soon --- pages/stack/interop/tools.mdx | 2 +- pages/stack/interop/tools/_meta.json | 2 +- pages/stack/interop/tools/devnet.mdx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/tools.mdx b/pages/stack/interop/tools.mdx index 54f8f1e8d..38bfbb531 100644 --- a/pages/stack/interop/tools.mdx +++ b/pages/stack/interop/tools.mdx @@ -13,6 +13,6 @@ Documentation covering Interop devnet, Supersim in the Interop section of the OP - + diff --git a/pages/stack/interop/tools/_meta.json b/pages/stack/interop/tools/_meta.json index d1cc958eb..5006c7465 100644 --- a/pages/stack/interop/tools/_meta.json +++ b/pages/stack/interop/tools/_meta.json @@ -1,4 +1,4 @@ { "supersim": "Supersim Multichain Development Environment", - "devnet": "Interop devnet(Beta)" + "devnet": "Interop devnet - coming soon" } diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index a7f6ba083..fb9856a86 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -1,12 +1,12 @@ --- -title: Interop Devnet (Beta) +title: Interop Devnet (coming soon) lang: en-US description: Details on the public interoperability devnets. --- import { Callout, Tabs, Steps } from 'nextra/components' -# Interop devnet (Beta) +# Interop devnet (coming soon) Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. From c27aa8d3bb1368b14ca9c065e1888e828a7636f2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 23:23:57 +0100 Subject: [PATCH 71/75] fix links --- pages/stack/interop.mdx | 4 ++-- pages/stack/interop/explainer.mdx | 2 +- pages/stack/interop/tools/devnet.mdx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index fbfffe6f7..0e1dbef04 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -19,11 +19,11 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super - + - + diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 5020d0e0c..5ce1af8ed 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -228,5 +228,5 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte * Watch this video that gives an [overview of OP Stack interoperability](https://www.youtube.com/watch?v=FKc5RgjtGes). * Learn more about the [predeploys that have been added to the OP Stack to enable interoperability](/stack/interop/predeploy). -* Use [Supersim](/builders/app-developers/tools/supersim.mdx), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Use [Supersim](/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index fb9856a86..3a8056737 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -62,7 +62,7 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated ## Next steps -* Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Want to start with local development? Use [Supersim](/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * Read about [Interop message passing](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) to see how you can implement it yourself on this devnet. */} From b23af1ac7a9a21192f1e01d4d95ab35812dfe900 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 23:26:37 +0100 Subject: [PATCH 72/75] fix links again --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 5ce1af8ed..777f4d560 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -228,5 +228,5 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte * Watch this video that gives an [overview of OP Stack interoperability](https://www.youtube.com/watch?v=FKc5RgjtGes). * Learn more about the [predeploys that have been added to the OP Stack to enable interoperability](/stack/interop/predeploy). -* Use [Supersim](/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Use [Supersim](/stack/interop/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From bc811fbfc44efa9b8ab4b21f26194f6f3096d839 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 23:31:10 +0100 Subject: [PATCH 73/75] fixed yet another broken link --- pages/builders/chain-operators/architecture.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index bfbdd50d1..60f2d2528 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -160,11 +160,11 @@ In addition to the core protocol components, the following offchain services are ### op-conductor -The [op-conductor](/tools/op-conductor) RPC can act as a leader-aware rpc proxy for op-batcher (proxies the necessary op-geth / op-node RPC methods if the node is the leader). +The [op-conductor](/builders/chain-operators/tools/op-conductor) RPC can act as a leader-aware rpc proxy for op-batcher (proxies the necessary op-geth / op-node RPC methods if the node is the leader). ### op-challenger -The [op-challenger](/tools/op-challenger) verifies the correctness of the L2 state by challenging invalid state transitions. This ensures the network's security and validity. +The [op-challenger](/builders/chain-operators/tools/op-challenger) verifies the correctness of the L2 state by challenging invalid state transitions. This ensures the network's security and validity. ### Ethereum L1 nodes From 3ab33935494fb73d529ca29d30177b197d3a64dd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 16 Jan 2025 23:32:07 +0100 Subject: [PATCH 74/75] fix comments --- pages/stack/interop/tools/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/tools/devnet.mdx b/pages/stack/interop/tools/devnet.mdx index 3a8056737..c82960893 100644 --- a/pages/stack/interop/tools/devnet.mdx +++ b/pages/stack/interop/tools/devnet.mdx @@ -62,7 +62,7 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated ## Next steps -* Want to start with local development? Use [Supersim](/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Want to start with local development? Use [Supersim](/stack/interop/tools/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * Read about [Interop message passing](/stack/interop/explainer#how-messages-get-from-one-chain-to-the-other) to see how you can implement it yourself on this devnet. */} From 385f429118f5973aa6114fef764ec8cbacbbdef7 Mon Sep 17 00:00:00 2001 From: Maura Wilder <560657+squdgy@users.noreply.github.com> Date: Fri, 17 Jan 2025 11:33:41 -0500 Subject: [PATCH 75/75] merge cleanup --- lychee.toml | 2 - .../node-operators/management/snap-sync.mdx | 1 - .../tools/build/account-abstraction.mdx | 12 +- pages/chain/testing/dev-node.mdx | 3 +- pages/connect/contribute/docs-contribute.mdx | 2 - pages/stack/fault-proofs/challenger.mdx | 1 - pages/stack/getting-started.mdx | 2 - pages/stack/interop/predeploy.mdx | 65 -------- pages/stack/interop/security.mdx | 143 ------------------ pages/stack/interop/tools.mdx | 18 --- pages/stack/interop/tools/_meta.json | 4 - pages/stack/rollup/overview.mdx | 3 +- pages/stack/transactions/fees.mdx | 2 +- words.txt | 18 +-- 14 files changed, 9 insertions(+), 267 deletions(-) delete mode 100644 pages/stack/interop/predeploy.mdx delete mode 100644 pages/stack/interop/security.mdx delete mode 100644 pages/stack/interop/tools.mdx delete mode 100644 pages/stack/interop/tools/_meta.json diff --git a/lychee.toml b/lychee.toml index e5fdeca24..dfdd60f8d 100644 --- a/lychee.toml +++ b/lychee.toml @@ -19,8 +19,6 @@ remap = [ "file:///([^#%\\.]+)$ file:///./pages/$1.mdx", ] -# Base URL or website root directory to check relative URLs. -# base = "./pages" # Base URL or website root directory to check relative URLs base = "." diff --git a/pages/builders/node-operators/management/snap-sync.mdx b/pages/builders/node-operators/management/snap-sync.mdx index 68bf869c9..73dff898f 100644 --- a/pages/builders/node-operators/management/snap-sync.mdx +++ b/pages/builders/node-operators/management/snap-sync.mdx @@ -103,5 +103,4 @@ To enable execution layer sync for these clients, set the following flags on `op ## Next steps * See the [Node Configuration](/builders/node-operators/configuration/base-config#configuration) guide for additional explanation or customization. -* To enable snap sync for your chain, see [Using Snap Sync for Chain Operators](/builders/chain-operators/management/snap-sync). * If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 511044110..2e706ae7d 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -8,10 +8,6 @@ import { Callout } from 'nextra/components' # Account abstraction - - This page includes providers that meet specific [inclusion criteria](#inclusion-criteria), as outlined below. - - [ERC-4337](https://www.erc4337.io/docs/paymasters/introduction), also known as Account Abstraction, enables more opportunities for apps and wallet developers to innovate on user experiences, including the ability to: * Batch transactions together (e.g. approve and execute a swap in one go) @@ -19,13 +15,7 @@ import { Callout } from 'nextra/components' * Sponsor the gas fees for transactions * Enable users to pay gas in the token(s) of their choice -## Bundlers - -The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. - -If used by the chain operator, also see the supplemental [op-txproxy](/builders/chain-operators/tools/op-txproxy) service which may apply additional restrictions prior to reaching the block builder. - -Ready to enable account abstraction experiences in your app? Here's some helpful information on account abstraction infrastructure like ERC-4337 bundler and gas manager APIs that are available on Metal L2: +## Providers * [Biconomy](https://docs.biconomy.io/): is an Account Abstraction toolkit that enables you to provide the simplest UX for your app or wallet. It offers modular smart accounts, as well as paymasters and bundlers as a service for sponsoring gas and executing transactions at scale. See this [tutorial](/chain/biconomy) for trying Biconomy on the Metal L2 Testnet. diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index 930662d20..fc46d171d 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -18,8 +18,7 @@ This tutorial is **designed for developers** who want to learn about the OP Stac You'll perform the full deployment process, and **you'll end up with your very own OP Stack devnet**. It's useful to understand what each of these components does before -you start deploying your chain. To learn about the different components please -read the [deployment overview page](/builders/chain-operators/deploy/overview). +you start deploying your chain. You can use this devnet to experiment and perform tests, or you can choose to modify the chain to adapt it to your own needs. **The OP Stack is free and open source software licensed entirely under the MIT license**. You don't need permission from diff --git a/pages/connect/contribute/docs-contribute.mdx b/pages/connect/contribute/docs-contribute.mdx index 0faf51680..75f937c17 100644 --- a/pages/connect/contribute/docs-contribute.mdx +++ b/pages/connect/contribute/docs-contribute.mdx @@ -16,8 +16,6 @@ Metal L2 Docs(docs.metall2.com) is a fork of the Optimism docs, an open-source p * [Edit existing content](#how-to-work-on-docsoptimismio): make tweaks to existing content using the ✏️ **Edit this page on GitHub** or ❤️ **Share general feedback** links on the right-side of any page. * [Add or update an FAQ item](https://github.com/MetalPay/metal-l2-docs/issues/new?assignees=\&labels=documentation%2Cfaq%2Ccommunity-request\&projects=\&template=suggest_faq_item.yaml\&title=Suggest+an+FAQ+item): add a new FAQ (question+answer set) to an [existing page](/chain/security/faq#security-model-faq), create a new FAQ page, or update an existing FAQ question/answer set. -* [Add or update a troubleshooting item](https://github.com/MetalPay/metal-l2-docs/issues/new?assignees=\&labels=documentation%2Ctroubleshooting%2Ccommunity-request\&projects=\&template=suggest_troubleshooting_item.yaml\&title=Suggest+a+troubleshooting+item): - add a new troubleshooting item (problem+solution set) to an [existing page](/builders/chain-operators/management/troubleshooting), create a new troubleshooting page, or update an existing troubleshooting problem/solution set. * [Add a glossary term](https://github.com/MetalPay/metal-l2-docs/issues/new?assignees=\&labels=glossary%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_glossary_term.yaml\&title=Suggest+a+glossary+term): help us continue to expand the Metal L2 [glossary](/connect/resources/glossary). * [Add a faucet to the developer community](https://github.com/ethereum-optimism/developers/tree/main/community): diff --git a/pages/stack/fault-proofs/challenger.mdx b/pages/stack/fault-proofs/challenger.mdx index 1e90da138..69e5b20c9 100644 --- a/pages/stack/fault-proofs/challenger.mdx +++ b/pages/stack/fault-proofs/challenger.mdx @@ -84,7 +84,6 @@ The `FaultDisputeGame` does not put a time cap on resolution - because of the li ## Next steps -* Ready to get started? Read our guide on how to [configure `op-challenger` on your OP Stack chain](/builders/chain-operators/tools/op-challenger). * For more info about how `op-challenger` works under the hood, [check out the specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html). ## FAQs diff --git a/pages/stack/getting-started.mdx b/pages/stack/getting-started.mdx index c8ae6317f..3545f5968 100644 --- a/pages/stack/getting-started.mdx +++ b/pages/stack/getting-started.mdx @@ -16,7 +16,6 @@ import { Callout } from 'nextra/components' The OP Stack consists of the many different software components managed and maintained by the Optimism Collective that, together, form the backbone of Optimism. The OP Stack is built as a public good for the Ethereum and Optimism ecosystems. -To understand how to operate an OP Stack chain, including roll-up and chain deployment basics, visit [Chain Operator guide](/builders/chain-operators/self-hosted). Check out these guides to get an overview of everything you need to know to properly support OP mainnet within your [exchange](/builders/app-developers/overview) and [wallet](/builders/app-developers/overview). ## The OP Stack powers Metal L2 @@ -46,7 +45,6 @@ The Bedrock release of the OP Stack makes it easy to spin up an L2 that will be If you'd like to launch a Superchain-ready L2, check out our guide for running a chain based on the Bedrock release of the OP Stack. It is possible to modify components of the OP Stack to build novel L2 systems. -If you're interested in experimenting with the OP Stack, check out [the OP Stack Hacks section of this site](/builders/chain-operators/hacks/overview). Please note that, as of the Bedrock release, the OP Stack is *not* designed to support these modifications and you will very much be *hacking* on the codebase. As a result, **you should, for the moment, expect limited (if any) developer support for OP Stack Hacks.** OP Stack Hacks will likely make your chain incompatible with the Optimism Superchain. diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx deleted file mode 100644 index 672938171..000000000 --- a/pages/stack/interop/predeploy.mdx +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Interoperability predeploys -lang: en-US -description: How it works. ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -import { InteropCallout } from '@/components/WipCallout' - - - -# Interoperability predeploys - -The following predeploys have been added to enable interoperability. -*Predeployed smart contracts* exist at predetermined addresses, coming from the genesis state. -They're similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. - -## CrossL2Inbox - -The `CrossL2Inbox` is the system predeploy for cross chain messaging. -Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. - -* **Address:** `0x4200000000000000000000000000000000000022` -* **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) -* **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) - -## L2ToL2CrossDomainMessenger - -The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing. -It's utilized for secure ERC20 token transfers between L2 chains. -Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding (the executing transaction can only be valid on a single chain). - -* **Address:** `0x4200000000000000000000000000000000000023` -* **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) -* **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) - -{/* -## OptimismSuperchainERC20Factory - -`OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge`, and includes a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. - -- **Address:** `0x4200000000000000000000000000000000000026` -- **Specs:** [`OptimismSuperchainERC20Factory`](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) -- **Source code:** [`OptimismSuperchainERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol) - -## OptimismSuperchainERC20Beacon - -To enable upgrades, `OptimismSuperchainERC20` contracts use [the `BeaconProxy` pattern](https://docs.openzeppelin.com/contracts/3.x/api/proxy#beacon). -This contract is the `Beacon` part, which provides the implementation address for those proxies. - -- **Address:** `0x4200000000000000000000000000000000000027` -- **Specs:** [`OptimismSuperchainERC20Beacon`](https://specs.optimism.io/interop/predeploys.html#beaconcontract) -- **Source code:** [`OptimismSuperchainERC20Beacon`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol) - -*/} - -## SuperchainTokenBridge - -The `SuperchainTokenBridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `OptimismSuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). - -* **Address:** `0x4200000000000000000000000000000000000028` -* **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) -* **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx deleted file mode 100644 index b6c7f819d..000000000 --- a/pages/stack/interop/security.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Cross-chain security -lang: en-US -description: Security measures for safe interoperability ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -import { InteropCallout } from '@/components/WipCallout' - - - -# Security considerations - -## The trust model - -This interop vulnerability arises when an initiating message seems to exist, prompting the processing of the executing message. However, the initiating message ends up not actually appear in the canonical chain. -Excluding L1 reorgs, this can happen in two ways: - -* *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. - The problem happens when the gossip protocol block includes a log entry that is used as an initiating message, but the real block (the one written to L1) doesn't. - The way this is handled is that a block that depends on an unsafe block is, itself, unsafe. - It does not get treated as safe until all the blocks on which it depends (directly or indirectly) are also written to L1. - -* *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. - To save on resources, the sequencer can choose to query existing nodes of the source blockchain. - In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. - - In this case, invalid blocks will be replaced with deposit only blocks by other verifiers. - -
- What are deposit only blocks? - - Normally the blocks that make it to the canonical blockchain are those posted to L1 by the sequencer. - However, when those blocks are missing or invalid (for example because they rely on an initiating message that is missing), they're replaced by *deposit only blocks*, blocks whose content can be calculated from L1 without relying on the sequencer. - - The way this works is that there are two types of user transactions in an OP Stack block: - - * Sequencer transactions, which go through the sequencer. - These transactions are extremely cheap, but in theory a sequencer could censor them. - * Deposit transactions, which users submit through L1. - These transactions have the cost of an L1 transaction, which is a lot higher, but they cannot be censored by the sequencer. - - A deposit only block only contains the deposit transactions and some internal transactions, not the sequencer transactions. - - For more information about this process, [see the technical specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list). -
- -## The latency/security tradeoff - -The initiating message comes from a block on a different blockchain. -If we accept initiating messages as soon as the block is available through the gossip protocol, we have minimal latency but at a security cost (because the source sequencer can send incorrect information through gossip). -Alternatively, we can wait until the source sequencer posts the block to L1. -In that case we can be more certain that the block is correct, but at the cost of higher latency. - -There are three different possibilities, at different levels of latency and security. - -### Unsafe initiating messages - -L2 blocks start as unsafe, meaning that there's no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. -Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. -A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. - -However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), for itself and the previous blocks in its blockchain are also written to L1. - -```mermaid - -sequenceDiagram - actor app as User - participant src as Source Chain - participant dst as Destination Chain - participant l1 as Ethereum Mainnet - src->>dst: Block src_n will have transaction txn_0 that emits log event evt_0 - note over src,dst: Initiating message - app->>dst: Transaction txn_1: If you have evt_0, call contract C with the data in evt_0. - note over app,dst: Executing message - note left of dst: Block dst_m will
have the results of
calling contract C
with the data in evt_0. - break - note over app,l1: time passes - end - src->>l1: Write block src_n without txn_0 (so no evt_0) - l1->>dst: This is the safe block src_n - note left of dst: No evt_0, so block dst_m is incorrect
and so is every subsequent block.
All those blocks are replaced with
deposit only blocks. -``` - -### 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 (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. -Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. - -You can use [this dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity#submission-frequency) to see how often OP Stack chains submit batches. - -```mermaid - -sequenceDiagram - actor app as User - participant src as Source Chain - participant dst as Destination Chain - participant l1 as Ethereum Mainnet - src->>dst: Block src_n will have transaction txn_0 that emits log event evt_0 - note over src,dst: Initiating message - app->>dst: Transaction txn_1: If you have evt_0, call contract C with the data in evt_0. - note over app,dst: Executing message - note over dst: Block src_n is not safe yet,
txn_1 fails - break - note over app,l1: time passes - end - src->>l1: Write block src_n with txn_0 - l1->>dst: This is the safe block src_n - app->>dst: Transaction txn_2: If you have evt_0, call contract C with the data in evt_0. - note over app,dst: Executing message - note over dst: Now I have evt_0,
so txn_2 is successful - -``` - -### Finalized initiating messages - -A sequencer can also be configured to reject all executing messages until the initiating message is *finalized*, meaning it's irrevocably on L1 and immune to reorgs. -Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-slot-finality/) to the message latency. - -
- -Safe and Unsafe Security Diagram - - - Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them are considered unsafe until the blocks with those initiating messages are written to L1 and become safe. - - -{/* -## What is stopping a sequencer from censoring a cross-chain message? -There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. - - - -## What is stopping a shared sequencer from including just the executing message and not the initiating message? -The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. - -*/} diff --git a/pages/stack/interop/tools.mdx b/pages/stack/interop/tools.mdx deleted file mode 100644 index 38bfbb531..000000000 --- a/pages/stack/interop/tools.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Assets -description: Documentation covering Interop devnet, Supersim in the Interop section of the OP Stack ecosystem. -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Interop - -Documentation covering Interop devnet, Supersim in the Interop section of the OP Stack ecosystem. - - - - - - - diff --git a/pages/stack/interop/tools/_meta.json b/pages/stack/interop/tools/_meta.json deleted file mode 100644 index 5006c7465..000000000 --- a/pages/stack/interop/tools/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "supersim": "Supersim Multichain Development Environment", - "devnet": "Interop devnet - coming soon" -} diff --git a/pages/stack/rollup/overview.mdx b/pages/stack/rollup/overview.mdx index d9a6f23e7..b83816a31 100644 --- a/pages/stack/rollup/overview.mdx +++ b/pages/stack/rollup/overview.mdx @@ -21,7 +21,7 @@ Specifically, Optimistic Rollups leverage the consensus mechanism (like PoW or P ## Block storage In Bedrock, L2 blocks are saved to the Ethereum blockchain using a non-contract address ([`0xff00..0010` on Ethereum](https://etherscan.io/address/0xff00000000000000000000000000000000000010)) to minimize the L1 gas expense. -As these blocks are submitted as transactions using EIP-4844 [blobs](/builders/chain-operators/management/blobs), there is no way to modify or censor them after the "transaction" is included in a block that has enough attestations. +As these blocks are submitted as transactions using EIP-4844 blobs, there is no way to modify or censor them after the "transaction" is included in a block that has enough attestations. This is the way that OP Mainnet inherits the availability and integrity guarantees of Ethereum. Blocks are written to L1 in [a compressed format](https://specs.optimism.io/protocol/derivation.html#batch-submission-wire-format) to reduce costs. @@ -113,4 +113,3 @@ The fault proof process is currently undergoing major redevelopment as a side-ef ## Next steps * If you want to learn more about rollup protocol, check out the guides on [deposit flow](/stack/transactions/deposit-flow), [withdrawal flow](/stack/transactions/withdrawal-flow), or [transaction flow](/stack/transactions/transaction-flow). -* To learn about operating your own L2 rollup, see the guide on [starting a self-hosted chain](/builders/chain-operators/self-hosted) or go directly to the tutorial on [creating your own L2 rollup](/builders/chain-operators/tutorials/create-l2-rollup). diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index cba93d183..9234614fd 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -171,7 +171,7 @@ Recall that base\_fee\_scalar is set to dynamic\_overhead and blob\_base\_fee\_s following the upgrade. Because the old overhead parameter becomes ignored, new L1 data prices will be (slightly, since overhead is typically very small) lower than before the fork. Chain operators will likely want to retune the parameters appropriately after the fork, particularly if -they plan on [enabling blobs](/builders/chain-operators/management/blobs). +they plan on enabling blobs. Chain operators can use the [Ecotone fee parameter calculator](https://docs.google.com/spreadsheets/d/12VIiXHaVECG2RUunDSVJpn67IQp9NHFJqUsma2PndpE/edit#gid=186414307) to get a better estimate of scalar values to use for your chain. #### Fjord diff --git a/words.txt b/words.txt index 86d4fb454..50bd05956 100644 --- a/words.txt +++ b/words.txt @@ -11,14 +11,10 @@ allocs ANDI Apeworx authrpc -Badgeholder's -Badgeholders -badgeholders BGEZ BGTZ Biconomy biconomy -birthdate BLEZ BLOBPOOL blobpool @@ -35,7 +31,6 @@ BLOOMFILTER bloomfilter BLTZ Bootcamp -bootnode BOOTNODES Bootnodes bootnodes @@ -87,7 +82,6 @@ exitwhensynced EXTRADATA extradata Farcaster -farcaster FDLIMIT fdlimit featureset @@ -129,7 +123,6 @@ ipcdisable ipcfile IPCPATH ipcpath -ipfs JALR JOURNALREMOTES journalremotes @@ -170,6 +163,7 @@ MTHI MTLO MULT multiaddr +multichain multiclient multisigs MULTU @@ -214,7 +208,6 @@ permissioned Permissionless permissionless permissionlessly -personhood PPROF pprof Precommitments @@ -229,6 +222,7 @@ Preimage PREIMAGES preimages prestate +PREVRENDAO PRICEBUMP pricebump PRICELIMIT @@ -258,8 +252,6 @@ rpckind RPCPREFIX rpcprefix RPGF -Rpgf -rpgf RWAs safedb Schnorr @@ -273,7 +265,6 @@ SLTIU SLTU smartcard snapshotlog -soulbound soyboy spacebar Spearbit @@ -288,8 +279,11 @@ SUPERCHAIN Superchain superchain Superchain's +Superchainerc Superchains Superscan +Supersim +supersim SYNCMODE syncmode SYNCTARGET @@ -311,7 +305,6 @@ undercollateralize Unprotect unsubmitted UPNP -usafe VERKLE verkle VHOSTS @@ -323,7 +316,6 @@ VMDEBUG vmdebug VMODULE vmodule -Warpcast XORI xtensibility ZKPs

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 literal 0 HcmV?d00001 diff --git a/words.txt b/words.txt index 2368dafd5..ee7bb3b73 100644 --- a/words.txt +++ b/words.txt @@ -41,6 +41,8 @@ BLOOMFILTER bloomfilter BLTZ Bootcamp +Bootnode +bootnode BOOTNODES Bootnodes bootnodes @@ -339,6 +341,8 @@ SLTIU SLTU smartcard snapshotlog +Snapsync +snapsync soulbound soyboy spacebar From 153223dd0c2364f953a2b2c8332482b04e7111a3 Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 11 Dec 2024 16:31:23 +0100 Subject: [PATCH 02/75] updated architecture page --- .../builders/chain-operators/architecture.mdx | 143 ++++++++++++--- pages/stack/_meta.json | 1 - pages/stack/network-topology.mdx | 166 ------------------ words.txt | 2 + 4 files changed, 123 insertions(+), 189 deletions(-) delete mode 100644 pages/stack/network-topology.mdx diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 2b8b5ef5e..925500abf 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -49,6 +49,46 @@ amount of data required to reproduce L2 blocks. +## Sequencer + +The Sequencer node works with the batcher and proposer to create new blocks. So it should +handle the state changing RPC request `eth_sendRawTransaction`. It can be peered with +replica nodes to gossip new `unsafe` blocks to the rest of the network. + +Sequencer op-node should have p2p discovery disabled and only be statically peered with other internal nodes (or use [peer-management-service](https://github.com/ethereum-optimism/infra/tree/main/peer-mgmt-service) to define peering network) + +A production setup should include: + +* At least one archive sequencer for recovering from deep L1 reorgs +* Secure P2P configuration with static peering +* Integration with op-conductor for high availability +* Disable P2P discovery and define a static peer list for internal nodes. + +```yaml +# Recommended sequencer configuration +OP_NODE_P2P_NO_DISCOVERY: "true" +OP_NODE_P2P_PEER_BANNING: "false" +OP_NODE_P2P_STATIC: "" +``` + +### Sequencer isolation + +To maintain network security, the Sequencer node is isolated from the internet and peers exclusively with internal replica nodes. It maintains a shared mempool with replicas for efficient transaction handling. + +Sequencer Node Diagram + +### Replica node + +The replica nodes are additional nodes on the network. They can be peered to the Sequencer, +which might not be connected to the rest of the internet, and other replicas. Additional +replicas can help horizontally scale RPC requests. + +Replica Node Diagram + + + To run a rollup, you need a minimum of one archive node. This is required by the proposer as the data that it needs can be older than the data available to a full node. Note that since the proposer doesn't care what archive node it points to, you can technically point it towards an archive node that isn't the sequencer. + + ## Ingress traffic It is important to setup a robust chain architecture to handle large volumes of RPC @@ -61,8 +101,87 @@ to route RPC methods, retry failed requests, load balance, etc. Users sending `eth_sendRawTransaction` requests can have their requests forwarded directly to the Sequencer. All other RPC requests can be forwarded to replica nodes. +Configuration recommendations: + +```yaml +GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" +GETH_TXPOOL_JOURNALREMOTES: "false" +GETH_TXPOOL_LIFETIME: "1h" +GETH_TXPOOL_NOLOCALS: "true" +GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs +``` + Ingress Traffic Diagram +## Bootnodes + +Bootnodes facilitate peer discovery for network nodes. They help initialize peer connections for both public and private nodes in the network. + +### Archive RPC Nodes + +We recommend setting up some archive nodes for internal RPC usage, primary used by the challenger, proposer and security monitoring tools like [monitorism](/builders/chain-operators/tools/chain-monitoring#monitorism). + +```yaml +GETH_GCMODE: "archive" +GETH_DB_ENGINE: "pebble" +GETH_STATE_SCHEME: "hash" +``` + +* You can also use these nodes taking disk snapshots for disaster recovery. + +### Full Snapsync Nodes + +* These nodes provide peers for snap sync, using the snapsync bootnodes for peer discovery. + + ```yaml + GETH_GCMODE: "full" + GETH_DB_ENGINE: "pebble" + GETH_STATE_SCHEME: "path" + GETH_SYNCMODE: "snap" + ``` + +### Snapsync Bootnodes + +* These bootnodes facilitate peer discovery for public nodes using snapsync. +* The bootnode can be either a geth instance or the [geth bootnode tool](https://etclabscore.github.io/core-geth/core/alltools/). + * If you want to to use geth for snapync bootnodes, you may want to just make the Full Snapsync Nodes serve as your bootnodes as well. + +### P2P Bootnodes + +* These are the op-node p2p network bootnodes. We recommend using the [geth bootnode tool](https://etclabscore.github.io/core-geth/core/alltools/) with discovery v5 enabled. + +## Offchain components + +In addition to the core protocol components, the following offchain services are essential for running a production-grade rollup network. + +### op-conductor + +The `op-conductor` RPC can act as a leader-aware rpc proxy for op-batcher (proxies the necessary op-geth / op-node RPC methods if the node is the leader). + +### op-challenger + +The `op-challenger` verifies the correctness of the L2 state by challenging invalid state transitions. This ensures the network's security and validity. + +### Ethereum L1 nodes + +These nodes are required to interface with the Ethereum mainnet, handling data submission and validation. + +## Peering guidelines + +### Consensus layer peering + +Ensure proper peer configurations for consensus layer clients. Use static peer lists for critical components and restrict P2P traffic to internal IP ranges. + +### Execution layer peering + +Execution layer clients, like `op-geth`, should be configured for efficient peer-to-peer communication. Utilize the following YAML configuration for static peers and network restrictions: + +```yaml +GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs +GETH_P2P_NO_DISCOVERY: "true" +GETH_P2P_STATIC: "" +``` + ### proxyd This tool is a RPC request router and proxy. It does the following things: @@ -76,29 +195,9 @@ This tool is a RPC request router and proxy. It does the following things: 7. Cache immutable responses from backends. 8. Provides metrics to measure request latency, error rates, and the like. -### Sequencer - -The Sequencer node works with the batcher and proposer to create new blocks. So it should -handle the state changing RPC request `eth_sendRawTransaction`. It can be peered with -replica nodes to gossip new `unsafe` blocks to the rest of the network. - - -To run a rollup, you need a minimum of one archive node. This is required by the proposer as the data that it needs can be older than the data available to a full node. Note that since the proposer doesn't care what archive node it points to, you can technically point it towards an archive node that isn't the sequencer. - - -Sequencer Node Diagram - -### Replica node - -The replica nodes are additional nodes on the network. They can be peered to the Sequencer, -which might not be connected to the rest of the internet, and other replicas. Additional -replicas can help horizontally scale RPC requests. - -Replica Node Diagram - ## Next steps * Find out how you can support [snap sync](/builders/chain-operators/management/snap-sync) -on your chain. + on your chain. * Find out how you can utilize [blob space](/builders/chain-operators/management/blobs) -to reduce the transaction fee cost on your chain. + to reduce the transaction fee cost on your chain. diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index 5b49e2aae..fb6fe060f 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -4,7 +4,6 @@ "explainer": "Superchain explainer", "design-principles": "Design philosophy & principles", "components": "OP Stack components", - "network-topology": "OP Stack network topologies", "smart-contracts": "Smart contracts", "rollup": "Rollup", "fault-proofs": "Fault proofs", diff --git a/pages/stack/network-topology.mdx b/pages/stack/network-topology.mdx deleted file mode 100644 index 649c20f2b..000000000 --- a/pages/stack/network-topology.mdx +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: OP Stack Network Topologies -lang: en-US -tags: ["eng-protocol"] -description: A guide to acceptable network configurations for deploying OP Stack networks. ---- - -import { Callout } from 'nextra/components' - -# OP Stack network topologies - -This guide provides an example configuration for deploying OP Stack networks, addressing key components, best practices, and recommended setups. - -## Network architecture overview - -The architecture for OP Stack networks includes several node types, each serving a specific role in maintaining network functionality. Below is an example configuration: - -![OP Stack network diagram.](/img/op-stack/protocol/opstack-network-topology.png) - -## Key components - -### Sequencers - -Sequencers process transactions and maintain the rollup chain. - -* Configuration recommendations: - - * Use at least one archive sequencer as a backup to recover from deep L1 reorgs. - * Disable P2P discovery and define a static peer list for internal nodes. - -```yaml -OP_NODE_P2P_NO_DISCOVERY: "true" -OP_NODE_P2P_PEER_BANNING: "false" -OP_NODE_P2P_STATIC: "" -GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" -GETH_TXPOOL_JOURNAL: "" -GETH_TXPOOL_LIFETIME: "1h" -GETH_TXPOOL_NOLOCALS: "true" -GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs -``` - - - Transactions are received via P2P gossip from Tx Ingress Nodes. - Use the op-conductor RPC as a leader-aware proxy for [op-batcher](/builders/chain-operators/tools/chain-monitoring#op-batcher). - - -### Tx Ingress nodes - -These nodes handle incoming transactions from the public and gossip them internally. - -Configuration recommendations: - -```yaml -GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" -GETH_TXPOOL_JOURNALREMOTES: "false" -GETH_TXPOOL_LIFETIME: "1h" -GETH_TXPOOL_NOLOCALS: "true" -GETH_NETRESTRICT: "10.0.0.0/8" # Restrict P2P to internal IPs -``` - -Node Type: Can be either full or archive nodes. - -### Archive RPC nodes - -Archive nodes provide data to internal systems like the challenger, proposer, and monitoring tools. - -Configuration Recommendations: - -```yaml - -GETH_GCMODE: "archive" -GETH_DB_ENGINE: "pebble" -GETH_STATE_SCHEME: "hash" -``` - -### Use cases: - -* Internal RPC usage. -* Creating disk snapshots for disaster recovery. - -### Full snapsync nodes - -These nodes support the network by providing peers for snap sync. - -Configuration Recommendations: - -```yaml -GETH_GCMODE: "full" -GETH_DB_ENGINE: "pebble" -GETH_STATE_SCHEME: "path" -GETH_SYNCMODE: "snap" -``` - -### Snapsync bootnodes - -Bootnodes facilitate peer discovery for public nodes using snap sync. - -Recommendations: -Use the Geth bootnode tool. -Optionally, configure full Snapsync Nodes to also serve as bootnodes. - -### P2P bootnodes - -These nodes act as the discovery backbone for the op-node P2P network. - -Recommendations: -Use the Geth Bootnode Tool with discovery v5 enabled. - -### Public RPC nodes - -Public RPC nodes provide external access to the network but do not participate in internal transaction gossip. - -Configuration recommendations: - -Do not include Public RPC nodes in the internal Tx pool P2P network. -Use proxyd in consensus\_aware mode for routing and whitelist desired RPCs. - -```yaml -GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" -GETH_TXPOOL_JOURNALREMOTES: "false" -GETH_TXPOOL_NOLOCALS: "true" -GETH_NETRESTRICT: "10.0.0.0/8" -``` - - - Avoid running Public RPC nodes from the same instance as Tx Ingress Nodes to mitigate risks of transaction pool data leakage. - - -## Best practices - -* Redundancy: Always have backup nodes for critical roles like sequencers and archive nodes. -* Security: - * Restrict P2P to internal IPs. - * Regularly test disaster recovery setups. -* Monitoring: Use tools like [Monitorism](/builders/chain-operators/tools/chain-monitoring#monitorism) for network health. - -### Example configuration files - -Here are sample YAML snippets for various node setups: - -Sequencer Node - -```yaml -OP_NODE_P2P_NO_DISCOVERY: "true" -OP_NODE_P2P_PEER_BANNING: "false" -OP_NODE_P2P_STATIC: "" -GETH_ROLLUP_DISABLETXPOOLGOSSIP: "false" -GETH_TXPOOL_NOLOCALS: "true" -GETH_NETRESTRICT: "10.0.0.0/8" -``` - -Archive RPC node - -```yaml -GETH_GCMODE: "archive" -GETH_DB_ENGINE: "pebble" -GETH_STATE_SCHEME: "hash" -``` - -## FAQs - -1. Why should Public RPC nodes avoid the Tx pool P2P network? - Including Public RPC nodes in the Tx pool P2P network poses security risks, such as transaction data leakage. - -2. What is the purpose of snapsync bootnodes? - These nodes facilitate peer discovery for public nodes performing snap sync. diff --git a/words.txt b/words.txt index ee7bb3b73..391c26382 100644 --- a/words.txt +++ b/words.txt @@ -200,6 +200,7 @@ Mintplex MIPSEVM Mitigations Monitorism +monitorism Moralis Mordor mountpoint @@ -343,6 +344,7 @@ smartcard snapshotlog Snapsync snapsync +snapync soulbound soyboy spacebar From 873dd1e19ea5ad8b62ceaa01ea9ed0277a7165e6 Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 11 Dec 2024 17:46:57 +0100 Subject: [PATCH 03/75] updated the links --- pages/builders/chain-operators/architecture.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 925500abf..7ed72939a 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -156,11 +156,11 @@ In addition to the core protocol components, the following offchain services are ### op-conductor -The `op-conductor` RPC can act as a leader-aware rpc proxy for op-batcher (proxies the necessary op-geth / op-node RPC methods if the node is the leader). +The [op-conductor](/tools/op-conductor) RPC can act as a leader-aware rpc proxy for op-batcher (proxies the necessary op-geth / op-node RPC methods if the node is the leader). ### op-challenger -The `op-challenger` verifies the correctness of the L2 state by challenging invalid state transitions. This ensures the network's security and validity. +The [op-challenger](/tools/op-challenger) verifies the correctness of the L2 state by challenging invalid state transitions. This ensures the network's security and validity. ### Ethereum L1 nodes From 25a479ee0b6ddaafc1e955ed293a1877711b8ebe Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 12 Dec 2024 15:14:25 +0100 Subject: [PATCH 04/75] Update pages/builders/chain-operators/architecture.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/chain-operators/architecture.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 7ed72939a..0d27af0b6 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -144,7 +144,7 @@ GETH_STATE_SCHEME: "hash" * These bootnodes facilitate peer discovery for public nodes using snapsync. * The bootnode can be either a geth instance or the [geth bootnode tool](https://etclabscore.github.io/core-geth/core/alltools/). - * If you want to to use geth for snapync bootnodes, you may want to just make the Full Snapsync Nodes serve as your bootnodes as well. + * If you want to use geth for snapsync bootnodes, you may want to just make the Full Snapsync Nodes serve as your bootnodes as well. ### P2P Bootnodes From 6dd90b1ffd2b0d80d2e4a325d7eeb4a83a5d4a10 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Sun, 15 Dec 2024 13:19:25 -0600 Subject: [PATCH 05/75] WIP --- pages/stack/interop/_meta.json | 1 + pages/stack/interop/architecture.mdx | 100 +++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 pages/stack/interop/architecture.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index ac5d2f1f3..469dc5cda 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,5 +1,6 @@ { "explainer": "Interop explainer", + "architecture": "Architecture", "devnet": "Interop devnet", "supersim": "Supersim Multichain Development Environment", "cross-chain-message": "Anatomy of cross-chain message", diff --git a/pages/stack/interop/architecture.mdx b/pages/stack/interop/architecture.mdx new file mode 100644 index 000000000..fd73ae742 --- /dev/null +++ b/pages/stack/interop/architecture.mdx @@ -0,0 +1,100 @@ +--- +title: Interoperability architecture +lang: en-US +description: How it works. +--- + +import { Callout } from 'nextra/components' +import Image from 'next/image' + +import { InteropCallout } from '@/components/WipCallout' + + + +# Interoperability architecture + +Interoperability is provided by an [OP Supervisor](./op-supervisor). +This supervisor keeps a copy of the events for all the blockchains in the interoperability cluster, and can therefore validate that cross-chain messages (which are always initiated with an event on the source cluster). + +```mermaid + +graph TB + supervisor[OP Supervisor] + subgraph mainnet[OP Mainnet] + node1[OP Node]<-->geth1[Execution Engine] + end + subgraph base[Base] + node2[OP Node]<-->geth2[Execution Engine] + end + subgraph l1[Ethereum L1] + node3[Consensus Layer]<-->geth3[Execution Layer] + end + supervisor<-->mainnet + supervisor<-->base + supervisor<-->l1 +``` + +## How messages get from one chain to the other + +```mermaid + +sequenceDiagram + participant app as Application + participant src as Soucre Chain + participant op-sup as OP Supervisor + participant dst as Destination Chain + app->>src: Transaction + src->>op-sup: Log Event + note over src,op-sup: Log Event = Initializing Message + app->>dst: Transaction + dst->>dst: Call to CrossL2Inbox to execute or verify a message. + dst->>op-sup: Did you receive this initiating message? + op-sup->>dst: Yes + note left of dst: Call is successful + dst->>dst: CrossL2Inbox emits ExecutingMessage. + note over dst: Executing Message +``` + +## Safety levels + +- *Unsafe* - not yet written to L1, obtained through gossip channels, ultimately based on trust in a sequencer. +- *Cross unsafe* - verified that all executing messages have legitimate initiating messages, but otherwise still unsafe. + Treated as unsafe for most purposes. +- *Safe* - the block and all the blocks on which it depends (those with initiating mesages to which it has executing messages) have been written to L1. +- *Finalized* - the block and all the blocks on which it depends have been on L1 for long enough to make a reorg impossible. + + +```mermaid + +flowchart LR + classDef finalized fill:#CCC + classDef safe fill:#8F8 + classDef unsafe fill:#F89 + subgraph I[Blocks with Initiating Messages] + style I fill:none + subgraph A[Chain A] + A0[Block n] + A1[Block n+100] + A2[Block n+105] + class A0 finalized + class A1 safe + class A2 unsafe + end + subgraph B[Chain B] + B0[Block m] + B1[Block m+3] + class B0,B1 safe + end + end + subgraph C[Chain C] + C0[Block with executing messages] + class C0 unsafe + end + A0 --> C0 + A1 --> C0 + A2 --> C0 + B0 --> C0 + B1 --> C0 +``` + +A block should only be written to L1 once the blocks on which it depends are all safe. \ No newline at end of file From ea79b3ce4206d33d2ac4d60126c8035ecd35ac29 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Mon, 30 Dec 2024 11:14:49 +0200 Subject: [PATCH 06/75] WIP --- pages/stack/interop/explainer.mdx | 112 +++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 8 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index c7b0ca5ed..f34442ad2 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -13,16 +13,112 @@ import { InteropCallout } from '@/components/WipCallout' # Interoperability explainer -The Oracle problem states that a blockchain can only be certain about information generated by that chain. But what about information that happens outside that blockchain, how do you verify what happens somewhere else? +## Why do we need interoperability + +It is easy for a blockchain to be certain about information it generates itself. +Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). +We would like the Superchain to appear as a single blockchain to the lay user, which requires quick, seamless message and asset bridging. + +*Interoperability* is a set of protocols and services that lets OP Stack blockchains read each others' state. +Interoperability provides the following benefits: + +- 1-block latency asset movement, removing the problem of capital fragmentation leading to better capital efficiency. +- Improved experience for both users and developers. +- Secure transfer of assets, such as ETH and ERC-20 tokens, across L2s. +- Horizontal scalability for applications that need it. + +## Interoperability architecture + +# Interoperability architecture + +Interoperability is provided by a new service called the [OP Supervisor](./op-supervisor). +This supervisor keeps a copy of the events for all the blockchains in the interoperability cluster, and can therefore validate that cross-chain messages (which are always initiated with an event on the source cluster). + +```mermaid + +graph TB + supervisor[OP Supervisor] + subgraph mainnet[OP Mainnet] + node1[OP Node]<-->geth1[Execution Engine] + end + subgraph base[Base] + node2[OP Node]<-->geth2[Execution Engine] + end + subgraph l1[Ethereum L1] + node3[Consensus Layer]<-->geth3[Execution Layer] + end + supervisor<-->mainnet + supervisor<-->base + supervisor<-->l1 +``` + +### How messages get from one chain to the other + +```mermaid + +sequenceDiagram + participant app as Application + participant src as Soucre Chain + participant op-sup as OP Supervisor + participant dst as Destination Chain + app->>src: Transaction + src->>op-sup: Log Event + note over src,op-sup: Log Event = Initializing Message + app->>dst: Transaction + dst->>dst: Call to CrossL2Inbox to execute or verify a message. + dst->>op-sup: Did you receive this initiating message? + op-sup->>dst: Yes + note left of dst: Call is successful + dst->>dst: CrossL2Inbox emits ExecutingMessage. + note over dst: Executing Message +``` + +### Safety levels + +- *Unsafe* - not yet written to L1, obtained through gossip channels, ultimately based on trust in a sequencer. +- *Cross unsafe* - verified that all executing messages have legitimate initiating messages, but otherwise still unsafe. + Treated as unsafe for most purposes. +- *Safe* - the block and all the blocks on which it depends (those with initiating mesages to which it has executing messages) have been written to L1. +- *Finalized* - the block and all the blocks on which it depends have been on L1 for long enough to make a reorg impossible. + + +```mermaid + +flowchart LR + classDef finalized fill:#CCC + classDef safe fill:#8F8 + classDef unsafe fill:#F89 + subgraph I[Blocks with Initiating Messages] + style I fill:none + subgraph A[Chain A] + A0[Block n] + A1[Block n+100] + A2[Block n+105] + class A0 finalized + class A1 safe + class A2 unsafe + end + subgraph B[Chain B] + B0[Block m] + B1[Block m+3] + class B0,B1 safe + end + end + subgraph C[Chain C] + C0[Block with executing messages] + class C0 unsafe + end + A0 --> C0 + A1 --> C0 + A2 --> C0 + B0 --> C0 + B1 --> C0 +``` + +A block should only be written to L1 once the blocks on which it depends are all safe. + -Interoperability is the ability for a blockchain to securely read the state of another blockchain. -Native OP Stack interoperability provides the ability to read messages and transfer assets across chains in the Superchain (without having to go through L1) via low-latency, secure message passing. This results in the following benefits: -* 1-block latency asset movement that is both maximally capital efficient and non-fragmenting -* improved user experience for developers on the Superchain -* secure transfer of ETH and ERC-20s across L2s -* horizontally scalable applications -In a practical sense, this allows users to securely and easily move ETH and tokens from one OP Stack chain to another by leveraging OP governed blockspace security. ## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. From b3e5d0c67ee871ee5bef45ac89da1918aebeaac5 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 31 Dec 2024 07:57:24 +0200 Subject: [PATCH 07/75] docs(interop/explainer): updated - Moved architecture into the explainer - Moved predeploys into their own page --- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/architecture.mdx | 100 --------------- pages/stack/interop/explainer.mdx | 175 +++++++++++++++------------ pages/stack/interop/predeploy.mdx | 63 ++++++++++ 4 files changed, 162 insertions(+), 178 deletions(-) delete mode 100644 pages/stack/interop/architecture.mdx create mode 100644 pages/stack/interop/predeploy.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 469dc5cda..403702636 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,6 +1,6 @@ { "explainer": "Interop explainer", - "architecture": "Architecture", + "predeploy": "Interop predeploys", "devnet": "Interop devnet", "supersim": "Supersim Multichain Development Environment", "cross-chain-message": "Anatomy of cross-chain message", diff --git a/pages/stack/interop/architecture.mdx b/pages/stack/interop/architecture.mdx deleted file mode 100644 index fd73ae742..000000000 --- a/pages/stack/interop/architecture.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Interoperability architecture -lang: en-US -description: How it works. ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -import { InteropCallout } from '@/components/WipCallout' - - - -# Interoperability architecture - -Interoperability is provided by an [OP Supervisor](./op-supervisor). -This supervisor keeps a copy of the events for all the blockchains in the interoperability cluster, and can therefore validate that cross-chain messages (which are always initiated with an event on the source cluster). - -```mermaid - -graph TB - supervisor[OP Supervisor] - subgraph mainnet[OP Mainnet] - node1[OP Node]<-->geth1[Execution Engine] - end - subgraph base[Base] - node2[OP Node]<-->geth2[Execution Engine] - end - subgraph l1[Ethereum L1] - node3[Consensus Layer]<-->geth3[Execution Layer] - end - supervisor<-->mainnet - supervisor<-->base - supervisor<-->l1 -``` - -## How messages get from one chain to the other - -```mermaid - -sequenceDiagram - participant app as Application - participant src as Soucre Chain - participant op-sup as OP Supervisor - participant dst as Destination Chain - app->>src: Transaction - src->>op-sup: Log Event - note over src,op-sup: Log Event = Initializing Message - app->>dst: Transaction - dst->>dst: Call to CrossL2Inbox to execute or verify a message. - dst->>op-sup: Did you receive this initiating message? - op-sup->>dst: Yes - note left of dst: Call is successful - dst->>dst: CrossL2Inbox emits ExecutingMessage. - note over dst: Executing Message -``` - -## Safety levels - -- *Unsafe* - not yet written to L1, obtained through gossip channels, ultimately based on trust in a sequencer. -- *Cross unsafe* - verified that all executing messages have legitimate initiating messages, but otherwise still unsafe. - Treated as unsafe for most purposes. -- *Safe* - the block and all the blocks on which it depends (those with initiating mesages to which it has executing messages) have been written to L1. -- *Finalized* - the block and all the blocks on which it depends have been on L1 for long enough to make a reorg impossible. - - -```mermaid - -flowchart LR - classDef finalized fill:#CCC - classDef safe fill:#8F8 - classDef unsafe fill:#F89 - subgraph I[Blocks with Initiating Messages] - style I fill:none - subgraph A[Chain A] - A0[Block n] - A1[Block n+100] - A2[Block n+105] - class A0 finalized - class A1 safe - class A2 unsafe - end - subgraph B[Chain B] - B0[Block m] - B1[Block m+3] - class B0,B1 safe - end - end - subgraph C[Chain C] - C0[Block with executing messages] - class C0 unsafe - end - A0 --> C0 - A1 --> C0 - A2 --> C0 - B0 --> C0 - B1 --> C0 -``` - -A block should only be written to L1 once the blocks on which it depends are all safe. \ No newline at end of file diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index f34442ad2..f7661d95f 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -13,7 +13,7 @@ import { InteropCallout } from '@/components/WipCallout' # Interoperability explainer -## Why do we need interoperability +## Why do we need interoperability? It is easy for a blockchain to be certain about information it generates itself. Information that comes from other sources is harder to provide in a safe, decentralized, and uncensorable manner (this is called [The Oracle Problem](https://chain.link/education-hub/oracle-problem)). @@ -29,58 +29,83 @@ Interoperability provides the following benefits: ## Interoperability architecture -# Interoperability architecture - -Interoperability is provided by a new service called the [OP Supervisor](./op-supervisor). -This supervisor keeps a copy of the events for all the blockchains in the interoperability cluster, and can therefore validate that cross-chain messages (which are always initiated with an event on the source cluster). +An OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks. +Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). +Every node operator is expected to run this service in addition to the [rollup node](/builders/node-operators/architecture#rollup-node) and [execution client](/builders/node-operators/architecture#execution-client). ```mermaid -graph TB - supervisor[OP Supervisor] - subgraph mainnet[OP Mainnet] - node1[OP Node]<-->geth1[Execution Engine] - end - subgraph base[Base] - node2[OP Node]<-->geth2[Execution Engine] +graph LR + + classDef chain fill:#FFE + classDef transparent fill:none, stroke:none + + subgraph chain1[OP Stack chain #1] + node1[OP Node] + super1[OP-Supervisor] + geth1[Execution Engine] + node1<-->super1<-->geth1<-->node1 end - subgraph l1[Ethereum L1] - node3[Consensus Layer]<-->geth3[Execution Layer] + subgraph X[ ] + chain2[OP Stack chain #2] + chain3[OP Stack chain #3] + l1node[L1 Consensus Layer] end - supervisor<-->mainnet - supervisor<-->base - supervisor<-->l1 + + chain2-->|log events|super1 + chain3-->|log events|super1 + l1node-->|block status|super1 + + class chain1,chain2,chain3 chain + class X transparent ``` -### How messages get from one chain to the other +OP-Supervisor holds a database of all the log events of all the chains in the interoperability cluster. +Every event can potentially initiate a cross domain message, and it is the job of OP-Supervisor to validate that the log event really happened on the source chain. +Additionally, OP-Supervisor reads information from L1's consensus layer to determine the transaction safety of L2 blocks. + +## How messages get from one chain to the other + +To understand *why* we need this additional service, it is useful to know how interop messages get from one blockchain to another. ```mermaid sequenceDiagram participant app as Application - participant src as Soucre Chain - participant op-sup as OP Supervisor - participant dst as Destination Chain + participant src as Source Chain + box rgba(0,0,0,0.1) Destination Chain + participant dst-sup as OP-Supervisor + participant dst-geth as Execution Engine + end app->>src: Transaction - src->>op-sup: Log Event - note over src,op-sup: Log Event = Initializing Message - app->>dst: Transaction - dst->>dst: Call to CrossL2Inbox to execute or verify a message. - dst->>op-sup: Did you receive this initiating message? - op-sup->>dst: Yes - note left of dst: Call is successful - dst->>dst: CrossL2Inbox emits ExecutingMessage. - note over dst: Executing Message + src->>dst-sup: Log Event + note over src,dst-sup: Log Event = Initializing Message + app->>dst-geth: Transaction + dst-geth->>dst-geth: Call to CrossL2Inbox to execute or verify a message. + dst-geth->>dst-sup: Did you receive this initiating message? + dst-sup->>dst-geth: Yes + note left of dst-geth: Call is successful + dst-geth->>dst-geth: CrossL2Inbox emits ExecutingMessage. + note over dst-geth: Executing Message ``` -### Safety levels +Cross domain messages require two transactions. +The first transaction creates an *initiating message* on the source chain. +The second transaction creates an *executing message* on the destination chain. +This executing message could result in a contract function being executed on the destination chain. -- *Unsafe* - not yet written to L1, obtained through gossip channels, ultimately based on trust in a sequencer. -- *Cross unsafe* - verified that all executing messages have legitimate initiating messages, but otherwise still unsafe. - Treated as unsafe for most purposes. -- *Safe* - the block and all the blocks on which it depends (those with initiating mesages to which it has executing messages) have been written to L1. -- *Finalized* - the block and all the blocks on which it depends have been on L1 for long enough to make a reorg impossible. +The initiating message is simply a log event. +Any log event on any chain that inteoperates with the destination can initiate a cross domain message. +The transaction that receives the message on the destination chain calls a contract called [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox). +This call can be at the top level, directly from the externally owned account, or come through a smart contract. +The call to `CrossL2Inbox`, also known as the *executing message*, needs to [identify the initiating message uniquely](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L35-L42), using the chain ID of the source chain, the block number, and the index of the log event within that block, as well as a few other fields as a sanity check. + +`CrossL2Inbox` can either [validate the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185), or [call a contract if the message exists](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol#L171-L185). + +[For more information, see the cross-chain messages anatomy page](./cross-chain-message). + +## Block safety levels ```mermaid @@ -115,69 +140,65 @@ flowchart LR B1 --> C0 ``` -A block should only be written to L1 once the blocks on which it depends are all safe. - - - -## Secure message passing -Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. - -* **Message passing protocol:** the initial + finalizing/executing [message](cross-chain-message) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SuperchainERC20 token specification**: the [SuperchainERC20](superchain-erc20) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/assets/superchain-erc20) +Interop expands the scope of trust for unsafe blocks, blocks that are shared through [the gossip protocol](/builders/chain-operators/architecture#sequencer). +To trust that an unsafe block is valid and is going to become safe and then finalized, you need to trust not only the sequencer that produces it, but also all the other sequencers that produce other blocks that are still unsafe, but that include initiating messages that are executed in that block. -This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. +However, this is only for *unsafe* blocks, and only if the sequencer allows messages from unsafe blocks to be processed. +A block is only considered promotable to *safe*, and therefore ready to be written to L1, when all the blocks on which it depends are safe. -## Low latency -Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be 1-block (~2 seconds) by optimistically accepting cross-chain messages. +For example, in the image above, most blocks are safe. +Block `n` in chain `A` is even finalized, and immune from reorgs. +However, block `n+105` in chain `A` is unsafe, it (or a block on which it depends) is not written to L1. +Because the new block depends upon it, it is also unsafe. ## Interop clusters -The interop protocol works via a dependency set which is configured on a per-chain basis. The dependency set defines the set of chains that a chain will accept incoming messages from. To prevent tokens from being sent to a chain that doesn't accept incoming messages, the protocol enforces that messages can only be sent to chains within its dependency set. - -## Superchain interop cluster -The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. Compared to a hub and spoke model, this provides the highest level of interoperability, as any blockchain can transact directly with any other. - -Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. - -## New predeploys +The interop protocol works via a dependency set which is configured on a per-chain basis. +The dependency set defines the set of chains that can send and receive messages with a specific chain. -The following predeploys have been added to enable interoperability. Predeployed smart contracts exist at predetermined addresses in the genesis state. They are similar to precompiles but instead run directly in the EVM instead of running native code outside the EVM. +```mermaid -### CrossL2Inbox +flowchart LR + A[Chain A] <--> B[Chain B] + A[Chain A] <--> C[Chain C] + A[Chain A] <--> D[Chain D] + A[Chain A] <--> E[Chain E] + B <--> C + D <--> E -The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. +``` -* **Address:** `0x4200000000000000000000000000000000000022` -* **Specs:** [CrossL2Inbox](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) +For example, in the illustration above, the dependency set of chain B is chains A and C. -### L2ToL2CrossDomainMessenger +### Superchain interop cluster -The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing, utilized for secure transfers ERC20 tokens between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding, ie the executing transaction can only be valid on a single chain. +The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. +In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. +This model provides the highest level of interoperability, as any blockchain can transact directly with any other. -* **Address:** `0x4200000000000000000000000000000000000023` -* **Specs:** [L2ToL2CrossDomainMessenger](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) +```mermaid -### OptimismSuperchainERC20Factory +flowchart LR + A[Chain A] <--> B[Chain B] <--> C[Chain C] <--> D[Chain D] <--> E[Chain E] <--> A + A <--> C <--> E <--> B <--> D <--> A +``` -The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`), and includes a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. -* **Address:** `0x4200000000000000000000000000000000000026` -* **Specs:** [OptimismSuperchainERC20Factory](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) +Each blockchain in the Superchain interop cluster shares the same security model to mitigate the weakest-link scenario. As outlined in the [Standard Rollup Charter](https://gov.optimism.io/t/season-6-standard-rollup-charter-ratification/8135#p-36758-governing-policies-11), these chains share the same L1 `ProxyAdmin` Owner. Any changes to the Superchain interop cluster must follow the standard Protocol Upgrade vote procedure—the established governance process for Superchain modifications. -### BeaconContract +{/* +## Interop assets -The `BeaconContract` predeploy gets called by the `OptimismSuperchainERC20` BeaconProxies deployed by the SuperchainERC20Factory. The Beacon Contract implements the interface defined in [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967). +Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. -* **Address:** `0x4200000000000000000000000000000000000027` -* **Specs:** [BeaconContract](https://specs.optimism.io/interop/predeploys.html#beaconcontract) +* **Message passing protocol:** the initial + finalizing/executing [message](cross-chain-message) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) +* ****: the [SuperchainERC20](superchain-erc20) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/assets/superchain-erc20) -### SuperchainERC20Bridge +This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. +*/} -The `SuperchainERC20Bridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `SuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). -* **Address:** `0x4200000000000000000000000000000000000028` -* **Specs:** [SuperchainERC20Bridge](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) ## Considerations Chain operators will need to run additional infrastructure to be part of the interoperable set. * The Superchain-backend service, [`op-supervisor`](op-supervisor), will be a requirement for running an OP Stack chain that has interop enabled. diff --git a/pages/stack/interop/predeploy.mdx b/pages/stack/interop/predeploy.mdx new file mode 100644 index 000000000..f942cf79c --- /dev/null +++ b/pages/stack/interop/predeploy.mdx @@ -0,0 +1,63 @@ +--- +title: Interoperability predeploys +lang: en-US +description: How it works. +--- + +import { Callout } from 'nextra/components' +import Image from 'next/image' + +import { InteropCallout } from '@/components/WipCallout' + + + +# Interoperability predeploys + +The following predeploys have been added to enable interoperability. +*Predeployed smart contracts* exist at predetermined addresses, coming from the genesis state. +They are similar to [precompiles](https://www.evm.codes/precompiled) but run directly in the EVM instead of running as native code. + +## CrossL2Inbox + +The `CrossL2Inbox` is the system predeploy for cross chain messaging. +Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. + +- **Address:** `0x4200000000000000000000000000000000000022` +- **Specs:** [`CrossL2Inbox`](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) +- **Source code:** [`CrossL2Inbox`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol) + +## L2ToL2CrossDomainMessenger + +The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing. +It is utilized, among other things, for secure transfers ERC20 tokens between L2 chains. +Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding (the executing transaction can only be valid on a single chain). + +- **Address:** `0x4200000000000000000000000000000000000023` +- **Specs:** [`L2ToL2CrossDomainMessenger`](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) +- **Source code:** [`L2ToL2CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) + +## OptimismSuperchainERC20Factory + +`OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge`, and includes a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. + +- **Address:** `0x4200000000000000000000000000000000000026` +- **Specs:** [`OptimismSuperchainERC20Factory`](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) +- **Source code:** [`OptimismSuperchainERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol) + + +## OptimismSuperchainERC20Beacon + +To enable upgrades, `OptimismSuperchainERC20` contracts use [the `BeaconProxy` pattern](https://docs.openzeppelin.com/contracts/3.x/api/proxy#beacon). +This contract is the `Beacon` part, which provides the implementation address for those proxies. + +- **Address:** `0x4200000000000000000000000000000000000027` +- **Specs:** [`OptimismSuperchainERC20Beacon`](https://specs.optimism.io/interop/predeploys.html#beaconcontract) +- **Source code:** [`OptimismSuperchainERC20Beacon`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol) + +## SuperchainTokenBridge + +The `SuperchainTokenBridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `OptimismSuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). + +- **Address:** `0x4200000000000000000000000000000000000028` +- **Specs:** [`SuperchainTokenBridge`](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) +- **Source code:** [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) From 0d02a7cd8730c66c8fc75c5263554ca6d22c1e11 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 3 Jan 2025 09:13:45 +0200 Subject: [PATCH 08/75] WIP --- pages/stack/interop/_meta.json | 3 +- pages/stack/interop/explainer.mdx | 32 ++------ pages/stack/interop/security.mdx | 121 ++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 26 deletions(-) create mode 100644 pages/stack/interop/security.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 403702636..e129806a2 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -6,5 +6,6 @@ "cross-chain-message": "Anatomy of cross-chain message", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", - "assets": "Assets" + "assets": "Assets", + "security": "Security considerations" } \ No newline at end of file diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index f7661d95f..97776be66 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -144,7 +144,10 @@ Interop expands the scope of trust for unsafe blocks, blocks that are shared thr To trust that an unsafe block is valid and is going to become safe and then finalized, you need to trust not only the sequencer that produces it, but also all the other sequencers that produce other blocks that are still unsafe, but that include initiating messages that are executed in that block. However, this is only for *unsafe* blocks, and only if the sequencer allows messages from unsafe blocks to be processed. -A block is only considered promotable to *safe*, and therefore ready to be written to L1, when all the blocks on which it depends are safe. + +In interop, the traditional safe level of is divided into two types of safety. +A block *local safe* once it is written to L1. +But it is only *cross safe* when it and all of the blocks on which it depends (directly or indirectly). For example, in the image above, most blocks are safe. Block `n` in chain `A` is even finalized, and immune from reorgs. @@ -216,32 +219,11 @@ For additional considerations, join the [Interop discussion](https://github.com/ ## FAQs -### What is the latency/security tradeoff? -If a sequencer does not want to trust another sequencer at all, they can choose to only accept executing messages where the initiating message has been finalized with L1 levels of security. This demonstrates the difference in latency vs speed. The L2 data must be submitted to L1 and then the L1 block containing the transaction with the L2 data must be finalized. It takes about 15 minutes for an L1 block to finalize, and higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes. This means that it could take about 20 minutes for an L2 transaction to be considered final and be able to be trustlessly consumed by another chain. At lower latencies, the sequencer accepting the executing message takes on some amount of equivocation risk. It could be possible to build a bonding system to add economic security to prevent equivocation, but that is not in the scope of the first release. - -See this [dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity#submission-frequency) to see how often OP Stack chains submit batches. - -
- -Safe and Unsafe Security Diagram - -### What is stopping a sequencer from censoring a cross-chain message? -There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. - -### What is the weakest link scenario? -Without shared security, there is a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. - -### Are callback style transactions possible? -If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. - -### What is stopping a shared sequencer from including just the executing message and not the initiating message? -The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. - -### What is the trust/verification model? Do sequencers that opt into this interop system have to trust each other fully? -Sequencers only have to trust each other, if they are accepting executing messages where the initiating message is unsafe. This is because the sequencer's ability to equivocate on unsafe data, i.e., batch submit something different from what they gossip over the p2p network. Once data is submitted to L1, it is considered final relative to the L2 and therefore there is no longer an equivocation risk. - ### Is interop different between chains with non-fungible blockspace? Chains that have non-fungible blockspace are chains that have different features - it could be that they use Plasma for data availability, a custom gas paying token or have a large execution gas limit. As long as the chain can be fault proven, it can work with Superchain interoperability. At the application layer, it is important for chains to have legibility into the type of chain that the message originated from. This ensures that applications do not accept messages from chains they consider not secure enough. See this [discussion](https://github.com/ethereum-optimism/specs/issues/121) for additional thoughts. When it comes to chains that have different gas limits that are interoperable, it creates a set of transactions that can execute on one chain but not the other. This happens when the transaction consumes more than the gas limit of the smaller chain but less than of the bigger chain. At 2024 usages levels, these sorts of transactions are very rare. In the future, it may be the case that these transactions become more common, it will be up to the chain operators to ensure quality of service for their users. +### Are callback style transactions possible? +If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. + diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx new file mode 100644 index 000000000..eac1d8ccf --- /dev/null +++ b/pages/stack/interop/security.mdx @@ -0,0 +1,121 @@ +--- +title: Security considerations +lang: en-US +description: What we do to make it safe +--- + +import { Callout } from 'nextra/components' +import Image from 'next/image' + +import { InteropCallout } from '@/components/WipCallout' + + + +# Security considerations + +## The latency/security tradeoff + +### Unsafe initiating messages + +L2 blocks start as unsafe, meaning that there is no L1 evidence for them, and the sequencer for that blockchain can send out incorrect information. +Sending out incorrect information, for example that a certain transaction is included in a block when it isn't, is called *equivocation*. +A sequencer that builds blocks with interop can choose to accept messages from unsafe blocks (received through the gossip protocol), for minimal latency. + +However, because of equivocation risk, a block that is written to L1 (*local safe*) can only be considered truly safe (the techincal term is *cross safe*), once all the source blocks of the messages are written to L1 as well. +The cost of this approach is that the state calculated by the sequencer may not be correct, and it will have to be recalculated if the other sequencer equivocates. + +```mermaid + +sequenceDiagram + actor app as User + participant src as Source Chain + participant dst as Destination Chain + participant l1 as Ethereum Mainnet + src->>dst: Block src_n will have transaction txn_0 that emits log event evt_0 + note over src,dst: Initiating message + app->>dst: Transaction txn_1: If you have evt_0, call contract C with the data in evt_0. + note over app,dst: Executing message + note left of dst: Block dst_m will
have the results of
calling contract C
with the data in evt_0. + break + note over app,l1: time passes + end + src->>l1: Write block src_n without txn_0 (so no evt_0) + l1->>dst: This is the safe block src_n + note left of dst: No evt_0, so txn_1 fails.
The state after dst_m is incorrect
So is the state after dst_m+1, dst_m+2... . + +``` + +### Safe initiating messages + +Alternatively, a sequencer can be configured to only accept executing messages once the initiating message is in a cross safe block (one which is written to L1, and whose own dependencies are all written to L1). +In this case, the source sequencer cannot equivocate, and the state will only need to be recalculated if there is an [L1 reorg](https://www.alchemy.com/overviews/what-is-a-reorg#what-happens-to-reorgs-after-the-merge). +The cost is that it would take longer for a message to pass from one blockchain to the other. +Higher throughput OP Stack chains like Base and OP Mainnet submit a batch about every 5 minutes, so on average it takes about 2.5 minutes for an initiating message to become safe. + +You can use [this dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity#submission-frequency) to see how often OP Stack chains submit batches. + +```mermaid + +sequenceDiagram + actor app as User + participant src as Source Chain + participant dst as Destination Chain + participant l1 as Ethereum Mainnet + src->>dst: Block src_n will have transaction txn_0 that emits log event evt_0 + note over src,dst: Initiating message + app->>dst: Transaction txn_1: If you have evt_0, call contract C with the data in evt_0. + note over app,dst: Executing message + note over dst: Block src_n is not safe yet,
txn_1 fails + break + note over app,l1: time passes + end + src->>l1: Write block src_n with txn_0 + l1->>dst: This is the safe block src_n + app->>dst: Transaction txn_2: If you have evt_0, call contract C with the data in evt_0. + note over app,dst: Executing message + note over dst: Now I have evt_0,
so txn_2 is successful + +``` + +### Finalized initiating messages + +A sequencer can also be configured to reject all executing messages until the initiating message is *finalized*, meaning it is irrevocably on L1 and immune to reorgs. +Currently, this adds [about 15 minutes](https://ethereum.org/en/roadmap/single-slot-finality/) to the message latency. + +
+ +Safe and Unsafe Security Diagram + + + +Even if a sequencer accepts unsafe initiating messages, the blocks it constructs that rely on them cannot be promoted until equivocation is impossible. + + + + +{/* +## What is stopping a sequencer from censoring a cross-chain message? +There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. + +*/} + +## The trust model + +Barring L1 reorgs, there are two ways in which interop can fail. + +- *equivocation* +- *reporting false information* + +## What is the weakest link scenario? + +The information + + + +Without shared security, there is a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. + +## What is stopping a shared sequencer from including just the executing message and not the initiating message? +The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. + +## What is the trust/verification model? Do sequencers that opt into this interop system have to trust each other fully? +Sequencers only have to trust each other, if they are accepting executing messages where the initiating message is unsafe. This is because the sequencer's ability to equivocate on unsafe data, i.e., batch submit something different from what they gossip over the p2p network. Once data is submitted to L1, it is considered final relative to the L2 and therefore there is no longer an equivocation risk. \ No newline at end of file From be3c03652dc35797ba99ca6e9d202acd73adafe5 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Sat, 4 Jan 2025 18:32:16 +0200 Subject: [PATCH 09/75] WIP --- pages/stack/interop/security.mdx | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index eac1d8ccf..32febfde4 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -93,29 +93,24 @@ Even if a sequencer accepts unsafe initiating messages, the blocks it constructs -{/* -## What is stopping a sequencer from censoring a cross-chain message? -There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. - -*/} - ## The trust model Barring L1 reorgs, there are two ways in which interop can fail. -- *equivocation* -- *reporting false information* +- *Equivocation*: A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. + Equivocation is solved by the distinction between blocks that are cross safe (written to L1, along with all of the ones on which the block depends) and those that aren't. +- *Faulty information*: The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. + To save on resources, the operator can choose to query other nodes of the source blockchain. + In that case, the cross-safe blocks depend on the accuracy of the information reported by those nodes. -## What is the weakest link scenario? - -The information +{/* +## What is stopping a sequencer from censoring a cross-chain message? +There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. -Without shared security, there is a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. ## What is stopping a shared sequencer from including just the executing message and not the initiating message? The protocol enforces the fact that all executing messages are valid. It does this by reorganizing out executing messages that have invalid initiating messages. Running software that does not enforce this would be non-standard behavior and would leave yourself at risk of accepting an invalid executing message and therefore running on a forked chain. -## What is the trust/verification model? Do sequencers that opt into this interop system have to trust each other fully? -Sequencers only have to trust each other, if they are accepting executing messages where the initiating message is unsafe. This is because the sequencer's ability to equivocate on unsafe data, i.e., batch submit something different from what they gossip over the p2p network. Once data is submitted to L1, it is considered final relative to the L2 and therefore there is no longer an equivocation risk. \ No newline at end of file +*/} \ No newline at end of file From 120ddf44016f895d6c2fc17b637545201a4bccfa Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Sun, 5 Jan 2025 13:46:00 +0200 Subject: [PATCH 10/75] Updated interop explainer --- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/connectivity.mdx | 31 ++++++++++ pages/stack/interop/cross-chain-message.mdx | 36 ------------ pages/stack/interop/explainer.mdx | 30 ++-------- pages/stack/interop/security.mdx | 65 +++++++++++++++------ 5 files changed, 84 insertions(+), 80 deletions(-) create mode 100644 pages/stack/interop/connectivity.mdx delete mode 100644 pages/stack/interop/cross-chain-message.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index e129806a2..adde4432c 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -3,9 +3,9 @@ "predeploy": "Interop predeploys", "devnet": "Interop devnet", "supersim": "Supersim Multichain Development Environment", - "cross-chain-message": "Anatomy of cross-chain message", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", "assets": "Assets", + "connectivity": "Connectivity considerations", "security": "Security considerations" } \ No newline at end of file diff --git a/pages/stack/interop/connectivity.mdx b/pages/stack/interop/connectivity.mdx new file mode 100644 index 000000000..876cdaa3c --- /dev/null +++ b/pages/stack/interop/connectivity.mdx @@ -0,0 +1,31 @@ +--- +title: Connectivity considerations +lang: en-US +description: What types of connectivity can we support? +--- + +import { Callout } from 'nextra/components' +import Image from 'next/image' + +import { InteropCallout } from '@/components/WipCallout' + + + +# Connectivity considerations + +## Interop between chains with non-fungible blockspace + +Chains that have *non-fungible blockspace* are chains that have different features - for example, chains that use Plasma for data availability, a custom gas paying token, or have a large execution gas limit. +As long as the chain can be fault proven, it can work with Superchain interoperability. +However, at the application layer, it is important for chains to have legibility into the type of chain that the message originated from. +This ensures that applications do not accept messages from chains they consider not secure enough. +See [this discussion](https://github.com/ethereum-optimism/specs/issues/121) for additional thoughts. + +When it comes to chains that have different gas limits that are interoperable, it creates a set of transactions that can execute on one chain but not the other. +This happens when the transaction consumes more than the gas limit of the smaller chain but less than of the bigger chain. At 2024 usages levels, these sorts of transactions are very rare. +In the future, it may be the case that these transactions become more common, it will be up to the chain operators to ensure quality of service for their users. + +## Are callback style transactions possible? + +If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. +This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. \ No newline at end of file diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx deleted file mode 100644 index bd201b6e5..000000000 --- a/pages/stack/interop/cross-chain-message.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Anatomy of a cross-chain message -lang: en-US -description: Learn how cross-chain messaging works with OP Stack interoperability. ---- - -import { Callout } from 'nextra/components' -import Image from 'next/image' - -# Anatomy of a cross-chain message - -A cross-chain message refers to any communication sent using Superchain interop. This includes messages sent between different chains within an interop cluster, as well as messages sent on a single chain for interoperable. This functionality enables asset transfers that utilize the [SuperchainERC20](superchain-erc20) token standard. - -## How it works - -To send a cross-chain message on the Superchain using [Superchain interoperability](explainer), these two aspects must be in place: - -1. Each interoperable chain runs a verifying node for each chain in the interoperable set. -2. Each cross-chain message has an **initiating transaction** on the source chain and a **finalizing transaction** on the destination chain. - * **First/initiating transaction:** is submitted to the source chain and emits an event that can be consumed on a destination chain. - * **Second/finalizing transaction:** is submitted to a destination chain, where the block builder should only include it if certain that the first transaction was included in the source chain. The block builder can use OP-Supervisor to determine the integrity of the initiating message. Anyone can submit the second transaction. - - There is no strict requirement that the executing message is ever submitted. See the specs for details on tracing the [executing message event](https://specs.optimism.io/interop/predeploys.html#executingmessage-event). - - -
- -Anatomy of Cross-Chain Message with Interop - -In the example above, `Ox123` sends 1 OP from OP Mainnet to Base, but this applies to any asset using the SuperchainERC20 token standard. - -## Next steps - -* More questions? Check out the FAQ section in the [Superchain Interop Explainer](explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. -* For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 97776be66..105b61709 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -29,7 +29,7 @@ Interoperability provides the following benefits: ## Interoperability architecture -An OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks. +A pre-interop OP Stack node consists of two pieces of software: a consensus client (e.g. op-node) and an execution client, which is responsible for processing user transactions and constructing blocks (e.g. op-geth). Interoperability among OP Stack chains is enabled via a new service called [*OP Supervisor*](/stack/interop/op-supervisor). Every node operator is expected to run this service in addition to the [rollup node](/builders/node-operators/architecture#rollup-node) and [execution client](/builders/node-operators/architecture#execution-client). @@ -147,7 +147,7 @@ However, this is only for *unsafe* blocks, and only if the sequencer allows mess In interop, the traditional safe level of is divided into two types of safety. A block *local safe* once it is written to L1. -But it is only *cross safe* when it and all of the blocks on which it depends (directly or indirectly). +But it is only *cross safe* when in addition to the block itself all of the blocks on which it depends (directly or indirectly) are written to L1, including the dependencies of previous blocks in the same chain. For example, in the image above, most blocks are safe. Block `n` in chain `A` is even finalized, and immune from reorgs. @@ -201,29 +201,9 @@ Superchain interop includes both the protocol layer message passing and the Supe This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. */} - -## Considerations -Chain operators will need to run additional infrastructure to be part of the interoperable set. -* The Superchain-backend service, [`op-supervisor`](op-supervisor), will be a requirement for running an OP Stack chain that has interop enabled. -`op-supervisor` is responsible for validating all cross-chain messages and will need to have an RPC configured for each chain in the dependency set. -* In the future, to reduce infrastructure costs, `op-supervisor` will rely on the P2P network and cryptographic schemes for validating cross-chain messages. - - -For additional considerations, join the [Interop discussion](https://github.com/ethereum-optimism/specs/discussions/128) in our specs repo. - - ## Next steps -* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). - -## FAQs - -### Is interop different between chains with non-fungible blockspace? -Chains that have non-fungible blockspace are chains that have different features - it could be that they use Plasma for data availability, a custom gas paying token or have a large execution gas limit. As long as the chain can be fault proven, it can work with Superchain interoperability. At the application layer, it is important for chains to have legibility into the type of chain that the message originated from. This ensures that applications do not accept messages from chains they consider not secure enough. See this [discussion](https://github.com/ethereum-optimism/specs/issues/121) for additional thoughts. - -When it comes to chains that have different gas limits that are interoperable, it creates a set of transactions that can execute on one chain but not the other. This happens when the transaction consumes more than the gas limit of the smaller chain but less than of the bigger chain. At 2024 usages levels, these sorts of transactions are very rare. In the future, it may be the case that these transactions become more common, it will be up to the chain operators to ensure quality of service for their users. +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). -### Are callback style transactions possible? -If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. diff --git a/pages/stack/interop/security.mdx b/pages/stack/interop/security.mdx index 32febfde4..a31235893 100644 --- a/pages/stack/interop/security.mdx +++ b/pages/stack/interop/security.mdx @@ -13,16 +13,55 @@ import { InteropCallout } from '@/components/WipCallout' # Security considerations +## The trust model + +Barring L1 reorgs, there are two ways in which interop can fail. + +- *Equivocation*. A sequencer publishes a block using the gossip protocol that is different from the one that eventually gets written to L1. + Equivocation is solved by the distinction between blocks that are cross safe (written to L1, along with all of the ones on which the block depends) and those that aren't. +- *Faulty information*. The sequencer operator can run a verifier node for every chain in the dependency set, in which case it can deduce the initiating messages from the safe transactions of every chain. + To save on resources, the sequencer can choose to query existing nodes of the source blockchain. + In that case, if the information provided to sequencer is incorrect, of course the blocks posted by the sequencer will be also incorrect. + + Note that in this case the blocks posted by the sequencer will be invalid, and other verifiers will be able to see they are invalid and replace them with *deposit only* blocks. + +