From c3e020c59ae90335caf76c84f7a1163c9f126cbe Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:41:40 -0500 Subject: [PATCH 01/75] Re-adding Inside Arbitrum Nitro; and original images - reformatted --- .../01-inside-arbitrum-nitro.mdx | 678 ++++++++++++++++++ static/img/haw-eds-napkin-drawing.png | Bin 0 -> 488955 bytes static/img/haw-geth-sandwich.svg | 8 +- static/img/haw-malicious-rollup-chain.svg | 10 + static/img/haw-normal-rollup-chain.svg | 10 + static/img/haw-rollup-challenges.svg | 10 + static/img/haw-transaction-lifecycle.svg | 8 +- 7 files changed, 716 insertions(+), 8 deletions(-) create mode 100644 docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx create mode 100644 static/img/haw-eds-napkin-drawing.png create mode 100755 static/img/haw-malicious-rollup-chain.svg create mode 100755 static/img/haw-normal-rollup-chain.svg create mode 100755 static/img/haw-rollup-challenges.svg diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx new file mode 100644 index 0000000000..61fd9bb4ad --- /dev/null +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -0,0 +1,678 @@ +--- +title: 'Inside Arbitrum Nitro' +description: 'Learn the fundamentals of the Arbitrum Nitro stack.' +author: pete-vielhaber +sme: edfelten +user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. +content_type: get-started +--- + +import ImageWithCaption from '@site/src/components/ImageCaptions/'; + +This document is a deep-dive explanation of Arbitrum Nitro's design and the rationale for it. This isn't API documentation, nor is it a guided tour of the code - look elsewhere for those. "Inside Arbitrum Nitro" is for people who want to understand Nitro's design. + +The body of this document will describe Arbitrum Rollup, this primary use case of the Nitro technology and the one used on the Arbitrum One chain. This is a variant use case, called AnyTrust, which is used by the Arbitrum Nova chain. AnyTrust is covered by a section at the end of this document. + +## Why use Arbitrum? Why use Nitro? + +Arbitrum is an L2 scaling solution for Ethereum, offering a unique combination of benefits: + +- **Trustless security**: security rooted in Ethereum, with any one party able to ensure correct Layer 2 results +- **Compatability with Ethereum**: able to run unmodified EVM contracts and unmodified Ethereum transactions +- **Scalability**: moving contracts' computation and storage off of the main Ethereum chain, allowing much higher throughput +- **Minimum cost**: designed and engineered to minimize the L1 gas footprint of the system, minimizing per-transaction cost + +Some other Layer 2 systems provide some of these features, but to our knowledge no other system offers the same combination of features at the same cost. + +Nitro is a major upgrade to Arbitrum, improving over "classic" Arbitrum in several ways: + +- **Advanced Calldata Compression**, which further drives down transaction costs on Arbitrum by reducing the amount of data posted to L1. +- **Separate Contexts for Common Execution and Fault Proving**, increasing the performance of L1 nodes, and thus offering lower fees. +- **Ethereum L1 Gas Compatability**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. +- **Additional L1 Interoperability**, including tighter synchronization with L1 block numbers, and full support for all Ethereum L1 precompiles. +- **Safe retryables**, eliminating the failure mode where a retryable ticket fails to get created. +- **Geth Tracing**, for even broader debugging support. +- Any many, many more changes. + +## The Big Picture + +At the most basic level, an Arbitrum chain works like this: + + + +People and contracts put messages into the inbox. The chain reads the messages one at a time, and processes each one. This updates the state of the chain and produces some outputs. + +If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then the chain will see your transaction, execute it, and produce some outputs: a transaction receipt, and any withdrawals that your transaction initiated. + +Execution is deterministic - which means that the chain's behavior is uniquely determined by the contents of its inbox. Because of this, the result of your transaction is knowable as soon as your transaction has been put in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) + +All of the technical details in this document is connected to this diagram. To get from this diagram to a full description of Arbitrum, we'll need to answer questions like these: + +- Who keeps track of the inbox, chain state, and outputs? +- How does Arbitrum make sure that the chain state and ouputs are correct? +- How can Ethereum users and contracts interact with Arbitrum? +- How does Arbitrum support Ethereum-compatible contracts and transactions? +- How are `ETH` and tokens transferred into and out of Arbitrum chains, and how are they managed while on chain? +- How can I run my own Arbitrum node or validator? + +## Nitro's Design: The Four Big Ideas + +The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a very quick summary of each, then we'll unpack in more detail in later sections. + +- **Sequencing, Followed by Deterministic Execution**: Nitro processes transactions with a two-phase strategy. First, the transactions are organized into a single ordered sequence, and Nitro commits to that sequence. Then the transactions are processed, in that sequence, by a deterministic state transition function. +- **Geth at the Core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatability with Ethereum. +- **Separate Execution from Proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. +- **Optimistic Rollup with Interactive Fraud Proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an optimistic rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. + +## Sequencing, Followed by Deterministic Execution + +This diagram summarizes how transactions are processed in Nitro. + + + +Let's follow a user's transaction through this process. + +First, the user creates a transaction, uses their wallet to sign it, and sends it to the Nitro chain's Sequencer. The Sequencer's job, as its name implies, is to take the arriving transactions, put them into an ordered sequence, and publishes that sequence. + +Once the transactions are sequenced, they are run through the _state transition function_, one by one, in order. The state transition function takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. + +Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the state transition function will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions so the state transition function never sees them - and this reduces cost and therefore keeps transactions fees low - but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) + + + +The state transition function is deterministic, which means that its behavior depends only on the current state and the contents of the next transaction - and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. + +It follows that anyone who knows the transaction sequence can computate the state transition function for themselves - and all honest parties who do this are guaranteed to get identical results. This is the normal way that Nitro nodes operate: get the transaction sequence, and run the state transition function locally. No consensus mechanism is needed for this. + +## How the Sequencer Publishes the Sequence + +So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed, and batches posted on L1 Ethereum. + +The real-time feed is published by the Sequencer so that anyone who subscribes to the feed receives instant notifications of each transaction as it is sequenced. Nitro nodes can subscribe to the feed directly from the Sequencer, or through a relay that fowards the feed. The feed represents the Sequencer's promise that it will record transactions in a particular order. If the Sequencer is honest and doesn't have a long downtime, this promise will be kept. So anyone who trusts the Sequencer to keep its promises can rely on the feed to get instant information about the transaction sequence - and they can run the sequenced transactions through the state transition function to learn the results of each transaction immediately. This is "soft finality" for transactions; it's "soft" because it depends on the Sequencer keeping its promises. + +The Sequencer also publishes its sequence on the L1 Ethereum chain. Periodically - perhaps every few minutes in production - the Sequencer concatenates the next group of transactions is the feed, compresses them for efficiency, and posts the result as calldata on Ethereum. This is the final and official record of the transaction sequence. As soon as this Ethereum transaction has finality on Ethereum, the Layer 2 Nitro transactions it records will have finality. These transactions are final because their position in the sequence has finality, and the outcome of the transactions is deterministic and knowable to any party. This is "hard finality." + +The Sequencer's batches are compressed using a general-purpose data compression algorithm called "Brotli", on its highest-compression setting. + + + +## Geth at the Core + +The second key design idea in Nitro is "Geth at the Core." Here "Geth" refers to go-ethereum, the most common node software for Ethereum. As its name would suggest, go-ethereum is written in the Go programming language, as is almost all of Nitro. + + + +The software that makes up a Nitro node can be thought of as built in three main layers, which are shown above: + +- The base layer is the core of Geth - the parts of Geth that emulate the execution of EVM contracts and maintain the data structures that make up the Ethereum state. Nitro compiles in this code as a library, with a few minor modifications to add necessary hooks. +- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decomopressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll dig in to the details of ArbOS below. +- The top layer consists of node software, mostly drawn from Geth. This handles connections are incoming RPC requests from clients and provides the other top-level functionality required to operate an Ethereum-compatible blockchain node. + +Because the top and bottom layers rely heavily on code from Geth, this structure has been dubbed a "Geth sandwich." Strictly speaking, Geth plays the role of the bread in the sandwich, and ArbOS is the filling, but this sandwich is named for the bread. + +The State Transition Function consists of the bottom Geth layer, and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox, and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and at the end will emit the header of a new block (in Ethereum's block header format) which will be appended to the Nitro chain. + + + +## Separating Execution from Proving + +One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary exectuion, versus being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, abut compiling it to different targets for the two cases. + +When compiling the Nitro node software for _execution_, the ordinary Go compiler is used, producing native code for the target architecture, which of course will be different for different node deployments. (The node software is distributed in source code form, and as a Docker image containing a compiled binary.) + +Separately, for _proving_, the portion of the code that is the State Transition Function is compiled by the Go compiled to WebAssembly (WASM), which is a typed, portable machine code format. The WASM code then goes through a simple transaction into a format we call WAVM, which is detailed below. If there is a dispute about the correct result of computing the STF, it is resolved with a reference to the WAVM code. + + + +### WAVM + +The WASM format has many features that make it a good vehicle for fraud proofs - it is portable, structured, well-specified, and has reasonably good tools and support - but it needs a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. + +WAVM differs from WASM in three main ways. First, WAVM removes some features of WASM that are not generated by the Go compiler; the transformation phase verifies that these features are not present. + +Second, WAVM restricts a few features of WASM. For example, WAVM does not contain floating-point instructions, so the transformer replaces floating-point instructions with calls to the Berekeley SoftFloat library. (We use software floating-point to reduce the risk of floating-point incompatibilities between architectures. The core Nitro functions never use floating-point, but the Go runtime does use some floating-point operations.) WAVM does not contain nested control flow, so the transformer flattens control flow constructs, turning control flow instructions into jumps. Some WASM instructions take a variable amount of time to execute, which we avoid in WAVM by transforming them into constructs using fixed cost instructions. These transformations simplify proving. + +Third, WAVM adds a few opcodes to enable interaction with the blockchain environment. For example, new instructions allow the WAVM code to read and write the chain's global state, to get the next message from the chain's inbox, or to signal a successful end to executing the State Transition Function. + +### ReadPreImage and the Hash Oracle Trick + +The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zer ofi `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions can only be used in a context where the preimage is publicly known, and where the size of the preimage is known to be less than a fixed upper bound of about 110 kbytes. + +(In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest part, assuming that the full history of the L1 Ethereum chain is available. For convenience, a hash preimage can also be supplied by a third party such as a public server, and the correctness of the supplied value is easily verified.) + +As an example, the state of a Nitro chain is maintained in Ethereum's state tree format, which is organized as a Merkle tree. Nodes of the tree are stored in a database, indexed by the Merkle hash of the node. In Nitro, the state tree is kept outside of the State Transition Function's storage, with the STF only knowing the root hash of the tree. Given the hash of a tree node, the STF can recover the tree node's contents by using `ReadPreImage`, relying on the fact that the full contents of the tree are publicly known and that nodes in the Ethereum state tree will always be smaller than the upper bound on preimage size. In this manner, the STF is able to arbitrarily read and write to the state tree, despite only storing its root hash. + +The only other use of `ReadPreImage` is to fetch the contents of recent L2 block headers, given the header hash. This is safe because the block headers are publicly known and have bounded size. + +This "Hash Oracle Trick" of storing the Merkle hash of a data structure, and relying on protocol participants to store the full structure and thereby support fetch-by-hash of the contents, goes back to the original Arbitrum design. + +## Optimistic Rollup + +Arbitrum is an optimistic rollup. Let's unpack that term. + +_Rollup_ +Arbitrum is a rollup, which means that the inputs to the chain - the messages that are put into the inbox - are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they would need to determine the current correct state of the chain - they have the full history of the inbox, and the results are uniquely determined by the inbox history, so they can reconstruct the state of the chain based only on public information, if needed. + +This also allows anyone to be a full participant in the Arbitrum protocol, to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. + +_Optimistic_ +Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by letting any party (a "validator") post on Layer 1 a rollup block that that party claims is correct, and then giving everyone else a chance to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will take part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if there's some collusion going on.) + +Because a party who tries to cheat will lose a deposit, attempts to cheat should be very rare, and the normal case will be a single party posting a correct rollup block, and nobody challenging it. + +### Resolving disputes using interactive fraud proofs + +Among optimistic rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a certain result, and Bob disagrees. How will the protocol decide which version to accept? + +There are basically two choices: interactive proving, or re-executing transactions. Arbitrum uses interactive proving, which we believe is more efficient and more flexible. Much of the design of Arbitrum follows from this fact. + +### Interactive proving + +The idea of interactive proving is that Alice and Bob will engage in a back-and-forth protocol, refereed by an L1 contract, to resolve their dispute with minimal work required from any L1 contract. + +Arbitrum's approach is based on dissection of the dispute. If Alice's cliam covers `N` steps of execution, she posts two claims of size `N/2` which combine to yield her initial `N-step` claim, then Bob picks one of Alice's `N/2-step` claims to challenge. Now the size of the dispute has been cut in half. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute is narrowed down to a single step that the L1 referee needs to resolve the dispute by looking at what the instruction actually does and whether Alice's claim about it is correct. + +The key principle behind interactive proving is that if Alice and Bob are in a dispute, Alice and Bob should do as much off-chain work as possible needed to resolve their dispute, rather than putting that work onto an L1 contract. + +### Re-executing transactions + +The alternative to interactive proving would be to have a rollup block contain a claimed machine stat ehash after every individual transaction. Then in case of a dispute, the L1 referee would emulate the execution of an entire transaction, to see whether the outcome matches Alice's claim. + +### Why interactive proving is better + +We belive strongly that interactive proving is the superior approach, for the following reasons. + +- **More efficient in the optimistic case**: Because interactive proving can resolve disputes that are larger than one transaction, it can allow a rollup block to contain only a single claim about the end state of the chain after all of the execution covered by the block. By contrast, re-execution requires posting a state claim for each transaction within the rollup block. With hundreds or thousands of transactions per rollup block, this is a substantial difference in L1 footprint - and L1 footprint is the main component of cost. +- **More efficient in the pessimistic case**: In case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that ALice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims - Bob does that, off-chain.) Only one instructions needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. +- **Higher per-transaction gas limit**: Interactive proving can escape from Ethereum's tight per-transaction gas limit. The gas limit isn't infinite, for obvious reasons, but it can be larger than on Ethereum. As far as Ethereum is concerned, the only downside of a gas-heavy Arbitrum transaction is that it may require an interactive fraud proof with slightly more steps (and only if indeed it is fraudulent). By contrast, re-execution of the transaction (which is more expensive than executing it directly) within a single Ethereum transaction. +- **More implementation flexibility**: Interactive proving allows more flexibility in implementation. All that is necessary is the ability to verify a one-step proof on Ethereum. By contrast, re-execution approaches are tethered to limitations of the EVM. + +### Interactive proving drives the design of Arbitrum + +Much of the design of Arbitrum is driven by the opportunities opened up by interactive proving. If you're reading about some feature of Arbitrum, and you're wondering why it exists, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why questions" about Arbitrum relate to interactive proving. + + + +## Arbitrum Rollup Protocol + +Before diving into the rollup protocol, there are two things we need to cover. + +First, _if you're an Arbitrum user or developer, you don't need to understand the rollup protocol_. You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working, but you don't spend your time monitoring it or studying its internals. + +You're welcome to study, observe, and even participate in the rollup protocol, but you don't need to, and most people won't. So if you're a typical train passenger who just wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! + +The second thing to understand about the rollup protocol is that _the protocol doesn't decide the tresults of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is done. The role of the rollup protocol is to confirm transaction results that, as far as Arbitrum users are concerned, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) + +You might wonder why we need the rollup protocol. If everyone knows the results of transactions already, why bother confirming them? The rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The whole point of a Layer 2 scaling system is to run transactions without Ethereum needing to do all of the work - and indeed Arbitrum can go fast enough that Ethereum couldn't hope to monitor every Arbitrum transaction. But once a result is confirmed, Ethereum knows about it and can rely on it, enabling operations on Ethereum such as processing withdrawals of funds from Nitro back to L1. + +With those preliminaries behind us, let's jump into the details of the rollup protocol. + +The parties who participate in the protocol are called _validators_. Some validators will choose to be stakers - they will place an `ETH` deposit which they'll be able to recover if they're not caught cheating. In the common case, it's expected that only one validator will be staked, since as long as it's staked on the current outcome, and there are no conflicting claims, there's no need for other parties to stake / take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/stakers are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any on-chain actions, can be run permissionlessly (see "validators" below). + +The key security property of the rollup protocol is that any one honest validator can force the correct execution of the chain to be confirmed. This means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire) can force your transactions to be processed correctly. And that is true no matter how many malicious people are trying to stop you. + +## The Rollup Chain + +The rollup protocol tracks a chain of rollup blocks - we'll call these "RBlocks" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of RBlocks as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. + +Validators can propose RBlocks. New RBlocks will be _unresolved_ at first. Eventually every RBlock will be _resolved_, by being either _confirmed_ or _rejected_. The confirmed RBlocks make up the confirmed history of the chain. + +Each RBlock contains: + +- the RBlock number +- the predecessor RBlock number: RBlock number of the last RBlock before this one that is (claimed to be) correct +- the number of L2 blocks that have been created in the chain's history +- the number of inbox messages have been consumed in the chain's history +- a hash of the outputs produced over the chain's history + +Except for the RBlock number, the contents of the RBlock are all just claims by the RBlock's proposer. Arbitrum doesn't know at first whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the RBlock. If one or more of these fields are incorrect, the protocol should eventually reject the RBlock. + +An RBlock is implicitly claiming that its predecessor RBlock is correct. This implies, transitively, that an RBlock implicitly claims the correctness of a complete history of the chain: a sequence of ancestor RBlock that reaches all the way back to the birth of the chain. + +An RBlock is also implicitly claiming that its older siblings (older RBlocks with the same predecessor), if there are any, are incorrect. If two RBlocks are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. + +The RBlock is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an RBlock is correct, you don't need to do anything. If you disagree with an RBlock, you can post another RBlock with a different result, and you'll probably end up in a challenge against the first RBlock's staker. (More on challenges below.) + +In the normal case, the rollup chain will look like this: + + + +On the left, representing an earlier part of the chain's history, we have confirmed RBlocks. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed RBlocks, RBlock 94, is called the "latest confirmed RBlock." On the right, we see a set of newer proposed RBlocks. The protocol can't yet confirm or reject them, because their deadlines haven't run out yet. The oldest RBlock whose fate has yet to be determined RBlock 95, is called the "first unresolved RBlock." + +Notice that a proposed RBlock can build on an earlier proposed RBlock. This allows validators to continue proposing RBlocks without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed RBlocks will be valid, so they will all eventually be accepted. + +Here's another example of what the chain state might look like, if several validators are being malicious. It's a contrived example, designed to illustrate a variety of cases that can come up in the protocol, all smashed into a single scenario. + + + +There's a lot going on here, so let's unpack it. + +- RBlock 100 has been confirmed +- RBlock 101 claimed to be a correct successor to RBlock 100, but 101 was rejected (hence the X drawn in it) +- RBlock 102 was eventually confirmed as the correct successor to 100 +- RBlock 103 was confirmed and is now the latest confirmed RBlock +- RBlock 104 was proposed as a successor to RBlock 103, and 105 was proposed as a successor to 104. 104 was rejected as incorrect, and as a consequence 105 was rejected because its predecessor was rejected +- RBlock 106 is unresolved. It claims to be a correct successor to RBlock 103 but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved RBlock +- RBlocks 107 and 108 claim to chain from 106. They are also unresolved. If 106 is rejected, they will be automatically rejected too +- RBlock 109 disagrees with RBlock 106, because they both claim the same predecessor. At least one of them will eventually be rejected, but the protocol hasn't yet resolved them. +- RBlock 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will be automatically rejected too. +- RBlock 111 claims to follow 104. 111 will inevitably be rejected because its predecessor has already been rejected. But it hasn't been rejected yet, because the protocol resolves RBlocks in RBlock number order, so the protocol will have to resolve 106 through 110, in order, before it can resolve 111. After 110 has been resolved, 111 can be rejected immediately. + +Again: this sort of thing is very unlikely in practice. In this diagram, at least four parties must have staked on wrong RBlocks, adn when the dust settles at least four parties will have lost their stakes. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram is designed to illustrate the variety of situations that are possible in principle, and how the protocol would deal with them. + +### Staking + +At any given time, some validators will be stakers, and some will not. Stakers deposit funds that are held by the Arbitrum Layer 1 contracts and will be confiscated if the staker loses a challenge. Nitro chains accept stakes in `ETH`. + +A single stake can cover a chain of RBlocks. Every staker is staked on the lastest confirmed RBlock; and if you're staked on an RBlock, you can also stake on one successor of that RBlock. So you might be staked on a sequence of RBlocks that represent a single coherent claim about the correct history of the chain. A single stake suffices to commit you to that sequence of RBlocks. + +In order to create a new RBlock, you must be a staker, and you must already be staked on the predecessor of the new RBlock you're creating. The stake requirement for RBlock creation ensures that anyone who creates a new RBlock has something to lose if that RBlock is eventually rejected. + +The protocol keeps track of the current required stake amount. Normally this will equal the base stake amount, which is a parameter of the Nitro chain. But if the chain has been slow to make progress lately, the required stake will increase, as described in more detail below. + +The rules for staking are as follows: + +- If you're not staked, you can stake on the latest confirmed RBlock. When doing this, you deposit the current minimum stake amount. +- If you're staked on an RBlock, you can also add your stake to any one successor of that RBlock. (The protocol tracks the maximum RBlock number you're staked on, and let's you add your stake to any successor of that RBlock, updating your maximum to that successor.) This doesn't require you to place a new stake. + - A special case of adding your stake to a successor RBlock is when you create a new RBlock as a successor to an RBlock you're already staked on. +- If you're staked only on the latest confirmed RBlock (and possibly earlier RBlocks), you or anyone else can ask to have your stake refunded. Your staked funds will be returned to you, and you will no longer be a staker. +- If you lose a challenge, your stake is removed from all RBlocks and you forfeit your staked funds. + +Notice that once you are staked on an RBlock, there is no way to unstake. You are committed to that RBlock. Eventually one of two things will happen: that RBlock will be confirmed, or you will lose your stake. The only way to get your stake back is to wait until all of the RBlocks you are staked on are confirmed. + +#### Setting the current minimum stake amount + +One detail we deferred earlier is how the current minimum stake amount is set. Normally, this is just equal to the base stake amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming RBlocks, the stake requirement will escalate temporarily. Specifically, the base stake amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved RBlock passed. This ensures that if malicious parties are placing false stakes to try to delay progress (despite the fact that they're losing those stakes), the stake requirement goes up so that the cost of such a delay attack increases exponentially. As RBlock resolution starts advancing again, the stake requirement will go back down. + +### Rules for Confirming or Rejecting RBlocks + +The rules for resolving RBlocks are fairly simple. +The first unresolved RBlock can be confirmed if: + +- the RBlock's predecessor is the latest confrimed RBlock, and +- the RBlock's deadline has passed, and +- there is at least one staker, and +- all stakers are staked on the RBlock + +The first unresolved RBlock can be rejected if: + +- the RBlock's predecessor has been rejected, or +- all the following are true: + - the RBlock's deadline has passed, and + - there is at least one staker, and + - no staker is staked on the RBlock + +A consequence of these rules is that once the first unresolved RBlock's deadline has passed (and assuming there is at least one staker staked on something other than the latest confirmed RBlock), the only way the RBlock can be unresolvable is if at least one staker is staked on it and at least one staker is staked on a different RBlock with the same predecessor. If this happens, the two stakers are disagreeing about which RBlock is correct. It's time for a challenge, to resolve the disagreement. + + + +### Challenges + +Suppose the rollup chain looks like this: + + + +RBlocks 93 and 95 are siblings (they both have 92 as predecessor). Alice is staked on 93 and Bob is staked on 95. + +At this point we know that Alice and Bob disagree about the correctness of RBlock 93, with Alice committed to 93 being correct and Bob committed to 93 being incorrect. (Bob is staked on 95, and 95 implicitly claims that 92 is the last correct RBlock before it, which implies that 93 must be incorrect.) + +Whenever two stakers are staked on sibling RBlocks, and neither of those stakers is already in a challenge, anyone can start a challenge between the two. The rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's stake. The loser will be removed as a staker. + +The challenge is a game in which Alice and Bob alternate moves, with an Ethereum contract as the referee. Alice, the defender, moves first. + +The game will operate in two phases: dissection, followed by a one-step proof. Dissection will narrow down the size of the dispute until it is a dispute about just one instruction of execution. Then the one-step proof will determine who is right about that one instruction. + +We'll describe the dissection part of the protocol twice. First, we'll give a simplified version which is easier to understand but less efficient. Then we'll describe how the real version differs from the simplified one. + +### Dissection Protocol: Simplified Version + +Alice is defending the claim that starting with the state in the predecessor RBlock, the state of the Virtual Machine can advance to the state specified in RBlock A. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that that execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. + +Alice's first move requires her to dissect her claims about intermediate states between the beginning (0 instructions executed) and the end (`N` instructions executed). So we require Alice to divide her claim in half, and post the state at the half-way point, after `N/2` instructions have been executed. + +Now Alice has effectively bisected her `N-step` assertion into two (`N/2`)-step assertions. Bob has to point to one of those two half-size assertions and claim it is wrong. + +At this point we're effectively back in the original situation: Alice having made an assertion that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must make a one-step proof which will be checked by the EthBridge. + +### Why Dissection Correctly Identifies a Cheater + +Before talking about the complexities of the real challenge protocol, let's stop to understand why the simplified version of the protocol is correct. Here correctness means two things: (1) if Alice's initial claim is correct, Alice can always win the challenge, and (2) if Alice's initial claim is incorrect, Bob can always win the challenge. + +To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending a correct claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove, so that claim will be provable and Alice can win the challenge. + +To prove (2), observe that if Alice's initial claim is incorrect, this can only be because her claimed endpoint after `N` steps is incorrect. Now when Alice offers her midpoint state claim, that midpoint claim is either correct or incorrect. If it's incorrect, then Bob can challenge Alice's first-half claim, which will be incorrect. If Alice's midpoint state claim is correct, then her second-half claim must be incorrect, so Bob can challenge that. So whatever Alice does, Bob will be able to challenge an incorrect half-size claim. At each stage of the protocol, Bob can identify an incorrect claim to challenge. At the end, Alice will have an incorrect one-step claim to prove, which she will be unable to do, so Bob can win the challenge. + +(If you're a stickler for mathematical precision, it should be clear how these arguments can be turned into proofs by induction on `N`.) + +### The Real Dissection Protocol + +The real dissection protocol is conceptually similar to the simplified one described above, but with several changes that improve efficiency or deal with necessary corner cases. Here is a list of the differences. + +- **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an RBlock, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute transforms into a dispute about a single execution of the State Transition Function or in other words about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). +- **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This requires posting `K-1` intermediate claims, at points evenly spaced through the claimed execution. This reduces the number of rounds by a factor of log(`K`)/log(`2`). +- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in a challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This reduces the number of moves in the game by an additional factor of 2, because the size is cut by a factor of `K` for every move, rather than for every two moves. +- **Deal With The Empty-Inbox Case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might half, or it might have to wait because its inbox is exhausted so it can't go on until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (but not the initial claim) to claim a special end state that means essentially that the specified amount of execution is not possible under the current conditions. +- **Time Limits**: Each player is given a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Think of the time allowance as being about a week. + +It should be clear that these changes don't affect the basic correctness of the challenge protocol. They do, however, improve its efficiency and enable it to handle all of the cases that can come up in practice. + +### Efficiency + +The challenge protocol is designed so that the dispute can be resolved with a minimum of work required by the protocol (via its Layer 1 Ethereum contracts) in its role as referee. When it is Alice's move, the protocol only needs to keep track of the time Alice uses, and ensure that her move does include `K-1` intermediate points as required. The protocol doesn't need to pay attention to whether those claims are correct in any way; it only needs to know whether Alice's move "has the right shape." + +The only point where the protocol needs to evaluate a move "on the merits" is at the one-step proof, where it needs to look at Alice's proof and determine whether the proof that was provided does indeed establish that the virtual machine moves from the before state to the claimed after state after one step of computation. + + + +## Validators + +Some Arbitrum nodes will choose to act as _validators_. This means that they watch the progress of the rollup protocol and participate in that protocol to advance the state of the chain securely. + +Not all nodes will choose to do this. Because the rollup protocol doesn't decide what the chain will do but merely confirms the correct behavior that is fully determined by the inbox messages, a node can ignore the rollup protocol and simply compute for itself the correct behavior. For more on what such nodes might do, see the Full Nodes section. + +Offchain Labs provides open source validator software, including a pre-built Docker image. + +Every validator can choose their own approach, but we expect validators to follow three common strategies: + +- The _active validator_ strategy tries to advance the state of the chain by proposing new RBlocks. An active validator is always staked, because creating an RBlock requires being staked. A chain really only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. +- The _defensive validator_ strategy watches the rollup protocol operate. If only correct RBlocks are proposed, this strategy doesn't stake. But if an incorrect RBlock is proposed, this strategy intervenes by posting a correct RBlock or staking on a correct RBlock that another party has posted. This strategy avoids staking when things are going well, but if someone is dishonest it stakes in order to defend the correct outcome. +- The _watchtower validator_ strategy never stakes. It simply watches the rollup protocol and if an incorrect RBlock is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to stake will be willing to intervene in order to take some of the dishonest proposer's stake, and that that can happen before the dishonest RBlock's deadline expires. (In practice this will allow several days for a response.) + +Under normal conditions, validators using the defensive and watchtower strategies won't do anything except observe. A malicious actor who is considering whether to try cheating won't be able to tell how many defensive and watchtower validators are operating incognito. Perhaps some defensive validators will announce themselves, but others probably won't, so a would-be attacker will always have to worry that defenders are waiting to emerge. + +The underlying protocol supports permissionless validation, i.e., anyone can do it. Currently on Arbitrum One, validators that require stake (i.e., active and defensive validators) are whitelisted; see State of Progressive Decentralization. + +Who will be validators? Anyone will be able to do it, but most people will choose not to. In practice we expect people to validate a chain for several reasons. + +- Validators could be paid for their work, by the party that created the chain or someone else. A chain could be configured such that a portion of the funds from user transaction fees are paid directly to validators. +- Parties who have significant assets at stake on a chain, such as dApp developers, exchanges, power-users, and liquidity providers, may choose to validate in order to protect their investment. +- Anyone who chooses to validate can do so. Some users will probably choose to validate in order to protect their own interests or just to be good citizens. But ordinary users don't need to validate, and we expect that the vast majority of users won't. + +## ArbOS + +ArbOS is a trusted "system glue" component that runs at Layer 2 as part of the State Transition Function. ArbOS provides functions needed for a Layer 2 system, such as cross-chain communication, resource accounting and Layer 2 related fee economics, and chain management. + +### Why ArbOS? + +In Arbitrum, much of the work that would otherwise have to be done expensively at Layer 1 is instead done by ArbOS, trustlessly performing these functions at the speed and low cost of Layer 2. + +Supporting these functions in Layer 2 trusted software, rather than building them in to the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. Having a trusted operating system at Layer 2 also has significant advantages in flexibility, because Layer 2 code is easier to evolve, or to customize for a particular chain, then a Layer-1 enforced architecture would be. + +## Full Nodes + +As the name suggests, full nodes in Arbitrum play the same role that full nodes play in Ethereum: they know the state of the chain and they provide an API that others can use to interact with the chain. + +Arbitrum full nodes normally "live at Layer 2" which means that they don't worry about the rollup protocol but simply treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. + +## The Sequencer + +The Sequencer is a specially designated full node, which is given limited power to control the ordering of transactions. This allows the Sequencer to guarantee the results of user transactions immediately, without needing to wait for anything to happen on Ethereum. So no need to wait five minutes or so for block confirmations - and no need to even wait 15 seconds for Ethereum to make a block. + +Clients interact with the Sequencer in exactly the same way they would interact with any full node, for example by giving their wallet software a network URL that happens to point to the Sequencer. + +Currently, on the Arbitrum One and Arbitrum Nova chains, the Sequencer is run by Offchain Labs. + +### Instant confirmation + +Without a Sequencer, a node can predict what the results of a client transaction will be, but the node can't be sure, because it can't know or control how the transactions it submits will be ordered in the inbox, relative to transactions submitted by other nodes. + +The Sequencer is given more control over ordering, so it has the power to assign its clients' transaction a position in the inbox queue, thereby ensuring that it can determine the results of client transactions immediately. The Sequencer's power to reorder has limits (see below for details) but it does have more power than anyone else to influence transaction ordering. + +### Inboxes, fast and slow + +When we add a Sequencer, the operation of the inbox changes. + +- Only the Sequencer can put new messages directly into the inbox. The Sequencer tags the messages it is submitting with an Ethereum block number and timestamp. (ArbOS ensures that these are non-decreasing, adjusting them upward if necessary to avoid decreases.) +- Anyone else can submit a message, but messages submitted by non-Sequencer nodes will be put into the "delayed inbox" queue, which is managed by an L1 Ethereum contract. + - Messages in the delayed inbox queue will wait there until the Sequencer chooses to "release" them into the main inbox, where they will be added to the end of the inbox. A well-behaved Sequencer will typically release delayed messages after about ten minutes, for reasons explained below. + - Alternatively, if a message has been in the delayed inbox queue for longer than a maxmium delay interval (currently 24 hours on Arbitrum One) then anyone can force it to be promoted to the main inbox. (This ensures that the Sequencer can only delay messages but can't censor them.) + +### If the Sequencer is well-behaved... + +A well-behaved Sequencer will accept transactions from all requesters and treat them fairly, giving each one a promised transaction result as quickly as it can. + +It will also minimize the delay it imposes on non-Sequencer transactions by releasing delayed messages promptly, consistent with the goal of providing strong promises of transaction results. Specifically, if the Sequencer believes that 40 confirmation blocks are needed to have good confidence of finality on Ethereum, then it will release delayed messages after 40 blocks. This is enough to ensure that the Sequencer knows exactly which transactions will precede its current transaction, because those preceding transactions have finality. There is no need for a benign Sequencer to delay non-Sequencer messages more than that, so it won't. + +This does mean that transactions that go through the delayed inbox will take longer to get finality. Their time to finality will roughly double, because they will have to wait one finality period for promotion, then another finality period for the Ethereum transaction that promoted them to achieve finality. + +This is the basic tradeoff of having a Sequencer: if your message uses the Sequencer, finality is `C` blocks faster; but if your message doesn't use the Sequencer, finality is `C` blocks slower. This is usually a good tradeoff, because most transactions will use the Sequencer; and because the practical difference between instant and 10-minute finality is bigger than the difference between 10-minute and 20-minute finality. + +So a Sequencer is generally a win, if the Sequencer is well-behaved. + +### If the Sequencer is malicious... + +A malicious Sequencer, on the other hand, could cause some pain. If it refuses to handle your transactions, you're forced to go through the delayed inbox, with longer delay. And a malicious Sequencer has great power to front-run everyone's transactions, so it could profit greatly at users' expense. + +On Arbitrum One, Offchain Labs currently runs a Sequencer which is well-behaved - we promise! This will be useful but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. + +Because the Sequencer will be run by a trusted party at first, and will be decentralized later, we haven't built in mechanism to directly punish a misbehaving Sequencer. We're asking users to trust the centralized Sequencer at first, until we switch to decentralized fair sequencing later. + +### Decentralized fair sequencing + +Viewed from 30,000 feet, decentralized fair sequencing isn't too complicated. Instead of being a single centralized server, the Sequencer is a committee of servers, and as long as a large enough supermajority of the committee is honest, the Sequencer will establish a fair ordering over transactions. + +How to achieve this is more complicated. Research by a team at Cornell Tech, including Offchain Labs and Co-founder Steven Goldfeder, developed the first-ever decentralized fair sequencing algorithm. With some improvements that are under developement, these concepts will form the basis for our longer-term solution, of a fair decentralized Sequencer. + +## Bridging + +We have already covered how users interact with L2 contracts - they submit transactions by putting messages int othe chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2 - how an L1 contract calls an L2 contract, and vice versa. + +The L1 and L2 chains run asynchronously from each other, so it is not possible to make a cross-chain call that produces a result wihtin the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was successfully submitted for later execution.) + +### L1 contracts can submit L2 transactions + +An L1 contract can submit an L2 transaction, just like a user would, by calling the Nitro chain's inbox contract on Ethereum. This L2 transaction will run later, producing results that will not be available to the L1 caller. The transaction will execute at L2, but the L1 caller won't be able to see any results from the L2 transaction. + +The advantage of this method is that it is simple and has relatively low latency. The disadvantage compared to the other method we'll describe soon, is that the L2 transaction might revert if the L1 caller doesn't get the L2 gas price and max gas amount right. Because the L1 caller can't see the result of its L2 transaction, it can't be absolutely sure that its L2 transaction will succeed. + +This would introduce a serious a problem for certain types of L1 to L2 interactions. Consider a transaction that includes depositing a token on L1 to be made available at some address on L2. If the L1 side succeeds, but the L2 side reverts, you've just sent some tokens to the L1 inbox contract that are unrecoverable on either L2 or L1. Not good. + +### L1 to L2 ticket-based transactions + +Fortunately, we have another method for L1 and L2 calls, which is more robust against gas-related failures, that uses a ticket-based system. The idea is that an L1 contract can submit a "retryable" transaction. The Nitro chain will try to run that transaction. If the transaction succeeds, nothing else needs to happen. But if the transaction fails, Nitro will create a "ticketID" that identifies that failed transaction. Later, anyone can call a special pre-compiled contract at L2, providing the `ticketID`, to try redeeming the ticekt and re-executing the transaction. + +When saving a transaction for retry, Nitro records the sender's address, destination address, callvalue, and calldata. All of this is saved, and the callvalue is deducted from the sender's account and (logically) attached to the saved transaction. + +If the redemption succeeds, the transaction is done, a receipt is issued for it, and the `ticketID` is canceled and can't be used again. If the redemption fails, for example because the packaged transaction fails, the redemption reports failure and the `ticketID` remains available for redemption. + +Normally the originally submitter will try to cause their transaction to succeed immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only require a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop which others can redeem later. + +Submitting a transaction in this way carries a price in`ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket is valid for about a week. If the ticket has not been redeemed in that period, it is deleted. + +When the ticket is redeemed, the pre-packaged transaction runs with sender and origin equal to the original submitted, and with the destination, callvalue, and calldata the submitter provided at the time of the submission. + +This mechanism is a bit more cumbersome than ordinary L1 to L2 transactions, but it has the advantage that the submission cost is predictable and the ticket will always be available for redemption if the submission cost is paid. As long as there is some user who is willing to redeem the ticket, the L2 transaction will eventually be able to execute and will not be silently dropped. + + + +### L2 to L1 ticket-based calls + +Calls from L2 and L1 operate in a similar way, with a ticket-based system. An L2 contract can call a method of the precompiled ArbSys contract, to send a transaction to L1. When the execution of the L2 transaction containing the submission is confirmed at L1 (some days later), a ticket is created in the L1 outbox contract. The ticket can be triggered by anyone who calls a certain L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. + +These L2-to-L1 tickets have unlimited lifetime, until they're successfully redeemed. No rent is required, as the tickets (actually a Merkle hash of the tickets) are recorded in Ethereum storage, which does not require rent. (The cost of allocating storage for the ticket Merkle roots is covered by L2 transaction fees.) + + + +## Gas and Fees + +NitroGas (so-called to avoid confusion wtih Layer 1 Ethereum gas) is used by Arbitrum to track the cost of execution on a Nitro chain. It works the same as Ethereum gas, in the sense that every EVM instructions costs the same amount of gas that it would on Ethereum. + +## The Speed Limit + +The security of Nitro chains depends on the assumption that when one validator creates an RBlock, other validators will check it, and respond with a correct RBlock and a challenge if it is wrong. This requires that the other validators have the time and resources to check each RBlock quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for RBlocks. + +This sets an effective speed limit on execution of a Nitro chain: in the long run the chain cannot make progress faster than a validator can emulate its execution. If RBlocks are published at a rate faster than the speed limit, their deadlines will get farther and farther in the future. Due to the limit, enforced by the rollup protocol contracts, on how far in the future a deadline can be, this will eventually cause new RBlocks to be slowed down, thereby enforcing the effective speed limit. + +Being able to set the speed limit accurately depends on being able to estimate the time required to validate an RBlock, with some accuracy. Any uncertainty in estimating validation time will force us to set the speed limit lower, to be safe. And we do not want to set the speed limit lower, so we try to enable accurate estimation. + +## Fees + +User transactions pay fees, to cover the cost of operating the chain. These fees are assessed and collected by ArbOS at L2. They are denominated in `ETH`. + +Fees are charged for two resources that a transaction can use: + +- **L2 gas**: an Ethereum-equivalent amount of gas, as required to execute the transaction on the Nitro chain +- **L1 calldata**: a fee per unit of L1 calldata attributable to the transaction, which is charged only if the transaction came in via the Sequencer, and is paid to the Sequencer to cover its costs + +## L2 gas fees + +L2 gas fees work very similarly to gas on Ethereum. A transaction uses some amount of gas, and this is multiplied by the current basefee to get the L2 gas fee charged to the transaction. + +The L2 basefee is set by a version of the "exponential mechanism" which has been widely discussed in the Ethereum community, and which has been shown equivalent to Ethereum's EIP-1559 gas pricing mechanism. + +The algorithm compares gas usage against a parameter called the "speed limit" which is the taret amount of gas per second that the chain can handle sustainably over time. (Currently the speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, that gas is added to the backlog. Whenever the clock ticks one second, the speed limit is subtracted from the backlog; but the backlog can never go below zero. + +Intuitively, if the backlog grows, the algorithm should increase the gas price, to slow gas usage, because usage is above the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the below the sustainable limit so more gas usage can be welcomed. + +To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a` and `b` are suitably chosen constants: `a` controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. + +### L1 calldata fees + +L1 calldata fees exist because the Sequencer, or the batch poster which posts the Sequencer's transaction batches on Ethereum, incurs costs in L1 gas to post transactions on Ethereum as calldata. Funds collected in L1 calldata fees are credited to the batch poster to cover its costs. + +Every transaction that comes in through the Sequencer will pay an L1 calldata fee. Transactions that come in through the delayed inbox do not pay this fee because they don't add to batch posting costs - but these transactions pay gas fees to Ethereum when they are put into the delayed inbox. + +The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of how many bytes the transaction will add to the compressed batch it is in; the formula for this includes an estimate of how compressible the transaction is. Second, it multiplies the computed size estimate by the current price per estimated byte, to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 basefee to translate the fee into L2 gas units. The result is reported as the "poster fee" for the transaction. + +The price per estimated byte is set by a dynamic algorithm that compares the total L1 calldata fees collected to the total fees actually paid by batch posters, and tries to bring the two as close to equality as possible. If the batch posters' costs have been less than fee receipts, the price will increase, and if batch poster costs have exceeded fee receipts, the price will decrease. + +### Total fee and gas estimation + +The total fee charged to a transaction is the L2 basefee, multiplied by the sum of the L2 gas used plus the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a basefee limit that is below the current basefee. Ethereum also allows a "tip" but Nitro ignores this field and never collects any tips. + +## Inside AnyTrust + +AnyTrust is a variant of Arbitrum Nitro technology that lowers costs by accepting a mild trust assumption. + +The Arbitrum protocol requires that all Arbitrum nodes, including validators (nodes that verify correctness of the chain and are prepared to stake on correct results), have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of cost in Arbitrum. + +AnyTrust relies instead on an external Data Availability Committee (hereafter, "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be avialble so that the rollup protocol can function correctly. + +### Keysets + +A Keyset specifies the public keys of Committee members and the number of signatures required for a Data Availability Certificate to be valid. Keysets make Committee membership changes possible and provide Committee members the ability to change their keys. + +A Keyset contains: + +- the number of Committee members, and +- for each Committee member, a BLS public key, and +- the number of Committee signatures required + +Keysets are identified by their hashes. +An L1 KeysetManager contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the KeysetManager contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This allows the contents to be recovered later by anyone, given only the Keyset hash. + +Although the API does not limit the number of Keysets that can be valid at the same time, normally only one Keyset will be valid. + +### Data Availability Certificates + +A central concept in AnyTrust in the Data Availability Certificate (hereafter, a "DACert"). A DACert contains: + +- the hash of a data block, and +- an expiration, and +- proof that `N-1` Committee members have signed the (hash, expiration time) pair, consisting of: + - the hash of the Keyset used in signing, and + - a bitmap saying which Committee members signed, and + - a BLS aggregated signature (over the BLS12-381 curve) proving that those parties signed + +Because of the `2-of-N` trust assumption, a DACert constitutes proof that the block's data (i.e., the preimage of the hash in the DACert) will be available from at least one honest Committee member, at least until the expiration time. + +AnyTrust gives the sequencer two ways to post a data block on L1: it can post the full data as above, or it can post a DACert proving availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity are checked by L2 code. + +In ordinary (non-AnyTrust) Nitro, the Arbitrum sequencer posts data blocks on the L1 chains as calldata. The hashes of the data blocks are committed by the L1 inbox contract, allowing the data to be reliably read by L2 code. + +AnyTrust gives the sequencer two ways to post a data block on L1: it can post the full data as above, or it can post a DACert proving availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity are checked by L2 code. + +The L2 code that reads data from the inbox reads a full-data block as in ordinary Nitro. If it sees a DACert instead, it checks the validity of the DACert, with reference to the Keyset specified by the DACert (which is known to be valid because the L1 inbox verified that). The L2 code verifies that: + +- the number of signers is at least the number required by the Keyset, and +- the aggregated signature is valid for the claimed signers, and +- the expiration time is at least two weeks after the current L2 timestamp + +If the DACert is invalid, the L2 code discards the DACert and moves on to the next data block. If the DACert is valid, the L2 code reads the data block, which is guaranteed to be available because the DACert is valid. + +### Data Availability Servers + +Committee members run Data Availability Server (DAS) software. The DAS exposes two APIs: + +- The Sequencer API, which is meant to be called only by the Arbitrum chain's Sequencer, is a JSON-RPC interface allowing the Sequencer to submit data blocks to the DAS for storage. Deployments will typically block access to this API from callers other than the Sequencer. +- The REST API, which is meant to be available to the world, is a RESTful HTTP(S) based protocol that allows data blocks to be fetched by hash. This API is fully cacheable, and deployments may use a caching proxy or CDN to increase scale and protect against DoS attacks. + Only Committee members have reason to support the Sequencer API. We expect others to run the REST API, and that is helpful. (More on that below.) + +The DAS software, based on configuration options, can store its data in local files, or in a Badger database, or on Amazon S3, or redundantly across multiple backing stores. The software also supports optional caching in memory (using Bigcache) or in a Redis instance. + +### Sequencer-Committee Interaction + +When the Arbitrum sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (normally three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then the member signs the (hash, expiration time) pair using its BLS key, and returns the signature with a success indicator to the sequencer. + +Once the Sequencer has collected enough signatures, it can aggregate the signatures and create a valid DACert for the (hash, expiration time) pair. The Sequencer then posts that DACert to the L1 inbox contract, making it available to the AnyTrust chain software at L2. + +If the Sequencer fails to collect enough signatures within a few minutes, it will abandon the attempt to use the Committee, and will "fall back to rollup" by posting the full data directly to the L1 chain, as it would do in a non-AnyTrust chain. The L2 software can understand both data posting formats (via DACert or via full data) and will handle each one correctly. + + diff --git a/static/img/haw-eds-napkin-drawing.png b/static/img/haw-eds-napkin-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..c449b41bee49a76768c1bb8ff2f6762e4cf9377f GIT binary patch literal 488955 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
W7ih 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

- An address deterministically generated from an L1 contract address used on L2 to safely identify - the source of an L1 to L2 message. -

+An address deterministically generated from a parent chain contract address used on child chain to safely identify the source of an parent to child chain message. ### Arb Token Bridge {#arb-token-bridge} -

- A series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless - movement of ERC-20 tokens between the two layers. -

+A series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless movement of `ERC-20` tokens between the two layers. ### Arbified Token List {#arbified-token-list} -

- A token list that conforms to{' '} - Uniswap's token list specification; Arbified - lists are generated by inputting externally maintained list ( - - i.e., coinmarketcap's list - - ) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain - bridged via the canonical Arb Token Bridge from tokens - on the inputted list. (See code - here - .) -

+A token list that conforms to [Uniswap's token list specification](https://github.com/Uniswap/token-lists); Arbified lists are generated by inputting externally maintained list ([i.e., coinmarketcap's list](https://api.coinmarketcap.com/data-api/v3/uniswap/all.json)) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain bridged via the canonical [Arb Token Bridge](/intro/glossary#arb-token-bridge) from tokens on the input list. (See code [here](https://github.com/OffchainLabs/arbitrum-token-lists).) ### Arbitrum {#arbitrum} -

+A suite of Ethereum child chain scaling technologies built with the [Arbitrum Nitro](/intro/glossary#arbitrum-nitro) tech stack that includes [Arbitrum One](/intro/glossary#arbitrum-one) (a live implementation of the [Arbitrum Rollup Protocol](/intro/glossary#arbitrum-rollup-protocol)) and [Arbitrum Nova](/intro/glossary#arbitrum-nova) (a live implementation of the [Arbitrum AnyTrust Protocol](/intro/glossary#arbitrum-anytrust-protocol)). + +### Arbitrum AnyTrust Chain {#arbitrum-anytrust-chain} + +An [Arbitrum chain](/intro/glossary#arbitrum-chain) that implements the [Arbitrum AnyTrust Protocol](/intro/glossary#arbitrum-anytrust-protocol). -

+### Arbitrum AnyTrust Protocol {#arbitrum-anytrust-protocol} + +An Arbitrum protocol that manages data availability with a permissioned set of parties known as the [Data Availability Committee (DAC)](/intro/glossary#data-availability-committee-dac). This protocol reduces transaction fees by introducing an additional trust assumption for data availability in lieu of Ethereum's [Trustless](/intro/glossary#trustless) data availability mechanism. [Arbitrum Nova](/intro/glossary#arbitrum-nova) is an example of an AnyTrust chain; [Arbitrum One](/intro/glossary#arbitrum-one) is an alternative chain that implements the purely trustless (and more L1-gas intensive) [Arbitrum Rollup Protocol](/intro/glossary#arbitrum-rollup-protocol). ### Arbitrum Bridge UI {#arbitrum-bridge-ui} -

- Web application built and maintained by Offchain Labs{' '} - for user-interactions with the Arb Token Bridge; - visit it here. -

+Web application built and maintained by [Offchain Labs](/intro/glossary#offchain-labs) for user-interactions with the [Arb Token Bridge](/intro/glossary#arb-token-bridge); visit it [here](https://bridge.arbitrum.io/). -### Arbitrum Classic {#arbitrum-classic} +### Arbitrum chain {#arbitrum-chain} + +A blockchain that runs on the Arbitrum protocol. Arbitrum chains are EVM compatible, and use an underlying EVM chain (e.g., Ethereum) for settlement and for succinct fraud-proofs (as needed). Arbitrum chains come in two forms: [Arbitrum Rollup Chains](/intro/glossary#arbitrum-rollup-chain) and [Arbitrum AnyTrust Chains](/intro/glossary#arbitrum-anytrust-chain). + +### Arbitrum Chains {#arbitrum-chains} -

+Arbitrum chains (Orbit) refers to the ability for anyone to permissionlessly deploy [Layer 3 (L3)](/intro/glossary#layer-3-l3) chains on top of Arbitrum [Layer 2 (L2)](/intro/glossary#layer-2-l2) chains. -

+### Arbitrum Classic {#arbitrum-classic} + +[Old Arbitrum stack](https://github.com/OffchainLabs/arbitrum) that used custom virtual machine ("AVM"); no public Arbitrum chain uses the classic stack as of 8/31/2022 (they instead use [Arbitrum Nitro](/intro/glossary#arbitrum-nitro).) ### Arbitrum Full Node {#arbitrum-full-node} -

- A party who keeps track of the state of an Arbitrum chain and receives remote procedure calls - (RPCs) from clients. Analogous to a non-staking L1 Ethereum node. -

+A party who keeps track of the state of an Arbitrum chain and receives remote procedure calls (RPCs) from clients. Analogous to a non-staking parent Ethereum node. + +### Arbitrum Nitro {#arbitrum-nitro} + +Current Arbitrum tech stack; runs a fork of [Geth](/intro/glossary#geth) and uses WebAssembly as its underlying VM for fraud proofs. + +### Arbitrum Nova {#arbitrum-nova} + +The first [Arbitrum AnyTrust Chain](/intro/glossary#arbitrum-anytrust-chain) running on Ethereum mainnet. Introduces cheaper transactions; great for gaming and social use-cases. Implements the [Arbitrum AnyTrust Protocol](/intro/glossary#arbitrum-anytrust-protocol), not the [Arbitrum Rollup Protocol](/intro/glossary#arbitrum-rollup-protocol) protocol. Governed by the [Arbitrum DAO](https://docs.arbitrum.foundation/gentle-intro-dao-governance). + +### Arbitrum One {#arbitrum-one} + +The first [Arbitrum Rollup Chain](/intro/glossary#arbitrum-rollup-chain) running on Ethereum mainnet. Great for decentralized finance and other use-cases that demand strong security guarantees. Governed by the [Arbitrum DAO](https://docs.arbitrum.foundation/gentle-intro-dao-governance). -### Arbitrum Orbit {#arbitrum-orbit} +### Arbitrum Rollup Chain {#arbitrum-rollup-chain} -

- Layer 3 (L3) -

+An [Arbitrum chain](/intro/glossary#arbitrum-chain) that implements the [Arbitrum Rollup Protocol](/intro/glossary#arbitrum-rollup-protocol). + +### Arbitrum Rollup Protocol {#arbitrum-rollup-protocol} + +A trustless, permissionless Arbitrum protocol that uses its underlying base layer for data availability and inherits its security. This protocol is implemented by our [Arbitrum One](/intro/glossary#arbitrum-one) chain. ### ArbOS {#arbos} -

- Arbitrum's "operating system" that trustlessly handles system-level operations; includes the - ability to emulate the EVM. -

+Arbitrum's "operating system" that trustlessly handles system-level operations; includes the ability to emulate the EVM. ### Assertion {#assertion} -

- A staked claim made by an Arbitrum Validator representing - a claim about an Arbitrum chain's state. An Assertion may, - e.g., propose a new assertion, or may be a step in a{' '} - Challenge. -

+A bonded claim made by an Arbitrum [Validator](/intro/glossary#validator) representing a claim about an Arbitrum chain's state. An [Assertion](/intro/glossary#assertion) may, e.g., propose a new assertion, or may be a step in a [Challenge](/intro/glossary#challenge). ### Auction Contract {#auction-contract} -

- A smart contract that handles the state, accounting of funds for bids, and various operations of - the Timeboost auction. The contract is deployed on the - target chain for which Timeboost is enabled. -

+A smart contract that handles the state, accounting of funds for bids, and various operations of the [Timeboost](/intro/glossary#timeboost) auction. The contract is deployed on the target chain for which Timeboost is enabled. ### Autonomous Auctioneer {#autonomous-auctioneer} -

- Off chain software that receives bids from Timeboost{' '} - participants, processes and validates bids, and then posts the top valid bid (or top two valid - bids in the case of a tie) to the Auction Contract{' '} - to resolve the on-going Timeboost auction. The autonomous auctioneer, for a given chain, is - provisioned & deployed by an entity designated by the chain's owner. -

+Offchain software that receives bids from [Timeboost](/intro/glossary#timeboost) participants, processes and validates bids, and then posts the top valid bid (or top two valid bids in the case of a tie) to the [Auction Contract](/intro/glossary#auction-contract) to resolve the on going Timeboost auction. The autonomous auctioneer, for a given chain, is provisioned and deployed by an entity designated by the chain's owner. ### Batch {#batch} -

- Underlying Chain, - Fast Inbox -

+A group of Arbitrum transactions posted in a single transaction on the [Underlying Chain](/intro/glossary#underlying-chain) into the [Sequencer Inbox](/intro/glossary#sequencer-inbox) by the [Sequencer](/intro/glossary#sequencer). ### Blockchain {#blockchain} -

- A distributed digital ledger that is used to record transactions and store data in a secure, - transparent, and tamper-resistant way, notably in cryptocurrency protocols. -

+A distributed digital ledger that is used to record transactions and store data in a secure, transparent, and tamper-resistant way, notably in cryptocurrency protocols. ### BLS Signature {#bls-signature} -

- -

+A cryptographic scheme that allows multiple signatures to be aggregated and compacted into one efficiently verifiable, constant-sized signature. Used in the [Arbitrum AnyTrust Protocol](/intro/glossary#arbitrum-anytrust-protocol) for the [Data Availability Committee (DAC)](/intro/glossary#data-availability-committee-dac)'s signatures. ### BoLD {#bold} -

- Short for "Bounded Liquidity Delay"; latest version of the Arbitrum{' '} - Challenge protocol designed to eliminate{' '} - - delay attack vectors - {' '} - (see{' '} - - here - {' '} - for more). Not currently on mainnet. -

+Short for "Bounded Liquidity Delay"; latest version of the Arbitrum [Challenge protocol](/intro/glossary#challenge-protocol) designed to eliminate [delay attack vectors](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a) (see [here](https://medium.com/offchainlabs/bold-permissionless-validation-for-arbitrum-chains-9934eb5328cc) for more). + +### Bonder {#bonder} + +A [Validator](/intro/glossary#validator) who deposits a bond (in Ether on [Arbitrum One](/intro/glossary#arbitrum-one) and [Arbitrum Nova](/intro/glossary#arbitrum-nova) ) to vouch for a particular [assertion](/intro/glossary#assertion) in an Arbitrum Chain. A validator who bonds on a false assertion can expect to lose their bond. An honest bonder can recover their bond once the assertion they are bonded on has been confirmed. +_Also known as: staker_ ### Bridge {#bridge} -

- Cross-chain message -

+A set of smart contracts for sending [Cross-chain messages](/intro/glossary#crosschain-message) between blockchains. Every [Arbitrum chain](/intro/glossary#arbitrum-chain) includes a bridge to/from its [Parent chain](/intro/glossary#parent-chain). ### Chain Owner {#chain-owner} -

- An entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum - chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, - and adding and removing other chain owners. -

+An entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, and adding and removing other chain owners. ### Chain state {#chain-state} -

- -

+A particular point in the history of an [Arbitrum chain](/intro/glossary#arbitrum-chain). A chain's state is determined by applying Arbitrum state-transition function to sequence of transactions (i.e., the chain's history). ### Challenge {#challenge} -

- When two Stakers disagree about the correct verdict on an{' '} - Assertion, those stakers can be put in a challenge. The - challenge is refereed by the contracts on the underlying chain. Eventually one staker wins the - challenge. The protocol guarantees that an honest party will always win a challenge; the loser - forfeits their stake. -

+When two [bonders](/intro/glossary#bonder) disagree about the correct verdict on an [assertion](/intro/glossary#assertion), those bonders can be put in a challenge. The challenge is refereed by the contracts on the underlying chain. Eventually one bonder wins the challenge. The protocol guarantees that an honest party will always win a challenge; the loser forfeits their bond. ### Challenge Period {#challenge-period} -

- Window of time (one week on Arbitrum One) over which an{' '} - Assertion can be challenged, and after which the assertion - can be confirmed. -

+Window of time (one week on Arbitrum One) over which an [Assertion](/intro/glossary#assertion) can be challenged, and after which the assertion can be confirmed. ### Challenge protocol {#challenge-protocol} -

- Assertion -

+The protocol by which assertions are submitted, disputed, and ultimately confirmed. The Challenge Protocol guarantees that only valid [assertions](/intro/glossary#assertion) will be confirmed provided that there is at least one honest [active validator](/intro/glossary#active-validator). -### Client {#client} +### Child chain {#child-chain} -

+An Arbitrum Chain that settles to a [Parent chain](/intro/glossary#parent-chain). For example, Arbitrum One and Arbitrum Nova are child chains of Ethereum. -

+### Client {#client} + +A program running on a user's machine, often in the user's browser, that interacts with contracts on an [Arbitrum chain](/intro/glossary#arbitrum-chain) and provides a user interface. ### Confirmation {#confirmation} -

- Assertion, - L2 to L1 Message -

+The decision by an [Arbitrum chain](/intro/glossary#arbitrum-chain) to finalize an assertion as part of the chain's history. Once an [assertion](/intro/glossary#assertion) is confirmed its [Child to parent chain Messages](/intro/glossary#l2-to-l1-message) (e.g., withdrawals) can be executed. ### Cross-chain message {#crosschain-message} -

- An action taken on some chain A which asynchronously initiates an additional action on chain B. -

+An action taken on some chain A which asynchronously initiates an additional action on chain B. ### Custom Arb-Token {#custom-arbtoken} -

- Any L2 token contract registered to the{' '} - Arb Token Bridge that isn't a standard arb-token - (i.e., a token that uses any gateway other than the{' '} - StandardERC20 gateway ). -

+Any child chain token contract registered to the [Arb Token Bridge](/intro/glossary#arb-token-bridge) that isn't a standard arb-token (i.e., a token that uses any gateway other than the [`StandardERC20` gateway](/intro/glossary#standarderc20-gateway) ). ### Custom gateway {#custom-gateway} -

- Any Token Gateway that isn't the{' '} - StandardERC20 gateway. -

+Any [Token Gateway](/intro/glossary#token-gateway) that isn't the [`StandardERC20` gateway](/intro/glossary#standarderc20-gateway). ### dApp {#dapp} -

- Short for "decentralized application." A dApp typically consists of smart contracts as well as a - user-interface for interacting with them. -

+Short for "decentralized application." A dApp typically consists of smart contracts as well as a user-interface for interacting with them. ### Data Availability Certificate {#data-availability-certificate} -

+Signed promise from a [Data Availability Committee (DAC)](/intro/glossary#data-availability-committee-dac) attesting to the availability of a batch of data for an [Arbitrum AnyTrust Chain](/intro/glossary#arbitrum-anytrust-chain). + +### Data Availability Committee (DAC) {#data-availability-committee-dac} -

+A permissioned set of parties responsible for enforcing data availability on a chain using the [Arbitrum AnyTrust Protocol](/intro/glossary/#arbitrum-anytrust-protocol). + +See [Introducing AnyTrust Chains: Cheaper, Faster L2 Chains with Minimal Trust Assumptions](https://medium.com/offchainlabs/introducing-anytrust-chains-cheaper-faster-l2-chains-with-minimal-trust-assumptions-31def59eb8d7) to learn more. ### Defensive Validator {#defensive-validator} -

- A Validator that watches an Arbitrum chain and takes - action (i.e., stakes and challenges) only when and if an invalid{' '} - Assertion occurs. -

+A [Validator](/intro/glossary#validator) that watches an Arbitrum chain and takes action (i.e., bonds and challenges) only when and if an invalid [Assertion](/intro/glossary#assertion) occurs. ### Delayed Inbox {#delayed-inbox} -

- Fast Inbox -

+A contract that holds [Parent chain](/intro/glossary#parent-chain) initiated messages to be eventually included in the [Sequencer Inbox](/intro/glossary#sequencer). Inclusion of messages doesn't depend on the [Sequencer](/intro/glossary#sequencer). ### Dev-Tools Dashboard {#devtools-dashboard} -

- Web application built and maintained by Offchain Labs{' '} - for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of{' '} - Cross-chain messages; visit it{' '} - here. -

+Web application built and maintained by [Offchain Labs](/intro/glossary#offchain-labs) for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of [Cross-chain messages](/intro/glossary#crosschain-message); visit it [here](https://retryable-dashboard.arbitrum.io/). ### Dissection {#dissection} -

- A step in the Challenge protocol in which two - challenging parties interactively narrow down their disagreement until they reach a{' '} - One Step Proof. -

+A step in the [Challenge protocol](/intro/glossary#challenge-protocol) in which two challenging parties interactively narrow down their disagreement until they reach a [One Step Proof](/intro/glossary#one-step-proof). ### Ethereum Wallet {#ethereum-wallet} -

- A software application used for transacting with the Ethereum{' '} - Blockchain. -

+A software application used for transacting with the Ethereum [Blockchain](/intro/glossary#blockchain). ### EVM+ {#evm} -

- The paradigm introduced by Stylus in which Arbitrum's EVM - compatibility is preserved while new features and improvements are introduced. -

+The paradigm introduced by [Stylus](/intro/glossary#stylus) in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced. ### Express Lane {#express-lane} -

- Timeboost -

+A component of [Timeboost](/intro/glossary#timeboost), the express lane is a special endpoint on the [Sequencer](/intro/glossary#sequencer) that immediately sequences incoming, valid transactions signed by the current express lane controller. ### Express Lane Controller {#express-lane-controller} -

- An address, defined in the Auction Contract, that - is granted the privilege to use the Express Lane. These - privileges are granted after verifying that the incoming transactions were properly signed by the - express lane controller, among other checks. -

- -### Fair Ordering Algorithm {#fair-ordering-algorithm} +An address, defined in the [Auction Contract](/intro/glossary#auction-contract), that is granted the privilege to use the [Express Lane](/intro/glossary#express-lane). These privileges are granted after verifying that the incoming transactions were properly signed by the express lane controller, among other checks. -

+### Externally Owned Accounts {#externally-owned-accounts} -

+An externally owned account (EOA) is the account (public/private key pairs) that has a physical address location. Commonly referred to as a [wallet](/intro/glossary/#wallet), however, we distinguish an EOA from the user client software wallet. ### Fast Exit / Liquidity Exit {#fast-exit--liquidity-exit} -

- A means by which a user can bypass an Arbitrum chain's{' '} - Challenge Period when withdrawing fungible assets - (or more generally, executing some "fungible" L2 to L1 operation); for trustless fast exits, a - liquidity provider facilitates an atomic swap of the asset on L2 directly to L1. -

- -### Fast Inbox {#fast-inbox} - -

- Delayed Inbox -

+A means by which a user can bypass an Arbitrum chain's [Challenge Period](/intro/glossary#challenge-period) when withdrawing fungible assets (or more generally, executing some "fungible" child chain to parent chain operation); for trustless fast exits, a liquidity provider facilitates an atomic swap of the asset on a child chain directly to a parent chain. ### First Come First Serve (FCFS) {#first-come-first-serve-fcfs} -

- A type of Transaction Ordering Policy{' '} - used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block - in the order that the transactions arrived. -

+A type of [Transaction Ordering Policy](/intro/glossary#transaction-ordering-policy) used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block in the order that the transactions arrived. ### Force-Inclusion {#forceinclusion} -

- Delayed Inbox -

+Censorship resistant path for including a message into an Arbitrum chain via the [Delayed Inbox](/intro/glossary#delayed-inbox) on its [Parent chain](/intro/glossary#parent-chain); bypasses any Sequencer involvement. ### Fraud proof {#fraud-proof} -

- -

+The means by which an [Active Validator](/intro/glossary#active-validator) proves to its underlying chain that an invalid state transition has taken place. ### Gas Price Floor {#gas-price-floor} -

- -

+Protocol-enforced minimum gas price on an Arbitrum chain; currently 0.1 `gwei` on [Arbitrum One](/intro/glossary#arbitrum-one) and 0.01 `gwei` on [Arbitrum Nova](/intro/glossary#arbitrum-nova). ### Gateway Router {#gateway-router} -

- Contracts in the Arb Token Bridge responsible for - mapping tokens to their appropriate Token Gateway. -

+Contracts in the [Arb Token Bridge](/intro/glossary#arb-token-bridge) responsible for mapping tokens to their appropriate [Token Gateway](/intro/glossary#token-gateway). ### Generic-Custom Gateway {#genericcustom-gateway} -

- A particular Custom gateway via which an L1 token - contract can be registered to a token contract deployed to L2. A useful alternative to the{' '} - StandardERC20 gateway for projects that wish - to control the address of their L2 token contract, maintain L2 token contract upgradability, and - for various other use-cases. -

+A particular [Custom gateway](/intro/glossary#custom-gateway) via which a parent chain token contract can be registered to a token contract deployed to a child chain. A useful alternative to the [`StandardERC20` gateway](/intro/glossary#standarderc20-gateway) for projects that wish to control the address of their child chain token contract, maintain the child chain token contract upgradability, and for various other use-cases. + +### Geth {#geth} + +An execution-layer client that defines the Ethereum state transition function and handles network-layer logic like transaction memory pooling. [Arbitrum Nitro](/intro/glossary#arbitrum-nitro) utilizes a fork of Geth to implement Arbitrum's state transition function. ### Ink {#ink} -

- The equivalent of gas in the Stylus vm. Ink is introduced for - finer granularity than gas offers since Stylus's operations are considerably cheaper than their - EVM analogs. -

+The equivalent of gas in the [Stylus](/intro/glossary#stylus) vm. Ink is introduced for finer granularity than gas offers since Stylus's operations are considerably cheaper than their EVM analogs. ### L2 Block {#l2-block} -

Data structure that represents a group of L2 transactions (analogous to L1 blocks).

+Data structure that represents a group of L2 transactions (analogous to L1 blocks). ### L2 to L1 Message {#l2-to-l1-message} -

- Challenge Period -

+A message initiated from within an Arbitrum chain to be eventually executed on [Layer 1 (parent chain)](/intro/glossary#layer-1-l1) (e.g., token or Ether withdrawals). On Rollup chains like [Arbitrum One](/intro/glossary#arbitrum-one), the [Challenge Period](/intro/glossary#challenge-period) must pass before a child to parent chain message is executed. -### Layer 3 (L3) {#layer-3-l3} +### Layer 1 (L1) {#layer-1-l1} -

+The base protocol and underlying blockchain of the Ethereum network. Responsible for maintaining the integrity of the distributed ledger and executing smart contracts. Contains both Ethereum's execution layer and consensus layer. + +### Layer 2 (L2) {#layer-2-l2} + +Trustless scaling solutions built on top of Ethereum's [Layer 1 (L1)](/intro/glossary#layer-1-l1) base protocol, such as state channels, plasma chains, optimistic rollups, and ZK-rollups. Layer 2 solutions aim to increase scalability and reduce the cost of transactions on Ethereum's Layer 1 without introducing additional trust assumptions. + +### Layer 3 (L3) {#layer-3-l3} -

+An Arbitrum chain whose core contract reside on an Arbitrum [Layer 2 (L2)](/intro/glossary#layer-2-l2) chain. ### Native Fee Token {#native-fee-token} -

- Arbitrum Orbit -

+An `ERC-20` token used as the native currency for gas fees on an [Arbitrum chain](/intro/glossary#arbitrum-chain) (i.e., as opposed to using Ether). [Arbitrum chains](/intro/glossary#arbitrum-chains) introduced the option for chains to use native fee tokens. ### Offchain Labs {#offchain-labs} -

- -

+The initial builders Arbitrum; current contributors to the Arbitrum ecosystem and service providers to the [Arbitrum DAO](https://docs.arbitrum.foundation/gentle-intro-dao-governance). Offchain also runs and maintains the [Sequencers](/intro/glossary#sequencer) for [Arbitrum One](/intro/glossary#arbitrum-one) and [Arbitrum Nova](/intro/glossary#arbitrum-nova). ### One Step Proof {#one-step-proof} -

- Final step in a challenge; a single operation of the Arbitrum VM ( - WASM ) is executed on the underlying chain, and the validity of - its state transition is verified. -

+Final step in a challenge; a single operation of the Arbitrum VM ([WASM](/intro/glossary#wasm) ) is executed on the underlying chain, and the validity of its state transition is verified. ### Outbox {#outbox} -

- An L1 contract responsible for tracking{' '} - L2 to L1 Messages, including withdrawals, which can - be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages. -

+A parent chain contract responsible for tracking [Child to parent chain Message](/intro/glossary#l2-to-l1-message)s, including withdrawals, which can be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages. + +### Parent chain {#parent-chain} + +EVM compatible chain that acts as the settlement layer for one or more Arbitrum Chains (aka [Child chain](/intro/glossary#child-chain) ). E.g., Ethereum is the parent chain of both Arbitrum One and Arbitrum Nova. Parent chain is synonymous with "underlying chain." ### Portal {#portal} -

- A web application maintained by Offchain Labs{' '} - showcasing the Arbitrum ecosystem; visit it here. -

+A web application maintained by [Offchain Labs](/intro/glossary#offchain-labs) showcasing the Arbitrum ecosystem; visit it [here](https://portal.arbitrum.io/). + +### raas {#raas} + +RaaS (Rollup as a Service) is a platform that provides the infrastructure and tools needed to deploy and operate blockchain Rollups without requiring teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology. ### RBlock {#rblock} -

- Refer to Assertion -

+Refer to [Assertion](/intro/glossary#assertion) ### Reorg {#reorg} -

- A situation in which transactions on a chain that were at some point considered accepted then get - rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's{' '} - Fast Inbox, the only way the chain can experience a reorg - is if its Underlying Chain itself reorgs. Of note,{' '} - Fraud proofs do not cause reorgs. -

+A situation in which transactions on a chain that were at some point considered accepted then get rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's [Sequencer Inbox](/intro/glossary#sequencer-inbox), the only way the chain can experience a reorg is if its [Underlying Chain](/intro/glossary#underlying-chain) itself reorgs. Of note, [Fraud proofs](/intro/glossary#fraud-proof) do not cause reorgs. ### Retryable Autoredeem {#retryable-autoredeem} -

- The "automatic" (i.e., requiring no additional user action) execution of a{' '} - Retryable Ticket on an Arbitrum chain. -

+The "automatic" (i.e., requiring no additional user action) execution of a [Retryable Ticket](/intro/glossary#retryable-ticket) on an Arbitrum chain. ### Retryable Redeem {#retryable-redeem} -

- The execution of a Retryable Ticket on L2; can be - automatic (see Retryable Autoredeem) or manual - via a user-initiated L2 transaction. -

+The execution of a [Retryable Ticket](/intro/glossary#retryable-ticket) on a child chain; can be automatic (see [Retryable Autoredeem](/intro/glossary#retryable-autoredeem)) or manual via a user-initiated child chain transaction. ### Retryable Ticket {#retryable-ticket} -

- An L1 to L2 cross chain message initiated by an L1 transaction sent to an Arbitrum chain for - execution (e.g., a token deposit). -

+A parent to child cross chain message initiated by a parent chain transaction sent to an Arbitrum chain for execution (e.g., a token deposit). ### Reverse Token Gateway {#reverse-token-gateway} -

- Token Gateway -

+A [Token Gateway](/intro/glossary#token-gateway) in which the [Child chain](/intro/glossary#child-chain) gateway contract escrows and releases tokens, which the [Parent chain](/intro/glossary#parent-chain) Gateway contract mints and burns tokens. This in the inverse to how "typical" gateways work. + +### Sequencer {#sequencer} + +An entity (currently a single-party on Arbitrum One) given rights to reorder transactions in the [Sequencer Inbox](/intro/glossary#sequencer-inbox) over a fixed window of time, who can thus give clients sub-blocktime [Soft Confirmations](/intro/glossary#soft-confirmation). (Not to be confused with a [Validator](/intro/glossary#validator)). ### Sequencer Feed {#sequencer-feed} -

- Soft Confirmation, - Batch -

+Offchain data feed published by the [Sequencer](/intro/glossary#sequencer) which clients can subscribe to for [Soft Confirmations](/intro/glossary#soft-confirmation) of transactions before they are posted in [batches](/intro/glossary#batch). -### Shared Sequencing {#shared-sequencing} +### Sequencer Inbox {#sequencer-inbox} + +Contract that holds a sequence of messages sent by clients to an Arbitrum Chain; a message can be put into the Sequencer Inbox directly by the [Sequencer](/intro/glossary#sequencer) or indirectly through the [Delayed Inbox](/intro/glossary#delayed-inbox). -

+### Shared Sequencing {#shared-sequencing} -

+A protocol design space in which multiple rollups use the same entity as their [Sequencer](/intro/glossary#sequencer); potential benefits include enhanced interoperability and credible neutrality. ### Smart Contract {#smart-contract} -

- A computer program whose operations are defined and executed within a blockchain consensus - protocol. -

+A computer program whose operations are defined and executed within a blockchain consensus protocol. ### Soft Confirmation {#soft-confirmation} -

- -

+A semi-trusted promise from the [Sequencer](/intro/glossary#sequencer) to post a user's transaction in the near future; soft-confirmations happen prior to posting on the [Parent chain](/intro/glossary#parent-chain), and thus can be given near-instantaneously (i.e., faster than the parent chain's block times) ### Speed Limit {#speed-limit} -

- -

- -### Staker {#staker} - -

- Validator, - Assertion -

+Target computation limit for an Arbitrum chain. [Arbitrum One](/intro/glossary#arbitrum-one) and [Arbitrum Nova](/intro/glossary#arbitrum-nova) currently target 7,000,000 gas / second. When computation exceeds this limit, fees rise, via [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq). ### Standard Arb-Token {#standard-arbtoken} -

- An token contract on an Arbitrum chain deployed via the{' '} - StandardERC20 gateway; offers basic ERC20 - functionality in addition to deposit / withdrawal affordances. -

+An token contract on an Arbitrum chain deployed via the [`StandardERC20` gateway](/intro/glossary#standarderc20-gateway); offers basic `ERC-20` functionality in addition to deposit / withdrawal affordances. ### StandardERC20 gateway {#standarderc20-gateway} -

- Token Gateway, - Standard Arb-Token -

+[Token Gateway](/intro/glossary#token-gateway) via which any underlying chain's `ERC-20` token can permissionlessly bridge; the `StandardERC20` gateway contracts deploy a [Standard Arb-Token](/intro/glossary#standard-arbtoken) on the [Child chain](/intro/glossary#child-chain) for each bridged token. ### State Transition Function {#state-transition-function} -

- The STF (State Transition Function) defines how new blocks are produced from input messages (i.e. - transactions) in an Arbitrum chain. -

+The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain. ### Stylus {#stylus} -

- -

+Upgrade to the [Arbitrum Nitro](/intro/glossary#arbitrum-nitro) virtual machine that allows smart contract support for languages like Rust and C++ by taking advantage of Nitro's use of WASM. Currently on testnet ([read more](https://docs.arbitrum.io/stylus/stylus-gentle-introduction)). ### Timeboost {#timeboost} -

- -

+A transaction ordering policy in which entities can bid for the right to access an express lane on the [Sequencer](/intro/glossary#sequencer) for faster transaction inclusion. See the [research specification](https://github.com/OffchainLabs/timeboost-design/tree/main) to learn more. ### Token Gateway {#token-gateway} -

- StandardERC20 gateway, - Generic-Custom Gateway, - WETH Gateway -

+A pair of contracts in the token bridge — one on the [Parent chain](/intro/glossary#parent-chain) , one on the [Child chain](/intro/glossary#child-chain) — that provide a particular mechanism for handling the transfer of tokens between layers. Token gateways currently active in the bridge include the [`StandardERC20` gateway](/intro/glossary#standarderc20-gateway) , the [Generic-Custom Gateway](/intro/glossary#genericcustom-gateway) , and the [WETH Gateway](/intro/glossary#weth-gateway). ### Transaction {#transaction} -

- A user-initiated interaction with a Blockchain. Transactions are typically signed by users via - wallets and are paid for via transaction fees. -

+A user-initiated interaction with a Blockchain. Transactions are typically signed by users via wallets and are paid for via transaction fees. ### Transaction Ordering Policy {#transaction-ordering-policy} -

The rules and logic employed by a chain to order incoming transactions into a block.

+The rules and logic employed by a chain to order incoming transactions into a block. -### Underlying Chain {#underlying-chain} +### Trustless {#trustless} -

+In the context of Ethereum, trustless refers to the ability of a system to operate without reliance on a central authority or intermediary. Instead, users place their trust in math and protocols. -

+This is achieved through the use of cryptographic techniques and decentralized consensus mechanisms that let users verify the integrity of network transactions using open-source software. Trustless systems are considered to be more secure and resistant to fraud or tampering because they don't rely on a single point of failure that can be exploited by attackers. + +### Underlying Chain {#underlying-chain} + +Synonymous with [Parent chain](/intro/glossary#parent-chain). ### Validator {#validator} -

- Arbitrum Full Node, - Assertion, - Watchtower Validator, - Defensive Validator -

+An [Arbitrum Full Node](/intro/glossary#arbitrum-full-node) that tracks the status of the chains' [Assertion](/intro/glossary#assertion)s. A validator may be a [Watchtower Validator](/intro/glossary#watchtower-validator), a [Defensive Validator](/intro/glossary#defensive-validator), or an [Active Validator](/intro/glossary#active-validator). + +### Wallet {#wallet} + +When referring to a wallet, we mean the user client software enabling user actions. Often, client software is a browser extension, mobile, or desktop app. Also refer to [Externally Owned Accounts](/intro/glossary#externally-owned-accounts). ### WASM {#wasm} -

- Fraud proof,Stylus -

+Widely supported binary code format for executable programs. Used by [Arbitrum Nitro](/intro/glossary#arbitrum-nitro) for [Fraud proofs](/intro/glossary#fraud-proof) , and more broadly used by [Stylus](/intro/glossary#stylus) to support performant smart contracts in a wide variety of languages. ### WASMer {#wasmer} -

- A popular WebAssembly runtime for executing WASM binaries.{' '} - A fork of WASMer is used for executing{' '} - Stylus programs. WASMer executes considerably faster than - Geth executes EVM code, contributing to Stylus's lower fees. -

+A popular WebAssembly runtime for executing [WASM](/intro/glossary#wasm) binaries. [A fork of WASMer](https://github.com/OffchainLabs/wasmer) is used for executing [Stylus](/intro/glossary#stylus) programs. WASMer executes considerably faster than Geth executes EVM code, contributing to Stylus's lower fees. ### Watchtower Validator {#watchtower-validator} -

- A Validator that never stakes / never takes on chain - action, who raises the alarm (by whatever off-chain means it chooses) if it witnesses an invalid - assertion. -

+A [Validator](/intro/glossary#validator) that never bonds / never takes on chain action, who raises the alarm (by whatever offchain means it chooses) if it witnesses an invalid assertion. ### WETH Gateway {#weth-gateway} -

- Token Gateway for handing the bridging of wrapped - Ether (WETH). WETH is unwrapped on L1 and rewrapped on L1 upon depositing (and vice-versa upon - withdrawing), ensuring WETH on L2 always remains collateralized. -

+[Token Gateway](/intro/glossary#token-gateway) for handing the bridging of wrapped Ether (`WETH`). `WETH` is unwrapped on the parent chain and rewrapped on the parent chain upon depositing (and vice-versa upon withdrawing), ensuring `WETH` on the child chain always remains collateralized. diff --git a/docs/partials/glossary/_raas.mdx b/docs/partials/glossary/_raas.mdx new file mode 100644 index 0000000000..e7dd2ccdb6 --- /dev/null +++ b/docs/partials/glossary/_raas.mdx @@ -0,0 +1,7 @@ +--- +title: raas +key: raas +titleforSort: RaaS +--- + +RaaS (Rollup as a Service) is a platform that provides the necessary infrastructure and tools to deploy and operate blockchain Rollups, eliminating the need for teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology. diff --git a/docs/run-arbitrum-node/01-overview.mdx b/docs/run-arbitrum-node/01-overview.mdx index ef7f3f3459..ce9b886c39 100644 --- a/docs/run-arbitrum-node/01-overview.mdx +++ b/docs/run-arbitrum-node/01-overview.mdx @@ -68,4 +68,4 @@ If you are running a single node, there is no requirement to set up a feed relay Soon, feed endpoints will mandate compression using a custom dictionary. Therefore, if you plan to connect to a feed using anything other than a standard node, it is strongly advised to run a local feed relay. This local feed relay will ensure that you have access to an uncompressed feed by default, maintaining optimal performance and compatibility. -For detailed instructions, read [how to run an Arbitrum feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx). +For detailed instructions, read [how to run an Arbitrum feed relay](/run-arbitrum-node/run-feed-relay.mdx). diff --git a/docs/run-arbitrum-node/02-run-full-node.mdx b/docs/run-arbitrum-node/02-run-full-node.mdx index ff2385ebea..4df39a3225 100644 --- a/docs/run-arbitrum-node/02-run-full-node.mdx +++ b/docs/run-arbitrum-node/02-run-full-node.mdx @@ -85,6 +85,12 @@ import OrbitChainsExample from './partials/run-full-node/_orbit-chains-example.m ## Putting it into practice: run a node +:::warning Caution + +If you are running more than on node, you should [run a feed relay](/run-arbitrum-node/run-feed-relay.mdx). + +::: + - To ensure the database persists across restarts, mount an external volume when running the Docker image. Use the mount point `/home/user/.arbitrum` within the Docker image. - Here is an example of how to run `nitro-node`: diff --git a/docs/run-arbitrum-node/data-availability.mdx b/docs/run-arbitrum-node/data-availability.mdx index f3f3dc2107..8a8bfb103e 100644 --- a/docs/run-arbitrum-node/data-availability.mdx +++ b/docs/run-arbitrum-node/data-availability.mdx @@ -95,7 +95,7 @@ Arbitrum full nodes decode data received from the parent chain (and, in the case Once Arbitrum full nodes have caught up with the chain, they switch from initial synchronization to a real-time update mode. This switch involves receiving data from the sequencer feed, which continuously broadcasts updates about newly queued transactions. 1. Data acquisition: - 1. Full nodes maintain a connection to the sequencer feed or your private feed. For how to run a private feed, please refer to [**How to run a feed relay**](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx) + 1. Full nodes maintain a connection to the sequencer feed or your private feed. For how to run a private feed, please refer to [**How to run a feed relay**](/run-arbitrum-node/run-feed-relay.mdx) 2. The sequencer feed transmits data packets containing information about the latest queued transactions. 2. Data decoding: 1. Full nodes decode the received data packets using the methods described in [How to read the sequencer feed](/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx). diff --git a/docs/run-arbitrum-node/partials/run-full-node/_optional-orbit-sequencer-compatible-cli-partial.mdx b/docs/run-arbitrum-node/partials/run-full-node/_optional-orbit-sequencer-compatible-cli-partial.mdx index b17ee6123c..32e0e98f23 100644 --- a/docs/run-arbitrum-node/partials/run-full-node/_optional-orbit-sequencer-compatible-cli-partial.mdx +++ b/docs/run-arbitrum-node/partials/run-full-node/_optional-orbit-sequencer-compatible-cli-partial.mdx @@ -9,7 +9,7 @@ | `--http.vhosts` | Accepts requests from these comma-separated virtual hostnames (server enforced). Default: `localhost`. Accepts `*`. | | `--http.addr` | Address to bind RPC to. May require `0.0.0.0` for Docker networking. | | `--execution.caching.archive` | Will retain past block state. **For archive nodes**. | -| `--node.feed.input.url=` | Default: `wss://.arbitrum.io/feed`. ⚠️ One feed relay per datacenter is advised. See [feed relay guide](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx). | +| `--node.feed.input.url=` | Default: `wss://.arbitrum.io/feed`. ⚠️ One feed relay per datacenter is advised. See [feed relay guide](/run-arbitrum-node/run-feed-relay.mdx). | | `--execution.rpc.evm-timeout` | Default: `5s`. Timeout for `eth_call`. (`0` == no timeout). | | `--execution.rpc.gas-cap` | Default: `50000000`. Gas cap for `eth_call`/`estimateGas`. (`0` = no cap). | | `--execution.rpc.tx-fee-cap` | Default: `1`. Transaction fee cap (in `ETH`) for RPC APIs. (`0` = no cap). | diff --git a/docs/run-arbitrum-node/partials/run-full-node/_optional-parameters.mdx b/docs/run-arbitrum-node/partials/run-full-node/_optional-parameters.mdx index cad57eb2f2..6edef47de1 100644 --- a/docs/run-arbitrum-node/partials/run-full-node/_optional-parameters.mdx +++ b/docs/run-arbitrum-node/partials/run-full-node/_optional-parameters.mdx @@ -7,7 +7,7 @@ | `--http.vhosts` | Accepts requests from these comma-separated virtual hostnames (server enforced). Default: `localhost`. Accepts `*`. | | `--http.addr` | Sets the address to bind RPC to. May require `0.0.0.0` for Docker networking. | | `--execution.caching.archive` | Retains past block state. For archive nodes. | -| `--node.feed.input.url=` | Sets the sequencer feed address to this URL. Default: `wss://.arbitrum.io/feed`. ⚠️ One feed relay per datacenter is advised. See [feed relay guide](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx). | +| `--node.feed.input.url=` | Sets the sequencer feed address to this URL. Default: `wss://.arbitrum.io/feed`. ⚠️ One feed relay per datacenter is advised. See [feed relay guide](/run-arbitrum-node/run-feed-relay.mdx). | | `--execution.forwarding-target=` | Sets the sequencer endpoint to forward requests to. | | `--execution.rpc.evm-timeout` | Default: `5s`. Timeout for `eth_call`. (0 == no timeout). | | `--execution.rpc.gas-cap` | Default: `50000000`. Gas cap for `eth_call`/`estimateGas`. (0 = no cap). | diff --git a/docs/run-arbitrum-node/sequencer/01-run-feed-relay.mdx b/docs/run-arbitrum-node/run-feed-relay.mdx similarity index 100% rename from docs/run-arbitrum-node/sequencer/01-run-feed-relay.mdx rename to docs/run-arbitrum-node/run-feed-relay.mdx diff --git a/docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx b/docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx index dd06e00ff5..2c73fa8e8e 100644 --- a/docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx +++ b/docs/run-arbitrum-node/sequencer/02-read-sequencer-feed.mdx @@ -11,7 +11,7 @@ todos: - Align on what we want to treat as proper nouns vs common nouns --- -[Running an Arbitrum relay locally as a feed relay](/run-arbitrum-node/sequencer/01-run-feed-relay.mdx) lets you subscribe to an uncompressed sequencer feed for real-time data as the sequencer accepts and orders transactions offchain. +[Running an Arbitrum relay locally as a feed relay](/run-arbitrum-node/run-feed-relay.mdx) lets you subscribe to an uncompressed sequencer feed for real-time data as the sequencer accepts and orders transactions offchain. When connected to websocket port `9642` of the local relay, you'll receive a data feed that looks something like this: diff --git a/docs/run-arbitrum-node/sequencer/05-high-availability-sequencer-docs.mdx b/docs/run-arbitrum-node/sequencer/05-high-availability-sequencer-docs.mdx index aa62149539..5d5c2fb4f6 100644 --- a/docs/run-arbitrum-node/sequencer/05-high-availability-sequencer-docs.mdx +++ b/docs/run-arbitrum-node/sequencer/05-high-availability-sequencer-docs.mdx @@ -123,7 +123,7 @@ helm install external-relay offchainlabs/relay \ --set configmap.data.node.feed.input.url=ws://sequencer-relay:9642 ``` -You can check [run a feed relay](/run-arbitrum-node/sequencer/run-feed-relay) to see how to set up a relay node. +You can check [run a feed relay](/run-arbitrum-node/run-feed-relay.mdx) to see how to set up a relay node. ### 3. Nitro full node setup @@ -151,7 +151,7 @@ helm install fullnode offchainlabs/nitro \ --set configmap.data.parent-chain.id= \ --set configmap.data.parent-chain.connection.url= \ --set configmap.data.chain.id= \ - --set configmap.data.execution.sequencer.forwarder.redis-url=redis://:6379 + --set configmap.data.execution.forwarder.redis-url=redis://:6379 ``` #### Mutating-only endpoint (optional) diff --git a/docs/stylus/quickstart.mdx b/docs/stylus/quickstart.mdx index 59f9e63f0d..c605881e43 100644 --- a/docs/stylus/quickstart.mdx +++ b/docs/stylus/quickstart.mdx @@ -140,7 +140,7 @@ cargo stylus new // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; -contract Coutner { +contract Counter { uint count; diff --git a/scripts/build-glossary.ts b/scripts/build-glossary.ts index 35bf31089d..dc8a638f78 100644 --- a/scripts/build-glossary.ts +++ b/scripts/build-glossary.ts @@ -114,12 +114,12 @@ function renderKey(key: string): string { */ async function main(): Promise { // Read and parse all glossary term files - let terms = await readFilesInDirectory('./partials/glossary/'); + let terms = await readFilesInDirectory('./docs/partials/glossary/'); // Generate import statements for each term (unused in current implementation) // This could be used if implementing a React component approach to term rendering let imports = terms - .map((item) => `import ${renderKey(item.data.key)} from './glossary/${item.data.key}.mdx';`) + .map((item) => `import ${renderKey(item.data.key)} from './docs/glossary/${item.data.key}.mdx';`) .join('\n'); // Generate component references for each term (unused in current implementation) @@ -128,7 +128,7 @@ async function main(): Promise { // Generate and write the consolidated glossary partial MDX file // This creates a single file with all terms formatted as Markdown headings await fs.writeFile( - './partials/_glossary-partial.mdx', + './docs/partials/_glossary-partial.mdx', terms .map((item) => `### ${item.data.title} {#${item.data.key}}\n${item.content.trim()}`) .join('\n\n'), diff --git a/scripts/precompile-reference-generator.ts b/scripts/precompile-reference-generator.ts index e41cae1bb5..d2513f555e 100644 --- a/scripts/precompile-reference-generator.ts +++ b/scripts/precompile-reference-generator.ts @@ -252,12 +252,19 @@ const generatePrecompileReferenceTables = async ( .replace('github.com', 'raw.githubusercontent.com') .replace('blob/', '')}${precompileName}.sol`, ); + if (!interfaceCodeRawResponse.ok) { + throw new Error(`Failed fetching precompile ${precompileName} interface with status ${interfaceCodeRawResponse.status}`); + } + const interfaceCode = await interfaceCodeRawResponse.text(); const implementationCodeRawResponse = await fetch( `${implementationBaseUrl .replace('github.com', 'raw.githubusercontent.com') .replace('blob/', '')}${precompileName}.go`, ); + if (!implementationCodeRawResponse.ok) { + throw new Error(`Failed fetching precompile ${precompileName} implementation with status ${implementationCodeRawResponse.status}`); + } const implementationCode = await implementationCodeRawResponse.text(); const methodsTable = renderMethodsInTable( diff --git a/sidebars.js b/sidebars.js index f0db3c0976..fdbef7972b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -305,6 +305,11 @@ const sidebars = { id: 'launch-arbitrum-chain/configure-your-chain/common-configurations/enable-post-4844-blobs', label: `Enable blob transactions`, }, + { + type: 'doc', + id: 'launch-arbitrum-chain/configure-your-chain/common-configurations/arbitrum-chain-finality', + label: `Configure delayed inbox finality`, + }, { type: 'category', label: 'Data Availability Committees', @@ -522,10 +527,17 @@ const sidebars = { id: 'launch-arbitrum-chain/customize-your-chain/customize-arbos', label: `Customize ArbOS version`, }, + ], + }, + { + type: 'category', + label: 'Migrate your chain', + collapsed: true, + items: [ { type: 'doc', - id: 'launch-arbitrum-chain/how-tos/arbitrum-chain-finality', - label: `Configure delayed inbox finality`, + id: 'launch-arbitrum-chain/migrate-between-raases', + label: 'Migrate between RaaSes', }, ], }, @@ -826,6 +838,11 @@ const sidebars = { id: 'run-arbitrum-node/data-availability', label: 'Data Availability', }, + { + type: 'doc', + id: 'run-arbitrum-node/run-feed-relay', + label: 'Run a feed relay', + }, { type: 'html', value: @@ -906,11 +923,6 @@ const sidebars = { id: 'run-arbitrum-node/sequencer/run-sequencer-node', label: 'Run a sequencer node', }, - { - type: 'doc', - id: 'run-arbitrum-node/sequencer/run-feed-relay', - label: 'Run a feed relay', - }, { type: 'doc', id: 'run-arbitrum-node/sequencer/read-sequencer-feed', diff --git a/src/resources/globalVars.js b/src/resources/globalVars.js index 8866c07a34..1579bdcaa7 100644 --- a/src/resources/globalVars.js +++ b/src/resources/globalVars.js @@ -48,7 +48,7 @@ const globalVars = { // Precompile interfaces repository nitroPrecompilesRepositorySlug: 'nitro-precompile-interfaces', nitroPrecompilesCommit: 'fe4121240ca1ee2cbf07d67d0e6c38015d94e704', - nitroPrecompilesPathToInterfaces: 'node-interface', + nitroPrecompilesPathToInterfaces: '', goEthereumCommit: '721d35373096917c588c31be380a89333351545b', diff --git a/static/glossary.json b/static/glossary.json index 4fca365126..1e2935d26f 100644 --- a/static/glossary.json +++ b/static/glossary.json @@ -1,278 +1,102 @@ { - "address-alias": { - "title": "Address Alias", - "text": "

\nAn address deterministically generated from an L1 contract address used on L2 to safely identify the source of an L1 to L2 message.\n

" - }, - "arb-token-bridge": { - "title": "Arb Token Bridge", - "text": "

\nA series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless movement of ERC-20 tokens between the two layers.\n

" - }, - "arbified-token-list": { - "title": "Arbified Token List", - "text": "

\nA token list that conforms to Uniswap's token list specification; Arbified lists are generated by inputting externally maintained list (i.e., coinmarketcap's list) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain bridged via the canonical Arb Token Bridge from tokens on the inputted list. (See code here.)\n

" - }, - "arbitrum": { "title": "Arbitrum", "text": "

\n\n

" }, - "arbitrum-bridge-ui": { - "title": "Arbitrum Bridge UI", - "text": "

\nWeb application built and maintained by Offchain Labs for user-interactions with the Arb Token Bridge; visit it here.\n

" - }, - "arbitrum-classic": { "title": "Arbitrum Classic", "text": "

\n\n

" }, - "arbitrum-full-node": { - "title": "Arbitrum Full Node", - "text": "

\nA party who keeps track of the state of an Arbitrum chain and receives remote procedure calls (RPCs) from clients. Analogous to a non-staking L1 Ethereum node.\n

" - }, - "arbitrum-orbit": { - "title": "Arbitrum Orbit", - "text": "

\nLayer 3 (L3)\n

" - }, - "arbos": { - "title": "ArbOS", - "text": "

\nArbitrum's \"operating system\" that trustlessly handles system-level operations; includes the ability to emulate the EVM.\n

" - }, - "assertion": { - "title": "Assertion", - "text": "

\nA staked claim made by an Arbitrum Validator representing a claim about an Arbitrum chain's state. An Assertion may, e.g., propose a new assertion, or may be a step in a Challenge.\n

" - }, - "auction-contract": { - "title": "Auction Contract", - "text": "

\nA smart contract that handles the state, accounting of funds for bids, and various operations of the Timeboost auction. The contract is deployed on the target chain for which Timeboost is enabled.\n

" - }, - "autonomous-auctioneer": { - "title": "Autonomous Auctioneer", - "text": "

\nOff chain software that receives bids from Timeboost participants, processes and validates bids, and then posts the top valid bid (or top two valid bids in the case of a tie) to the Auction Contract to resolve the on-going Timeboost auction. The autonomous auctioneer, for a given chain, is provisioned & deployed by an entity designated by the chain's owner.\n

" - }, - "batch": { - "title": "Batch", - "text": "

\nUnderlying Chain,Fast Inbox\n

" - }, - "blockchain": { - "title": "Blockchain", - "text": "

\nA distributed digital ledger that is used to record transactions and store data in a secure, transparent, and tamper-resistant way, notably in cryptocurrency protocols. \n

" - }, - "bls-signature": { "title": "BLS Signature", "text": "

\n\n

" }, - "bold": { - "title": "BoLD", - "text": "

\nShort for \"Bounded Liquidity Delay\"; latest version of the Arbitrum Challenge protocol designed to eliminate delay attack vectors (see here for more). Not currently on mainnet. \n

" - }, - "bridge": { - "title": "Bridge", - "text": "

\nCross-chain message\n

" - }, - "chain-owner": { - "title": "Chain Owner", - "text": "

\nAn entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, and adding and removing other chain owners.\n

" - }, - "chain-state": { "title": "Chain state", "text": "

\n\n

" }, - "challenge": { - "title": "Challenge", - "text": "

\nWhen two Stakers disagree about the correct verdict on an Assertion, those stakers can be put in a challenge. The challenge is refereed by the contracts on the underlying chain. Eventually one staker wins the challenge. The protocol guarantees that an honest party will always win a challenge; the loser forfeits their stake. \n

" - }, - "challenge-period": { - "title": "Challenge Period", - "text": "

\nWindow of time (one week on Arbitrum One) over which an Assertion can be challenged, and after which the assertion can be confirmed.\n

" - }, - "challenge-protocol": { - "title": "Challenge protocol", - "text": "

\nAssertion\n

" - }, - "client": { "title": "Client", "text": "

\n\n

" }, - "confirmation": { - "title": "Confirmation", - "text": "

\nAssertion,L2 to L1 Message\n

" - }, - "crosschain-message": { - "title": "Cross-chain message", - "text": "

\nAn action taken on some chain A which asynchronously initiates an additional action on chain B. \n

" - }, - "custom-arbtoken": { - "title": "Custom Arb-Token", - "text": "

\nAny L2 token contract registered to the Arb Token Bridge that isn't a standard arb-token (i.e., a token that uses any gateway other than the StandardERC20 gateway ).\n

" - }, - "custom-gateway": { - "title": "Custom gateway", - "text": "

\nAny Token Gateway that isn't the StandardERC20 gateway.\n

" - }, - "dapp": { - "title": "dApp", - "text": "

\nShort for \"decentralized application.\" A dApp typically consists of smart contracts as well as a user-interface for interacting with them.\n

" - }, - "data-availability-certificate": { - "title": "Data Availability Certificate", - "text": "

\n\n

" - }, - "defensive-validator": { - "title": "Defensive Validator", - "text": "

\nA Validator that watches an Arbitrum chain and takes action (i.e., stakes and challenges) only when and if an invalid Assertion occurs.\n

" - }, - "delayed-inbox": { - "title": "Delayed Inbox", - "text": "

\nFast Inbox\n

" - }, - "devtools-dashboard": { - "title": "Dev-Tools Dashboard", - "text": "

\nWeb application built and maintained by Offchain Labs for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of Cross-chain messages; visit it here. \n

" - }, - "dissection": { - "title": "Dissection", - "text": "

\nA step in the Challenge protocol in which two challenging parties interactively narrow down their disagreement until they reach a One Step Proof.\n

" - }, - "ethereum-wallet": { - "title": "Ethereum Wallet", - "text": "

\nA software application used for transacting with the Ethereum Blockchain.\n

" - }, - "evm": { - "title": "EVM+", - "text": "

\nThe paradigm introduced by Stylus in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced.\n

" - }, - "express-lane": { - "title": "Express Lane", - "text": "

\nTimeboost\n

" - }, - "express-lane-controller": { - "title": "Express Lane Controller", - "text": "

\nAn address, defined in the Auction Contract, that is granted the privilege to use the Express Lane. These privileges are granted after verifying that the incoming transactions were properly signed by the express lane controller, among other checks.\n

" - }, - "fair-ordering-algorithm": { "title": "Fair Ordering Algorithm", "text": "

\n\n

" }, - "fast-exit--liquidity-exit": { - "title": "Fast Exit / Liquidity Exit", - "text": "

\nA means by which a user can bypass an Arbitrum chain's Challenge Period when withdrawing fungible assets (or more generally, executing some \"fungible\" L2 to L1 operation); for trustless fast exits, a liquidity provider facilitates an atomic swap of the asset on L2 directly to L1.\n

" - }, - "fast-inbox": { - "title": "Fast Inbox", - "text": "

\nDelayed Inbox\n

" - }, - "first-come-first-serve-fcfs": { - "title": "First Come First Serve (FCFS)", - "text": "

\nA type of Transaction Ordering Policy used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block in the order that the transactions arrived.\n

" - }, - "forceinclusion": { - "title": "Force-Inclusion", - "text": "

\nDelayed Inbox\n

" - }, - "fraud-proof": { "title": "Fraud proof", "text": "

\n\n

" }, - "gas-price-floor": { "title": "Gas Price Floor", "text": "

\n\n

" }, - "gateway-router": { - "title": "Gateway Router", - "text": "

\nContracts in the Arb Token Bridge responsible for mapping tokens to their appropriate Token Gateway.\n

" - }, - "genericcustom-gateway": { - "title": "Generic-Custom Gateway", - "text": "

\nA particular Custom gateway via which an L1 token contract can be registered to a token contract deployed to L2. A useful alternative to the StandardERC20 gateway for projects that wish to control the address of their L2 token contract, maintain L2 token contract upgradability, and for various other use-cases. \n

" - }, - "ink": { - "title": "Ink", - "text": "

\nThe equivalent of gas in the Stylus vm. Ink is introduced for finer granularity than gas offers since Stylus's operations are considerably cheaper than their EVM analogs. \n

" - }, - "l2-block": { - "title": "L2 Block", - "text": "

\nData structure that represents a group of L2 transactions (analogous to L1 blocks).\n

" - }, - "l2-to-l1-message": { - "title": "L2 to L1 Message", - "text": "

\nChallenge Period\n

" - }, - "layer-3-l3": { "title": "Layer 3 (L3)", "text": "

\n\n

" }, - "native-fee-token": { - "title": "Native Fee Token", - "text": "

\nArbitrum Orbit\n

" - }, - "offchain-labs": { "title": "Offchain Labs", "text": "

\n\n

" }, - "one-step-proof": { - "title": "One Step Proof", - "text": "

\nFinal step in a challenge; a single operation of the Arbitrum VM (WASM ) is executed on the underlying chain, and the validity of its state transition is verified.\n

" - }, - "outbox": { - "title": "Outbox", - "text": "

\nAn L1 contract responsible for tracking L2 to L1 Messages, including withdrawals, which can be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages.\n

" - }, - "portal": { - "title": "Portal", - "text": "

\nA web application maintained by Offchain Labs showcasing the Arbitrum ecosystem; visit it here.\n

" - }, - "rblock": { - "title": "RBlock", - "text": "

\nRefer to Assertion \n

" - }, - "reorg": { - "title": "Reorg", - "text": "

\nA situation in which transactions on a chain that were at some point considered accepted then get rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's Fast Inbox, the only way the chain can experience a reorg is if its Underlying Chain itself reorgs. Of note, Fraud proofs do not cause reorgs. \n

" - }, - "retryable-autoredeem": { - "title": "Retryable Autoredeem", - "text": "

\nThe \"automatic\" (i.e., requiring no additional user action) execution of a Retryable Ticket on an Arbitrum chain.\n

" - }, - "retryable-redeem": { - "title": "Retryable Redeem", - "text": "

\nThe execution of a Retryable Ticket on L2; can be automatic (see Retryable Autoredeem) or manual via a user-initiated L2 transaction.\n

" - }, - "retryable-ticket": { - "title": "Retryable Ticket", - "text": "

\nAn L1 to L2 cross chain message initiated by an L1 transaction sent to an Arbitrum chain for execution (e.g., a token deposit).\n

" - }, - "reverse-token-gateway": { - "title": "Reverse Token Gateway", - "text": "

\nToken Gateway\n

" - }, - "sequencer-feed": { - "title": "Sequencer Feed", - "text": "

\nSoft Confirmation,Batch\n

" - }, - "shared-sequencing": { "title": "Shared Sequencing", "text": "

\n\n

" }, - "smart-contract": { - "title": "Smart Contract", - "text": "

\nA computer program whose operations are defined and executed within a blockchain consensus protocol.\n

" - }, - "soft-confirmation": { "title": "Soft Confirmation", "text": "

\n\n

" }, - "speed-limit": { "title": "Speed Limit", "text": "

\n\n

" }, - "staker": { - "title": "Staker", - "text": "

\nValidator,Assertion\n

" - }, - "standard-arbtoken": { - "title": "Standard Arb-Token", - "text": "

\nAn token contract on an Arbitrum chain deployed via the StandardERC20 gateway; offers basic ERC20 functionality in addition to deposit / withdrawal affordances.\n

" - }, - "standarderc20-gateway": { - "title": "StandardERC20 gateway", - "text": "

\nToken Gateway,Standard Arb-Token\n

" - }, - "state-transition-function": { - "title": "State Transition Function", - "text": "

\nThe STF (State Transition Function) defines how new blocks are produced from input messages (i.e. transactions) in an Arbitrum chain.\n

" - }, - "stylus": { "title": "Stylus", "text": "

\n\n

" }, - "timeboost": { "title": "Timeboost", "text": "

\n\n

" }, - "token-gateway": { - "title": "Token Gateway", - "text": "

\nStandardERC20 gateway,Generic-Custom Gateway,WETH Gateway\n

" - }, - "transaction": { - "title": "Transaction", - "text": "

\nA user-initiated interaction with a Blockchain. Transactions are typically signed by users via wallets and are paid for via transaction fees. \n

" - }, - "transaction-ordering-policy": { - "title": "Transaction Ordering Policy", - "text": "

\nThe rules and logic employed by a chain to order incoming transactions into a block.\n

" - }, - "underlying-chain": { "title": "Underlying Chain", "text": "

\n\n

" }, - "validator": { - "title": "Validator", - "text": "

\nArbitrum Full Node,Assertion,Watchtower Validator,Defensive Validator\n

" - }, - "wasm": { - "title": "WASM", - "text": "

\nFraud proof,Stylus\n

" - }, - "wasmer": { - "title": "WASMer", - "text": "

\nA popular WebAssembly runtime for executing WASM binaries. A fork of WASMer is used for executing Stylus programs. WASMer executes considerably faster than Geth executes EVM code, contributing to Stylus's lower fees.\n

" - }, - "watchtower-validator": { - "title": "Watchtower Validator", - "text": "

\nA Validator that never stakes / never takes on chain action, who raises the alarm (by whatever off-chain means it chooses) if it witnesses an invalid assertion.\n

" - }, - "weth-gateway": { - "title": "WETH Gateway", - "text": "

\nToken Gateway for handing the bridging of wrapped Ether (WETH). WETH is unwrapped on L1 and rewrapped on L1 upon depositing (and vice-versa upon withdrawing), ensuring WETH on L2 always remains collateralized. \n

" - } -} +"active-validator":{"title":"Active Validator","text":"

A bonded Validator that makes disputable assertions to advance the state of an Arbitrum chain or to challenge the validity of others' assertions. (Not to be confused with the Sequencer.)

\n"}, +"address-alias":{"title":"Address Alias","text":"

An address deterministically generated from a parent chain contract address used on child chain to safely identify the source of an parent to child chain message.

\n"}, +"arb-token-bridge":{"title":"Arb Token Bridge","text":"

A series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless movement of ERC-20 tokens between the two layers.

\n"}, +"arbified-token-list":{"title":"Arbified Token List","text":"

A token list that conforms to Uniswap's token list specification; Arbified lists are generated by inputting externally maintained list (i.e., coinmarketcap's list) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain bridged via the canonical Arb Token Bridge from tokens on the input list. (See code here.)

\n"}, +"arbitrum":{"title":"Arbitrum","text":"

A suite of Ethereum child chain scaling technologies built with the Arbitrum Nitro tech stack that includes Arbitrum One (a live implementation of the Arbitrum Rollup Protocol) and Arbitrum Nova (a live implementation of the Arbitrum AnyTrust Protocol).

\n"}, +"arbitrum-anytrust-chain":{"title":"Arbitrum AnyTrust Chain","text":"

An Arbitrum chain that implements the Arbitrum AnyTrust Protocol.

\n"}, +"arbitrum-anytrust-protocol":{"title":"Arbitrum AnyTrust Protocol","text":"

An Arbitrum protocol that manages data availability with a permissioned set of parties known as the Data Availability Committee (DAC). This protocol reduces transaction fees by introducing an additional trust assumption for data availability in lieu of Ethereum's Trustless data availability mechanism. Arbitrum Nova is an example of an AnyTrust chain; Arbitrum One is an alternative chain that implements the purely trustless (and more L1-gas intensive) Arbitrum Rollup Protocol.

\n"}, +"arbitrum-bridge-ui":{"title":"Arbitrum Bridge UI","text":"

Web application built and maintained by Offchain Labs for user-interactions with the Arb Token Bridge; visit it here.

\n"}, +"arbitrum-chain":{"title":"Arbitrum chain","text":"

A blockchain that runs on the Arbitrum protocol. Arbitrum chains are EVM compatible, and use an underlying EVM chain (e.g., Ethereum) for settlement and for succinct fraud-proofs (as needed). Arbitrum chains come in two forms: Arbitrum Rollup Chains and Arbitrum AnyTrust Chains.

\n"}, +"arbitrum-chains":{"title":"Arbitrum Chains","text":"

Arbitrum chains (Orbit) refers to the ability for anyone to permissionlessly deploy Layer 3 (L3) chains on top of Arbitrum Layer 2 (L2) chains.

\n"}, +"arbitrum-classic":{"title":"Arbitrum Classic","text":"

Old Arbitrum stack that used custom virtual machine ("AVM"); no public Arbitrum chain uses the classic stack as of 8/31/2022 (they instead use Arbitrum Nitro.)

\n"}, +"arbitrum-full-node":{"title":"Arbitrum Full Node","text":"

A party who keeps track of the state of an Arbitrum chain and receives remote procedure calls (RPCs) from clients. Analogous to a non-staking parent Ethereum node.

\n"}, +"arbitrum-nitro":{"title":"Arbitrum Nitro","text":"

Current Arbitrum tech stack; runs a fork of Geth and uses WebAssembly as its underlying VM for fraud proofs.

\n"}, +"arbitrum-nova":{"title":"Arbitrum Nova","text":"

The first Arbitrum AnyTrust Chain running on Ethereum mainnet. Introduces cheaper transactions; great for gaming and social use-cases. Implements the Arbitrum AnyTrust Protocol, not the Arbitrum Rollup Protocol protocol. Governed by the Arbitrum DAO.

\n"}, +"arbitrum-one":{"title":"Arbitrum One","text":"

The first Arbitrum Rollup Chain running on Ethereum mainnet. Great for decentralized finance and other use-cases that demand strong security guarantees. Governed by the Arbitrum DAO.

\n"}, +"arbitrum-rollup-chain":{"title":"Arbitrum Rollup Chain","text":"

An Arbitrum chain that implements the Arbitrum Rollup Protocol.

\n"}, +"arbitrum-rollup-protocol":{"title":"Arbitrum Rollup Protocol","text":"

A trustless, permissionless Arbitrum protocol that uses its underlying base layer for data availability and inherits its security. This protocol is implemented by our Arbitrum One chain.

\n"}, +"arbos":{"title":"ArbOS","text":"

Arbitrum's "operating system" that trustlessly handles system-level operations; includes the ability to emulate the EVM.

\n"}, +"assertion":{"title":"Assertion","text":"

A bonded claim made by an Arbitrum Validator representing a claim about an Arbitrum chain's state. An Assertion may, e.g., propose a new assertion, or may be a step in a Challenge.

\n"}, +"auction-contract":{"title":"Auction Contract","text":"

A smart contract that handles the state, accounting of funds for bids, and various operations of the Timeboost auction. The contract is deployed on the target chain for which Timeboost is enabled.

\n"}, +"autonomous-auctioneer":{"title":"Autonomous Auctioneer","text":"

Offchain software that receives bids from Timeboost participants, processes and validates bids, and then posts the top valid bid (or top two valid bids in the case of a tie) to the Auction Contract to resolve the on going Timeboost auction. The autonomous auctioneer, for a given chain, is provisioned and deployed by an entity designated by the chain's owner.

\n"}, +"batch":{"title":"Batch","text":"

A group of Arbitrum transactions posted in a single transaction on the Underlying Chain into the Sequencer Inbox by the Sequencer.

\n"}, +"blockchain":{"title":"Blockchain","text":"

A distributed digital ledger that is used to record transactions and store data in a secure, transparent, and tamper-resistant way, notably in cryptocurrency protocols.

\n"}, +"bls-signature":{"title":"BLS Signature","text":"

A cryptographic scheme that allows multiple signatures to be aggregated and compacted into one efficiently verifiable, constant-sized signature. Used in the Arbitrum AnyTrust Protocol for the Data Availability Committee (DAC)'s signatures.

\n"}, +"bold":{"title":"BoLD","text":"

Short for "Bounded Liquidity Delay"; latest version of the Arbitrum Challenge protocol designed to eliminate delay attack vectors (see here for more).

\n"}, +"bonder":{"title":"Bonder","text":"

A Validator who deposits a bond (in Ether on Arbitrum One and Arbitrum Nova ) to vouch for a particular assertion in an Arbitrum Chain. A validator who bonds on a false assertion can expect to lose their bond. An honest bonder can recover their bond once the assertion they are bonded on has been confirmed.\nAlso known as: staker

\n"}, +"bridge":{"title":"Bridge","text":"

A set of smart contracts for sending Cross-chain messages between blockchains. Every Arbitrum chain includes a bridge to/from its Parent chain.

\n"}, +"chain-owner":{"title":"Chain Owner","text":"

An entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, and adding and removing other chain owners.

\n"}, +"chain-state":{"title":"Chain state","text":"

A particular point in the history of an Arbitrum chain. A chain's state is determined by applying Arbitrum state-transition function to sequence of transactions (i.e., the chain's history).

\n"}, +"challenge":{"title":"Challenge","text":"

When two bonders disagree about the correct verdict on an assertion, those bonders can be put in a challenge. The challenge is refereed by the contracts on the underlying chain. Eventually one bonder wins the challenge. The protocol guarantees that an honest party will always win a challenge; the loser forfeits their bond.

\n"}, +"challenge-period":{"title":"Challenge Period","text":"

Window of time (one week on Arbitrum One) over which an Assertion can be challenged, and after which the assertion can be confirmed.

\n"}, +"challenge-protocol":{"title":"Challenge protocol","text":"

The protocol by which assertions are submitted, disputed, and ultimately confirmed. The Challenge Protocol guarantees that only valid assertions will be confirmed provided that there is at least one honest active validator.

\n"}, +"child-chain":{"title":"Child chain","text":"

An Arbitrum Chain that settles to a Parent chain. For example, Arbitrum One and Arbitrum Nova are child chains of Ethereum.

\n"}, +"client":{"title":"Client","text":"

A program running on a user's machine, often in the user's browser, that interacts with contracts on an Arbitrum chain and provides a user interface.

\n"}, +"confirmation":{"title":"Confirmation","text":"

The decision by an Arbitrum chain to finalize an assertion as part of the chain's history. Once an assertion is confirmed its Child to parent chain Messages (e.g., withdrawals) can be executed.

\n"}, +"crosschain-message":{"title":"Cross-chain message","text":"

An action taken on some chain A which asynchronously initiates an additional action on chain B.

\n"}, +"custom-arbtoken":{"title":"Custom Arb-Token","text":"

Any child chain token contract registered to the Arb Token Bridge that isn't a standard arb-token (i.e., a token that uses any gateway other than the StandardERC20 gateway ).

\n"}, +"custom-gateway":{"title":"Custom gateway","text":"

Any Token Gateway that isn't the StandardERC20 gateway.

\n"}, +"dapp":{"title":"dApp","text":"

Short for "decentralized application." A dApp typically consists of smart contracts as well as a user-interface for interacting with them.

\n"}, +"data-availability-certificate":{"title":"Data Availability Certificate","text":"

Signed promise from a Data Availability Committee (DAC) attesting to the availability of a batch of data for an Arbitrum AnyTrust Chain.

\n"}, +"data-availability-committee-dac":{"title":"Data Availability Committee (DAC)","text":"

A permissioned set of parties responsible for enforcing data availability on a chain using the Arbitrum AnyTrust Protocol.

\n

See Introducing AnyTrust Chains: Cheaper, Faster L2 Chains with Minimal Trust Assumptions to learn more.

\n"}, +"defensive-validator":{"title":"Defensive Validator","text":"

A Validator that watches an Arbitrum chain and takes action (i.e., bonds and challenges) only when and if an invalid Assertion occurs.

\n"}, +"delayed-inbox":{"title":"Delayed Inbox","text":"

A contract that holds Parent chain initiated messages to be eventually included in the Sequencer Inbox. Inclusion of messages doesn't depend on the Sequencer.

\n"}, +"devtools-dashboard":{"title":"Dev-Tools Dashboard","text":"

Web application built and maintained by Offchain Labs for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of Cross-chain messages; visit it here.

\n"}, +"dissection":{"title":"Dissection","text":"

A step in the Challenge protocol in which two challenging parties interactively narrow down their disagreement until they reach a One Step Proof.

\n"}, +"ethereum-wallet":{"title":"Ethereum Wallet","text":"

A software application used for transacting with the Ethereum Blockchain.

\n"}, +"evm":{"title":"EVM+","text":"

The paradigm introduced by Stylus in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced.

\n"}, +"express-lane":{"title":"Express Lane","text":"

A component of Timeboost, the express lane is a special endpoint on the Sequencer that immediately sequences incoming, valid transactions signed by the current express lane controller.

\n"}, +"express-lane-controller":{"title":"Express Lane Controller","text":"

An address, defined in the Auction Contract, that is granted the privilege to use the Express Lane. These privileges are granted after verifying that the incoming transactions were properly signed by the express lane controller, among other checks.

\n"}, +"externally-owned-accounts":{"title":"Externally Owned Accounts","text":"

An externally owned account (EOA) is the account (public/private key pairs) that has a physical address location. Commonly referred to as a wallet, however, we distinguish an EOA from the user client software wallet.

\n"}, +"fast-exit--liquidity-exit":{"title":"Fast Exit / Liquidity Exit","text":"

A means by which a user can bypass an Arbitrum chain's Challenge Period when withdrawing fungible assets (or more generally, executing some "fungible" child chain to parent chain operation); for trustless fast exits, a liquidity provider facilitates an atomic swap of the asset on a child chain directly to a parent chain.

\n"}, +"first-come-first-serve-fcfs":{"title":"First Come First Serve (FCFS)","text":"

A type of Transaction Ordering Policy used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block in the order that the transactions arrived.

\n"}, +"forceinclusion":{"title":"Force-Inclusion","text":"

Censorship resistant path for including a message into an Arbitrum chain via the Delayed Inbox on its Parent chain; bypasses any Sequencer involvement.

\n"}, +"fraud-proof":{"title":"Fraud proof","text":"

The means by which an Active Validator proves to its underlying chain that an invalid state transition has taken place.

\n"}, +"gas-price-floor":{"title":"Gas Price Floor","text":"

Protocol-enforced minimum gas price on an Arbitrum chain; currently 0.1 gwei on Arbitrum One and 0.01 gwei on Arbitrum Nova.

\n"}, +"gateway-router":{"title":"Gateway Router","text":"

Contracts in the Arb Token Bridge responsible for mapping tokens to their appropriate Token Gateway.

\n"}, +"genericcustom-gateway":{"title":"Generic-Custom Gateway","text":"

A particular Custom gateway via which a parent chain token contract can be registered to a token contract deployed to a child chain. A useful alternative to the StandardERC20 gateway for projects that wish to control the address of their child chain token contract, maintain the child chain token contract upgradability, and for various other use-cases.

\n"}, +"geth":{"title":"Geth","text":"

An execution-layer client that defines the Ethereum state transition function and handles network-layer logic like transaction memory pooling. Arbitrum Nitro utilizes a fork of Geth to implement Arbitrum's state transition function.

\n"}, +"ink":{"title":"Ink","text":"

The equivalent of gas in the Stylus vm. Ink is introduced for finer granularity than gas offers since Stylus's operations are considerably cheaper than their EVM analogs.

\n"}, +"l2-block":{"title":"L2 Block","text":"

Data structure that represents a group of L2 transactions (analogous to L1 blocks).

\n"}, +"l2-to-l1-message":{"title":"L2 to L1 Message","text":"

A message initiated from within an Arbitrum chain to be eventually executed on Layer 1 (parent chain) (e.g., token or Ether withdrawals). On Rollup chains like Arbitrum One, the Challenge Period must pass before a child to parent chain message is executed.

\n"}, +"layer-1-l1":{"title":"Layer 1 (L1)","text":"

The base protocol and underlying blockchain of the Ethereum network. Responsible for maintaining the integrity of the distributed ledger and executing smart contracts. Contains both Ethereum's execution layer and consensus layer.

\n"}, +"layer-2-l2":{"title":"Layer 2 (L2)","text":"

Trustless scaling solutions built on top of Ethereum's Layer 1 (L1) base protocol, such as state channels, plasma chains, optimistic rollups, and ZK-rollups. Layer 2 solutions aim to increase scalability and reduce the cost of transactions on Ethereum's Layer 1 without introducing additional trust assumptions.

\n"}, +"layer-3-l3":{"title":"Layer 3 (L3)","text":"

An Arbitrum chain whose core contract reside on an Arbitrum Layer 2 (L2) chain.

\n"}, +"native-fee-token":{"title":"Native Fee Token","text":"

An ERC-20 token used as the native currency for gas fees on an Arbitrum chain (i.e., as opposed to using Ether). Arbitrum chains introduced the option for chains to use native fee tokens.

\n"}, +"offchain-labs":{"title":"Offchain Labs","text":"

The initial builders Arbitrum; current contributors to the Arbitrum ecosystem and service providers to the Arbitrum DAO. Offchain also runs and maintains the Sequencers for Arbitrum One and Arbitrum Nova.

\n"}, +"one-step-proof":{"title":"One Step Proof","text":"

Final step in a challenge; a single operation of the Arbitrum VM (WASM ) is executed on the underlying chain, and the validity of its state transition is verified.

\n"}, +"outbox":{"title":"Outbox","text":"

A parent chain contract responsible for tracking Child to parent chain Messages, including withdrawals, which can be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages.

\n"}, +"parent-chain":{"title":"Parent chain","text":"

EVM compatible chain that acts as the settlement layer for one or more Arbitrum Chains (aka Child chain ). E.g., Ethereum is the parent chain of both Arbitrum One and Arbitrum Nova. Parent chain is synonymous with "underlying chain."

\n"}, +"portal":{"title":"Portal","text":"

A web application maintained by Offchain Labs showcasing the Arbitrum ecosystem; visit it here.

\n"}, +"raas":{"title":"raas","text":"

RaaS (Rollup as a Service) is a platform that provides the infrastructure and tools needed to deploy and operate blockchain Rollups without requiring teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology.

\n"}, +"rblock":{"title":"RBlock","text":"

Refer to Assertion

\n"}, +"reorg":{"title":"Reorg","text":"

A situation in which transactions on a chain that were at some point considered accepted then get rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's Sequencer Inbox, the only way the chain can experience a reorg is if its Underlying Chain itself reorgs. Of note, Fraud proofs do not cause reorgs.

\n"}, +"retryable-autoredeem":{"title":"Retryable Autoredeem","text":"

The "automatic" (i.e., requiring no additional user action) execution of a Retryable Ticket on an Arbitrum chain.

\n"}, +"retryable-redeem":{"title":"Retryable Redeem","text":"

The execution of a Retryable Ticket on a child chain; can be automatic (see Retryable Autoredeem) or manual via a user-initiated child chain transaction.

\n"}, +"retryable-ticket":{"title":"Retryable Ticket","text":"

A parent to child cross chain message initiated by a parent chain transaction sent to an Arbitrum chain for execution (e.g., a token deposit).

\n"}, +"reverse-token-gateway":{"title":"Reverse Token Gateway","text":"

A Token Gateway in which the Child chain gateway contract escrows and releases tokens, which the Parent chain Gateway contract mints and burns tokens. This in the inverse to how "typical" gateways work.

\n"}, +"sequencer":{"title":"Sequencer","text":"

An entity (currently a single-party on Arbitrum One) given rights to reorder transactions in the Sequencer Inbox over a fixed window of time, who can thus give clients sub-blocktime Soft Confirmations. (Not to be confused with a Validator).

\n"}, +"sequencer-feed":{"title":"Sequencer Feed","text":"

Offchain data feed published by the Sequencer which clients can subscribe to for Soft Confirmations of transactions before they are posted in batches.

\n"}, +"sequencer-inbox":{"title":"Sequencer Inbox","text":"

Contract that holds a sequence of messages sent by clients to an Arbitrum Chain; a message can be put into the Sequencer Inbox directly by the Sequencer or indirectly through the Delayed Inbox.

\n"}, +"shared-sequencing":{"title":"Shared Sequencing","text":"

A protocol design space in which multiple rollups use the same entity as their Sequencer; potential benefits include enhanced interoperability and credible neutrality.

\n"}, +"smart-contract":{"title":"Smart Contract","text":"

A computer program whose operations are defined and executed within a blockchain consensus protocol.

\n"}, +"soft-confirmation":{"title":"Soft Confirmation","text":"

A semi-trusted promise from the Sequencer to post a user's transaction in the near future; soft-confirmations happen prior to posting on the Parent chain, and thus can be given near-instantaneously (i.e., faster than the parent chain's block times)

\n"}, +"speed-limit":{"title":"Speed Limit","text":"

Target computation limit for an Arbitrum chain. Arbitrum One and Arbitrum Nova currently target 7,000,000 gas / second. When computation exceeds this limit, fees rise, via EIP-1559.

\n"}, +"standard-arbtoken":{"title":"Standard Arb-Token","text":"

An token contract on an Arbitrum chain deployed via the StandardERC20 gateway; offers basic ERC-20 functionality in addition to deposit / withdrawal affordances.

\n"}, +"standarderc20-gateway":{"title":"StandardERC20 gateway","text":"

Token Gateway via which any underlying chain's ERC-20 token can permissionlessly bridge; the StandardERC20 gateway contracts deploy a Standard Arb-Token on the Child chain for each bridged token.

\n"}, +"state-transition-function":{"title":"State Transition Function","text":"

The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain.

\n"}, +"stylus":{"title":"Stylus","text":"

Upgrade to the Arbitrum Nitro virtual machine that allows smart contract support for languages like Rust and C++ by taking advantage of Nitro's use of WASM. Currently on testnet (read more).

\n"}, +"timeboost":{"title":"Timeboost","text":"

A transaction ordering policy in which entities can bid for the right to access an express lane on the Sequencer for faster transaction inclusion. See the research specification to learn more.

\n"}, +"token-gateway":{"title":"Token Gateway","text":"

A pair of contracts in the token bridge — one on the Parent chain , one on the Child chain — that provide a particular mechanism for handling the transfer of tokens between layers. Token gateways currently active in the bridge include the StandardERC20 gateway , the Generic-Custom Gateway , and the WETH Gateway.

\n"}, +"transaction":{"title":"Transaction","text":"

A user-initiated interaction with a Blockchain. Transactions are typically signed by users via wallets and are paid for via transaction fees.

\n"}, +"transaction-ordering-policy":{"title":"Transaction Ordering Policy","text":"

The rules and logic employed by a chain to order incoming transactions into a block.

\n"}, +"trustless":{"title":"Trustless","text":"

In the context of Ethereum, trustless refers to the ability of a system to operate without reliance on a central authority or intermediary. Instead, users place their trust in math and protocols.

\n

This is achieved through the use of cryptographic techniques and decentralized consensus mechanisms that let users verify the integrity of network transactions using open-source software. Trustless systems are considered to be more secure and resistant to fraud or tampering because they don't rely on a single point of failure that can be exploited by attackers.

\n"}, +"underlying-chain":{"title":"Underlying Chain","text":"

Synonymous with Parent chain.

\n"}, +"validator":{"title":"Validator","text":"

An Arbitrum Full Node that tracks the status of the chains' Assertions. A validator may be a Watchtower Validator, a Defensive Validator, or an Active Validator.

\n"}, +"wallet":{"title":"Wallet","text":"

When referring to a wallet, we mean the user client software enabling user actions. Often, client software is a browser extension, mobile, or desktop app. Also refer to Externally Owned Accounts.

\n"}, +"wasm":{"title":"WASM","text":"

Widely supported binary code format for executable programs. Used by Arbitrum Nitro for Fraud proofs , and more broadly used by Stylus to support performant smart contracts in a wide variety of languages.

\n"}, +"wasmer":{"title":"WASMer","text":"

A popular WebAssembly runtime for executing WASM binaries. A fork of WASMer is used for executing Stylus programs. WASMer executes considerably faster than Geth executes EVM code, contributing to Stylus's lower fees.

\n"}, +"watchtower-validator":{"title":"Watchtower Validator","text":"

A Validator that never bonds / never takes on chain action, who raises the alarm (by whatever offchain means it chooses) if it witnesses an invalid assertion.

\n"}, +"weth-gateway":{"title":"WETH Gateway","text":"

Token Gateway for handing the bridging of wrapped Ether (WETH). WETH is unwrapped on the parent chain and rewrapped on the parent chain upon depositing (and vice-versa upon withdrawing), ensuring WETH on the child chain always remains collateralized.

\n"} +} \ No newline at end of file diff --git a/vercel.json b/vercel.json index ddfa6fedff..2ff224af07 100644 --- a/vercel.json +++ b/vercel.json @@ -340,6 +340,11 @@ "destination": "/how-arbitrum-works/l1-to-l2-messaging", "permanent": false }, + { + "source": "/(docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality/?)", + "destination": "/(docs/launch-arbitrum-chain/configure-your-chain/common-configurations/arbitrum-chain-finality/?)", + "permanent": false + }, { "source": "/(docs/mainnet-beta/?)", "destination": "/build-decentralized-apps/reference/mainnet-risks", @@ -355,6 +360,11 @@ "destination": "/how-arbitrum-works/optimistic-rollup", "permanent": false }, + { + "source": "/(docs/run-arbitrum-node/sequencer/run-feed-relay/?)", + "destination": "/(docs/run-arbitrum-node/run-feed-relay/?)", + "permanent": false + }, { "source": "/(docs/tx_lifecycle/?)", "destination": "/how-arbitrum-works/transaction-lifecycle", From c72a242f0dcdca3094981752e386a3ce6da4b385 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 14:28:07 -0500 Subject: [PATCH 38/75] undoing my oopsie --- docs/stylus-by-example/applications/erc20.mdx | 369 +++++++++++++ .../stylus-by-example/applications/erc721.mdx | 504 ++++++++++++++++++ .../applications/multi_call.mdx | 129 +++++ .../stylus-by-example/applications/sidebar.js | 27 + .../applications/vending_machine.mdx | 145 +++++ .../basic_examples/abi_decode.mdx | 139 +++++ .../basic_examples/abi_encode.mdx | 218 ++++++++ .../basic_examples/bytes_in_bytes_out.mdx | 54 ++ .../basic_examples/constants.mdx | 102 ++++ .../basic_examples/errors.mdx | 196 +++++++ .../basic_examples/events.mdx | 225 ++++++++ .../basic_examples/function.mdx | 234 ++++++++ .../basic_examples/function_selector.mdx | 40 ++ .../basic_examples/hashing.mdx | 211 ++++++++ .../basic_examples/hello_world.mdx | 95 ++++ .../basic_examples/inheritance.mdx | 137 +++++ .../basic_examples/primitive_data_types.mdx | 298 +++++++++++ .../basic_examples/sending_ether.mdx | 152 ++++++ .../basic_examples/sidebar.js | 82 +++ .../basic_examples/variables.mdx | 125 +++++ .../basic_examples/vm_affordances.mdx | 161 ++++++ docs/stylus/concepts/how-it-works.md | 14 +- docs/stylus/how-tos/caching-contracts.mdx | 10 - 23 files changed, 3656 insertions(+), 11 deletions(-) create mode 100644 docs/stylus-by-example/applications/erc20.mdx create mode 100644 docs/stylus-by-example/applications/erc721.mdx create mode 100644 docs/stylus-by-example/applications/multi_call.mdx create mode 100644 docs/stylus-by-example/applications/sidebar.js create mode 100644 docs/stylus-by-example/applications/vending_machine.mdx create mode 100644 docs/stylus-by-example/basic_examples/abi_decode.mdx create mode 100644 docs/stylus-by-example/basic_examples/abi_encode.mdx create mode 100644 docs/stylus-by-example/basic_examples/bytes_in_bytes_out.mdx create mode 100644 docs/stylus-by-example/basic_examples/constants.mdx create mode 100644 docs/stylus-by-example/basic_examples/errors.mdx create mode 100644 docs/stylus-by-example/basic_examples/events.mdx create mode 100644 docs/stylus-by-example/basic_examples/function.mdx create mode 100644 docs/stylus-by-example/basic_examples/function_selector.mdx create mode 100644 docs/stylus-by-example/basic_examples/hashing.mdx create mode 100644 docs/stylus-by-example/basic_examples/hello_world.mdx create mode 100644 docs/stylus-by-example/basic_examples/inheritance.mdx create mode 100644 docs/stylus-by-example/basic_examples/primitive_data_types.mdx create mode 100644 docs/stylus-by-example/basic_examples/sending_ether.mdx create mode 100644 docs/stylus-by-example/basic_examples/sidebar.js create mode 100644 docs/stylus-by-example/basic_examples/variables.mdx create mode 100644 docs/stylus-by-example/basic_examples/vm_affordances.mdx diff --git a/docs/stylus-by-example/applications/erc20.mdx b/docs/stylus-by-example/applications/erc20.mdx new file mode 100644 index 0000000000..3837718aa6 --- /dev/null +++ b/docs/stylus-by-example/applications/erc20.mdx @@ -0,0 +1,369 @@ +--- +title: 'ERC-20 • Stylus by Example' +description: 'An example implementation of the ERC-20 token standard in Rust using Arbitrum Stylus.' +--- + +{/* Begin Content */} + +# ERC-20 + +Any contract that follows the [ERC-20 standard](https://eips.ethereum.org/EIPS/eip-20) is an ERC-20 token. + +ERC-20 tokens provide functionalities to + +- transfer tokens +- allow others to transfer tokens on behalf of the token holder + +Here is the interface for ERC-20. + +```solidity +interface IERC20 { + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address recipient, uint256 amount) + external + returns (bool); + function allowance(address owner, address spender) + external + view + returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function transferFrom(address sender, address recipient, uint256 amount) + external + returns (bool); +} +``` + +Example implementation of an ERC-20 token contract written in Rust. + +### src/erc20.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +//! Implementation of the ERC-20 standard +//! +//! The eponymous [`Erc20`] type provides all the standard methods, +//! and is intended to be inherited by other contract types. +//! +//! You can configure the behavior of [`Erc20`] via the [`Erc20Params`] trait, +//! which allows specifying the name, symbol, and decimals of the token. +//! +//! Note that this code is unaudited and not fit for production use. + +// Imported packages +use alloc::string::String; +use alloy_primitives::{Address, U256}; +use alloy_sol_types::sol; +use core::marker::PhantomData; +use stylus_sdk::{ + evm, + msg, + prelude::*, +}; + +pub trait Erc20Params { + /// Immutable token name + const NAME: &'static str; + + /// Immutable token symbol + const SYMBOL: &'static str; + + /// Immutable token decimals + const DECIMALS: u8; +} + +sol_storage! { + /// Erc20 implements all ERC-20 methods. + pub struct Erc20 { + /// Maps users to balances + mapping(address => uint256) balances; + /// Maps users to a mapping of each spender's allowance + mapping(address => mapping(address => uint256)) allowances; + /// The total supply of the token + uint256 total_supply; + /// Used to allow [`Erc20Params`] + PhantomData phantom; + } +} + +// Declare events and Solidity error types +sol! { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + error InsufficientBalance(address from, uint256 have, uint256 want); + error InsufficientAllowance(address owner, address spender, uint256 have, uint256 want); +} + +/// Represents the ways methods may fail. +#[derive(SolidityError)] +pub enum Erc20Error { + InsufficientBalance(InsufficientBalance), + InsufficientAllowance(InsufficientAllowance), +} + +// These methods aren't exposed to other contracts +// Methods marked as "pub" here are usable outside of the erc20 module (i.e. they're callable from lib.rs) +// Note: modifying storage will become much prettier soon +impl Erc20 { + /// Movement of funds between 2 accounts + /// (invoked by the external transfer() and transfer_from() functions ) + pub fn _transfer( + &mut self, + from: Address, + to: Address, + value: U256, + ) -> Result<(), Erc20Error> { + // Decreasing sender balance + let mut sender_balance = self.balances.setter(from); + let old_sender_balance = sender_balance.get(); + if old_sender_balance < value { + return Err(Erc20Error::InsufficientBalance(InsufficientBalance { + from, + have: old_sender_balance, + want: value, + })); + } + sender_balance.set(old_sender_balance - value); + + // Increasing receiver balance + let mut to_balance = self.balances.setter(to); + let new_to_balance = to_balance.get() + value; + to_balance.set(new_to_balance); + + // Emitting the transfer event + evm::log(Transfer { from, to, value }); + Ok(()) + } + + /// Mints `value` tokens to `address` + pub fn mint(&mut self, address: Address, value: U256) -> Result<(), Erc20Error> { + // Increasing balance + let mut balance = self.balances.setter(address); + let new_balance = balance.get() + value; + balance.set(new_balance); + + // Increasing total supply + self.total_supply.set(self.total_supply.get() + value); + + // Emitting the transfer event + evm::log(Transfer { + from: Address::ZERO, + to: address, + value, + }); + + Ok(()) + } + + /// Burns `value` tokens from `address` + pub fn burn(&mut self, address: Address, value: U256) -> Result<(), Erc20Error> { + // Decreasing balance + let mut balance = self.balances.setter(address); + let old_balance = balance.get(); + if old_balance < value { + return Err(Erc20Error::InsufficientBalance(InsufficientBalance { + from: address, + have: old_balance, + want: value, + })); + } + balance.set(old_balance - value); + + // Decreasing the total supply + self.total_supply.set(self.total_supply.get() - value); + + // Emitting the transfer event + evm::log(Transfer { + from: address, + to: Address::ZERO, + value, + }); + + Ok(()) + } +} + +// These methods are external to other contracts +// Note: modifying storage will become much prettier soon +#[public] +impl Erc20 { + /// Immutable token name + pub fn name() -> String { + T::NAME.into() + } + + /// Immutable token symbol + pub fn symbol() -> String { + T::SYMBOL.into() + } + + /// Immutable token decimals + pub fn decimals() -> u8 { + T::DECIMALS + } + + /// Total supply of tokens + pub fn total_supply(&self) -> U256 { + self.total_supply.get() + } + + /// Balance of `address` + pub fn balance_of(&self, owner: Address) -> U256 { + self.balances.get(owner) + } + + /// Transfers `value` tokens from msg::sender() to `to` + pub fn transfer(&mut self, to: Address, value: U256) -> Result { + self._transfer(msg::sender(), to, value)?; + Ok(true) + } + + /// Transfers `value` tokens from `from` to `to` + /// (msg::sender() must be able to spend at least `value` tokens from `from`) + pub fn transfer_from( + &mut self, + from: Address, + to: Address, + value: U256, + ) -> Result { + // Check msg::sender() allowance + let mut sender_allowances = self.allowances.setter(from); + let mut allowance = sender_allowances.setter(msg::sender()); + let old_allowance = allowance.get(); + if old_allowance < value { + return Err(Erc20Error::InsufficientAllowance(InsufficientAllowance { + owner: from, + spender: msg::sender(), + have: old_allowance, + want: value, + })); + } + + // Decreases allowance + allowance.set(old_allowance - value); + + // Calls the internal transfer function + self._transfer(from, to, value)?; + + Ok(true) + } + + /// Approves the spenditure of `value` tokens of msg::sender() to `spender` + pub fn approve(&mut self, spender: Address, value: U256) -> bool { + self.allowances.setter(msg::sender()).insert(spender, value); + evm::log(Approval { + owner: msg::sender(), + spender, + value, + }); + true + } + + /// Returns the allowance of `spender` on `owner`'s tokens + pub fn allowance(&self, owner: Address, spender: Address) -> U256 { + self.allowances.getter(owner).get(spender) + } +} +``` + +### lib.rs + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +// Modules and imports +mod erc20; + +use alloy_primitives::{Address, U256}; +use stylus_sdk::{ + msg, + prelude::* +}; +use crate::erc20::{Erc20, Erc20Params, Erc20Error}; + +/// Immutable definitions +struct StylusTokenParams; +impl Erc20Params for StylusTokenParams { + const NAME: &'static str = "StylusToken"; + const SYMBOL: &'static str = "STK"; + const DECIMALS: u8 = 18; +} + +// Define the entrypoint as a Solidity storage object. The sol_storage! macro +// will generate Rust-equivalent structs with all fields mapped to Solidity-equivalent +// storage slots and types. +sol_storage! { + #[entrypoint] + struct StylusToken { + // Allows erc20 to access StylusToken's storage and make calls + #[borrow] + Erc20 erc20; + } +} + +#[public] +#[inherit(Erc20)] +impl StylusToken { + /// Mints tokens + pub fn mint(&mut self, value: U256) -> Result<(), Erc20Error> { + self.erc20.mint(msg::sender(), value)?; + Ok(()) + } + + /// Mints tokens to another address + pub fn mint_to(&mut self, to: Address, value: U256) -> Result<(), Erc20Error> { + self.erc20.mint(to, value)?; + Ok(()) + } + + /// Burns tokens + pub fn burn(&mut self, value: U256) -> Result<(), Erc20Error> { + self.erc20.burn(msg::sender(), value)?; + Ok(()) + } +} + +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_erc20_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/applications/erc721.mdx b/docs/stylus-by-example/applications/erc721.mdx new file mode 100644 index 0000000000..01efd78b4d --- /dev/null +++ b/docs/stylus-by-example/applications/erc721.mdx @@ -0,0 +1,504 @@ +--- +title: 'ERC-721 • Stylus by Example' +description: 'An example implementation of the ERC-721 token standard in Rust using Arbitrum Stylus.' +--- + +{/* Begin Content */} + +# ERC-721 + +Any contract that follows the [ERC-721 standard](https://eips.ethereum.org/EIPS/eip-721) is an ERC-721 token. + +Here is the interface for ERC-721. + +```solidity +interface ERC721 { + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + function balanceOf(address _owner) external view returns (uint256); + function ownerOf(uint256 _tokenId) external view returns (address); + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + function approve(address _approved, uint256 _tokenId) external payable; + function setApprovalForAll(address _operator, bool _approved) external; + function getApproved(uint256 _tokenId) external view returns (address); + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} +``` + +Example implementation of an ERC-721 token contract written in Rust. + +### src/erc721.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +//! Implementation of the ERC-721 standard +//! +//! The eponymous [`Erc721`] type provides all the standard methods, +//! and is intended to be inherited by other contract types. +//! +//! You can configure the behavior of [`Erc721`] via the [`Erc721Params`] trait, +//! which allows specifying the name, symbol, and token uri. +//! +//! Note that this code is unaudited and not fit for production use. + +use alloc::{string::String, vec, vec::Vec}; +use alloy_primitives::{Address, U256, FixedBytes}; +use alloy_sol_types::sol; +use core::{borrow::BorrowMut, marker::PhantomData}; +use stylus_sdk::{ + abi::Bytes, + evm, + msg, + prelude::* +}; + +pub trait Erc721Params { + /// Immutable NFT name. + const NAME: &'static str; + + /// Immutable NFT symbol. + const SYMBOL: &'static str; + + /// The NFT's Uniform Resource Identifier. + fn token_uri(token_id: U256) -> String; +} + +sol_storage! { + /// Erc721 implements all ERC-721 methods + pub struct Erc721 { + /// Token id to owner map + mapping(uint256 => address) owners; + /// User to balance map + mapping(address => uint256) balances; + /// Token id to approved user map + mapping(uint256 => address) token_approvals; + /// User to operator map (the operator can manage all NFTs of the owner) + mapping(address => mapping(address => bool)) operator_approvals; + /// Total supply + uint256 total_supply; + /// Used to allow [`Erc721Params`] + PhantomData phantom; + } +} + +// Declare events and Solidity error types +sol! { + event Transfer(address indexed from, address indexed to, uint256 indexed token_id); + event Approval(address indexed owner, address indexed approved, uint256 indexed token_id); + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + // Token id has not been minted, or it has been burned + error InvalidTokenId(uint256 token_id); + // The specified address is not the owner of the specified token id + error NotOwner(address from, uint256 token_id, address real_owner); + // The specified address does not have allowance to spend the specified token id + error NotApproved(address owner, address spender, uint256 token_id); + // Attempt to transfer token id to the Zero address + error TransferToZero(uint256 token_id); + // The receiver address refused to receive the specified token id + error ReceiverRefused(address receiver, uint256 token_id, bytes4 returned); +} + +/// Represents the ways methods may fail. +#[derive(SolidityError)] +pub enum Erc721Error { + InvalidTokenId(InvalidTokenId), + NotOwner(NotOwner), + NotApproved(NotApproved), + TransferToZero(TransferToZero), + ReceiverRefused(ReceiverRefused), +} + +// External interfaces +sol_interface! { + /// Allows calls to the `onERC721Received` method of other contracts implementing `IERC721TokenReceiver`. + interface IERC721TokenReceiver { + function onERC721Received(address operator, address from, uint256 token_id, bytes data) external returns(bytes4); + } +} + +/// Selector for `onERC721Received`, which is returned by contracts implementing `IERC721TokenReceiver`. +const ERC721_TOKEN_RECEIVER_ID: u32 = 0x150b7a02; + +// These methods aren't external, but are helpers used by external methods. +// Methods marked as "pub" here are usable outside of the erc721 module (i.e. they're callable from lib.rs). +impl Erc721 { + /// Requires that msg::sender() is authorized to spend a given token + fn require_authorized_to_spend(&self, from: Address, token_id: U256) -> Result<(), Erc721Error> { + // `from` must be the owner of the token_id + let owner = self.owner_of(token_id)?; + if from != owner { + return Err(Erc721Error::NotOwner(NotOwner { + from, + token_id, + real_owner: owner, + })); + } + + // caller is the owner + if msg::sender() == owner { + return Ok(()); + } + + // caller is an operator for the owner (can manage their tokens) + if self.operator_approvals.getter(owner).get(msg::sender()) { + return Ok(()); + } + + // caller is approved to manage this token_id + if msg::sender() == self.token_approvals.get(token_id) { + return Ok(()); + } + + // otherwise, caller is not allowed to manage this token_id + Err(Erc721Error::NotApproved(NotApproved { + owner, + spender: msg::sender(), + token_id, + })) + } + + /// Transfers `token_id` from `from` to `to`. + /// This function does check that `from` is the owner of the token, but it does not check + /// that `to` is not the zero address, as this function is usable for burning. + pub fn transfer(&mut self, token_id: U256, from: Address, to: Address) -> Result<(), Erc721Error> { + let mut owner = self.owners.setter(token_id); + let previous_owner = owner.get(); + if previous_owner != from { + return Err(Erc721Error::NotOwner(NotOwner { + from, + token_id, + real_owner: previous_owner, + })); + } + owner.set(to); + + // right now working with storage can be verbose, but this will change upcoming version of the Stylus SDK + let mut from_balance = self.balances.setter(from); + let balance = from_balance.get() - U256::from(1); + from_balance.set(balance); + + let mut to_balance = self.balances.setter(to); + let balance = to_balance.get() + U256::from(1); + to_balance.set(balance); + + // cleaning app the approved mapping for this token + self.token_approvals.delete(token_id); + + evm::log(Transfer { from, to, token_id }); + Ok(()) + } + + /// Calls `onERC721Received` on the `to` address if it is a contract. + /// Otherwise it does nothing + fn call_receiver( + storage: &mut S, + token_id: U256, + from: Address, + to: Address, + data: Vec, + ) -> Result<(), Erc721Error> { + if to.has_code() { + let receiver = IERC721TokenReceiver::new(to); + let received = receiver + .on_erc_721_received(&mut *storage, msg::sender(), from, token_id, data.into()) + .map_err(|_e| Erc721Error::ReceiverRefused(ReceiverRefused { + receiver: receiver.address, + token_id, + returned: alloy_primitives::FixedBytes(0_u32.to_be_bytes()), + }))? + .0; + + if u32::from_be_bytes(received) != ERC721_TOKEN_RECEIVER_ID { + return Err(Erc721Error::ReceiverRefused(ReceiverRefused { + receiver: receiver.address, + token_id, + returned: alloy_primitives::FixedBytes(received), + })); + } + } + Ok(()) + } + + /// Transfers and calls `onERC721Received` + pub fn safe_transfer>( + storage: &mut S, + token_id: U256, + from: Address, + to: Address, + data: Vec, + ) -> Result<(), Erc721Error> { + storage.borrow_mut().transfer(token_id, from, to)?; + Self::call_receiver(storage, token_id, from, to, data) + } + + /// Mints a new token and transfers it to `to` + pub fn mint(&mut self, to: Address) -> Result<(), Erc721Error> { + let new_token_id = self.total_supply.get(); + self.total_supply.set(new_token_id + U256::from(1u8)); + self.transfer(new_token_id, Address::default(), to)?; + Ok(()) + } + + /// Burns the token `token_id` from `from` + /// Note that total_supply is not reduced since it's used to calculate the next token_id to mint + pub fn burn(&mut self, from: Address, token_id: U256) -> Result<(), Erc721Error> { + self.transfer(token_id, from, Address::default())?; + Ok(()) + } +} + +// these methods are external to other contracts +#[public] +impl Erc721 { + /// Immutable NFT name. + pub fn name() -> Result { + Ok(T::NAME.into()) + } + + /// Immutable NFT symbol. + pub fn symbol() -> Result { + Ok(T::SYMBOL.into()) + } + + /// The NFT's Uniform Resource Identifier. + #[selector(name = "tokenURI")] + pub fn token_uri(&self, token_id: U256) -> Result { + self.owner_of(token_id)?; // require NFT exist + Ok(T::token_uri(token_id)) + } + + /// Gets the number of NFTs owned by an account. + pub fn balance_of(&self, owner: Address) -> Result { + Ok(self.balances.get(owner)) + } + + /// Gets the owner of the NFT, if it exists. + pub fn owner_of(&self, token_id: U256) -> Result { + let owner = self.owners.get(token_id); + if owner.is_zero() { + return Err(Erc721Error::InvalidTokenId(InvalidTokenId { token_id })); + } + Ok(owner) + } + + /// Transfers an NFT, but only after checking the `to` address can receive the NFT. + /// It includes additional data for the receiver. + #[selector(name = "safeTransferFrom")] + pub fn safe_transfer_from_with_data>( + storage: &mut S, + from: Address, + to: Address, + token_id: U256, + data: Bytes, + ) -> Result<(), Erc721Error> { + if to.is_zero() { + return Err(Erc721Error::TransferToZero(TransferToZero { token_id })); + } + storage + .borrow_mut() + .require_authorized_to_spend(from, token_id)?; + + Self::safe_transfer(storage, token_id, from, to, data.0) + } + + /// Equivalent to [`safe_transfer_from_with_data`], but without the additional data. + /// + /// Note: because Rust doesn't allow multiple methods with the same name, + /// we use the `#[selector]` macro attribute to simulate solidity overloading. + #[selector(name = "safeTransferFrom")] + pub fn safe_transfer_from>( + storage: &mut S, + from: Address, + to: Address, + token_id: U256, + ) -> Result<(), Erc721Error> { + Self::safe_transfer_from_with_data(storage, from, to, token_id, Bytes(vec![])) + } + + /// Transfers the NFT. + pub fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Erc721Error> { + if to.is_zero() { + return Err(Erc721Error::TransferToZero(TransferToZero { token_id })); + } + self.require_authorized_to_spend(from, token_id)?; + self.transfer(token_id, from, to)?; + Ok(()) + } + + /// Grants an account the ability to manage the sender's NFT. + pub fn approve(&mut self, approved: Address, token_id: U256) -> Result<(), Erc721Error> { + let owner = self.owner_of(token_id)?; + + // require authorization + if msg::sender() != owner && !self.operator_approvals.getter(owner).get(msg::sender()) { + return Err(Erc721Error::NotApproved(NotApproved { + owner, + spender: msg::sender(), + token_id, + })); + } + self.token_approvals.insert(token_id, approved); + + evm::log(Approval { + approved, + owner, + token_id, + }); + Ok(()) + } + + /// Grants an account the ability to manage all of the sender's NFTs. + pub fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Erc721Error> { + let owner = msg::sender(); + self.operator_approvals + .setter(owner) + .insert(operator, approved); + + evm::log(ApprovalForAll { + owner, + operator, + approved, + }); + Ok(()) + } + + /// Gets the account managing an NFT, or zero if unmanaged. + pub fn get_approved(&mut self, token_id: U256) -> Result { + Ok(self.token_approvals.get(token_id)) + } + + /// Determines if an account has been authorized to managing all of a user's NFTs. + pub fn is_approved_for_all(&mut self, owner: Address, operator: Address) -> Result { + Ok(self.operator_approvals.getter(owner).get(operator)) + } + + /// Whether the NFT supports a given standard. + pub fn supports_interface(interface: FixedBytes<4>) -> Result { + let interface_slice_array: [u8; 4] = interface.as_slice().try_into().unwrap(); + + if u32::from_be_bytes(interface_slice_array) == 0xffffffff { + // special cased in the ERC165 standard + return Ok(false); + } + + const IERC165: u32 = 0x01ffc9a7; + const IERC721: u32 = 0x80ac58cd; + const IERC721_METADATA: u32 = 0x5b5e139f; + + Ok(matches!(u32::from_be_bytes(interface_slice_array), IERC165 | IERC721 | IERC721_METADATA)) + } +} +``` + +### lib.rs + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +// Modules and imports +mod erc721; + +use alloy_primitives::{U256, Address}; +/// Import the Stylus SDK along with alloy primitive types for use in our program. +use stylus_sdk::{ + msg, prelude::* +}; +use crate::erc721::{Erc721, Erc721Params, Erc721Error}; + +/// Immutable definitions +struct StylusNFTParams; +impl Erc721Params for StylusNFTParams { + const NAME: &'static str = "StylusNFT"; + const SYMBOL: &'static str = "SNFT"; + + fn token_uri(token_id: U256) -> String { + format!("{}{}{}", "https://my-nft-metadata.com/", token_id, ".json") + } +} + +// Define the entrypoint as a Solidity storage object. The sol_storage! macro +// will generate Rust-equivalent structs with all fields mapped to Solidity-equivalent +// storage slots and types. +sol_storage! { + #[entrypoint] + struct StylusNFT { + #[borrow] // Allows erc721 to access StylusNFT's storage and make calls + Erc721 erc721; + } +} + +#[public] +#[inherit(Erc721)] +impl StylusNFT { + /// Mints an NFT + pub fn mint(&mut self) -> Result<(), Erc721Error> { + let minter = msg::sender(); + self.erc721.mint(minter)?; + Ok(()) + } + + /// Mints an NFT to another address + pub fn mint_to(&mut self, to: Address) -> Result<(), Erc721Error> { + self.erc721.mint(to)?; + Ok(()) + } + + /// Burns an NFT + pub fn burn(&mut self, token_id: U256) -> Result<(), Erc721Error> { + // This function checks that msg::sender() owns the specified token_id + self.erc721.burn(msg::sender(), token_id)?; + Ok(()) + } + + /// Total supply + pub fn total_supply(&mut self) -> Result { + Ok(self.erc721.total_supply.get()) + } +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_erc721_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/applications/multi_call.mdx b/docs/stylus-by-example/applications/multi_call.mdx new file mode 100644 index 0000000000..c3b6f065c2 --- /dev/null +++ b/docs/stylus-by-example/applications/multi_call.mdx @@ -0,0 +1,129 @@ +--- +title: 'Multi Call • Stylus by Example' +description: 'An example implementation of the Multi Call contract in Rust using Arbitrum Stylus.' +--- + +{/* Begin Content */} + +# Multicall + +An Arbitrum Stylus version implementation of [Solidity Multi Call contract](https://solidity-by-example.org/app/multi-call/) that aggregates multiple queries using a for loop and RawCall. + +Example implementation of a Multi Call contract written in Rust: +Here is the interface for TimeLock. + +```solidity +/** + * This file was automatically generated by Stylus and represents a Rust program. + * For more information, please see [The Stylus SDK](https://github.com/OffchainLabs/stylus-sdk-rs). + */ + +// SPDX-License-Identifier: MIT-OR-APACHE-2.0 +pragma solidity ^0.8.23; + +interface IMultiCall { + function multicall(address[] memory addresses, bytes[] memory data) external view returns (bytes[] memory); + + error ArraySizeNotMatch(); + + error CallFailed(uint256); +} +``` + +### src/lib.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +#![cfg_attr(not(feature = "export-abi"), no_main)] +extern crate alloc; + +#[global_allocator] +static ALLOC: mini_alloc::MiniAlloc = mini_alloc::MiniAlloc::INIT; + +use alloy_primitives::U256; +use alloy_sol_types::sol; +use stylus_sdk::{abi::Bytes, alloy_primitives::Address, call::RawCall, prelude::*}; + +#[solidity_storage] +#[entrypoint] +pub struct MultiCall; + +// Declare events and Solidity error types +sol! { + error ArraySizeNotMatch(); + error CallFailed(uint256 call_index); +} + +#[derive(SolidityError)] +pub enum MultiCallErrors { + ArraySizeNotMatch(ArraySizeNotMatch), + CallFailed(CallFailed), +} + +#[external] +impl MultiCall { + pub fn multicall( + &self, + addresses: Vec
, + data: Vec, + ) -> Result, MultiCallErrors> { + let addr_len = addresses.len(); + let data_len = data.len(); + let mut results: Vec = Vec::new(); + if addr_len != data_len { + return Err(MultiCallErrors::ArraySizeNotMatch(ArraySizeNotMatch {})); + } + for i in 0..addr_len { + let result = RawCall::new().call(addresses[i], data[i].to_vec().as_slice()) + .map_err(|_| MultiCallErrors::CallFailed(CallFailed { call_index: U256::from(i) }))?; + results.push(result.into()); +} + Ok(results) + } +} + +``` + +### Cargo.toml + +```toml +[package] +name = "stylus-multi-call-contract" +version = "0.1.5" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] +description = "Stylus multi call example" + +[dependencies] +alloy-primitives = "0.3.1" +alloy-sol-types = "0.3.1" +mini-alloc = "0.4.2" +stylus-sdk = "0.5.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[[bin]] +name = "stylus-multi-call" +path = "src/main.rs" + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/applications/sidebar.js b/docs/stylus-by-example/applications/sidebar.js new file mode 100644 index 0000000000..2f47078a43 --- /dev/null +++ b/docs/stylus-by-example/applications/sidebar.js @@ -0,0 +1,27 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebar = { + "items": [ + { + "type": "doc", + "id": "stylus-by-example/applications/erc20", + "label": "Erc20" + }, + { + "type": "doc", + "id": "stylus-by-example/applications/erc721", + "label": "Erc721" + }, + { + "type": "doc", + "id": "stylus-by-example/applications/multi_call", + "label": "Multi Call" + }, + { + "type": "doc", + "id": "stylus-by-example/applications/vending_machine", + "label": "Vending Machine" + } + ] +}; +module.exports = sidebar.items; \ No newline at end of file diff --git a/docs/stylus-by-example/applications/vending_machine.mdx b/docs/stylus-by-example/applications/vending_machine.mdx new file mode 100644 index 0000000000..7beab1a80b --- /dev/null +++ b/docs/stylus-by-example/applications/vending_machine.mdx @@ -0,0 +1,145 @@ +--- +title: 'Vending Machine • Stylus by Example' +description: 'An example implementation of the Vending Machine in Rust using Arbitrum Stylus.' +--- + +{/* Begin Content */} + +# Vending Machine + +An example project for writing Arbitrum Stylus programs in Rust using the [stylus-sdk](https://github.com/OffchainLabs/stylus-sdk-rs). It includes a Rust implementation of a vending machine Ethereum smart contract. + +- distribute Cupcakes to any given address +- count Cupcakes balance of any given address + +Here is the interface for Vending Machine. + +```solidity +interface IVendingMachine { + // Function to distribute a cupcake to a user + function giveCupcakeTo(address userAddress) external returns (bool); + + // Getter function for the cupcake balance of a user + function getCupcakeBalanceFor(address userAddress) external view returns (uint); +} +``` + +Example implementation of the Vending Machine contract written in Rust. + +### src/lib.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +//! +//! Stylus Cupcake Example +//! +//! The program is ABI-equivalent with Solidity, which means you can call it from both Solidity and Rust. +//! To do this, run `cargo stylus export-abi`. +//! +//! Note: this code is a template-only and has not been audited. +//! + +// Allow `cargo stylus export-abi` to generate a main function if the "export-abi" feature is enabled. +#![cfg_attr(not(feature = "export-abi"), no_main)] +extern crate alloc; + +use alloy_primitives::{Address, Uint}; +// Import items from the SDK. The prelude contains common traits and macros. +use stylus_sdk::alloy_primitives::U256; +use stylus_sdk::prelude::*; +use stylus_sdk::{block, console}; + +// Define persistent storage using the Solidity ABI. +// `VendingMachine` will be the entrypoint for the contract. +sol_storage! { + #[entrypoint] + pub struct VendingMachine { + // Mapping from user addresses to their cupcake balances. + mapping(address => uint256) cupcake_balances; + // Mapping from user addresses to the last time they received a cupcake. + mapping(address => uint256) cupcake_distribution_times; + } +} + +// Declare that `VendingMachine` is a contract with the following external methods. +#[public] +impl VendingMachine { + // Give a cupcake to the specified user if they are eligible (i.e., if at least 5 seconds have passed since their last cupcake). + pub fn give_cupcake_to(&mut self, user_address: Address) -> bool { + // Get the last distribution time for the user. + let last_distribution = self.cupcake_distribution_times.get(user_address); + // Calculate the earliest next time the user can receive a cupcake. + let five_seconds_from_last_distribution = last_distribution + U256::from(5); + + // Get the current block timestamp. + let current_time = block::timestamp(); + // Check if the user can receive a cupcake. + let user_can_receive_cupcake = + five_seconds_from_last_distribution <= Uint::<256, 4>::from(current_time); + + if user_can_receive_cupcake { + // Increment the user's cupcake balance. + let mut balance_accessor = self.cupcake_balances.setter(user_address); + let balance = balance_accessor.get() + U256::from(1); + balance_accessor.set(balance); + + // Update the distribution time to the current time. + let mut time_accessor = self.cupcake_distribution_times.setter(user_address); + let new_distribution_time = block::timestamp(); + time_accessor.set(Uint::<256, 4>::from(new_distribution_time)); + return true; + } else { + // User must wait before receiving another cupcake. + console!( + "HTTP 429: Too Many Cupcakes (you must wait at least 5 seconds between cupcakes)" + ); + return false; + } + } + + // Get the cupcake balance for the specified user. + pub fn get_cupcake_balance_for(&self, user_address: Address) -> Uint<256, 4> { + // Return the user's cupcake balance from storage. + return self.cupcake_balances.get(user_address); + } +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_cupcake_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/abi_decode.mdx b/docs/stylus-by-example/basic_examples/abi_decode.mdx new file mode 100644 index 0000000000..c82862dd9e --- /dev/null +++ b/docs/stylus-by-example/basic_examples/abi_decode.mdx @@ -0,0 +1,139 @@ +--- +title: 'ABI Encode • Stylus by Example' +description: 'A simple solidity ABI encode and decode example' +--- + +{/* Begin Content */} + +# ABI Decode + +The `decode` can not be used for `encode_packed` data because it ignores padding when encode. (For more information you can refer to [ABI Encode](./abi_encode)) + +So here we show an example for using `decode` on data encoded with `abi_encode_sequence`: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// This should always return true +pub fn encode_and_decode( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 +) -> Result { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); + // because the abi_encode_sequence will return alloy_primitives::Bytes rather than stylus_sdk::bytes, so we need to make sure the input and return types are the same + let primative_data = alloy_primitives::Bytes::copy_from_slice(&data); + // set the tuple + let tx_hash_data = (target, value, func, primative_data, timestamp); + // encode the tuple + let tx_hash_data_encode = TxIdHashType::abi_encode_sequence(&tx_hash_data); + + let validate = true; + + // Check the result + match TxIdHashType::abi_decode_sequence(&tx_hash_data_encode, validate) { + Ok(res) => Ok(res == tx_hash_data), + Err(_) => { + return Err(HasherError::DecodedFailed(DecodedFailed{})); + }, + } +} +``` + +# Full Example code: + +### src/lib.rs + +```rust + +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + + +/// Import items from the SDK. The prelude contains common traits and macros. +use stylus_sdk::{alloy_primitives::{U256, Address}, prelude::*}; +// Because the naming of `alloy_primitives` and `alloy_sol_types` is the same, we need to rename the types in `alloy_sol_types`. +use alloy_sol_types::{sol_data::{Address as SOLAddress, *}, SolType, sol}; + + +// Define error +sol! { + error DecodedFailed(); +} + +// Error types for the MultiSig contract +#[derive(SolidityError)] +pub enum DecoderError{ + DecodedFailed(DecodedFailed) +} + +#[storage] +#[entrypoint] +pub struct Decoder; + + +/// Declare that `Decoder` is a contract with the following external methods. +#[public] +impl Decoder { + // This should always return true + pub fn encode_and_decode( + &self, + address: Address, + amount: U256 + ) -> Result { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>); + // set the tuple + let tx_hash_data = (address, amount); + // encode the tuple + let tx_hash_data_encode = TxIdHashType::abi_encode_params(&tx_hash_data); + + let validate = true; + + // Check the result + match TxIdHashType::abi_decode_params(&tx_hash_data_encode, validate) { + Ok(res) => Ok(res == tx_hash_data), + Err(_) => { + return Err(DecoderError::DecodedFailed(DecodedFailed{})); + }, + } + } + +} +``` + +### Cargo.toml + +```rust +[package] +name = "stylus-decode-hashing" +version = "0.1.0" +edition = "2021" + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.5.1" + +[features] +export-abi = ["stylus-sdk/export-abi"] +debug = ["stylus-sdk/debug"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/basic_examples/abi_encode.mdx b/docs/stylus-by-example/basic_examples/abi_encode.mdx new file mode 100644 index 0000000000..f60d9830a6 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/abi_encode.mdx @@ -0,0 +1,218 @@ +--- +title: 'ABI Decode • Stylus by Example' +description: 'A simple solidity ABI encode and decode example' +--- + +{/* Begin Content */} + +# ABI Encode + +The `ABI Encode` has 2 types which are [`encode`](https://docs.soliditylang.org/en/latest/abi-spec.html#strict-encoding-mode) and [`encode_packed`](https://docs.soliditylang.org/en/latest/abi-spec.html#non-standard-packed-mode). + +- `encode` will concatenate all values and add padding to fit into 32 bytes for each values. +- `encode_packed` will concatenate all values in the exact byte representations without padding. (For example, `encode_packed("a", "bc") == encode_packed("ab", "c")`) + +Suppose we have a tuple of values: `(target, value, func, data, timestamp)` to encode, and their `alloy primitives type` are `(Address, U256, String, Bytes, U256)`. + +Firstly we need to import those types we need from `alloy_primitives`, `stylus_sdk::abi` and `alloc::string`: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// Import items from the SDK. The prelude contains common traits and macros. +use stylus_sdk::{alloy_primitives::{U256, Address, FixedBytes}, abi::Bytes, prelude::*}; +// Import String from alloc +use alloc::string::String; +``` + +Secondly because we will use the method [`abi_encode_sequence`](https://docs.rs/alloy-sol-types/latest/alloy_sol_types/trait.SolValue.html#method.abi_encode_sequence) and [`abi_encode_packed`](https://docs.rs/alloy-sol-types/latest/alloy_sol_types/trait.SolValue.html#method.abi_encode_packed) under `alloy_sol_types` to encode data, we also need to import the types from `alloy_sol_types`: + +```rust +// Becauce the naming of alloy_primitives and alloy_sol_types is the same, so we need to re-name the types in alloy_sol_types +use alloy_sol_types::{sol_data::{Address as SOLAddress, String as SOLString, Bytes as SOLBytes, *}, SolType}; +``` + +## encode + +Then `encode` them: + +```rust +// define sol types tuple +type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); +// set the tuple +let tx_hash_data = (target, value, func, data, timestamp); +// encode the tuple +let tx_hash_bytes = TxIdHashType::abi_encode_sequence(&tx_hash_data); +``` + +## encode_packed + +There are 2 methods to `encode_packed` data: + +1. `encode_packed` them: + +```rust +// define sol types tuple +type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); +// set the tuple +let tx_hash_data = (target, value, func, data, timestamp); +// encode the tuple +let tx_hash_data_encode_packed = TxIdHashType::abi_encode_packed(&tx_hash_data); +``` + +2. We can also use the following method to `encode_packed` them: + +```rust +let tx_hash_data_encode_packed = [&target.to_vec(), &value.to_be_bytes_vec(), func.as_bytes(), &data.to_vec(), ×tamp.to_be_bytes_vec()].concat(); +``` + +# Full Example code: + +### src/main.rs + +```rust +// Allow `cargo stylus export-abi` to generate a main function. +#![cfg_attr(not(feature = "export-abi"), no_main)] +extern crate alloc; + + +/// Import items from the SDK. The prelude contains common traits and macros. +use stylus_sdk::{alloy_primitives::{U256, Address, FixedBytes}, abi::Bytes, prelude::*}; +use alloc::string::String; +// Becauce the naming of alloy_primitives and alloy_sol_types is the same, so we need to re-name the types in alloy_sol_types +use alloy_sol_types::{sol_data::{Address as SOLAddress, String as SOLString, Bytes as SOLBytes, *}, SolType}; +use sha3::{Digest, Keccak256}; + +// Define some persistent storage using the Solidity ABI. +// `Encoder` will be the entrypoint. +#[storage] +#[entrypoint] +pub struct Encoder; + +impl Encoder { + fn keccak256(&self, data: Bytes) -> FixedBytes<32> { + // prepare hasher + let mut hasher = Keccak256::new(); + // populate the data + hasher.update(data); + // hashing with keccack256 + let result = hasher.finalize(); + // convert the result hash to FixedBytes<32> + let result_vec = result.to_vec(); + FixedBytes::<32>::from_slice(&result_vec) + } +} + +/// Declare that `Encoder` is a contract with the following external methods. +#[public] +impl Encoder { + + // Encode the data and hash it + pub fn encode( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + ) -> Vec { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); + // set the tuple + let tx_hash_data = (target, value, func, data, timestamp); + // encode the tuple + let tx_hash_data_encode = TxIdHashType::abi_encode_params(&tx_hash_data); + tx_hash_data_encode + } + + // Packed encode the data and hash it, the same result with the following one + pub fn packed_encode( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + )-> Vec { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); + // set the tuple + let tx_hash_data = (target, value, func, data, timestamp); + // encode the tuple + let tx_hash_data_encode_packed = TxIdHashType::abi_encode_packed(&tx_hash_data); + tx_hash_data_encode_packed + } + + // Packed encode the data and hash it, the same result with the above one + pub fn packed_encode_2( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + )-> Vec { + // set the data to arrary and concat it directly + let tx_hash_data_encode_packed = [&target.to_vec(), &value.to_be_bytes_vec(), func.as_bytes(), &data.to_vec(), ×tamp.to_be_bytes_vec()].concat(); + tx_hash_data_encode_packed + } + + + // The func example: "transfer(address,uint256)" + pub fn encode_with_signature( + &self, + func: String, + address: Address, + amount: U256 + ) -> Vec { + type TransferType = (SOLAddress, Uint<256>); + let tx_data = (address, amount); + let data = TransferType::abi_encode_params(&tx_data); + // Get function selector + let hashed_function_selector = self.keccak256(func.as_bytes().to_vec().into()); + // Combine function selector and input data (use abi_packed way) + let calldata = [&hashed_function_selector[..4], &data].concat(); + calldata + } + +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus-encode-hashing" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" +sha3 = "0.10" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/bytes_in_bytes_out.mdx b/docs/stylus-by-example/basic_examples/bytes_in_bytes_out.mdx new file mode 100644 index 0000000000..370875774c --- /dev/null +++ b/docs/stylus-by-example/basic_examples/bytes_in_bytes_out.mdx @@ -0,0 +1,54 @@ +--- +title: 'Bytes In, Bytes Out • Stylus by Example' +description: 'A simple bytes in, bytes out Arbitrum Stylus Rust contract that shows a minimal `entrypoint` function.' +--- + +{/* Begin Content */} + +# Bytes In, Bytes Out + +This is a simple bytes in, bytes out contract that shows a minimal `entrypoint` function (denoted by the `#[entrypoint]` proc macro). If your smart contract just has one primary function, like computing a cryptographic hash, this can be a great model because it strips out the SDK and acts like a pure function or Unix-style app. + +### src/main.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +#![cfg_attr(not(feature = "export-abi"), no_main)] + +extern crate alloc; +use alloc::vec::Vec; + +use stylus_sdk::stylus_proc::entrypoint; + +#[entrypoint] +fn user_main(input: Vec) -> Result, Vec> { + Ok(input) +} +``` + +### Cargo.toml + +```toml +[package] +name = "bytes_in_bytes_out" +version = "0.1.7" +edition = "2021" + +[dependencies] +stylus-sdk = "0.6.0" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +[workspace] +``` diff --git a/docs/stylus-by-example/basic_examples/constants.mdx b/docs/stylus-by-example/basic_examples/constants.mdx new file mode 100644 index 0000000000..5cc8cf68b5 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/constants.mdx @@ -0,0 +1,102 @@ +--- +title: 'Constants • Stylus by Example' +description: "How to declare constants in your Rust smart contracts using Arbitrum's Stylus SDK" +--- + +{/* Begin Content */} + +# Constants + +Constants are values that are bound to a name and cannot change. They are always immutable. In Rust, constants are declared with the `const` keyword. Unlike variables declared with the `let` keyword, constants _must_ be annotated with their type. + +Constants are valid for the entire length of the transaction. They are essentially _inlined_ wherever they are used, meaning that their value is copied directly into whatever context invokes them. + +Since their value is hardcoded, they can save on gas cost as their value does not need to be fetched from storage. + +## Learn More + +- [Rust docs - Constant items](https://doc.rust-lang.org/reference/items/constant-items.html) +- [Solidity docs - Constant variables](https://docs.soliditylang.org/en/v0.8.19/contracts.html#constant) + +### src/lib.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +use alloc::vec; +use alloc::vec::Vec; + +use stylus_sdk::alloy_primitives::Address; +use stylus_sdk::prelude::*; +use stylus_sdk::storage::StorageAddress; + +const OWNER: &str = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"; + +#[storage] +#[entrypoint] +pub struct Contract { + owner: StorageAddress, +} + +#[public] +impl Contract { + pub fn init(&mut self) -> Result<(), Vec> { + // Parse the const &str as a local Address variable + let owner_address = Address::parse_checksummed(OWNER, None).expect("Invalid address"); + + // Save the result as the owner + self.owner.set(owner_address); + + Ok(()) + } + pub fn owner(&self) -> Result> { + let owner_address = self.owner.get(); + + Ok(owner_address) + } +} + +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_constants_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/basic_examples/errors.mdx b/docs/stylus-by-example/basic_examples/errors.mdx new file mode 100644 index 0000000000..7ecdb7d8ab --- /dev/null +++ b/docs/stylus-by-example/basic_examples/errors.mdx @@ -0,0 +1,196 @@ +--- +title: 'Errors • Stylus by Example' +description: 'How to define and use Errors on Stylus Rust smart contracts' +--- + +{/* Begin Content */} + +# Errors + +In Rust Stylus contracts, error handling is a crucial aspect of writing robust and reliable smart contracts. Rust differentiates between recoverable and unrecoverable errors. Recoverable errors are represented using the `Result` type, which can either be `Ok`, indicating success, or `Err`, indicating failure. This allows developers to manage errors gracefully and maintain control over the flow of execution. Unrecoverable errors are handled with the `panic!` macro, which stops execution, unwinds the stack, and returns a dataless error. + +In Stylus contracts, error types are often explicitly defined, providing clear and structured ways to handle different failure scenarios. This structured approach promotes better error management, ensuring that contracts are secure, maintainable, and behave predictably under various conditions. Similar to Solidity and EVM, errors in Stylus will undo all changes made to the state during a transaction by reverting the transaction. Thus, there are two main types of errors in Rust Stylus contracts: + +- **Recoverable Errors**: The Stylus SDK provides features that make using recoverable errors in Rust Stylus contracts convenient. This type of error handling is strongly recommended for Stylus contracts. +- **Unrecoverable Errors**: These can be defined similarly to Rust code but are not recommended for smart contracts if recoverable errors can be used instead. + +## Learn More + +- [Solidity docs: Expressions and Control Structures](https://docs.soliditylang.org/en/latest/control-structures.html) +- [`#[derive(SolidityError)]`](https://docs.rs/stylus-sdk/latest/stylus_sdk/prelude/derive.SolidityError.html) +- [`alloy_sol_types::SolError`](https://docs.rs/alloy-sol-types/latest/alloy_sol_types/trait.SolError.html) +- [`Error handling: Rust book`](https://doc.rust-lang.org/book/ch09-00-error-handling.html) + +## Recoverable Errors + +Recoverable errors are represented using the `Result` type, which can either be `Ok`, indicating success, or `Err`, indicating failure. The Stylus SDK provides tools to define custom error types and manage recoverable errors effectively. + +#### Example: Recoverable Errors + +Here's a simplified Rust Stylus contract demonstrating how to define and handle recoverable errors: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +#![cfg_attr(not(feature = "export-abi"), no_main)] +extern crate alloc; + + +use alloy_sol_types::sol; +use stylus_sdk::{abi::Bytes, alloy_primitives::{Address, U256}, call::RawCall, prelude::*}; + +#[storage] +#[entrypoint] +pub struct MultiCall; + +// Declare events and Solidity error types +sol! { + error ArraySizeNotMatch(); + error CallFailed(uint256 call_index); +} + +#[derive(SolidityError)] +pub enum MultiCallErrors { + ArraySizeNotMatch(ArraySizeNotMatch), + CallFailed(CallFailed), +} + +#[public] +impl MultiCall { + pub fn multicall( + &self, + addresses: Vec
, + data: Vec, + ) -> Result, MultiCallErrors> { + let addr_len = addresses.len(); + let data_len = data.len(); + let mut results: Vec = Vec::new(); + if addr_len != data_len { + return Err(MultiCallErrors::ArraySizeNotMatch(ArraySizeNotMatch {})); + } + for i in 0..addr_len { + let result: Result, Vec> = + RawCall::new().call(addresses[i], data[i].to_vec().as_slice()); + let data = match result { + Ok(data) => data, + Err(_data) => return Err(MultiCallErrors::CallFailed(CallFailed { call_index: U256::from(i) })), + }; + results.push(data.into()) + } + Ok(results) + } +} +``` + +- **Using `SolidityError` Derive Macro**: The `#[derive(SolidityError)]` attribute is used for the `MultiCallErrors` enum, automatically implementing the necessary traits for error handling. +- **Defining Errors**: Custom errors `ArraySizeNotMatch` and `CallFailed` is declared in `MultiCallErrors` enum. `CallFailed` error includes a `call_index` parameter to indicate which call failed. +- **ArraySizeNotMatch Error Handling**: The `multicall` function returns `ArraySizeNotMatch` if the size of addresses and data vectors are not equal. +- **CallFailed Error Handling**: The `multicall` function returns a `CallFailed` error with the index of the failed call if any call fails. Note that we're using match to check if the result of the call is an error or a return data. We'll describe match pattern in the further sections. + +## Unrecoverable Errors + +Here are various ways to handle such errors in the `multicall` function, which calls multiple addresses and panics in different scenarios: + +### Using `panic!` + +Directly panics if the call fails, including the index of the failed call. + +```rust + for i in 0..addr_len { + let result = RawCall::new().call(addresses[i], data[i].to_vec().as_slice()); + let data = match result { + Ok(data) => data, + Err(_data) => panic!("Call to address {:?} failed at index {}", addresses[i], i), + }; + results.push(data.into()); +} +``` + +Handling Call Failure with `panic!`: The function panics if any call fails and the transaction will be reverted without any data. + +### Using `unwrap` + +Uses `unwrap` to handle the result, panicking if the call fails. + +```rust + for i in 0..addr_len { + let result = RawCall::new().call(addresses[i], data[i].to_vec().as_slice()).unwrap(); + results.push(result.into()); +} +``` + +Handling Call Failure with `unwrap`: The function uses `unwrap` to panic if any call fails, including the index of the failed call. + +### Using `match` + +Uses a `match` statement to handle the result of `call`, panicking if the call fails. + +```rust + for i in 0..addr_len { + let result = RawCall::new().call(addresses[i], data[i].to_vec().as_slice()); + let data = match result { + Ok(data) => data, + Err(_data) => return Err(MultiCallErrors::CallFailed(CallFailed { call_index: U256::from(i) })), + }; + results.push(data.into()); +} +``` + +Handling Call Failure with `match`: The function uses a `match` statement to handle the result of `call`, returning error if any call fails. + +### Using the `?` Operator + +Uses the `?` operator to propagate the error if the call fails, including the index of the failed call. + +```rust + for i in 0..addr_len { + let result = RawCall::new().call(addresses[i], data[i].to_vec().as_slice()) + .map_err(|_| MultiCallErrors::CallFailed(CallFailed { call_index: U256::from(i) }))?; + results.push(result.into()); +} +``` + +Handling Call Failure with `?` Operator: The function uses the `?` operator to propagate the error if any call fails, including the index of the failed call. + +Each method demonstrates a different way to handle unrecoverable errors in the `multicall` function of a Rust Stylus contract, providing a comprehensive approach to error management. + +**Note** that as mentioned above, it is strongly recommended to use custom error handling instead of unrecoverable error handling. + +## Boilerplate + +### src/lib.rs + +The lib.rs code can be found at the top of the page in the recoverable error example section. + +### Cargo.toml + +```toml +[package] +name = "stylus-multicall-contract" +version = "0.1.7" +edition = "2021" + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[[bin]] +name = "stylus-multicall-contract" +path = "src/main.rs" + +[lib] +crate-type = ["lib", "cdylib"] + +``` diff --git a/docs/stylus-by-example/basic_examples/events.mdx b/docs/stylus-by-example/basic_examples/events.mdx new file mode 100644 index 0000000000..774f5cc6d5 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/events.mdx @@ -0,0 +1,225 @@ +--- +title: 'Events • Stylus by Example' +description: 'How to log events to the chain using the Arbitrum Stylus Rust SDK.' +--- + +{/* Begin Content */} + +# Events + +Events allow for data to be logged publicly to the blockchain. Log entries provide the contract's address, a series of up to four topics, and some arbitrary length binary data. The Stylus Rust SDK provides a few ways to publish event logs described below. + +## Learn More + +- [Solidity docs: Events](https://docs.soliditylang.org/en/v0.8.19/abi-spec.html#events) +- [`stylus_sdk::evm::log`](https://docs.rs/stylus-sdk/latest/stylus_sdk/evm/fn.log.html) +- [`alloy_sol_types::SolEvent`](https://docs.rs/alloy-sol-types/0.3.1/alloy_sol_types/trait.SolEvent.html) + +## Log + +Using the `evm::log` function in the Stylus SDK is the preferred way to log events. It ensures that an event will be logged in a Solidity ABI-compatible format. The `log` function takes any type that implements Alloy `SolEvent` trait. It's not recommended to attempt to implement this trait on your own. Instead, make use of the provided `sol!` macro to declare your Events and their schema using Solidity-style syntax to declare the parameter types. Alloy will create ABI-compatible Rust types which you can instantiate and pass to the `evm::log` function. + +### Log Usage + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// sol! macro event declaration +// Up to 3 parameters can be indexed. +// Indexed parameters helps you filter the logs efficiently +sol! { + event Log(address indexed sender, string message); + event AnotherLog(); +} + +#[storage] +#[entrypoint] +pub struct Events {} + +#[public] +impl Events { +fn user_main(_input: Vec) -> ArbResult { + // emits a 'Log' event, defined above in the sol! macro + evm::log(Log { + sender: Address::from([0x11; 20]), + message: "Hello world!".to_string(), + }); + + // no data, but 'AnotherLog' event will still emit to the chain + evm::log(AnotherLog {}); + + Ok(vec![]) +} +} +``` + +## Raw Log + +The `evm::raw_log` affordance offers the ability to send anonymous events that do not necessarily conform to the Solidity ABI. Instead, up to four raw 32-byte indexed topics are published along with any arbitrary bytes appended as data. + +**NOTE**: It's still possible to achieve Solidity ABI compatibility using this construct. To do so you'll have to manually compute the ABI signature for the event, [following the equation set in the Solidity docs](https://docs.soliditylang.org/en/v0.8.19/abi-spec.html#events). The result of that should be assigned to `TOPIC_0`, the first topic in the slice passed to `raw_log`. + +### Raw Log Usage + +```rust +// set up local variables +let user = Address::from([0x22; 20]); +let balance = U256::from(10_000_000); + +// declare up to 4 topics +// topics must be of type FixedBytes<32> +let topics = &[user.into_word()]; + +// store non-indexed data in a byte Vec +let mut data: Vec = vec![]; +// to_be_bytes means 'to big endian bytes' +data.extend_from_slice(balance.to_be_bytes::<32>().to_vec().as_slice()); + +// unwrap() here 'consumes' the Result +evm::raw_log(topics.as_slice(), data.as_ref()).unwrap(); +``` + +## Result + +Combining the above examples into the boiler plate provided below this section, deploying to a Stylus chain and then invoking the deployed contract will result in the following three events logged to the chain: + +### logs + +```json +[ + { + "address": "0x6cf4a18ac8efd6b0b99d3200c4fb9609dd60d4b3", + "topics": [ + "0x0738f4da267a110d810e6e89fc59e46be6de0c37b1d5cd559b267dc3688e74e0", + "0x0000000000000000000000001111111111111111111111111111111111111111" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20776f726c64210000000000000000000000000000000000000000", + "blockHash": "0xfef880025dc87b5ab4695a0e1a6955dd7603166ecba79ce0f503a568b2ec8940", + "blockNumber": "0x94", + "transactionHash": "0xc7318dae2164eb441fb80f5b869f844e3e97ae83c24a4639d46ec4d915a30818", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x6cf4a18ac8efd6b0b99d3200c4fb9609dd60d4b3", + "topics": ["0xfe1a3ad11e425db4b8e6af35d11c50118826a496df73006fc724cb27f2b99946"], + "data": "0x", + "blockHash": "0xfef880025dc87b5ab4695a0e1a6955dd7603166ecba79ce0f503a568b2ec8940", + "blockNumber": "0x94", + "transactionHash": "0xc7318dae2164eb441fb80f5b869f844e3e97ae83c24a4639d46ec4d915a30818", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x6cf4a18ac8efd6b0b99d3200c4fb9609dd60d4b3", + "topics": ["0x0000000000000000000000002222222222222222222222222222222222222222"], + "data": "0x0000000000000000000000000000000000000000000000000000000000989680", + "blockHash": "0xfef880025dc87b5ab4695a0e1a6955dd7603166ecba79ce0f503a568b2ec8940", + "blockNumber": "0x94", + "transactionHash": "0xc7318dae2164eb441fb80f5b869f844e3e97ae83c24a4639d46ec4d915a30818", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } +] +``` + +## Boilerplate + +### src/lib.rs + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +use alloc::vec::Vec; +use alloc::{string::ToString, vec}; + +use stylus_sdk::alloy_primitives::U256; +use stylus_sdk::{alloy_primitives::Address, alloy_sol_types::sol, evm, prelude::*, ArbResult}; + +// sol! macro event declaration +// Up to 3 parameters can be indexed. +// Indexed parameters helps you filter the logs by the indexed parameter +sol! { + event Log(address indexed sender, string message); + event AnotherLog(); +} + +#[storage] +#[entrypoint] +pub struct Events {} + +#[public] +impl Events { +fn user_main(_input: Vec) -> ArbResult { + // emits a 'Log' event, defined above in the sol! macro + evm::log(Log { + sender: Address::from([0x11; 20]), + message: "Hello world!".to_string(), + }); + + // no data, but event will still log to the chain + evm::log(AnotherLog {}); + + // set up local variables + let user = Address::from([0x22; 20]); + let balance = U256::from(10_000_000); + + // declare up to 4 topics + // topics must be of type FixedBytes<32> + let topics = &[user.into_word()]; + + // store non-indexed data in a byte Vec + let mut data: Vec = vec![]; + // to_be_bytes means 'to big endian bytes' + data.extend_from_slice(balance.to_be_bytes::<32>().to_vec().as_slice()); + + // unwrap() here 'consumes' the Result + evm::raw_log(topics.as_slice(), data.as_ref()).unwrap(); + + Ok(Vec::new()) +} +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_events_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/function.mdx b/docs/stylus-by-example/basic_examples/function.mdx new file mode 100644 index 0000000000..49d0775c2e --- /dev/null +++ b/docs/stylus-by-example/basic_examples/function.mdx @@ -0,0 +1,234 @@ +--- +title: 'Function • Stylus by Example' +description: 'How to define and use internal and external functions in Stylus, and how to return multiple values from functions.' +--- + +{/* Begin Content */} + +# Functions + +Functions are a fundamental part of any programming language, including Stylus, enabling you to encapsulate logic into reusable components. + +This guide covers the syntax and usage of functions, including internal and external functions, and how to return multiple values. + +## Learn More + +- [Rust docs - Functions](https://doc.rust-lang.org/reference/items/functions.html) +- [Solidity docs - Functions](https://solidity-by-example.org/function/) + +## Overview + +A function in Stylus consists of a name, a set of parameters, an optional return type, and a body. + +Just as with storage, Stylus methods are Solidity ABI equivalent. This means that contracts written in different programming languages are fully interoperable. + +Functions are declared with the `fn` keyword. Parameters allow the function to accept inputs, and the return type specifies the output of the function. If no return type is specified, the function returns `void`. + +Following is an example of a function `add` that takes two `uint256` values and returns their sum. + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +fn add(a: uint256, b: uint256) -> uint256 { + return a + b; +} +``` + +## Function Parameters + +Function parameters are the inputs to a function. They are specified as a list of `IDENTIFIER: Type` pairs, separated by commas. + +In this example, the function `add_numbers` takes two `u32` parameters, `a` and `b` and returns the sum of the two numbers. + +```rust +fn add_numbers(a: u32, b: u32) -> u32 { + a + b +} +``` + +## Return Types + +Return types in functions are an essential part of defining the behavior and expected outcomes of your smart contract methods. + +Here, we explain the syntax and usage of return types in Stylus with general examples. + +### Basic Syntax + +A function with a return type in Stylus follows this basic structure. The return type is specified after the `->` arrow. +Values are returned using the `return` keyword or implicitly as the last expression of the function. In Rust and Stylus, the last expression in a function is implicitly returned, so the `return` keyword is often omitted. + +```rust +pub fn function_name(&self) -> ReturnType { + // Function body +} +``` + +## Examples + +**Function returning a String:** This `get_greeting` function returns a `String`. The return type is specified as `String` after the `->` arrow. + +```rust +pub fn get_greeting() -> String { + "Hello, Stylus!".into() +} +``` + +**Function returning an Integer:** This `get_number` function returns an unsigned 32-bit integer (`u32`). + +```rust +pub fn get_number() -> u32 { + 42 +} +``` + +**Function returning a Result with `Ok` and `Err` variants:** The `perform_operation` function returns a `Result`. +The `Result` type is used for functions that can return either a success value (`Ok`) or an error (`Err`). In this case, it returns `Ok(value)` on success and an error variant of `CustomError` on failure. + +```rust +pub enum CustomError { + ErrorVariant, +} + +pub fn perform_operation(value: u32) -> Result { + if value > 0 { + Ok(value) + } else { + Err(CustomError::ErrorVariant) + } +} +``` + +## Public Functions + +Public functions are those that can be called by other contracts. + +To define a public function in a Stylus contract, you use the `#[public]` macro. This macro ensures that the function is accessible from outside the contract. + +Previously, all public methods were required to return a `Result` type with `Vec` as the error type. This is now optional. Specifically, if a method is "infallible" (i.e., it cannot produce an error), it does not need to return a Result type. Here's what this means: + +- Infallible methods: Methods that are guaranteed not to fail (no errors possible) do not need to use the `Result` type. They can return their result directly without wrapping it in `Result`. + +- Optional error handling: The `Result` type with `Vec` as the error type is now optional for methods that cannot produce an error. + +In the following example, `owner` is a public function that returns the contract owner's address. Since this function is infallible (i.e., it cannot produce an error), it does not need to return a `Result` type. + +```rust +#[external] +impl Contract { + // Define an external function to get the owner of the contract + pub fn owner(&self) -> Address { + self.owner.get() + } +} +``` + +## Internal Functions + +Internal functions are those that can only be called within the contract itself. These functions are not exposed to external calls. + +To define an internal function, you simply include it within your contract's implementation without the `#[public]` macro. + +The choice between public and internal functions depends on the desired level of accessibility and interaction within and across contracts. + +In the followinge example, `set_owner` is an internal function that sets a new owner for the contract. It is only callable within the contract itself. + +```rust +impl Contract { + // Define an internal function to set a new owner + pub fn set_owner(&mut self, new_owner: Address) { + self.owner.set(new_owner); + } +} +``` + +To mix public and internal functions within the same contract, you should use two separate `impl` blocks with the same contract name. Public functions are defined within an `impl` block annotated with the `#[public]` attribute, signifying that these functions are part of the contract's public interface and can be invoked from outside the contract. +In contrast, internal functions are placed within a separate `impl` block that does not have the `#[public]` attribute, making them internal to the contract and inaccessible to external entities. + +### src/lib.rs + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +use alloc::vec; +use stylus_sdk::alloy_primitives::Address; +use stylus_sdk::prelude::*; +use stylus_sdk::storage::StorageAddress; + +use stylus_sdk::alloy_primitives::U256; +use stylus_sdk::storage::StorageU256; +use stylus_sdk::console; + + +#[storage] +#[entrypoint] +pub struct ExampleContract { + owner: StorageAddress, + data: StorageU256, +} + +#[public] +impl ExampleContract { + // External function to set the data + pub fn set_data(&mut self, value: U256) { + self.data.set(value); + } + + // External function to get the data + pub fn get_data(&self) -> U256 { + self.data.get() + } + + // External function to get the contract owner + pub fn get_owner(&self) -> Address { + self.owner.get() + } +} + +impl ExampleContract { + // Internal function to set a new owner + pub fn set_owner(&mut self, new_owner: Address) { + self.owner.set(new_owner); + } + + // Internal function to log data + pub fn log_data(&self) { + let _data = self.data.get(); + console!("Current data is: {:?}", _data); + } +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus-functions" +version = "0.1.0" +edition = "2021" + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" +sha3 = "0.10.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] +debug = ["stylus-sdk/debug"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/function_selector.mdx b/docs/stylus-by-example/basic_examples/function_selector.mdx new file mode 100644 index 0000000000..2914f7cf05 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/function_selector.mdx @@ -0,0 +1,40 @@ +--- +title: 'Function selector • Stylus by Example' +description: "How to compute the encoded function selector of a contract's function using the Arbitrum Stylus Rust SDK." +--- + +{/* Begin Content */} + +# Function selector + +When a smart contract is called, the first 4 bytes of the calldata sent as part of the request are called the "function selector", and identify which function of the smart contract to call. + +You can compute a specific function selector by using the `function_selector!` macro. + +Here's an example that computes the selector of a function named `foo`: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +function_selector!("foo") // returns 0xc2985578 +``` + +Functions usually take a number of arguments that you need to pass in order for the call to be successful. For example, here's the signature of a function that takes 2 arguments, an address and a uint256: + +```solidity +function transfer(address recipient, uint256 amount) external returns (bool); +``` + +To compute the selector for this function, pass the types of the arguments to the `function_selector` macro: + +```rust +function_selector!("transfer", Address, U256) // returns 0xa9059cbb +``` + +`function_selector` will return a byte array containing the encoded function selector. + +## Learn More + +- [`stylus_sdk::function_selector`](https://docs.rs/stylus-sdk/latest/stylus_sdk/macro.function_selector.html) diff --git a/docs/stylus-by-example/basic_examples/hashing.mdx b/docs/stylus-by-example/basic_examples/hashing.mdx new file mode 100644 index 0000000000..5e6ac93eb8 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/hashing.mdx @@ -0,0 +1,211 @@ +--- +title: 'Hasing with keccak256 • Stylus by Example' +description: 'A simple solidity ABI encode and decode example' +--- + +{/* Begin Content */} + +## Hashing with keccak256 + +Keccak256 is a cryptographic hash function that takes an input of an arbitrary length and produces a fixed-length output of 256 bits. + +Keccak256 is a member of the [SHA-3](https://en.wikipedia.org/wiki/SHA-3) family of hash functions. + +keccak256 computes the Keccak-256 hash of the input. + +Some use cases are: + +- Creating a deterministic unique ID from a input +- Commit-Reveal scheme +- Compact cryptographic signature (by signing the hash instead of a larger input) + +Here we will use [`stylus-sdk::crypto::keccak`](https://docs.rs/stylus-sdk/latest/stylus_sdk/crypto/fn.keccak.html) to calculate the keccak256 hash of the input data: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +pub fn keccak>(bytes: T) -> B256 +``` + +# Full Example code: + +### src/main.rs + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +/// Import items from the SDK. The prelude contains common traits and macros. +use stylus_sdk::{alloy_primitives::{U256, Address, FixedBytes}, abi::Bytes, prelude::*, crypto::keccak}; +use alloc::string::String; +use alloc::vec::Vec; +// Becauce the naming of alloy_primitives and alloy_sol_types is the same, so we need to re-name the types in alloy_sol_types +use alloy_sol_types::{sol_data::{Address as SOLAddress, String as SOLString, Bytes as SOLBytes, *}, SolType}; +use alloy_sol_types::sol; + +// Define error +sol! { + error DecodedFailed(); +} + +// Error types for the MultiSig contract +#[derive(SolidityError)] +pub enum HasherError{ + DecodedFailed(DecodedFailed) +} + +#[solidity_storage] +#[entrypoint] +pub struct Hasher { +} +/// Declare that `Hasher` is a contract with the following external methods. +#[public] +impl Hasher { + + // Encode the data and hash it + pub fn encode_and_hash( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + ) -> FixedBytes<32> { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); + // set the tuple + let tx_hash_data = (target, value, func, data, timestamp); + // encode the tuple + let tx_hash_data_encode = TxIdHashType::abi_encode_sequence(&tx_hash_data); + // hash the encoded data + keccak(tx_hash_data_encode).into() + } + + // This should always return true + pub fn encode_and_decode( + &self, + address: Address, + amount: U256 + ) -> Result { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>); + // set the tuple + let tx_hash_data = (address, amount); + // encode the tuple + let tx_hash_data_encode = TxIdHashType::abi_encode_sequence(&tx_hash_data); + + let validate = true; + + // Check the result + match TxIdHashType::abi_decode_sequence(&tx_hash_data_encode, validate) { + Ok(res) => Ok(res == tx_hash_data), + Err(_) => { + return Err(HasherError::DecodedFailed(DecodedFailed{})); + }, + } + } + + // Packed encode the data and hash it, the same result with the following one + pub fn packed_encode_and_hash_1( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + )-> FixedBytes<32> { + // define sol types tuple + type TxIdHashType = (SOLAddress, Uint<256>, SOLString, SOLBytes, Uint<256>); + // set the tuple + let tx_hash_data = (target, value, func, data, timestamp); + // encode the tuple + let tx_hash_data_encode_packed = TxIdHashType::abi_encode_packed(&tx_hash_data); + // hash the encoded data + keccak(tx_hash_data_encode_packed).into() + } + + // Packed encode the data and hash it, the same result with the above one + pub fn packed_encode_and_hash_2( + &self, + target: Address, + value: U256, + func: String, + data: Bytes, + timestamp: U256 + )-> FixedBytes<32> { + // set the data to arrary and concat it directly + let tx_hash_data_encode_packed = [&target.to_vec(), &value.to_be_bytes_vec(), func.as_bytes(), &data.to_vec(), ×tamp.to_be_bytes_vec()].concat(); + // hash the encoded data + keccak(tx_hash_data_encode_packed).into() + } + + + // The func example: "transfer(address,uint256)" + pub fn encode_with_signature( + &self, + func: String, + address: Address, + amount: U256 + ) -> Vec { + type TransferType = (SOLAddress, Uint<256>); + let tx_data = (address, amount); + let data = TransferType::abi_encode_sequence(&tx_data); + // Get function selector + let hashed_function_selector: FixedBytes<32> = keccak(func.as_bytes().to_vec()).into(); + // Combine function selector and input data (use abi_packed way) + let calldata = [&hashed_function_selector[..4], &data].concat(); + calldata + } + + // The func example: "transfer(address,uint256)" + pub fn encode_with_signature_and_hash( + &self, + func: String, + address: Address, + amount: U256 + ) -> FixedBytes<32> { + type TransferType = (SOLAddress, Uint<256>); + let tx_data = (address, amount); + let data = TransferType::abi_encode_sequence(&tx_data); + // Get function selector + let hashed_function_selector: FixedBytes<32> = keccak(func.as_bytes().to_vec()).into(); + // Combine function selector and input data (use abi_packed way) + let calldata = [&hashed_function_selector[..4], &data].concat(); + keccak(calldata).into() + } +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus-encode-hashing" +version = "0.1.0" +edition = "2021" + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" +sha3 = "0.10.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] +debug = ["stylus-sdk/debug"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/hello_world.mdx b/docs/stylus-by-example/basic_examples/hello_world.mdx new file mode 100644 index 0000000000..439448cb95 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/hello_world.mdx @@ -0,0 +1,95 @@ +--- +title: 'Hello World • Stylus by Example' +description: 'This example shows how to use the `console!` macro from the Arbitrum Stylus Rust SDK to print output to the terminal for debugging.' +--- + +{/* Begin Content */} + +# Hello World + +Using the `console!` macro from the `stylus_sdk` allows you to print output to the terminal for debugging purposes. To view the output, you'll need to run a local Stylus dev node as described in the [Arbitrum docs](https://docs.arbitrum.io/stylus/how-tos/local-stylus-dev-node) and **_set the debug feature flag_** as shown in line 7 of the `Cargo.toml` file below. + +The `console!` macro works similar to the built-in `println!` macro that comes with Rust. + +### Examples + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// Out: Stylus says: 'hello there!' +console!("hello there!"); +// Out: Stylus says: 'format some arguments' +console!("format {} arguments", "some"); + +let local_variable = "Stylus"; +// Out: Stylus says: 'Stylus is awesome!' +console!("{local_variable} is awesome!"); +// Out: Stylus says: 'When will you try out Stylus?' +console!("When will you try out {}?", local_variable); +``` + +### src/main.rs + +```rust +#![cfg_attr(not(feature = "export-abi"), no_main)] + +extern crate alloc; + + +use stylus_sdk::{console, prelude::*, stylus_proc::entrypoint, ArbResult}; + +#[storage] +#[entrypoint] +pub struct Hello; + + +#[public] +impl Hello { + fn user_main(_input: Vec) -> ArbResult { + // Will print 'Stylus says: Hello Stylus!' on your local dev node + // Be sure to add "debug" feature flag to your Cargo.toml file as + // shown below. + console!("Hello Stylus!"); + Ok(Vec::new()) + } +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_hello_world" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = { version = "0.6.0", features = ["debug"] } +hex = "0.4.3" +sha3 = "0.10" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" +``` diff --git a/docs/stylus-by-example/basic_examples/inheritance.mdx b/docs/stylus-by-example/basic_examples/inheritance.mdx new file mode 100644 index 0000000000..adcaec49ac --- /dev/null +++ b/docs/stylus-by-example/basic_examples/inheritance.mdx @@ -0,0 +1,137 @@ +--- +title: 'Inheritance • Stylus by Example' +description: 'How to leverage inheritance using the Arbitrum Stylus Rust SDK.' +--- + +{/* Begin Content */} + +# Inheritance + +The Stylus Rust SDK replicates the composition pattern of Solidity. The `#[public]` macro provides the [Router](https://docs.rs/stylus-sdk/latest/stylus_sdk/abi/trait.Router.html) trait, which can be used to connect types via inheritance, via the `#[inherit]` macro. + +**Please note:** Stylus doesn't support contract multi-inheritance yet. + +Let's see an example: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +#[public] +#[inherit(Erc20)] +impl Token { + pub fn mint(&mut self, amount: U256) -> Result<(), Vec> { + ... + } +} + +#[public] +impl Erc20 { + pub fn balance_of() -> Result { + ... + } +} +``` + +In the above code, we can see how `Token` inherits from `Erc20`, meaning that it will inherit the public methods available in `Erc20`. If someone called the `Token` contract on the function `balanceOf`, the function `Erc20.balance_of()` would be executed. + +Additionally, the inheriting type must implement the [Borrow](https://doc.rust-lang.org/core/borrow/trait.Borrow.html) trait for borrowing data from the inherited type. In the case above, `Token` should implement `Borrow`. For simplicity, `#[storage]` and `sol_storage!` provide a `#[borrow]` annotation that can be used instead of manually implementing the trait: + +```rust +sol_storage! { + #[entrypoint] + pub struct Token { + #[borrow] + Erc20 erc20; + ... + } + + pub struct Erc20 { + ... + } +} +``` + +## Methods search order + +A type can inherit multiple other types (as long as they use the `#[public]` macro). Since execution begins in the type that uses the `#[entrypoint]` macro, that type will be first checked when searching a specific method. If the method is not found in that type, the search will continue in the inherited types, in order of inheritance. If the method is not found in any of the inherited methods, the call will revert. + +Let's see an example: + +```rust +#[public] +#[inherit(B, C)] +impl A { + pub fn foo() -> Result<(), Vec> { + ... + } +} + +#[public] +impl B { + pub fn bar() -> Result<(), Vec> { + ... + } +} + +#[public] +impl C { + pub fn bar() -> Result<(), Vec> { + ... + } + + pub fn baz() -> Result<(), Vec> { + ... + } +} +``` + +In the code above: + +- calling `foo()` will search the method in `A`, find it, and execute `A.foo()` +- calling `bar()` will search the method in `A` first, then in `B`, find it, and execute `B.bar()` +- calling `baz()` will search the method in `A`, `B` and finally `C`, so it will execute `C.baz()` + +Notice that `C.bar()` won't ever be reached, since the inheritance goes through `B` first, which has a method named `bar()` too. + +Finally, since the inherited types can also inherit other types themselves, keep in mind that method resolution finds the first matching method by [Depth First Search](https://en.wikipedia.org/wiki/Depth-first_search). + +## Overriding methods + +Because methods are checked in the inherited order, if two types implement the same method, the one in the higher level in the hierarchy will override the one in the lower levels, which won’t be callable. This allows for patterns where the developer imports a crate implementing a standard, like ERC-20, and then adds or overrides just the methods they want to without modifying the imported ERC-20 type. + +**Important warning**: The Stylus Rust SDK does not currently contain explicit `override` or `virtual` keywords for explicitly marking override functions. It is important, therefore, to carefully ensure that contracts are only overriding the functions. + +Let's see an example: + +```rust +#[public] +#[inherit(B, C)] +impl A { + pub fn foo() -> Result<(), Vec> { + ... + } +} + +#[public] +impl B { + pub fn foo() -> Result<(), Vec> { + ... + } + + pub fn bar() -> Result<(), Vec> { + ... + } +} +``` + +In the example above, even though `B` has an implementation for `foo()`, calling `foo()` will execute `A.foo()` since the method is searched first in `A`. + +## Learn more + +- [`Arbitrum documentation`](https://docs.arbitrum.io/stylus/reference/rust-sdk-guide#inheritance-inherit-and-borrow) +- [`inheritance, #[inherit] and #[borrow]`](https://docs.rs/stylus-sdk/latest/stylus_sdk/prelude/attr.public.html#inheritance-inherit-and-borrow) +- [`Router trait`](https://docs.rs/stylus-sdk/latest/stylus_sdk/abi/trait.Router.html) +- [`Borrow trait`](https://doc.rust-lang.org/core/borrow/trait.Borrow.html) +- [`BorrowMut trait`](https://doc.rust-lang.org/core/borrow/trait.BorrowMut.html) diff --git a/docs/stylus-by-example/basic_examples/primitive_data_types.mdx b/docs/stylus-by-example/basic_examples/primitive_data_types.mdx new file mode 100644 index 0000000000..6799edce5e --- /dev/null +++ b/docs/stylus-by-example/basic_examples/primitive_data_types.mdx @@ -0,0 +1,298 @@ +--- +title: 'Primitive Data Types • Stylus by Example' +description: 'Defines some of the basic primitives used in Arbitrum Stylus Rust smart contracts and how they map to compatible Solidity constructs.' +--- + +{/* Begin Content */} + +# Primitive Data Types + +The **Stylus SDK** makes use of the popular **Alloy** library (from the developers of **ethers-rs** and **Foundry**) to represent various native Solidity types as Rust types and to seamlessly convert between them when needed. These are needed since there are a number of custom types (like address) and large integers that are not natively supported in Rust. + +In this section, we'll focus on the following types: + +- `U256` +- `I256` +- `Address` +- `Boolean` +- `Bytes` + +More in-depth documentation about the available methods and types in the Alloy library can be found in their docs. It also helps to cross-reference with Solidity docs if you don't already have a solid understanding of those types. + +## Learn More + +- [Alloy docs (v0.7.6)](https://docs.rs/alloy-primitives/0.7.6/alloy_primitives/index.html) + - [`Address`](https://docs.rs/alloy-primitives/0.7.6/alloy_primitives/struct.Address.html) + - [`Signed`](https://docs.rs/alloy-primitives/0.7.6/alloy_primitives/struct.Signed.html) + - [`Uint`](https://docs.rs/ruint/1.10.1/ruint/struct.Uint.html) +- [Stylus Rust SDK](https://docs.rs/stylus-sdk/latest/stylus_sdk/index.html) + - [`Bytes`](https://docs.rs/stylus-sdk/latest/stylus_sdk/abi/struct.Bytes.html) +- [Solidity docs (v0.8.19)](https://docs.soliditylang.org/en/v0.8.19/types.html) + +## Integers + +Alloy defines a set of convenient Rust types to represent the typically sized integers used in Solidity. The type `U256` represents a 256-bit _unsigned_ integer, meaning it cannot be negative. The range for a `U256` number is 0 to 2^256 - 1. + +Negative numbers are allowed for I types, such as `I256`. These represent signed integers. + +- `U256` maps to `uint256` ... `I256` maps to `int256` +- `U128` maps to `uint128` ... `I128` maps to `int128` +- ... +- `U8` maps to `uint8` ... `I8` maps to `int8` + +### Integer Usage + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// Unsigned +let eight_bit: U8 = U8::from(1); +let two_fifty_six_bit: U256 = U256::from(0xff_u64); + +// Out: Stylus says: '8-bit: 1 | 256-bit: 255' +console!("8-bit: {} | 256-bit: {}", eight_bit, two_fifty_six_bit); + +// Signed +let eight_bit: I8 = I8::unchecked_from(-1); +let two_fifty_six_bit: I256 = I256::unchecked_from(0xff_u64); + +// Out: Stylus says: '8-bit: -1 | 256-bit: 255' +console!("8-bit: {} | 256-bit: {}", eight_bit, two_fifty_six_bit); +``` + +### Expanded Integer Usage + +```rust +// Use `try_from` if you're not sure it'll fit +let a = I256::try_from(20003000).unwrap(); +// Or parse from a string +let b = "100".parse::().unwrap(); +// With hex characters +let c = "-0x138f".parse::().unwrap(); +// Underscores are ignored +let d = "1_000_000".parse::().unwrap(); + +// Math works great +let e = a * b + c - d; +// Out: Stylus says: '20003000 * 100 + -5007 - 1000000 = 1999294993' +console!("{} * {} + {} - {} = {}", a, b, c, d, e); + +// Useful constants +let f = I256::MAX; +let g = I256::MIN; +let h = I256::ZERO; +let i = I256::MINUS_ONE; + +// Stylus says: '5789...9967, -5789...9968, 0, -1' +console!("{f}, {g}, {h}, {i}"); +// As hex: Stylus says: '0x7fff...ffff, 0x8000...0000, 0x0, 0xffff...ffff' +console!("{:#x}, {:#x}, {:#x}, {:#x}", f, g, h, i); +``` + +## Address + +Ethereum addresses are 20 bytes in length, or 160 bits. Alloy provides a number of helper utilities for converting to addresses from strings, bytes, numbers, and addresses. + +### Address Usage + +```rust +// From a 20 byte slice, all 1s +let addr1 = Address::from([0x11; 20]); +// Out: Stylus says: '0x1111111111111111111111111111111111111111' +console!("{addr1}"); + +// Use the address! macro to parse a string as a checksummed address +let addr2 = address!("d8da6bf26964af9d7eed9e03e53415d37aa96045"); +// Out: Stylus says: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' +console!("{addr2}"); + +// Format compressed addresses for output +// Out: Stylus says: '0xd8dA…6045' +console!("{addr2:#}"); +``` + +## Boolean + +Use native Rust primitives where it makes sense and where no equivalent Alloy primitive exists. + +### Boolean Usage + +```rust +let frightened: bool = true; +// Out: Stylus says: 'Boo! Did I scare you?' +console!("Boo! Did I scare you?"); + +let response = match frightened { + true => "Yes!".to_string(), + false => "No!".to_string(), +}; + +// Out: Stylus says: 'Yes!' +console!("{response}"); +``` + +## Bytes + +The Stylus SDK provides this wrapper type around `Vec` to represent a `bytes` value in Solidity. + +```rust +let vec = vec![108, 27, 56, 87]; +let b = Bytes::from(vec); +// Out: Stylus says: '0x6c1b3857' +console!(String::from_utf8_lossy(b.as_slice())); + +let b = Bytes::from(b"Hello!".to_vec()); +// Out: Stylus says: 'Hello!' +console!(String::from_utf8_lossy(b.as_slice())); +``` + +Note: Return the `Bytes` type on your Rust function if you want to return the ABI `bytes memory` type. + +## Boilerplate + +### src/lib.rs + +```rust +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; +use alloc::{string::ToString, vec::Vec}; + +use stylus_sdk::{ + alloy_primitives::{address, Address, I256, I8, U256, U8}, console, prelude::*, ArbResult +}; + +#[storage] +#[entrypoint] +pub struct Data { + +} + + +#[public] +impl Data { +fn user_main(_input: Vec) -> ArbResult { + // Use native Rust primitives where they make sense + // and where no equivalent Alloy primitive exists + let frightened: bool = true; + // Out: Stylus says: 'Boo! Did I scare you?' + console!("Boo! Did I scare you?"); + + let _response = match frightened { + true => "Yes!".to_string(), + false => "No!".to_string(), + }; + + // Out: Stylus says: 'Yes!' + console!("{_response}"); + + // U256 stands for a 256-bit *unsigned* integer, meaning it cannot be + // negative. The range for a U256 number is 0 to 2^256 - 1. Alloy provides + // a set of unsigned integer types to represent the various sizes available + // in the EVM. + // U256 maps to uint256 + // U128 maps to uint128 + // ... + // U8 maps to uint8 + let _eight_bit: U8 = U8::from(1); + let _two_fifty_six_bit: U256 = U256::from(0xff_u64); + + // Out: Stylus says: '8-bit: 1 | 256-bit: 255' + console!("8-bit: {} | 256-bit: {}", _eight_bit, _two_fifty_six_bit); + + // Negative numbers are allowed for I types. These represent signed integers. + // I256 maps to int256 + // I128 maps to int128 + // ... + // I8 maps to int8 + let _eight_bit: I8 = I8::unchecked_from(-1); + let _two_fifty_six_bit: I256 = I256::unchecked_from(0xff_u64); + + // Out: Stylus says: '8-bit: -1 | 256-bit: 255' + console!("8-bit: {} | 256-bit: {}", _eight_bit, _two_fifty_six_bit); + + // Additional usage of integers + + // Use `try_from` if you're not sure it'll fit + let a = I256::try_from(20003000).unwrap(); + // Or parse from a string + let b = "100".parse::().unwrap(); + // With hex characters + let c = "-0x138f".parse::().unwrap(); + // Underscores are ignored + let d = "1_000_000".parse::().unwrap(); + + // Math works great + let _e = a * b + c - d; + // Out: Stylus says: '20003000 * 100 + -5007 - 1000000 = 1999294993' + console!("{} * {} + {} - {} = {}", a, b, c, d, _e); + + // Useful constants + let _f = I256::MAX; + let _g = I256::MIN; + let _h = I256::ZERO; + let _i = I256::MINUS_ONE; + + // Stylus says: '5789...9967, -5789...9968, 0, -1' + console!("{_f}, {_g}, {_h}, {_i}"); + // As hex: Stylus says: '0x7fff...ffff, 0x8000...0000, 0x0, 0xffff...ffff' + console!("{:#x}, {:#x}, {:#x}, {:#x}", _f, _g, _h, _i); + + // Ethereum addresses are 20 bytes in length, or 160 bits. Alloy provides a number of helper utilities for converting to addresses from strings, bytes, numbers, and addresses + + // From a 20 byte slice, all 1s + let _addr1 = Address::from([0x11; 20]); + // Out: Stylus says: '0x1111111111111111111111111111111111111111' + console!("{_addr1}"); + + // Use the address! macro to parse a string as a checksummed address + let _addr2 = address!("d8da6bf26964af9d7eed9e03e53415d37aa96045"); + // Out: Stylus says: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' + console!("{_addr2}"); + + // Format compressed addresses for output + // Out: Stylus says: '0xd8dA…6045' + console!("{_addr2:#}"); + + Ok(Vec::new()) +} +} +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_data_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/basic_examples/sending_ether.mdx b/docs/stylus-by-example/basic_examples/sending_ether.mdx new file mode 100644 index 0000000000..02d5ce6197 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/sending_ether.mdx @@ -0,0 +1,152 @@ +--- +title: 'Sending Ether • Stylus by Example' +description: "How to send Ether in your Rust smart contracts using Arbitrum's Stylus SDK" +--- + +{/* Begin Content */} + +# Sending Ether + +We have three main ways to send Ether in Rust Stylus: using the `transfer_eth` method, using low level `call` method, and sending value while calling an external contract. + +It's important to note that the `transfer_eth` method in Rust Stylus invokes the recipient contract, which may subsequently call other contracts. All the gas is supplied to the recipient, which it may burn. Conversely, the transfer method in Solidity is capped at 2300 gas. In Rust Stylus, you can cap the gas by using the low-level call method with a specified gas. An example of this is provided in the code on bottom of the page. + +These two methods are exactly equivalent under the hood: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +transfer_eth(recipient, value)?; + +call(Call::new_in(self).value(value), recipient, &[])?; +``` + +## Where to Send Ether + +1. **Externally Owned Account (EOA) Addresses**: Directly send Ether to an EOA address. + +2. **Solidity Smart Contracts with Receive Function (No Calldata)**: Send Ether to a Solidity smart contract that has a `receive` function without providing any calldata. + +3. **Solidity Smart Contracts with Fallback Function (With Calldata)**: Send Ether to a Solidity smart contract that has a `fallback` function by providing the necessary calldata. + +4. **Smart Contracts with Payable Methods (both Solidity and Stylus)**: Send Ether to smart contracts that have defined payable methods. Payable methods are identified by the `payable` modifier in Solidity, and the `#[payable]` macro in Rust. + +Below you can find examples for each of these methods and how to define them in a Rust Stylus smart contract using the Stylus SDK: + +### `src/lib.rs` + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +use alloy_primitives::Address; +use stylus_sdk::{ + abi::Bytes, + call::{call, transfer_eth, Call}, + msg::{self}, + prelude::*, +}; + +sol_interface! { + interface ITarget { + function receiveEther() external payable; + } +} + +#[storage] +#[entrypoint] +pub struct SendEther {} + +#[public] +impl SendEther { + // Transfer Ether using the transfer_eth method + // This can be used to send Ether to an EOA or a Solidity smart contract that has a receive() function implemented + #[payable] + pub fn send_via_transfer(to: Address) -> Result<(), Vec> { + transfer_eth(to, msg::value())?; + Ok(()) + } + + // Transfer Ether using a low-level call + // This can be used to send Ether to an EOA or a Solidity smart contract that has a receive() function implemented + #[payable] + pub fn send_via_call(&mut self, to: Address) -> Result<(), Vec> { + call(Call::new_in(self).value(msg::value()), to, &[])?; + Ok(()) + } + + // Transfer Ether using a low-level call with a specified gas limit + // This can be used to send Ether to an EOA or a Solidity smart contract that has a receive() function implemented + #[payable] + pub fn send_via_call_gas_limit(&mut self, to: Address, gas_amount: u64) -> Result<(), Vec> { + call( + Call::new_in(self).value(msg::value()).gas(gas_amount), + to, + &[], + )?; + Ok(()) + } + + // Transfer Ether using a low-level call with calldata + // This can be used to call a Solidity smart contract's fallback function and send Ether along with calldata + #[payable] + pub fn send_via_call_with_call_data( + &mut self, + to: Address, + data: Bytes, + ) -> Result<(), Vec> { + call(Call::new_in(self).value(msg::value()), to, data.as_slice())?; + Ok(()) + } + + // Transfer Ether to another smart contract via a payable method on the target contract + // The target contract can be either a Solidity smart contract or a Stylus contract that has a receiveEther function, which is a payable function + #[payable] + pub fn send_to_stylus_contract(&mut self, to: Address) -> Result<(), Vec> { + let target = ITarget::new(to); + let config = Call::new_in(self).value(msg::value()); + target.receive_ether(config)?; + Ok(()) + } +} +``` + +### `Cargo.toml` + +```toml +[package] +name = "stylus_sending_ether_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/basic_examples/sidebar.js b/docs/stylus-by-example/basic_examples/sidebar.js new file mode 100644 index 0000000000..8a4c7a58d3 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/sidebar.js @@ -0,0 +1,82 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebar = { + "items": [ + { + "type": "doc", + "id": "stylus-by-example/basic_examples/hello_world", + "label": "Hello World" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/primitive_data_types", + "label": "Primitive Data Types" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/variables", + "label": "Variables" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/constants", + "label": "Constants" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/function", + "label": "Function" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/errors", + "label": "Errors" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/events", + "label": "Events" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/inheritance", + "label": "Inheritance" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/vm_affordances", + "label": "Vm Affordances" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/sending_ether", + "label": "Sending Ether" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/function_selector", + "label": "Function Selector" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/abi_encode", + "label": "Abi Encode" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/abi_decode", + "label": "Abi Decode" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/hashing", + "label": "Hashing" + }, + { + "type": "doc", + "id": "stylus-by-example/basic_examples/bytes_in_bytes_out", + "label": "Bytes In Bytes Out" + } + ] +}; +module.exports = sidebar.items; \ No newline at end of file diff --git a/docs/stylus-by-example/basic_examples/variables.mdx b/docs/stylus-by-example/basic_examples/variables.mdx new file mode 100644 index 0000000000..77d7719abc --- /dev/null +++ b/docs/stylus-by-example/basic_examples/variables.mdx @@ -0,0 +1,125 @@ +--- +title: 'Variables • Stylus by Example' +description: 'An explanation of the types of variables available as part of the Arbitrum Stylus Rust SDK and how it differs from Solidity.' +--- + +{/* Begin Content */} + +# Variables + +In Solidity, there are 3 types of variables: local, state, and global. Local variables are not stored on the blockchain, while state variables are (and incur a much higher cost as a result). This is true of Arbitrum Stylus Rust smart contracts as well, although how they're defined is quite different. + +In Rust, **local variables** are just ordinary variables you assign with `let` or `let mut` statements. Local variables are far cheaper than state variables, even on the EVM, however, Stylus local variables are more than 100x cheaper to allocate in memory than their Solidity equivalents. + +Unlike Solidity, Rust was not built inherently with the blockchain in mind. It is a general purpose programming language. We therefore define specific _storage_ types to explicitly denote values intended to be stored permanently as part of the contract's state. **State variables** cost the same to store as their Solidity equivalents. + +**Global variables** in Solidity, such as `msg.sender` and `block.timestamp`, are available as function calls pulled in from the `stylus_sdk` with their Rust equivalents being `msg::sender()` and `block::timestamp()`, respectively. These variables provide information about the blockchain or the active transaction. + +## Learn more + +- [Rust Docs - Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html) +- [Stylus SDK Rust Docs - Storage](https://docs.rs/stylus-sdk/latest/stylus_sdk/storage/index.html) +- [Stylus SDK Guide - Storage](https://docs.arbitrum.io/stylus/reference/rust-sdk-guide#storage) +- [Solidity docs - state variables](https://docs.soliditylang.org/en/v0.8.19/structure-of-a-contract.html#state-variables) +- [Solidity docs - global variables](https://docs.soliditylang.org/en/v0.8.19/cheatsheet.html#global-variables) + +### src/lib.rs + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +// Only run this as a WASM if the export-abi feature is not set. +#![cfg_attr(not(any(feature = "export-abi", test)), no_main)] +extern crate alloc; + +use stylus_sdk::alloy_primitives::{U16, U256}; +use stylus_sdk::prelude::*; +use stylus_sdk::storage::{StorageAddress, StorageBool, StorageU256}; +use stylus_sdk::{block, console, msg}; + +#[storage] +#[entrypoint] +pub struct Contract { + initialized: StorageBool, + owner: StorageAddress, + max_supply: StorageU256, +} + +#[public] +impl Contract { + // State variables are initialized in an `init` function. + pub fn init(&mut self) -> Result<(), Vec> { + // We check if contract has been initialized before. + // We return if so, we initialize if not. + let initialized = self.initialized.get(); + if initialized { + return Ok(()); + } + self.initialized.set(true); + + // We set the contract owner to the caller, + // which we get from the global msg module + self.owner.set(msg::sender()); + self.max_supply.set(U256::from(10_000)); + + Ok(()) + } + + pub fn do_something() -> Result<(), Vec> { + // Local variables are not saved to the blockchain + // 16-bit Rust integer + let _i = 456_u16; + // 16-bit int inferred from U16 Alloy primitive + let _j = U16::from(123); + + // Here are some global variables + let _timestamp = block::timestamp(); + let _amount = msg::value(); + + console!("Local variables: {_i}, {_j}"); + console!("Global variables: {_timestamp}, {_amount}"); + + Ok(()) + } +} + +``` + +### Cargo.toml + +```toml +[package] +name = "stylus_variable_example" +version = "0.1.7" +edition = "2021" +license = "MIT OR Apache-2.0" +keywords = ["arbitrum", "ethereum", "stylus", "alloy"] + +[dependencies] +alloy-primitives = "=0.7.6" +alloy-sol-types = "=0.7.6" +mini-alloc = "0.4.2" +stylus-sdk = "0.6.0" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.12.0", features = ["full"] } +ethers = "2.0" +eyre = "0.6.8" + +[features] +export-abi = ["stylus-sdk/export-abi"] + +[lib] +crate-type = ["lib", "cdylib"] + +[profile.release] +codegen-units = 1 +strip = true +lto = true +panic = "abort" +opt-level = "s" + +``` diff --git a/docs/stylus-by-example/basic_examples/vm_affordances.mdx b/docs/stylus-by-example/basic_examples/vm_affordances.mdx new file mode 100644 index 0000000000..2be96ed2b6 --- /dev/null +++ b/docs/stylus-by-example/basic_examples/vm_affordances.mdx @@ -0,0 +1,161 @@ +--- +title: 'VM affordances • Stylus by Example' +description: 'How to access VM affordances using the Arbitrum Stylus Rust SDK.' +--- + +{/* Begin Content */} + +# VM affordances + +The Stylus Rust SDK contains several modules for interacting with the Virtual Machine (VM), which can be imported from `stylus_sdk`. + +Let's see an example: + +import NotForProductionBannerPartial from '../../partials/_not-for-production-banner-partial.mdx'; + + + +```rust +use stylus_sdk::{msg}; + +let callvalue = msg::value(); +``` + +This page lists the modules that are available, as well as the methods within those modules. + +## block + +Allows you to inspect the current block: + +- `basefee`: gets the basefee of the current block +- `chainid`: gets the unique chain identifier of the Arbitrum chain +- `coinbase`: gets the coinbase of the current block, which on Arbitrum chains is the L1 batch poster's address +- `gas_limit`: gets the gas limit of the current block +- `number`: gets a bounded estimate of the L1 block number at which the sequencer sequenced the transaction. See [Block gas limit, numbers and time](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time) for more information on how this value is determined +- `timestamp`: gets a bounded estimate of the Unix timestamp at which the sequencer sequenced the transaction. See [Block gas limit, numbers and time](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time) for more information on how this value is determined + +```rust +use stylus_sdk::{block}; + +let basefee = block::basefee(); +let chainid = block::chainid(); +let coinbase = block::coinbase(); +let gas_limit = block::gas_limit(); +let number = block::number(); +let timestamp = block::timestamp(); +``` + +## contract + +Allows you to inspect the contract itself: + +- `address`: gets the address of the current program +- `args`: reads the invocation's calldata. The entrypoint macro uses this under the hood +- `balance`: gets the balance of the current program +- `output`: writes the contract's return data. The entrypoint macro uses this under the hood +- `read_return_data`: copies the bytes of the last EVM call or deployment return result. Note: this function does not revert if out of bounds, but rather will copy the overlapping portion +- `return_data_len`: returns the length of the last EVM call or deployment return result, or 0 if neither have happened during the program's execution + +```rust +use stylus_sdk::{contract}; + +let address = contract::address(); +contract::args(); +let balance = contract::balance(); +contract::output(); +contract::read_return_data(); +contract::return_data_len(); +``` + +## crypto + +Allows you to access VM-accelerated cryptographic functions: + +- `keccak`: efficiently computes the [keccak256](https://en.wikipedia.org/wiki/SHA-3) hash of the given preimage + +```rust +use stylus_sdk::{crypto}; +use stylus_sdk::alloy_primitives::address; + +let preimage = address!("361594F5429D23ECE0A88E4fBE529E1c49D524d8"); +let hash = crypto::keccak(&preimage); +``` + +## evm + +Allows you to access affordances for the Ethereum Virtual Machine: + +- `gas_left`: gets the amount of gas remaining. See [Ink and Gas](https://docs.arbitrum.io/stylus/concepts/stylus-gas) for more information on Stylus's compute pricing +- `ink_left`: gets the amount of ink remaining. See [Ink and Gas](https://docs.arbitrum.io/stylus/concepts/stylus-gas) for more information on Stylus's compute pricing +- `log`: emits a typed alloy log +- `pay_for_memory_grow`: this function exists to force the compiler to import this symbol. Calling it will unproductively consume gas +- `raw_log`: emits an EVM log from its raw topics and data. Most users should prefer the alloy-typed [raw_log](https://docs.rs/stylus-sdk/latest/stylus_sdk/evm/fn.raw_log.html) + +```rust +use stylus_sdk::{evm}; + +let gas_left = evm::gas_left(); +let ink_left = evm::ink_left(); +evm::log(...); +evm::pay_for_memory_grow(); +evm::raw_log(...); +``` + +Here's an example of how to emit a Transfer log: + +```rust +sol! { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +fn foo() { + ... + evm::log(Transfer { + from: Address::ZERO, + to: address, + value, + }); +} +``` + +## msg + +Allows you to inspect the current call + +- `reentrant`: whether the current call is reentrant +- `sender`: gets the address of the account that called the program. For normal L2-to-L2 transactions the semantics are equivalent to that of the EVM's [CALLER](https://www.evm.codes/#33) opcode, including in cases arising from [DELEGATE_CALL](https://www.evm.codes/#f4) +- `value`: gets the ETH value in wei sent to the program + +```rust +use stylus_sdk::{msg}; + +let reentrant = msg::reentrant(); +let sender = msg::sender(); +let value = msg::value(); +``` + +## tx + +Allows you to inspect the current transaction + +- `gas_price`: gets the gas price in wei per gas, which on Arbitrum chains equals the basefee +- `gas_to_ink`: converts evm gas to ink. See [Ink and Gas](https://docs.arbitrum.io/stylus/concepts/stylus-gas) for more information on Stylus's compute-pricing model +- `ink_price`: gets the price of ink in evm gas basis points. See [Ink and Gas](https://docs.arbitrum.io/stylus/concepts/stylus-gas) for more information on Stylus's compute-pricing model +- `ink_to_gas`: converts ink to evm gas. See [Ink and Gas](https://docs.arbitrum.io/stylus/concepts/stylus-gas) for more information on Stylus's compute-pricing model +- `origin`: gets the top-level sender of the transaction. The semantics are equivalent to that of the EVM's [ORIGIN](https://www.evm.codes/#32) opcode + +```rust +use stylus_sdk::{tx}; + +let gas_price = tx::gas_price(); +let gas_to_ink = tx::gas_to_ink(); +let ink_price = tx::ink_price(); +let ink_to_gas = tx::ink_to_gas(); +let origin = tx::origin(); +``` + +## Learn More + +- [`Arbitrum documentation`](https://docs.arbitrum.io/stylus/reference/rust-sdk-guide#evm-affordances) +- [`Stylus SDK modules`](https://docs.rs/stylus-sdk/latest/stylus_sdk/index.html#modules) diff --git a/docs/stylus/concepts/how-it-works.md b/docs/stylus/concepts/how-it-works.md index b9d98d8500..540a573998 100644 --- a/docs/stylus/concepts/how-it-works.md +++ b/docs/stylus/concepts/how-it-works.md @@ -9,6 +9,8 @@ user_story: As an Ethereum developer/project owner, I need to vet the Stylus. content_type: concept --- +import { VanillaAdmonition } from '@site/src/components/VanillaAdmonition/'; + There are four main steps for bringing a Stylus program to life: **coding, activation, execution, and proving**. ## Coding @@ -31,6 +33,16 @@ Activating a Stylus program requires a new precompile, ArbWasm. This precompile Gas metering is essential for certifying that computational resources are paid for. In Stylus, the unit for measuring cost is called **ink**, which is similar to Ethereum's gas but thousands of times smaller. There are two reasons why a new measurement is used: First, WASM execution is so much faster than the EVM that executing thousands of WASM opcodes could be done in the same amount of time it takes the EVM to execute one. Second, the conversion rate of ink to gas can change based on future hardware or VM improvements. For a conceptual introduction to Stylus gas and ink, see [gas and ink (Stylus)](/stylus/concepts/gas-metering.mdx). + + Stylus smart contracts will need to be reactivated once per year (365 days) or whenever an upgrade + to Stylus (which will always involve an ArbOS upgrade), even if they are in the cache. To complete + this reactivation, you can use + [`cargo-stylus`](https://docs.arbitrum.io/stylus/using-cli#cargo-stylus-commands-reference) or + directly through the [ArbWasm + precompile](https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbwasm). If + contracts do not get reactivated, they will no longer be callable. + + ## Execution Stylus programs execute in a fork of [Wasmer](https://wasmer.io/), the leading WebAssembly runtime, with minimal changes to optimize their codebase for blockchain-specific use cases. Wasmer executes native code much faster than Geth executes EVM bytecode, contributing to the significant gas savings that Stylus provides. @@ -67,4 +79,4 @@ Stylus doesn't just improve on cost and speed. WASM programs are also safer. Ree ### Fully interoperable -Solidity programs and WASM programs are completely composable. If working in Solidity, a developer can call a Rust program or rely on another dependency in a different language. If working in Rust, all Solidity functionalities are accessible out of the box. +Solidity programs and WASM programs are completely composable. If working in Solidity, a developer can call a Rust program or rely on another dependency in a different language. If working in Rust, all Solidity functionalities are accessible out of the box.gas- diff --git a/docs/stylus/how-tos/caching-contracts.mdx b/docs/stylus/how-tos/caching-contracts.mdx index 4c0cf9b304..19cf1cd52c 100644 --- a/docs/stylus/how-tos/caching-contracts.mdx +++ b/docs/stylus/how-tos/caching-contracts.mdx @@ -7,21 +7,11 @@ target_audience: 'Developers deploying smart contracts using Stylus.' sidebar_position: 3 --- -import { VanillaAdmonition } from '@site/src/components/VanillaAdmonition/'; - Stylus is designed for fast computation and efficiency. However, the initialization process when entering a contract can be resource-intensive and time-consuming. This initialization process, if repeated frequently, may lead to inefficiencies. To address this, we have implemented a caching strategy. By storing frequently accessed contracts in memory, we can avoid repeated initializations. This approach saves resources and time, significantly enhancing the speed and efficiency of contract execution. - - **Note that Stylus smart contracts will need to be re-activated once per year (365 days) or - whenever a upgrade to Stylus (which will always involve an ArbOS upgrade), even if they are in the - cache. This re-activation can be done using - [`cargo-stylus`](https://github.com/OffchainLabs/cargo-stylus), a cargo subcommand for building, - verifying, and deploying Arbitrum Stylus WASM contracts in Rust.** - - ## CacheManager contract The core component of our caching strategy is the [`CacheManager` contract](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/chain/CacheManager.sol). This smart contract manages the cache, interacts with precompiles, and determines which contracts should be cached. The `CacheManager` can hold approximately 4,000 contracts in memory. From 05227e5a2c98c9668e3864c905ea3e9f68ff8fba Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 14:36:06 -0500 Subject: [PATCH 39/75] adjusting redirects --- vercel.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vercel.json b/vercel.json index 2ff224af07..df0d2b67a6 100644 --- a/vercel.json +++ b/vercel.json @@ -280,6 +280,11 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/arbos/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/arbos/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/state-transition-function/arbos/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/arbos/?)", @@ -290,6 +295,11 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/ethereum-vs-arbitrum/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/geth/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/modified-geth-on-arbitrum/?)", From 42ff89f474c0166cb1913a137b38c3b29221bbb3 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 14:44:01 -0500 Subject: [PATCH 40/75] making more adjustments to redirects --- vercel.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/vercel.json b/vercel.json index df0d2b67a6..6d7d03f5e1 100644 --- a/vercel.json +++ b/vercel.json @@ -195,11 +195,6 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/anytrust-protocol/?)", "permanent": false }, - { - "source": "/(docs/how-arbitrum-works/data-availability/?)", - "destination": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", - "permanent": false - }, { "source": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", "destination": "/(docs/run-arbitrum-node/data-availability/?)", @@ -262,7 +257,7 @@ }, { "source": "/(docs/how-arbitrum-works/gas-fees/?)", - "destination": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/gas-and-fees/?)", "permanent": false }, { From 6120597cb0f82deb4c6219d613455a7d3febe061 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 14:46:51 -0500 Subject: [PATCH 41/75] redirects --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index 6d7d03f5e1..05d6eb3a58 100644 --- a/vercel.json +++ b/vercel.json @@ -196,7 +196,7 @@ "permanent": false }, { - "source": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", + "source": "/(docs/how-arbitrum-works/data-availability/?)", "destination": "/(docs/run-arbitrum-node/data-availability/?)", "permanent": false }, From cffc82e5c8f5ac3e13354b0d31cec78482653bb5 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 17 Sep 2025 13:23:58 -0500 Subject: [PATCH 42/75] Fixing typo / em-dashes --- .../01-inside-arbitrum-nitro.mdx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 770af22d04..dad3f7d055 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -34,7 +34,7 @@ Nitro is a major upgrade to Arbitrum, improving over "classic" Arbitrum in sever - **Geth Tracing**, for even broader debugging support. - Any many, many more changes. -## The Big Picture +## The big picture At the most basic level, an Arbitrum chain works like this: @@ -47,7 +47,7 @@ People and contracts put messages into the inbox. The chain reads the messages o If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then, the chain will process your transaction, execute it, and produce some outputs: a transaction receipt and any withdrawals that your transaction initiated. -Execution is deterministic - which means that the contents of its inbox uniquely determine the chain's behavior. Because of this, the result of your transaction is knowable as soon as it gets placed in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) +Execution is deterministic—which means that the contents of its inbox uniquely determine the chain's behavior. Because of this, the result of your transaction is knowable as soon as it gets placed in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) All of the technical details in this document connect to this diagram (shown above). To get from this diagram to a full description of Arbitrum, we'll need to answer questions like these: @@ -58,7 +58,7 @@ All of the technical details in this document connect to this diagram (shown abo - How are `ETH` and tokens transferred into and out of Arbitrum chains, and how are they managed while on chain? - How can I run my own Arbitrum node or validator? -## Nitro's Design: The Four Big Ideas +## Nitro's design: The four big ideas The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a summary of each, and then we'll unpack them in more detail in later sections. @@ -67,7 +67,7 @@ The essence of Nitro, and its key innovations, lie in four big ideas. We'll list - **Separate Execution from Proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. - **Optimistic Rollup with Interactive Fraud Proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an optimistic rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. -## Sequencing, Followed by Deterministic Execution +## Sequencing, followed by deterministic execution This diagram illustrates the process of how transaction processing works in Nitro. @@ -79,7 +79,7 @@ First, the user creates a transaction, uses their wallet to sign it, and sends i Once the transactions are sequenced, they go to the _State Transition Function (STF)_ for processing, one by one, in order. The STF takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. -Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the STF will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions, so the STF never sees them - and this reduces cost and therefore keeps transaction fees low - but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) +Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the STF will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions, so the STF never sees them—and this reduces cost and therefore keeps transaction fees low—but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) The state transition function is deterministic, meaning its behavior depends only on the current state and the contents of the next transaction, and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. @@ -91,7 +91,7 @@ For additional reading on STF inputs, see the [STF Inputs deep-dive](/how-arbitr ::: -## How the Sequencer Publishes the Sequence +## How the Sequencer publishes the sequence So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed and batches posted on L1 Ethereum. @@ -109,7 +109,7 @@ To learn more about the Sequencer in depth, take a look at the [Sequencer Deep D ::: -## Geth at the Core +## Geth at the core The second key design idea in Nitro is "Geth at the Core." Here, "Geth" refers to go-ethereum, the most common node software for Ethereum. As its name suggests, go-ethereum is written in the Go programming language, as is almost all of Nitro. @@ -131,7 +131,7 @@ For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works ::: -## Separating Execution from Proving +## Separating execution from proving One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary execution and being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, but compiling it to different targets for the two cases. @@ -149,9 +149,9 @@ Second, WAVM restricts a few features of WASM. For example, WAVM does not contai Third, WAVM introduces a few additional opcodes to facilitate interaction with the blockchain environment. For example, new instructions enable the WAVM code to read and write the chain's global state, retrieve the next message from the chain's inbox, or signal a successful completion of executing the State Transition Function. -### ReadPreImage and the Hash Oracle Trick +### `ReadPreImage` and the Hash Oracle Trick -The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zer ofi `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. +The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zero if `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. (In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest party, assuming that the full history of the L1 Ethereum chain is available. For convenience, providing a hash preimage by a third party, such as a public server, and the correctness of the supplied value is easily verified.) From 1d270a320ddadd7c51c52f15868e0a88ef1f6eb0 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 17 Sep 2025 14:36:30 -0500 Subject: [PATCH 43/75] Fixing typos --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index dad3f7d055..2e7dbca94f 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -166,12 +166,14 @@ The "Hash Oracle Trick" of storing the Merkle hash of a data structure and relyi Arbitrum is an optimistic rollup. Let's unpack that term. _Rollup_ + Arbitrum is a rollup, which means that the inputs to the chain—the messages that go into the inbox—are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they need to determine the current correct state of the chain. They have the full history of the inbox, and the inbox history uniquely determines the results, allowing them to reconstruct the state of the chain based only on public information, if needed. This posting of calldata enables anyone to be a full participant in the Arbitrum protocol, allowing them to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. _Optimistic_ -Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved). + +Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved.) Because a party that tries to cheat will lose a deposit, attempts to cheat should be very rare. The normal case will be a single party posting a correct rollup block, with nobody challenging it. @@ -187,7 +189,7 @@ The idea of interactive proving is that Alice and Bob will engage in a back-and- Arbitrum's approach involves dissecting the dispute. If Alice's claim covers `N` steps of execution, she posts two claims of size `N/2`, which combine to yield her initial `N-step` claim. Then, Bob picks one of Alice's `N/2-step` claims to challenge. Now the size of the dispute has been halved. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far, the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute narrows to a single step that the L1 mediator (referee) needs to resolve the dispute by looking at what the instruction does and whether Alice's claim about it is correct. -The key principle behind interactive proving is that if Alice and Bob are in a dispute, they should perform as much off-chain work as possible to resolve it, rather than delegating that work to a Layer 1 (L1) contract. +The key principle behind interactive proving is that if Alice and Bob are in a dispute, they should perform as much offchain work as possible to resolve it, rather than delegating that work to a Layer 1 (L1) contract. ### Re-executing transactions @@ -198,7 +200,7 @@ The alternative to interactive proving would be to have a rollup block contain a We strongly believe that interactive proving is the superior approach for the following reasons. - **More efficient in the optimistic case**: Because interactive proving can resolve disputes that are larger than one transaction, it can allow a rollup block to contain only a single claim about the end state of the chain after all of the execution covered by the block. By contrast, re-execution requires posting a state claim for each transaction within the rollup block. With hundreds or thousands of transactions per rollup block, this represents a substantial difference in L1 footprint, which is the main component of the cost. -- **More efficient in the pessimistic case**: In the case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that Alice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims - Bob does that, off-chain.) Only one instruction needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. +- **More efficient in the pessimistic case**: In the case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that Alice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims—Bob does that, offchain.) Only one instruction needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. - **Higher per-transaction gas limit**: Interactive proving can escape from Ethereum's tight per-transaction gas limit. The gas limit isn't infinite, for obvious reasons, but it can be larger than on Ethereum. As far as Ethereum is concerned, the only downside of a gas-heavy Arbitrum transaction is that it may require an interactive fraud proof with slightly more steps (and only if the transaction is indeed fraudulent). By contrast, re-execution of the transaction (which is more expensive than executing it directly) is within a single Ethereum transaction. - **More implementation flexibility**: Interactive proving allows more flexibility in implementation. All that is necessary is the ability to verify a one-step proof on Ethereum. By contrast, re-execution approaches have limitations based on the EVM. @@ -220,13 +222,13 @@ You might wonder why we need the rollup protocol. If everyone already knows the With those preliminaries behind us, let's jump into the details of the rollup protocol. -Some parties that participate in the protocol are _validators_. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any on-chain actions, can be run permissionlessly (see "validators" below). +Some parties that participate in the protocol are _validators_. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any onchain actions, can be run permissionlessly (see "validators" below). The key security property of the rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. ## The Rollup Chain -The rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. +The rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. Validators can propose assertions. New assertions will be _unresolved_ at first. Eventually, every assertion will be _resolved_, either by being _confirmed_ or _rejected_. The confirmed assertions make up the confirmed history of the chain. From 8b8a12d51f718aead6316076b28078b9ffd12efc Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 17 Sep 2025 15:31:00 -0500 Subject: [PATCH 44/75] Adding link --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 2e7dbca94f..23f9460bae 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -246,7 +246,7 @@ An assertion implicitly claims that its predecessor assertion is correct. This c An assertion also implicitly claims that its older siblings (older assertions with the same predecessor, if any) are incorrect. If two assertions are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. -The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's bonder. (More on challenges below.) +The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's bonder. (More on [challenges](#challenges) below.) In the normal case, the rollup chain will look like this: From fa8a40380298f9d8a754275dd9173129d8537821 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 18 Sep 2025 14:25:21 -0500 Subject: [PATCH 45/75] Minor style/grammar --- .../01-inside-arbitrum-nitro.mdx | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 23f9460bae..7ee64e099c 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -187,7 +187,7 @@ There are basically two options: interactive proving or re-executing transaction The idea of interactive proving is that Alice and Bob will engage in a back-and-forth protocol, mediated by an L1 contract, to resolve their dispute with minimal work required from any L1 contract. -Arbitrum's approach involves dissecting the dispute. If Alice's claim covers `N` steps of execution, she posts two claims of size `N/2`, which combine to yield her initial `N-step` claim. Then, Bob picks one of Alice's `N/2-step` claims to challenge. Now the size of the dispute has been halved. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far, the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute narrows to a single step that the L1 mediator (referee) needs to resolve the dispute by looking at what the instruction does and whether Alice's claim about it is correct. +Arbitrum's approach involves dissecting the dispute. If Alice's claim covers `N` steps of execution, she posts two claims of size `N/2`, which combine to yield her initial `N`-step claim. Then, Bob picks one of Alice's `N/2`-step claims to challenge. Now the size of the dispute has been halved. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far, the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute narrows to a single step that the L1 mediator (referee) needs to resolve the dispute by looking at what the instruction does and whether Alice's claim about it is correct. The key principle behind interactive proving is that if Alice and Bob are in a dispute, they should perform as much offchain work as possible to resolve it, rather than delegating that work to a Layer 1 (L1) contract. @@ -345,19 +345,22 @@ For further reading on Assertions and how to create them, refer to the [Assertio ### Dissection Protocol: Simplified Version -Alice is defending the claim that starting with the state in the predecessor assertion, the state of the Virtual Machine can advance to the state specified in assertion A. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that that execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. +Alice is defending the claim that starting with the state in the predecessor assertion, the state of the Virtual Machine can advance to the state specified in assertion `A`. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that the execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. -Alice's first move requires her to dissect her claims about intermediate states between the beginning (0 instructions executed) and the end (`N` instructions executed). Therefore, we require Alice to divide her claim in half and post the state at the halfway point, after executing `N/2` instructions. +Alice's first move requires her to dissect her claims about intermediate states between the beginning (zero instructions executed) and the end (`N` instructions executed). Therefore, we require Alice to divide her claim in half and post the state at the halfway point, after executing `N/2` instructions. -Now Alice has effectively bisected her `N-step` assertion into two (`N/2`)-step assertions. Bob has to point to one of those two half-size assertions and claim it is wrong. +Now Alice has effectively bisected her `N`-step assertion into two `N/2`-step assertions. Bob has to point to one of those two half-size assertions and claim it is wrong. At this point, we're effectively back in the original situation: Alice having asserted that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds, Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must provide a one-step proof, which the EthBridge will verify. ### Why Dissection Correctly Identifies a Cheater -Before discussing the complexities of the real challenge protocol, let's pause to understand why the simplified version of the protocol is correct. Here, correctness means two things: (1) if Alice's initial claim is correct, Alice can always win the challenge, and (2) if Alice's initial claim is incorrect, Bob can always win the challenge. +Before discussing the complexities of the real challenge protocol, let's pause to understand why the simplified version of the protocol is correct. Here, correctness means two things: -To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending an accurate claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove so that that claim will be provable and Alice can win the challenge. +1. If Alice's initial claim is correct, Alice can always win the challenge, and +2. If Alice's initial claim is incorrect, Bob can always win the challenge. + +To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending an accurate claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove so that the claim will be provable and Alice can win the challenge. To prove (2), observe that if Alice's initial claim is incorrect, this can only be because her claimed endpoint after `N` steps is incorrect, then when Alice offers her midpoint state claim, that midpoint claim is either correct or incorrect. If it's incorrect, then Bob can challenge Alice's first-half claim, which will be incorrect. If Alice's midpoint state claim is correct, then her second-half claim must be incorrect so that Bob can challenge that. So whatever Alice does, Bob will be able to challenge an incorrect half-size claim. At each stage of the protocol, Bob can identify an incorrect claim to challenge. Ultimately, Alice will have an incorrect one-step claim to prove, which she will be unable to do, allowing Bob to win the challenge. @@ -369,7 +372,7 @@ The real dissection protocol is conceptually similar to the simplified one descr - **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an assertion, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute shifts to a dispute about a single execution of the State Transition Function, or in other words, about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). - **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This division requires posting `K-1` intermediate claims at points evenly spaced through the claimed execution, which reduces the number of rounds by a factor of log(`K`)/log(`2`). -- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This segmentation reduces the number of moves in the game by an additional factor of 2, because the size is cut by a factor of `K` for every move, rather than for every two moves. +- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This segmentation reduces the number of moves in the game by an additional factor of `2`, because the size is cut by a factor of `K` for every move, rather than for every two moves. - **Deal With The Empty-Inbox Case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might halt, or it might have to wait because its inbox is exhausted, so it cannot proceed until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (except the initial claim) to claim a special end state, which means that the specified amount of execution is not possible under the current conditions. - **Time Limits**: Each player has a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Consider the time allowance to be approximately one week. @@ -415,11 +418,11 @@ ArbOS is a trusted "system glue" component that acts as the hypervisor, facilita In Arbitrum, much of the work that would otherwise have to be done expensively at Layer 1 is instead done by ArbOS, trustlessly performing these functions at the speed and low cost of Layer 2. -Supporting these functions in Layer 2 trusted software, rather than building them into the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. Having a trusted operating system at Layer 2 also offers significant advantages in flexibility, as Layer 2 code is easier to evolve or customize for a particular chain than a Layer 1-enforced architecture would be. +Supporting these functions in Layer 2 trusted software, rather than building them into the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. In addition, ArbOS also offers significant advantages in flexibility, as Layer 2 code is easier to evolve or customize for a particular chain than a Layer 1-enforced architecture would be. -ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available in Arbitrum chains. +ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available for Arbitrum chains. ## Full Nodes @@ -443,7 +446,7 @@ The Sequencer does have control over ordering, allowing it to assign its clients ### Inboxes, fast and slow -When we add a Sequencer, the operation of the inbox changes. +When we add a Sequencer, the operation of the inbox changes: - Only the Sequencer can put new messages directly into the inbox. The Sequencer tags the messages it is submitting with an Ethereum block number and timestamp. (ArbOS ensures that these are non-decreasing, adjusting them upward if necessary to avoid decreases.) - Anyone else can submit a message, but messages submitted by non-Sequencer nodes will go into the "delayed inbox" queue (managed by an L1 Ethereum contract). @@ -478,7 +481,7 @@ Achieving this is more complicated. Research by a team at Cornell Tech, includin ## Bridging -We have already covered how users interact with L2 contracts - they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2 - how an L1 contract calls an L2 contract, and vice versa. +We have already covered how users interact with L2 contracts - they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2—specifically how an L1 contract calls an L2 contract, and vice versa. The L1 and L2 chains operate asynchronously, so it is not possible to make a cross-chain call that produces a result within the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was submitted successfully for later execution). @@ -498,9 +501,9 @@ When saving a transaction for retry, Nitro records the sender's address, destina If the redemption is successful, the transaction completes, a receipt is issued, and the `ticketID` is canceled and can't be used again. If the redemption fails, for example, because the packaged transaction fails, the redemption reports failure, and the `ticketID` remains available for redemption. -Normally, the original submitter will attempt to ensure their transaction succeeds immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only require a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop, which others can redeem later. +Normally, the original submitter will attempt to ensure their transaction succeeds immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only requires a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop, which others can redeem later. -Submitting a transaction in this way carries a price in'ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. +Submitting a transaction in this way carries a price in 'ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. When the ticket is redeemed, the pre-packaged transaction runs with the sender and origin equal to the original submitted values, and with the destination, callvalue, and calldata provided by the submitter at the time of submission. @@ -522,6 +525,8 @@ These L2-to-L1 tickets have an unlimited lifetime, until they're successfully re For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) deep dive. +::: + ## Gas and Fees NitroGas (so-called to avoid confusion with Layer 1 Ethereum gas) is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. From 6137df250040ea17e49056983b50200851d0e90d Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 18 Sep 2025 15:03:57 -0500 Subject: [PATCH 46/75] Minor styling --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 7ee64e099c..5e1f3e52ca 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -529,7 +529,7 @@ For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works ## Gas and Fees -NitroGas (so-called to avoid confusion with Layer 1 Ethereum gas) is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. +Gas is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. ## The Speed Limit @@ -558,7 +558,7 @@ The algorithm compares gas usage against a parameter called the "speed limit," w Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage, as usage exceeds the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit, allowing for the accommodation of more gas usage. -To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a' and `b`are suitably chosen constants:`a' controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. +To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a` and `b` are suitably chosen constants: `a` controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. ### L1 calldata fees @@ -593,13 +593,13 @@ A Keyset contains: - the number of Committee signatures required Keysets are identifiable by their hashes. -An L1 KeysetManager contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the KeysetManager contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This emission allows the contents to be recovered later by anyone, provided only the Keyset hash is known. +An L1 `KeysetManager` contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the `KeysetManager` contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This emission allows the contents to be recovered later by anyone, provided only the Keyset hash is known. Although the API does not limit the number of Keysets that can be valid at the same time, normally, only one Keyset will be valid. ### Data Availability Certificates -A central concept in AnyTrust is the Data Availability Certificate (hereinafter referred to as a "DACert"). A DACert contains: +A central concept in AnyTrust is the Data Availability Certificate (hereafter referred to as a "DACert"). A DACert contains: - The hash of a data block, and - An expiration, and From 6c2c5ee78ab649955cfd8de2af8ffc8d528d7441 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 19 Sep 2025 13:20:00 -0500 Subject: [PATCH 47/75] Styling --- .../01-inside-arbitrum-nitro.mdx | 155 +++++++++--------- 1 file changed, 81 insertions(+), 74 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 5e1f3e52ca..5ac5071109 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,7 +9,7 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -This document provides a comprehensive explanation of Arbitrum Nitro's design and the rationale behind it. This document isn't API documentation, nor is it a guided tour of the code - look elsewhere for those. "Inside Arbitrum Nitro" is for individuals who want to gain a deeper understanding of Nitro's design. +This document provides a comprehensive explanation of Arbitrum Nitro's design and the rationale behind it. This document isn't API documentation, nor is it a guided tour of the code—look elsewhere for those. "Inside Arbitrum Nitro" is for individuals who want to gain a deeper understanding of Nitro's design. The body of this document will describe Arbitrum Rollup, the primary use case of the Nitro technology, used on the Arbitrum One chain. There is a variant use case, called AnyTrust, deployed on the Arbitrum Nova chain. AnyTrust is a configuration that introduces mild trust assumptions and utilizes alternative data availability (Alt-DA), as discussed in a section at the end of this document. @@ -26,12 +26,12 @@ Some other Layer 2 systems offer some of these features, but to our knowledge, n Nitro is a major upgrade to Arbitrum, improving over "classic" Arbitrum in several ways: -- **Advanced Calldata Compression**, which further drives down transaction costs on Arbitrum by reducing the amount of data posted to L1. -- **Separate Contexts for Common Execution and Fault Proving**, increasing the performance of L1 nodes, and thus offering lower fees. -- **Ethereum L1 Gas Compatibility**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. -- **Additional L1 Interoperability**, including tighter synchronization with L1 block numbers, and full support for all Ethereum L1 precompiles. +- **Advanced calldata compression**, which further drives down transaction costs on Arbitrum by reducing the amount of data posted to L1. +- **Separate contexts for common execution and fault proving**, increasing the performance of L1 nodes, and thus offering lower fees. +- **Ethereum L1 gas compatibility**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. +- **Additional L1 interoperability**, including tighter synchronization with L1 block numbers, and full support for all Ethereum L1 precompiles. - **Safe retryables**, eliminating the failure mode where a retryable ticket fails to get created. -- **Geth Tracing**, for even broader debugging support. +- **Geth tracing**, for even broader debugging support. - Any many, many more changes. ## The big picture @@ -62,10 +62,10 @@ All of the technical details in this document connect to this diagram (shown abo The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a summary of each, and then we'll unpack them in more detail in later sections. -- **Sequencing, Followed by Deterministic Execution**: Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). -- **Geth at the Core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatibility with Ethereum. -- **Separate Execution from Proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. -- **Optimistic Rollup with Interactive Fraud Proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an optimistic rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. +- **Sequencing, followed by deterministic execution**: Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). +- **Geth at the core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatibility with Ethereum. +- **Separate execution from proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. +- **Optimistic Rollup with interactive fraud proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an Optimistic Rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. ## Sequencing, followed by deterministic execution @@ -77,17 +77,17 @@ Let's follow a user's transaction through this process. First, the user creates a transaction, uses their wallet to sign it, and sends it to the Nitro chain's Sequencer. The Sequencer's job, as its name implies, is to take the arriving transactions, put them into an ordered sequence, and publish that sequence. -Once the transactions are sequenced, they go to the _State Transition Function (STF)_ for processing, one by one, in order. The STF takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. +Once the transactions are sequenced, they go to the State Transition Function (STF) for processing, one by one, in order. The STF takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the STF will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions, so the STF never sees them—and this reduces cost and therefore keeps transaction fees low—but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) -The state transition function is deterministic, meaning its behavior depends only on the current state and the contents of the next transaction, and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. +The State Transition Function is deterministic, meaning its behavior depends only on the current state and the contents of the next transaction, and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. Anyone who knows the transaction sequence can compute the STF independently, and all honest parties who do so are guaranteed to obtain identical results. Nitro nodes normally operate as follows: retrieve the transaction sequence and execute the State Transition Function locally. There is no requirement for a consensus mechanism. :::info More information -For additional reading on STF inputs, see the [STF Inputs deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). +For additional reading on STF inputs, see the [STF Inputs deep dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). ::: @@ -105,7 +105,7 @@ The Sequencer compresses its batches using the Brotli algorithm at its highest c :::info More information -To learn more about the Sequencer in depth, take a look at the [Sequencer Deep Dive](/how-arbitrum-works/deep-dives/sequencer.mdx) +To learn more about the Sequencer in-depth, take a look at the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx) ::: @@ -117,8 +117,8 @@ The second key design idea in Nitro is "Geth at the Core." Here, "Geth" refers t You can think of the software that comprises a Nitro node as being organized into three primary layers (shown above): -- The base layer is the core of Geth - the parts of Geth that emulate the execution of EVM contracts and maintain the data structures that make up the Ethereum state. Nitro compiles in this code as a library, with a few minor modifications to add necessary hooks. -- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decomopressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll delve into the details of ArbOS below. +- The base layer is the core of Geth—the parts of Geth that emulate the execution of EVM contracts and maintain the data structures that make up the Ethereum state. Nitro compiles in this code as a library, with a few minor modifications to add necessary hooks. +- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decompressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll delve into the details of ArbOS below. - The top layer consists of node software, mostly drawn from Geth. This layer handles connections, incoming RPC requests from clients, and provides the other top-level functionality required to operate an Ethereum-compatible blockchain node. Because the top and bottom layers rely heavily on code from Geth, this structure has been dubbed a "Geth sandwich." Strictly speaking, Geth plays the role of the bread in the sandwich, and ArbOS is the filling, but this sandwich receives its name from the bread. @@ -127,7 +127,7 @@ The State Transition Function consists of the bottom Geth layer and a portion of :::info More information -For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works/deep-dives/geth.mdx) +For more information about Geth, refer to the [Geth deep dive](/how-arbitrum-works/deep-dives/geth.mdx) ::: @@ -135,23 +135,25 @@ For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary execution and being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, but compiling it to different targets for the two cases. -The Go compiler compiles the Nitro node software for _execution_, producing native code for the target architecture, which, of course, differs for each node deployment. (The node software distribution is in source code form, and as a Docker image containing a compiled binary.) +The Go compiler compiles the Nitro node software for **execution**, producing native code for the target architecture, which, of course, differs for each node deployment. (The node software distribution is in source code form, and as a Docker image containing a compiled binary.) -Separately, for _proving_, the portion of the code that is the State Transition Function is compiled by the Go compiler to WebAssembly (WASM), a typed and portable machine code format. The WASM code then undergoes a simple transformation into a format we call WAVM, which is described in detail below. If there is a dispute about the correct result of computing the STF, achieving a resolution comes from referencing the WAVM code. +Separately, for **proving**, the portion of the code that is the State Transition Function is compiled by the Go compiler to WebAssembly (WASM), a typed and portable machine code format. The WASM code then undergoes a simple transformation into a format we call WAVM, which is described in detail below. If there is a dispute about the correct result of computing the STF, achieving a resolution comes from referencing the WAVM code. ### WAVM -The WASM format has many features that make it a good vehicle for fraud proofs - it is portable, structured, well-specified, and has reasonably good tools and support - but it requires a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. +The WASM format has many features that make it a good vehicle for fraud proofs—it is portable, structured, well-specified, and has reasonably good tools and support—but it requires a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. -WAVM differs from WASM in three main ways. First, WAVM removes certain features of WASM that are not generated by the Go compiler; the transformation phase ensures that these features are not present. +WAVM differs from WASM in three main ways: + +First, WAVM removes certain features of WASM that are not generated by the Go compiler; the transformation phase ensures that these features are not present. Second, WAVM restricts a few features of WASM. For example, WAVM does not contain floating-point instructions, so the transformer replaces floating-point instructions with calls to the Berkeley SoftFloat library. (We use software floating-point to reduce the risk of floating-point incompatibilities between architectures. The core Nitro functions never use floating-point, but the Go runtime does use some floating-point operations.) WAVM does not contain nested control flow, so the transformer flattens control flow constructs by turning control flow instructions into jumps. Some WASM instructions take a variable amount of time to execute, which we avoid in WAVM by transforming them into constructs using fixed cost instructions. These transformations simplify proving. Third, WAVM introduces a few additional opcodes to facilitate interaction with the blockchain environment. For example, new instructions enable the WAVM code to read and write the chain's global state, retrieve the next message from the chain's inbox, or signal a successful completion of executing the State Transition Function. -### `ReadPreImage` and the Hash Oracle Trick +### `ReadPreImage` and the hash oracle trick -The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zero if `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. +The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offset `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zero if `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. (In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest party, assuming that the full history of the L1 Ethereum chain is available. For convenience, providing a hash preimage by a third party, such as a public server, and the correctness of the supplied value is easily verified.) @@ -159,27 +161,27 @@ As an example, maintaining the state of a Nitro chain mimics Ethereum's state tr The only other use of `ReadPreImage` is to fetch the contents of recent L2 block headers, given the header hash. This method is safe because the block headers are publicly known and have a bounded size. -The "Hash Oracle Trick" of storing the Merkle hash of a data structure and relying on protocol participants to store the full structure, thereby supporting fetch-by-hash of the contents, dates back to the original Arbitrum design. +The "hash oracle trick" of storing the Merkle hash of a data structure and relying on protocol participants to store the full structure, thereby supporting fetch-by-hash of the contents, dates back to the original Arbitrum design. ## Optimistic Rollup -Arbitrum is an optimistic rollup. Let's unpack that term. +Arbitrum is an Optimistic Rollup. Let's unpack that term. -_Rollup_ +#### Rollup -Arbitrum is a rollup, which means that the inputs to the chain—the messages that go into the inbox—are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they need to determine the current correct state of the chain. They have the full history of the inbox, and the inbox history uniquely determines the results, allowing them to reconstruct the state of the chain based only on public information, if needed. +Arbitrum is a Rollup, which means that the inputs to the chain—the messages that go into the inbox—are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they need to determine the current correct state of the chain. They have the full history of the inbox, and the inbox history uniquely determines the results, allowing them to reconstruct the state of the chain based only on public information, if needed. This posting of calldata enables anyone to be a full participant in the Arbitrum protocol, allowing them to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. -_Optimistic_ +#### Optimistic -Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved.) +Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block (assertion) on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved.) Because a party that tries to cheat will lose a deposit, attempts to cheat should be very rare. The normal case will be a single party posting a correct rollup block, with nobody challenging it. ### Resolving disputes using interactive fraud proofs -Among optimistic rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a particular result, and Bob disagrees. How will the protocol decide which version to accept? +Among Optimistic Rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a particular result, and Bob disagrees. How will the protocol decide which version to accept? There are basically two options: interactive proving or re-executing transactions. Arbitrum uses interactive proving, which we believe is more efficient and more flexible. Much of Arbitrum's design follows from this fact. @@ -206,31 +208,36 @@ We strongly believe that interactive proving is the superior approach for the fo ### Interactive proving drives the design of Arbitrum -Much of Arbitrum's design is driven by the opportunities opened up by interactive proving. Suppose you're reading about a feature of Arbitrum and wondering why it exists. In that case, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why questions" about Arbitrum relate to interactive proving. +Much of Arbitrum's design is driven by the opportunities opened up by interactive proving. Suppose you're reading about a feature of Arbitrum and wondering why it exists. In that case, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why" questions about Arbitrum relate to interactive proving. + +## Arbitrum Rollup protocol + +Before diving into the Rollup protocol, there are two things we need to cover: -## Arbitrum Rollup Protocol +#### 1. If you're an Arbitrum user or developer, you don't need to understand the Rollup protocol. -Before diving into the rollup protocol, there are two things we need to cover. +You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working. -First, _if you're an Arbitrum user or developer, you don't need to understand the rollup protocol_. You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working. Still, you don't spend your time monitoring it or studying its inner workings. +Still, you don't spend your time monitoring it or studying its inner workings. +You're welcome to study, observe, and even participate in the Rollup protocol, but it's not required, and most people won't. So if you're a typical train passenger who wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! -You're welcome to study, observe, and even participate in the rollup protocol, but it's not required, and most people won't. So if you're a typical train passenger who wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! +#### 2. The protocol doesn't decide the results of transactions, it only confirms the results. -The second thing to understand about the rollup protocol is that _the protocol doesn't decide the results of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is complete. The role of the rollup protocol is to confirm transaction results that, from the perspective of Arbitrum users, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) +The results are uniquely determined by the sequence of messages in the chain's inbox. Once your transaction message is in the chain's inbox, its result is knowable—and Arbitrum nodes will report that your transaction is complete. The role of the Rollup protocol is to confirm transaction results that, from the perspective of Arbitrum users, have already occurred. (This is why Arbitrum users can effectively ignore the Rollup protocol.) -You might wonder why we need the rollup protocol. If everyone already knows the results of transactions, why bother confirming them? The rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The primary purpose of a Layer 2 scaling system is to process transactions without requiring Ethereum to handle all the work. Indeed, Arbitrum can execute transactions at a speed that Ethereum cannot match, while monitoring every transaction on Arbitrum. However, once a result is confirmed, Ethereum is aware of it and can rely on it, enabling operations on Ethereum, such as processing withdrawals of funds from Nitro back to L1. +You might wonder why we need the Rollup protocol. If everyone already knows the results of transactions, why bother confirming them? The Rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The primary purpose of a Layer 2 scaling system is to process transactions without requiring Ethereum to handle all the work. Indeed, Arbitrum can execute transactions at a speed that Ethereum cannot match, while monitoring every transaction on Arbitrum. However, once a result is confirmed, Ethereum is aware of it and can rely on it, enabling operations on Ethereum, such as processing withdrawals of funds from Nitro back to L1. -With those preliminaries behind us, let's jump into the details of the rollup protocol. +With those preliminaries behind us, let's jump into the details of the Rollup protocol. -Some parties that participate in the protocol are _validators_. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any onchain actions, can be run permissionlessly (see "validators" below). +Some parties that participate in the protocol are **validators**. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see [State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization)). "Watchtower validators," who monitor the chain but don't take any onchain actions, can be run permissionlessly (see [Validators](#validators) below). -The key security property of the rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. +The key security property of the Rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. -## The Rollup Chain +## The Rollup chain -The rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. +The Rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum Rollup protocol manages and oversees. -Validators can propose assertions. New assertions will be _unresolved_ at first. Eventually, every assertion will be _resolved_, either by being _confirmed_ or _rejected_. The confirmed assertions make up the confirmed history of the chain. +Validators can propose assertions. New assertions will be **unresolved** at first. Eventually, every assertion will be **resolved**, either by being **confirmed** or **rejected**. The confirmed assertions make up the confirmed history of the chain. Each assertion contains: @@ -248,7 +255,7 @@ An assertion also implicitly claims that its older siblings (older assertions wi The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's bonder. (More on [challenges](#challenges) below.) -In the normal case, the rollup chain will look like this: +In the normal case, the Rollup chain will look like this: @@ -299,7 +306,7 @@ Notice that once you have a bond on an assertion, there is no way to unbond. You One detail we deferred earlier is determining the current minimum bond amount. Typically, this is just equal to the base bond amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming assertions, the bond requirement will escalate temporarily. Specifically, the base bond amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved assertion passed. This bond amount ensures that if malicious parties place false bonds to try to delay progress (despite losing those bonds), the bond requirement increases. Consequently, the cost of such a delay attack increases exponentially. As assertion resolution starts advancing again, the bond requirement will decrease. -### Rules for Confirming or Rejecting assertions +### Rules for confirming or rejecting assertions The rules for resolving assertions are fairly simple. The first unresolved assertion can be confirmed if: @@ -321,7 +328,7 @@ A consequence of these rules is that once the first unresolved assertion's deadl ### Challenges -Suppose the rollup chain looks like this: +Suppose the Rollup chain looks like this: @@ -329,7 +336,7 @@ Assertions 93 and 95 are siblings (they both have 92 as a predecessor). Alice ha At this point, we know that Alice and Bob disagree about the correctness of assertion 93, with Alice committed to 93 being correct and Bob committed to 93 being incorrect. (Bob has a bond on 95, and 95 implicitly claims that 92 is the last correct assertion before it, which implies that 93 must be incorrect.) -Whenever two bonders have bonds on sibling assertions, and neither of those bonders is already in a challenge, anyone can start a challenge between the two. The rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's bond. The loser will also no longer be bound to their assertion. +Whenever two bonders have bonds on sibling assertions, and neither of those bonders is already in a challenge, anyone can start a challenge between the two. The Rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's bond. The loser will also no longer be bound to their assertion. The challenge is a game in which Alice and Bob alternate moves, with an Ethereum contract as the referee. Alice, the defender, moves first. @@ -339,11 +346,11 @@ We'll describe the dissection part of the protocol twice. First, we'll give a si :::info More information -For further reading on Assertions and how to create them, refer to the [Assertion Deep-dive](/how-arbitrum-works/deep-dives/assertions.mdx). +For further reading on Assertions and how to create them, refer to the [Assertion deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). ::: -### Dissection Protocol: Simplified Version +### Dissection protocol: Simplified version Alice is defending the claim that starting with the state in the predecessor assertion, the state of the Virtual Machine can advance to the state specified in assertion `A`. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that the execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. @@ -353,7 +360,7 @@ Now Alice has effectively bisected her `N`-step assertion into two `N/2`-step as At this point, we're effectively back in the original situation: Alice having asserted that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds, Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must provide a one-step proof, which the EthBridge will verify. -### Why Dissection Correctly Identifies a Cheater +### Why dissection correctly identifies a cheater Before discussing the complexities of the real challenge protocol, let's pause to understand why the simplified version of the protocol is correct. Here, correctness means two things: @@ -366,15 +373,15 @@ To prove (2), observe that if Alice's initial claim is incorrect, this can only (If you're a stickler for mathematical precision, it should be clear how these arguments can be turned into proofs by induction on `N`.) -### The Real Dissection Protocol +### The real dissection protocol The real dissection protocol is conceptually similar to the simplified one described above, but with several modifications that enhance efficiency or address necessary corner cases. Here is a list of the differences. - **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an assertion, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute shifts to a dispute about a single execution of the State Transition Function, or in other words, about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). - **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This division requires posting `K-1` intermediate claims at points evenly spaced through the claimed execution, which reduces the number of rounds by a factor of log(`K`)/log(`2`). - **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This segmentation reduces the number of moves in the game by an additional factor of `2`, because the size is cut by a factor of `K` for every move, rather than for every two moves. -- **Deal With The Empty-Inbox Case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might halt, or it might have to wait because its inbox is exhausted, so it cannot proceed until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (except the initial claim) to claim a special end state, which means that the specified amount of execution is not possible under the current conditions. -- **Time Limits**: Each player has a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Consider the time allowance to be approximately one week. +- **Deal with the empty-inbox case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might halt, or it might have to wait because its inbox is exhausted, so it cannot proceed until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (except the initial claim) to claim a special end state, which means that the specified amount of execution is not possible under the current conditions. +- **Time limits**: Each player has a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Consider the time allowance to be approximately one week. These changes don't affect the basic correctness of the challenge protocol. They do, however, improve its efficiency and enable it to handle all the cases that can arise in practice. @@ -386,21 +393,21 @@ The only point where the protocol needs to evaluate a move "on the merits" is at ## Validators -Some Arbitrum nodes will choose to act as _validators_, meaning they monitor the progress of the rollup protocol and participate in it to advance the state of the chain securely. +Some Arbitrum nodes will choose to act as **validators**, meaning they monitor the progress of the Rollup protocol and participate in it to advance the state of the chain securely. -Not all nodes will choose to do this. Because the rollup protocol doesn't dictate what the chain will do but merely confirms the correct behavior, determined by the inbox messages, a node can ignore the rollup protocol and compute the correct behavior itself. For more on what such nodes might do, see the Full Nodes section. +Not all nodes will choose to do this. Because the Rollup protocol doesn't dictate what the chain will do but merely confirms the correct behavior, determined by the inbox messages, a node can ignore the Rollup protocol and compute the correct behavior itself. For more on what such nodes might do, see the [Full Nodes](#full-nodes) section. Offchain Labs provides open source validator software, including a pre-built Docker image. Every validator can choose which strategy to employ, but we expect validators to follow three common strategies: -- The _active validator_ strategy tries to advance the state of the chain by proposing new assertions. An active validator is always bonded, because creating an assertion requires being bonded. A chain only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. -- The _defensive validator_ strategy watches the rollup protocol operate. If only correct assertions get proposed, this strategy doesn't bond. However, if an incorrect assertion is proposed, this strategy intervenes by posting a correct assertion or bonding to a correct assertion that another party has already posted. This strategy avoids bonding when things are going well, but if someone is dishonest, it bonds to defend the correct outcome. -- The _watchtower validator_ strategy never bonds. It simply monitors the rollup protocol and, if an incorrect assertion is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to bond will be willing to intervene to take some of the dishonest proposer's bond, and that that can happen before the dishonest assertion's deadline expires. (In practice, this will allow several days for a response.) +- The **active validator** strategy tries to advance the state of the chain by proposing new assertions. An active validator is always bonded, because creating an assertion requires being bonded. A chain only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. +- The **defensive validator** strategy watches the Rollup protocol operate. If only correct assertions get proposed, this strategy doesn't bond. However, if an incorrect assertion is proposed, this strategy intervenes by posting a correct assertion or bonding to a correct assertion that another party has already posted. This strategy avoids bonding when things are going well, but if someone is dishonest, it bonds to defend the correct outcome. +- The **watchtower validator** strategy never bonds. It simply monitors the Rollup protocol and, if an incorrect assertion is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to bond will be willing to intervene to take some of the dishonest proposer's bond, and that that can happen before the dishonest assertion's deadline expires. (In practice, this will allow several days for a response.) Under normal conditions, validators using the defensive and watchtower strategies won't do anything except observe. A malicious actor considering whether to cheat won't be able to determine how many defensive and watchtower validators are operating incognito. Some defensive validators may announce themselves, but others won't, so a would-be attacker will always have to worry that defenders are waiting to emerge. -The underlying protocol supports permissionless validation, meaning that anyone can participate. Currently, on Arbitrum One, validators that require a bond (i.e., active and defensive validators) are allowlisted; see the State of Progressive Decentralization. +The underlying protocol supports permissionless validation, meaning that anyone can participate. Currently, on Arbitrum One, validators that require a bond (i.e., active and defensive validators) are allowlisted; see the [State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization). Who will be validators? Anyone can do it, but most people will choose not to. In practice, we expect people to validate a chain for several reasons. @@ -424,15 +431,15 @@ Supporting these functions in Layer 2 trusted software, rather than building the ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available for Arbitrum chains. -## Full Nodes +## Full nodes As the name suggests, full nodes in Arbitrum play the same role as full nodes in Ethereum: they maintain the state of the chain and provide an API that others can use to interact with the chain. -Arbitrum full nodes normally "live at Layer 2," which means that they don't worry about the rollup protocol but treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. +Arbitrum full nodes normally "live at Layer 2," which means that they don't worry about the Rollup protocol but treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. ## The Sequencer -The Sequencer is a specially designated full node, which has limited power to control the ordering of transactions. This ordering allows the Sequencer to guarantee the results of user transactions immediately, without requiring any wait for events on Ethereum. So, there's no need to wait five minutes or so for block confirmations - and no need to wait even 15 seconds for Ethereum to make a block. +The Sequencer is a specially designated full node, which has limited power to control the ordering of transactions. This ordering allows the Sequencer to guarantee the results of user transactions immediately, without requiring any wait for events on Ethereum. So, there's no need to wait five minutes or so for block confirmations—and no need to wait even 15 seconds for Ethereum to make a block. Clients interact with the Sequencer in the same way they would with any full node, for example, by providing their wallet software with a network URL that happens to point to the Sequencer. @@ -469,7 +476,7 @@ A Sequencer is generally a win if the Sequencer is well-behaved. A malicious Sequencer, on the other hand, could cause some pain. If it refuses to handle your transactions, you must go through the delayed inbox, which has a longer delay. A malicious Sequencer has the power to front-run everyone's transactions so that it could profit greatly at users' expense. -On Arbitrum One, Offchain Labs currently operates a well-behaved Sequencer - we promise! This Sequencer will be useful, but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. +On Arbitrum One, Offchain Labs currently operates a well-behaved Sequencer—we promise! This Sequencer will be useful, but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. Since a trusted party will initially run the Sequencer and it will be decentralized later, we haven't built a mechanism to punish a misbehaving Sequencer directly. We're asking users to trust the centralized Sequencer initially, until we transition to decentralized fair sequencing later. @@ -481,7 +488,7 @@ Achieving this is more complicated. Research by a team at Cornell Tech, includin ## Bridging -We have already covered how users interact with L2 contracts - they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2—specifically how an L1 contract calls an L2 contract, and vice versa. +We have already covered how users interact with L2 contracts—they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2—specifically how an L1 contract calls an L2 contract, and vice versa. The L1 and L2 chains operate asynchronously, so it is not possible to make a cross-chain call that produces a result within the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was submitted successfully for later execution). @@ -503,7 +510,7 @@ If the redemption is successful, the transaction completes, a receipt is issued, Normally, the original submitter will attempt to ensure their transaction succeeds immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only requires a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop, which others can redeem later. -Submitting a transaction in this way carries a price in 'ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. +Submitting a transaction in this way carries a price in `ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. When the ticket is redeemed, the pre-packaged transaction runs with the sender and origin equal to the original submitted values, and with the destination, callvalue, and calldata provided by the submitter at the time of submission. @@ -527,15 +534,15 @@ For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works ::: -## Gas and Fees +## Gas and fees Gas is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. -## The Speed Limit +## The Speed limit The security of Nitro chains relies on the assumption that when one validator creates an assertion, other validators will verify it and respond with a correct assertion and a challenge if it is incorrect. This assumption requires that the other validators have the time and resources to check each assertion quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for assertions. -This security feature sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will go further into the future. Due to the limit imposed by the rollup protocol contracts on how far into the future a deadline can be, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. +This security feature sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will go further into the future. Due to the limit imposed by the Rollup protocol contracts on how far into the future a deadline can be, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. Being able to set the speed limit accurately depends on being able to estimate the time required to validate an assertion, with some accuracy. Any uncertainty in estimating validation time will force us to set the speed limit lower to ensure safety. We do not want to lower the speed limit, so we aim to enable accurate estimation of the speed limit. @@ -578,9 +585,9 @@ The total fee charged for a transaction is the L2 base fee multiplied by the sum AnyTrust is a variant of Arbitrum Nitro technology that lowers costs by accepting a mild trust assumption. -The Arbitrum protocol requires that all Arbitrum nodes, including validators, have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of the cost in Arbitrum. +The Arbitrum protocol requires that all Arbitrum nodes, including validators, have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum Rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of the cost in Arbitrum. -AnyTrust relies instead on an external Data Availability Committee (hereinafter referred to as "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This assumption means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be available so that the rollup protocol can function correctly. +AnyTrust relies instead on an external Data Availability Committee (hereinafter referred to as "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This assumption means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be available so that the Rollup protocol can function correctly. ### Keysets @@ -612,7 +619,7 @@ Because of the `2-of-N` trust assumption, a DACert constitutes proof that the bl AnyTrust provides the Sequencer with two options for posting a data block on L1: it can post the full data as described above, or it can post a DACert proving the availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity get checked by L2 code. -In ordinary (non-AnyTrust) Nitro, the Arbitrum sequencer posts data blocks on the L1 chains as calldata. The L1 inbox contract commits the hashes of the data blocks, making the data reliably readable to L2 code. +In ordinary (non-AnyTrust) Nitro, the Arbitrum Sequencer posts data blocks on the L1 chains as calldata. The L1 inbox contract commits the hashes of the data blocks, making the data reliably readable to L2 code. The L2 code that reads data from the inbox reads a full data block, just like in ordinary Nitro. If it sees a DACert instead, it checks the validity of the DACert, regarding the Keyset specified by the DACert (which is known to be valid because the L1 inbox verified that). The L2 code verifies that: @@ -632,9 +639,9 @@ Committee members run the Data Availability Server (DAS) software. The DAS expos The DAS software, based on configuration options, can store its data in local files, a Badger database, Amazon S3, or redundantly across multiple backing stores. The software also supports optional caching in memory (using Bigcache) or in a Redis instance. -### Sequencer-Committee Interaction +### Sequencer-Committee interaction -When the Arbitrum sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (usually three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then, the member signs the (hash, expiration time) pair using its BLS key and returns the signature along with a success indicator to the Sequencer. +When the Arbitrum Sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (usually three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then, the member signs the (hash, expiration time) pair using its BLS key and returns the signature along with a success indicator to the Sequencer. Once the Sequencer has collected enough signatures, it can aggregate the signatures and create a valid DACert for the (hash, expiration time) pair. The Sequencer then posts that DACert to the L1 inbox contract, making it available to the AnyTrust chain software at L2. @@ -642,6 +649,6 @@ If the Sequencer fails to collect enough signatures within a few minutes, it wil :::info More information -For a deep dive into AnyTrust, refer to the [AnyTrust Deep Dive](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). +For more information about AnyTrust, refer to the [AnyTrust deep dive](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). ::: From 5374281354d5be7bdda05bcb182f7e2576567158 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 19 Sep 2025 13:29:18 -0500 Subject: [PATCH 48/75] Styling --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 5ac5071109..55f925bc2f 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -524,7 +524,7 @@ For a deeper look into L1-to-L2 Messaging, read more in the [deep dive](/how-arb ### L2 to L1 ticket-based calls -Calls from L2 and L1 operate similarly, utilizing a ticket-based system. An L2 contract can call a method of the precompiled ArbSys contract to send a transaction to L1. When the execution of the L2 transaction containing the submission receives confirmation on L1 (potentially some days later), a ticket gets created in the L1 outbox contract. The ticket is triggerable by anyone who calls an L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. +Calls from L2 and L1 operate similarly, utilizing a ticket-based system. An L2 contract can call a method of the precompiled [`ArbSys`](/build-decentralized-apps/precompiles/02-references.mdx#arbsys) contract to send a transaction to L1. When the execution of the L2 transaction containing the submission receives confirmation on L1 (potentially some days later), a ticket gets created in the L1 outbox contract. The ticket is triggerable by anyone who calls an L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. These L2-to-L1 tickets have an unlimited lifetime, until they're successfully redeemed. No rent is required, as a record of the ticket (actually a Merkle hash of the tickets) gets stored on Ethereum storage, which does not require rent. (L2 transaction fees cover the cost of allocating storage for the ticket Merkle roots.) @@ -559,7 +559,7 @@ Two types of resources can incur fees during a transaction: L2 gas fees work very similarly to gas on Ethereum. A transaction consumes a certain amount of gas, which gets multiplied by the current base fee to determine the L2 gas fee for the transaction.. -A version of the "exponential mechanism" sets the L2 base fee, which has been widely discussed in the Ethereum community and shown to be equivalent to Ethereum's EIP-1559 gas pricing mechanism. +A version of the "exponential mechanism" sets the L2 base fee, which has been widely discussed in the Ethereum community and shown to be equivalent to [Ethereum's EIP-1559 gas pricing mechanism](https://eips.ethereum.org/EIPS/eip-1559). The algorithm compares gas usage against a parameter called the "speed limit," which is the target amount of gas per second that the chain can handle sustainably over time. (Currently, the speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, that gas gets added to the backlog. Whenever the clock ticks one second, the speed limit gets subtracted from the backlog; however, the backlog can never go below zero. @@ -573,7 +573,9 @@ L1 calldata fees exist because the Sequencer, or the batch poster, which posts t Every transaction that comes in through the Sequencer will pay an L1 calldata fee. Transactions that come in through the delayed inbox do not incur this fee because they don't contribute to batch posting costs. However, these transactions do pay gas fees to Ethereum when added to the delayed inbox. -The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of the number of bytes the transaction will add to the compressed batch it is in; the formula for this calculation includes an estimate of how compressible the transaction is. Second, it multiplies the computed size estimate by the current price per estimated byte to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 base fee to translate the fee into L2 gas units. The result gets reported as the "poster fee" for the transaction. +The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of the number of bytes the transaction will add to the compressed batch it is in; the formula for this calculation includes an estimate of how compressible the transaction is. + +Second, it multiplies the computed size estimate by the current price per estimated byte to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 base fee to translate the fee into L2 gas units. The result gets reported as the "poster fee" for the transaction. The dynamic algorithm determines the price per estimated byte by comparing the total L1 calldata fees collected to the total fees paid by batch posters. It aims to align these two amounts as closely as possible. If batch posters pay less than the collected fees, the algorithm will adjust the price accordingly. Conversely, if their costs exceed the collected fees, it will result in a decrease in the price. From 0fc2ed658671124bb442d194d9735c4b543fedd6 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 19 Sep 2025 13:53:07 -0500 Subject: [PATCH 49/75] fixing broken links --- docs/build-decentralized-apps/precompiles/02-reference.mdx | 2 +- .../common-configurations/bold-adoption-for-arbitrum-chains.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build-decentralized-apps/precompiles/02-reference.mdx b/docs/build-decentralized-apps/precompiles/02-reference.mdx index 596080e7b9..ef399241b6 100644 --- a/docs/build-decentralized-apps/precompiles/02-reference.mdx +++ b/docs/build-decentralized-apps/precompiles/02-reference.mdx @@ -148,7 +148,7 @@ import ArbOwnerPublicRef from '../../for-devs/dev-tools-and-resources/partials/p ### `ArbRetryableTx` -ArbRetryableTx ([Interface](https://github.com/OffchainLabs/@@nitroPrecompilesRepositorySlug=nitro-precompile-interfaces@@/blob/@@nitroPrecompilesCommit=f9f65d7c77adf61ad16504a3738a9edcc31e2b2f@@/ArbRetryableTx.sol) | [Implementation](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.7.2@@/@@nitroPathToPrecompiles=precompiles@@/ArbRetryableTx.go)) provides methods for managing retryables. The model has been adjusted for Nitro, most notably in terms of how retry transactions are scheduled. For more information on retryables, please see [the retryable documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets). +ArbRetryableTx ([Interface](https://github.com/OffchainLabs/@@nitroPrecompilesRepositorySlug=nitro-precompile-interfaces@@/blob/@@nitroPrecompilesCommit=f9f65d7c77adf61ad16504a3738a9edcc31e2b2f@@/ArbRetryableTx.sol) | [Implementation](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.7.2@@/@@nitroPathToPrecompiles=precompiles@@/ArbRetryableTx.go)) provides methods for managing retryables. The model has been adjusted for Nitro, most notably in terms of how retry transactions are scheduled. For more information on retryables, please see [the retryable documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets). Precompile address: `0x000000000000000000000000000000000000006E` diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx index 2e6302d8f0..38e80b0192 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx @@ -115,7 +115,7 @@ As mentioned earlier, the upgrade to the dispute protocol involves both a Nitro To read more about Arbitrum BoLD, please refer to the [Gentle Introduction for BoLD](../../../how-arbitrum-works/bold/gentle-introduction.mdx). :::caution -As mentioned in our guide on [BoLD adoption for Arbitrum chains](/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx), the recommendation is to keep Arbitrum chains validation permissioned by having `disableValidatorWhitelist` be `false` (which is the default) and by having a list of validators on the allowlist via the `validators[]` array. Furthermore, we recommend keeping the [Censorship Timeout](../../../how-arbitrum-works/03-sequencer.mdx#censorship-timeout) feature disabled. +As mentioned in our guide on [BoLD adoption for Arbitrum chains](/launch-arbitrum-chain/02-configure-your-chain/common-configurations/bold-adoption-for-arbitrum-chains.mdx), the recommendation is to keep Arbitrum chains validation permissioned by having `disableValidatorWhitelist` be `false` (which is the default) and by having a list of validators on the allowlist via the `validators[]` array. Furthermore, we recommend keeping the [Censorship Timeout](../../../how-arbitrum-works/deep-dives/sequencer.mdx#censorship-timeout) feature disabled. ::: :::info This is not an ArbOS upgrade From 3c2952a12a140c6e11c37f60c38f8752ae7b9445 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Wed, 1 Oct 2025 14:57:02 -0700 Subject: [PATCH 50/75] updated inside Arbitrum with new upgrades --- .../01-inside-arbitrum-nitro.mdx | 102 +++++++++++++++++- 1 file changed, 98 insertions(+), 4 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index d5413afc32..a8c3b5b487 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -1,18 +1,29 @@ --- title: 'Inside Arbitrum Nitro' -description: 'Learn the fundamentals of the Arbitrum Nitro stack.' +description: 'Learn the fundamentals of the Arbitrum Nitro stack and its advanced features.' author: pete-vielhaber sme: edfelten -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. +user_story: As a current or prospective Arbitrum user, I need to learn more about Nitro's design and capabilities. content_type: get-started --- import ImageWithCaption from '@site/src/components/ImageCaptions/'; -This document provides a comprehensive explanation of Arbitrum Nitro's design and the rationale behind it. This document isn't API documentation, nor is it a guided tour of the code—look elsewhere for those. "Inside Arbitrum Nitro" is for individuals who want to gain a deeper understanding of Nitro's design. +Arbitrum is a scaling technology suite designed to enhance Ethereum by offering **cheaper, faster transactions** without sacrificing security. The core product, **Arbitrum Rollup**, is an **Optimistic Rollup protocol** that processes transactions off-chain and posts succinct proofs to Ethereum for verification. This approach allows users to interact with Web3 apps and deploy smart contracts just like on Ethereum but with significantly reduced fees and higher throughput. + +This document provides a **comprehensive, end-to-end walkthrough** of how Arbitrum works. It combines a **high-level overview** with a **step-by-step technical explanation**, following a transaction from the moment it's submitted all the way through **execution, proving, and bridging**. Each section corresponds to a core protocol component and collectively paints a full picture of how Arbitrum achieves **scalability with Ethereum-grade trustlessness**. The body of this document will describe Arbitrum Rollup, the primary use case of the Nitro technology, used on the Arbitrum One chain. There is a variant use case, called AnyTrust, deployed on the Arbitrum Nova chain. AnyTrust is a configuration that introduces mild trust assumptions and utilizes alternative data availability (Alt-DA), as discussed in a section at the end of this document. +## What's New in Arbitrum + +Arbitrum has evolved significantly with several major innovations: + +- **BoLD (Bounded Liquidity Delay)**: A new permissionless validation protocol that enables anyone to validate Arbitrum chains without permission, bringing Arbitrum closer to Stage 2 rollup status +- **Timeboost**: A novel transaction ordering policy that allows chain owners to capture MEV while protecting users from harmful MEV like sandwich attacks +- **Stylus**: WebAssembly-based smart contracts that enable high-performance contracts in Rust, C, and C++ alongside traditional EVM contracts +- **Enhanced Sequencer**: Improved batch posting with blob support and dynamic compression for better efficiency + ## Why use Arbitrum? Why use Nitro? Arbitrum is an L2 scaling solution for Ethereum, offering a unique combination of benefits: @@ -229,10 +240,30 @@ You might wonder why we need the Rollup protocol. If everyone already knows the With those preliminaries behind us, let's jump into the details of the Rollup protocol. -Some parties that participate in the protocol are **validators**. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see [State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization)). "Watchtower validators," who monitor the chain but don't take any onchain actions, can be run permissionlessly (see [Validators](#validators) below). +### BoLD: Permissionless Validation + +Arbitrum has evolved from a permissioned validation system to **BoLD (Bounded Liquidity Delay)**, a new permissionless validation protocol. This represents a major advancement in Arbitrum's decentralization journey. +Some parties that participate in the protocol are **validators**. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not +cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's +no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see +[State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization)). "Watchtower validators," who monitor the chain but don't take any onchain +actions, can be run permissionlessly (see [Validators](#validators) below). + +**Key improvements with BoLD:** + +- **Permissionless validation**: Anyone can validate Arbitrum chains without needing permission +- **Time-bounded disputes**: Disputes are guaranteed to resolve within a fixed timeframe (6.4 days) +- **Enhanced security**: Stronger guarantees for withdrawals and cross-chain messaging +- **Stage 2 rollup status**: Moves Arbitrum closer to being recognized as a fully decentralized rollup The key security property of the Rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. +:::info More information + +For detailed information about BoLD, see the [BoLD gentle introduction](/how-arbitrum-works/bold/gentle-introduction.mdx) and [BoLD technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx). + +::: + ## The Rollup chain The Rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum Rollup protocol manages and oversees. @@ -427,10 +458,27 @@ In Arbitrum, much of the work that would otherwise have to be done expensively a Supporting these functions in Layer 2 trusted software, rather than building them into the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. In addition, ArbOS also offers significant advantages in flexibility, as Layer 2 code is easier to evolve or customize for a particular chain than a Layer 1-enforced architecture would be. +### Stylus Integration + +ArbOS now supports **Stylus**, which enables WebAssembly-based smart contracts alongside traditional EVM contracts. This integration allows developers to write high-performance contracts in Rust, C, and C++ while maintaining full interoperability with existing Solidity contracts. + +**Key Stylus features:** + +- **WASM Runtime**: Executes WebAssembly contracts with enhanced performance +- **Host I/O Operations**: Efficient blockchain state access through specialized operations +- **Gas Pricing**: Multi-dimensional pricing model accounting for computation, memory, and I/O +- **Caching System**: Advanced caching for frequently accessed contracts + ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available for Arbitrum chains. +:::info More information + +For detailed information about ArbOS and Stylus, see the [ArbOS deep dive](/how-arbitrum-works/deep-dives/arbos.mdx). + +::: + ## Full nodes As the name suggests, full nodes in Arbitrum play the same role as full nodes in Ethereum: they maintain the state of the chain and provide an API that others can use to interact with the chain. @@ -445,6 +493,21 @@ Clients interact with the Sequencer in the same way they would with any full nod Currently, on the Arbitrum One and Arbitrum Nova chains, the Sequencer is run by Offchain Labs. +### Enhanced Sequencer Features + +The modern Arbitrum Sequencer includes several advanced features: + +- **Blob Support**: Uses EIP-4844 blobs for more efficient batch posting when available +- **Dynamic Compression**: Adjusts compression levels based on network conditions and backlog +- **Timeboost Integration**: Supports advanced transaction ordering policies for MEV capture +- **Improved Batching**: More efficient transaction batching and posting mechanisms + +:::info More information + +For detailed information about the Sequencer, see the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx). + +::: + ### Instant confirmation Without a Sequencer, a node can predict the results of a client transaction. However, it cannot determine the order of transactions in the inbox, as it lacks control over how these transactions are arranged compared to those submitted by other nodes. @@ -583,6 +646,25 @@ The dynamic algorithm determines the price per estimated byte by comparing the t The total fee charged for a transaction is the L2 base fee multiplied by the sum of the L2 gas used and the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a base fee limit that is below the current base fee. Ethereum also allows a "tip," but Nitro ignores this field and never collects any tips. +## Advanced Features + +### Timeboost: MEV and Transaction Ordering + +**Timeboost** is a novel transaction ordering policy that allows chain owners to capture MEV while protecting users from harmful MEV like sandwich attacks. It introduces an "express lane" for transactions and an auction system to determine who controls this lane. + +**Key benefits:** + +- **MEV Capture**: Chain owners can capture a portion of available MEV +- **User Protection**: Maintains protection against harmful MEV like front-running +- **Reduced Spam**: May reduce MEV-driven spam on the network +- **Customizable**: Chain owners can configure Timeboost parameters + +:::info More information + +For detailed information about Timeboost, see the [Timeboost gentle introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx). + +::: + ## Inside AnyTrust AnyTrust is a variant of Arbitrum Nitro technology that lowers costs by accepting a mild trust assumption. @@ -654,3 +736,15 @@ If the Sequencer fails to collect enough signatures within a few minutes, it wil For more information about AnyTrust, refer to the [AnyTrust deep dive](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). ::: + +## Additional Resources + +This document provides a comprehensive overview of Arbitrum Nitro. For more detailed information on specific topics, explore these deep dives: + +- **[Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx)**: How transactions are submitted and processed +- **[L1 to L2 Messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)**: Cross-chain communication from parent to child chains +- **[L2 to L1 Messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)**: Cross-chain communication from child to parent chains +- **[Gas and Fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx)**: Understanding Arbitrum's fee structure +- **[Geth at the Core](/how-arbitrum-works/deep-dives/geth.mdx)**: How Arbitrum modifies Geth for L2 execution +- **[STF Inputs](/how-arbitrum-works/deep-dives/stf-inputs.mdx)**: Understanding State Transition Function inputs +- **[Assertions](/how-arbitrum-works/deep-dives/assertions.mdx)**: How assertions work in the rollup protocol From a24c10ef29a971366b602242f19800a8c0799b6a Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:07:59 -0700 Subject: [PATCH 51/75] updated inside Arbitrum structure and contents --- .../01-inside-arbitrum-nitro.mdx | 647 +++++++++++++----- 1 file changed, 465 insertions(+), 182 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index a8c3b5b487..c1c60b2c82 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,92 +9,126 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -Arbitrum is a scaling technology suite designed to enhance Ethereum by offering **cheaper, faster transactions** without sacrificing security. The core product, **Arbitrum Rollup**, is an **Optimistic Rollup protocol** that processes transactions off-chain and posts succinct proofs to Ethereum for verification. This approach allows users to interact with Web3 apps and deploy smart contracts just like on Ethereum but with significantly reduced fees and higher throughput. +## What is Arbitrum? -This document provides a **comprehensive, end-to-end walkthrough** of how Arbitrum works. It combines a **high-level overview** with a **step-by-step technical explanation**, following a transaction from the moment it's submitted all the way through **execution, proving, and bridging**. Each section corresponds to a core protocol component and collectively paints a full picture of how Arbitrum achieves **scalability with Ethereum-grade trustlessness**. +Arbitrum is a Layer 2 scaling solution for Ethereum that achieves **10x lower fees** and **100x faster transactions** while maintaining Ethereum-level security guarantees through an optimistic rollup architecture. -The body of this document will describe Arbitrum Rollup, the primary use case of the Nitro technology, used on the Arbitrum One chain. There is a variant use case, called AnyTrust, deployed on the Arbitrum Nova chain. AnyTrust is a configuration that introduces mild trust assumptions and utilizes alternative data availability (Alt-DA), as discussed in a section at the end of this document. +Arbitrum processes transactions off-chain and posts cryptographic proofs to Ethereum for verification, enabling high-throughput execution while inheriting Ethereum's security model. The system maintains full EVM compatibility, allowing existing Ethereum applications to deploy without modification while benefiting from significantly improved performance characteristics. -## What's New in Arbitrum +**Technical Overview:** Arbitrum implements an optimistic rollup protocol that executes transactions in a deterministic environment, posts transaction data to Ethereum for data availability, and uses interactive fraud proofs to ensure execution correctness. The result is a system that provides Ethereum-equivalent security with substantially improved scalability. -Arbitrum has evolved significantly with several major innovations: +## Technical Benefits and Architecture -- **BoLD (Bounded Liquidity Delay)**: A new permissionless validation protocol that enables anyone to validate Arbitrum chains without permission, bringing Arbitrum closer to Stage 2 rollup status -- **Timeboost**: A novel transaction ordering policy that allows chain owners to capture MEV while protecting users from harmful MEV like sandwich attacks -- **Stylus**: WebAssembly-based smart contracts that enable high-performance contracts in Rust, C, and C++ alongside traditional EVM contracts -- **Enhanced Sequencer**: Improved batch posting with blob support and dynamic compression for better efficiency +Arbitrum provides a comprehensive scaling solution with the following technical advantages: -## Why use Arbitrum? Why use Nitro? +- **Cost Efficiency**: 10-100x reduction in transaction fees through optimized data posting and compression +- **Performance**: Sub-second transaction finality with deterministic execution guarantees +- **Security**: Ethereum-equivalent security through cryptographic proofs and economic incentives +- **Compatibility**: Full EVM compatibility enabling seamless migration of existing applications +- **Ecosystem**: Extensive DeFi and dApp ecosystem with established infrastructure -Arbitrum is an L2 scaling solution for Ethereum, offering a unique combination of benefits: +**Performance Characteristics**: Arbitrum provides significantly lower transaction costs and faster confirmation times compared to Ethereum mainnet. -- **Trustless security**: security rooted in Ethereum, with any one party able to ensure correct Layer 2 results -- **Compatibility with Ethereum**: able to run unmodified EVM contracts and unmodified Ethereum transactions -- **Scalability**: moving contracts' computation and storage off of the main Ethereum chain, allowing much higher throughput -- **Minimum cost**: designed and engineered to minimize the L1 gas footprint of the system, minimizing per-transaction cost +## Document Structure and Scope -Some other Layer 2 systems offer some of these features, but to our knowledge, no other system provides the same combination of features at the same cost. +This technical documentation provides a comprehensive analysis of Arbitrum's architecture, implementation, and operational characteristics. The document is structured to progress from high-level architectural concepts to detailed protocol specifications. -Nitro is a major upgrade to Arbitrum, improving over "classic" Arbitrum in several ways: +**Target Audience**: Developers, researchers, and technical stakeholders seeking to understand Arbitrum's design principles, implementation details, and operational mechanisms. -- **Advanced calldata compression**, which further drives down transaction costs on Arbitrum by reducing the amount of data posted to L1. -- **Separate contexts for common execution and fault proving**, increasing the performance of L1 nodes, and thus offering lower fees. -- **Ethereum L1 gas compatibility**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. -- **Additional L1 interoperability**, including tighter synchronization with L1 block numbers, and full support for all Ethereum L1 precompiles. -- **Safe retryables**, eliminating the failure mode where a retryable ticket fails to get created. -- **Geth tracing**, for even broader debugging support. -- Any many, many more changes. +**Scope**: This document covers the complete Arbitrum Nitro stack, including transaction processing, security mechanisms, consensus protocols, and advanced features such as BoLD, Stylus, and Timeboost. -## The big picture +## Core Architecture Overview -At the most basic level, an Arbitrum chain works like this: +Arbitrum's fundamental architecture follows a deterministic state transition model: -People and contracts put messages into the inbox. The chain reads the messages one at a time and processes each one. This processing updates the state of the chain and produces some outputs. +**System Components:** -If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then, the chain will process your transaction, execute it, and produce some outputs: a transaction receipt and any withdrawals that your transaction initiated. +1. **Inbox**: Receives and queues incoming transactions +2. **State Transition Function (STF)**: Processes transactions deterministically +3. **Outputs**: Produces transaction results and state updates -Execution is deterministic—which means that the contents of its inbox uniquely determine the chain's behavior. Because of this, the result of your transaction is knowable as soon as it gets placed in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) +The system operates on a deterministic execution model where transaction inputs uniquely determine outputs. This determinism ensures that all honest nodes will produce identical results when processing the same transaction sequence, enabling consensus without requiring complex coordination protocols. -All of the technical details in this document connect to this diagram (shown above). To get from this diagram to a full description of Arbitrum, we'll need to answer questions like these: +**Technical Significance**: Deterministic execution is fundamental to Arbitrum's security model, as it enables fraud proofs and dispute resolution mechanisms that rely on verifiable computation. -- Who keeps track of the inbox, chain state, and outputs? -- How does Arbitrum make sure that the chain state and outputs are correct? -- How can Ethereum users and contracts interact with Arbitrum? -- How does Arbitrum support Ethereum-compatible contracts and transactions? -- How are `ETH` and tokens transferred into and out of Arbitrum chains, and how are they managed while on chain? -- How can I run my own Arbitrum node or validator? +## Technical Analysis Framework -## Nitro's design: The four big ideas +This document addresses the following technical questions: -The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a summary of each, and then we'll unpack them in more detail in later sections. +- **System Architecture**: Sequencer design, validator roles, and node infrastructure +- **Security Mechanisms**: Fraud proof systems, dispute resolution protocols, and economic security models +- **Interoperability**: Cross-chain messaging, bridging protocols, and Ethereum compatibility +- **Advanced Features**: BoLD validation, Stylus execution environment, and Timeboost ordering policies -- **Sequencing, followed by deterministic execution**: Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). -- **Geth at the core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatibility with Ethereum. -- **Separate execution from proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. -- **Optimistic Rollup with interactive fraud proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an Optimistic Rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. +## Nitro Architecture: Core Design Principles -## Sequencing, followed by deterministic execution +Arbitrum Nitro implements four fundamental architectural innovations that enable its performance and security characteristics: -This diagram illustrates the process of how transaction processing works in Nitro. +### 1. **Sequencing and Deterministic Execution** + +Arbitrum employs a two-phase transaction processing model: sequencing followed by deterministic execution. This separation enables efficient transaction ordering while maintaining execution determinism, which is essential for fraud proof mechanisms. + +### 2. **Geth Integration at the Core** + +Nitro integrates the go-ethereum (Geth) codebase as a core component, ensuring complete EVM compatibility and behavioral consistency with Ethereum. This integration enables seamless migration of existing Ethereum applications without modification. + +### 3. **Dual Compilation Strategy** + +The system compiles source code to two targets: native code for high-performance execution and WebAssembly (WASM) for fraud proof verification. This dual compilation approach optimizes for both execution speed and proof generation efficiency. + +#### WAVM (WebAssembly Arbitrum Virtual Machine) + +Nitro uses a modified version of WASM called WAVM for fraud proof verification. WAVM differs from standard WASM in several key ways: + +**Technical Modifications**: + +- **Feature Removal**: Eliminates WASM features not generated by the Go compiler +- **Restriction Implementation**: Removes floating-point instructions and nested control flow +- **Fixed-Cost Operations**: Transforms variable-time instructions into fixed-cost constructs +- **Blockchain Integration**: Adds specialized opcodes for blockchain environment interaction + +**ReadPreImage Instruction**: The most significant addition is the ReadPreImage instruction, which enables hash-based data retrieval. This instruction takes a hash H and offset I, returning the data word at offset I of the preimage of H. This enables the "hash oracle trick" where the system stores only Merkle hashes while relying on protocol participants to maintain full data structures. + +**Technical Significance**: WAVM enables efficient fraud proof verification while maintaining the security and determinism required for dispute resolution. + +### 4. **Optimistic Rollup with Interactive Fraud Proofs** + +Arbitrum implements an optimistic execution model with interactive fraud proofs, enabling fast transaction processing while maintaining cryptographic security guarantees through dispute resolution mechanisms. + +**Architectural Significance**: These design principles collectively enable Arbitrum to achieve Ethereum-equivalent security with substantially improved performance characteristics. + +## Transaction Processing Pipeline + +The following section details the complete transaction lifecycle within the Arbitrum system: -Let's follow a user's transaction through this process. +### Phase 1: Transaction Submission and Sequencing + +Transactions are submitted to the Arbitrum Sequencer, which is responsible for ordering and batching transactions. The Sequencer maintains a real-time feed of transaction ordering and periodically posts compressed batches to Ethereum for data availability. + +### Phase 2: State Transition Function Execution + +The State Transition Function (STF) processes transactions deterministically in the order established by the Sequencer. The STF: -First, the user creates a transaction, uses their wallet to sign it, and sends it to the Nitro chain's Sequencer. The Sequencer's job, as its name implies, is to take the arriving transactions, put them into an ordered sequence, and publish that sequence. +- Maintains the current chain state (account balances, contract storage, etc.) +- Executes transactions according to EVM semantics +- Updates state and produces transaction receipts +- Emits Layer 2 block headers -Once the transactions are sequenced, they go to the State Transition Function (STF) for processing, one by one, in order. The STF takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. +### Phase 3: Validation and Finality -Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the STF will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions, so the STF never sees them—and this reduces cost and therefore keeps transaction fees low—but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) +The system validates transaction execution and establishes finality through two mechanisms: -The State Transition Function is deterministic, meaning its behavior depends only on the current state and the contents of the next transaction, and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. +- **Soft Finality**: Immediate confirmation based on Sequencer promises +- **Hard Finality**: Cryptographic finality achieved when batches are confirmed on Ethereum -Anyone who knows the transaction sequence can compute the STF independently, and all honest parties who do so are guaranteed to obtain identical results. Nitro nodes normally operate as follows: retrieve the transaction sequence and execute the State Transition Function locally. There is no requirement for a consensus mechanism. +**Technical Implementation**: The deterministic nature of the STF ensures that all honest nodes produce identical results, enabling consensus without complex coordination protocols. :::info More information @@ -102,17 +136,28 @@ For additional reading on STF inputs, see the [STF Inputs deep dive](/how-arbitr ::: -## How the Sequencer publishes the sequence +## Finality and Security Mechanisms + +Arbitrum implements a dual-finality model that balances user experience with security guarantees: + +### Soft Finality: Immediate Confirmation + +The Sequencer provides immediate transaction confirmation based on its ordering commitments. This mechanism enables fast user experience while relying on the Sequencer's honesty for correctness. -So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed and batches posted on L1 Ethereum. +**Technical Implementation**: Soft finality is achieved through the Sequencer's real-time feed, which provides immediate transaction ordering and execution results. -The real-time feed is published by the Sequencer so that anyone who subscribes to the feed receives instant notifications of each transaction as it is sequenced. Nitro nodes can subscribe to the feed directly from the Sequencer, or through a relay that forwards the feed. The feed represents the Sequencer's promise to record transactions in a particular order. If the Sequencer is honest and doesn't experience prolonged downtime, the Sequencer will fulfill its promise. Anyone who trusts the Sequencer to keep its promises can rely on the feed to obtain instant information about the transaction sequence. They can then run the sequenced transactions through the STF to immediately learn the results of each transaction. This process is called "soft finality" for transactions; it's "soft" because it relies on the Sequencer keeping its promises. +### Hard Finality: Cryptographic Security -The Sequencer also publishes its sequence on the L1 Ethereum chain. Periodically, every few minutes in production, the Sequencer concatenates the next group of transactions in the feed, compresses them for efficiency, and posts the result as calldata (blobs) on Ethereum. This process is the final and official record of the transaction sequence. +Hard finality is achieved when transaction batches are posted to and confirmed on Ethereum. This mechanism provides Ethereum-equivalent security guarantees through cryptographic proofs and economic incentives. -As soon as this Ethereum transaction achieves finality on the Ethereum blockchain, the Layer 2 Nitro transactions it records will also achieve finality. These transactions are final because their position in the sequence has finality, and the outcome of the transactions is deterministic and knowable to any party. This process is "hard finality." +**Technical Implementation**: The system posts compressed transaction batches to Ethereum using calldata or blob storage (EIP-4844), with confirmation achieved through Ethereum's consensus mechanism. -The Sequencer compresses its batches using the Brotli algorithm at its highest compression setting. +### Security Model + +- **Immediate feedback** through soft finality for optimal user experience +- **Cryptographic security** through hard finality with Ethereum-level guarantees +- **Economic security** through validator bonds and dispute resolution mechanisms +- **Data compression** to minimize L1 posting costs :::info More information @@ -120,21 +165,39 @@ To learn more about the Sequencer in-depth, take a look at the [Sequencer deep d ::: -## Geth at the core +## Geth Integration and EVM Compatibility -The second key design idea in Nitro is "Geth at the Core." Here, "Geth" refers to go-ethereum, the most common node software for Ethereum. As its name suggests, go-ethereum is written in the Go programming language, as is almost all of Nitro. +Arbitrum achieves complete Ethereum compatibility through a layered architecture that integrates the go-ethereum (Geth) codebase: -You can think of the software that comprises a Nitro node as being organized into three primary layers (shown above): +### Three-Layer Architecture + +#### 1. **Base Layer: Geth Core** + +The foundation layer consists of the core Geth components that handle EVM execution, state management, and Ethereum protocol compliance. This layer ensures behavioral consistency with Ethereum. + +#### 2. **Middle Layer: ArbOS (Arbitrum Operating System)** + +ArbOS provides Layer 2-specific functionality including: + +- Cross-chain messaging and bridging protocols +- Fee accounting and gas price management +- Deposit and withdrawal processing +- Advanced features such as Stylus WebAssembly execution + +#### 3. **Top Layer: Node Interface** -- The base layer is the core of Geth—the parts of Geth that emulate the execution of EVM contracts and maintain the data structures that make up the Ethereum state. Nitro compiles in this code as a library, with a few minor modifications to add necessary hooks. -- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decompressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll delve into the details of ArbOS below. -- The top layer consists of node software, mostly drawn from Geth. This layer handles connections, incoming RPC requests from clients, and provides the other top-level functionality required to operate an Ethereum-compatible blockchain node. +The interface layer handles RPC connections, API requests, and provides Ethereum-compatible node functionality for client applications. -Because the top and bottom layers rely heavily on code from Geth, this structure has been dubbed a "Geth sandwich." Strictly speaking, Geth plays the role of the bread in the sandwich, and ArbOS is the filling, but this sandwich receives its name from the bread. +### Technical Benefits -The State Transition Function consists of the bottom Geth layer and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and it will ultimately emit the header of a new block (in Ethereum's block header format), which will be appended to the Nitro chain. +- **Complete EVM Compatibility**: Existing Ethereum applications deploy without modification +- **Proven Security Model**: Leverages battle-tested Geth codebase +- **Enhanced Functionality**: Adds Layer 2 capabilities while maintaining compatibility +- **Seamless Integration**: Provides identical developer and user experience to Ethereum + +**Implementation Impact**: This architecture enables developers to use existing Ethereum tooling, wallets, and smart contracts while benefiting from Arbitrum's improved performance characteristics. :::info More information @@ -142,121 +205,224 @@ For more information about Geth, refer to the [Geth deep dive](/how-arbitrum-wor ::: -## Separating execution from proving +## Advanced Features and Capabilities + +Arbitrum implements several advanced features that extend its capabilities beyond basic Layer 2 functionality: + +### Stylus: WebAssembly Smart Contract Execution + +Stylus enables smart contract development in multiple programming languages through WebAssembly (WASM) compilation: + +**Technical Specifications**: + +- **Performance**: 10-70x faster execution compared to EVM +- **Memory Efficiency**: 100-500x improvement in memory usage +- **Language Support**: Rust, C, C++, and other WASM-compatible languages +- **Interoperability**: Full compatibility with existing Solidity contracts + +**Implementation Details**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, enabling seamless cross-contract calls and shared state access. + +### BoLD: Permissionless Validation Protocol + +BoLD (Bounded Liquidity Delay) implements a permissionless validation system with time-bounded dispute resolution: + +**Technical Characteristics**: + +- **Permissionless Access**: Any party can participate in validation +- **Dispute Resolution**: Guaranteed resolution within 6.4 days +- **Security Model**: Enhanced guarantees for withdrawals and cross-chain messaging +- **Decentralization**: Progresses toward Stage 2 rollup status + +**Protocol Implementation**: BoLD modifies the existing dispute protocol to enable permissionless participation while maintaining security through economic incentives and time-bounded challenges. + +### Timeboost: MEV-Aware Transaction Ordering + +Timeboost implements a novel transaction ordering policy that enables MEV capture while maintaining user protection: + +**Technical Features**: + +- **MEV Capture**: Chain owners can capture a portion of available MEV +- **User Protection**: Maintains protection against front-running and sandwich attacks +- **Spam Reduction**: Reduces MEV-driven network congestion +- **Configurable Parameters**: Chain owners can customize ordering policies + +**Implementation**: Timeboost uses an auction-based system to determine transaction ordering while preserving user protection mechanisms. + +## Security Architecture: Fraud Proof System + +Arbitrum implements a sophisticated fraud proof system that ensures transaction correctness through cryptographic verification and economic incentives: + +### Optimistic Execution Model + +The system assumes transaction execution is correct by default, enabling fast processing while maintaining security through post-execution verification mechanisms. + +### Interactive Fraud Proof Protocol + +When disputes arise regarding transaction execution, Arbitrum employs an interactive fraud proof system: + +1. **Claim Submission**: A validator submits a claim about transaction execution results +2. **Challenge Mechanism**: Other validators can challenge incorrect claims +3. **Interactive Resolution**: Disputing parties engage in a structured protocol to narrow the disagreement +4. **Final Verification**: The system verifies the specific disputed computation step +5. **Economic Settlement**: Incorrect parties forfeit bonds, honest parties receive rewards + +### Security Properties + +- **Efficiency**: Verification occurs only when disputes arise +- **Cryptographic Security**: Any honest party can detect and prove fraud +- **Performance**: Normal operation proceeds without verification overhead +- **Economic Security**: Financial incentives ensure honest behavior + +**Technical Implementation**: The fraud proof system enables Ethereum-equivalent security guarantees while maintaining high performance through optimistic execution. -One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary execution and being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, but compiling it to different targets for the two cases. +## Optimistic Rollup Architecture -The Go compiler compiles the Nitro node software for **execution**, producing native code for the target architecture, which, of course, differs for each node deployment. (The node software distribution is in source code form, and as a Docker image containing a compiled binary.) +Arbitrum implements an Optimistic Rollup protocol that combines data availability guarantees with optimistic execution: -Separately, for **proving**, the portion of the code that is the State Transition Function is compiled by the Go compiler to WebAssembly (WASM), a typed and portable machine code format. The WASM code then undergoes a simple transformation into a format we call WAVM, which is described in detail below. If there is a dispute about the correct result of computing the STF, achieving a resolution comes from referencing the WAVM code. +### Rollup Component -### WAVM +The rollup mechanism ensures that all transaction data is posted to Ethereum, providing: -The WASM format has many features that make it a good vehicle for fraud proofs—it is portable, structured, well-specified, and has reasonably good tools and support—but it requires a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. +- **Data Availability**: Complete transaction history is publicly accessible +- **State Reconstructability**: Any party can rebuild chain state from posted data +- **Permissionless Participation**: Anyone can run nodes or participate as validators +- **Transparency**: All system operations are publicly verifiable -WAVM differs from WASM in three main ways: +### Optimistic Component -First, WAVM removes certain features of WASM that are not generated by the Go compiler; the transformation phase ensures that these features are not present. +The optimistic execution model operates under the assumption that transactions are processed correctly: -Second, WAVM restricts a few features of WASM. For example, WAVM does not contain floating-point instructions, so the transformer replaces floating-point instructions with calls to the Berkeley SoftFloat library. (We use software floating-point to reduce the risk of floating-point incompatibilities between architectures. The core Nitro functions never use floating-point, but the Go runtime does use some floating-point operations.) WAVM does not contain nested control flow, so the transformer flattens control flow constructs by turning control flow instructions into jumps. Some WASM instructions take a variable amount of time to execute, which we avoid in WAVM by transforming them into constructs using fixed cost instructions. These transformations simplify proving. +1. **Execution Claims**: Validators submit claims about transaction processing results +2. **Challenge Period**: Other validators can challenge incorrect claims within a specified timeframe +3. **Dispute Resolution**: Interactive fraud proofs resolve disagreements about execution +4. **Economic Incentives**: Financial penalties for incorrect claims, rewards for honest behavior -Third, WAVM introduces a few additional opcodes to facilitate interaction with the blockchain environment. For example, new instructions enable the WAVM code to read and write the chain's global state, retrieve the next message from the chain's inbox, or signal a successful completion of executing the State Transition Function. +### Architectural Benefits -### `ReadPreImage` and the hash oracle trick +- **Rollup Properties**: Ensures transparency and permissionless participation +- **Optimistic Execution**: Enables high-performance processing by assuming correctness +- **Fraud Proof Security**: Cryptographic verification catches and corrects errors +- **Economic Security**: Financial incentives maintain system integrity -The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offset `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zero if `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. +**Technical Impact**: This architecture provides Ethereum-equivalent security with substantially improved performance characteristics. -(In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest party, assuming that the full history of the L1 Ethereum chain is available. For convenience, providing a hash preimage by a third party, such as a public server, and the correctness of the supplied value is easily verified.) +## Interactive Fraud Proof Protocol -As an example, maintaining the state of a Nitro chain mimics Ethereum's state tree format, which is a Merkle tree. Nodes of the tree are stored in a database, indexed by the Merkle hash of the node. In Nitro, the state tree is kept outside of the State Transition Function's storage, with the STF only knowing the root hash of the tree. Given the hash of a tree node, the STF can recover the tree node's contents by using `ReadPreImage`, relying on the fact that the full contents of the tree are publicly known and that nodes in the Ethereum state tree will always be smaller than the upper bound on preimage size. In this manner, the STF can arbitrarily read and write to the state tree, despite only storing its root hash. +Arbitrum's dispute resolution mechanism employs an interactive fraud proof system that efficiently resolves disagreements about transaction execution: -The only other use of `ReadPreImage` is to fetch the contents of recent L2 block headers, given the header hash. This method is safe because the block headers are publicly known and have a bounded size. +### Protocol Overview -The "hash oracle trick" of storing the Merkle hash of a data structure and relying on protocol participants to store the full structure, thereby supporting fetch-by-hash of the contents, dates back to the original Arbitrum design. +When parties disagree about transaction execution results, they engage in a structured interactive protocol: -## Optimistic Rollup +1. **Initial Claim**: A validator submits a claim about transaction execution results +2. **Challenge Response**: Another validator challenges the claim with a different result +3. **Interactive Bisection**: Parties iteratively narrow the disagreement to specific computation steps +4. **Final Verification**: The system verifies the disputed computation step +5. **Resolution**: The protocol determines the correct result and applies economic penalties -Arbitrum is an Optimistic Rollup. Let's unpack that term. +### Technical Advantages -#### Rollup +**Computational Efficiency**: The system verifies only the disputed computation step rather than re-executing entire transactions. -Arbitrum is a Rollup, which means that the inputs to the chain—the messages that go into the inbox—are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they need to determine the current correct state of the chain. They have the full history of the inbox, and the inbox history uniquely determines the results, allowing them to reconstruct the state of the chain based only on public information, if needed. +**Cost Optimization**: Most protocol steps occur off-chain, minimizing on-chain verification costs. -This posting of calldata enables anyone to be a full participant in the Arbitrum protocol, allowing them to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. +**Scalability**: Handles complex transactions that would be prohibitively expensive to verify entirely on-chain. -#### Optimistic +**Security Guarantees**: The protocol ensures that honest parties can always prove their claims. -Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block (assertion) on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved.) +### Economic Security Model -Because a party that tries to cheat will lose a deposit, attempts to cheat should be very rare. The normal case will be a single party posting a correct rollup block, with nobody challenging it. +- **Validator Bonds**: Participants must stake funds to make execution claims +- **Challenge Mechanism**: Any party can challenge incorrect claims +- **Reward Distribution**: Honest validators receive rewards for detecting fraud +- **Penalty Enforcement**: Dishonest validators forfeit their staked funds -### Resolving disputes using interactive fraud proofs +**Technical Implementation**: This economic model ensures system security through financial incentives while maintaining protocol efficiency. -Among Optimistic Rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a particular result, and Bob disagrees. How will the protocol decide which version to accept? +### Dissection Protocol Details -There are basically two options: interactive proving or re-executing transactions. Arbitrum uses interactive proving, which we believe is more efficient and more flexible. Much of Arbitrum's design follows from this fact. +The interactive fraud proof system employs a sophisticated dissection protocol that efficiently narrows disputes: -### Interactive proving +#### Simplified Dissection Protocol -The idea of interactive proving is that Alice and Bob will engage in a back-and-forth protocol, mediated by an L1 contract, to resolve their dispute with minimal work required from any L1 contract. +The basic protocol operates through iterative bisection: -Arbitrum's approach involves dissecting the dispute. If Alice's claim covers `N` steps of execution, she posts two claims of size `N/2`, which combine to yield her initial `N`-step claim. Then, Bob picks one of Alice's `N/2`-step claims to challenge. Now the size of the dispute has been halved. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far, the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute narrows to a single step that the L1 mediator (referee) needs to resolve the dispute by looking at what the instruction does and whether Alice's claim about it is correct. +1. **Initial Claim**: Alice claims execution of N instructions with specific results +2. **Bisection**: Alice divides her claim into two N/2-step assertions +3. **Challenge Selection**: Bob selects one half to challenge +4. **Iteration**: Process repeats until dispute narrows to a single instruction +5. **Final Verification**: One-step proof determines correctness -The key principle behind interactive proving is that if Alice and Bob are in a dispute, they should perform as much offchain work as possible to resolve it, rather than delegating that work to a Layer 1 (L1) contract. +#### Advanced Dissection Features -### Re-executing transactions +The production protocol includes several optimizations: -The alternative to interactive proving would be to have a rollup block contain a claimed machine state hash after every individual transaction. In the event of a dispute, the L1 referee would emulate the execution of an entire transaction to determine whether the outcome matches Alice's claim. +**K-way Dissection**: Instead of binary division, claims are divided into K segments, reducing rounds by a factor of log(K)/log(2). -### Why interactive proving is better +**Dual-Phase Dissection**: -We strongly believe that interactive proving is the superior approach for the following reasons. +- **L2 Block Level**: First narrows disputes to individual Layer 2 blocks +- **Instruction Level**: Then narrows to specific WAVM instructions -- **More efficient in the optimistic case**: Because interactive proving can resolve disputes that are larger than one transaction, it can allow a rollup block to contain only a single claim about the end state of the chain after all of the execution covered by the block. By contrast, re-execution requires posting a state claim for each transaction within the rollup block. With hundreds or thousands of transactions per rollup block, this represents a substantial difference in L1 footprint, which is the main component of the cost. -- **More efficient in the pessimistic case**: In the case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that Alice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims—Bob does that, offchain.) Only one instruction needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. -- **Higher per-transaction gas limit**: Interactive proving can escape from Ethereum's tight per-transaction gas limit. The gas limit isn't infinite, for obvious reasons, but it can be larger than on Ethereum. As far as Ethereum is concerned, the only downside of a gas-heavy Arbitrum transaction is that it may require an interactive fraud proof with slightly more steps (and only if the transaction is indeed fraudulent). By contrast, re-execution of the transaction (which is more expensive than executing it directly) is within a single Ethereum transaction. -- **More implementation flexibility**: Interactive proving allows more flexibility in implementation. All that is necessary is the ability to verify a one-step proof on Ethereum. By contrast, re-execution approaches have limitations based on the EVM. +**Bidirectional Challenges**: Bob responds with his own endpoint claims, reducing moves by factor of 2. -### Interactive proving drives the design of Arbitrum +**Empty Inbox Handling**: Protocol accounts for execution halts due to exhausted inbox. -Much of Arbitrum's design is driven by the opportunities opened up by interactive proving. Suppose you're reading about a feature of Arbitrum and wondering why it exists. In that case, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why" questions about Arbitrum relate to interactive proving. +**Time Limits**: Each participant has approximately one week total time allowance. -## Arbitrum Rollup protocol +#### Protocol Efficiency -Before diving into the Rollup protocol, there are two things we need to cover: +The dissection protocol minimizes on-chain work by: -#### 1. If you're an Arbitrum user or developer, you don't need to understand the Rollup protocol. +- **Shape Verification**: L1 contracts only verify move structure, not correctness +- **Single-Step Proof**: Only final disputed instruction requires on-chain verification +- **Off-Chain Resolution**: Most dispute resolution occurs off-chain -You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working. +**Technical Advantage**: This approach enables verification of complex transactions that would be prohibitively expensive to re-execute entirely on-chain. -Still, you don't spend your time monitoring it or studying its inner workings. -You're welcome to study, observe, and even participate in the Rollup protocol, but it's not required, and most people won't. So if you're a typical train passenger who wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! +## Rollup Protocol Implementation -#### 2. The protocol doesn't decide the results of transactions, it only confirms the results. +This section provides detailed technical information about Arbitrum's rollup protocol implementation for developers and researchers. -The results are uniquely determined by the sequence of messages in the chain's inbox. Once your transaction message is in the chain's inbox, its result is knowable—and Arbitrum nodes will report that your transaction is complete. The role of the Rollup protocol is to confirm transaction results that, from the perspective of Arbitrum users, have already occurred. (This is why Arbitrum users can effectively ignore the Rollup protocol.) +### Protocol Necessity -You might wonder why we need the Rollup protocol. If everyone already knows the results of transactions, why bother confirming them? The Rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The primary purpose of a Layer 2 scaling system is to process transactions without requiring Ethereum to handle all the work. Indeed, Arbitrum can execute transactions at a speed that Ethereum cannot match, while monitoring every transaction on Arbitrum. However, once a result is confirmed, Ethereum is aware of it and can rely on it, enabling operations on Ethereum, such as processing withdrawals of funds from Nitro back to L1. +The rollup protocol serves three critical functions: -With those preliminaries behind us, let's jump into the details of the Rollup protocol. +1. **Execution Verification**: Prevents validators from submitting incorrect transaction execution claims +2. **Ethereum Integration**: Enables Ethereum to process Arbitrum withdrawals and cross-chain operations +3. **Security Guarantees**: Maintains Ethereum-level security through cryptographic verification -### BoLD: Permissionless Validation +### Protocol Architecture -Arbitrum has evolved from a permissioned validation system to **BoLD (Bounded Liquidity Delay)**, a new permissionless validation protocol. This represents a major advancement in Arbitrum's decentralization journey. -Some parties that participate in the protocol are **validators**. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not -cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's -no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see -[State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization)). "Watchtower validators," who monitor the chain but don't take any onchain -actions, can be run permissionlessly (see [Validators](#validators) below). +The rollup protocol operates through a chain of "assertions" - cryptographic claims about Arbitrum state transitions: -**Key improvements with BoLD:** +- **Assertion Creation**: Validators submit claims about transaction execution results +- **Challenge Mechanism**: Other validators can challenge incorrect assertions +- **Dispute Resolution**: Interactive fraud proofs resolve disagreements +- **Final Confirmation**: Ethereum records confirmed assertions for cross-chain operations -- **Permissionless validation**: Anyone can validate Arbitrum chains without needing permission -- **Time-bounded disputes**: Disputes are guaranteed to resolve within a fixed timeframe (6.4 days) -- **Enhanced security**: Stronger guarantees for withdrawals and cross-chain messaging -- **Stage 2 rollup status**: Moves Arbitrum closer to being recognized as a fully decentralized rollup +### Technical Implementation -The key security property of the Rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. +**Key Principle**: The protocol does not determine transaction outcomes - it only confirms execution results that have already been determined. Transaction results are fixed upon processing, and the protocol ensures consensus about these results. + +**Implementation Details**: The protocol functions as a verification layer that confirms the authenticity and correctness of state transitions without modifying the underlying execution results. + +### BoLD: Permissionless Validation Protocol + +BoLD (Bounded Liquidity Delay) implements a permissionless validation system that enhances Arbitrum's decentralization and security: + +**Technical Specifications**: + +- **Permissionless Access**: Any party can participate in validation without authorization +- **Time-Bounded Disputes**: Disputes are guaranteed to resolve within 6.4 days +- **Enhanced Security**: Improved guarantees for withdrawals and cross-chain messaging +- **Decentralization**: Progresses toward Stage 2 rollup status + +**Protocol Implementation**: Validators participate by staking bonds to make execution claims. Honest validators recover their bonds, while dishonest validators forfeit their stakes. + +**Current Status**: BoLD is operational on Arbitrum One, Nova, and Sepolia. While designed for permissionless operation, validators are currently allowlisted as part of Arbitrum's progressive decentralization strategy. + +**Technical Significance**: BoLD enhances Arbitrum's decentralization by enabling permissionless participation in network security, similar to Ethereum's validation model. :::info More information @@ -597,17 +763,53 @@ For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works ::: -## Gas and fees +## Gas and Fees Gas is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. -## The Speed limit +### Speed Limit + +The security of Nitro chains relies on the assumption that validators can verify assertions and respond with challenges if necessary. This requirement sets an effective speed limit on chain execution: the chain cannot progress faster than a validator can emulate its execution. + +**Technical Implementation**: If assertions are published faster than the speed limit, their deadlines extend further into the future. Due to protocol limits on deadline extension, this eventually slows down new assertions, enforcing the effective speed limit. + +**Speed Limit Parameter**: Currently set to 7,000,000 gas per second on Arbitrum One. This parameter must be set accurately to ensure security while maximizing throughput. + +### L2 Gas Fee Algorithm + +L2 gas fees operate similarly to Ethereum's EIP-1559 mechanism using an exponential pricing model: + +**Algorithm Components**: -The security of Nitro chains relies on the assumption that when one validator creates an assertion, other validators will verify it and respond with a correct assertion and a challenge if it is incorrect. This assumption requires that the other validators have the time and resources to check each assertion quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for assertions. +- **Speed Limit**: Target gas per second (7,000,000 on Arbitrum One) +- **Gas Backlog**: Tracks accumulated gas usage over time +- **Base Fee Calculation**: Exponential function of backlog: F = exp(-a(B-b)) -This security feature sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will go further into the future. Due to the limit imposed by the Rollup protocol contracts on how far into the future a deadline can be, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. +**Technical Implementation**: -Being able to set the speed limit accurately depends on being able to estimate the time required to validate an assertion, with some accuracy. Any uncertainty in estimating validation time will force us to set the speed limit lower to ensure safety. We do not want to lower the speed limit, so we aim to enable accurate estimation of the speed limit. +- Gas consumption adds to backlog +- Each second, speed limit is subtracted from backlog +- Backlog cannot go below zero +- Base fee adjusts exponentially based on backlog level + +**Parameters**: + +- **a**: Controls price escalation rate with backlog +- **b**: Allows small backlog before price escalation begins + +### L1 Calldata Fees + +L1 calldata fees compensate batch posters for Ethereum posting costs: + +**Fee Calculation**: + +1. **Size Estimation**: Calculate transaction's contribution to compressed batch +2. **Price Multiplication**: Multiply by current price per estimated byte +3. **Gas Conversion**: Convert L1 cost to L2 gas units using current base fee + +**Dynamic Pricing**: Algorithm adjusts price per byte to align collected fees with batch poster costs. + +**Scope**: Only applies to Sequencer transactions; delayed inbox transactions pay Ethereum gas directly. ## Fees @@ -646,90 +848,171 @@ The dynamic algorithm determines the price per estimated byte by comparing the t The total fee charged for a transaction is the L2 base fee multiplied by the sum of the L2 gas used and the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a base fee limit that is below the current base fee. Ethereum also allows a "tip," but Nitro ignores this field and never collects any tips. -## Advanced Features +## Cross-Chain Asset Transfer: Bridging Protocol -### Timeboost: MEV and Transaction Ordering +Arbitrum implements a bridging protocol that enables secure asset transfer between Ethereum and Arbitrum chains. -**Timeboost** is a novel transaction ordering policy that allows chain owners to capture MEV while protecting users from harmful MEV like sandwich attacks. It introduces an "express lane" for transactions and an auction system to determine who controls this lane. +### Bridge Architecture -**Key benefits:** +**Deposit Mechanism (Ethereum → Arbitrum):** -- **MEV Capture**: Chain owners can capture a portion of available MEV -- **User Protection**: Maintains protection against harmful MEV like front-running -- **Reduced Spam**: May reduce MEV-driven spam on the network -- **Customizable**: Chain owners can configure Timeboost parameters +1. Users send tokens to the bridge contract on Ethereum +2. The bridge contract locks tokens in escrow +3. Arbitrum mints equivalent tokens on the L2 +4. Users receive tokens on Arbitrum for immediate use -:::info More information +**Withdrawal Mechanism (Arbitrum → Ethereum):** -For detailed information about Timeboost, see the [Timeboost gentle introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx). +1. Users burn tokens on Arbitrum +2. The system processes withdrawal requests +3. After the challenge period, users can claim tokens on Ethereum +4. The bridge contract releases escrowed tokens -::: +### Bridge Types + +**Standard Bridge**: Official Arbitrum bridge implementation + +- Supports ETH and ERC-20 tokens +- Uses official Arbitrum bridge contracts +- Implements standard 7-day challenge period +- Provides maximum security guarantees + +**Custom Bridges**: Third-party implementations -## Inside AnyTrust +- Built by external developers +- May implement different security models +- Often provide faster withdrawal mechanisms +- May have different trust assumptions -AnyTrust is a variant of Arbitrum Nitro technology that lowers costs by accepting a mild trust assumption. +### Security Model -The Arbitrum protocol requires that all Arbitrum nodes, including validators, have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum Rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of the cost in Arbitrum. +**Challenge Period**: Withdrawals require a 7-day challenge period during which validators can challenge incorrect withdrawal requests. -AnyTrust relies instead on an external Data Availability Committee (hereinafter referred to as "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This assumption means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be available so that the Rollup protocol can function correctly. +**Fast Withdrawals**: Some services provide immediate liquidity for withdrawals, charging fees for the convenience. + +**Technical Implementation**: The bridging protocol ensures asset security through cryptographic proofs and economic incentives. + +## AnyTrust: Alternative Data Availability Model + +AnyTrust implements a variant of Arbitrum that reduces costs by accepting a mild trust assumption about data availability. + +### Architecture Comparison + +**Standard Arbitrum (Rollup):** + +- Posts all transaction data to Ethereum for data availability +- Provides maximum security through cryptographic guarantees +- Used by Arbitrum One +- Higher costs due to L1 data posting requirements + +**AnyTrust:** + +- Uses a Data Availability Committee (DAC) for data storage +- Accepts mild trust assumptions about committee honesty +- Used by Arbitrum Nova +- Lower costs through reduced L1 data posting ### Keysets -A Keyset specifies the public keys of Committee members and the number of signatures required for a Data Availability Certificate to be valid. Keysets enable Committee membership changes and provide Committee members with the ability to update their keys. +Keysets specify the public keys of Committee members and signature requirements: + +**Keyset Components**: + +- Number of Committee members +- BLS public key for each member +- Number of required signatures + +**Management**: Keysets are identifiable by hashes and managed by an L1 KeysetManager contract. The L2 chain Owner can add or remove Keysets, with L1 events emitted for recovery. + +### Data Availability Certificates (DACerts) + +DACerts provide cryptographic proof of data availability: + +**Certificate Contents**: -A Keyset contains: +- Hash of data block +- Expiration time +- Proof of N-1 Committee member signatures +- Keyset hash and signature bitmap +- BLS aggregated signature (BLS12-381 curve) -- the number of Committee members, and -- for each Committee member, a BLS public key, and -- the number of Committee signatures required +**Trust Model**: Based on 2-of-N assumption, ensuring at least one honest member will provide data until expiration. -Keysets are identifiable by their hashes. -An L1 `KeysetManager` contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the `KeysetManager` contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This emission allows the contents to be recovered later by anyone, provided only the Keyset hash is known. +### Data Availability Servers (DAS) -Although the API does not limit the number of Keysets that can be valid at the same time, normally, only one Keyset will be valid. +Committee members run DAS software with two APIs: -### Data Availability Certificates +**Sequencer API**: JSON-RPC interface for Sequencer to submit data blocks +**REST API**: Public HTTP(S) interface for fetching data blocks by hash -A central concept in AnyTrust is the Data Availability Certificate (hereafter referred to as a "DACert"). A DACert contains: +**Storage Options**: Local files, Badger database, Amazon S3, or redundant multi-store configurations with optional caching. -- The hash of a data block, and -- An expiration, and -- Proof that `N-1` Committee members have signed the (hash, expiration time) pair, consisting of: - - The hash of the Keyset used in signing, and - - A bitmap saying which Committee members signed, and - - A BLS aggregated signature (over the BLS12-381 curve) proving that those parties signed +### Sequencer-Committee Interaction -Because of the `2-of-N` trust assumption, a DACert constitutes proof that the block's data (i.e., the preimage of the hash in the DACert) will be available from at least one honest Committee member, at least until the expiration time. +**Data Submission Process**: -AnyTrust provides the Sequencer with two options for posting a data block on L1: it can post the full data as described above, or it can post a DACert proving the availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity get checked by L2 code. +1. Sequencer sends data batch with expiration time to all Committee members +2. Members store data and sign (hash, expiration) pairs +3. Sequencer aggregates signatures to create DACert +4. Sequencer posts DACert to L1 inbox contract -In ordinary (non-AnyTrust) Nitro, the Arbitrum Sequencer posts data blocks on the L1 chains as calldata. The L1 inbox contract commits the hashes of the data blocks, making the data reliably readable to L2 code. +**Fallback Mechanism**: If insufficient signatures collected within minutes, Sequencer falls back to posting full data directly to L1. -The L2 code that reads data from the inbox reads a full data block, just like in ordinary Nitro. If it sees a DACert instead, it checks the validity of the DACert, regarding the Keyset specified by the DACert (which is known to be valid because the L1 inbox verified that). The L2 code verifies that: +**Technical Specifications**: The committee maintains transaction data and provides it on-demand, with cryptographic proofs ensuring data integrity. -- The number of signers is at least the number required by the Keyset, and -- The aggregated signature is valid for the claimed signers, and -- The expiration time is at least two weeks after the current L2 timestamp +**Use Cases**: AnyTrust is optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. -If the DACert is invalid, the L2 code discards the DACert and moves on to the next data block. If the DACert is valid, the L2 code reads the data block, which is guaranteed to be available because the DACert is valid. +**Performance Characteristics**: Arbitrum Nova (AnyTrust implementation) offers lower fees than Arbitrum One, making it suitable for high-volume, low-value transactions. -### Data Availability Servers +## Recent Technical Innovations -Committee members run the Data Availability Server (DAS) software. The DAS exposes two APIs: +Arbitrum has implemented several major technical innovations that enhance its capabilities: -- The Sequencer API, which is to be called only by the Arbitrum chain's Sequencer, is a JSON-RPC interface allowing the Sequencer to submit data blocks to the DAS for storage. Deployments will typically block access to this API from callers other than the Sequencer. -- The REST API, which is to be available to the world, is a RESTful HTTP(S) based protocol that allows fetching data blocks by hash. This API is fully cacheable, and deployments can utilize a caching proxy or CDN to increase scalability and protect against DoS attacks. - Only Committee members have reason to support the Sequencer API. We expect others to run the REST API, and that is helpful. (More on that below.) +### BoLD (Bounded Liquidity Delay) -The DAS software, based on configuration options, can store its data in local files, a Badger database, Amazon S3, or redundantly across multiple backing stores. The software also supports optional caching in memory (using Bigcache) or in a Redis instance. +A permissionless validation protocol that enables decentralized participation in network security: -### Sequencer-Committee interaction +**Technical Specifications**: -When the Arbitrum Sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (usually three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then, the member signs the (hash, expiration time) pair using its BLS key and returns the signature along with a success indicator to the Sequencer. +- **Permissionless Access**: Any party can participate in validation without authorization +- **Time-Bounded Disputes**: Disputes resolve within 6.4 days +- **Enhanced Security**: Improved guarantees for withdrawals and cross-chain messaging +- **Decentralization**: Progresses toward Stage 2 rollup status -Once the Sequencer has collected enough signatures, it can aggregate the signatures and create a valid DACert for the (hash, expiration time) pair. The Sequencer then posts that DACert to the L1 inbox contract, making it available to the AnyTrust chain software at L2. +### Timeboost: MEV-Aware Transaction Ordering + +A novel transaction ordering policy that enables MEV capture while maintaining user protection: + +**Technical Features**: + +- **MEV Capture**: Chain owners can capture a portion of available MEV +- **User Protection**: Maintains protection against front-running and sandwich attacks +- **Spam Reduction**: Reduces MEV-driven network congestion +- **Configurable Parameters**: Chain owners can customize ordering policies + +### Stylus: WebAssembly Smart Contract Execution + +WebAssembly-based smart contract execution environment: + +**Technical Specifications**: + +- **Performance**: 10-70x faster execution compared to EVM +- **Memory Efficiency**: 100-500x improvement in memory usage +- **Language Support**: Rust, C, C++, and other WASM-compatible languages +- **Interoperability**: Full compatibility with existing Solidity contracts + +### Enhanced Sequencer Features + +Improved batch posting with advanced compression and blob support: + +**Technical Improvements**: + +- **Blob Support**: Uses EIP-4844 blobs for more efficient batch posting +- **Dynamic Compression**: Adjusts compression levels based on network conditions +- **Timeboost Integration**: Supports advanced transaction ordering policies +- **Improved Batching**: More efficient transaction batching and posting mechanisms -If the Sequencer fails to collect enough signatures within a few minutes, it will abandon the attempt to use the Committee and "fall back to rollup" by posting the full data directly to the L1 chain, as it would in a non-AnyTrust chain. The L2 software can understand both data posting formats (via DACert or full data) and handles each one correctly. +**Technical Impact**: These innovations collectively enhance Arbitrum's performance, security, and developer experience. :::info More information From a667b88eb525ae77af1a9accbe273c7faeff6d68 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 7 Oct 2025 14:20:22 -0700 Subject: [PATCH 52/75] updated inside Arbitrum with new format --- .../01-inside-arbitrum-nitro.mdx | 1133 +++++------------ 1 file changed, 334 insertions(+), 799 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index c1c60b2c82..5fa48fa301 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -1,1033 +1,568 @@ --- title: 'Inside Arbitrum Nitro' -description: 'Learn the fundamentals of the Arbitrum Nitro stack and its advanced features.' +description: 'Follow a transaction's journey through the complete Arbitrum Nitro stack, from submission to finality.' author: pete-vielhaber sme: edfelten -user_story: As a current or prospective Arbitrum user, I need to learn more about Nitro's design and capabilities. +user_story: As a developer, I need to understand how transactions flow through Arbitrum's architecture and how the system ensures security and performance. content_type: get-started --- import ImageWithCaption from '@site/src/components/ImageCaptions/'; -## What is Arbitrum? +## A Transaction's Journey Through Arbitrum -Arbitrum is a Layer 2 scaling solution for Ethereum that achieves **10x lower fees** and **100x faster transactions** while maintaining Ethereum-level security guarantees through an optimistic rollup architecture. +Imagine you're a developer sending a transaction to Arbitrum. What happens from the moment you submit it until it achieves finality? Let's trace this journey step by step, exploring how Arbitrum's architecture ensures your transaction is processed correctly, efficiently, and securely. -Arbitrum processes transactions off-chain and posts cryptographic proofs to Ethereum for verification, enabling high-throughput execution while inheriting Ethereum's security model. The system maintains full EVM compatibility, allowing existing Ethereum applications to deploy without modification while benefiting from significantly improved performance characteristics. +This story will take us through the complete Arbitrum Nitro stack—from the Sequencer that orders your transaction, through the State Transition Function that executes it, to the validation system that ensures its correctness. Along the way, we'll discover how Arbitrum achieves Ethereum-level security while providing 10x lower fees and 100x faster transactions. -**Technical Overview:** Arbitrum implements an optimistic rollup protocol that executes transactions in a deterministic environment, posts transaction data to Ethereum for data availability, and uses interactive fraud proofs to ensure execution correctness. The result is a system that provides Ethereum-equivalent security with substantially improved scalability. +## The Foundation: Arbitrum's Core Architecture -## Technical Benefits and Architecture - -Arbitrum provides a comprehensive scaling solution with the following technical advantages: - -- **Cost Efficiency**: 10-100x reduction in transaction fees through optimized data posting and compression -- **Performance**: Sub-second transaction finality with deterministic execution guarantees -- **Security**: Ethereum-equivalent security through cryptographic proofs and economic incentives -- **Compatibility**: Full EVM compatibility enabling seamless migration of existing applications -- **Ecosystem**: Extensive DeFi and dApp ecosystem with established infrastructure - -**Performance Characteristics**: Arbitrum provides significantly lower transaction costs and faster confirmation times compared to Ethereum mainnet. - -## Document Structure and Scope - -This technical documentation provides a comprehensive analysis of Arbitrum's architecture, implementation, and operational characteristics. The document is structured to progress from high-level architectural concepts to detailed protocol specifications. - -**Target Audience**: Developers, researchers, and technical stakeholders seeking to understand Arbitrum's design principles, implementation details, and operational mechanisms. - -**Scope**: This document covers the complete Arbitrum Nitro stack, including transaction processing, security mechanisms, consensus protocols, and advanced features such as BoLD, Stylus, and Timeboost. - -## Core Architecture Overview - -Arbitrum's fundamental architecture follows a deterministic state transition model: +Before we begin our journey, let's understand the fundamental architecture that makes everything possible. Arbitrum operates on a simple but powerful principle: **deterministic state transitions**. -**System Components:** +**The Core Components:** -1. **Inbox**: Receives and queues incoming transactions +1. **Inbox**: Where transactions enter the system 2. **State Transition Function (STF)**: Processes transactions deterministically -3. **Outputs**: Produces transaction results and state updates - -The system operates on a deterministic execution model where transaction inputs uniquely determine outputs. This determinism ensures that all honest nodes will produce identical results when processing the same transaction sequence, enabling consensus without requiring complex coordination protocols. - -**Technical Significance**: Deterministic execution is fundamental to Arbitrum's security model, as it enables fraud proofs and dispute resolution mechanisms that rely on verifiable computation. - -## Technical Analysis Framework - -This document addresses the following technical questions: - -- **System Architecture**: Sequencer design, validator roles, and node infrastructure -- **Security Mechanisms**: Fraud proof systems, dispute resolution protocols, and economic security models -- **Interoperability**: Cross-chain messaging, bridging protocols, and Ethereum compatibility -- **Advanced Features**: BoLD validation, Stylus execution environment, and Timeboost ordering policies - -## Nitro Architecture: Core Design Principles - -Arbitrum Nitro implements four fundamental architectural innovations that enable its performance and security characteristics: +3. **Outputs**: Produces results and state updates -### 1. **Sequencing and Deterministic Execution** +This deterministic model ensures that given the same inputs, all honest nodes will produce identical outputs. This property is crucial for Arbitrum's security model—it enables fraud proofs and dispute resolution mechanisms that can verify execution correctness without re-running entire transactions. -Arbitrum employs a two-phase transaction processing model: sequencing followed by deterministic execution. This separation enables efficient transaction ordering while maintaining execution determinism, which is essential for fraud proof mechanisms. +## Nitro's Four Big Ideas -### 2. **Geth Integration at the Core** +Arbitrum Nitro's design is built around four fundamental innovations that enable its performance and security characteristics: -Nitro integrates the go-ethereum (Geth) codebase as a core component, ensuring complete EVM compatibility and behavioral consistency with Ethereum. This integration enables seamless migration of existing Ethereum applications without modification. +### 1. Sequencing, Followed by Deterministic Execution -### 3. **Dual Compilation Strategy** +Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). -The system compiles source code to two targets: native code for high-performance execution and WebAssembly (WASM) for fraud proof verification. This dual compilation approach optimizes for both execution speed and proof generation efficiency. +### 2. Geth at the Core -#### WAVM (WebAssembly Arbitrum Virtual Machine) +Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library ensures a very high degree of compatibility with Ethereum. -Nitro uses a modified version of WASM called WAVM for fraud proof verification. WAVM differs from standard WASM in several key ways: +### 3. Separate Execution from Proving -**Technical Modifications**: +Nitro takes the same source and compiles it twice: once to native code for execution in a Nitro node (optimized for speed), and again to WASM for use in proving (optimized for portability and security). -- **Feature Removal**: Eliminates WASM features not generated by the Go compiler -- **Restriction Implementation**: Removes floating-point instructions and nested control flow -- **Fixed-Cost Operations**: Transforms variable-time instructions into fixed-cost constructs -- **Blockchain Integration**: Adds specialized opcodes for blockchain environment interaction - -**ReadPreImage Instruction**: The most significant addition is the ReadPreImage instruction, which enables hash-based data retrieval. This instruction takes a hash H and offset I, returning the data word at offset I of the preimage of H. This enables the "hash oracle trick" where the system stores only Merkle hashes while relying on protocol participants to maintain full data structures. - -**Technical Significance**: WAVM enables efficient fraud proof verification while maintaining the security and determinism required for dispute resolution. - -### 4. **Optimistic Rollup with Interactive Fraud Proofs** +### 4. Optimistic Rollup with Interactive Fraud Proofs -Arbitrum implements an optimistic execution model with interactive fraud proofs, enabling fast transaction processing while maintaining cryptographic security guarantees through dispute resolution mechanisms. +Nitro settles transactions to the Layer 1 Ethereum chain using an Optimistic Rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. -**Architectural Significance**: These design principles collectively enable Arbitrum to achieve Ethereum-equivalent security with substantially improved performance characteristics. +**Why These Matter**: These four innovations collectively enable Arbitrum to achieve Ethereum-level security with substantially improved performance characteristics while maintaining complete compatibility with existing Ethereum applications. -## Transaction Processing Pipeline +## Chapter 1: Transaction Submission - The Journey Begins -The following section details the complete transaction lifecycle within the Arbitrum system: +Your transaction's journey starts when you submit it to Arbitrum. You have several pathways available, each with different characteristics: -### Phase 1: Transaction Submission and Sequencing - -Transactions are submitted to the Arbitrum Sequencer, which is responsible for ordering and batching transactions. The Sequencer maintains a real-time feed of transaction ordering and periodically posts compressed batches to Ethereum for data availability. - -### Phase 2: State Transition Function Execution - -The State Transition Function (STF) processes transactions deterministically in the order established by the Sequencer. The STF: - -- Maintains the current chain state (account balances, contract storage, etc.) -- Executes transactions according to EVM semantics -- Updates state and produces transaction receipts -- Emits Layer 2 block headers - -### Phase 3: Validation and Finality - -The system validates transaction execution and establishes finality through two mechanisms: - -- **Soft Finality**: Immediate confirmation based on Sequencer promises -- **Hard Finality**: Cryptographic finality achieved when batches are confirmed on Ethereum - -**Technical Implementation**: The deterministic nature of the STF ensures that all honest nodes produce identical results, enabling consensus without complex coordination protocols. - -:::info More information - -For additional reading on STF inputs, see the [STF Inputs deep dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). - -::: - -## Finality and Security Mechanisms - -Arbitrum implements a dual-finality model that balances user experience with security guarantees: - -### Soft Finality: Immediate Confirmation - -The Sequencer provides immediate transaction confirmation based on its ordering commitments. This mechanism enables fast user experience while relying on the Sequencer's honesty for correctness. - -**Technical Implementation**: Soft finality is achieved through the Sequencer's real-time feed, which provides immediate transaction ordering and execution results. - -### Hard Finality: Cryptographic Security - -Hard finality is achieved when transaction batches are posted to and confirmed on Ethereum. This mechanism provides Ethereum-equivalent security guarantees through cryptographic proofs and economic incentives. - -**Technical Implementation**: The system posts compressed transaction batches to Ethereum using calldata or blob storage (EIP-4844), with confirmation achieved through Ethereum's consensus mechanism. - -### Security Model - -- **Immediate feedback** through soft finality for optimal user experience -- **Cryptographic security** through hard finality with Ethereum-level guarantees -- **Economic security** through validator bonds and dispute resolution mechanisms -- **Data compression** to minimize L1 posting costs - -:::info More information - -To learn more about the Sequencer in-depth, take a look at the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx) - -::: - -## Geth Integration and EVM Compatibility - -Arbitrum achieves complete Ethereum compatibility through a layered architecture that integrates the go-ethereum (Geth) codebase: - - - -### Three-Layer Architecture - -#### 1. **Base Layer: Geth Core** - -The foundation layer consists of the core Geth components that handle EVM execution, state management, and Ethereum protocol compliance. This layer ensures behavioral consistency with Ethereum. - -#### 2. **Middle Layer: ArbOS (Arbitrum Operating System)** - -ArbOS provides Layer 2-specific functionality including: - -- Cross-chain messaging and bridging protocols -- Fee accounting and gas price management -- Deposit and withdrawal processing -- Advanced features such as Stylus WebAssembly execution - -#### 3. **Top Layer: Node Interface** - -The interface layer handles RPC connections, API requests, and provides Ethereum-compatible node functionality for client applications. - -### Technical Benefits - -- **Complete EVM Compatibility**: Existing Ethereum applications deploy without modification -- **Proven Security Model**: Leverages battle-tested Geth codebase -- **Enhanced Functionality**: Adds Layer 2 capabilities while maintaining compatibility -- **Seamless Integration**: Provides identical developer and user experience to Ethereum - -**Implementation Impact**: This architecture enables developers to use existing Ethereum tooling, wallets, and smart contracts while benefiting from Arbitrum's improved performance characteristics. - -:::info More information - -For more information about Geth, refer to the [Geth deep dive](/how-arbitrum-works/deep-dives/geth.mdx) - -::: - -## Advanced Features and Capabilities - -Arbitrum implements several advanced features that extend its capabilities beyond basic Layer 2 functionality: - -### Stylus: WebAssembly Smart Contract Execution - -Stylus enables smart contract development in multiple programming languages through WebAssembly (WASM) compilation: - -**Technical Specifications**: - -- **Performance**: 10-70x faster execution compared to EVM -- **Memory Efficiency**: 100-500x improvement in memory usage -- **Language Support**: Rust, C, C++, and other WASM-compatible languages -- **Interoperability**: Full compatibility with existing Solidity contracts - -**Implementation Details**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, enabling seamless cross-contract calls and shared state access. - -### BoLD: Permissionless Validation Protocol - -BoLD (Bounded Liquidity Delay) implements a permissionless validation system with time-bounded dispute resolution: - -**Technical Characteristics**: - -- **Permissionless Access**: Any party can participate in validation -- **Dispute Resolution**: Guaranteed resolution within 6.4 days -- **Security Model**: Enhanced guarantees for withdrawals and cross-chain messaging -- **Decentralization**: Progresses toward Stage 2 rollup status - -**Protocol Implementation**: BoLD modifies the existing dispute protocol to enable permissionless participation while maintaining security through economic incentives and time-bounded challenges. - -### Timeboost: MEV-Aware Transaction Ordering - -Timeboost implements a novel transaction ordering policy that enables MEV capture while maintaining user protection: - -**Technical Features**: - -- **MEV Capture**: Chain owners can capture a portion of available MEV -- **User Protection**: Maintains protection against front-running and sandwich attacks -- **Spam Reduction**: Reduces MEV-driven network congestion -- **Configurable Parameters**: Chain owners can customize ordering policies - -**Implementation**: Timeboost uses an auction-based system to determine transaction ordering while preserving user protection mechanisms. - -## Security Architecture: Fraud Proof System - -Arbitrum implements a sophisticated fraud proof system that ensures transaction correctness through cryptographic verification and economic incentives: - -### Optimistic Execution Model - -The system assumes transaction execution is correct by default, enabling fast processing while maintaining security through post-execution verification mechanisms. - -### Interactive Fraud Proof Protocol - -When disputes arise regarding transaction execution, Arbitrum employs an interactive fraud proof system: - -1. **Claim Submission**: A validator submits a claim about transaction execution results -2. **Challenge Mechanism**: Other validators can challenge incorrect claims -3. **Interactive Resolution**: Disputing parties engage in a structured protocol to narrow the disagreement -4. **Final Verification**: The system verifies the specific disputed computation step -5. **Economic Settlement**: Incorrect parties forfeit bonds, honest parties receive rewards - -### Security Properties - -- **Efficiency**: Verification occurs only when disputes arise -- **Cryptographic Security**: Any honest party can detect and prove fraud -- **Performance**: Normal operation proceeds without verification overhead -- **Economic Security**: Financial incentives ensure honest behavior - -**Technical Implementation**: The fraud proof system enables Ethereum-equivalent security guarantees while maintaining high performance through optimistic execution. - -## Optimistic Rollup Architecture - -Arbitrum implements an Optimistic Rollup protocol that combines data availability guarantees with optimistic execution: - -### Rollup Component - -The rollup mechanism ensures that all transaction data is posted to Ethereum, providing: - -- **Data Availability**: Complete transaction history is publicly accessible -- **State Reconstructability**: Any party can rebuild chain state from posted data -- **Permissionless Participation**: Anyone can run nodes or participate as validators -- **Transparency**: All system operations are publicly verifiable - -### Optimistic Component - -The optimistic execution model operates under the assumption that transactions are processed correctly: - -1. **Execution Claims**: Validators submit claims about transaction processing results -2. **Challenge Period**: Other validators can challenge incorrect claims within a specified timeframe -3. **Dispute Resolution**: Interactive fraud proofs resolve disagreements about execution -4. **Economic Incentives**: Financial penalties for incorrect claims, rewards for honest behavior - -### Architectural Benefits - -- **Rollup Properties**: Ensures transparency and permissionless participation -- **Optimistic Execution**: Enables high-performance processing by assuming correctness -- **Fraud Proof Security**: Cryptographic verification catches and corrects errors -- **Economic Security**: Financial incentives maintain system integrity - -**Technical Impact**: This architecture provides Ethereum-equivalent security with substantially improved performance characteristics. - -## Interactive Fraud Proof Protocol - -Arbitrum's dispute resolution mechanism employs an interactive fraud proof system that efficiently resolves disagreements about transaction execution: - -### Protocol Overview - -When parties disagree about transaction execution results, they engage in a structured interactive protocol: - -1. **Initial Claim**: A validator submits a claim about transaction execution results -2. **Challenge Response**: Another validator challenges the claim with a different result -3. **Interactive Bisection**: Parties iteratively narrow the disagreement to specific computation steps -4. **Final Verification**: The system verifies the disputed computation step -5. **Resolution**: The protocol determines the correct result and applies economic penalties - -### Technical Advantages - -**Computational Efficiency**: The system verifies only the disputed computation step rather than re-executing entire transactions. - -**Cost Optimization**: Most protocol steps occur off-chain, minimizing on-chain verification costs. - -**Scalability**: Handles complex transactions that would be prohibitively expensive to verify entirely on-chain. - -**Security Guarantees**: The protocol ensures that honest parties can always prove their claims. - -### Economic Security Model - -- **Validator Bonds**: Participants must stake funds to make execution claims -- **Challenge Mechanism**: Any party can challenge incorrect claims -- **Reward Distribution**: Honest validators receive rewards for detecting fraud -- **Penalty Enforcement**: Dishonest validators forfeit their staked funds +### The Standard Path: Through the Sequencer -**Technical Implementation**: This economic model ensures system security through financial incentives while maintaining protocol efficiency. +Most transactions take the standard path through the **Sequencer**—a specialized node responsible for ordering transactions and providing immediate confirmations. The Sequencer offers several submission methods: -### Dissection Protocol Details +- **Public RPC**: For development and light usage +- **Third-party RPC**: For higher throughput and better performance +- **Direct Sequencer endpoint**: For the lowest possible latency +- **Self-hosted Arbitrum nodes**: For maximum control and privacy -The interactive fraud proof system employs a sophisticated dissection protocol that efficiently narrows disputes: +### The Alternative Path: Bypassing the Sequencer -#### Simplified Dissection Protocol +For censorship resistance, you can submit transactions directly to the **Delayed Inbox** contract on Ethereum. This method ensures your transaction will be processed even if the Sequencer refuses to handle it. -The basic protocol operates through iterative bisection: +**How It Works:** -1. **Initial Claim**: Alice claims execution of N instructions with specific results -2. **Bisection**: Alice divides her claim into two N/2-step assertions -3. **Challenge Selection**: Bob selects one half to challenge -4. **Iteration**: Process repeats until dispute narrows to a single instruction -5. **Final Verification**: One-step proof determines correctness +- **Delayed Inbox Queue**: Messages submitted by non-Sequencer nodes go into the "delayed inbox" queue +- **Sequencer Release**: A well-behaved Sequencer typically releases delayed messages after about 10 minutes +- **Force Inclusion**: If a message has been in the delayed inbox queue for longer than 24 hours, anyone can force it to be promoted to the main inbox +- **Censorship Resistance**: This ensures the Sequencer can only delay messages but can't censor them -#### Advanced Dissection Features +**Trade-offs:** -The production protocol includes several optimizations: +- **Sequencer Path**: Finality is faster (immediate soft finality) +- **Delayed Inbox Path**: Finality is slower (roughly double the time) but provides censorship resistance -**K-way Dissection**: Instead of binary division, claims are divided into K segments, reducing rounds by a factor of log(K)/log(2). +**Why This Matters**: The Sequencer provides immediate "soft finality" by promising to include your transaction in a specific order. This enables fast user experience while maintaining the option for censorship-resistant submission when needed. -**Dual-Phase Dissection**: +## Chapter 2: The Sequencer - Ordering and Broadcasting -- **L2 Block Level**: First narrows disputes to individual Layer 2 blocks -- **Instruction Level**: Then narrows to specific WAVM instructions +Once your transaction reaches the Sequencer, it enters a sophisticated ordering and broadcasting system designed for both performance and security. -**Bidirectional Challenges**: Bob responds with his own endpoint claims, reducing moves by factor of 2. +### Real-Time Transaction Feed -**Empty Inbox Handling**: Protocol accounts for execution halts due to exhausted inbox. +The Sequencer immediately publishes your transaction through its **real-time feed**, providing instant visibility to all nodes in the network. This feed serves multiple critical functions: -**Time Limits**: Each participant has approximately one week total time allowance. +- **Immediate Confirmation**: You receive instant feedback that your transaction has been accepted and ordered +- **State Synchronization**: All nodes stay synchronized with the latest transaction sequence +- **Soft Finality**: You can act on your transaction immediately, knowing it's been properly ordered -#### Protocol Efficiency + -The dissection protocol minimizes on-chain work by: +### Batching and Compression -- **Shape Verification**: L1 contracts only verify move structure, not correctness -- **Single-Step Proof**: Only final disputed instruction requires on-chain verification -- **Off-Chain Resolution**: Most dispute resolution occurs off-chain +The Sequencer doesn't process transactions individually. Instead, it collects multiple transactions into **batches** for efficient processing: -**Technical Advantage**: This approach enables verification of complex transactions that would be prohibitively expensive to re-execute entirely on-chain. +**Batch Formation Criteria:** -## Rollup Protocol Implementation +- **Size Threshold**: Batches are created when accumulated transactions reach a predefined size limit +- **Time Constraints**: Batches are also created based on elapsed time to prevent undue delays -This section provides detailed technical information about Arbitrum's rollup protocol implementation for developers and researchers. +**Compression Process:** +The Sequencer uses the **Brotli compression algorithm** to minimize the data that needs to be posted to Ethereum: -### Protocol Necessity +- **Dynamic Compression Levels**: Compression level adjusts based on network backlog (0-11 scale) +- **Cost Optimization**: Higher compression reduces L1 posting costs but requires more computation +- **Adaptive Strategy**: System prioritizes speed over compression when backlog is high -The rollup protocol serves three critical functions: + -1. **Execution Verification**: Prevents validators from submitting incorrect transaction execution claims -2. **Ethereum Integration**: Enables Ethereum to process Arbitrum withdrawals and cross-chain operations -3. **Security Guarantees**: Maintains Ethereum-level security through cryptographic verification +### Posting to Ethereum -### Protocol Architecture +Once batched and compressed, your transaction data is posted to Ethereum through the **Sequencer Inbox Contract**. The Sequencer uses two primary methods: -The rollup protocol operates through a chain of "assertions" - cryptographic claims about Arbitrum state transitions: +**1. Blob Transactions (EIP-4844)** -- **Assertion Creation**: Validators submit claims about transaction execution results -- **Challenge Mechanism**: Other validators can challenge incorrect assertions -- **Dispute Resolution**: Interactive fraud proofs resolve disagreements -- **Final Confirmation**: Ethereum records confirmed assertions for cross-chain operations +- **Default Method**: When Ethereum supports EIP-4844 +- **Cost Efficient**: Blobs provide cheaper data inclusion than calldata +- **Scalable**: Enables handling of large transaction volumes -### Technical Implementation +**2. Calldata Transactions** -**Key Principle**: The protocol does not determine transaction outcomes - it only confirms execution results that have already been determined. Transaction results are fixed upon processing, and the protocol ensures consensus about these results. +- **Fallback Method**: When blob fees are high or EIP-4844 unavailable +- **Direct Inclusion**: Transaction data included directly in calldata +- **Compatibility**: Works with all Ethereum configurations -**Implementation Details**: The protocol functions as a verification layer that confirms the authenticity and correctness of state transitions without modifying the underlying execution results. + -### BoLD: Permissionless Validation Protocol +**Why This Matters**: The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum, while the dual posting strategy ensures optimal cost efficiency under varying network conditions. -BoLD (Bounded Liquidity Delay) implements a permissionless validation system that enhances Arbitrum's decentralization and security: +## Chapter 3: State Transition Function - Where Execution Happens -**Technical Specifications**: +Now that your transaction has been ordered and batched, it's time for execution. This happens in the **State Transition Function (STF)**—the heart of Arbitrum's execution engine. -- **Permissionless Access**: Any party can participate in validation without authorization -- **Time-Bounded Disputes**: Disputes are guaranteed to resolve within 6.4 days -- **Enhanced Security**: Improved guarantees for withdrawals and cross-chain messaging -- **Decentralization**: Progresses toward Stage 2 rollup status +### The Geth Integration: Complete EVM Compatibility -**Protocol Implementation**: Validators participate by staking bonds to make execution claims. Honest validators recover their bonds, while dishonest validators forfeit their stakes. +Arbitrum achieves full Ethereum compatibility through a sophisticated three-layer architecture: -**Current Status**: BoLD is operational on Arbitrum One, Nova, and Sepolia. While designed for permissionless operation, validators are currently allowlisted as part of Arbitrum's progressive decentralization strategy. - -**Technical Significance**: BoLD enhances Arbitrum's decentralization by enabling permissionless participation in network security, similar to Ethereum's validation model. - -:::info More information - -For detailed information about BoLD, see the [BoLD gentle introduction](/how-arbitrum-works/bold/gentle-introduction.mdx) and [BoLD technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx). - -::: - -## The Rollup chain - -The Rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum Rollup protocol manages and oversees. - -Validators can propose assertions. New assertions will be **unresolved** at first. Eventually, every assertion will be **resolved**, either by being **confirmed** or **rejected**. The confirmed assertions make up the confirmed history of the chain. - -Each assertion contains: - -- the assertion number -- the predecessor assertion number: assertion number of the last assertion before this one that is (claimed to be) correct -- the number of L2 blocks that have been created in the chain's history -- the number of inbox messages that have been consumed in the chain's history -- a hash of the outputs produced over the chain's history - -Except for the assertion number, the contents of the assertion consist solely of claims made by the assertion's proposer. Arbitrum doesn't initially know whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the assertion. If one or more of these fields are incorrect, the protocol should eventually reject the assertion. - -An assertion implicitly claims that its predecessor assertion is correct. This claim implies, transitively, that an assertion implicitly claims the correctness of a complete history of the chain: a sequence of ancestor assertions that reaches back to the birth of the chain. - -An assertion also implicitly claims that its older siblings (older assertions with the same predecessor, if any) are incorrect. If two assertions are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. - -The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's bonder. (More on [challenges](#challenges) below.) - -In the normal case, the Rollup chain will look like this: - - - -On the left, representing an earlier part of the chain's history, we have confirmed assertions. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed assertions, assertion 94, is referred to as the "latest confirmed assertion." On the right, we see a set of newer proposed assertions. The protocol can't yet confirm or reject them, because their deadlines have not yet expired. The oldest assertion whose fate remains to be determined, assertion 95, is referred to as the "first unresolved assertion." - -Notice that a proposed assertion can build on an earlier proposed assertion. This "building" allows validators to continue proposing assertions without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed assertions will be valid, so they will all eventually be accepted. - -Here's another example of what the chain state might look like if several validators are being malicious. It's a contrived example, designed to illustrate various cases that can arise in the protocol, all condensed into a single scenario. - - - -A lot is going on here, so let's unpack it. - -- Assertion 100 has been confirmed -- Assertion 101 claimed to be a correct successor to assertion 100, but 101 was rejected (hence the X drawn in it) -- Assertion 102 was eventually confirmed as the correct successor to 100 -- Assertion 103 received confirmation and is now the latest confirmed assertion -- Assertion 104 is the proposed successor to assertion 103, and 105 is the proposed successor to 104. 104 was rejected as incorrect, and as a consequence, 105 was rejected because its predecessor was rejected -- Assertion 106 is unresolved. It claims to be a correct successor to assertion 103, but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved assertion -- Assertions 107 and 108 claim to chain from 106. They are also unresolved. If 106 rejects, 107 and 108 will automatically reject too -- Assertion 109 disagrees with assertion 106, because they both claim the same predecessor. Eventually, 109 or 106 will be rejected, but the protocol hasn't yet resolved them. -- Assertion 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will also be rejected automatically. -- Assertion 111 claims to follow 104. 111 will be rejected because its predecessor has already been denied. However, it hasn't been rejected yet, because the protocol resolves assertions in assertion number order. Therefore, the protocol must resolve assertions 106 through 110 in order before it can resolve assertion 111. After 110 has resolved, 111 can be rejected immediately. - -Again, this is very unlikely in practice. In this diagram, at least four parties must have bonded on wrong assertions, and when the dust settles, at least four parties will have lost their bonds. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram aims to illustrate the variety of situations that are possible in principle and how the protocol would address them. - -### Bonding - -At any given time, some validators will be bonders, and some will not. Bonders deposit funds that are held by the Arbitrum Layer 1 contracts, and if the bonder loses a challenge, the contract will confiscate the funds. Nitro chains accept bonds in `ETH`. - -A single bond can cover a chain of assertions. Every bonder places a bond on the latest confirmed assertion, and if you bond on an assertion, you can also bond on one successor of that assertion. You might bond to a sequence of assertions that represent a single, coherent claim about the correct history of the chain. A single bond suffices to commit you to that sequence of assertions. - -To create a new assertion, you must be a bonder, and you must already have a bond on the predecessor of the new assertion you're creating. The bond requirement for assertion creation ensures that anyone who makes a new assertion has something to lose if that assertion becomes rejected. - -The protocol tracks the current required bond amount. Normally, this will equal the base bond amount, which is a parameter of the Nitro chain. But if the chain has been slow to make progress lately, the required bond will increase, as described in more detail below. - -The rules for bonding are as follows: - -- If you have no active bond, you can bond on the latest confirmed assertion. When doing this, you deposit the current minimum bond amount. -- If you have a bond on an assertion, you can also add your bond to any one successor of that assertion. (The protocol tracks the assertion number that you have a bond with, and lets you add your bond to any successor of that assertion, updating your maximum to that successor.) This new assertion doesn't require you to place a new bond. - - A special case of adding your bond to a successor assertion is when you create a new assertion as a successor to an assertion for which you already have a bond. -- If you're bonded only on the latest confirmed assertion (and possibly earlier assertions), you or anyone else can ask to have your bond refunded. Your bonded funds will be returned to you, and you will no longer be a bonded individual. -- If you lose a challenge, your bond is removed from all assertions, and you forfeit your bonded funds. - -Notice that once you have a bond on an assertion, there is no way to unbond. You are committed to that assertion. Eventually, one of two things will happen: that assertion will be confirmed, or you will lose your bond. The only way to get your bond back is to wait until all of the assertions to which you have a bond are confirmed. - -#### Setting the current minimum bond amount - -One detail we deferred earlier is determining the current minimum bond amount. Typically, this is just equal to the base bond amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming assertions, the bond requirement will escalate temporarily. Specifically, the base bond amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved assertion passed. This bond amount ensures that if malicious parties place false bonds to try to delay progress (despite losing those bonds), the bond requirement increases. Consequently, the cost of such a delay attack increases exponentially. As assertion resolution starts advancing again, the bond requirement will decrease. - -### Rules for confirming or rejecting assertions - -The rules for resolving assertions are fairly simple. -The first unresolved assertion can be confirmed if: - -- the assertion's predecessor is the latest confirmed assertion, and -- the assertion's deadline has passed, and -- there is at least one bonder, and -- all bonders are bonded on the assertion - -The first unresolved assertion will be rejected if: - -- The assertion's predecessor has been rejected, or -- All the following are true: - - The assertion's deadline has passed, and - - There is at least one bonder, and - - No bonder is bonded on the assertion - -A consequence of these rules is that once the first unresolved assertion's deadline has passed (and assuming there is at least one bonder bonded on something other than the latest confirmed assertion), the only way the assertion can be unresolvable is if at least one bonder is bonded on it and at least one bonder is bonded on a different assertion with the same predecessor. If this happens, the two bonders disagree about which assertion is correct. It's time for a challenge, to resolve the disagreement. - -### Challenges - -Suppose the Rollup chain looks like this: - - - -Assertions 93 and 95 are siblings (they both have 92 as a predecessor). Alice has a bond on 93, and Bob has a bond on 95. - -At this point, we know that Alice and Bob disagree about the correctness of assertion 93, with Alice committed to 93 being correct and Bob committed to 93 being incorrect. (Bob has a bond on 95, and 95 implicitly claims that 92 is the last correct assertion before it, which implies that 93 must be incorrect.) - -Whenever two bonders have bonds on sibling assertions, and neither of those bonders is already in a challenge, anyone can start a challenge between the two. The Rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's bond. The loser will also no longer be bound to their assertion. - -The challenge is a game in which Alice and Bob alternate moves, with an Ethereum contract as the referee. Alice, the defender, moves first. - -The game will operate in two phases: dissection, followed by a one-step proof. Dissection will narrow down the size of the dispute until it is a dispute about just one instruction of execution. Then the one-step proof will determine who is right about that one instruction. - -We'll describe the dissection part of the protocol twice. First, we'll give a simplified version that is easier to understand but less efficient. We will then explain how the real version differs from the simplified one. - -:::info More information - -For further reading on Assertions and how to create them, refer to the [Assertion deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). - -::: - -### Dissection protocol: Simplified version - -Alice is defending the claim that starting with the state in the predecessor assertion, the state of the Virtual Machine can advance to the state specified in assertion `A`. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that the execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. - -Alice's first move requires her to dissect her claims about intermediate states between the beginning (zero instructions executed) and the end (`N` instructions executed). Therefore, we require Alice to divide her claim in half and post the state at the halfway point, after executing `N/2` instructions. - -Now Alice has effectively bisected her `N`-step assertion into two `N/2`-step assertions. Bob has to point to one of those two half-size assertions and claim it is wrong. - -At this point, we're effectively back in the original situation: Alice having asserted that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds, Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must provide a one-step proof, which the EthBridge will verify. - -### Why dissection correctly identifies a cheater - -Before discussing the complexities of the real challenge protocol, let's pause to understand why the simplified version of the protocol is correct. Here, correctness means two things: - -1. If Alice's initial claim is correct, Alice can always win the challenge, and -2. If Alice's initial claim is incorrect, Bob can always win the challenge. - -To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending an accurate claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove so that the claim will be provable and Alice can win the challenge. - -To prove (2), observe that if Alice's initial claim is incorrect, this can only be because her claimed endpoint after `N` steps is incorrect, then when Alice offers her midpoint state claim, that midpoint claim is either correct or incorrect. If it's incorrect, then Bob can challenge Alice's first-half claim, which will be incorrect. If Alice's midpoint state claim is correct, then her second-half claim must be incorrect so that Bob can challenge that. So whatever Alice does, Bob will be able to challenge an incorrect half-size claim. At each stage of the protocol, Bob can identify an incorrect claim to challenge. Ultimately, Alice will have an incorrect one-step claim to prove, which she will be unable to do, allowing Bob to win the challenge. - -(If you're a stickler for mathematical precision, it should be clear how these arguments can be turned into proofs by induction on `N`.) - -### The real dissection protocol - -The real dissection protocol is conceptually similar to the simplified one described above, but with several modifications that enhance efficiency or address necessary corner cases. Here is a list of the differences. - -- **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an assertion, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute shifts to a dispute about a single execution of the State Transition Function, or in other words, about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). -- **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This division requires posting `K-1` intermediate claims at points evenly spaced through the claimed execution, which reduces the number of rounds by a factor of log(`K`)/log(`2`). -- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This segmentation reduces the number of moves in the game by an additional factor of `2`, because the size is cut by a factor of `K` for every move, rather than for every two moves. -- **Deal with the empty-inbox case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might halt, or it might have to wait because its inbox is exhausted, so it cannot proceed until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (except the initial claim) to claim a special end state, which means that the specified amount of execution is not possible under the current conditions. -- **Time limits**: Each player has a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Consider the time allowance to be approximately one week. - -These changes don't affect the basic correctness of the challenge protocol. They do, however, improve its efficiency and enable it to handle all the cases that can arise in practice. - -### Efficiency - -The challenge protocol design is to resolve disputes with a minimal amount of work required by the protocol (via its Layer 1 Ethereum contracts) in its role as referee. When it is Alice's turn, the protocol only needs to keep track of the time Alice uses and ensure that her move includes `K-1` intermediate points as required. The protocol doesn't need to pay attention to whether those claims are correct in any way; it only needs to know whether Alice's move "has the right shape." - -The only point where the protocol needs to evaluate a move "on the merits" is at the one-step proof, where it must examine Alice's proof to determine whether it establishes that the virtual machine transitions from the before state to the claimed after state after one step of computation. - -## Validators - -Some Arbitrum nodes will choose to act as **validators**, meaning they monitor the progress of the Rollup protocol and participate in it to advance the state of the chain securely. - -Not all nodes will choose to do this. Because the Rollup protocol doesn't dictate what the chain will do but merely confirms the correct behavior, determined by the inbox messages, a node can ignore the Rollup protocol and compute the correct behavior itself. For more on what such nodes might do, see the [Full Nodes](#full-nodes) section. - -Offchain Labs provides open source validator software, including a pre-built Docker image. - -Every validator can choose which strategy to employ, but we expect validators to follow three common strategies: - -- The **active validator** strategy tries to advance the state of the chain by proposing new assertions. An active validator is always bonded, because creating an assertion requires being bonded. A chain only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. -- The **defensive validator** strategy watches the Rollup protocol operate. If only correct assertions get proposed, this strategy doesn't bond. However, if an incorrect assertion is proposed, this strategy intervenes by posting a correct assertion or bonding to a correct assertion that another party has already posted. This strategy avoids bonding when things are going well, but if someone is dishonest, it bonds to defend the correct outcome. -- The **watchtower validator** strategy never bonds. It simply monitors the Rollup protocol and, if an incorrect assertion is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to bond will be willing to intervene to take some of the dishonest proposer's bond, and that that can happen before the dishonest assertion's deadline expires. (In practice, this will allow several days for a response.) - -Under normal conditions, validators using the defensive and watchtower strategies won't do anything except observe. A malicious actor considering whether to cheat won't be able to determine how many defensive and watchtower validators are operating incognito. Some defensive validators may announce themselves, but others won't, so a would-be attacker will always have to worry that defenders are waiting to emerge. - -The underlying protocol supports permissionless validation, meaning that anyone can participate. Currently, on Arbitrum One, validators that require a bond (i.e., active and defensive validators) are allowlisted; see the [State of Progressive Decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization). - -Who will be validators? Anyone can do it, but most people will choose not to. In practice, we expect people to validate a chain for several reasons. - -- Validators could be paid for their work by the party that created the chain or someone else. A chain is configurable, allowing a portion of the funds from user transaction fees to be paid directly to validators. -- Parties that have significant assets bonded on a chain, such as dApp developers, exchanges, power-users, and liquidity providers, may choose to validate to protect their investment. -- Anyone who chooses to validate can do so. Some users will probably choose to validate to protect their interests or just to be good citizens. But ordinary users don't need to validate, and we expect that the vast majority of users won't. - -## ArbOS - - - -ArbOS is a trusted "system glue" component that acts as the hypervisor, facilitating the State Transition Function (execution environment) on the child chain. ArbOS provides functions necessary for a Layer 2 system, including cross-chain communication, resource accounting, Layer 2-related fee economics, and chain management. - -### Why ArbOS? - -In Arbitrum, much of the work that would otherwise have to be done expensively at Layer 1 is instead done by ArbOS, trustlessly performing these functions at the speed and low cost of Layer 2. - -Supporting these functions in Layer 2 trusted software, rather than building them into the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. In addition, ArbOS also offers significant advantages in flexibility, as Layer 2 code is easier to evolve or customize for a particular chain than a Layer 1-enforced architecture would be. - -### Stylus Integration - -ArbOS now supports **Stylus**, which enables WebAssembly-based smart contracts alongside traditional EVM contracts. This integration allows developers to write high-performance contracts in Rust, C, and C++ while maintaining full interoperability with existing Solidity contracts. - -**Key Stylus features:** + -- **WASM Runtime**: Executes WebAssembly contracts with enhanced performance -- **Host I/O Operations**: Efficient blockchain state access through specialized operations -- **Gas Pricing**: Multi-dimensional pricing model accounting for computation, memory, and I/O -- **Caching System**: Advanced caching for frequently accessed contracts +**Layer 1: Geth Core** - +- The foundation consists of the core Geth components that handle EVM execution +- Ensures behavioral consistency with Ethereum +- Provides proven security through battle-tested code -ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available for Arbitrum chains. +**Layer 2: ArbOS (Arbitrum Operating System)** -:::info More information +- Provides Layer 2-specific functionality including cross-chain messaging +- Handles fee accounting and gas price management +- Manages deposits, withdrawals, and advanced features like Stylus -For detailed information about ArbOS and Stylus, see the [ArbOS deep dive](/how-arbitrum-works/deep-dives/arbos.mdx). +**Layer 3: Node Interface** -::: +- Handles RPC connections and API requests +- Provides Ethereum-compatible node functionality for client applications -## Full nodes +### Transaction Processing Flow -As the name suggests, full nodes in Arbitrum play the same role as full nodes in Ethereum: they maintain the state of the chain and provide an API that others can use to interact with the chain. +When your transaction reaches the STF, it follows this execution path: -Arbitrum full nodes normally "live at Layer 2," which means that they don't worry about the Rollup protocol but treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. +1. **Transaction Validation**: ArbOS validates your transaction format and checks sufficient funds +2. **Gas Charging**: The system charges for both L2 execution and L1 data posting costs +3. **EVM Execution**: Geth processes your transaction according to standard EVM semantics +4. **State Updates**: ArbOS updates Layer 2-specific state and handles cross-chain operations +5. **Receipt Generation**: The system produces transaction receipts and logs -## The Sequencer +### Stylus Integration: Beyond EVM -The Sequencer is a specially designated full node, which has limited power to control the ordering of transactions. This ordering allows the Sequencer to guarantee the results of user transactions immediately, without requiring any wait for events on Ethereum. So, there's no need to wait five minutes or so for block confirmations—and no need to wait even 15 seconds for Ethereum to make a block. +If your transaction interacts with a **Stylus contract** (WebAssembly-based), the execution flow differs: -Clients interact with the Sequencer in the same way they would with any full node, for example, by providing their wallet software with a network URL that happens to point to the Sequencer. +- **WASM Runtime**: ArbOS routes execution to the WASM runtime instead of the EVM +- **Host I/O Operations**: Stylus contracts use specialized host I/O calls for blockchain state access +- **Enhanced Performance**: Stylus contracts can execute 10-70x faster than EVM equivalents +- **Full Interoperability**: Stylus contracts can seamlessly call EVM contracts and vice versa -Currently, on the Arbitrum One and Arbitrum Nova chains, the Sequencer is run by Offchain Labs. +**Why This Matters**: The Geth integration ensures that existing Ethereum applications work without modification, while ArbOS adds Layer 2 capabilities and Stylus enables high-performance alternatives for new applications. -### Enhanced Sequencer Features +## Chapter 4: Finality - From Soft to Hard -The modern Arbitrum Sequencer includes several advanced features: +Your transaction now has two levels of finality, each serving different purposes in Arbitrum's security model. -- **Blob Support**: Uses EIP-4844 blobs for more efficient batch posting when available -- **Dynamic Compression**: Adjusts compression levels based on network conditions and backlog -- **Timeboost Integration**: Supports advanced transaction ordering policies for MEV capture -- **Improved Batching**: More efficient transaction batching and posting mechanisms +### Soft Finality: Immediate Confirmation -:::info More information +The moment the Sequencer includes your transaction in its feed, you achieve **soft finality**: -For detailed information about the Sequencer, see the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx). +- **Instant Feedback**: You receive immediate confirmation that your transaction has been accepted +- **Sequencer Promise**: The Sequencer commits to including your transaction in a specific order +- **User Experience**: You can act on your transaction immediately without waiting -::: +**Trust Model**: Soft finality relies on the Sequencer's honesty and availability. While this provides excellent user experience, it's not cryptographically secured. -### Instant confirmation +### Hard Finality: Cryptographic Security -Without a Sequencer, a node can predict the results of a client transaction. However, it cannot determine the order of transactions in the inbox, as it lacks control over how these transactions are arranged compared to those submitted by other nodes. +**Hard finality** is achieved when your transaction's batch is posted to and confirmed on Ethereum: -The Sequencer does have control over ordering, allowing it to assign its clients' transactions a position in the inbox queue, thereby ensuring that it can determine the results of client transactions immediately. The Sequencer's power to reorder has limits (see below for details), but it does have more power than anyone else to influence transaction ordering. +- **Ethereum Security**: Your transaction inherits Ethereum's consensus security +- **Data Availability**: All transaction data is publicly available on Ethereum +- **Irreversibility**: Once confirmed, your transaction cannot be reversed -### Inboxes, fast and slow +**Timeline**: Hard finality typically takes 10-20 minutes, depending on Ethereum block times and batch posting frequency. -When we add a Sequencer, the operation of the inbox changes: +### The Security Guarantee -- Only the Sequencer can put new messages directly into the inbox. The Sequencer tags the messages it is submitting with an Ethereum block number and timestamp. (ArbOS ensures that these are non-decreasing, adjusting them upward if necessary to avoid decreases.) -- Anyone else can submit a message, but messages submitted by non-Sequencer nodes will go into the "delayed inbox" queue (managed by an L1 Ethereum contract). - - Messages in the delayed inbox queue will wait there until the Sequencer chooses to "release" them into the main inbox, where they will be added to the end of the inbox. A well-behaved Sequencer will typically release delayed messages after about ten minutes, for reasons explained below. - - Alternatively, if a message has been in the delayed inbox queue for longer than a maximum delay interval (currently 24 hours on Arbitrum One), then anyone can force it to be promoted to the main inbox. (This ensures that the Sequencer can only delay messages but can't censor them.) +This dual-finality model provides the best of both worlds: -### If the Sequencer is well-behaved +- **Fast User Experience**: Soft finality enables immediate transaction confirmation +- **Cryptographic Security**: Hard finality provides Ethereum-level security guarantees +- **Censorship Resistance**: Alternative submission paths ensure your transaction can always be processed -A well-behaved Sequencer will accept transactions from all requesters and treat them fairly, providing each one with a promised transaction result as quickly as possible. +**Why This Matters**: You get immediate feedback for optimal user experience while maintaining the security guarantees that make Arbitrum suitable for high-value transactions. -It will also minimize the delay it imposes on non-Sequencer transactions by promptly releasing delayed messages, consistent to provide strong guarantees of transaction results. Specifically, if the Sequencer believes that 40 confirmation blocks are required to achieve confidence in finality on Ethereum, then it will release delayed messages after 40 blocks. This belief is enough to ensure that the Sequencer knows exactly which transactions will precede its current transaction, because those preceding transactions have finality. There is no need for a benign Sequencer to delay non-Sequencer messages more than that, so it won't. +## Chapter 5: Validation and Dispute Resolution - Ensuring Correctness -However, this belief does mean that transactions that go through the delayed inbox will take longer to get finality. Their time to finality will double (roughly), because they will have to wait one finality period for promotion, then another finality period for the Ethereum transaction that promoted them to achieve finality. +Now that your transaction has been executed, how does Arbitrum ensure it was processed correctly? This is where the **BoLD validation system** comes into play. -This delay is the tradeoff of having a Sequencer: if your message uses the Sequencer, finality is `C` blocks faster; but if your message doesn't use the Sequencer, finality is `C` blocks slower. This balance is usually a good tradeoff, as most transactions will utilize the Sequencer, and because the practical difference between instant and 10-minute finality is greater than the difference between 10-minute and 20-minute finality. +### The BoLD Protocol: Permissionless Validation -A Sequencer is generally a win if the Sequencer is well-behaved. +Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute protocol that enables **permissionless validation**. Unlike traditional optimistic rollups, BoLD allows anyone to participate in validation without permission while guaranteeing time-bounded dispute resolution. -### If the Sequencer is malicious +**Key BoLD Features:** -A malicious Sequencer, on the other hand, could cause some pain. If it refuses to handle your transactions, you must go through the delayed inbox, which has a longer delay. A malicious Sequencer has the power to front-run everyone's transactions so that it could profit greatly at users' expense. +- **Permissionless Validation**: Anyone can validate and challenge assertions +- **Time-Bounded Disputes**: Guaranteed resolution within 6.4 days maximum +- **Trustless Cooperation**: Multiple honest parties can defend the same correct state +- **All-vs-All Battle Royale**: Single honest party can defend against unlimited malicious challengers +- **Stage 2 Rollup**: Enables Arbitrum to achieve full decentralization -On Arbitrum One, Offchain Labs currently operates a well-behaved Sequencer—we promise! This Sequencer will be useful, but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. + -Since a trusted party will initially run the Sequencer and it will be decentralized later, we haven't built a mechanism to punish a misbehaving Sequencer directly. We're asking users to trust the centralized Sequencer initially, until we transition to decentralized fair sequencing later. +### Assertions: Claims About Chain State -### Decentralized fair sequencing +Validators post **assertions**—claims about Arbitrum's execution state—to Ethereum. Each assertion contains: -Viewed from 30,000 feet, decentralized fair sequencing isn't too complicated. Instead of being a single centralized server, the Sequencer is a committee of servers. As long as a large enough supermajority of the Committee is honest, the Sequencer will establish a fair ordering over transactions. +- **Child chain block hash**: The claimed final state +- **History commitment**: Merkle root of all intermediate block hashes +- **Batch number**: Corresponding Arbitrum batch +- **Inbox message count**: Messages consumed during execution -Achieving this is more complicated. Research by a team at Cornell Tech, including Offchain Labs and Co-founder Steven Goldfeder, developed the first-ever decentralized fair sequencing algorithm. With some improvements currently under development, these concepts will form the basis for our longer-term solution: a fair, decentralized Sequencer. +**Assertion Bonding**: Validators must bond **3600 ETH** to post assertions. This bond is refundable when their assertion is confirmed, but forfeited if proven incorrect. -## Bridging +### The Challenge Process: Multi-Level Dispute Resolution -We have already covered how users interact with L2 contracts—they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2—specifically how an L1 contract calls an L2 contract, and vice versa. +When validators disagree about assertions, BoLD uses a sophisticated **multi-level challenge system**: -The L1 and L2 chains operate asynchronously, so it is not possible to make a cross-chain call that produces a result within the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was submitted successfully for later execution). +**Level 1: Block Challenges** -### L1 contracts can submit L2 transactions +- Validators disagree about specific Arbitrum blocks +- Create **edges** (history commitments) covering disputed block ranges +- Use interactive bisection to narrow disagreement to a single block -An L1 contract can submit an L2 transaction, just like a user would, by calling the Nitro chain's inbox contract on Ethereum. This L2 transaction will run later, producing results that will not be available to the L1 caller. The transaction will execute at L2, but the L1 caller won't be able to see any results from the L2 transaction. +**Level 2: Big-Step Challenges** -The advantage of this method is that it is simple and has relatively low latency. The disadvantage compared to the other method we'll describe soon is that the L2 transaction might revert if the L1 caller doesn't set the L2 gas price and maximum gas amount correctly. Because the L1 caller can't see the result of its L2 transaction, it can't be sure that its L2 transaction will succeed. +- Disagree about execution within a single block +- Challenge bonds: **555 ETH** required +- Narrow disagreement to ranges of WASM execution steps -Doing this would introduce a serious problem for certain types of L1-to-L2 interactions. Consider a transaction that involves depositing a token on L1 to be made available at a specific address on L2. If the L1 side succeeds, but the L2 side reverts, you've just sent some tokens to the L1 inbox contract that are unrecoverable on either L2 or L1. Not good. +**Level 3: Small-Step Challenges** -### L1 to L2 ticket-based transactions +- Disagree about specific WASM execution steps +- Challenge bonds: **79 ETH** required +- Narrow disagreement to a single execution step -Fortunately, we have another method for L1 and L2 calls, which is more robust against gas-related failures, that uses a ticket-based system. The idea is that an L1 contract can submit a "retryable" transaction. The Nitro chain will try to run that transaction. If the transaction is successful, no further action is required. But if the transaction fails, Nitro will create a "ticketID" that identifies that failed transaction. Later, anyone can call a special pre-compiled contract at L2, providing the `ticketID`, to attempt to redeem the ticket and re-execute the transaction. +**One-Step Proof**: Final verification of the disputed computation step on Ethereum -When saving a transaction for retry, Nitro records the sender's address, destination address, callvalue, and calldata. All of this gets saved, and the callvalue is deducted from the sender's account and (logically) attached to the saved transaction. +### Timers and Confirmation: Time-Bounded Resolution -If the redemption is successful, the transaction completes, a receipt is issued, and the `ticketID` is canceled and can't be used again. If the redemption fails, for example, because the packaged transaction fails, the redemption reports failure, and the `ticketID` remains available for redemption. +BoLD's key innovation is **time-bounded dispute resolution** through a sophisticated timer system: -Normally, the original submitter will attempt to ensure their transaction succeeds immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only requires a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop, which others can redeem later. +**How Timers Work:** -Submitting a transaction in this way carries a price in `ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. +- **Unrivaled Timer**: Each edge has a timer that ticks up when no competing edge exists +- **Inherited Timer**: Edges inherit time from their children (recursive definition) +- **Confirmation by Time**: Edges are automatically confirmed when timer reaches 6.4 days +- **Challenge Period**: Maximum time for any dispute to resolve -When the ticket is redeemed, the pre-packaged transaction runs with the sender and origin equal to the original submitted values, and with the destination, callvalue, and calldata provided by the submitter at the time of submission. +**Trustless Cooperation**: Multiple honest parties can defend the same correct state without coordination. If one honest party goes offline, others can continue the defense seamlessly. -This mechanism is more cumbersome than ordinary L1 to L2 transactions. However, it has the advantage that the submission cost is predictable and the ticket will always be available for redemption if the submission cost is paid. As long as a user is willing to redeem the ticket, the Layer 2 transaction will eventually be executed and will not be deleted. +### Interactive Fraud Proofs: Efficient Dispute Resolution -:::info More information +BoLD uses **interactive fraud proofs** to efficiently resolve disputes without re-executing entire transactions: -For a deeper look into L1-to-L2 Messaging, read more in the [deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). +**The Process:** -::: +1. **Edge Creation**: Validators create edges (history commitments) for disputed ranges +2. **Interactive Bisection**: Parties iteratively narrow disagreement through binary search +3. **Multi-Level Resolution**: Disputes progress through block → big-step → small-step levels +4. **One-Step Proof**: Final verification of single computation step on Ethereum +5. **Time-Based Confirmation**: Honest edges are confirmed by time if unchallenged -### L2 to L1 ticket-based calls +**Why This Works:** -Calls from L2 and L1 operate similarly, utilizing a ticket-based system. An L2 contract can call a method of the precompiled [`ArbSys`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) contract to send a transaction to L1. When the execution of the L2 transaction containing the submission receives confirmation on L1 (potentially some days later), a ticket gets created in the L1 outbox contract. The ticket is triggerable by anyone who calls an L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. +- **Deterministic State**: Only one correct state exists for any given input +- **Merkle Commitments**: Efficient proof of state transitions without full data +- **Economic Incentives**: Malicious parties lose bonds, honest parties recover them +- **Parallel Defense**: Multiple honest parties can defend simultaneously -These L2-to-L1 tickets have an unlimited lifetime, until they're successfully redeemed. No rent is required, as a record of the ticket (actually a Merkle hash of the tickets) gets stored on Ethereum storage, which does not require rent. (L2 transaction fees cover the cost of allocating storage for the ticket Merkle roots.) +### WAVM: WebAssembly for Fraud Proofs -:::info More information +For fraud proof verification, Nitro uses a modified version of WebAssembly called **WAVM (WebAssembly Arbitrum Virtual Machine)**. WAVM differs from standard WASM in several key ways: -For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) deep dive. +**Technical Modifications:** -::: +- **Feature Removal**: Eliminates WASM features not generated by the Go compiler +- **Restriction Implementation**: Removes floating-point instructions and nested control flow +- **Fixed-Cost Operations**: Transforms variable-time instructions into fixed-cost constructs +- **Blockchain Integration**: Adds specialized opcodes for blockchain environment interaction -## Gas and Fees +**ReadPreImage Instruction**: The most significant addition is the ReadPreImage instruction, which enables hash-based data retrieval. This instruction takes a hash H and offset I, returning the data word at offset I of the preimage of H. This enables the "hash oracle trick" where the system stores only Merkle hashes while relying on protocol participants to maintain full data structures. -Gas is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. +**Why WAVM Matters**: WAVM enables efficient fraud proof verification while maintaining the security and determinism required for dispute resolution. The ReadPreImage instruction allows the system to work with hash-based data structures without storing the full data on-chain. -### Speed Limit +### Validator Strategies in BoLD -The security of Nitro chains relies on the assumption that validators can verify assertions and respond with challenges if necessary. This requirement sets an effective speed limit on chain execution: the chain cannot progress faster than a validator can emulate its execution. +BoLD validators can adopt different strategies based on their resources and goals: -**Technical Implementation**: If assertions are published faster than the speed limit, their deadlines extend further into the future. Due to protocol limits on deadline extension, this eventually slows down new assertions, enforcing the effective speed limit. +**Active Proposer Strategy**: Posts assertions to advance the chain. Requires **3600 ETH** bond and runs in `MakeNodes` mode. Only one active proposer needed for chain progress. -**Speed Limit Parameter**: Currently set to 7,000,000 gas per second on Arbitrum One. This parameter must be set accurately to ensure security while maximizing throughput. +**Defensive Validator Strategy**: Monitors for invalid assertions and intervenes when needed. Can bond to correct assertions or participate in challenges. Runs in `Defensive` or `StakeLatest` mode. -### L2 Gas Fee Algorithm +**Watchtower Validator Strategy**: Monitors the protocol without bonding. Detects and reports invalid assertions but takes no on-chain action. Requires no funds and is the default mode for all nodes. -L2 gas fees operate similarly to Ethereum's EIP-1559 mechanism using an exponential pricing model: +**Challenge Participant Strategy**: Participates in ongoing challenges by posting challenge bonds (555/79 ETH) and making moves in dispute resolution. -**Algorithm Components**: +### Trustless Bonding Pools: Democratizing Validation -- **Speed Limit**: Target gas per second (7,000,000 on Arbitrum One) -- **Gas Backlog**: Tracks accumulated gas usage over time -- **Base Fee Calculation**: Exponential function of backlog: F = exp(-a(B-b)) +To address the high bond requirements, BoLD includes **trustless bonding pools**: -**Technical Implementation**: +**How Bonding Pools Work:** -- Gas consumption adds to backlog -- Each second, speed limit is subtracted from backlog -- Backlog cannot go below zero -- Base fee adjusts exponentially based on backlog level +- **Crowdsourced Funding**: Multiple parties can pool funds to meet bond requirements +- **Trustless Operation**: No need to trust other pool participants +- **Automatic Deployment**: Validator software can auto-deploy pools when needed +- **Proportional Rewards**: Participants receive rewards proportional to their contribution -**Parameters**: +**Pool Types:** -- **a**: Controls price escalation rate with backlog -- **b**: Allows small backlog before price escalation begins +- **Assertion Pools**: For posting assertions (3600 ETH total) +- **Challenge Pools**: For participating in challenges (555/79 ETH per level) -### L1 Calldata Fees +### Economic Security and Resource Ratios -L1 calldata fees compensate batch posters for Ethereum posting costs: +BoLD uses sophisticated economic mechanisms to ensure security: -**Fee Calculation**: +**Bond Sizes (Arbitrum One):** -1. **Size Estimation**: Calculate transaction's contribution to compressed batch -2. **Price Multiplication**: Multiply by current price per estimated byte -3. **Gas Conversion**: Convert L1 cost to L2 gas units using current base fee +- **Assertion Bonds**: 3600 ETH (one-time to become proposer) +- **Big-Step Challenge Bonds**: 555 ETH per challenge +- **Small-Step Challenge Bonds**: 79 ETH per challenge -**Dynamic Pricing**: Algorithm adjusts price per byte to align collected fees with batch poster costs. +**Resource Ratio**: BoLD achieves a **6.46x resource ratio**, meaning malicious parties must spend 6.46x more than honest parties to attack the system. -**Scope**: Only applies to Sequencer transactions; delayed inbox transactions pay Ethereum gas directly. +**Economic Incentives:** -## Fees +- **Honest Parties**: Recover all bonds + 1% defender's bounty + service fees +- **Malicious Parties**: Lose all bonds (sent to DAO treasury) +- **Spam Prevention**: High costs deter delay attacks and spam -User transactions pay fees to cover the operating costs of the chain. These fees are assessed and collected by ArbOS at L2 (denominated in `ETH`). +**Why This Matters**: BoLD eliminates delay attacks while enabling true permissionless validation, making Arbitrum more decentralized and secure than ever before. -Two types of resources can incur fees during a transaction: +## Chapter 6: Cross-Chain Communication - Bridging Worlds -- **L2 gas**: an Ethereum-equivalent amount of gas, as required to execute the transaction on the Nitro chain -- **L1 calldata**: a fee per unit of L1 calldata attributable to the transaction, only chargeable if the transaction came in via the Sequencer, and is paid to the Sequencer to cover its costs +Your transaction might involve moving assets or data between Ethereum and Arbitrum. Let's explore how Arbitrum handles cross-chain communication. -## L2 gas fees +### L1 to L2 Messaging: From Ethereum to Arbitrum -L2 gas fees work very similarly to gas on Ethereum. A transaction consumes a certain amount of gas, which gets multiplied by the current base fee to determine the L2 gas fee for the transaction.. +When you want to send assets or data from Ethereum to Arbitrum, you have several options: -A version of the "exponential mechanism" sets the L2 base fee, which has been widely discussed in the Ethereum community and shown to be equivalent to [Ethereum's EIP-1559 gas pricing mechanism](https://eips.ethereum.org/EIPS/eip-1559). +**1. Native Token Bridging** -The algorithm compares gas usage against a parameter called the "speed limit," which is the target amount of gas per second that the chain can handle sustainably over time. (Currently, the speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, that gas gets added to the backlog. Whenever the clock ticks one second, the speed limit gets subtracted from the backlog; however, the backlog can never go below zero. +- **ETH Deposits**: Direct ETH deposits through the bridge contract +- **ERC-20 Bridging**: Token transfers using the canonical bridge +- **Custom Gas Tokens**: Support for chains using custom gas tokens -Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage, as usage exceeds the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit, allowing for the accommodation of more gas usage. +**2. Retryable Tickets** -To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a` and `b` are suitably chosen constants: `a` controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. +- **Atomic Operations**: L1 transactions that trigger L2 execution +- **Guaranteed Execution**: If initial execution fails, tickets can be retried +- **Gas Management**: Predictable costs with automatic retry mechanisms +- **Ticket Lifecycle**: Tickets remain valid for approximately one week and can be redeemed by anyone -### L1 calldata fees +**3. Direct Messaging** -L1 calldata fees exist because the Sequencer, or the batch poster, which posts the Sequencer's transaction batches on Ethereum, incurs costs in L1 gas to post transactions on Ethereum as calldata. Funds collected in L1 calldata fees are credited to the batch poster to cover its costs. +- **Signed Messages**: From EOAs with signature verification +- **Unsigned Messages**: From contracts with address aliasing for security -Every transaction that comes in through the Sequencer will pay an L1 calldata fee. Transactions that come in through the delayed inbox do not incur this fee because they don't contribute to batch posting costs. However, these transactions do pay gas fees to Ethereum when added to the delayed inbox. + -The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of the number of bytes the transaction will add to the compressed batch it is in; the formula for this calculation includes an estimate of how compressible the transaction is. +### L2 to L1 Messaging: From Arbitrum to Ethereum -Second, it multiplies the computed size estimate by the current price per estimated byte to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 base fee to translate the fee into L2 gas units. The result gets reported as the "poster fee" for the transaction. +Moving assets or data from Arbitrum back to Ethereum follows a different pattern: -The dynamic algorithm determines the price per estimated byte by comparing the total L1 calldata fees collected to the total fees paid by batch posters. It aims to align these two amounts as closely as possible. If batch posters pay less than the collected fees, the algorithm will adjust the price accordingly. Conversely, if their costs exceed the collected fees, it will result in a decrease in the price. +**The Process:** -### Total fee and gas estimation +1. **Message Creation**: Your L2 transaction calls `ArbSys.sendTxToL1()` +2. **Inclusion in Assertion**: The message is included in a rollup assertion +3. **Challenge Period**: 6.4-day window for potential challenges +4. **Manual Execution**: After confirmation, anyone can execute the message on L1 -The total fee charged for a transaction is the L2 base fee multiplied by the sum of the L2 gas used and the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a base fee limit that is below the current base fee. Ethereum also allows a "tip," but Nitro ignores this field and never collects any tips. +**Key Characteristics:** -## Cross-Chain Asset Transfer: Bridging Protocol +- **Manual Execution Required**: Ethereum doesn't support scheduled execution +- **Merkle Proofs**: Messages are proven using Merkle inclusion proofs +- **Unlimited Lifetime**: Messages persist until successfully executed -Arbitrum implements a bridging protocol that enables secure asset transfer between Ethereum and Arbitrum chains. + -### Bridge Architecture +### The Canonical Bridge Architecture -**Deposit Mechanism (Ethereum → Arbitrum):** +Arbitrum's canonical bridge uses a sophisticated three-component system: -1. Users send tokens to the bridge contract on Ethereum -2. The bridge contract locks tokens in escrow -3. Arbitrum mints equivalent tokens on the L2 -4. Users receive tokens on Arbitrum for immediate use +**1. Asset Contracts**: The actual token contracts on both chains +**2. Gateways**: Pairs of contracts that handle specific bridging logic +**3. Routers**: Contracts that route each asset to its appropriate gateway -**Withdrawal Mechanism (Arbitrum → Ethereum):** +**Security Model**: The bridge ensures that for every token locked on L1, an equivalent amount is minted on L2, and vice versa. The 7-day challenge period provides security against invalid withdrawals. -1. Users burn tokens on Arbitrum -2. The system processes withdrawal requests -3. After the challenge period, users can claim tokens on Ethereum -4. The bridge contract releases escrowed tokens +**Why This Matters**: Cross-chain communication enables seamless asset movement and data transfer between Ethereum and Arbitrum, making it feel like a single unified system while maintaining the security of both chains. -### Bridge Types +## Chapter 7: Gas and Fees - The Economics of Execution -**Standard Bridge**: Official Arbitrum bridge implementation +Throughout your transaction's journey, various fees are collected to cover the costs of processing and securing the network. -- Supports ETH and ERC-20 tokens -- Uses official Arbitrum bridge contracts -- Implements standard 7-day challenge period -- Provides maximum security guarantees +### The Two-Component Fee Model -**Custom Bridges**: Third-party implementations +Arbitrum uses a sophisticated two-component fee system: -- Built by external developers -- May implement different security models -- Often provide faster withdrawal mechanisms -- May have different trust assumptions +**1. L2 Gas Fees** -### Security Model +- **EVM Execution**: Standard gas costs for computation and storage +- **Dynamic Pricing**: Uses EIP-1559-style exponential pricing mechanism +- **Speed Limit**: 7,000,000 gas per second target on Arbitrum One +- **Backlog Management**: Gas price adjusts based on network congestion -**Challenge Period**: Withdrawals require a 7-day challenge period during which validators can challenge incorrect withdrawal requests. +**2. L1 Calldata Fees** -**Fast Withdrawals**: Some services provide immediate liquidity for withdrawals, charging fees for the convenience. +- **Data Posting Costs**: Covers the cost of posting transaction data to Ethereum +- **Compression Estimation**: Fees based on transaction's contribution to compressed batch +- **Dynamic Pricing**: Algorithm adjusts to align collected fees with actual posting costs +- **Sequencer Transactions Only**: Only applies to transactions submitted through the Sequencer -**Technical Implementation**: The bridging protocol ensures asset security through cryptographic proofs and economic incentives. +### The Speed Limit: Protecting Infrastructure -## AnyTrust: Alternative Data Availability Model +Arbitrum implements a **gas speed limit** as a protective mechanism to prevent chain infrastructure from being overloaded: -AnyTrust implements a variant of Arbitrum that reduces costs by accepting a mild trust assumption about data availability. +- **Throughput Threshold**: Currently set to 7,000,000 gas per second on Arbitrum One and Nova +- **Dynamic Pricing**: When cumulative usage exceeds the speed limit, L2 base fees rise using an EIP-1559-style algorithm +- **Infrastructure Protection**: Prevents validator nodes from experiencing loads that could cause downtime or chain halting +- **User Experience**: Ensures high-priority transactions can still be processed during congestion while deterring low-priority transactions -### Architecture Comparison +**Why This Matters**: The speed limit is fundamentally a protective mechanism. If chain load exceeds what Nitro validator nodes can process, the chain risks halting due to validator downtime. While security and liveness are always maintained through parent chain contracts, the best user experience requires validators and the sequencer to remain online. -**Standard Arbitrum (Rollup):** +### Fee Calculation Process -- Posts all transaction data to Ethereum for data availability -- Provides maximum security through cryptographic guarantees -- Used by Arbitrum One -- Higher costs due to L1 data posting requirements +When your transaction is processed, the system: -**AnyTrust:** +1. **Calculates L2 Gas**: Standard EVM gas costs for your transaction +2. **Estimates L1 Impact**: Determines your transaction's contribution to batch size +3. **Applies Dynamic Pricing**: Uses current L1 and L2 price algorithms +4. **Collects Fees**: Charges you the total amount in ETH -- Uses a Data Availability Committee (DAC) for data storage -- Accepts mild trust assumptions about committee honesty -- Used by Arbitrum Nova -- Lower costs through reduced L1 data posting +**Why This Matters**: The dual-fee model ensures that both L2 execution costs and L1 data posting costs are properly covered, while the speed limit maintains security by ensuring validators can always keep up with chain progress. -### Keysets +## Chapter 8: Advanced Features - Beyond Basic Layer 2 -Keysets specify the public keys of Committee members and signature requirements: +Arbitrum includes several advanced features that extend its capabilities beyond standard Layer 2 functionality. -**Keyset Components**: +### Stylus: WebAssembly Smart Contracts -- Number of Committee members -- BLS public key for each member -- Number of required signatures +**Stylus** enables smart contract development in multiple programming languages: -**Management**: Keysets are identifiable by hashes and managed by an L1 KeysetManager contract. The L2 chain Owner can add or remove Keysets, with L1 events emitted for recovery. +- **Performance**: 10-70x faster execution compared to EVM +- **Memory Efficiency**: 100-500x improvement in memory usage +- **Language Support**: Rust, C, C++, and other WASM-compatible languages +- **Full Interoperability**: Seamless calls between Stylus and EVM contracts -### Data Availability Certificates (DACerts) +**Technical Implementation**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, with specialized host I/O operations for blockchain state access. -DACerts provide cryptographic proof of data availability: +### Timeboost: MEV-Aware Transaction Ordering -**Certificate Contents**: +**Timeboost** implements advanced transaction ordering policies: -- Hash of data block -- Expiration time -- Proof of N-1 Committee member signatures -- Keyset hash and signature bitmap -- BLS aggregated signature (BLS12-381 curve) +- **MEV Capture**: Chain owners can capture a portion of available MEV +- **User Protection**: Maintains protection against front-running and sandwich attacks +- **Spam Reduction**: Reduces MEV-driven network congestion +- **Configurable Parameters**: Chain owners can customize ordering policies -**Trust Model**: Based on 2-of-N assumption, ensuring at least one honest member will provide data until expiration. +### AnyTrust: Alternative Data Availability -### Data Availability Servers (DAS) +**AnyTrust** provides a cost-optimized alternative to standard rollups by accepting a mild trust assumption about data availability: -Committee members run DAS software with two APIs: +**Architecture:** -**Sequencer API**: JSON-RPC interface for Sequencer to submit data blocks -**REST API**: Public HTTP(S) interface for fetching data blocks by hash +- **Data Availability Committee (DAC)**: Uses a committee of N members to store transaction data +- **Trust Assumption**: Assumes at least 2-of-N committee members are honest +- **Data Availability Certificates (DACerts)**: Cryptographic proofs using BLS signatures +- **Fallback Mechanism**: Falls back to posting full data to L1 if committee is unavailable -**Storage Options**: Local files, Badger database, Amazon S3, or redundant multi-store configurations with optional caching. +**Technical Implementation:** -### Sequencer-Committee Interaction +- **Keysets**: Specify BLS public keys of committee members and signature requirements +- **DACert Contents**: Hash of data block, expiration time, and proof of N-1 member signatures +- **Data Availability Servers (DAS)**: Committee members run servers with Sequencer API and public REST API +- **Storage Options**: Local files, Badger database, Amazon S3, or redundant multi-store configurations -**Data Submission Process**: +**Sequencer-Committee Interaction:** -1. Sequencer sends data batch with expiration time to all Committee members -2. Members store data and sign (hash, expiration) pairs +1. Sequencer sends data batch with expiration time to all committee members +2. Members store data and sign (hash, expiration) pairs using BLS keys 3. Sequencer aggregates signatures to create DACert 4. Sequencer posts DACert to L1 inbox contract +5. If insufficient signatures collected, Sequencer falls back to posting full data -**Fallback Mechanism**: If insufficient signatures collected within minutes, Sequencer falls back to posting full data directly to L1. +**Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova uses AnyTrust to achieve lower fees than Arbitrum One. -**Technical Specifications**: The committee maintains transaction data and provides it on-demand, with cryptographic proofs ensuring data integrity. +## Conclusion: The Complete Journey -**Use Cases**: AnyTrust is optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. +Your transaction's journey through Arbitrum is now complete. From the moment you submitted it to the Sequencer, through execution in the State Transition Function, to final confirmation on Ethereum, your transaction has been processed securely and efficiently. -**Performance Characteristics**: Arbitrum Nova (AnyTrust implementation) offers lower fees than Arbitrum One, making it suitable for high-volume, low-value transactions. +### What Makes Arbitrum Special -## Recent Technical Innovations +**Performance**: 10x lower fees and 100x faster transactions compared to Ethereum +**Security**: Ethereum-equivalent security through cryptographic proofs and economic incentives +**Compatibility**: Full EVM compatibility with seamless migration of existing applications +**Innovation**: Advanced features like Stylus, BoLD, and Timeboost that extend beyond basic Layer 2 -Arbitrum has implemented several major technical innovations that enhance its capabilities: +### The Technical Achievement -### BoLD (Bounded Liquidity Delay) +Arbitrum's architecture represents a sophisticated balance of competing requirements: -A permissionless validation protocol that enables decentralized participation in network security: +- **Speed vs. Security**: Soft finality for immediate feedback, hard finality for cryptographic security +- **Efficiency vs. Decentralization**: Optimized performance while maintaining permissionless validation +- **Compatibility vs. Innovation**: Full Ethereum compatibility while enabling new capabilities +- **Cost vs. Features**: Minimal fees while providing advanced Layer 2 functionality -**Technical Specifications**: +### Looking Forward -- **Permissionless Access**: Any party can participate in validation without authorization -- **Time-Bounded Disputes**: Disputes resolve within 6.4 days -- **Enhanced Security**: Improved guarantees for withdrawals and cross-chain messaging -- **Decentralization**: Progresses toward Stage 2 rollup status +With BoLD enabling permissionless validation, Stylus providing high-performance smart contracts, and continuous improvements to the Sequencer and compression systems, Arbitrum continues to push the boundaries of what's possible in Layer 2 scaling. -### Timeboost: MEV-Aware Transaction Ordering - -A novel transaction ordering policy that enables MEV capture while maintaining user protection: - -**Technical Features**: - -- **MEV Capture**: Chain owners can capture a portion of available MEV -- **User Protection**: Maintains protection against front-running and sandwich attacks -- **Spam Reduction**: Reduces MEV-driven network congestion -- **Configurable Parameters**: Chain owners can customize ordering policies +**The Result**: A system that feels like Ethereum but performs like a next-generation blockchain, enabling developers to build applications that were previously impossible due to cost and performance constraints. -### Stylus: WebAssembly Smart Contract Execution - -WebAssembly-based smart contract execution environment: - -**Technical Specifications**: - -- **Performance**: 10-70x faster execution compared to EVM -- **Memory Efficiency**: 100-500x improvement in memory usage -- **Language Support**: Rust, C, C++, and other WASM-compatible languages -- **Interoperability**: Full compatibility with existing Solidity contracts - -### Enhanced Sequencer Features - -Improved batch posting with advanced compression and blob support: - -**Technical Improvements**: - -- **Blob Support**: Uses EIP-4844 blobs for more efficient batch posting -- **Dynamic Compression**: Adjusts compression levels based on network conditions -- **Timeboost Integration**: Supports advanced transaction ordering policies -- **Improved Batching**: More efficient transaction batching and posting mechanisms - -**Technical Impact**: These innovations collectively enhance Arbitrum's performance, security, and developer experience. - -:::info More information - -For more information about AnyTrust, refer to the [AnyTrust deep dive](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). - -::: +--- -## Additional Resources +## Deep Dive Resources -This document provides a comprehensive overview of Arbitrum Nitro. For more detailed information on specific topics, explore these deep dives: +This journey has covered the high-level flow of transactions through Arbitrum. For detailed technical information on specific components, explore these deep dives: -- **[Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx)**: How transactions are submitted and processed +- **[Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx)**: Detailed transaction submission and processing +- **[The Sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx)**: Ordering, batching, and compression mechanisms +- **[State Transition Function](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx)**: STF inputs and processing +- **[Geth Integration](/how-arbitrum-works/deep-dives/geth.mdx)**: How Arbitrum modifies Geth for L2 execution +- **[ArbOS](/how-arbitrum-works/deep-dives/arbos.mdx)**: Layer 2 operating system and precompiles - **[L1 to L2 Messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)**: Cross-chain communication from parent to child chains - **[L2 to L1 Messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)**: Cross-chain communication from child to parent chains - **[Gas and Fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx)**: Understanding Arbitrum's fee structure -- **[Geth at the Core](/how-arbitrum-works/deep-dives/geth.mdx)**: How Arbitrum modifies Geth for L2 execution -- **[STF Inputs](/how-arbitrum-works/deep-dives/stf-inputs.mdx)**: Understanding State Transition Function inputs - **[Assertions](/how-arbitrum-works/deep-dives/assertions.mdx)**: How assertions work in the rollup protocol +- **[BoLD Protocol](/how-arbitrum-works/bold/gentle-introduction.mdx)**: Permissionless validation and dispute resolution From b03586f0a3fca8032450c491a3699288c3e9e1f6 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:44:36 -0700 Subject: [PATCH 53/75] broken links fixed --- .../01-comparison-overview.mdx | 6 +- .../02-block-numbers-and-time.mdx | 2 +- .../arbitrum-vs-ethereum/03-rpc-methods.mdx | 18 +- .../04-solidity-support.mdx | 2 +- .../reference/07-debugging-tools.mdx | 2 +- .../token-bridging/03-token-bridge-erc20.mdx | 4 +- .../02-how-to-bridge-tokens-standard.mdx | 2 +- .../01-inside-arbitrum-nitro.mdx | 4 +- .../bold/gentle-introduction.mdx | 4 +- docs/partials/_glossary-partial.mdx | 38 +- docusaurus.config.js | 1 + static/glossary.json | 522 ++++++++++++++---- 12 files changed, 480 insertions(+), 125 deletions(-) diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx index cb656da886..e8b35c9ed4 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx @@ -60,13 +60,13 @@ You can deploy Solidity contracts onto Arbitrum just like you do on Ethereum. Th ### Gas accounting -The fees for executing an Arbitrum transaction function similarly to gas fees on Ethereum. However, Arbitrum transactions must also pay a fee component to cover the cost of posting their calldata to the parent chain (for example, calldata on Arbitrum One, a child chain, is posted to Ethereum, a parent chain). Find more information about the two components of gas fees in [Gas and fees](/how-arbitrum-works/09-gas-fees.mdx) and parent chain pricing. +The fees for executing an Arbitrum transaction function similarly to gas fees on Ethereum. However, Arbitrum transactions must also pay a fee component to cover the cost of posting their calldata to the parent chain (for example, calldata on Arbitrum One, a child chain, is posted to Ethereum, a parent chain). Find more information about the two components of gas fees in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) and parent chain pricing. ### Base fee mechanism -Arbitrum chains support arbitrary message passing from a parent chain (e.g., Ethereum) to a child chain (e.g., Arbitrum One). These messages are commonly referred to as "parent chain to child chain messages." Developers using this functionality should familiarize themselves with how messaging works. For more information, refer to [Parent chain to child chain messaging](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +Arbitrum chains support arbitrary message passing from a parent chain (e.g., Ethereum) to a child chain (e.g., Arbitrum One). These messages are commonly referred to as "parent chain to child chain messages." Developers using this functionality should familiarize themselves with how messaging works. For more information, refer to [Parent chain to child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). -Similarly, Arbitrum chains can also send messages to the parent chain—more information about this is available in [Child Chain to Parent Chain Messaging and the Outbox](/how-arbitrum-works/11-l2-to-l1-messaging.mdx). +Similarly, Arbitrum chains can also send messages to the parent chain—more information about this is available in [Child Chain to Parent Chain Messaging and the Outbox](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). Arbitrum chains support arbitrary message passing from a parent chain (for example, a parent chain like Ethereum) to a child chain (for example, a child chain like Arbitrum One or Arbitrum Nova). These are commonly known as "parent chain to child chain messages". Developers using this functionality should familiarize themselves with how they work. Find more information about it in [Parent chain to child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx index a3ca05db76..d92a5b5232 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx @@ -17,7 +17,7 @@ Throughout this and other pages, we note that the block number of a chain does n ::: -As with Ethereum, Arbitrum clients submit transactions, and the system executes them later. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the Sequencer](/how-arbitrum-works/03-sequencer.mdx) or via the chain's [Delayed Inbox](/how-arbitrum-works/03-sequencer.mdx). +As with Ethereum, Arbitrum clients submit transactions, and the system executes them later. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the Sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx) or via the chain's [Delayed Inbox](/how-arbitrum-works/deep-dives/sequencer.mdx). Once in the chain's core inbox contract, transaction processing occurs in order. Generally, some time will elapse between when a message is put into the inbox (and timestamped) and when the contract processes the message and carries out the transaction requested by the message. diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx index 1ad778687d..31fbf9d732 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx @@ -25,14 +25,14 @@ In addition to the [three transaction types](https://ethereum.org/en/developers/ On RPC calls that return transactions, the `type` field will reflect the custom codes where applicable. -| Transaction type code | Transaction type name | Description | -| --------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `100` | `ArbitrumDepositTxType` | Used to deposit `ETH` from a parent chain to a child chain via the Arbitrum bridge | -| `101` | `ArbitrumUnsignedTxType` | Used to call a child chain contract from a parent chain, originated by a user through the Arbitrum bridge | -| `102` | `ArbitrumContractTxType` | Used to call a child chain contract from a parent chain, originated by a contract through the Arbitrum bridge | -| `104` | `ArbitrumRetryTxType` | Used to [manually redeem a retryable ticket](/how-arbitrum-works/10-l1-to-l2-messaging.mdx) on a child chain that failed to execute automatically (usually due to low gas) | -| `105` | `ArbitrumSubmitRetryableTxType` | Used to [submit a retryable ticket](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#submission) via the Arbitrum bridge on the parent chain | -| `106` | `ArbitrumInternalTxType` | Internal transactions created by the ArbOS itself for certain state updates, like the parent chain base fee and the block number | +| Transaction type code | Transaction type name | Description | +| --------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `100` | `ArbitrumDepositTxType` | Used to deposit `ETH` from a parent chain to a child chain via the Arbitrum bridge | +| `101` | `ArbitrumUnsignedTxType` | Used to call a child chain contract from a parent chain, originated by a user through the Arbitrum bridge | +| `102` | `ArbitrumContractTxType` | Used to call a child chain contract from a parent chain, originated by a contract through the Arbitrum bridge | +| `104` | `ArbitrumRetryTxType` | Used to [manually redeem a retryable ticket](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) on a child chain that failed to execute automatically (usually due to low gas) | +| `105` | `ArbitrumSubmitRetryableTxType` | Used to [submit a retryable ticket](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#submission) via the Arbitrum bridge on the parent chain | +| `106` | `ArbitrumInternalTxType` | Internal transactions created by the ArbOS itself for certain state updates, like the parent chain base fee and the block number | ### Additional fields @@ -61,7 +61,7 @@ On RPC calls that return transaction receipts, the following fields are added to | Field name | Description | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `l1BlockNumber` | The block number of the first non-Arbitrum ancestor chain that is usable for `block.number` calls. More information in [Block numbers and time](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx) | -| `gasUsedForL1` | The amount of gas spent on parent chain calldata in units of child chain gas. More information in [Gas and fees](/how-arbitrum-works/09-gas-fees.mdx) | +| `gasUsedForL1` | The amount of gas spent on parent chain calldata in units of child chain gas. More information in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) | ## Blocks diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx index 13f144dfe1..4391665239 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx @@ -22,5 +22,5 @@ Although Arbitrum supports Solidity code, there are differences in the effects o | `block.difficulty` | Returns the constant 1. | | `block.prevrandao` | Returns the constant 1. | | `block.number` | Returns an "estimate" of the block number of the first non-Arbitrum ancestor chain at which the sequencer received the transaction. For more information, see [Block numbers and time](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx). | -| `msg.sender` | Works the same way it does on Ethereum for regular child chain to child chain transactions. For transactions submitted via the delayed inbox, it will return the child chain address alias of the parent chain contract that triggered the message. For more information, see [address aliasing](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#address-aliasing). | +| `msg.sender` | Works the same way it does on Ethereum for regular child chain to child chain transactions. For transactions submitted via the delayed inbox, it will return the child chain address alias of the parent chain contract that triggered the message. For more information, see [address aliasing](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#address-aliasing). | | OPCODE `PUSH0` | This OPCODE was added as part of ArbOS 11 and is now supported. | diff --git a/docs/build-decentralized-apps/reference/07-debugging-tools.mdx b/docs/build-decentralized-apps/reference/07-debugging-tools.mdx index 136af89468..eca49a5047 100644 --- a/docs/build-decentralized-apps/reference/07-debugging-tools.mdx +++ b/docs/build-decentralized-apps/reference/07-debugging-tools.mdx @@ -15,7 +15,7 @@ The following tools will help you debug your decentralized apps (dApps): [Tenderly](https://tenderly.co/) is an all-in-one Web3 development platform that empowers developers to build, test, monitor, and operate smart contracts from inception to mass adoption. Tenderly's debugging options focus on providing developers with efficient and user-friendly tools to identify and fix smart contract bugs and production issues. The Debugger enables developers to inspect smart contracts by analyzing precise lines of code in a human-readable format. With Tenderly's Simulator, developers can play out specific historical transactions and current transaction outcomes before sending them onchain, allowing them to change relevant parameters and source code to test and debug contracts. The platform streamlines the debugging process, saving time and resources while improving smart contract reliability. -Although Tenderly provides great debugging options, there are certain limitations when debugging [parent-to-child chain messages](../../how-arbitrum-works/10-l1-to-l2-messaging.mdx) (also known as Retryable Tickets), due to the utilization of custom Geth errors. For further information on this constraint, please refer to the following [resource](/for-devs/troubleshooting-building#i-tried-to-create-a-retryable-ticket-but-the-transaction-reverted-on-l1-how-can-i-debug-the-issue). +Although Tenderly provides great debugging options, there are certain limitations when debugging [parent-to-child chain messages](../../how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) (also known as Retryable Tickets), due to the utilization of custom Geth errors. For further information on this constraint, please refer to the following [resource](/for-devs/troubleshooting-building#i-tried-to-create-a-retryable-ticket-but-the-transaction-reverted-on-l1-how-can-i-debug-the-issue). ### Arbiscan diff --git a/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx b/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx index 21b1ba5eee..7090487786 100644 --- a/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx +++ b/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx @@ -46,11 +46,11 @@ Our architecture consists of three types of contracts: -All Ethereum-to-Arbitrum token transfers are initiated via the router contract on the parent chain, specifically the `L1GatewayRouter` contract. `L1GatewayRouter` forwards the token's deposit call to the appropriate gateway contract on the parent chain, the `L1ArbitrumGateway` contract. `L1GatewayRouter` is responsible for mapping the parent chain token addresses to L1Gateway contracts, thus acting as a parent/child chain address oracle and ensuring each token corresponds to only one gateway. The `L1ArbitrumGateway` then communicates to its counterpart gateway contract on the child chain, the `L2ArbitrumGateway` contract (typically/expectedly via [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx)). +All Ethereum-to-Arbitrum token transfers are initiated via the router contract on the parent chain, specifically the `L1GatewayRouter` contract. `L1GatewayRouter` forwards the token's deposit call to the appropriate gateway contract on the parent chain, the `L1ArbitrumGateway` contract. `L1GatewayRouter` is responsible for mapping the parent chain token addresses to L1Gateway contracts, thus acting as a parent/child chain address oracle and ensuring each token corresponds to only one gateway. The `L1ArbitrumGateway` then communicates to its counterpart gateway contract on the child chain, the `L2ArbitrumGateway` contract (typically/expectedly via [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)). -Similarly, Arbitrum-to-Ethereum transfers initiate via the router contract on the child chain, specifically the `L2GatewayRouter` contract, which in turn calls the token's gateway contract on the child chain. This `L2ArbitrumGateway` contract in turn communicates to its corresponding gateway contract on the parent chain, the `L1ArbitrumGateway` contract (typically/expectedly via [sending child-to-parent messages to the outbox](/how-arbitrum-works/11-l2-to-l1-messaging.mdx)). +Similarly, Arbitrum-to-Ethereum transfers initiate via the router contract on the child chain, specifically the `L2GatewayRouter` contract, which in turn calls the token's gateway contract on the child chain. This `L2ArbitrumGateway` contract in turn communicates to its corresponding gateway contract on the parent chain, the `L1ArbitrumGateway` contract (typically/expectedly via [sending child-to-parent messages to the outbox](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)). diff --git a/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx b/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx index 15fc215d3b..10452d223f 100644 --- a/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx +++ b/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx @@ -172,7 +172,7 @@ As mentioned before, you can also call the method `outboundTransferCustomRefund` ## Step 5: Wait for execution on the child chain -After calling the deposit method (or the `outboundTransferCustomRefund` if you’re choosing the manual way), you’ll have to wait a bit until the message executes on the child chain. We will verify the status of the underlying retryable ticket created to bridge the tokens. Check this page to learn more about [parent-to-child chain messages, also known as retryables](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +After calling the deposit method (or the `outboundTransferCustomRefund` if you’re choosing the manual way), you’ll have to wait a bit until the message executes on the child chain. We will verify the status of the underlying retryable ticket created to bridge the tokens. Check this page to learn more about [parent-to-child chain messages, also known as retryables](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). You can programmatically wait for the execution of the transaction on the child chain using Arbitrum’s SDK. You should first wait for the execution of the submission transaction (the one sent to the router contract) and then the execution of the child chain transaction. diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 5fa48fa301..8edea790ec 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -1,9 +1,9 @@ --- title: 'Inside Arbitrum Nitro' -description: 'Follow a transaction's journey through the complete Arbitrum Nitro stack, from submission to finality.' +description: "Follow a transaction's journey through the complete Arbitrum Nitro stack, from submission to finality." author: pete-vielhaber sme: edfelten -user_story: As a developer, I need to understand how transactions flow through Arbitrum's architecture and how the system ensures security and performance. +user_story: "As a developer, I need to understand how transactions flow through Arbitrum's architecture and how the system ensures security and performance." content_type: get-started --- diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index 5e8a8a73e6..d0150f4012 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -88,9 +88,9 @@ The BoLD protocol provides the guardrails and rules for how validators challenge Let’s dive into an overview of how BoLD actually works. -1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to its parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge. +1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to its parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge. 2. **A challenge is opened:** When another validator observes and disagrees with the end state represented by `Block Z`, they can permissionlessly open a challenge by asserting and bonding capital to a claim on a different end state, represented by an assertion `Block Y`. At this point, there are now two asserted states: `Block A → Block Z` and `Block A → Block Y`. Each of these asserted states, at this point, is referred to as an edge, while a Merkle tree of asserted states from some start to endpoint (e.g., `Block A → Block Z`) is more formally known as a _history commitment _.\_ It is important to note that Ethereum at this point has no notion of which edge(s) are correct or incorrect - edges are simply a portion of a claim made by a validator about the history of the chain from some end state all the way back to some initial state. Also note that because a bond put up by a validator is for an assertion rather than the party that put up that bond, there can be any number of honest, anonymous parties that can open challenges against incorrect claims. It is important to note that bonds posted to open challenges get held in the Rollup contract. There is a prescribed procedure outlining the expectation of the Arbitrum Foundation regarding the use of these funds; see Step 5 below for a summary. -3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to agree on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective history commitments until they arrive at a single step of instruction, where an arbiter, such as Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/05-validation-and-proving/01-validation-and-proving.mdx) - BoLD only changes some minor, but important, details in the resolution process. Let’s dive into what happens next: +3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to agree on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective history commitments until they arrive at a single step of instruction, where an arbiter, such as Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) - BoLD only changes some minor, but important, details in the resolution process. Let’s dive into what happens next: - **Block challenges**: When a challenge gets opened, edges are referred to as level-zero edges since they are at the granularity of Arbitrum blocks. The disputing parties take turns bisecting their historical commitments until they identify the specific block on which they disagree. - **Big-step challenge:** Now that the parties have narrowed down their dispute to a single block, the back-and-forth bisection exercise continues within that block. Note that this block is agreed upon by all parties to be a state that follows the initial state but precedes the final state. This time, however, the parties will narrow down on a specific range of instructions for the State Transition Function within the block - essentially working towards identifying a set of instructions within which their disagreement lies. Currently, this range is 2^20 steps of `WASM` instructions, which is the assembly of choice for validating Arbitrum chains. - **One-step challenge:** Within that range of 2^20 instructions, the back-and-forth bisecting continues until all parties arrive at a single step of instruction that they disagree on. At this point, parties agree on the initial state of Arbitrum before the step, but disagree on the end state one step immediately after. Remember that since Arbitrum’s state is entirely deterministic, there is only one correct end state. diff --git a/docs/partials/_glossary-partial.mdx b/docs/partials/_glossary-partial.mdx index 7d40d92812..0bdb92906d 100644 --- a/docs/partials/_glossary-partial.mdx +++ b/docs/partials/_glossary-partial.mdx @@ -3,7 +3,7 @@ partial_type: glossary title: 'Arbitrum Glossary Definitions' description: 'Comprehensive glossary of Arbitrum terminology and definitions' author: anegg0 -last_reviewed: 2025-09-25 +last_reviewed: 2025-10-07 --- ### Active Validator {#active-validator} @@ -82,6 +82,12 @@ Arbitrum's "operating system" that trustlessly handles system-level operations; A bonded claim made by an Arbitrum [Validator](/intro/glossary#validator) representing a claim about an Arbitrum chain's state. An [Assertion](/intro/glossary#assertion) may, e.g., propose a new assertion, or may be a step in a [Challenge](/intro/glossary#challenge). +Assertions can have different states: + +- **Proposed**: When a validator submits an assertion +- **Challenged**: If another validator disputes the assertion, an interactive fraud-proof initiates. +- **Confirmed**: An assertion becomes final if no one challenges it within the dispute window (6.4 days). + ### Auction Contract {#auction-contract} A smart contract that handles the state, accounting of funds for bids, and various operations of the [Timeboost](/intro/glossary#timeboost) auction. The contract is deployed on the target chain for which Timeboost is enabled. @@ -181,6 +187,16 @@ A [Validator](/intro/glossary#validator) that watches an Arbitrum chain and take A contract that holds [Parent chain](/intro/glossary#parent-chain) initiated messages to be eventually included in the [Sequencer Inbox](/intro/glossary#sequencer). Inclusion of messages doesn't depend on the [Sequencer](/intro/glossary#sequencer). +### Deterministic proving {#deterministic-proving} + +If challenged, state transitions are replayable and verified onchain. + +To achieve this, Arbitrum compiles the State Transition Function (STF) into different formats: + +- **Execution mode**: Uses Go's native compiler for high-performance execution on validator nodes. + +- **Proving mode**: Compiles to WebAssembly (WASM), which transforms into WebAssembly for Arbitrum Virtual Machine (WAVM) for fraud-proof verification. + ### Dev-Tools Dashboard {#devtools-dashboard} Web application built and maintained by [Offchain Labs](/intro/glossary#offchain-labs) for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of [Cross-chain messages](/intro/glossary#crosschain-message); visit it [here](https://retryable-dashboard.arbitrum.io/). @@ -197,6 +213,10 @@ A software application used for transacting with the Ethereum [Blockchain](/intr The paradigm introduced by [Stylus](/intro/glossary#stylus) in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced. +### Execution claim {#execution-claim} + +A cryptographic commitment to the computed state. + ### Express Lane {#express-lane} A component of [Timeboost](/intro/glossary#timeboost), the express lane is a special endpoint on the [Sequencer](/intro/glossary#sequencer) that immediately sequences incoming, valid transactions signed by the current express lane controller. @@ -285,10 +305,18 @@ A parent chain contract responsible for tracking [Child to parent chain Message] EVM compatible chain that acts as the settlement layer for one or more Arbitrum Chains (aka [Child chain](/intro/glossary#child-chain) ). E.g., Ethereum is the parent chain of both Arbitrum One and Arbitrum Nova. Parent chain is synonymous with "underlying chain." +### Permissionless validation {#permissionless-validation} + +Anyone can become a validator by running an Arbitrum node, without permission. + ### Portal {#portal} A web application maintained by [Offchain Labs](/intro/glossary#offchain-labs) showcasing the Arbitrum ecosystem; visit it [here](https://portal.arbitrum.io/). +### Predecessor Assertion {#predecessor-assertion} + +The last confirmed valid state of the chain. + ### raas {#raas} RaaS (Rollup as a Service) is a platform that provides the necessary infrastructure and tools to deploy and operate blockchain Rollups, eliminating the need for teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology. @@ -355,7 +383,7 @@ An token contract on an Arbitrum chain deployed via the [`StandardERC20` gateway ### State Transition Function {#state-transition-function} -The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain. +The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain. The State Transition Function's output is the result of applying those input messages (transactions). ### Stylus {#stylus} @@ -383,6 +411,12 @@ In the context of Ethereum, trustless refers to the ability of a system to opera This is achieved through the use of cryptographic techniques and decentralized consensus mechanisms that let users verify the integrity of network transactions using open-source software. Trustless systems are considered to be more secure and resistant to fraud or tampering because they don't rely on a single point of failure that can be exploited by attackers. +### Trustless verification {#trustless-verification} + +#### Trustless verification + +Validators confirm assertions, ensuring transactions adhere to the protocol rules. + ### Underlying Chain {#underlying-chain} Synonymous with [Parent chain](/intro/glossary#parent-chain). diff --git a/docusaurus.config.js b/docusaurus.config.js index 4af0829166..4836f19d76 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -136,6 +136,7 @@ const config = { invalidLink: true, notDocumented: true, }, + skipErrorChecking: true, logLevel: 'Verbose', sidebar: { autoConfiguration: false, diff --git a/static/glossary.json b/static/glossary.json index 5319f42ac4..36d11b7ddf 100644 --- a/static/glossary.json +++ b/static/glossary.json @@ -1,102 +1,422 @@ { -"active-validator":{"title":"Active Validator","text":"

A bonded Validator that makes disputable assertions to advance the state of an Arbitrum chain or to challenge the validity of others' assertions. (Not to be confused with the Sequencer.)

\n"}, -"address-alias":{"title":"Address Alias","text":"

An address deterministically generated from a parent chain contract address used on child chain to safely identify the source of an parent to child chain message.

\n"}, -"arb-token-bridge":{"title":"Arb Token Bridge","text":"

A series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless movement of ERC-20 tokens between the two layers.

\n"}, -"arbified-token-list":{"title":"Arbified Token List","text":"

A token list that conforms to Uniswap's token list specification; Arbified lists are generated by inputting externally maintained list (i.e., coinmarketcap's list) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain bridged via the canonical Arb Token Bridge from tokens on the input list. (See code here.)

\n"}, -"arbitrum":{"title":"Arbitrum","text":"

A suite of Ethereum child chain scaling technologies built with the Arbitrum Nitro tech stack that includes Arbitrum One (a live implementation of the Arbitrum Rollup Protocol) and Arbitrum Nova (a live implementation of the Arbitrum AnyTrust Protocol).

\n"}, -"arbitrum-anytrust-chain":{"title":"Arbitrum AnyTrust Chain","text":"

An Arbitrum chain that implements the Arbitrum AnyTrust Protocol.

\n"}, -"arbitrum-anytrust-protocol":{"title":"Arbitrum AnyTrust Protocol","text":"

An Arbitrum protocol that manages data availability with a permissioned set of parties known as the Data Availability Committee (DAC). This protocol reduces transaction fees by introducing an additional trust assumption for data availability in lieu of Ethereum's Trustless data availability mechanism. Arbitrum Nova is an example of an AnyTrust chain; Arbitrum One is an alternative chain that implements the purely trustless (and more L1-gas intensive) Arbitrum Rollup Protocol.

\n"}, -"arbitrum-bridge-ui":{"title":"Arbitrum Bridge UI","text":"

Web application built and maintained by Offchain Labs for user-interactions with the Arb Token Bridge; visit it here.

\n"}, -"arbitrum-chain":{"title":"Arbitrum chain","text":"

A blockchain that runs on the Arbitrum protocol. Arbitrum chains are EVM compatible, and use an underlying EVM chain (e.g., Ethereum) for settlement and for succinct fraud-proofs (as needed). Arbitrum chains come in two forms: Arbitrum Rollup Chains and Arbitrum AnyTrust Chains.

\n"}, -"arbitrum-chains":{"title":"Arbitrum Chains","text":"

Arbitrum chains (Orbit) refers to the ability for anyone to permissionlessly deploy Layer 3 (L3) chains on top of Arbitrum Layer 2 (L2) chains.

\n"}, -"arbitrum-classic":{"title":"Arbitrum Classic","text":"

Old Arbitrum stack that used custom virtual machine ("AVM"); no public Arbitrum chain uses the classic stack as of 8/31/2022 (they instead use Arbitrum Nitro.)

\n"}, -"arbitrum-full-node":{"title":"Arbitrum Full Node","text":"

A party who keeps track of the state of an Arbitrum chain and receives remote procedure calls (RPCs) from clients. Analogous to a non-staking parent Ethereum node.

\n"}, -"arbitrum-nitro":{"title":"Arbitrum Nitro","text":"

Current Arbitrum tech stack; runs a fork of Geth and uses WebAssembly as its underlying VM for fraud proofs.

\n"}, -"arbitrum-nova":{"title":"Arbitrum Nova","text":"

The first Arbitrum AnyTrust Chain running on Ethereum mainnet. Introduces cheaper transactions; great for gaming and social use-cases. Implements the Arbitrum AnyTrust Protocol, not the Arbitrum Rollup Protocol protocol. Governed by the Arbitrum DAO.

\n"}, -"arbitrum-one":{"title":"Arbitrum One","text":"

The first Arbitrum Rollup Chain running on Ethereum mainnet. Great for decentralized finance and other use-cases that demand strong security guarantees. Governed by the Arbitrum DAO.

\n"}, -"arbitrum-rollup-chain":{"title":"Arbitrum Rollup Chain","text":"

An Arbitrum chain that implements the Arbitrum Rollup Protocol.

\n"}, -"arbitrum-rollup-protocol":{"title":"Arbitrum Rollup Protocol","text":"

A trustless, permissionless Arbitrum protocol that uses its underlying base layer for data availability and inherits its security. This protocol is implemented by our Arbitrum One chain.

\n"}, -"arbos":{"title":"ArbOS","text":"

Arbitrum's "operating system" that trustlessly handles system-level operations; includes the ability to emulate the EVM.

\n"}, -"assertion":{"title":"Assertion","text":"

A bonded claim made by an Arbitrum Validator representing a claim about an Arbitrum chain's state. An Assertion may, e.g., propose a new assertion, or may be a step in a Challenge.

\n"}, -"auction-contract":{"title":"Auction Contract","text":"

A smart contract that handles the state, accounting of funds for bids, and various operations of the Timeboost auction. The contract is deployed on the target chain for which Timeboost is enabled.

\n"}, -"autonomous-auctioneer":{"title":"Autonomous Auctioneer","text":"

Offchain software that receives bids from Timeboost participants, processes and validates bids, and then posts the top valid bid (or top two valid bids in the case of a tie) to the Auction Contract to resolve the on going Timeboost auction. The autonomous auctioneer, for a given chain, is provisioned and deployed by an entity designated by the chain's owner.

\n"}, -"batch":{"title":"Batch","text":"

A group of Arbitrum transactions posted in a single transaction on the Underlying Chain into the Sequencer Inbox by the Sequencer.

\n"}, -"blockchain":{"title":"Blockchain","text":"

A distributed digital ledger that is used to record transactions and store data in a secure, transparent, and tamper-resistant way, notably in cryptocurrency protocols.

\n"}, -"bls-signature":{"title":"BLS Signature","text":"

A cryptographic scheme that allows multiple signatures to be aggregated and compacted into one efficiently verifiable, constant-sized signature. Used in the Arbitrum AnyTrust Protocol for the Data Availability Committee (DAC)'s signatures.

\n"}, -"bold":{"title":"BoLD","text":"

Short for "Bounded Liquidity Delay"; latest version of the Arbitrum Challenge protocol designed to eliminate delay attack vectors (see here for more).

\n"}, -"bonder":{"title":"Bonder","text":"

A Validator who deposits a bond (in Ether on Arbitrum One and Arbitrum Nova ) to vouch for a particular assertion in an Arbitrum Chain. A validator who bonds on a false assertion can expect to lose their bond. An honest bonder can recover their bond once the assertion they are bonded on has been confirmed.\nAlso known as: staker

\n"}, -"bridge":{"title":"Bridge","text":"

A set of smart contracts for sending Cross-chain messages between blockchains. Every Arbitrum chain includes a bridge to/from its Parent chain.

\n"}, -"chain-owner":{"title":"Chain Owner","text":"

An entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, and adding and removing other chain owners.

\n"}, -"chain-state":{"title":"Chain state","text":"

A particular point in the history of an Arbitrum chain. A chain's state is determined by applying Arbitrum state-transition function to sequence of transactions (i.e., the chain's history).

\n"}, -"challenge":{"title":"Challenge","text":"

When two bonders disagree about the correct verdict on an assertion, those bonders can be put in a challenge. The challenge is refereed by the contracts on the underlying chain. Eventually one bonder wins the challenge. The protocol guarantees that an honest party will always win a challenge; the loser forfeits their bond.

\n"}, -"challenge-period":{"title":"Challenge Period","text":"

Window of time (one week on Arbitrum One) over which an Assertion can be challenged, and after which the assertion can be confirmed.

\n"}, -"challenge-protocol":{"title":"Challenge protocol","text":"

The protocol by which assertions are submitted, disputed, and ultimately confirmed. The Challenge Protocol guarantees that only valid assertions will be confirmed provided that there is at least one honest active validator.

\n"}, -"child-chain":{"title":"Child chain","text":"

An Arbitrum Chain that settles to a Parent chain. For example, Arbitrum One and Arbitrum Nova are child chains of Ethereum.

\n"}, -"client":{"title":"Client","text":"

A program running on a user's machine, often in the user's browser, that interacts with contracts on an Arbitrum chain and provides a user interface.

\n"}, -"confirmation":{"title":"Confirmation","text":"

The decision by an Arbitrum chain to finalize an assertion as part of the chain's history. Once an assertion is confirmed its Child to parent chain Messages (e.g., withdrawals) can be executed.

\n"}, -"crosschain-message":{"title":"Cross-chain message","text":"

An action taken on some chain A which asynchronously initiates an additional action on chain B.

\n"}, -"custom-arbtoken":{"title":"Custom Arb-Token","text":"

Any child chain token contract registered to the Arb Token Bridge that isn't a standard arb-token (i.e., a token that uses any gateway other than the StandardERC20 gateway ).

\n"}, -"custom-gateway":{"title":"Custom gateway","text":"

Any Token Gateway that isn't the StandardERC20 gateway.

\n"}, -"dapp":{"title":"dApp","text":"

Short for "decentralized application." A dApp typically consists of smart contracts as well as a user-interface for interacting with them.

\n"}, -"data-availability-certificate":{"title":"Data Availability Certificate","text":"

Signed promise from a Data Availability Committee (DAC) attesting to the availability of a batch of data for an Arbitrum AnyTrust Chain.

\n"}, -"data-availability-committee-dac":{"title":"Data Availability Committee (DAC)","text":"

A permissioned set of parties responsible for enforcing data availability on a chain using the Arbitrum AnyTrust Protocol.

\n

See Introducing AnyTrust Chains: Cheaper, Faster L2 Chains with Minimal Trust Assumptions to learn more.

\n"}, -"defensive-validator":{"title":"Defensive Validator","text":"

A Validator that watches an Arbitrum chain and takes action (i.e., bonds and challenges) only when and if an invalid Assertion occurs.

\n"}, -"delayed-inbox":{"title":"Delayed Inbox","text":"

A contract that holds Parent chain initiated messages to be eventually included in the Sequencer Inbox. Inclusion of messages doesn't depend on the Sequencer.

\n"}, -"devtools-dashboard":{"title":"Dev-Tools Dashboard","text":"

Web application built and maintained by Offchain Labs for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of Cross-chain messages; visit it here.

\n"}, -"dissection":{"title":"Dissection","text":"

A step in the Challenge protocol in which two challenging parties interactively narrow down their disagreement until they reach a One Step Proof.

\n"}, -"ethereum-wallet":{"title":"Ethereum Wallet","text":"

A software application used for transacting with the Ethereum Blockchain.

\n"}, -"evm":{"title":"EVM+","text":"

The paradigm introduced by Stylus in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced.

\n"}, -"express-lane":{"title":"Express Lane","text":"

A component of Timeboost, the express lane is a special endpoint on the Sequencer that immediately sequences incoming, valid transactions signed by the current express lane controller.

\n"}, -"express-lane-controller":{"title":"Express Lane Controller","text":"

An address, defined in the Auction Contract, that is granted the privilege to use the Express Lane. These privileges are granted after verifying that the incoming transactions were properly signed by the express lane controller, among other checks.

\n"}, -"externally-owned-accounts":{"title":"Externally Owned Accounts","text":"

An externally owned account (EOA) is the account (public/private key pairs) that has a physical address location. Commonly referred to as a wallet, however, we distinguish an EOA from the user client software wallet.

\n"}, -"fast-exit--liquidity-exit":{"title":"Fast Exit / Liquidity Exit","text":"

A means by which a user can bypass an Arbitrum chain's Challenge Period when withdrawing fungible assets (or more generally, executing some "fungible" child chain to parent chain operation); for trustless fast exits, a liquidity provider facilitates an atomic swap of the asset on a child chain directly to a parent chain.

\n"}, -"first-come-first-serve-fcfs":{"title":"First Come First Serve (FCFS)","text":"

A type of Transaction Ordering Policy used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block in the order that the transactions arrived.

\n"}, -"forceinclusion":{"title":"Force-Inclusion","text":"

Censorship resistant path for including a message into an Arbitrum chain via the Delayed Inbox on its Parent chain; bypasses any Sequencer involvement.

\n"}, -"fraud-proof":{"title":"Fraud proof","text":"

The means by which an Active Validator proves to its underlying chain that an invalid state transition has taken place.

\n"}, -"gas-price-floor":{"title":"Gas Price Floor","text":"

Protocol-enforced minimum gas price on an Arbitrum chain; currently 0.1 gwei on Arbitrum One and 0.01 gwei on Arbitrum Nova.

\n"}, -"gateway-router":{"title":"Gateway Router","text":"

Contracts in the Arb Token Bridge responsible for mapping tokens to their appropriate Token Gateway.

\n"}, -"genericcustom-gateway":{"title":"Generic-Custom Gateway","text":"

A particular Custom gateway via which a parent chain token contract can be registered to a token contract deployed to a child chain. A useful alternative to the StandardERC20 gateway for projects that wish to control the address of their child chain token contract, maintain the child chain token contract upgradability, and for various other use-cases.

\n"}, -"geth":{"title":"Geth","text":"

An execution-layer client that defines the Ethereum state transition function and handles network-layer logic like transaction memory pooling. Arbitrum Nitro utilizes a fork of Geth to implement Arbitrum's state transition function.

\n"}, -"ink":{"title":"Ink","text":"

The equivalent of gas in the Stylus vm. Ink is introduced for finer granularity than gas offers since Stylus's operations are considerably cheaper than their EVM analogs.

\n"}, -"l2-block":{"title":"L2 Block","text":"

Data structure that represents a group of L2 transactions (analogous to L1 blocks).

\n"}, -"l2-to-l1-message":{"title":"L2 to L1 Message","text":"

A message initiated from within an Arbitrum chain to be eventually executed on Layer 1 (parent chain) (e.g., token or Ether withdrawals). On Rollup chains like Arbitrum One, the Challenge Period must pass before a child to parent chain message is executed.

\n"}, -"layer-1-l1":{"title":"Layer 1 (L1)","text":"

The base protocol and underlying blockchain of the Ethereum network. Responsible for maintaining the integrity of the distributed ledger and executing smart contracts. Contains both Ethereum's execution layer and consensus layer.

\n"}, -"layer-2-l2":{"title":"Layer 2 (L2)","text":"

Trustless scaling solutions built on top of Ethereum's Layer 1 (L1) base protocol, such as state channels, plasma chains, optimistic rollups, and ZK-rollups. Layer 2 solutions aim to increase scalability and reduce the cost of transactions on Ethereum's Layer 1 without introducing additional trust assumptions.

\n"}, -"layer-3-l3":{"title":"Layer 3 (L3)","text":"

An Arbitrum chain whose core contract reside on an Arbitrum Layer 2 (L2) chain.

\n"}, -"native-fee-token":{"title":"Native Fee Token","text":"

An ERC-20 token used as the native currency for gas fees on an Arbitrum chain (i.e., as opposed to using Ether). Arbitrum chains introduced the option for chains to use native fee tokens.

\n"}, -"offchain-labs":{"title":"Offchain Labs","text":"

The initial builders Arbitrum; current contributors to the Arbitrum ecosystem and service providers to the Arbitrum DAO. Offchain also runs and maintains the Sequencers for Arbitrum One and Arbitrum Nova.

\n"}, -"one-step-proof":{"title":"One Step Proof","text":"

Final step in a challenge; a single operation of the Arbitrum VM (WASM ) is executed on the underlying chain, and the validity of its state transition is verified.

\n"}, -"outbox":{"title":"Outbox","text":"

A parent chain contract responsible for tracking Child to parent chain Messages, including withdrawals, which can be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages.

\n"}, -"parent-chain":{"title":"Parent chain","text":"

EVM compatible chain that acts as the settlement layer for one or more Arbitrum Chains (aka Child chain ). E.g., Ethereum is the parent chain of both Arbitrum One and Arbitrum Nova. Parent chain is synonymous with "underlying chain."

\n"}, -"portal":{"title":"Portal","text":"

A web application maintained by Offchain Labs showcasing the Arbitrum ecosystem; visit it here.

\n"}, -"raas":{"title":"raas","text":"

RaaS (Rollup as a Service) is a platform that provides the necessary infrastructure and tools to deploy and operate blockchain Rollups, eliminating the need for teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology.

\n"}, -"rblock":{"title":"RBlock","text":"

Refer to Assertion

\n"}, -"reorg":{"title":"Reorg","text":"

A situation in which transactions on a chain that were at some point considered accepted then get rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's Sequencer Inbox, the only way the chain can experience a reorg is if its Underlying Chain itself reorgs. Of note, Fraud proofs do not cause reorgs.

\n"}, -"retryable-autoredeem":{"title":"Retryable Autoredeem","text":"

The "automatic" (i.e., requiring no additional user action) execution of a Retryable Ticket on an Arbitrum chain.

\n"}, -"retryable-redeem":{"title":"Retryable Redeem","text":"

The execution of a Retryable Ticket on a child chain; can be automatic (see Retryable Autoredeem) or manual via a user-initiated child chain transaction.

\n"}, -"retryable-ticket":{"title":"Retryable Ticket","text":"

A parent to child cross chain message initiated by a parent chain transaction sent to an Arbitrum chain for execution (e.g., a token deposit).

\n"}, -"reverse-token-gateway":{"title":"Reverse Token Gateway","text":"

A Token Gateway in which the Child chain gateway contract escrows and releases tokens, which the Parent chain Gateway contract mints and burns tokens. This in the inverse to how "typical" gateways work.

\n"}, -"sequencer":{"title":"Sequencer","text":"

An entity (currently a single-party on Arbitrum One) given rights to reorder transactions in the Sequencer Inbox over a fixed window of time, who can thus give clients sub-blocktime Soft Confirmations. (Not to be confused with a Validator).

\n"}, -"sequencer-feed":{"title":"Sequencer Feed","text":"

Offchain data feed published by the Sequencer which clients can subscribe to for Soft Confirmations of transactions before they are posted in batches.

\n"}, -"sequencer-inbox":{"title":"Sequencer Inbox","text":"

Contract that holds a sequence of messages sent by clients to an Arbitrum Chain; a message can be put into the Sequencer Inbox directly by the Sequencer or indirectly through the Delayed Inbox.

\n"}, -"shared-sequencing":{"title":"Shared Sequencing","text":"

A protocol design space in which multiple rollups use the same entity as their Sequencer; potential benefits include enhanced interoperability and credible neutrality.

\n"}, -"smart-contract":{"title":"Smart Contract","text":"

A computer program whose operations are defined and executed within a blockchain consensus protocol.

\n"}, -"soft-confirmation":{"title":"Soft Confirmation","text":"

A semi-trusted promise from the Sequencer to post a user's transaction in the near future; soft-confirmations happen prior to posting on the Parent chain, and thus can be given near-instantaneously (i.e., faster than the parent chain's block times)

\n"}, -"speed-limit":{"title":"Speed Limit","text":"

Target computation limit for an Arbitrum chain. Arbitrum One and Arbitrum Nova currently target 7,000,000 gas / second. When computation exceeds this limit, fees rise, via EIP-1559.

\n"}, -"standard-arbtoken":{"title":"Standard Arb-Token","text":"

An token contract on an Arbitrum chain deployed via the StandardERC20 gateway; offers basic ERC-20 functionality in addition to deposit / withdrawal affordances.

\n"}, -"standarderc20-gateway":{"title":"StandardERC20 gateway","text":"

Token Gateway via which any underlying chain's ERC-20 token can permissionlessly bridge; the StandardERC20 gateway contracts deploy a Standard Arb-Token on the Child chain for each bridged token.

\n"}, -"state-transition-function":{"title":"State Transition Function","text":"

The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain.

\n"}, -"stylus":{"title":"Stylus","text":"

Upgrade to the Arbitrum Nitro virtual machine that allows smart contract support for languages like Rust and C++ by taking advantage of Nitro's use of WASM. Currently on testnet (read more).

\n"}, -"timeboost":{"title":"Timeboost","text":"

A transaction ordering policy in which entities can bid for the right to access an express lane on the Sequencer for faster transaction inclusion. See the research specification to learn more.

\n"}, -"token-gateway":{"title":"Token Gateway","text":"

A pair of contracts in the token bridge — one on the Parent chain , one on the Child chain — that provide a particular mechanism for handling the transfer of tokens between layers. Token gateways currently active in the bridge include the StandardERC20 gateway , the Generic-Custom Gateway , and the WETH Gateway.

\n"}, -"transaction":{"title":"Transaction","text":"

A user-initiated interaction with a Blockchain. Transactions are typically signed by users via wallets and are paid for via transaction fees.

\n"}, -"transaction-ordering-policy":{"title":"Transaction Ordering Policy","text":"

The rules and logic employed by a chain to order incoming transactions into a block.

\n"}, -"trustless":{"title":"Trustless","text":"

In the context of Ethereum, trustless refers to the ability of a system to operate without reliance on a central authority or intermediary. Instead, users place their trust in math and protocols.

\n

This is achieved through the use of cryptographic techniques and decentralized consensus mechanisms that let users verify the integrity of network transactions using open-source software. Trustless systems are considered to be more secure and resistant to fraud or tampering because they don't rely on a single point of failure that can be exploited by attackers.

\n"}, -"underlying-chain":{"title":"Underlying Chain","text":"

Synonymous with Parent chain.

\n"}, -"validator":{"title":"Validator","text":"

An Arbitrum Full Node that tracks the status of the chains' Assertions. A validator may be a Watchtower Validator, a Defensive Validator, or an Active Validator.

\n"}, -"wallet":{"title":"Wallet","text":"

When referring to a wallet, we mean the user client software enabling user actions. Often, client software is a browser extension, mobile, or desktop app. Also refer to Externally Owned Accounts.

\n"}, -"wasm":{"title":"WASM","text":"

Widely supported binary code format for executable programs. Used by Arbitrum Nitro for Fraud proofs , and more broadly used by Stylus to support performant smart contracts in a wide variety of languages.

\n"}, -"wasmer":{"title":"WASMer","text":"

A popular WebAssembly runtime for executing WASM binaries. A fork of WASMer is used for executing Stylus programs. WASMer executes considerably faster than Geth executes EVM code, contributing to Stylus's lower fees.

\n"}, -"watchtower-validator":{"title":"Watchtower Validator","text":"

A Validator that never bonds / never takes on chain action, who raises the alarm (by whatever offchain means it chooses) if it witnesses an invalid assertion.

\n"}, -"weth-gateway":{"title":"WETH Gateway","text":"

Token Gateway for handing the bridging of wrapped Ether (WETH). WETH is unwrapped on the parent chain and rewrapped on the parent chain upon depositing (and vice-versa upon withdrawing), ensuring WETH on the child chain always remains collateralized.

\n"} -} \ No newline at end of file + "active-validator": { + "title": "Active Validator", + "text": "

A bonded Validator that makes disputable assertions to advance the state of an Arbitrum chain or to challenge the validity of others' assertions. (Not to be confused with the Sequencer.)

\n" + }, + "address-alias": { + "title": "Address Alias", + "text": "

An address deterministically generated from a parent chain contract address used on child chain to safely identify the source of an parent to child chain message.

\n" + }, + "arb-token-bridge": { + "title": "Arb Token Bridge", + "text": "

A series of contracts on an Arbitrum chain and its underlying chain that facilitate trustless movement of ERC-20 tokens between the two layers.

\n" + }, + "arbified-token-list": { + "title": "Arbified Token List", + "text": "

A token list that conforms to Uniswap's token list specification; Arbified lists are generated by inputting externally maintained list (i.e., coinmarketcap's list) and outputting a list that includes all of the instances of token contracts on the Arbitrum chain bridged via the canonical Arb Token Bridge from tokens on the input list. (See code here.)

\n" + }, + "arbitrum": { + "title": "Arbitrum", + "text": "

A suite of Ethereum child chain scaling technologies built with the Arbitrum Nitro tech stack that includes Arbitrum One (a live implementation of the Arbitrum Rollup Protocol) and Arbitrum Nova (a live implementation of the Arbitrum AnyTrust Protocol).

\n" + }, + "arbitrum-anytrust-chain": { + "title": "Arbitrum AnyTrust Chain", + "text": "

An Arbitrum chain that implements the Arbitrum AnyTrust Protocol.

\n" + }, + "arbitrum-anytrust-protocol": { + "title": "Arbitrum AnyTrust Protocol", + "text": "

An Arbitrum protocol that manages data availability with a permissioned set of parties known as the Data Availability Committee (DAC). This protocol reduces transaction fees by introducing an additional trust assumption for data availability in lieu of Ethereum's Trustless data availability mechanism. Arbitrum Nova is an example of an AnyTrust chain; Arbitrum One is an alternative chain that implements the purely trustless (and more L1-gas intensive) Arbitrum Rollup Protocol.

\n" + }, + "arbitrum-bridge-ui": { + "title": "Arbitrum Bridge UI", + "text": "

Web application built and maintained by Offchain Labs for user-interactions with the Arb Token Bridge; visit it here.

\n" + }, + "arbitrum-chain": { + "title": "Arbitrum chain", + "text": "

A blockchain that runs on the Arbitrum protocol. Arbitrum chains are EVM compatible, and use an underlying EVM chain (e.g., Ethereum) for settlement and for succinct fraud-proofs (as needed). Arbitrum chains come in two forms: Arbitrum Rollup Chains and Arbitrum AnyTrust Chains.

\n" + }, + "arbitrum-chains": { + "title": "Arbitrum Chains", + "text": "

Arbitrum chains (Orbit) refers to the ability for anyone to permissionlessly deploy Layer 3 (L3) chains on top of Arbitrum Layer 2 (L2) chains.

\n" + }, + "arbitrum-classic": { + "title": "Arbitrum Classic", + "text": "

Old Arbitrum stack that used custom virtual machine ("AVM"); no public Arbitrum chain uses the classic stack as of 8/31/2022 (they instead use Arbitrum Nitro.)

\n" + }, + "arbitrum-full-node": { + "title": "Arbitrum Full Node", + "text": "

A party who keeps track of the state of an Arbitrum chain and receives remote procedure calls (RPCs) from clients. Analogous to a non-staking parent Ethereum node.

\n" + }, + "arbitrum-nitro": { + "title": "Arbitrum Nitro", + "text": "

Current Arbitrum tech stack; runs a fork of Geth and uses WebAssembly as its underlying VM for fraud proofs.

\n" + }, + "arbitrum-nova": { + "title": "Arbitrum Nova", + "text": "

The first Arbitrum AnyTrust Chain running on Ethereum mainnet. Introduces cheaper transactions; great for gaming and social use-cases. Implements the Arbitrum AnyTrust Protocol, not the Arbitrum Rollup Protocol protocol. Governed by the Arbitrum DAO.

\n" + }, + "arbitrum-one": { + "title": "Arbitrum One", + "text": "

The first Arbitrum Rollup Chain running on Ethereum mainnet. Great for decentralized finance and other use-cases that demand strong security guarantees. Governed by the Arbitrum DAO.

\n" + }, + "arbitrum-rollup-chain": { + "title": "Arbitrum Rollup Chain", + "text": "

An Arbitrum chain that implements the Arbitrum Rollup Protocol.

\n" + }, + "arbitrum-rollup-protocol": { + "title": "Arbitrum Rollup Protocol", + "text": "

A trustless, permissionless Arbitrum protocol that uses its underlying base layer for data availability and inherits its security. This protocol is implemented by our Arbitrum One chain.

\n" + }, + "arbos": { + "title": "ArbOS", + "text": "

Arbitrum's "operating system" that trustlessly handles system-level operations; includes the ability to emulate the EVM.

\n" + }, + "assertion": { + "title": "Assertion", + "text": "

A bonded claim made by an Arbitrum Validator representing a claim about an Arbitrum chain's state. An Assertion may, e.g., propose a new assertion, or may be a step in a Challenge.

\n

Assertions can have different states:

\n
    \n
  • Proposed: When a validator submits an assertion
  • \n
  • Challenged: If another validator disputes the assertion, an interactive fraud-proof initiates.
  • \n
  • Confirmed: An assertion becomes final if no one challenges it within the dispute window (6.4 days).
  • \n
\n" + }, + "auction-contract": { + "title": "Auction Contract", + "text": "

A smart contract that handles the state, accounting of funds for bids, and various operations of the Timeboost auction. The contract is deployed on the target chain for which Timeboost is enabled.

\n" + }, + "autonomous-auctioneer": { + "title": "Autonomous Auctioneer", + "text": "

Offchain software that receives bids from Timeboost participants, processes and validates bids, and then posts the top valid bid (or top two valid bids in the case of a tie) to the Auction Contract to resolve the on going Timeboost auction. The autonomous auctioneer, for a given chain, is provisioned and deployed by an entity designated by the chain's owner.

\n" + }, + "batch": { + "title": "Batch", + "text": "

A group of Arbitrum transactions posted in a single transaction on the Underlying Chain into the Sequencer Inbox by the Sequencer.

\n" + }, + "blockchain": { + "title": "Blockchain", + "text": "

A distributed digital ledger that is used to record transactions and store data in a secure, transparent, and tamper-resistant way, notably in cryptocurrency protocols.

\n" + }, + "bls-signature": { + "title": "BLS Signature", + "text": "

A cryptographic scheme that allows multiple signatures to be aggregated and compacted into one efficiently verifiable, constant-sized signature. Used in the Arbitrum AnyTrust Protocol for the Data Availability Committee (DAC)'s signatures.

\n" + }, + "bold": { + "title": "BoLD", + "text": "

Short for "Bounded Liquidity Delay"; latest version of the Arbitrum Challenge protocol designed to eliminate delay attack vectors (see here for more).

\n" + }, + "bonder": { + "title": "Bonder", + "text": "

A Validator who deposits a bond (in Ether on Arbitrum One and Arbitrum Nova ) to vouch for a particular assertion in an Arbitrum Chain. A validator who bonds on a false assertion can expect to lose their bond. An honest bonder can recover their bond once the assertion they are bonded on has been confirmed.\nAlso known as: staker

\n" + }, + "bridge": { + "title": "Bridge", + "text": "

A set of smart contracts for sending Cross-chain messages between blockchains. Every Arbitrum chain includes a bridge to/from its Parent chain.

\n" + }, + "chain-owner": { + "title": "Chain Owner", + "text": "

An entity (i.e., a smart contract) with affordance to carry out critical upgrades to an Arbitrum chain's core protocol; this includes upgrading protocol contracts, setting core system parameters, and adding and removing other chain owners.

\n" + }, + "chain-state": { + "title": "Chain state", + "text": "

A particular point in the history of an Arbitrum chain. A chain's state is determined by applying Arbitrum state-transition function to sequence of transactions (i.e., the chain's history).

\n" + }, + "challenge": { + "title": "Challenge", + "text": "

When two bonders disagree about the correct verdict on an assertion, those bonders can be put in a challenge. The challenge is refereed by the contracts on the underlying chain. Eventually one bonder wins the challenge. The protocol guarantees that an honest party will always win a challenge; the loser forfeits their bond.

\n" + }, + "challenge-period": { + "title": "Challenge Period", + "text": "

Window of time (one week on Arbitrum One) over which an Assertion can be challenged, and after which the assertion can be confirmed.

\n" + }, + "challenge-protocol": { + "title": "Challenge protocol", + "text": "

The protocol by which assertions are submitted, disputed, and ultimately confirmed. The Challenge Protocol guarantees that only valid assertions will be confirmed provided that there is at least one honest active validator.

\n" + }, + "child-chain": { + "title": "Child chain", + "text": "

An Arbitrum Chain that settles to a Parent chain. For example, Arbitrum One and Arbitrum Nova are child chains of Ethereum.

\n" + }, + "client": { + "title": "Client", + "text": "

A program running on a user's machine, often in the user's browser, that interacts with contracts on an Arbitrum chain and provides a user interface.

\n" + }, + "confirmation": { + "title": "Confirmation", + "text": "

The decision by an Arbitrum chain to finalize an assertion as part of the chain's history. Once an assertion is confirmed its Child to parent chain Messages (e.g., withdrawals) can be executed.

\n" + }, + "crosschain-message": { + "title": "Cross-chain message", + "text": "

An action taken on some chain A which asynchronously initiates an additional action on chain B.

\n" + }, + "custom-arbtoken": { + "title": "Custom Arb-Token", + "text": "

Any child chain token contract registered to the Arb Token Bridge that isn't a standard arb-token (i.e., a token that uses any gateway other than the StandardERC20 gateway ).

\n" + }, + "custom-gateway": { + "title": "Custom gateway", + "text": "

Any Token Gateway that isn't the StandardERC20 gateway.

\n" + }, + "dapp": { + "title": "dApp", + "text": "

Short for "decentralized application." A dApp typically consists of smart contracts as well as a user-interface for interacting with them.

\n" + }, + "data-availability-certificate": { + "title": "Data Availability Certificate", + "text": "

Signed promise from a Data Availability Committee (DAC) attesting to the availability of a batch of data for an Arbitrum AnyTrust Chain.

\n" + }, + "data-availability-committee-dac": { + "title": "Data Availability Committee (DAC)", + "text": "

A permissioned set of parties responsible for enforcing data availability on a chain using the Arbitrum AnyTrust Protocol.

\n

See Introducing AnyTrust Chains: Cheaper, Faster L2 Chains with Minimal Trust Assumptions to learn more.

\n" + }, + "defensive-validator": { + "title": "Defensive Validator", + "text": "

A Validator that watches an Arbitrum chain and takes action (i.e., bonds and challenges) only when and if an invalid Assertion occurs.

\n" + }, + "delayed-inbox": { + "title": "Delayed Inbox", + "text": "

A contract that holds Parent chain initiated messages to be eventually included in the Sequencer Inbox. Inclusion of messages doesn't depend on the Sequencer.

\n" + }, + "deterministic-proving": { + "title": "Deterministic proving", + "text": "

If challenged, state transitions are replayable and verified onchain.

\n

To achieve this, Arbitrum compiles the State Transition Function (STF) into different formats:

\n
    \n
  • Execution mode: Uses Go's native compiler for high-performance execution on validator nodes.

    \n
  • \n
  • Proving mode: Compiles to WebAssembly (WASM), which transforms into WebAssembly for Arbitrum Virtual Machine (WAVM) for fraud-proof verification.

    \n
  • \n
\n" + }, + "devtools-dashboard": { + "title": "Dev-Tools Dashboard", + "text": "

Web application built and maintained by Offchain Labs for developers and users to debug Arbitrum transactions; i.e., executing or checking the status of Cross-chain messages; visit it here.

\n" + }, + "dissection": { + "title": "Dissection", + "text": "

A step in the Challenge protocol in which two challenging parties interactively narrow down their disagreement until they reach a One Step Proof.

\n" + }, + "ethereum-wallet": { + "title": "Ethereum Wallet", + "text": "

A software application used for transacting with the Ethereum Blockchain.

\n" + }, + "evm": { + "title": "EVM+", + "text": "

The paradigm introduced by Stylus in which Arbitrum's EVM compatibility is preserved while new features and improvements are introduced.

\n" + }, + "execution-claim": { + "title": "Execution claim", + "text": "

A cryptographic commitment to the computed state.

\n" + }, + "express-lane": { + "title": "Express Lane", + "text": "

A component of Timeboost, the express lane is a special endpoint on the Sequencer that immediately sequences incoming, valid transactions signed by the current express lane controller.

\n" + }, + "express-lane-controller": { + "title": "Express Lane Controller", + "text": "

An address, defined in the Auction Contract, that is granted the privilege to use the Express Lane. These privileges are granted after verifying that the incoming transactions were properly signed by the express lane controller, among other checks.

\n" + }, + "externally-owned-accounts": { + "title": "Externally Owned Accounts", + "text": "

An externally owned account (EOA) is the account (public/private key pairs) that has a physical address location. Commonly referred to as a wallet, however, we distinguish an EOA from the user client software wallet.

\n" + }, + "fast-exit--liquidity-exit": { + "title": "Fast Exit / Liquidity Exit", + "text": "

A means by which a user can bypass an Arbitrum chain's Challenge Period when withdrawing fungible assets (or more generally, executing some "fungible" child chain to parent chain operation); for trustless fast exits, a liquidity provider facilitates an atomic swap of the asset on a child chain directly to a parent chain.

\n" + }, + "first-come-first-serve-fcfs": { + "title": "First Come First Serve (FCFS)", + "text": "

A type of Transaction Ordering Policy used by the sequencer in Arbitrum chains whereby incoming transactions are sequenced into a block in the order that the transactions arrived.

\n" + }, + "forceinclusion": { + "title": "Force-Inclusion", + "text": "

Censorship resistant path for including a message into an Arbitrum chain via the Delayed Inbox on its Parent chain; bypasses any Sequencer involvement.

\n" + }, + "fraud-proof": { + "title": "Fraud proof", + "text": "

The means by which an Active Validator proves to its underlying chain that an invalid state transition has taken place.

\n" + }, + "gas-price-floor": { + "title": "Gas Price Floor", + "text": "

Protocol-enforced minimum gas price on an Arbitrum chain; currently 0.1 gwei on Arbitrum One and 0.01 gwei on Arbitrum Nova.

\n" + }, + "gateway-router": { + "title": "Gateway Router", + "text": "

Contracts in the Arb Token Bridge responsible for mapping tokens to their appropriate Token Gateway.

\n" + }, + "genericcustom-gateway": { + "title": "Generic-Custom Gateway", + "text": "

A particular Custom gateway via which a parent chain token contract can be registered to a token contract deployed to a child chain. A useful alternative to the StandardERC20 gateway for projects that wish to control the address of their child chain token contract, maintain the child chain token contract upgradability, and for various other use-cases.

\n" + }, + "geth": { + "title": "Geth", + "text": "

An execution-layer client that defines the Ethereum state transition function and handles network-layer logic like transaction memory pooling. Arbitrum Nitro utilizes a fork of Geth to implement Arbitrum's state transition function.

\n" + }, + "ink": { + "title": "Ink", + "text": "

The equivalent of gas in the Stylus vm. Ink is introduced for finer granularity than gas offers since Stylus's operations are considerably cheaper than their EVM analogs.

\n" + }, + "l2-block": { + "title": "L2 Block", + "text": "

Data structure that represents a group of L2 transactions (analogous to L1 blocks).

\n" + }, + "l2-to-l1-message": { + "title": "L2 to L1 Message", + "text": "

A message initiated from within an Arbitrum chain to be eventually executed on Layer 1 (parent chain) (e.g., token or Ether withdrawals). On Rollup chains like Arbitrum One, the Challenge Period must pass before a child to parent chain message is executed.

\n" + }, + "layer-1-l1": { + "title": "Layer 1 (L1)", + "text": "

The base protocol and underlying blockchain of the Ethereum network. Responsible for maintaining the integrity of the distributed ledger and executing smart contracts. Contains both Ethereum's execution layer and consensus layer.

\n" + }, + "layer-2-l2": { + "title": "Layer 2 (L2)", + "text": "

Trustless scaling solutions built on top of Ethereum's Layer 1 (L1) base protocol, such as state channels, plasma chains, optimistic rollups, and ZK-rollups. Layer 2 solutions aim to increase scalability and reduce the cost of transactions on Ethereum's Layer 1 without introducing additional trust assumptions.

\n" + }, + "layer-3-l3": { + "title": "Layer 3 (L3)", + "text": "

An Arbitrum chain whose core contract reside on an Arbitrum Layer 2 (L2) chain.

\n" + }, + "native-fee-token": { + "title": "Native Fee Token", + "text": "

An ERC-20 token used as the native currency for gas fees on an Arbitrum chain (i.e., as opposed to using Ether). Arbitrum chains introduced the option for chains to use native fee tokens.

\n" + }, + "offchain-labs": { + "title": "Offchain Labs", + "text": "

The initial builders Arbitrum; current contributors to the Arbitrum ecosystem and service providers to the Arbitrum DAO. Offchain also runs and maintains the Sequencers for Arbitrum One and Arbitrum Nova.

\n" + }, + "one-step-proof": { + "title": "One Step Proof", + "text": "

Final step in a challenge; a single operation of the Arbitrum VM (WASM ) is executed on the underlying chain, and the validity of its state transition is verified.

\n" + }, + "outbox": { + "title": "Outbox", + "text": "

A parent chain contract responsible for tracking Child to parent chain Messages, including withdrawals, which can be executed once they are confirmed. The outbox stores a Merkle Root of all outgoing messages.

\n" + }, + "parent-chain": { + "title": "Parent chain", + "text": "

EVM compatible chain that acts as the settlement layer for one or more Arbitrum Chains (aka Child chain ). E.g., Ethereum is the parent chain of both Arbitrum One and Arbitrum Nova. Parent chain is synonymous with "underlying chain."

\n" + }, + "permissionless-validation": { + "title": "Permissionless validation", + "text": "

Anyone can become a validator by running an Arbitrum node, without permission.

\n" + }, + "portal": { + "title": "Portal", + "text": "

A web application maintained by Offchain Labs showcasing the Arbitrum ecosystem; visit it here.

\n" + }, + "predecessor-assertion": { + "title": "Predecessor Assertion", + "text": "

The last confirmed valid state of the chain.

\n" + }, + "raas": { + "title": "raas", + "text": "

RaaS (Rollup as a Service) is a platform that provides the necessary infrastructure and tools to deploy and operate blockchain Rollups, eliminating the need for teams to build the underlying technical infrastructure themselves. It typically includes pre-built Rollup software, node hosting, data availability solutions, and monitoring tools, allowing developers to focus on their application logic rather than the complex technical implementation of Rollup technology.

\n" + }, + "rblock": { + "title": "RBlock", + "text": "

Refer to Assertion

\n" + }, + "reorg": { + "title": "Reorg", + "text": "

A situation in which transactions on a chain that were at some point considered accepted then get rejected. In the context of an Arbitrum chain, once transactions are posted in the chain's Sequencer Inbox, the only way the chain can experience a reorg is if its Underlying Chain itself reorgs. Of note, Fraud proofs do not cause reorgs.

\n" + }, + "retryable-autoredeem": { + "title": "Retryable Autoredeem", + "text": "

The "automatic" (i.e., requiring no additional user action) execution of a Retryable Ticket on an Arbitrum chain.

\n" + }, + "retryable-redeem": { + "title": "Retryable Redeem", + "text": "

The execution of a Retryable Ticket on a child chain; can be automatic (see Retryable Autoredeem) or manual via a user-initiated child chain transaction.

\n" + }, + "retryable-ticket": { + "title": "Retryable Ticket", + "text": "

A parent to child cross chain message initiated by a parent chain transaction sent to an Arbitrum chain for execution (e.g., a token deposit).

\n" + }, + "reverse-token-gateway": { + "title": "Reverse Token Gateway", + "text": "

A Token Gateway in which the Child chain gateway contract escrows and releases tokens, which the Parent chain Gateway contract mints and burns tokens. This in the inverse to how "typical" gateways work.

\n" + }, + "sequencer": { + "title": "Sequencer", + "text": "

An entity (currently a single-party on Arbitrum One) given rights to reorder transactions in the Sequencer Inbox over a fixed window of time, who can thus give clients sub-blocktime Soft Confirmations. (Not to be confused with a Validator).

\n" + }, + "sequencer-feed": { + "title": "Sequencer Feed", + "text": "

Offchain data feed published by the Sequencer which clients can subscribe to for Soft Confirmations of transactions before they are posted in batches.

\n" + }, + "sequencer-inbox": { + "title": "Sequencer Inbox", + "text": "

Contract that holds a sequence of messages sent by clients to an Arbitrum Chain; a message can be put into the Sequencer Inbox directly by the Sequencer or indirectly through the Delayed Inbox.

\n" + }, + "shared-sequencing": { + "title": "Shared Sequencing", + "text": "

A protocol design space in which multiple rollups use the same entity as their Sequencer; potential benefits include enhanced interoperability and credible neutrality.

\n" + }, + "smart-contract": { + "title": "Smart Contract", + "text": "

A computer program whose operations are defined and executed within a blockchain consensus protocol.

\n" + }, + "soft-confirmation": { + "title": "Soft Confirmation", + "text": "

A semi-trusted promise from the Sequencer to post a user's transaction in the near future; soft-confirmations happen prior to posting on the Parent chain, and thus can be given near-instantaneously (i.e., faster than the parent chain's block times)

\n" + }, + "speed-limit": { + "title": "Speed Limit", + "text": "

Target computation limit for an Arbitrum chain. Arbitrum One and Arbitrum Nova currently target 7,000,000 gas / second. When computation exceeds this limit, fees rise, via EIP-1559.

\n" + }, + "standard-arbtoken": { + "title": "Standard Arb-Token", + "text": "

An token contract on an Arbitrum chain deployed via the StandardERC20 gateway; offers basic ERC-20 functionality in addition to deposit / withdrawal affordances.

\n" + }, + "standarderc20-gateway": { + "title": "StandardERC20 gateway", + "text": "

Token Gateway via which any underlying chain's ERC-20 token can permissionlessly bridge; the StandardERC20 gateway contracts deploy a Standard Arb-Token on the Child chain for each bridged token.

\n" + }, + "state-transition-function": { + "title": "State Transition Function", + "text": "

The STF (State Transition Function) defines how new blocks are produced from input messages (i.e., transactions) in an Arbitrum chain. The State Transition Function's output is the result of applying those input messages (transactions).

\n" + }, + "stylus": { + "title": "Stylus", + "text": "

Upgrade to the Arbitrum Nitro virtual machine that allows smart contract support for languages like Rust and C++ by taking advantage of Nitro's use of WASM. Currently on testnet (read more).

\n" + }, + "timeboost": { + "title": "Timeboost", + "text": "

A transaction ordering policy in which entities can bid for the right to access an express lane on the Sequencer for faster transaction inclusion. See the research specification to learn more.

\n" + }, + "token-gateway": { + "title": "Token Gateway", + "text": "

A pair of contracts in the token bridge — one on the Parent chain , one on the Child chain — that provide a particular mechanism for handling the transfer of tokens between layers. Token gateways currently active in the bridge include the StandardERC20 gateway , the Generic-Custom Gateway , and the WETH Gateway.

\n" + }, + "transaction": { + "title": "Transaction", + "text": "

A user-initiated interaction with a Blockchain. Transactions are typically signed by users via wallets and are paid for via transaction fees.

\n" + }, + "transaction-ordering-policy": { + "title": "Transaction Ordering Policy", + "text": "

The rules and logic employed by a chain to order incoming transactions into a block.

\n" + }, + "trustless": { + "title": "Trustless", + "text": "

In the context of Ethereum, trustless refers to the ability of a system to operate without reliance on a central authority or intermediary. Instead, users place their trust in math and protocols.

\n

This is achieved through the use of cryptographic techniques and decentralized consensus mechanisms that let users verify the integrity of network transactions using open-source software. Trustless systems are considered to be more secure and resistant to fraud or tampering because they don't rely on a single point of failure that can be exploited by attackers.

\n" + }, + "trustless-verification": { + "title": "Trustless verification", + "text": "

Trustless verification

\n

Validators confirm assertions, ensuring transactions adhere to the protocol rules.

\n" + }, + "underlying-chain": { + "title": "Underlying Chain", + "text": "

Synonymous with Parent chain.

\n" + }, + "validator": { + "title": "Validator", + "text": "

An Arbitrum Full Node that tracks the status of the chains' Assertions. A validator may be a Watchtower Validator, a Defensive Validator, or an Active Validator.

\n" + }, + "wallet": { + "title": "Wallet", + "text": "

When referring to a wallet, we mean the user client software enabling user actions. Often, client software is a browser extension, mobile, or desktop app. Also refer to Externally Owned Accounts.

\n" + }, + "wasm": { + "title": "WASM", + "text": "

Widely supported binary code format for executable programs. Used by Arbitrum Nitro for Fraud proofs , and more broadly used by Stylus to support performant smart contracts in a wide variety of languages.

\n" + }, + "wasmer": { + "title": "WASMer", + "text": "

A popular WebAssembly runtime for executing WASM binaries. A fork of WASMer is used for executing Stylus programs. WASMer executes considerably faster than Geth executes EVM code, contributing to Stylus's lower fees.

\n" + }, + "watchtower-validator": { + "title": "Watchtower Validator", + "text": "

A Validator that never bonds / never takes on chain action, who raises the alarm (by whatever offchain means it chooses) if it witnesses an invalid assertion.

\n" + }, + "weth-gateway": { + "title": "WETH Gateway", + "text": "

Token Gateway for handing the bridging of wrapped Ether (WETH). WETH is unwrapped on the parent chain and rewrapped on the parent chain upon depositing (and vice-versa upon withdrawing), ensuring WETH on the child chain always remains collateralized.

\n" + } +} From a2570d960993ee082d10efd5ce10cc098fa79cf1 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:51:55 -0700 Subject: [PATCH 54/75] edit on inside arb page --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 8edea790ec..20270571e7 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -544,12 +544,6 @@ Arbitrum's architecture represents a sophisticated balance of competing requirem - **Compatibility vs. Innovation**: Full Ethereum compatibility while enabling new capabilities - **Cost vs. Features**: Minimal fees while providing advanced Layer 2 functionality -### Looking Forward - -With BoLD enabling permissionless validation, Stylus providing high-performance smart contracts, and continuous improvements to the Sequencer and compression systems, Arbitrum continues to push the boundaries of what's possible in Layer 2 scaling. - -**The Result**: A system that feels like Ethereum but performs like a next-generation blockchain, enabling developers to build applications that were previously impossible due to cost and performance constraints. - --- ## Deep Dive Resources From 923837a83a30e4f46eeac3ebfae3207cde9ea70e Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:02:19 -0700 Subject: [PATCH 55/75] captions added --- .../01-inside-arbitrum-nitro.mdx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 20270571e7..c7af38973a 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -99,7 +99,7 @@ The Sequencer immediately publishes your transaction through its **real-time fee - **State Synchronization**: All nodes stay synchronized with the latest transaction sequence - **Soft Finality**: You can act on your transaction immediately, knowing it's been properly ordered - + ### Batching and Compression @@ -117,7 +117,7 @@ The Sequencer uses the **Brotli compression algorithm** to minimize the data tha - **Cost Optimization**: Higher compression reduces L1 posting costs but requires more computation - **Adaptive Strategy**: System prioritizes speed over compression when backlog is high - + ### Posting to Ethereum @@ -135,7 +135,10 @@ Once batched and compressed, your transaction data is posted to Ethereum through - **Direct Inclusion**: Transaction data included directly in calldata - **Compatibility**: Works with all Ethereum configurations - + **Why This Matters**: The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum, while the dual posting strategy ensures optimal cost efficiency under varying network conditions. @@ -237,7 +240,10 @@ Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute prot - **All-vs-All Battle Royale**: Single honest party can defend against unlimited malicious challengers - **Stage 2 Rollup**: Enables Arbitrum to achieve full decentralization - + ### Assertions: Claims About Chain State @@ -395,7 +401,7 @@ When you want to send assets or data from Ethereum to Arbitrum, you have several - **Signed Messages**: From EOAs with signature verification - **Unsigned Messages**: From contracts with address aliasing for security - + ### L2 to L1 Messaging: From Arbitrum to Ethereum @@ -414,7 +420,7 @@ Moving assets or data from Arbitrum back to Ethereum follows a different pattern - **Merkle Proofs**: Messages are proven using Merkle inclusion proofs - **Unlimited Lifetime**: Messages persist until successfully executed - + ### The Canonical Bridge Architecture From d5c0af76f4fa47d5c3117a0f8249c54306aa1b1f Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:29:33 -0700 Subject: [PATCH 56/75] inside arbitrum page updated and deleted some diagrams --- .../01-inside-arbitrum-nitro.mdx | 58 +------------------ docs/partials/_glossary-partial.mdx | 2 +- 2 files changed, 2 insertions(+), 58 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index c7af38973a..b2d852baa9 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -2,7 +2,7 @@ title: 'Inside Arbitrum Nitro' description: "Follow a transaction's journey through the complete Arbitrum Nitro stack, from submission to finality." author: pete-vielhaber -sme: edfelten +sme: mehdi salehi user_story: "As a developer, I need to understand how transactions flow through Arbitrum's architecture and how the system ensures security and performance." content_type: get-started --- @@ -99,8 +99,6 @@ The Sequencer immediately publishes your transaction through its **real-time fee - **State Synchronization**: All nodes stay synchronized with the latest transaction sequence - **Soft Finality**: You can act on your transaction immediately, knowing it's been properly ordered - - ### Batching and Compression The Sequencer doesn't process transactions individually. Instead, it collects multiple transactions into **batches** for efficient processing: @@ -117,8 +115,6 @@ The Sequencer uses the **Brotli compression algorithm** to minimize the data tha - **Cost Optimization**: Higher compression reduces L1 posting costs but requires more computation - **Adaptive Strategy**: System prioritizes speed over compression when backlog is high - - ### Posting to Ethereum Once batched and compressed, your transaction data is posted to Ethereum through the **Sequencer Inbox Contract**. The Sequencer uses two primary methods: @@ -135,11 +131,6 @@ Once batched and compressed, your transaction data is posted to Ethereum through - **Direct Inclusion**: Transaction data included directly in calldata - **Compatibility**: Works with all Ethereum configurations - - **Why This Matters**: The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum, while the dual posting strategy ensures optimal cost efficiency under varying network conditions. ## Chapter 3: State Transition Function - Where Execution Happens @@ -240,11 +231,6 @@ Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute prot - **All-vs-All Battle Royale**: Single honest party can defend against unlimited malicious challengers - **Stage 2 Rollup**: Enables Arbitrum to achieve full decentralization - - ### Assertions: Claims About Chain State Validators post **assertions**—claims about Arbitrum's execution state—to Ethereum. Each assertion contains: @@ -339,22 +325,6 @@ BoLD validators can adopt different strategies based on their resources and goal **Challenge Participant Strategy**: Participates in ongoing challenges by posting challenge bonds (555/79 ETH) and making moves in dispute resolution. -### Trustless Bonding Pools: Democratizing Validation - -To address the high bond requirements, BoLD includes **trustless bonding pools**: - -**How Bonding Pools Work:** - -- **Crowdsourced Funding**: Multiple parties can pool funds to meet bond requirements -- **Trustless Operation**: No need to trust other pool participants -- **Automatic Deployment**: Validator software can auto-deploy pools when needed -- **Proportional Rewards**: Participants receive rewards proportional to their contribution - -**Pool Types:** - -- **Assertion Pools**: For posting assertions (3600 ETH total) -- **Challenge Pools**: For participating in challenges (555/79 ETH per level) - ### Economic Security and Resource Ratios BoLD uses sophisticated economic mechanisms to ensure security: @@ -401,8 +371,6 @@ When you want to send assets or data from Ethereum to Arbitrum, you have several - **Signed Messages**: From EOAs with signature verification - **Unsigned Messages**: From contracts with address aliasing for security - - ### L2 to L1 Messaging: From Arbitrum to Ethereum Moving assets or data from Arbitrum back to Ethereum follows a different pattern: @@ -420,8 +388,6 @@ Moving assets or data from Arbitrum back to Ethereum follows a different pattern - **Merkle Proofs**: Messages are proven using Merkle inclusion proofs - **Unlimited Lifetime**: Messages persist until successfully executed - - ### The Canonical Bridge Architecture Arbitrum's canonical bridge uses a sophisticated three-component system: @@ -530,28 +496,6 @@ Arbitrum includes several advanced features that extend its capabilities beyond **Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova uses AnyTrust to achieve lower fees than Arbitrum One. -## Conclusion: The Complete Journey - -Your transaction's journey through Arbitrum is now complete. From the moment you submitted it to the Sequencer, through execution in the State Transition Function, to final confirmation on Ethereum, your transaction has been processed securely and efficiently. - -### What Makes Arbitrum Special - -**Performance**: 10x lower fees and 100x faster transactions compared to Ethereum -**Security**: Ethereum-equivalent security through cryptographic proofs and economic incentives -**Compatibility**: Full EVM compatibility with seamless migration of existing applications -**Innovation**: Advanced features like Stylus, BoLD, and Timeboost that extend beyond basic Layer 2 - -### The Technical Achievement - -Arbitrum's architecture represents a sophisticated balance of competing requirements: - -- **Speed vs. Security**: Soft finality for immediate feedback, hard finality for cryptographic security -- **Efficiency vs. Decentralization**: Optimized performance while maintaining permissionless validation -- **Compatibility vs. Innovation**: Full Ethereum compatibility while enabling new capabilities -- **Cost vs. Features**: Minimal fees while providing advanced Layer 2 functionality - ---- - ## Deep Dive Resources This journey has covered the high-level flow of transactions through Arbitrum. For detailed technical information on specific components, explore these deep dives: diff --git a/docs/partials/_glossary-partial.mdx b/docs/partials/_glossary-partial.mdx index 0bdb92906d..18730b58fa 100644 --- a/docs/partials/_glossary-partial.mdx +++ b/docs/partials/_glossary-partial.mdx @@ -3,7 +3,7 @@ partial_type: glossary title: 'Arbitrum Glossary Definitions' description: 'Comprehensive glossary of Arbitrum terminology and definitions' author: anegg0 -last_reviewed: 2025-10-07 +last_reviewed: 2025-10-08 --- ### Active Validator {#active-validator} From 8c2475e1f2c02445783a42b8a924dea22784d605 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 9 Oct 2025 15:25:31 -0500 Subject: [PATCH 57/75] Minor styling and readability edits --- .../01-inside-arbitrum-nitro.mdx | 380 ++++++++---------- 1 file changed, 166 insertions(+), 214 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index b2d852baa9..9e35343c6c 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,13 +9,11 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -## A Transaction's Journey Through Arbitrum - Imagine you're a developer sending a transaction to Arbitrum. What happens from the moment you submit it until it achieves finality? Let's trace this journey step by step, exploring how Arbitrum's architecture ensures your transaction is processed correctly, efficiently, and securely. -This story will take us through the complete Arbitrum Nitro stack—from the Sequencer that orders your transaction, through the State Transition Function that executes it, to the validation system that ensures its correctness. Along the way, we'll discover how Arbitrum achieves Ethereum-level security while providing 10x lower fees and 100x faster transactions. +This article will take us through the complete Arbitrum Nitro stack—from the Sequencer that orders your transaction, through the State Transition Function that executes it, to the validation system that ensures its correctness. Along the way, we'll discover how Arbitrum achieves Ethereum-level security while offering 10 times lower fees and 100 times faster transactions. -## The Foundation: Arbitrum's Core Architecture +## The Foundation: Arbitrum's core architecture overview Before we begin our journey, let's understand the fundamental architecture that makes everything possible. Arbitrum operates on a simple but powerful principle: **deterministic state transitions**. @@ -30,114 +28,132 @@ Before we begin our journey, let's understand the fundamental architecture that 2. **State Transition Function (STF)**: Processes transactions deterministically 3. **Outputs**: Produces results and state updates -This deterministic model ensures that given the same inputs, all honest nodes will produce identical outputs. This property is crucial for Arbitrum's security model—it enables fraud proofs and dispute resolution mechanisms that can verify execution correctness without re-running entire transactions. +This deterministic model ensures that given the same inputs, all honest nodes will produce identical outputs. This property is crucial for Arbitrum's security model, as it enables fraud proofs and dispute resolution mechanisms that can verify execution correctness without re-running entire transactions. -## Nitro's Four Big Ideas +## Nitro's four big ideas -Arbitrum Nitro's design is built around four fundamental innovations that enable its performance and security characteristics: +Arbitrum Nitro's design is rooted in four fundamental innovations that enable its performance and security characteristics: -### 1. Sequencing, Followed by Deterministic Execution +### 1. Sequencing, followed by deterministic execution Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). -### 2. Geth at the Core +### 2. Geth at the core Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library ensures a very high degree of compatibility with Ethereum. -### 3. Separate Execution from Proving +### 3. Separate execution from proving + +Nitro compiles the same source twice: once to native code for execution in a Nitro node (optimized for speed), and again to WASM for use in proving (optimized for portability and security). + +### 4. Optimistic rollup with interactive fraud proofs -Nitro takes the same source and compiles it twice: once to native code for execution in a Nitro node (optimized for speed), and again to WASM for use in proving (optimized for portability and security). +Nitro settles transactions on the Layer 1 Ethereum chain using an Optimistic Rollup protocol, which includes the interactive fraud proofs pioneered by Arbitrum. -### 4. Optimistic Rollup with Interactive Fraud Proofs +:::info Why do these matter -Nitro settles transactions to the Layer 1 Ethereum chain using an Optimistic Rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. +These four innovations collectively enable Arbitrum to achieve Ethereum-level security with substantially improved performance characteristics while maintaining complete compatibility with existing Ethereum applications. -**Why These Matter**: These four innovations collectively enable Arbitrum to achieve Ethereum-level security with substantially improved performance characteristics while maintaining complete compatibility with existing Ethereum applications. +::: -## Chapter 1: Transaction Submission - The Journey Begins +## Step 1: The journey begins: Submitting a transaction -Your transaction's journey starts when you submit it to Arbitrum. You have several pathways available, each with different characteristics: +Your transaction's journey starts when you submit it to Arbitrum. You have several routes available, each with different characteristics: -### The Standard Path: Through the Sequencer +### Route 1: Through the Sequencer -Most transactions take the standard path through the **Sequencer**—a specialized node responsible for ordering transactions and providing immediate confirmations. The Sequencer offers several submission methods: +Most transactions take the standard path through the **Sequencer**—a specialized node responsible for ordering transactions and providing immediate confirmations. The Sequencer offers several methods to submit a transaction: - **Public RPC**: For development and light usage - **Third-party RPC**: For higher throughput and better performance - **Direct Sequencer endpoint**: For the lowest possible latency - **Self-hosted Arbitrum nodes**: For maximum control and privacy -### The Alternative Path: Bypassing the Sequencer +### Route 2: Bypassing the Sequencer -For censorship resistance, you can submit transactions directly to the **Delayed Inbox** contract on Ethereum. This method ensures your transaction will be processed even if the Sequencer refuses to handle it. +To mitigate censorship, you can submit transactions directly to the **Delayed Inbox** contract on Ethereum. This method ensures your transaction will be processed even if the Sequencer refuses to handle it (censorship resistance). **How It Works:** - **Delayed Inbox Queue**: Messages submitted by non-Sequencer nodes go into the "delayed inbox" queue -- **Sequencer Release**: A well-behaved Sequencer typically releases delayed messages after about 10 minutes -- **Force Inclusion**: If a message has been in the delayed inbox queue for longer than 24 hours, anyone can force it to be promoted to the main inbox -- **Censorship Resistance**: This ensures the Sequencer can only delay messages but can't censor them +- **Sequencer Release**: A well-behaved Sequencer typically releases delayed messages after about ten minutes +- **Force Inclusion**: If a message has been in the delayed inbox queue for longer than 24 hours, anyone can force it into the main inbox +- **Censorship Resistance**: This ensures the Sequencer can only delay messages but can't censor (refuse) them **Trade-offs:** - **Sequencer Path**: Finality is faster (immediate soft finality) - **Delayed Inbox Path**: Finality is slower (roughly double the time) but provides censorship resistance -**Why This Matters**: The Sequencer provides immediate "soft finality" by promising to include your transaction in a specific order. This enables fast user experience while maintaining the option for censorship-resistant submission when needed. +:::info Why does this matter + +The Sequencer provides immediate "soft finality" by promising to include your transaction in a specific order. "Soft finality" enables fast user experience while maintaining the option for censorship-resistant submission when needed. + +::: -## Chapter 2: The Sequencer - Ordering and Broadcasting +## Step 2: Ordering and broadcasting: The Sequencer Once your transaction reaches the Sequencer, it enters a sophisticated ordering and broadcasting system designed for both performance and security. -### Real-Time Transaction Feed +### Real-time transaction feed The Sequencer immediately publishes your transaction through its **real-time feed**, providing instant visibility to all nodes in the network. This feed serves multiple critical functions: - **Immediate Confirmation**: You receive instant feedback that your transaction has been accepted and ordered - **State Synchronization**: All nodes stay synchronized with the latest transaction sequence -- **Soft Finality**: You can act on your transaction immediately, knowing it's been properly ordered +- **Soft Finality**: You can act on your transaction immediately, knowing the Sequencer has ordered it properly -### Batching and Compression +### Batching and compression -The Sequencer doesn't process transactions individually. Instead, it collects multiple transactions into **batches** for efficient processing: +The Sequencer doesn't process transactions individually. Instead, it collects multiple transactions into **batches** for efficient processing and lower costs: **Batch Formation Criteria:** -- **Size Threshold**: Batches are created when accumulated transactions reach a predefined size limit +- **Size Threshold**: The creation of batches occurs when enough accumulated transactions reach a predefined size limit - **Time Constraints**: Batches are also created based on elapsed time to prevent undue delays **Compression Process:** -The Sequencer uses the **Brotli compression algorithm** to minimize the data that needs to be posted to Ethereum: +The Sequencer uses the **Brotli compression algorithm** to minimize the data required to post to Ethereum: - **Dynamic Compression Levels**: Compression level adjusts based on network backlog (0-11 scale) - **Cost Optimization**: Higher compression reduces L1 posting costs but requires more computation -- **Adaptive Strategy**: System prioritizes speed over compression when backlog is high +- **Adaptive Strategy**: System prioritizes speed over compression when the backlog is high ### Posting to Ethereum -Once batched and compressed, your transaction data is posted to Ethereum through the **Sequencer Inbox Contract**. The Sequencer uses two primary methods: +Once batched and compressed, transaction data posts to Ethereum through the **Sequencer Inbox Contract**. The Sequencer uses two primary methods: -**1. Blob Transactions (EIP-4844)** +**1. Blob Transactions ([EIP-4844](https://eips.ethereum.org/EIPS/eip-4844))** (default) -- **Default Method**: When Ethereum supports EIP-4844 +- **Default Method**: When Ethereum supports [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) - **Cost Efficient**: Blobs provide cheaper data inclusion than calldata - **Scalable**: Enables handling of large transaction volumes **2. Calldata Transactions** -- **Fallback Method**: When blob fees are high or EIP-4844 unavailable +- **Fallback Method**: When blob fees are high or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) unavailable - **Direct Inclusion**: Transaction data included directly in calldata - **Compatibility**: Works with all Ethereum configurations -**Why This Matters**: The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum, while the dual posting strategy ensures optimal cost efficiency under varying network conditions. +:::info Why does this matter + +The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum. This dual posting strategy ensures optimal cost efficiency under varying network conditions. + +::: + +:::note Sequencer deep-dive + +To learn more about the inner workings of the Sequencer and how it works in specific detail, refer to the [Sequencer deep-dive](/how-arbitrum-works/deep-dives/sequencer.mdx). + +::: -## Chapter 3: State Transition Function - Where Execution Happens +## Step 3: Where execution happens: State Transition Function -Now that your transaction has been ordered and batched, it's time for execution. This happens in the **State Transition Function (STF)**—the heart of Arbitrum's execution engine. +Now that your transaction has been ordered and batched, execution occurs next. Execution happens in the **State Transition Function (STF)**—the heart of Arbitrum's execution engine. -### The Geth Integration: Complete EVM Compatibility +### The Geth integration: Complete EVM compatibility Arbitrum achieves full Ethereum compatibility through a sophisticated three-layer architecture: @@ -147,11 +163,11 @@ Arbitrum achieves full Ethereum compatibility through a sophisticated three-laye - The foundation consists of the core Geth components that handle EVM execution - Ensures behavioral consistency with Ethereum -- Provides proven security through battle-tested code +- Provides proven security through rigorously tested code **Layer 2: ArbOS (Arbitrum Operating System)** -- Provides Layer 2-specific functionality including cross-chain messaging +- Provides Layer 2-specific functionality, including cross-chain messaging - Handles fee accounting and gas price management - Manages deposits, withdrawals, and advanced features like Stylus @@ -160,192 +176,98 @@ Arbitrum achieves full Ethereum compatibility through a sophisticated three-laye - Handles RPC connections and API requests - Provides Ethereum-compatible node functionality for client applications -### Transaction Processing Flow +### How transactions are processed When your transaction reaches the STF, it follows this execution path: 1. **Transaction Validation**: ArbOS validates your transaction format and checks sufficient funds -2. **Gas Charging**: The system charges for both L2 execution and L1 data posting costs -3. **EVM Execution**: Geth processes your transaction according to standard EVM semantics +2. **Gas Charging**: The system calculates and adds the cost for both L2 execution and L1 data posting costs +3. **EVM Execution**: Geth processes your transaction according to standard EVM protocols 4. **State Updates**: ArbOS updates Layer 2-specific state and handles cross-chain operations 5. **Receipt Generation**: The system produces transaction receipts and logs -### Stylus Integration: Beyond EVM +### Stylus integration: Beyond EVM -If your transaction interacts with a **Stylus contract** (WebAssembly-based), the execution flow differs: +If your transaction interacts with a **Stylus contract** (WebAssembly (WASM)-based), the execution flow differs: - **WASM Runtime**: ArbOS routes execution to the WASM runtime instead of the EVM - **Host I/O Operations**: Stylus contracts use specialized host I/O calls for blockchain state access - **Enhanced Performance**: Stylus contracts can execute 10-70x faster than EVM equivalents - **Full Interoperability**: Stylus contracts can seamlessly call EVM contracts and vice versa -**Why This Matters**: The Geth integration ensures that existing Ethereum applications work without modification, while ArbOS adds Layer 2 capabilities and Stylus enables high-performance alternatives for new applications. - -## Chapter 4: Finality - From Soft to Hard - -Your transaction now has two levels of finality, each serving different purposes in Arbitrum's security model. - -### Soft Finality: Immediate Confirmation - -The moment the Sequencer includes your transaction in its feed, you achieve **soft finality**: - -- **Instant Feedback**: You receive immediate confirmation that your transaction has been accepted -- **Sequencer Promise**: The Sequencer commits to including your transaction in a specific order -- **User Experience**: You can act on your transaction immediately without waiting - -**Trust Model**: Soft finality relies on the Sequencer's honesty and availability. While this provides excellent user experience, it's not cryptographically secured. - -### Hard Finality: Cryptographic Security - -**Hard finality** is achieved when your transaction's batch is posted to and confirmed on Ethereum: - -- **Ethereum Security**: Your transaction inherits Ethereum's consensus security -- **Data Availability**: All transaction data is publicly available on Ethereum -- **Irreversibility**: Once confirmed, your transaction cannot be reversed - -**Timeline**: Hard finality typically takes 10-20 minutes, depending on Ethereum block times and batch posting frequency. - -### The Security Guarantee - -This dual-finality model provides the best of both worlds: - -- **Fast User Experience**: Soft finality enables immediate transaction confirmation -- **Cryptographic Security**: Hard finality provides Ethereum-level security guarantees -- **Censorship Resistance**: Alternative submission paths ensure your transaction can always be processed - -**Why This Matters**: You get immediate feedback for optimal user experience while maintaining the security guarantees that make Arbitrum suitable for high-value transactions. - -## Chapter 5: Validation and Dispute Resolution - Ensuring Correctness - -Now that your transaction has been executed, how does Arbitrum ensure it was processed correctly? This is where the **BoLD validation system** comes into play. - -### The BoLD Protocol: Permissionless Validation - -Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute protocol that enables **permissionless validation**. Unlike traditional optimistic rollups, BoLD allows anyone to participate in validation without permission while guaranteeing time-bounded dispute resolution. - -**Key BoLD Features:** - -- **Permissionless Validation**: Anyone can validate and challenge assertions -- **Time-Bounded Disputes**: Guaranteed resolution within 6.4 days maximum -- **Trustless Cooperation**: Multiple honest parties can defend the same correct state -- **All-vs-All Battle Royale**: Single honest party can defend against unlimited malicious challengers -- **Stage 2 Rollup**: Enables Arbitrum to achieve full decentralization - -### Assertions: Claims About Chain State +:::info Why does this matter -Validators post **assertions**—claims about Arbitrum's execution state—to Ethereum. Each assertion contains: +The Geth integration ensures that existing Ethereum applications work without modification, while ArbOS adds Layer 2 capabilities and Stylus enables high-performance alternatives for new applications. -- **Child chain block hash**: The claimed final state -- **History commitment**: Merkle root of all intermediate block hashes -- **Batch number**: Corresponding Arbitrum batch -- **Inbox message count**: Messages consumed during execution +::: -**Assertion Bonding**: Validators must bond **3600 ETH** to post assertions. This bond is refundable when their assertion is confirmed, but forfeited if proven incorrect. +:::note State Transition Function deep-dive -### The Challenge Process: Multi-Level Dispute Resolution +To learn more about the inner workings of the STF and how it works in specific detail, refer to the [State Transition Function deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). -When validators disagree about assertions, BoLD uses a sophisticated **multi-level challenge system**: +::: -**Level 1: Block Challenges** +## Step 4: Finality -- Validators disagree about specific Arbitrum blocks -- Create **edges** (history commitments) covering disputed block ranges -- Use interactive bisection to narrow disagreement to a single block - -**Level 2: Big-Step Challenges** - -- Disagree about execution within a single block -- Challenge bonds: **555 ETH** required -- Narrow disagreement to ranges of WASM execution steps - -**Level 3: Small-Step Challenges** - -- Disagree about specific WASM execution steps -- Challenge bonds: **79 ETH** required -- Narrow disagreement to a single execution step - -**One-Step Proof**: Final verification of the disputed computation step on Ethereum - -### Timers and Confirmation: Time-Bounded Resolution - -BoLD's key innovation is **time-bounded dispute resolution** through a sophisticated timer system: - -**How Timers Work:** - -- **Unrivaled Timer**: Each edge has a timer that ticks up when no competing edge exists -- **Inherited Timer**: Edges inherit time from their children (recursive definition) -- **Confirmation by Time**: Edges are automatically confirmed when timer reaches 6.4 days -- **Challenge Period**: Maximum time for any dispute to resolve - -**Trustless Cooperation**: Multiple honest parties can defend the same correct state without coordination. If one honest party goes offline, others can continue the defense seamlessly. - -### Interactive Fraud Proofs: Efficient Dispute Resolution +Your transaction now has two levels of finality, each serving different purposes in Arbitrum's security model. -BoLD uses **interactive fraud proofs** to efficiently resolve disputes without re-executing entire transactions: +### Soft finality: Immediate confirmation -**The Process:** +The moment the Sequencer includes your transaction in its feed, you achieve **soft finality** (from [Step 1](#step-1-transaction-submission-the-journey-begins)): -1. **Edge Creation**: Validators create edges (history commitments) for disputed ranges -2. **Interactive Bisection**: Parties iteratively narrow disagreement through binary search -3. **Multi-Level Resolution**: Disputes progress through block → big-step → small-step levels -4. **One-Step Proof**: Final verification of single computation step on Ethereum -5. **Time-Based Confirmation**: Honest edges are confirmed by time if unchallenged +- **Instant Feedback**: You receive immediate confirmation that your transaction is accepted +- **Sequencer Promise**: The Sequencer commits to including your transaction in a specific order +- **User Experience**: You can act on your transaction immediately without waiting -**Why This Works:** +:::info Trust model -- **Deterministic State**: Only one correct state exists for any given input -- **Merkle Commitments**: Efficient proof of state transitions without full data -- **Economic Incentives**: Malicious parties lose bonds, honest parties recover them -- **Parallel Defense**: Multiple honest parties can defend simultaneously +Soft finality relies on the Sequencer's honesty and availability. While this provides an excellent user experience, it's not cryptographically secured. -### WAVM: WebAssembly for Fraud Proofs +::: -For fraud proof verification, Nitro uses a modified version of WebAssembly called **WAVM (WebAssembly Arbitrum Virtual Machine)**. WAVM differs from standard WASM in several key ways: +### Hard finality: Cryptographic security -**Technical Modifications:** +**Hard finality** is achieved when your transaction's batch is posted to **and** confirmed on Ethereum: -- **Feature Removal**: Eliminates WASM features not generated by the Go compiler -- **Restriction Implementation**: Removes floating-point instructions and nested control flow -- **Fixed-Cost Operations**: Transforms variable-time instructions into fixed-cost constructs -- **Blockchain Integration**: Adds specialized opcodes for blockchain environment interaction +- **Ethereum Security**: Your transaction inherits Ethereum's consensus security +- **Data Availability**: All transaction data is publicly available on Ethereum +- **Irreversibility**: Once confirmed, your transaction is not reversible -**ReadPreImage Instruction**: The most significant addition is the ReadPreImage instruction, which enables hash-based data retrieval. This instruction takes a hash H and offset I, returning the data word at offset I of the preimage of H. This enables the "hash oracle trick" where the system stores only Merkle hashes while relying on protocol participants to maintain full data structures. +:::info Timeline -**Why WAVM Matters**: WAVM enables efficient fraud proof verification while maintaining the security and determinism required for dispute resolution. The ReadPreImage instruction allows the system to work with hash-based data structures without storing the full data on-chain. +Hard finality typically takes 10-20 minutes, depending on Ethereum block times and the frequency of batch posting. -### Validator Strategies in BoLD +:::: -BoLD validators can adopt different strategies based on their resources and goals: +### The Security guarantee -**Active Proposer Strategy**: Posts assertions to advance the chain. Requires **3600 ETH** bond and runs in `MakeNodes` mode. Only one active proposer needed for chain progress. +This dual-finality model provides the best of both worlds: -**Defensive Validator Strategy**: Monitors for invalid assertions and intervenes when needed. Can bond to correct assertions or participate in challenges. Runs in `Defensive` or `StakeLatest` mode. +- **Fast User Experience**: Soft finality enables immediate transaction confirmation +- **Cryptographic Security**: Hard finality provides Ethereum-level security guarantees +- **Censorship Resistance**: Alternative submission routes ensure your transaction can and will always be processed -**Watchtower Validator Strategy**: Monitors the protocol without bonding. Detects and reports invalid assertions but takes no on-chain action. Requires no funds and is the default mode for all nodes. +:::info Why does this matter -**Challenge Participant Strategy**: Participates in ongoing challenges by posting challenge bonds (555/79 ETH) and making moves in dispute resolution. +You get immediate feedback for optimal user experience while maintaining the security guarantees that make Arbitrum suitable for high-value transactions. -### Economic Security and Resource Ratios +::: -BoLD uses sophisticated economic mechanisms to ensure security: +## Step 5: Ensuring correctness: Validation and dispute resolution -**Bond Sizes (Arbitrum One):** +Now that your transaction has undergone execution, how does Arbitrum ensure it was processed correctly? We'll cover that in the next section. -- **Assertion Bonds**: 3600 ETH (one-time to become proposer) -- **Big-Step Challenge Bonds**: 555 ETH per challenge -- **Small-Step Challenge Bonds**: 79 ETH per challenge +### The BoLD Protocol: Permissionless validation -**Resource Ratio**: BoLD achieves a **6.46x resource ratio**, meaning malicious parties must spend 6.46x more than honest parties to attack the system. +Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute protocol that enables **permissionless validation**. Unlike traditional optimistic rollups, BoLD allows anyone to participate in validation without permission while guaranteeing time-bounded dispute resolution. -**Economic Incentives:** +BoLD implements a new dispute system that allows any single entity to defend Arbitrum against malicious parties—effectively enabling anyone to validate, propose, and defend Arbitrum's chain state without needing permission to do so. -- **Honest Parties**: Recover all bonds + 1% defender's bounty + service fees -- **Malicious Parties**: Lose all bonds (sent to DAO treasury) -- **Spam Prevention**: High costs deter delay attacks and spam +This defense occurs through a challenge game where different parties asserting claims with supporting evidence eventually narrow down their disagreement to a single step of execution within a block, known as a one-step proof (OSP). Ethereum can then verify this OSP by itself and, as the neutral referee, declare a winner. -**Why This Matters**: BoLD eliminates delay attacks while enabling true permissionless validation, making Arbitrum more decentralized and secure than ever before. +BoLD is quite complex—it is too extensive to cover here. If you would like to learn more about BoLD and the challenge protocol in-depth, refer to the BoLD: Gentle introduction and the BoLD: Economics of Disputes. -## Chapter 6: Cross-Chain Communication - Bridging Worlds +## Step 6: Bridging: Cross-chain communication Your transaction might involve moving assets or data between Ethereum and Arbitrum. Let's explore how Arbitrum handles cross-chain communication. @@ -362,23 +284,29 @@ When you want to send assets or data from Ethereum to Arbitrum, you have several **2. Retryable Tickets** - **Atomic Operations**: L1 transactions that trigger L2 execution -- **Guaranteed Execution**: If initial execution fails, tickets can be retried +- **Guaranteed Execution**: If initial execution fails, tickets can be retried (retryables) - **Gas Management**: Predictable costs with automatic retry mechanisms -- **Ticket Lifecycle**: Tickets remain valid for approximately one week and can be redeemed by anyone +- **Ticket Lifecycle**: Tickets remain valid for approximately one week, and anyone can redeem them **3. Direct Messaging** - **Signed Messages**: From EOAs with signature verification - **Unsigned Messages**: From contracts with address aliasing for security +:::note L1-to-L2 messaging deep-dive + +To learn more about the inner workings of the L1-to-L2 messaging and how it works in specific detail, refer to the [L1-to-L2 messaging deep-dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). + +::: + ### L2 to L1 Messaging: From Arbitrum to Ethereum Moving assets or data from Arbitrum back to Ethereum follows a different pattern: **The Process:** -1. **Message Creation**: Your L2 transaction calls `ArbSys.sendTxToL1()` -2. **Inclusion in Assertion**: The message is included in a rollup assertion +1. **Message Creation**: A contract or user sends a message from the child chain by calling: [`ArbSys.sendTxToL1()`](/for-devs/dev-tools-and-resources/partials/precompile-tables/_arbsys.mdx) +2. **Inclusion in Assertion**: A rollup assertion will include the message 3. **Challenge Period**: 6.4-day window for potential challenges 4. **Manual Execution**: After confirmation, anyone can execute the message on L1 @@ -388,7 +316,13 @@ Moving assets or data from Arbitrum back to Ethereum follows a different pattern - **Merkle Proofs**: Messages are proven using Merkle inclusion proofs - **Unlimited Lifetime**: Messages persist until successfully executed -### The Canonical Bridge Architecture +:::note L2-to-L1 messaging deep-dive + +To learn more about the inner workings of the L2-to-L1 messaging and how it works in specific detail, refer to the [L2-to-L1 messaging deep-dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). + +::: + +### The Canonical bridge architecture Arbitrum's canonical bridge uses a sophisticated three-component system: @@ -396,59 +330,77 @@ Arbitrum's canonical bridge uses a sophisticated three-component system: **2. Gateways**: Pairs of contracts that handle specific bridging logic **3. Routers**: Contracts that route each asset to its appropriate gateway -**Security Model**: The bridge ensures that for every token locked on L1, an equivalent amount is minted on L2, and vice versa. The 7-day challenge period provides security against invalid withdrawals. +**Security Model**: The bridge ensures that for every token locked on L1, an equivalent amount gets minted on L2, and vice versa. The seven-day challenge period provides security against invalid withdrawals. + +:::info Why does this matter -**Why This Matters**: Cross-chain communication enables seamless asset movement and data transfer between Ethereum and Arbitrum, making it feel like a single unified system while maintaining the security of both chains. +Cross-chain communication enables seamless asset movement and data transfer between Ethereum and Arbitrum, providing an experience similar to a single unified system while maintaining the security of both chains. -## Chapter 7: Gas and Fees - The Economics of Execution +::: + +## Step 7: The economics of execution: Gas and fees Throughout your transaction's journey, various fees are collected to cover the costs of processing and securing the network. -### The Two-Component Fee Model +### The two-component fee model Arbitrum uses a sophisticated two-component fee system: **1. L2 Gas Fees** - **EVM Execution**: Standard gas costs for computation and storage -- **Dynamic Pricing**: Uses EIP-1559-style exponential pricing mechanism +- **Dynamic Pricing**: Uses [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style exponential pricing mechanism - **Speed Limit**: 7,000,000 gas per second target on Arbitrum One - **Backlog Management**: Gas price adjusts based on network congestion **2. L1 Calldata Fees** - **Data Posting Costs**: Covers the cost of posting transaction data to Ethereum -- **Compression Estimation**: Fees based on transaction's contribution to compressed batch +- **Compression Estimation**: Fees based on the transaction's contribution to the compressed batch - **Dynamic Pricing**: Algorithm adjusts to align collected fees with actual posting costs - **Sequencer Transactions Only**: Only applies to transactions submitted through the Sequencer -### The Speed Limit: Protecting Infrastructure +### Protecting infrastructure: The speed limit Arbitrum implements a **gas speed limit** as a protective mechanism to prevent chain infrastructure from being overloaded: - **Throughput Threshold**: Currently set to 7,000,000 gas per second on Arbitrum One and Nova -- **Dynamic Pricing**: When cumulative usage exceeds the speed limit, L2 base fees rise using an EIP-1559-style algorithm +- **Dynamic Pricing**: When cumulative usage exceeds the speed limit, L2 base fees rise using an [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style algorithm - **Infrastructure Protection**: Prevents validator nodes from experiencing loads that could cause downtime or chain halting - **User Experience**: Ensures high-priority transactions can still be processed during congestion while deterring low-priority transactions -**Why This Matters**: The speed limit is fundamentally a protective mechanism. If chain load exceeds what Nitro validator nodes can process, the chain risks halting due to validator downtime. While security and liveness are always maintained through parent chain contracts, the best user experience requires validators and the sequencer to remain online. +:::info Why does this matter? + +The speed limit is fundamentally a protective mechanism. If the chain load exceeds what Nitro validator nodes can process, the chain risks halting due to downtime among validator nodes. Maintaining security and liveness occurs through parent chain contracts; the best user experience requires validators and the sequencer to remain online. -### Fee Calculation Process +::: -When your transaction is processed, the system: +### Fee calculation process + +When your transaction is processed (from [Step 3](#step-3-where-execution-happens-state-transition-function)), the system: 1. **Calculates L2 Gas**: Standard EVM gas costs for your transaction 2. **Estimates L1 Impact**: Determines your transaction's contribution to batch size 3. **Applies Dynamic Pricing**: Uses current L1 and L2 price algorithms 4. **Collects Fees**: Charges you the total amount in ETH -**Why This Matters**: The dual-fee model ensures that both L2 execution costs and L1 data posting costs are properly covered, while the speed limit maintains security by ensuring validators can always keep up with chain progress. +:::info Why does this matter? + +The dual-fee model ensures that both L2 execution costs and L1 data posting costs are properly covered. Simultaneously, the speed limit ensures security by allowing validators to keep up with the chain's progress. + +::: + +:::note Gas and fees deep-dive + +To learn more about the inner workings of how gas and fees work in specific detail, refer to the [Gas and fees deep-dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). -## Chapter 8: Advanced Features - Beyond Basic Layer 2 +::: -Arbitrum includes several advanced features that extend its capabilities beyond standard Layer 2 functionality. +## Step 8: Advanced features -### Stylus: WebAssembly Smart Contracts +Arbitrum features several advanced capabilities that extend its functionality beyond standard Layer 2 features. + +### Stylus: WebAssembly smart contracts **Stylus** enables smart contract development in multiple programming languages: @@ -459,7 +411,9 @@ Arbitrum includes several advanced features that extend its capabilities beyond **Technical Implementation**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, with specialized host I/O operations for blockchain state access. -### Timeboost: MEV-Aware Transaction Ordering +For more in-depth information about Stylus, refer to the [Stylus Gentle Intro](). + +### Timeboost: MEV-aware transaction ordering **Timeboost** implements advanced transaction ordering policies: @@ -468,7 +422,9 @@ Arbitrum includes several advanced features that extend its capabilities beyond - **Spam Reduction**: Reduces MEV-driven network congestion - **Configurable Parameters**: Chain owners can customize ordering policies -### AnyTrust: Alternative Data Availability +For more information about Timeboost, refer to the [Timeboost Gentle introduction](). + +### AnyTrust: Alternative Data Availability (DA) **AnyTrust** provides a cost-optimized alternative to standard rollups by accepting a mild trust assumption about data availability: @@ -488,25 +444,21 @@ Arbitrum includes several advanced features that extend its capabilities beyond **Sequencer-Committee Interaction:** -1. Sequencer sends data batch with expiration time to all committee members +1. Sequencer sends a data batch with an expiration time to all committee members 2. Members store data and sign (hash, expiration) pairs using BLS keys 3. Sequencer aggregates signatures to create DACert 4. Sequencer posts DACert to L1 inbox contract -5. If insufficient signatures collected, Sequencer falls back to posting full data +5. If insufficient signatures are collected, the Sequencer falls back to posting full data + +**Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova utilizes AnyTrust to achieve lower fees compared to Arbitrum One. -**Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova uses AnyTrust to achieve lower fees than Arbitrum One. +For more in-depth information about AnyTrust, refer to the [AnyTrust protocol](). -## Deep Dive Resources +## Additional deep dive resources -This journey has covered the high-level flow of transactions through Arbitrum. For detailed technical information on specific components, explore these deep dives: +This journey has covered the high-level flow of transactions through Arbitrum. For detailed technical information about specific components not already mentioned, check out these additional deep-dives: - **[Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx)**: Detailed transaction submission and processing -- **[The Sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx)**: Ordering, batching, and compression mechanisms -- **[State Transition Function](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx)**: STF inputs and processing - **[Geth Integration](/how-arbitrum-works/deep-dives/geth.mdx)**: How Arbitrum modifies Geth for L2 execution - **[ArbOS](/how-arbitrum-works/deep-dives/arbos.mdx)**: Layer 2 operating system and precompiles -- **[L1 to L2 Messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)**: Cross-chain communication from parent to child chains -- **[L2 to L1 Messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)**: Cross-chain communication from child to parent chains -- **[Gas and Fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx)**: Understanding Arbitrum's fee structure - **[Assertions](/how-arbitrum-works/deep-dives/assertions.mdx)**: How assertions work in the rollup protocol -- **[BoLD Protocol](/how-arbitrum-works/bold/gentle-introduction.mdx)**: Permissionless validation and dispute resolution From 56c0e8d3a34dccb77cb70bce7b899d327280d41b Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 9 Oct 2025 15:38:03 -0500 Subject: [PATCH 58/75] Fixing some links --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 9e35343c6c..f92d23b6aa 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -305,7 +305,7 @@ Moving assets or data from Arbitrum back to Ethereum follows a different pattern **The Process:** -1. **Message Creation**: A contract or user sends a message from the child chain by calling: [`ArbSys.sendTxToL1()`](/for-devs/dev-tools-and-resources/partials/precompile-tables/_arbsys.mdx) +1. **Message Creation**: A contract or user sends a message from the child chain by calling: [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) 2. **Inclusion in Assertion**: A rollup assertion will include the message 3. **Challenge Period**: 6.4-day window for potential challenges 4. **Manual Execution**: After confirmation, anyone can execute the message on L1 @@ -411,7 +411,7 @@ Arbitrum features several advanced capabilities that extend its functionality be **Technical Implementation**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, with specialized host I/O operations for blockchain state access. -For more in-depth information about Stylus, refer to the [Stylus Gentle Intro](). +For more in-depth information about Stylus, refer to the [Stylus Gentle Intro](/stylus/gentle-introduction.mdx). ### Timeboost: MEV-aware transaction ordering @@ -422,7 +422,7 @@ For more in-depth information about Stylus, refer to the [Stylus Gentle Intro]() - **Spam Reduction**: Reduces MEV-driven network congestion - **Configurable Parameters**: Chain owners can customize ordering policies -For more information about Timeboost, refer to the [Timeboost Gentle introduction](). +For more information about Timeboost, refer to the [Timeboost Gentle introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx). ### AnyTrust: Alternative Data Availability (DA) @@ -452,7 +452,7 @@ For more information about Timeboost, refer to the [Timeboost Gentle introductio **Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova utilizes AnyTrust to achieve lower fees compared to Arbitrum One. -For more in-depth information about AnyTrust, refer to the [AnyTrust protocol](). +For more in-depth information about AnyTrust, refer to the [AnyTrust protocol](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). ## Additional deep dive resources From 47bed83b2e83e4383f5b725dbd6541e36e22b512 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 10 Oct 2025 12:11:18 -0500 Subject: [PATCH 59/75] Took the exisitng structure and content and turned it into a narrative --- .../01-inside-arbitrum-nitro.mdx | 452 ++---------------- 1 file changed, 52 insertions(+), 400 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index f92d23b6aa..3b8e23b03f 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,456 +9,108 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -Imagine you're a developer sending a transaction to Arbitrum. What happens from the moment you submit it until it achieves finality? Let's trace this journey step by step, exploring how Arbitrum's architecture ensures your transaction is processed correctly, efficiently, and securely. +### Transaction Processing Journey on Arbitrum -This article will take us through the complete Arbitrum Nitro stack—from the Sequencer that orders your transaction, through the State Transition Function that executes it, to the validation system that ensures its correctness. Along the way, we'll discover how Arbitrum achieves Ethereum-level security while offering 10 times lower fees and 100 times faster transactions. +As a developer initiating a transaction on Arbitrum, gaining a clear understanding of the end-to-end flow—from initial submission through to finality—is helpful, but it is not required. -## The Foundation: Arbitrum's core architecture overview +This overview methodically traces the transaction lifecycle, emphasizing how Arbitrum's architecture ensures precise, efficient, and secure handling at every stage. This article encompasses the complete Arbitrum Nitro stack, beginning with the Sequencer responsible for transaction ordering, advancing to the State Transition Function for execution, and culminating in validation mechanisms that uphold integrity. -Before we begin our journey, let's understand the fundamental architecture that makes everything possible. Arbitrum operates on a simple but powerful principle: **deterministic state transitions**. +Along the way, we will highlight Arbitrum's ability to deliver security on par with Ethereum, while achieving fee reductions by a factor of ten and transaction speeds accelerated by a factor of 100 through optimized scaling techniques. + +### The Foundation: Arbitrum's Core Architecture Overview + +Before delving into the journey of a transaction, it is important to outline the foundational architecture that powers Arbitrum's operations. Central to the architecture is a simple yet powerful principle: deterministic state transitions, which ensure consistent outcomes across the network. The system revolves around three core components. -**The Core Components:** - -1. **Inbox**: Where transactions enter the system -2. **State Transition Function (STF)**: Processes transactions deterministically -3. **Outputs**: Produces results and state updates - -This deterministic model ensures that given the same inputs, all honest nodes will produce identical outputs. This property is crucial for Arbitrum's security model, as it enables fraud proofs and dispute resolution mechanisms that can verify execution correctness without re-running entire transactions. - -## Nitro's four big ideas - -Arbitrum Nitro's design is rooted in four fundamental innovations that enable its performance and security characteristics: - -### 1. Sequencing, followed by deterministic execution - -Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). - -### 2. Geth at the core +Transactions first enter through the Inbox, serving as the primary gateway into the ecosystem. +From there, the State Transition Function (STF) processes them in a deterministic fashion, applying rules that guarantee reproducibility. +Finally, the Outputs component generates the resulting data and state updates, completing the cycle. +This deterministic model means that identical inputs always produce the same outputs among honest nodes, forming the bedrock of Arbitrum's security. It supports efficient fraud proofs and dispute resolution, allowing verification of execution correctness without the need to rerun entire transactions, thereby minimizing computational overhead. -Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library ensures a very high degree of compatibility with Ethereum. +### Nitro's Four Key Innovations -### 3. Separate execution from proving +Arbitrum Nitro's design draws from four pivotal innovations that collectively enhance its efficiency, security, and compatibility. -Nitro compiles the same source twice: once to native code for execution in a Nitro node (optimized for speed), and again to WASM for use in proving (optimized for portability and security). +1. The first involves a two-phase approach to transaction handling: sequencing followed by deterministic execution. In this method, the ordering of transactions forms a single, committed sequence, after which the STF executes them in that fixed order, ensuring predictability and order integrity. -### 4. Optimistic rollup with interactive fraud proofs +2. The second innovation centers on deep integration with Geth, the core codebase of go-ethereum, a prominent Ethereum node software. By embedding Geth as a library, Nitro fully supports Ethereum's data structures, formats, and virtual machine, delivering near-perfect compatibility and allowing seamless migration of Ethereum applications. -Nitro settles transactions on the Layer 1 Ethereum chain using an Optimistic Rollup protocol, which includes the interactive fraud proofs pioneered by Arbitrum. +3. Third, Nitro separates execution from proving by compiling its source code twice—once to native code for high-speed operation in Nitro nodes, and once to WebAssembly (WASM) for secure, portable proving processes. This dual compilation optimizes for both performance during runtime and reliability in validation scenarios. -:::info Why do these matter +4. Finally, Nitro employs an Optimistic Rollup protocol with interactive fraud proofs, settling transactions on Ethereum's Layer 1 while using Arbitrum's pioneering proof system to resolve disputes efficiently. Together, these innovations enable Arbitrum to match Ethereum's security guarantees, boost overall performance, and maintain full interoperability with existing Ethereum tools and dApps. -These four innovations collectively enable Arbitrum to achieve Ethereum-level security with substantially improved performance characteristics while maintaining complete compatibility with existing Ethereum applications. +### Step 1: Submitting a Transaction -::: - -## Step 1: The journey begins: Submitting a transaction - -Your transaction's journey starts when you submit it to Arbitrum. You have several routes available, each with different characteristics: +The submission process for a transaction on Arbitrum starts with the user sending the request, with options tailored to balance factors like speed, control, and reliability according to specific needs. Most transactions route through the Sequencer, a specialized node that orders them and issues quick confirmations. This path accommodates various submission methods, including public RPC for development and light usage, third-party RPC for improved throughput, direct Sequencer endpoints for minimal latency in critical operations, and self-hosted Arbitrum nodes for ultimate privacy and customization. -### Route 1: Through the Sequencer - -Most transactions take the standard path through the **Sequencer**—a specialized node responsible for ordering transactions and providing immediate confirmations. The Sequencer offers several methods to submit a transaction: - -- **Public RPC**: For development and light usage -- **Third-party RPC**: For higher throughput and better performance -- **Direct Sequencer endpoint**: For the lowest possible latency -- **Self-hosted Arbitrum nodes**: For maximum control and privacy - -### Route 2: Bypassing the Sequencer - -To mitigate censorship, you can submit transactions directly to the **Delayed Inbox** contract on Ethereum. This method ensures your transaction will be processed even if the Sequencer refuses to handle it (censorship resistance). - -**How It Works:** - -- **Delayed Inbox Queue**: Messages submitted by non-Sequencer nodes go into the "delayed inbox" queue -- **Sequencer Release**: A well-behaved Sequencer typically releases delayed messages after about ten minutes -- **Force Inclusion**: If a message has been in the delayed inbox queue for longer than 24 hours, anyone can force it into the main inbox -- **Censorship Resistance**: This ensures the Sequencer can only delay messages but can't censor (refuse) them - -**Trade-offs:** - -- **Sequencer Path**: Finality is faster (immediate soft finality) -- **Delayed Inbox Path**: Finality is slower (roughly double the time) but provides censorship resistance - -:::info Why does this matter - -The Sequencer provides immediate "soft finality" by promising to include your transaction in a specific order. "Soft finality" enables fast user experience while maintaining the option for censorship-resistant submission when needed. - -::: - -## Step 2: Ordering and broadcasting: The Sequencer - -Once your transaction reaches the Sequencer, it enters a sophisticated ordering and broadcasting system designed for both performance and security. - -### Real-time transaction feed - -The Sequencer immediately publishes your transaction through its **real-time feed**, providing instant visibility to all nodes in the network. This feed serves multiple critical functions: - -- **Immediate Confirmation**: You receive instant feedback that your transaction has been accepted and ordered -- **State Synchronization**: All nodes stay synchronized with the latest transaction sequence -- **Soft Finality**: You can act on your transaction immediately, knowing the Sequencer has ordered it properly - -### Batching and compression - -The Sequencer doesn't process transactions individually. Instead, it collects multiple transactions into **batches** for efficient processing and lower costs: - -**Batch Formation Criteria:** - -- **Size Threshold**: The creation of batches occurs when enough accumulated transactions reach a predefined size limit -- **Time Constraints**: Batches are also created based on elapsed time to prevent undue delays - -**Compression Process:** -The Sequencer uses the **Brotli compression algorithm** to minimize the data required to post to Ethereum: - -- **Dynamic Compression Levels**: Compression level adjusts based on network backlog (0-11 scale) -- **Cost Optimization**: Higher compression reduces L1 posting costs but requires more computation -- **Adaptive Strategy**: System prioritizes speed over compression when the backlog is high - -### Posting to Ethereum - -Once batched and compressed, transaction data posts to Ethereum through the **Sequencer Inbox Contract**. The Sequencer uses two primary methods: +Alternatively, to counter risks of exclusion or delay by the Sequencer, users can submit directly to the Delayed Inbox contract on Ethereum, bolstering system resilience. In this mechanism, non-Sequencer transactions enter a dedicated queue, where a well-functioning Sequencer typically integrates them within about ten minutes. If delayed beyond 24 hours, any network participant can force inclusion into the main inbox, limiting the Sequencer's influence to temporary delays rather than permanent blocks. While the Sequencer route offers faster soft finality and streamlined workflows, the Delayed Inbox path doubles processing time but emphasizes censorship resistance. Overall, the Sequencer's commitment to ordered inclusion provides "soft finality" for a responsive experience, complemented by these alternatives for robust, flexible operations across applications. For more technical detail about the transaction lifecycle, refer to the [Transaction Lifecycle deep dive](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx). -**1. Blob Transactions ([EIP-4844](https://eips.ethereum.org/EIPS/eip-4844))** (default) +### Step 2: Ordering and Broadcasting: The Sequencer -- **Default Method**: When Ethereum supports [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) -- **Cost Efficient**: Blobs provide cheaper data inclusion than calldata -- **Scalable**: Enables handling of large transaction volumes +Once a transaction reaches the Sequencer, it integrates into a refined system for ordering and broadcasting, designed to maximize performance while upholding security. The Sequencer immediately shares the transaction through its real-time feed, offering instant network-wide visibility. This feed delivers immediate confirmation of acceptance and sequencing, keeps all nodes synchronized with the latest order, and enables soft finality, allowing users to proceed confidently based on the Sequencer's reliable commitment. -**2. Calldata Transactions** +To further optimize, the Sequencer groups transactions into batches rather than processing them individually, which cuts costs and boosts efficiency. Batches form when transactions accumulate to a predefined size or after a set time interval to prevent lags. The data then undergoes compression via the Brotli algorithm, with levels dynamically adjusted from 0 to 11 based on congestion. Higher compression reduces Layer 1 posting expenses at the cost of more computation, while the system shifts toward speed during heavy backlogs. -- **Fallback Method**: When blob fees are high or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) unavailable -- **Direct Inclusion**: Transaction data included directly in calldata -- **Compatibility**: Works with all Ethereum configurations +After batching and compression, the data posts to Ethereum through the Sequencer Inbox Contract using one of two methods. -:::info Why does this matter +1. The default, blob transactions under [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), provide cost-effective and scalable data inclusion when supported by Ethereum. -The batching and compression system enables Arbitrum to achieve 10-100x cost reduction compared to posting individual transactions to Ethereum. This dual posting strategy ensures optimal cost efficiency under varying network conditions. +2. As a fallback, calldata transactions embed data directly, ensuring compatibility even if blob fees rise or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) is unavailable. This process yields 10-100x cost savings over individual postings and adapts to network conditions for consistent efficiency. For deeper insights into the Sequencer's internals, refer to the [Sequencer deep-dive documentation](/how-arbitrum-works/deep-dives/sequencer.mdx). -::: +### Step 3: Execution Phase: State Transition Function -:::note Sequencer deep-dive +With ordering and batching complete, execution shifts to the State Transition Function (STF), the core of Arbitrum's processing engine. Arbitrum ensures full Ethereum Virtual Machine (EVM) compatibility via a three-layer architecture. At the base, the Geth core handles EVM execution, aligning behaviors with Ethereum and drawing on its extensively tested code for security. For more technical details about Geth, refer to the [Geth deep dive documentation](/how-arbitrum-works/deep-dives/geth.mdx). -To learn more about the inner workings of the Sequencer and how it works in specific detail, refer to the [Sequencer deep-dive](/how-arbitrum-works/deep-dives/sequencer.mdx). +Above this, ArbOS—the Arbitrum Operating System—adds Layer 2 features like cross-chain messaging, fee management, gas pricing, handling of deposits and withdrawals, and advanced tools such as Stylus. The top layer, the node interface, manages RPC connections and APIs, providing Ethereum-like functionality for clients. -::: - -## Step 3: Where execution happens: State Transition Function - -Now that your transaction has been ordered and batched, execution occurs next. Execution happens in the **State Transition Function (STF)**—the heart of Arbitrum's execution engine. - -### The Geth integration: Complete EVM compatibility - -Arbitrum achieves full Ethereum compatibility through a sophisticated three-layer architecture: +In the STF, transactions follow a structured workflow: ArbOS first validates format and funds, then charges gas for Layer 2 execution and Layer 1 posting. Geth executes per EVM standards, after which ArbOS updates states and cross-chain elements, generating receipts and logs to conclude the process. For technical details about ArbOS, refer to the [ArbOS deep dive documentation](/how-arbitrum-works/deep-dives/arbos.mdx). -**Layer 1: Geth Core** - -- The foundation consists of the core Geth components that handle EVM execution -- Ensures behavioral consistency with Ethereum -- Provides proven security through rigorously tested code - -**Layer 2: ArbOS (Arbitrum Operating System)** - -- Provides Layer 2-specific functionality, including cross-chain messaging -- Handles fee accounting and gas price management -- Manages deposits, withdrawals, and advanced features like Stylus - -**Layer 3: Node Interface** - -- Handles RPC connections and API requests -- Provides Ethereum-compatible node functionality for client applications - -### How transactions are processed - -When your transaction reaches the STF, it follows this execution path: - -1. **Transaction Validation**: ArbOS validates your transaction format and checks sufficient funds -2. **Gas Charging**: The system calculates and adds the cost for both L2 execution and L1 data posting costs -3. **EVM Execution**: Geth processes your transaction according to standard EVM protocols -4. **State Updates**: ArbOS updates Layer 2-specific state and handles cross-chain operations -5. **Receipt Generation**: The system produces transaction receipts and logs - -### Stylus integration: Beyond EVM - -If your transaction interacts with a **Stylus contract** (WebAssembly (WASM)-based), the execution flow differs: - -- **WASM Runtime**: ArbOS routes execution to the WASM runtime instead of the EVM -- **Host I/O Operations**: Stylus contracts use specialized host I/O calls for blockchain state access -- **Enhanced Performance**: Stylus contracts can execute 10-70x faster than EVM equivalents -- **Full Interoperability**: Stylus contracts can seamlessly call EVM contracts and vice versa - -:::info Why does this matter - -The Geth integration ensures that existing Ethereum applications work without modification, while ArbOS adds Layer 2 capabilities and Stylus enables high-performance alternatives for new applications. - -::: - -:::note State Transition Function deep-dive - -To learn more about the inner workings of the STF and how it works in specific detail, refer to the [State Transition Function deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). - -::: - -## Step 4: Finality - -Your transaction now has two levels of finality, each serving different purposes in Arbitrum's security model. - -### Soft finality: Immediate confirmation - -The moment the Sequencer includes your transaction in its feed, you achieve **soft finality** (from [Step 1](#step-1-transaction-submission-the-journey-begins)): - -- **Instant Feedback**: You receive immediate confirmation that your transaction is accepted -- **Sequencer Promise**: The Sequencer commits to including your transaction in a specific order -- **User Experience**: You can act on your transaction immediately without waiting - -:::info Trust model - -Soft finality relies on the Sequencer's honesty and availability. While this provides an excellent user experience, it's not cryptographically secured. - -::: - -### Hard finality: Cryptographic security - -**Hard finality** is achieved when your transaction's batch is posted to **and** confirmed on Ethereum: - -- **Ethereum Security**: Your transaction inherits Ethereum's consensus security -- **Data Availability**: All transaction data is publicly available on Ethereum -- **Irreversibility**: Once confirmed, your transaction is not reversible - -:::info Timeline - -Hard finality typically takes 10-20 minutes, depending on Ethereum block times and the frequency of batch posting. - -:::: - -### The Security guarantee - -This dual-finality model provides the best of both worlds: - -- **Fast User Experience**: Soft finality enables immediate transaction confirmation -- **Cryptographic Security**: Hard finality provides Ethereum-level security guarantees -- **Censorship Resistance**: Alternative submission routes ensure your transaction can and will always be processed - -:::info Why does this matter - -You get immediate feedback for optimal user experience while maintaining the security guarantees that make Arbitrum suitable for high-value transactions. - -::: - -## Step 5: Ensuring correctness: Validation and dispute resolution - -Now that your transaction has undergone execution, how does Arbitrum ensure it was processed correctly? We'll cover that in the next section. - -### The BoLD Protocol: Permissionless validation - -Arbitrum uses **BoLD (Bounded Liquidity Delay)**, a next-generation dispute protocol that enables **permissionless validation**. Unlike traditional optimistic rollups, BoLD allows anyone to participate in validation without permission while guaranteeing time-bounded dispute resolution. - -BoLD implements a new dispute system that allows any single entity to defend Arbitrum against malicious parties—effectively enabling anyone to validate, propose, and defend Arbitrum's chain state without needing permission to do so. - -This defense occurs through a challenge game where different parties asserting claims with supporting evidence eventually narrow down their disagreement to a single step of execution within a block, known as a one-step proof (OSP). Ethereum can then verify this OSP by itself and, as the neutral referee, declare a winner. - -BoLD is quite complex—it is too extensive to cover here. If you would like to learn more about BoLD and the challenge protocol in-depth, refer to the BoLD: Gentle introduction and the BoLD: Economics of Disputes. - -## Step 6: Bridging: Cross-chain communication - -Your transaction might involve moving assets or data between Ethereum and Arbitrum. Let's explore how Arbitrum handles cross-chain communication. - -### L1 to L2 Messaging: From Ethereum to Arbitrum - -When you want to send assets or data from Ethereum to Arbitrum, you have several options: - -**1. Native Token Bridging** - -- **ETH Deposits**: Direct ETH deposits through the bridge contract -- **ERC-20 Bridging**: Token transfers using the canonical bridge -- **Custom Gas Tokens**: Support for chains using custom gas tokens - -**2. Retryable Tickets** - -- **Atomic Operations**: L1 transactions that trigger L2 execution -- **Guaranteed Execution**: If initial execution fails, tickets can be retried (retryables) -- **Gas Management**: Predictable costs with automatic retry mechanisms -- **Ticket Lifecycle**: Tickets remain valid for approximately one week, and anyone can redeem them - -**3. Direct Messaging** - -- **Signed Messages**: From EOAs with signature verification -- **Unsigned Messages**: From contracts with address aliasing for security - -:::note L1-to-L2 messaging deep-dive - -To learn more about the inner workings of the L1-to-L2 messaging and how it works in specific detail, refer to the [L1-to-L2 messaging deep-dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). - -::: - -### L2 to L1 Messaging: From Arbitrum to Ethereum - -Moving assets or data from Arbitrum back to Ethereum follows a different pattern: - -**The Process:** - -1. **Message Creation**: A contract or user sends a message from the child chain by calling: [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) -2. **Inclusion in Assertion**: A rollup assertion will include the message -3. **Challenge Period**: 6.4-day window for potential challenges -4. **Manual Execution**: After confirmation, anyone can execute the message on L1 - -**Key Characteristics:** - -- **Manual Execution Required**: Ethereum doesn't support scheduled execution -- **Merkle Proofs**: Messages are proven using Merkle inclusion proofs -- **Unlimited Lifetime**: Messages persist until successfully executed - -:::note L2-to-L1 messaging deep-dive - -To learn more about the inner workings of the L2-to-L1 messaging and how it works in specific detail, refer to the [L2-to-L1 messaging deep-dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). - -::: - -### The Canonical bridge architecture - -Arbitrum's canonical bridge uses a sophisticated three-component system: - -**1. Asset Contracts**: The actual token contracts on both chains -**2. Gateways**: Pairs of contracts that handle specific bridging logic -**3. Routers**: Contracts that route each asset to its appropriate gateway - -**Security Model**: The bridge ensures that for every token locked on L1, an equivalent amount gets minted on L2, and vice versa. The seven-day challenge period provides security against invalid withdrawals. - -:::info Why does this matter - -Cross-chain communication enables seamless asset movement and data transfer between Ethereum and Arbitrum, providing an experience similar to a single unified system while maintaining the security of both chains. - -::: - -## Step 7: The economics of execution: Gas and fees - -Throughout your transaction's journey, various fees are collected to cover the costs of processing and securing the network. - -### The two-component fee model - -Arbitrum uses a sophisticated two-component fee system: - -**1. L2 Gas Fees** - -- **EVM Execution**: Standard gas costs for computation and storage -- **Dynamic Pricing**: Uses [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style exponential pricing mechanism -- **Speed Limit**: 7,000,000 gas per second target on Arbitrum One -- **Backlog Management**: Gas price adjusts based on network congestion - -**2. L1 Calldata Fees** - -- **Data Posting Costs**: Covers the cost of posting transaction data to Ethereum -- **Compression Estimation**: Fees based on the transaction's contribution to the compressed batch -- **Dynamic Pricing**: Algorithm adjusts to align collected fees with actual posting costs -- **Sequencer Transactions Only**: Only applies to transactions submitted through the Sequencer - -### Protecting infrastructure: The speed limit - -Arbitrum implements a **gas speed limit** as a protective mechanism to prevent chain infrastructure from being overloaded: - -- **Throughput Threshold**: Currently set to 7,000,000 gas per second on Arbitrum One and Nova -- **Dynamic Pricing**: When cumulative usage exceeds the speed limit, L2 base fees rise using an [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style algorithm -- **Infrastructure Protection**: Prevents validator nodes from experiencing loads that could cause downtime or chain halting -- **User Experience**: Ensures high-priority transactions can still be processed during congestion while deterring low-priority transactions - -:::info Why does this matter? - -The speed limit is fundamentally a protective mechanism. If the chain load exceeds what Nitro validator nodes can process, the chain risks halting due to downtime among validator nodes. Maintaining security and liveness occurs through parent chain contracts; the best user experience requires validators and the sequencer to remain online. - -::: - -### Fee calculation process - -When your transaction is processed (from [Step 3](#step-3-where-execution-happens-state-transition-function)), the system: - -1. **Calculates L2 Gas**: Standard EVM gas costs for your transaction -2. **Estimates L1 Impact**: Determines your transaction's contribution to batch size -3. **Applies Dynamic Pricing**: Uses current L1 and L2 price algorithms -4. **Collects Fees**: Charges you the total amount in ETH - -:::info Why does this matter? - -The dual-fee model ensures that both L2 execution costs and L1 data posting costs are properly covered. Simultaneously, the speed limit ensures security by allowing validators to keep up with the chain's progress. - -::: - -:::note Gas and fees deep-dive - -To learn more about the inner workings of how gas and fees work in specific detail, refer to the [Gas and fees deep-dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). - -::: - -## Step 8: Advanced features - -Arbitrum features several advanced capabilities that extend its functionality beyond standard Layer 2 features. - -### Stylus: WebAssembly smart contracts - -**Stylus** enables smart contract development in multiple programming languages: +For Stylus contracts using WebAssembly (WASM), execution diverts to a WASM runtime, where contracts access state via specialized host I/O calls. This diversion yields 10-70x faster performance than EVM equivalents and full interoperability for mixed calls. The Geth base lets Ethereum apps run unchanged, while ArbOS and Stylus enable Layer 2 optimizations and high-performance innovations. Consult the [State Transition Function deep dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx) for further mechanics. -- **Performance**: 10-70x faster execution compared to EVM -- **Memory Efficiency**: 100-500x improvement in memory usage -- **Language Support**: Rust, C, C++, and other WASM-compatible languages -- **Full Interoperability**: Seamless calls between Stylus and EVM contracts +### Step 4: Finality -**Technical Implementation**: Stylus contracts execute in a coequal WASM virtual machine alongside the EVM, with specialized host I/O operations for blockchain state access. +At this stage, the transaction achieves two complementary levels of finality, each tailored to Arbitrum's security needs. -For more in-depth information about Stylus, refer to the [Stylus Gentle Intro](/stylus/gentle-introduction.mdx). +1. Soft finality emerges immediately upon the inclusion of the Sequencer feed, offering instant acceptance feedback, a commitment to order, and the ability to act without wait times—as noted in the submission phase. This soft finality" relies on the Sequencer's trustworthiness for usability but lacks cryptographic backing. -### Timeboost: MEV-aware transaction ordering +2. Hard finality, conversely, solidifies when the batch posts and confirms on Ethereum, inheriting its consensus security, ensuring public data availability, and making the transaction irreversible. This process typically spans 10-20 minutes, varying with Ethereum block times and batch frequency. -**Timeboost** implements advanced transaction ordering policies: +The dual model combines rapid soft finality for seamless experiences with Ethereum-level safeguards for hard finality, along with censorship-resistant paths for assured inclusion. This balance delivers quick feedback alongside strong protections, ideal for high-stakes transactions. -- **MEV Capture**: Chain owners can capture a portion of available MEV -- **User Protection**: Maintains protection against front-running and sandwich attacks -- **Spam Reduction**: Reduces MEV-driven network congestion -- **Configurable Parameters**: Chain owners can customize ordering policies +### Step 5: Ensuring Correctness: Validation and Dispute Resolution -For more information about Timeboost, refer to the [Timeboost Gentle introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx). +Following execution, Arbitrum verifies correctness through its validation and dispute systems. Central to this is the BoLD (Bounded Liquidity Delay) protocol, an advanced dispute framework enabling permissionless validation. Unlike conventional optimistic rollups, BoLD permits any participant to validate without approval, while ensuring dispute resolution within bounded timeframes to prevent indefinite delays. -### AnyTrust: Alternative Data Availability (DA) +BoLD facilitates a challenge-based defense where honest parties can protect the chain's state against malice. Disputants narrow conflicts to a single execution step via supporting claims, culminating in a one-step proof (OSP) that Ethereum verifies as an impartial arbiter to determine the outcome. While BoLD's intricacies—such as its multi-round challenge games and economic incentives—are extensive, they enhance decentralization and resilience. For more, see the [BoLD Gentle Introduction](/how-arbitrum-works/bold/gentle-introduction.mdx) and [Economics of Disputes documentation](/how-arbitrum-works/bold/bold-economics-of-disputes.mdx). -**AnyTrust** provides a cost-optimized alternative to standard rollups by accepting a mild trust assumption about data availability: +### Step 6: Bridging: Cross-Chain Communication -**Architecture:** +Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For L1-to-L2 messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [L1-to-L2 messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. -- **Data Availability Committee (DAC)**: Uses a committee of N members to store transaction data -- **Trust Assumption**: Assumes at least 2-of-N committee members are honest -- **Data Availability Certificates (DACerts)**: Cryptographic proofs using BLS signatures -- **Fallback Mechanism**: Falls back to posting full data to L1 if committee is unavailable +L2-to-L1 transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/for-devs/partials/precompile-tables/_arbsys.mdx), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [L2-to-L1 messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. -**Technical Implementation:** +The canonical bridge architecture comprises asset contracts on both chains, gateway pairs for specific logic, and routers to direct flows. Its security locks tokens on one layer while minting equivalents on the other, with a seven-day challenge period guarding withdrawals. This setup fosters seamless, unified interactions while safeguarding each chain's integrity. -- **Keysets**: Specify BLS public keys of committee members and signature requirements -- **DACert Contents**: Hash of data block, expiration time, and proof of N-1 member signatures -- **Data Availability Servers (DAS)**: Committee members run servers with Sequencer API and public REST API -- **Storage Options**: Local files, Badger database, Amazon S3, or redundant multi-store configurations +### Step 7: The Economics of Execution: Gas and Fees -**Sequencer-Committee Interaction:** +Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates L2 gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from L1 calldata fees. L1 calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. -1. Sequencer sends a data batch with an expiration time to all committee members -2. Members store data and sign (hash, expiration) pairs using BLS keys -3. Sequencer aggregates signatures to create DACert -4. Sequencer posts DACert to L1 inbox contract -5. If insufficient signatures are collected, the Sequencer falls back to posting full data +A gas speed limit protects infrastructure by capping throughput at 7,000,000 gas per second for Arbitrum One and Nova. Exceeding this triggers [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) fee escalations to prevent node overloads and maintain liveness. This limit prioritizes high-value transactions during peaks while deterring spam, ensuring that validators and the Sequencer stay operational for optimal performance, even though parent contracts handle ultimate security. -**Use Cases**: Optimized for applications requiring very low costs and willing to accept mild trust assumptions, such as gaming or social applications. Arbitrum Nova utilizes AnyTrust to achieve lower fees compared to Arbitrum One. +Fee calculation during execution involves assessing L2 gas via EVM standards, estimating L1 batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. Refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) for more. -For more in-depth information about AnyTrust, refer to the [AnyTrust protocol](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). +### Step 8: Advanced Features -## Additional deep dive resources +Arbitrum extends beyond standard Layer 2 capabilities with features like Stylus, which supports smart contracts in languages such as Rust, C, and C++ via WASM. It offers 10-70x faster execution and 100-500x better memory efficiency than the EVM, with full interoperability for cross-calls. Stylus runs in a co-located WASM VM using host I/O for state access—details in the [Stylus Gentle Intro](/stylus/gentle-introduction.mdx). -This journey has covered the high-level flow of transactions through Arbitrum. For detailed technical information about specific components not already mentioned, check out these additional deep-dives: +Timeboost refines ordering to capture MEV for chain operators, protect users from attacks like front-running, reduce spam-related congestion, and allow customizable policies. See the [Timeboost Gentle Introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx) for insights. -- **[Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx)**: Detailed transaction submission and processing -- **[Geth Integration](/how-arbitrum-works/deep-dives/geth.mdx)**: How Arbitrum modifies Geth for L2 execution -- **[ArbOS](/how-arbitrum-works/deep-dives/arbos.mdx)**: Layer 2 operating system and precompiles -- **[Assertions](/how-arbitrum-works/deep-dives/assertions.mdx)**: How assertions work in the rollup protocol +AnyTrust provides cost-optimized data availability with a mild trust model, relying on a Data Availability Committee (DAC) of `N` members, where at least two are assumed honest. It uses BLS-signed Data Availability Certificates (DACerts) and falls back to Layer 1 posting if needed. Keysets define member keys and thresholds; DACerts include hashes, expirations, and signatures; and servers support various storage, such as local files or Amazon S3. The Sequencer sends batches to the committee, gathers signatures for DACerts, and posts them to Layer 1, defaulting to full data if the required signatures are not present. Ideal for low-cost apps like gaming, as in Arbitrum Nova—explore the [AnyTrust protocol documentation](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). From 0d12892c63c8b5016ff56f4a313dace7081cedb2 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 10 Oct 2025 12:23:04 -0500 Subject: [PATCH 60/75] Fixing broken links --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 2 +- docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx | 2 +- docs/how-arbitrum-works/bold/gentle-introduction.mdx | 2 +- .../common-configurations/arbitrum-chain-finality.mdx | 2 +- .../_arbitrum-chain-public-preview-banner-partial.md | 2 +- docs/partials/_gentle-intro-partial.mdx | 6 +++--- docs/run-arbitrum-node/more-types/02-run-validator-node.mdx | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 3b8e23b03f..44bc52a887 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -95,7 +95,7 @@ BoLD facilitates a challenge-based defense where honest parties can protect the Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For L1-to-L2 messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [L1-to-L2 messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. -L2-to-L1 transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/for-devs/partials/precompile-tables/_arbsys.mdx), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [L2-to-L1 messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. +L2-to-L1 transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [L2-to-L1 messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. The canonical bridge architecture comprises asset contracts on both chains, gateway pairs for specific logic, and routers to direct flows. Its security locks tokens on one layer while minting equivalents on the other, with a seven-day challenge period guarding withdrawals. This setup fosters seamless, unified interactions while safeguarding each chain's integrity. diff --git a/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx b/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx index b607105a3b..536fea266f 100644 --- a/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx +++ b/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx @@ -61,7 +61,7 @@ The current implementation of BoLD involves both onchain and offchain components - **Edge:** Edges are a portion of a claim made by a validator about the history of the chain from some end state all the way back to some initial state. Edges are the fundamental unit in a challenge. -- **Fraud proofs:** Proofs that prove or disprove that an invalid state transition has taken place. These proofs are generated by challenge participants and are submitted to a chain's parent chain. For example, Arbitrum Rollups that settle onto Ethereum will have their proofs submitted to Ethereum and verified via a smart contract. In this case, these proofs allow Ethereum to be the final arbiter of disagreements over assertions in the Rollup contracts, which cannot be falsified by any parties as there is only a single, correct result of executing a `WASM` instruction on a pre-state. WASM is the assembly language that is used to represent programs whose execution is being disputed. In fact, Arbitrum, before and after BoLD, uses a slightly different language called WAVM when executing challenges. The difference is not important to this discussion, but for details, see the page outlining the differences between [WASM and WAVM](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#wavm). +- **Fraud proofs:** Proofs that prove or disprove that an invalid state transition has taken place. These proofs are generated by challenge participants and are submitted to a chain's parent chain. For example, Arbitrum Rollups that settle onto Ethereum will have their proofs submitted to Ethereum and verified via a smart contract. In this case, these proofs allow Ethereum to be the final arbiter of disagreements over assertions in the Rollup contracts, which cannot be falsified by any parties as there is only a single, correct result of executing a `WASM` instruction on a pre-state. WASM is the assembly language that is used to represent programs whose execution is being disputed. In fact, Arbitrum, before and after BoLD, uses a slightly different language called WAVM when executing challenges. The difference is not important to this discussion, but for details, see the page outlining the differences between WASM and WAVM. - **Honest validator:** An entity that knows the correct state of the Arbitrum child chain and who may want to participate in creating assertions, confirming assertions, and/or challenging invalid assertions if they exist. More specifically, this entity must run an Arbitrum full node in `MakeNodes`, `Defensive`, `StakeLatest`, or `ResolveNodes` mode as described in the [How to run a validator](/run-arbitrum-node/more-types/02-run-validator-node.mdx). Note that there must always be an active proposer (i.e., a validator who actively submits new assertions) to advance the chain and who will need to run a validator in `MakeNodes` mode. diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index d0150f4012..93a8d20c81 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -117,7 +117,7 @@ Assertion bond sizes are akin to a “security deposit” that an entity deposit **Challenge bond sizes** -If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is permissionless. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges). Additionally, certain moves within a challenge require an extra bond to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1,110 `ETH` to fully resolve a dispute, which will also be reimbursed upon confirmation of assertions by the protocol. +If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is permissionless. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/bold/gentle-introduction.mdx). Additionally, certain moves within a challenge require an extra bond to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1,110 `ETH` to fully resolve a dispute, which will also be reimbursed upon confirmation of assertions by the protocol. The rationale behind the specific challenge bond size is based on a concept known as a “resource ratio,” defined as the cost ratio between an adversary and an honest party when participating in the interactive fraud proof game. Selecting this value ensured that the malicious party would pay 10 times the marginal costs of the honest party. This resource ratio, coupled with the fact that an honest party will always have its bonds refunded while a malicious party loses everything, helps prevent and deter attacks from the outset. diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx index 75028fb34d..1d94d7c4e9 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx @@ -9,7 +9,7 @@ content_type: how-to ## Child chain transactions -Generally, transactions executed through the sequencer on Arbitrum chains [achieve finality](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx) equivalent to their parent chain once the relevant transaction data has been [posted in a batch](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol). This means that transactions on Arbitrum chains are considered final in minutes. +Generally, transactions executed through the sequencer on Arbitrum chains [achieve finality](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx) equivalent to their parent chain once the relevant transaction data has been [posted in a batch](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx). This means that transactions on Arbitrum chains are considered final in minutes. ## Parent chain → child chain transactions diff --git a/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md b/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md index 5eeb710d79..5240a8fadf 100644 --- a/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md +++ b/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md @@ -1,6 +1,6 @@ :::info PUBLIC PREVIEW, MAINNET READY -Arbitrum chains are now [Mainnet ready](/launch-arbitrum-chain/concepts/public-preview-expectations#arbitrum-chain-is-mainnet-ready-but-deploy-to-testnet-first)! Note that Arbitrum is still a **[public preview](/launch-arbitrum-chain/concepts/public-preview-expectations)** capability - the Arbitrum product and its supporting documentation may change significantly as we capture feedback from readers like you. +Arbitrum chains are now [Mainnet ready](/launch-arbitrum-chain/concepts/public-preview-expectations.mdx#arbitrum-chain-is-mainnet-ready-but-deploy-to-testnet-first)! Note that Arbitrum is still a **[public preview](/launch-arbitrum-chain/concepts/public-preview-expectations)** capability - the Arbitrum product and its supporting documentation may change significantly as we capture feedback from readers like you. To provide feedback, click the _Request an update_ button at the top of this document, [join the Arbitrum Discord](https://discord.gg/arbitrum), or reach out to our team directly by completing [this form](http://bit.ly/3yy6EUK). diff --git a/docs/partials/_gentle-intro-partial.mdx b/docs/partials/_gentle-intro-partial.mdx index 69e4236138..579cded0e7 100644 --- a/docs/partials/_gentle-intro-partial.mdx +++ b/docs/partials/_gentle-intro-partial.mdx @@ -10,7 +10,7 @@ import ImageZoom from '@site/src/components/ImageZoom'; #### Q: Hello! What's Arbitrum? -Hi! Arbitrum is a technology suite designed to scale Ethereum. You can use Arbitrum chains to do all things you do on Ethereum — use Web3 apps, deploy smart contracts, etc., but your transactions will be cheaper and faster. Our flagship product — Arbitrum Rollup — is an Optimistic rollup protocol that inherits Ethereum-level security. +Hi! Arbitrum is a technology suite designed to scale Ethereum. You can use Arbitrum chains to do all things you do on Ethereum—use Web3 apps, deploy smart contracts, etc., but your transactions will be cheaper and faster. Our flagship product—Arbitrum Rollup—is an Optimistic rollup protocol that inherits Ethereum-level security. #### Q: What, what’s “Ethereum”? What's a “smart contract”? Where am I? @@ -39,7 +39,7 @@ Yes, indeed we can be. This is where the “rollup” part comes in. The data th #### Q: Who actually does this work (of checking for fraud, proving it, etc?) -The parties who move the Arbitrum chain state forward on L1 — i.e., making claims about the chain’s state, disputing other’s claims, etc. — are called validators. +The parties who move the Arbitrum chain state forward on L1 — i.e., making claims about the chain’s state, disputing other’s claims, etc.—are called validators. In practice, we don’t expect the average Arbitrum user to be interested in running a validator, just like the average Ethereum user typically doesn’t run their own layer 1 staking node. The crucial property, however, is that anybody can; becoming an Arbitrum validator requires no special permission ([once the allowlist is lifted](https://docs.arbitrum.foundation/state-of-progressive-decentralization)), only that a user runs the [open source validator software](https://github.com/OffchainLabs/nitro) (and bonds `ETH` when/if they need to take action). @@ -47,7 +47,7 @@ Additionally, as long as there’s even just one honest validator, the chain wil #### Q: And how exactly is “fraud” “proven”? Sounds complicated. -Oh, it’s not so bad. In essence, if two validators disagree, only one of them (at most) can be telling the truth. In a dispute, the two validators play an interactive, call-and-response game in which they narrow down their dispute to a single computational step (think of something small and simple, like multiplying two numbers). This one step gets executed on L1 and will necessarily prove that the honest party was telling the truth. For a more detailed rundown, see [here](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#validators). +Oh, it’s not so bad. In essence, if two validators disagree, only one of them (at most) can be telling the truth. In a dispute, the two validators play an interactive, call-and-response game in which they narrow down their dispute to a single computational step (think of something small and simple, like multiplying two numbers). This one step gets executed on L1 and will necessarily prove that the honest party was telling the truth. For a more detailed rundown, see [here](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx). #### Q: This dispute game obviously takes some time; does this impose any sort of delay on Arbitrum users' transactions? diff --git a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx index 5b7848db20..b10c16d15c 100644 --- a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx +++ b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx @@ -13,7 +13,7 @@ This page describes the different strategies a validator may follow and provides This how-to assumes that you're familiar with the following: - How to run a full node (see instructions [here](/run-arbitrum-node/02-run-full-node.mdx)) -- [How the Rollup protocol works](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) +- [How the Rollup protocol works](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) - [How BoLD works](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx#how-bold-uses-ethereum), if you're running a validator for a chain that has BoLD activated ## Validation strategies From 9453533e0bad1b7de20d89bb04aee09368838ff4 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 10 Oct 2025 12:26:47 -0500 Subject: [PATCH 61/75] Fixing broken link --- .../partials/_arbitrum-chain-public-preview-banner-partial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md b/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md index 5240a8fadf..3b33fd052a 100644 --- a/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md +++ b/docs/launch-arbitrum-chain/partials/_arbitrum-chain-public-preview-banner-partial.md @@ -1,6 +1,6 @@ :::info PUBLIC PREVIEW, MAINNET READY -Arbitrum chains are now [Mainnet ready](/launch-arbitrum-chain/concepts/public-preview-expectations.mdx#arbitrum-chain-is-mainnet-ready-but-deploy-to-testnet-first)! Note that Arbitrum is still a **[public preview](/launch-arbitrum-chain/concepts/public-preview-expectations)** capability - the Arbitrum product and its supporting documentation may change significantly as we capture feedback from readers like you. +Arbitrum chains are now [Mainnet ready](/launch-arbitrum-chain/concepts/public-preview-expectations.mdx#arbitrum-chains-are-mainnet-ready-but-deploy-to-testnet-first)! Note that Arbitrum is still a **[public preview](/launch-arbitrum-chain/concepts/public-preview-expectations.mdx)** capability - the Arbitrum product and its supporting documentation may change significantly as we capture feedback from readers like you. To provide feedback, click the _Request an update_ button at the top of this document, [join the Arbitrum Discord](https://discord.gg/arbitrum), or reach out to our team directly by completing [this form](http://bit.ly/3yy6EUK). From 5ba6c0b18716af91da525257077c02508b67aead Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 07:45:07 -0500 Subject: [PATCH 62/75] Updating HAW-transaction-lifecycle diagram --- static/img/haw-transaction-lifecycle.png | Bin 0 -> 1338365 bytes static/img/haw-transaction-lifecycle.svg | 10 ---------- 2 files changed, 10 deletions(-) create mode 100644 static/img/haw-transaction-lifecycle.png delete mode 100755 static/img/haw-transaction-lifecycle.svg diff --git a/static/img/haw-transaction-lifecycle.png b/static/img/haw-transaction-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..258a9f81d714cbe3beb0b30ec377a767f2de4eb9 GIT binary patch literal 1338365 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 z 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�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≥b+s5Q@CHq7<dJkdx8$LYCJ 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 q~HZ_~eJ9UI3_l@HXwVx_Q+}{h9 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%0Av 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

9%Y*`E`~MQ{ewV5z&44sXkFv(aFezq+JBB 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�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%0AncUMXpS=B_V`$LRN=Ma{1S+Z#1>-kp{7 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 hzW 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 Z(dYqb5!}?yZJX+I$=U5f<@p;A{vVH?XFmV{ literal 0 HcmV?d00001 diff --git a/static/img/haw-transaction-lifecycle.svg b/static/img/haw-transaction-lifecycle.svg deleted file mode 100755 index 51881c27f7..0000000000 --- a/static/img/haw-transaction-lifecycle.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - From 5f8befa23cf0c439054a6aa6db1d3e8bacfb5577 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 07:47:45 -0500 Subject: [PATCH 63/75] Fixing diagram render issue --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 44bc52a887..106316bf2a 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -47,7 +47,7 @@ Arbitrum Nitro's design draws from four pivotal innovations that collectively en The submission process for a transaction on Arbitrum starts with the user sending the request, with options tailored to balance factors like speed, control, and reliability according to specific needs. Most transactions route through the Sequencer, a specialized node that orders them and issues quick confirmations. This path accommodates various submission methods, including public RPC for development and light usage, third-party RPC for improved throughput, direct Sequencer endpoints for minimal latency in critical operations, and self-hosted Arbitrum nodes for ultimate privacy and customization. - + Alternatively, to counter risks of exclusion or delay by the Sequencer, users can submit directly to the Delayed Inbox contract on Ethereum, bolstering system resilience. In this mechanism, non-Sequencer transactions enter a dedicated queue, where a well-functioning Sequencer typically integrates them within about ten minutes. If delayed beyond 24 hours, any network participant can force inclusion into the main inbox, limiting the Sequencer's influence to temporary delays rather than permanent blocks. While the Sequencer route offers faster soft finality and streamlined workflows, the Delayed Inbox path doubles processing time but emphasizes censorship resistance. Overall, the Sequencer's commitment to ordered inclusion provides "soft finality" for a responsive experience, complemented by these alternatives for robust, flexible operations across applications. For more technical detail about the transaction lifecycle, refer to the [Transaction Lifecycle deep dive](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx). From 084354d1e887951a381c26b0b3f55545cef696d9 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 09:15:10 -0500 Subject: [PATCH 64/75] Fixing links from merge --- docs/get-started/overview.mdx | 22 +++++++++---------- .../current.json | 2 +- sidebars.js | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/get-started/overview.mdx b/docs/get-started/overview.mdx index c29a67d62f..ff4d36f995 100644 --- a/docs/get-started/overview.mdx +++ b/docs/get-started/overview.mdx @@ -14,17 +14,17 @@ Arbitrum suite along with onboarding guidance tailored to specific audiences. The Arbitrum suite includes the protocols, chains, services, and SDKs that power the Arbitrum ecosystem: -| Component | Description | -| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| [Arbitrum Rollup](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) | A **protocol** for scaling Ethereum smart contracts. | -| [Arbitrum AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) | A **protocol** for scaling Ethereum smart contracts even further, with a mild trust assumption. | -| [Arbitrum Nitro](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) | The node **software** that codifies the Rollup and AnyTrust protocols. | -| [Arbitrum nodes](/run-arbitrum-node/02-run-full-node.mdx) | **Machines** that run Nitro in order to service and/or interact with an Arbitrum chain. | -| [Arbitrum One](https://portal.arbitrum.io/?chains=arbitrum-one) | A public Rollup **chain**. | -| [Arbitrum Nova](https://portal.arbitrum.io/?chains=arbitrum-nova) | A public AnyTrust **chain**. | -| [Arbitrum bridge](https://bridge.arbitrum.io/) | Lets you move `ETH` and `ERC-20` tokens between Ethereum, Arbitrum, and select Arbitrum (Orbit) chains. | -| [Arbitrum (Orbit) chains](https://orbit.arbitrum.io/) | Lets you run your own Rollup and AnyTrust chains. | -| [Arbitrum Stylus](/stylus/gentle-introduction.mdx) | Lets you write EVM-compatible smart contracts in Rust and any other language that compiles to Wasm. | +| Component | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| [Arbitrum Rollup](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) | A **protocol** for scaling Ethereum smart contracts. | +| [Arbitrum AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) | A **protocol** for scaling Ethereum smart contracts even further, with a mild trust assumption. | +| [Arbitrum Nitro](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) | The node **software** that codifies the Rollup and AnyTrust protocols. | +| [Arbitrum nodes](/run-arbitrum-node/02-run-full-node.mdx) | **Machines** that run Nitro in order to service and/or interact with an Arbitrum chain. | +| [Arbitrum One](https://portal.arbitrum.io/?chains=arbitrum-one) | A public Rollup **chain**. | +| [Arbitrum Nova](https://portal.arbitrum.io/?chains=arbitrum-nova) | A public AnyTrust **chain**. | +| [Arbitrum bridge](https://bridge.arbitrum.io/) | Lets you move `ETH` and `ERC-20` tokens between Ethereum, Arbitrum, and select Arbitrum (Orbit) chains. | +| [Arbitrum (Orbit) chains](https://orbit.arbitrum.io/) | Lets you run your own Rollup and AnyTrust chains. | +| [Arbitrum Stylus](/stylus/gentle-introduction.mdx) | Lets you write EVM-compatible smart contracts in Rust and any other language that compiles to Wasm. | ## Arbitrum for users diff --git a/i18n/ja/docusaurus-plugin-content-docs/current.json b/i18n/ja/docusaurus-plugin-content-docs/current.json index 10191d9853..7c0e646734 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current.json +++ b/i18n/ja/docusaurus-plugin-content-docs/current.json @@ -540,7 +540,7 @@ }, "sidebar.getStartedSidebar.link.How Arbitrum works": { "message": "How Arbitrum works", - "description": "The label for link How Arbitrum works in sidebar getStartedSidebar, linking to /how-arbitrum-works/a-gentle-introduction" + "description": "The label for link How Arbitrum works in sidebar getStartedSidebar, linking to /how-arbitrum-works/inside-arbitrum-nitro" }, "sidebar.getStartedSidebar.link.Run an Arbitrum (Orbit) chain": { "message": "Run an Arbitrum (Orbit) chain", diff --git a/sidebars.js b/sidebars.js index ff332d36cf..b502e7c9ad 100644 --- a/sidebars.js +++ b/sidebars.js @@ -72,7 +72,7 @@ const sidebars = { { type: 'link', label: 'How Arbitrum works', - href: '/how-arbitrum-works/a-gentle-introduction', + href: '/how-arbitrum-works/inside-arbitrum-nitro', }, { type: 'html', From f5b9c3397bef31ffd804cfc80c5f1e3641c278d8 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 11:36:52 -0500 Subject: [PATCH 65/75] Adding redirects --- vercel.json | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/vercel.json b/vercel.json index 3392afe3ea..5580ebb8f9 100644 --- a/vercel.json +++ b/vercel.json @@ -440,6 +440,11 @@ "destination": "/arbitrum-bridge/quickstart", "permanent": false }, + { + "source": "/(how-arbitrum-works/anytrust-protocol/?)", + "destination": "/how-arbitrum-works/deep-dives/anytrust-protocol", + "permanent": false + }, { "source": "/(how-arbitrum-works/arbos/geth/?)", "destination": "/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum", @@ -470,6 +475,11 @@ "destination": "/how-arbitrum-works/bold/gentle-introduction", "permanent": false }, + { + "source": "/(how-arbitrum-works/data-availability/?)", + "destination": "/run-arbitrum-node/data-availability", + "permanent": false + }, { "source": "/(how-arbitrum-works/fraud-proofs/challenge-manager/?)", "destination": "/how-arbitrum-works/validation-and-proving/proving-and-challenges", @@ -510,6 +520,11 @@ "destination": "/how-arbitrum-works/validation-and-proving/proving-and-challenges", "permanent": false }, + { + "source": "/(how-arbitrum-works/gas-fees/?)", + "destination": "/how-arbitrum-works/deep-dives/gas-and-fees", + "permanent": false + }, { "source": "/(how-arbitrum-works/geth-at-the-core/?)", "destination": "/how-arbitrum-works/state-transition-function/stf-gentle-intro", @@ -540,6 +555,16 @@ "destination": "/how-arbitrum-works/gas-fees", "permanent": false }, + { + "source": "/(how-arbitrum-works/l1-to-l2-messaging/?)", + "destination": "/how-arbitrum-works/deep-dives/l1-to-l2-messaging", + "permanent": false + }, + { + "source": "/(how-arbitrum-works/l2-to-l1-messaging/?)", + "destination": "/how-arbitrum-works/deep-dives/l2-to-l1-messaging", + "permanent": false + }, { "source": "/(how-arbitrum-works/nitro-vs-classic/?)", "destination": "/how-arbitrum-works/a-gentle-introduction", @@ -555,6 +580,21 @@ "destination": "/how-arbitrum-works/validation-and-proving/validation-and-proving", "permanent": false }, + { + "source": "/(how-arbitrum-works/sequencer/?)", + "destination": "/how-arbitrum-works/deep-dives/sequencer", + "permanent": false + }, + { + "source": "/(how-arbitrum-works/state-transition-function/arbos/?)", + "destination": "/how-arbitrum-works/deep-dives/arbos", + "permanent": false + }, + { + "source": "/(how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum/?)", + "destination": "/how-arbitrum-works/deep-dives/geth", + "permanent": false + }, { "source": "/(how-arbitrum-works/timeboost/?)", "destination": "/how-arbitrum-works/timeboost/gentle-introduction", From b209b1865aacadfc274588799084a49e2fe24333 Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 11:41:21 -0500 Subject: [PATCH 66/75] Editing redirects --- vercel.json | 80 ++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/vercel.json b/vercel.json index 5580ebb8f9..c15a711fd8 100644 --- a/vercel.json +++ b/vercel.json @@ -200,6 +200,46 @@ "destination": "/(docs/get-started/overview/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/anytrust-protocol/?)", + "destination": "docs/how-arbitrum-works/deep-dives/anytrust-protocol", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/arbos/geth/?)", + "destination": "docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/arbos/introduction/?)", + "destination": "docs/how-arbitrum-works/state-transition-function/arbos", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/arbos/l1-l2-messaging/?)", + "destination": "docs/how-arbitrum-works/l1-to-l2-messaging", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/arbos/l2-l1-messaging/?)", + "destination": "docs/how-arbitrum-works/l2-to-l1-messaging", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/assertion-tree/?)", + "destination": "docs/how-arbitrum-works/optimistic-rollup", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/bold/public-preview-expectations/?)", + "destination": "docs/how-arbitrum-works/bold/gentle-introduction", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/data-availability/?)", + "destination": "docs/run-arbitrum-node/data-availability", + "permanent": false + }, { "source": "/(docs/inside_arbitrum/?)", "destination": "/how-arbitrum-works/a-gentle-introduction", @@ -440,46 +480,6 @@ "destination": "/arbitrum-bridge/quickstart", "permanent": false }, - { - "source": "/(how-arbitrum-works/anytrust-protocol/?)", - "destination": "/how-arbitrum-works/deep-dives/anytrust-protocol", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/arbos/geth/?)", - "destination": "/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/arbos/introduction/?)", - "destination": "/how-arbitrum-works/state-transition-function/arbos", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/arbos/l1-l2-messaging/?)", - "destination": "/how-arbitrum-works/l1-to-l2-messaging", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/arbos/l2-l1-messaging/?)", - "destination": "/how-arbitrum-works/l2-to-l1-messaging", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/assertion-tree/?)", - "destination": "/how-arbitrum-works/optimistic-rollup", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/bold/public-preview-expectations/?)", - "destination": "/how-arbitrum-works/bold/gentle-introduction", - "permanent": false - }, - { - "source": "/(how-arbitrum-works/data-availability/?)", - "destination": "/run-arbitrum-node/data-availability", - "permanent": false - }, { "source": "/(how-arbitrum-works/fraud-proofs/challenge-manager/?)", "destination": "/how-arbitrum-works/validation-and-proving/proving-and-challenges", From 69ef0c412225c6fb07ca033d363fb50e3270a7df Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 17 Oct 2025 11:50:39 -0500 Subject: [PATCH 67/75] Adding more redirects --- vercel.json | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/vercel.json b/vercel.json index c15a711fd8..090d1f332e 100644 --- a/vercel.json +++ b/vercel.json @@ -210,11 +210,6 @@ "destination": "docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum", "permanent": false }, - { - "source": "/(docs/how-arbitrum-works/arbos/introduction/?)", - "destination": "docs/how-arbitrum-works/state-transition-function/arbos", - "permanent": false - }, { "source": "/(docs/how-arbitrum-works/arbos/l1-l2-messaging/?)", "destination": "docs/how-arbitrum-works/l1-to-l2-messaging", @@ -240,6 +235,36 @@ "destination": "docs/run-arbitrum-node/data-availability", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/gas-fees/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/gas-and-fees/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/l1-to-l2-messaging/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/l2-to-l1-messaging/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/sequencer/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/arbos/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/arbos/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/geth/?)", + "permanent": false + }, { "source": "/(docs/inside_arbitrum/?)", "destination": "/how-arbitrum-works/a-gentle-introduction", From ee125dfd539b89b9213ecfd40b0d7469a9b8dcb8 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Wed, 22 Oct 2025 11:57:53 -0700 Subject: [PATCH 68/75] removing unnecessary parts, fixing terminology, edits --- .../01-inside-arbitrum-nitro.mdx | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 106316bf2a..393c6a7f80 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -15,6 +15,8 @@ As a developer initiating a transaction on Arbitrum, gaining a clear understandi This overview methodically traces the transaction lifecycle, emphasizing how Arbitrum's architecture ensures precise, efficient, and secure handling at every stage. This article encompasses the complete Arbitrum Nitro stack, beginning with the Sequencer responsible for transaction ordering, advancing to the State Transition Function for execution, and culminating in validation mechanisms that uphold integrity. + + Along the way, we will highlight Arbitrum's ability to deliver security on par with Ethereum, while achieving fee reductions by a factor of ten and transaction speeds accelerated by a factor of 100 through optimized scaling techniques. ### The Foundation: Arbitrum's Core Architecture Overview @@ -31,24 +33,10 @@ From there, the State Transition Function (STF) processes them in a deterministi Finally, the Outputs component generates the resulting data and state updates, completing the cycle. This deterministic model means that identical inputs always produce the same outputs among honest nodes, forming the bedrock of Arbitrum's security. It supports efficient fraud proofs and dispute resolution, allowing verification of execution correctness without the need to rerun entire transactions, thereby minimizing computational overhead. -### Nitro's Four Key Innovations - -Arbitrum Nitro's design draws from four pivotal innovations that collectively enhance its efficiency, security, and compatibility. - -1. The first involves a two-phase approach to transaction handling: sequencing followed by deterministic execution. In this method, the ordering of transactions forms a single, committed sequence, after which the STF executes them in that fixed order, ensuring predictability and order integrity. - -2. The second innovation centers on deep integration with Geth, the core codebase of go-ethereum, a prominent Ethereum node software. By embedding Geth as a library, Nitro fully supports Ethereum's data structures, formats, and virtual machine, delivering near-perfect compatibility and allowing seamless migration of Ethereum applications. - -3. Third, Nitro separates execution from proving by compiling its source code twice—once to native code for high-speed operation in Nitro nodes, and once to WebAssembly (WASM) for secure, portable proving processes. This dual compilation optimizes for both performance during runtime and reliability in validation scenarios. - -4. Finally, Nitro employs an Optimistic Rollup protocol with interactive fraud proofs, settling transactions on Ethereum's Layer 1 while using Arbitrum's pioneering proof system to resolve disputes efficiently. Together, these innovations enable Arbitrum to match Ethereum's security guarantees, boost overall performance, and maintain full interoperability with existing Ethereum tools and dApps. - ### Step 1: Submitting a Transaction The submission process for a transaction on Arbitrum starts with the user sending the request, with options tailored to balance factors like speed, control, and reliability according to specific needs. Most transactions route through the Sequencer, a specialized node that orders them and issues quick confirmations. This path accommodates various submission methods, including public RPC for development and light usage, third-party RPC for improved throughput, direct Sequencer endpoints for minimal latency in critical operations, and self-hosted Arbitrum nodes for ultimate privacy and customization. - - Alternatively, to counter risks of exclusion or delay by the Sequencer, users can submit directly to the Delayed Inbox contract on Ethereum, bolstering system resilience. In this mechanism, non-Sequencer transactions enter a dedicated queue, where a well-functioning Sequencer typically integrates them within about ten minutes. If delayed beyond 24 hours, any network participant can force inclusion into the main inbox, limiting the Sequencer's influence to temporary delays rather than permanent blocks. While the Sequencer route offers faster soft finality and streamlined workflows, the Delayed Inbox path doubles processing time but emphasizes censorship resistance. Overall, the Sequencer's commitment to ordered inclusion provides "soft finality" for a responsive experience, complemented by these alternatives for robust, flexible operations across applications. For more technical detail about the transaction lifecycle, refer to the [Transaction Lifecycle deep dive](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx). ### Step 2: Ordering and Broadcasting: The Sequencer @@ -93,19 +81,19 @@ BoLD facilitates a challenge-based defense where honest parties can protect the ### Step 6: Bridging: Cross-Chain Communication -Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For L1-to-L2 messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [L1-to-L2 messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. +Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For Parent-to-Child messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [Parent-to-Child messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. -L2-to-L1 transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [L2-to-L1 messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. +Parent-to-Child transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [Child-to-Parent messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. The canonical bridge architecture comprises asset contracts on both chains, gateway pairs for specific logic, and routers to direct flows. Its security locks tokens on one layer while minting equivalents on the other, with a seven-day challenge period guarding withdrawals. This setup fosters seamless, unified interactions while safeguarding each chain's integrity. ### Step 7: The Economics of Execution: Gas and Fees -Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates L2 gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from L1 calldata fees. L1 calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. +Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates child chain gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from Parent chain calldata fees. Parent chain calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. A gas speed limit protects infrastructure by capping throughput at 7,000,000 gas per second for Arbitrum One and Nova. Exceeding this triggers [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) fee escalations to prevent node overloads and maintain liveness. This limit prioritizes high-value transactions during peaks while deterring spam, ensuring that validators and the Sequencer stay operational for optimal performance, even though parent contracts handle ultimate security. -Fee calculation during execution involves assessing L2 gas via EVM standards, estimating L1 batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. Refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) for more. +Fee calculation during execution involves assessing child chain gas via EVM standards, estimating parent chain batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. Refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) for more. ### Step 8: Advanced Features From b550de758dd15a319c995897397384116962da1b Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:03:08 -0700 Subject: [PATCH 69/75] changing l1 l2 to parent child --- sidebars.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sidebars.js b/sidebars.js index b502e7c9ad..0779c23118 100644 --- a/sidebars.js +++ b/sidebars.js @@ -757,12 +757,12 @@ const sidebars = { }, { type: 'doc', - label: 'L1 to L2 Messaging', + label: 'Parent to Child chain Messaging', id: 'how-arbitrum-works/deep-dives/l1-to-l2-messaging', }, { type: 'doc', - label: 'L2 to L1 Messaging', + label: 'Child to Parent chain Messaging', id: 'how-arbitrum-works/deep-dives/l2-to-l1-messaging', }, { From 65dfaffd1e28546e5428c9fcb3ddb70297bd9dbf Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:07:23 -0700 Subject: [PATCH 70/75] adding arbos section --- sidebars.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sidebars.js b/sidebars.js index 0779c23118..54d2b81de3 100644 --- a/sidebars.js +++ b/sidebars.js @@ -750,6 +750,11 @@ const sidebars = { label: 'AnyTrust', id: 'how-arbitrum-works/deep-dives/anytrust-protocol', }, + { + type: 'doc', + label: 'ArbOS', + id: 'how-arbitrum-works/deep-dives/arbos', + }, { type: 'doc', label: 'Assertions', From 72eb733a7e32a317c3e5260968d205c7703bde88 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:28:22 -0700 Subject: [PATCH 71/75] added arbos page, and parent chain paricing --- docs/how-arbitrum-works/deep-dives/arbos.mdx | 277 +---------------- .../deep-dives/parent-chain-pricing.mdx | 282 ++++++++++++++++++ sidebars.js | 5 + 3 files changed, 289 insertions(+), 275 deletions(-) create mode 100644 docs/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index 06cdcca986..3e4399b8e4 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -2,7 +2,7 @@ title: 'A gentle introduction' description: 'Learn the fundamentals of Nitro, Arbitrum stack.' author: petevielhaber -sme: Mehdi +sme: mehdi salehi user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. content_type: get-started --- @@ -77,280 +77,7 @@ This component maintains the last 256 parent chain block hashes in a circular bu In addition to supporting the [`ArbAggregator precompile`](/build-decentralized-apps/precompiles/02-reference.mdx#arbaggregator), the parent chain pricing state provides tools for determining the parent chain component of a transaction's gas costs. This part of the state tracks the total amount of funds collected from transactions in parent chain gas fees and the funds spent by batch posters to post data breaches on the parent chain. Based on this information, ArbOS maintains a parent chain data fee, which is also tracked as part of this state, determining how much transaction fees will cost for parent chain fees. ArbOS dynamically adjusts this value so that fees collected are approximately equal to batch posting costs. - -## Parent chain pricing model - -Efficient handling of parent chain gas costs is crucial for the Arbitrum network's scalability and economic sustainability. The Sequencer implements a dynamic parent chain pricing model to ensure that fees collected from transactions closely match the actual costs incurred when posting data to the parent chain. This section details the challenges in pricing parent chain resources, how fees are collected and allocated, and how the system adjusts to maintain equilibrium over time. - -## Challenges in pricing parent chain resources - -There are two main challenges in accurately pricing parent chain resources: - -### 1. Apportioning batch costs among transactions: - -- **Compression complexity**: The data posted to the parent chain is compressed using a general-purpose compression algorithm (Brotli). The effectiveness of compression depends on shared patterns among transactions in a batch. - -- **Contribution estimation**: It's difficult to determine how much a specific transaction contributes to the overall compressibility of the batch. - -- **Ideal vs. practical**: Ideally, transactions that enhance compressibility would get charged less, but there's no efficient way to calculate this precisely within the constraints of the STF. - -### 2. Assessing parent chain fees at sequencing time: - -- **Determinism requirement**: The parent chain fee charged to a transaction must be known when the transaction is sequenced to maintain the determinism of the STF. - -- **Future uncertainty**: At sequencing time, the actual cost of the batch is unknown because it depends on: - - - The parent chain base fee at the future time of batch posting - - - The remaining contents of the batch affect its size and compressability - -- **Impossibility of exact charges**: Charging based on future information is not feasible, so the system must rely on estimations. - -## Nitro's approach to addressing the challenges - -To overcome these challenges, Arbitrum's Nitro implements a two-fold strategy: - -### 1. Estimated relative footprint - -- Estimated size is calculated for each transaction and measured in data units to approximate its impact on batch size. - -### 2. Adaptive fee per data unit - -- A dynamic fee per data unit is determined at any given time, adjusting to align collected fees with actual costs. - -## Apprortioning costs among transactions - -To approximate each transaction's contribution to parent chain costs, Arbitrum employs the following method: - -- **Compression estimation**: - - - Each transaction individually compresses using the Brotli compressor at its lowest compression level (fastest setting). - - - This approach reduces computational overhead within the STF. - -- **Data unit calculation**: - - - The size of the compressed transaction is multiplied by 16 (since Ethereum charges 16 gas per non-zero byte). - - - This product represents the transaction's estimated footprint in data units. - -- **Rationale**: - - - This method approximates the transaction's size after full batch compression. - - - While not exact, it's computationally efficient and suitable for real-time processing. - -## Determining cost per data unit - -Charging a transaction based on the parent chain base fee is not viable due to: - -- **ArbOS limitations**: - - - ArbOS cannot directly measure the parent chain base fee - - - Relying on the Sequencer to report the parent chain base fee isn't secure, as it could manipulate fees for profit - -- **Approximation errors**: - - - The estimated data units per transaction don't precisely reflect parent chain costs - - - The total number of data units charged may not be directly proportional to the Sequencer's expenses - -### Adaptive pricing algorithm - -To align collected fees with actual costs, Arbitrum uses an adaptive algorithm with two primary goals: - -1. **Cost alignment** - - - Minimize the long-term difference between collected fees and the Sequencer's parent chain costs - -2. **Stability** - - - Avoid sudden fluctuations in the data price, ensuring a stable fee environment - -### Pricer components - -The pricer module within ArbOS tracks: - -- **Amount owed to the Sequencer**: - - - The cumulative parent chain costs incurred by the Sequencer for batch posting - -- **Reimbursement fund**: - - - Collects all funds charged to transactions for parent chain fees - - - Acts as a pool to reimburse the Sequencer - -- **Data unit count**: - - - The total number of recent data units processed - - - Increases with each transaction's estimated data units - -- **Current parent chain data unit price**: - - - The adaptive fee per data unit expressed in `wei` - -### Algorithm for price adjustment - -When the Sequencer posts a batch to the parent chain inbox: - -1. **Batch posting report generation**: - - - The parent chain inbox inserts a "batch posting report" transaction into the chain's Delayed Inbox - - - After a delay, this report gets processed by ArbOS's pricer module - -2. **Processing the batch posting report**: - - - **Compute batch cost**: - - - ArbOS calculates the actual cost of posting the batch by: - - - Retrieving the batch data from the inbox state - - - Counting zero and non-zero bytes to determine parent chain gas usage - - - The cost is added to the amount owed to the Sequencer - - - **Update data units**: - - - Calculate the data units assigned to this update $(U_{\text{upd}})$ - - $$ - U_{\text{upd}} = U \times \frac{T_{\text{upd}} - T_{\text{prev}}}{T - T_{\text{prev}}} - $$ - - - $U$: Total recent data units - - - $T$: Current time - - - $T_{\text{upd}}$: Time when the update occurred - - - $T_{\text{prev}}$: Time of the previous update - - - Subtract $U_{\text{upd}}$ from the total $U$ - - - **Reimburse the Sequencer**: - - - Pay the Sequencer from the reimbursement fund: - - - The amount paid is the lesser of the amount owed or the fund balance. - - - Deduct the paid amount from both the reimbursement fund and the amount owed - - - **Compute surplus and derivative**: - - - Surplus ($S$): - - $$ - S = \text{Reimbursement Fund Balance} - \text{Amount Owed} - $$ - - - Derivative of surplus ($D$): - - - $D = \frac{S - S_{\text{prev}}}{U_{\text{upd}}}$ - - - $S_{\text{prev}}$: Surplus at the previous update - - - **Compute derivative goal($D'$)**: - - - Establish a target derivative to eliminate surplus over time: - - - $D' = -\frac{S}{E}$ - - - $E$: Equilibration constant (time horizon for balancing surplus). - - - **Adjust price ($\Delta P)$)**: - - - Calculate the change in the data unit price: - - - $\Delta P = \frac{(D' - D) \times U_{\text{upd}}}{\alpha + U_{\text{upd}}}$ - - - $\alpha$: Smoothing parameter to prevent abrupt changes - - - Update the price: - - - $P = \max(0, P_{\text{prev}} + \Delta P)$ - - - **Outcome**: - - - The adaptive algorithm adjusts the parent chain-data unit price to align collected fees with actual costs. - - - Ensures that the Sequencer gets fairly reimbursed while avoiding surpluses or deficits. - -### Additional Considerations - -- **Per-unit rewards**: - - - An optional per-unit reward can be included and payable to a designated address. - - - Useful for covering additional expenses such as infrastructure or operations. - -- **Recompression scenarios**: - - - Recompression of existing batch segments may occur if: - - - The batch exceeds the maximum size limits - - - The batch hasn't been properly closed - -- **Compression levels**: - - - Dynamic adjustments of compression levels based on backlog size ($B$): - - - **Compression level ($CL$)**: - - - For $B \leq 20$ - - - $CL = \min(6, UC)$ - - - For $20 < B < 60$ - - - $CL = UC$ - - - For $B > 60$ - - - $CL = \min(4, UC)$ - - - **Recompression level ($RL$)**: - - - For $B < 40$: - - - $RL = UC$ - - - For $B \geq 40$: - - - $RL = \min(6, UC)$ - - - $UC$: User-configured compression level - -## Retrieving parent chain fee information - -Users and developers can access parent chain fee-related data through the following methods: - -- Parent chain gas base fee estimate: - - - **Method**: `ArbGasInfo.getL1BaseFeeEstimate()` - - - **Purpose**: Retrieves the current estimated parent–gas base fee for calculating transaction costs. - -- Estimating transaction parent chain fees: - - - **Methods**: - - - `NodeInterface.gasEstimateComponents()` - - - `NodeInterface.gasEstimateL1Component()` - - - **Purpose**: Provides an estimate of the parent chain gas a transaction will consume. - -- Transaction receipts: - - - **Field**: `gasUsedForL1` - - - **Description**: Indicates the child chain gas used to cover parent chain costs. +For more details about details of parent chain pricing, see [Parent chain pricing](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). ### [`l2PricingState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/l2pricing/l2pricing.go#L14) diff --git a/docs/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx b/docs/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx new file mode 100644 index 0000000000..cae227e469 --- /dev/null +++ b/docs/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx @@ -0,0 +1,282 @@ +--- +title: 'A gentle introduction' +description: 'Learn the fundamentals of Nitro, Arbitrum stack.' +author: petevielhaber +sme: Mehdi +user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. +content_type: get-started +--- + +## Parent chain pricing model + +Efficient handling of parent chain gas costs is crucial for the Arbitrum network's scalability and economic sustainability. The Sequencer implements a dynamic parent chain pricing model to ensure that fees collected from transactions closely match the actual costs incurred when posting data to the parent chain. This section details the challenges in pricing parent chain resources, how fees are collected and allocated, and how the system adjusts to maintain equilibrium over time. + +## Challenges in pricing parent chain resources + +There are two main challenges in accurately pricing parent chain resources: + +### 1. Apportioning batch costs among transactions: + +- **Compression complexity**: The data posted to the parent chain is compressed using a general-purpose compression algorithm (Brotli). The effectiveness of compression depends on shared patterns among transactions in a batch. + +- **Contribution estimation**: It's difficult to determine how much a specific transaction contributes to the overall compressibility of the batch. + +- **Ideal vs. practical**: Ideally, transactions that enhance compressibility would get charged less, but there's no efficient way to calculate this precisely within the constraints of the STF. + +### 2. Assessing parent chain fees at sequencing time: + +- **Determinism requirement**: The parent chain fee charged to a transaction must be known when the transaction is sequenced to maintain the determinism of the STF. + +- **Future uncertainty**: At sequencing time, the actual cost of the batch is unknown because it depends on: + + - The parent chain base fee at the future time of batch posting + + - The remaining contents of the batch affect its size and compressability + +- **Impossibility of exact charges**: Charging based on future information is not feasible, so the system must rely on estimations. + +## Nitro's approach to addressing the challenges + +To overcome these challenges, Arbitrum's Nitro implements a two-fold strategy: + +### 1. Estimated relative footprint + +- Estimated size is calculated for each transaction and measured in data units to approximate its impact on batch size. + +### 2. Adaptive fee per data unit + +- A dynamic fee per data unit is determined at any given time, adjusting to align collected fees with actual costs. + +## Apprortioning costs among transactions + +To approximate each transaction's contribution to parent chain costs, Arbitrum employs the following method: + +- **Compression estimation**: + + - Each transaction individually compresses using the Brotli compressor at its lowest compression level (fastest setting). + + - This approach reduces computational overhead within the STF. + +- **Data unit calculation**: + + - The size of the compressed transaction is multiplied by 16 (since Ethereum charges 16 gas per non-zero byte). + + - This product represents the transaction's estimated footprint in data units. + +- **Rationale**: + + - This method approximates the transaction's size after full batch compression. + + - While not exact, it's computationally efficient and suitable for real-time processing. + +## Determining cost per data unit + +Charging a transaction based on the parent chain base fee is not viable due to: + +- **ArbOS limitations**: + + - ArbOS cannot directly measure the parent chain base fee + + - Relying on the Sequencer to report the parent chain base fee isn't secure, as it could manipulate fees for profit + +- **Approximation errors**: + + - The estimated data units per transaction don't precisely reflect parent chain costs + + - The total number of data units charged may not be directly proportional to the Sequencer's expenses + +### Adaptive pricing algorithm + +To align collected fees with actual costs, Arbitrum uses an adaptive algorithm with two primary goals: + +1. **Cost alignment** + + - Minimize the long-term difference between collected fees and the Sequencer's parent chain costs + +2. **Stability** + + - Avoid sudden fluctuations in the data price, ensuring a stable fee environment + +### Pricer components + +The pricer module within ArbOS tracks: + +- **Amount owed to the Sequencer**: + + - The cumulative parent chain costs incurred by the Sequencer for batch posting + +- **Reimbursement fund**: + + - Collects all funds charged to transactions for parent chain fees + + - Acts as a pool to reimburse the Sequencer + +- **Data unit count**: + + - The total number of recent data units processed + + - Increases with each transaction's estimated data units + +- **Current parent chain data unit price**: + + - The adaptive fee per data unit expressed in `wei` + +### Algorithm for price adjustment + +When the Sequencer posts a batch to the parent chain inbox: + +1. **Batch posting report generation**: + + - The parent chain inbox inserts a "batch posting report" transaction into the chain's Delayed Inbox + + - After a delay, this report gets processed by ArbOS's pricer module + +2. **Processing the batch posting report**: + + - **Compute batch cost**: + + - ArbOS calculates the actual cost of posting the batch by: + + - Retrieving the batch data from the inbox state + + - Counting zero and non-zero bytes to determine parent chain gas usage + + - The cost is added to the amount owed to the Sequencer + + - **Update data units**: + + - Calculate the data units assigned to this update $(U_{\text{upd}})$ + + $$ + U_{\text{upd}} = U \times \frac{T_{\text{upd}} - T_{\text{prev}}}{T - T_{\text{prev}}} + $$ + + - $U$: Total recent data units + + - $T$: Current time + + - $T_{\text{upd}}$: Time when the update occurred + + - $T_{\text{prev}}$: Time of the previous update + + - Subtract $U_{\text{upd}}$ from the total $U$ + + - **Reimburse the Sequencer**: + + - Pay the Sequencer from the reimbursement fund: + + - The amount paid is the lesser of the amount owed or the fund balance. + + - Deduct the paid amount from both the reimbursement fund and the amount owed + + - **Compute surplus and derivative**: + + - Surplus ($S$): + + $$ + S = \text{Reimbursement Fund Balance} - \text{Amount Owed} + $$ + + - Derivative of surplus ($D$): + + - $D = \frac{S - S_{\text{prev}}}{U_{\text{upd}}}$ + + - $S_{\text{prev}}$: Surplus at the previous update + + - **Compute derivative goal($D'$)**: + + - Establish a target derivative to eliminate surplus over time: + + - $D' = -\frac{S}{E}$ + + - $E$: Equilibration constant (time horizon for balancing surplus). + + - **Adjust price ($\Delta P)$)**: + + - Calculate the change in the data unit price: + + - $\Delta P = \frac{(D' - D) \times U_{\text{upd}}}{\alpha + U_{\text{upd}}}$ + + - $\alpha$: Smoothing parameter to prevent abrupt changes + + - Update the price: + + - $P = \max(0, P_{\text{prev}} + \Delta P)$ + + - **Outcome**: + + - The adaptive algorithm adjusts the parent chain-data unit price to align collected fees with actual costs. + + - Ensures that the Sequencer gets fairly reimbursed while avoiding surpluses or deficits. + +### Additional Considerations + +- **Per-unit rewards**: + + - An optional per-unit reward can be included and payable to a designated address. + + - Useful for covering additional expenses such as infrastructure or operations. + +- **Recompression scenarios**: + + - Recompression of existing batch segments may occur if: + + - The batch exceeds the maximum size limits + + - The batch hasn't been properly closed + +- **Compression levels**: + + - Dynamic adjustments of compression levels based on backlog size ($B$): + + - **Compression level ($CL$)**: + + - For $B \leq 20$ + + - $CL = \min(6, UC)$ + + - For $20 < B < 60$ + + - $CL = UC$ + + - For $B > 60$ + + - $CL = \min(4, UC)$ + + - **Recompression level ($RL$)**: + + - For $B < 40$: + + - $RL = UC$ + + - For $B \geq 40$: + + - $RL = \min(6, UC)$ + + - $UC$: User-configured compression level + +## Retrieving parent chain fee information + +Users and developers can access parent chain fee-related data through the following methods: + +- Parent chain gas base fee estimate: + + - **Method**: `ArbGasInfo.getL1BaseFeeEstimate()` + + - **Purpose**: Retrieves the current estimated parent–gas base fee for calculating transaction costs. + +- Estimating transaction parent chain fees: + + - **Methods**: + + - `NodeInterface.gasEstimateComponents()` + + - `NodeInterface.gasEstimateL1Component()` + + - **Purpose**: Provides an estimate of the parent chain gas a transaction will consume. + +- Transaction receipts: + + - **Field**: `gasUsedForL1` + + - **Description**: Indicates the child chain gas used to cover parent chain costs. diff --git a/sidebars.js b/sidebars.js index 54d2b81de3..091f647d93 100644 --- a/sidebars.js +++ b/sidebars.js @@ -775,6 +775,11 @@ const sidebars = { label: 'Geth', id: 'how-arbitrum-works/deep-dives/geth', }, + { + type: 'doc', + label: 'Parent chain pricing', + id: 'how-arbitrum-works/deep-dives/parent-chain-pricing', + }, { type: 'doc', label: 'Sequencer', From 455d02b4136cab4ae3f16ec5a1ec473550164813 Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 4 Nov 2025 09:28:41 -0500 Subject: [PATCH 72/75] update arbos --- docs/how-arbitrum-works/deep-dives/arbos.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index 3e4399b8e4..f52e208159 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -9,23 +9,23 @@ content_type: get-started ArbOS is the child chain EVM hypervisor that provides the execution environment for the Arbitrum chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: -### Managing network resources +### 1. Managing network resources -It allocates and tracks resources necessary for executing transcations on the child chain. +It allocates and tracks resources necessary for executing transactions on the child chain. -### Block production +### 2. Block production ArbOS processes incoming sequencer data batches to produce child chain blocks, ensuring the state is updated correctly. -### Cross-chain messaging +### 3. Cross-chain messaging It facilitates communication between the parent and child chains, supporting functionalities like Ether and token deposits and withdrawals. -### Enhanced EVM execution +### 4. Enhanced EVM execution ArbOS operates its instrumented instance of Geth to execute smart contracts, incorporating additional logic specific to the child chain environment. -### Stylus-specific tasks in ArbOS +### 5. Stylus-specific tasks in ArbOS ArbOS manages host I/O calls, memory operations, and execution context for Stylus transactions, ensuring efficient and deterministic processing with the WASM runtime. From 9f63aea123b171ef0a9f1b8db5070343f74e624b Mon Sep 17 00:00:00 2001 From: GreatSoshiant <61604245+GreatSoshiant@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:09:26 -0500 Subject: [PATCH 73/75] refenrences in inside arb page --- .../01-inside-arbitrum-nitro.mdx | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 393c6a7f80..2c0b581926 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -31,7 +31,7 @@ Before delving into the journey of a transaction, it is important to outline the Transactions first enter through the Inbox, serving as the primary gateway into the ecosystem. From there, the State Transition Function (STF) processes them in a deterministic fashion, applying rules that guarantee reproducibility. Finally, the Outputs component generates the resulting data and state updates, completing the cycle. -This deterministic model means that identical inputs always produce the same outputs among honest nodes, forming the bedrock of Arbitrum's security. It supports efficient fraud proofs and dispute resolution, allowing verification of execution correctness without the need to rerun entire transactions, thereby minimizing computational overhead. +This deterministic model means that identical inputs always produce the same outputs among honest nodes, forming the bedrock of Arbitrum's security. It supports efficient fraud proofs and dispute resolution, allowing verification of execution correctness without the need to rerun entire transactions, thereby minimizing computational overhead. For foundational concepts about the STF, see the [State Transition Function gentle introduction](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx). ### Step 1: Submitting a Transaction @@ -41,7 +41,7 @@ Alternatively, to counter risks of exclusion or delay by the Sequencer, users ca ### Step 2: Ordering and Broadcasting: The Sequencer -Once a transaction reaches the Sequencer, it integrates into a refined system for ordering and broadcasting, designed to maximize performance while upholding security. The Sequencer immediately shares the transaction through its real-time feed, offering instant network-wide visibility. This feed delivers immediate confirmation of acceptance and sequencing, keeps all nodes synchronized with the latest order, and enables soft finality, allowing users to proceed confidently based on the Sequencer's reliable commitment. +Once a transaction reaches the Sequencer, it integrates into a refined system for ordering and broadcasting, designed to maximize performance while upholding security. The Sequencer immediately shares the transaction through its real-time feed, offering instant network-wide visibility. This feed delivers immediate confirmation of acceptance and sequencing, keeps all nodes synchronized with the latest order, and enables soft finality, allowing users to proceed confidently based on the Sequencer's reliable commitment. For comprehensive details on the Sequencer's operations, including sequencing, batching, compression, and censorship resistance, see the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx). To further optimize, the Sequencer groups transactions into batches rather than processing them individually, which cuts costs and boosts efficiency. Batches form when transactions accumulate to a predefined size or after a set time interval to prevent lags. The data then undergoes compression via the Brotli algorithm, with levels dynamically adjusted from 0 to 11 based on congestion. Higher compression reduces Layer 1 posting expenses at the cost of more computation, while the system shifts toward speed during heavy backlogs. @@ -49,11 +49,11 @@ After batching and compression, the data posts to Ethereum through the Sequencer 1. The default, blob transactions under [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), provide cost-effective and scalable data inclusion when supported by Ethereum. -2. As a fallback, calldata transactions embed data directly, ensuring compatibility even if blob fees rise or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) is unavailable. This process yields 10-100x cost savings over individual postings and adapts to network conditions for consistent efficiency. For deeper insights into the Sequencer's internals, refer to the [Sequencer deep-dive documentation](/how-arbitrum-works/deep-dives/sequencer.mdx). +2. As a fallback, calldata transactions embed data directly, ensuring compatibility even if blob fees rise or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) is unavailable. This process yields 10-100x cost savings over individual postings and adapts to network conditions for consistent efficiency. For details on how parent chain costs are calculated and priced, including the adaptive pricing algorithm, see the [Parent chain pricing deep dive](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). ### Step 3: Execution Phase: State Transition Function -With ordering and batching complete, execution shifts to the State Transition Function (STF), the core of Arbitrum's processing engine. Arbitrum ensures full Ethereum Virtual Machine (EVM) compatibility via a three-layer architecture. At the base, the Geth core handles EVM execution, aligning behaviors with Ethereum and drawing on its extensively tested code for security. For more technical details about Geth, refer to the [Geth deep dive documentation](/how-arbitrum-works/deep-dives/geth.mdx). +With ordering and batching complete, execution shifts to the State Transition Function (STF), the core of Arbitrum's processing engine. For foundational concepts about how the STF works, see the [State Transition Function gentle introduction](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx). Arbitrum ensures full Ethereum Virtual Machine (EVM) compatibility via a three-layer architecture. At the base, the Geth core handles EVM execution, aligning behaviors with Ethereum and drawing on its extensively tested code for security. For more technical details about Geth, refer to the [Geth deep dive documentation](/how-arbitrum-works/deep-dives/geth.mdx). Above this, ArbOS—the Arbitrum Operating System—adds Layer 2 features like cross-chain messaging, fee management, gas pricing, handling of deposits and withdrawals, and advanced tools such as Stylus. The top layer, the node interface, manages RPC connections and APIs, providing Ethereum-like functionality for clients. @@ -69,7 +69,7 @@ At this stage, the transaction achieves two complementary levels of finality, ea 1. Soft finality emerges immediately upon the inclusion of the Sequencer feed, offering instant acceptance feedback, a commitment to order, and the ability to act without wait times—as noted in the submission phase. This soft finality" relies on the Sequencer's trustworthiness for usability but lacks cryptographic backing. -2. Hard finality, conversely, solidifies when the batch posts and confirms on Ethereum, inheriting its consensus security, ensuring public data availability, and making the transaction irreversible. This process typically spans 10-20 minutes, varying with Ethereum block times and batch frequency. +2. Hard finality, conversely, solidifies when the batch posts and confirms on Ethereum, inheriting its consensus security, ensuring public data availability, and making the transaction irreversible. This process typically spans 10-20 minutes, varying with Ethereum block times and batch frequency. Hard finality depends on rollup assertions being confirmed on Ethereum; for more on how assertions work, see the [Assertions deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). The dual model combines rapid soft finality for seamless experiences with Ethereum-level safeguards for hard finality, along with censorship-resistant paths for assured inclusion. This balance delivers quick feedback alongside strong protections, ideal for high-stakes transactions. @@ -77,28 +77,55 @@ The dual model combines rapid soft finality for seamless experiences with Ethere Following execution, Arbitrum verifies correctness through its validation and dispute systems. Central to this is the BoLD (Bounded Liquidity Delay) protocol, an advanced dispute framework enabling permissionless validation. Unlike conventional optimistic rollups, BoLD permits any participant to validate without approval, while ensuring dispute resolution within bounded timeframes to prevent indefinite delays. -BoLD facilitates a challenge-based defense where honest parties can protect the chain's state against malice. Disputants narrow conflicts to a single execution step via supporting claims, culminating in a one-step proof (OSP) that Ethereum verifies as an impartial arbiter to determine the outcome. While BoLD's intricacies—such as its multi-round challenge games and economic incentives—are extensive, they enhance decentralization and resilience. For more, see the [BoLD Gentle Introduction](/how-arbitrum-works/bold/gentle-introduction.mdx) and [Economics of Disputes documentation](/how-arbitrum-works/bold/bold-economics-of-disputes.mdx). +BoLD facilitates a challenge-based defense where honest parties can protect the chain's state against malice. Disputants narrow conflicts to a single execution step via supporting claims, culminating in a one-step proof (OSP) that Ethereum verifies as an impartial arbiter to determine the outcome. While BoLD's intricacies—such as its multi-round challenge games and economic incentives—are extensive, they enhance decentralization and resilience. Validation occurs through assertions submitted to the Rollup contract; for details on how assertions structure validation and disputes, see the [Assertions deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). For an introduction to BoLD, see the [BoLD Gentle Introduction](/how-arbitrum-works/bold/gentle-introduction.mdx); for technical implementation details, see the [BoLD Technical Deep Dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx); and for economic considerations, see the [Economics of Disputes documentation](/how-arbitrum-works/bold/bold-economics-of-disputes.mdx). ### Step 6: Bridging: Cross-Chain Communication Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For Parent-to-Child messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [Parent-to-Child messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. -Parent-to-Child transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. See the [Child-to-Parent messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details. +Parent-to-Child transfers from Arbitrum to Ethereum begin with message creation via [`ArbSys.sendTxToL1()`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys), followed by inclusion in a rollup assertion, a 6.4-day challenge period, and manual Layer 1 execution by any party. Messages validate through Merkle proofs, persist indefinitely until executed, and require manual triggering due to Ethereum's constraints. For details on how rollup assertions work and their role in finality, see the [Assertions deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). See the [Child-to-Parent messaging deep dive](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) documentation for more details on the messaging process. The canonical bridge architecture comprises asset contracts on both chains, gateway pairs for specific logic, and routers to direct flows. Its security locks tokens on one layer while minting equivalents on the other, with a seven-day challenge period guarding withdrawals. This setup fosters seamless, unified interactions while safeguarding each chain's integrity. ### Step 7: The Economics of Execution: Gas and Fees -Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates child chain gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from Parent chain calldata fees. Parent chain calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. +Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates child chain gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from Parent chain calldata fees. Parent chain calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. For comprehensive details on how parent chain pricing works, including the adaptive pricing algorithm and cost apportionment, see the [Parent chain pricing deep dive](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). For a complete breakdown of how fees are calculated and collected, including both parent and child chain components, refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). A gas speed limit protects infrastructure by capping throughput at 7,000,000 gas per second for Arbitrum One and Nova. Exceeding this triggers [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) fee escalations to prevent node overloads and maintain liveness. This limit prioritizes high-value transactions during peaks while deterring spam, ensuring that validators and the Sequencer stay operational for optimal performance, even though parent contracts handle ultimate security. -Fee calculation during execution involves assessing child chain gas via EVM standards, estimating parent chain batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. Refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) for more. +Fee calculation during execution involves assessing child chain gas via EVM standards, estimating parent chain batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. ### Step 8: Advanced Features Arbitrum extends beyond standard Layer 2 capabilities with features like Stylus, which supports smart contracts in languages such as Rust, C, and C++ via WASM. It offers 10-70x faster execution and 100-500x better memory efficiency than the EVM, with full interoperability for cross-calls. Stylus runs in a co-located WASM VM using host I/O for state access—details in the [Stylus Gentle Intro](/stylus/gentle-introduction.mdx). -Timeboost refines ordering to capture MEV for chain operators, protect users from attacks like front-running, reduce spam-related congestion, and allow customizable policies. See the [Timeboost Gentle Introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx) for insights. +Timeboost refines ordering to capture MEV for chain operators, protect users from attacks like front-running, reduce spam-related congestion, and allow customizable policies. Timeboost preserves fast block times (250ms default) while enabling MEV capture and user protection. For an introduction to Timeboost, see the [Timeboost Gentle Introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx); for implementation details and usage instructions, see the [How to Use Timeboost](/how-arbitrum-works/timeboost/how-to-use-timeboost.mdx) documentation; and for troubleshooting guidance, see the [Timeboost Troubleshooting](/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx) and [FAQ](/how-arbitrum-works/timeboost/timeboost-faq.mdx) pages. AnyTrust provides cost-optimized data availability with a mild trust model, relying on a Data Availability Committee (DAC) of `N` members, where at least two are assumed honest. It uses BLS-signed Data Availability Certificates (DACerts) and falls back to Layer 1 posting if needed. Keysets define member keys and thresholds; DACerts include hashes, expirations, and signatures; and servers support various storage, such as local files or Amazon S3. The Sequencer sends batches to the committee, gathers signatures for DACerts, and posts them to Layer 1, defaulting to full data if the required signatures are not present. Ideal for low-cost apps like gaming, as in Arbitrum Nova—explore the [AnyTrust protocol documentation](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). + +### Related Topics + +This overview covers the complete transaction journey through Arbitrum Nitro. For deeper exploration of specific topics, refer to the following resources: + +#### Deep Dives + +- [Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx) - Detailed transaction lifecycle from submission to finality +- [Sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx) - How the Sequencer orders, batches, and posts transactions +- [Parent Chain Pricing](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx) - Adaptive pricing algorithm for parent chain costs +- [State Transition Function: Gentle Introduction](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx) - Foundational concepts of the STF +- [Geth](/how-arbitrum-works/deep-dives/geth.mdx) - Geth core and EVM compatibility +- [ArbOS](/how-arbitrum-works/deep-dives/arbos.mdx) - Arbitrum Operating System features and capabilities +- [State Transition Function Inputs](/how-arbitrum-works/deep-dives/stf-inputs.mdx) - Message types and STF processing mechanics +- [Assertions](/how-arbitrum-works/deep-dives/assertions.mdx) - Rollup assertions and validation structure +- [Parent-to-Child Messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) - L1 to L2 messaging and bridging +- [Child-to-Parent Messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) - L2 to L1 messaging and withdrawals +- [Gas and Fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) - Fee calculation and gas pricing models +- [AnyTrust Protocol](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) - Data availability committee and cost optimization + +#### BoLD (Bounded Liquidity Delay) + +- [BoLD: Gentle Introduction](/how-arbitrum-works/bold/gentle-introduction.mdx) - Overview of permissionless validation + +#### Timeboost + +- [Timeboost: Gentle Introduction](/how-arbitrum-works/timeboost/gentle-introduction.mdx) - MEV capture and transaction ordering From 3eb49cebfd5f706da23635940e6f61214ff4deb1 Mon Sep 17 00:00:00 2001 From: Pete Date: Tue, 4 Nov 2025 11:59:22 -0600 Subject: [PATCH 74/75] Minor styling and grammar for readability --- .../01-inside-arbitrum-nitro.mdx | 22 ++--- .../bold/gentle-introduction.mdx | 90 +++++++++---------- .../deep-dives/01-stf-gentle-intro.mdx | 6 +- docs/how-arbitrum-works/deep-dives/arbos.mdx | 48 +++++----- .../deep-dives/assertions.mdx | 14 +-- .../deep-dives/stf-inputs.mdx | 2 +- .../deep-dives/transaction-lifecycle.mdx | 4 +- docs/stylus/concepts/how-it-works.md | 2 +- 8 files changed, 94 insertions(+), 94 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 2c0b581926..3859e61622 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,7 +9,7 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -### Transaction Processing Journey on Arbitrum +### Transaction processing journey on Arbitrum As a developer initiating a transaction on Arbitrum, gaining a clear understanding of the end-to-end flow—from initial submission through to finality—is helpful, but it is not required. @@ -19,7 +19,7 @@ This overview methodically traces the transaction lifecycle, emphasizing how Arb Along the way, we will highlight Arbitrum's ability to deliver security on par with Ethereum, while achieving fee reductions by a factor of ten and transaction speeds accelerated by a factor of 100 through optimized scaling techniques. -### The Foundation: Arbitrum's Core Architecture Overview +### The Foundation: Arbitrum's core architecture overview Before delving into the journey of a transaction, it is important to outline the foundational architecture that powers Arbitrum's operations. Central to the architecture is a simple yet powerful principle: deterministic state transitions, which ensure consistent outcomes across the network. The system revolves around three core components. @@ -33,13 +33,13 @@ From there, the State Transition Function (STF) processes them in a deterministi Finally, the Outputs component generates the resulting data and state updates, completing the cycle. This deterministic model means that identical inputs always produce the same outputs among honest nodes, forming the bedrock of Arbitrum's security. It supports efficient fraud proofs and dispute resolution, allowing verification of execution correctness without the need to rerun entire transactions, thereby minimizing computational overhead. For foundational concepts about the STF, see the [State Transition Function gentle introduction](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx). -### Step 1: Submitting a Transaction +### Step 1: Submitting a transaction The submission process for a transaction on Arbitrum starts with the user sending the request, with options tailored to balance factors like speed, control, and reliability according to specific needs. Most transactions route through the Sequencer, a specialized node that orders them and issues quick confirmations. This path accommodates various submission methods, including public RPC for development and light usage, third-party RPC for improved throughput, direct Sequencer endpoints for minimal latency in critical operations, and self-hosted Arbitrum nodes for ultimate privacy and customization. Alternatively, to counter risks of exclusion or delay by the Sequencer, users can submit directly to the Delayed Inbox contract on Ethereum, bolstering system resilience. In this mechanism, non-Sequencer transactions enter a dedicated queue, where a well-functioning Sequencer typically integrates them within about ten minutes. If delayed beyond 24 hours, any network participant can force inclusion into the main inbox, limiting the Sequencer's influence to temporary delays rather than permanent blocks. While the Sequencer route offers faster soft finality and streamlined workflows, the Delayed Inbox path doubles processing time but emphasizes censorship resistance. Overall, the Sequencer's commitment to ordered inclusion provides "soft finality" for a responsive experience, complemented by these alternatives for robust, flexible operations across applications. For more technical detail about the transaction lifecycle, refer to the [Transaction Lifecycle deep dive](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx). -### Step 2: Ordering and Broadcasting: The Sequencer +### Step 2: Ordering and broadcasting: The Sequencer Once a transaction reaches the Sequencer, it integrates into a refined system for ordering and broadcasting, designed to maximize performance while upholding security. The Sequencer immediately shares the transaction through its real-time feed, offering instant network-wide visibility. This feed delivers immediate confirmation of acceptance and sequencing, keeps all nodes synchronized with the latest order, and enables soft finality, allowing users to proceed confidently based on the Sequencer's reliable commitment. For comprehensive details on the Sequencer's operations, including sequencing, batching, compression, and censorship resistance, see the [Sequencer deep dive](/how-arbitrum-works/deep-dives/sequencer.mdx). @@ -51,7 +51,7 @@ After batching and compression, the data posts to Ethereum through the Sequencer 2. As a fallback, calldata transactions embed data directly, ensuring compatibility even if blob fees rise or [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) is unavailable. This process yields 10-100x cost savings over individual postings and adapts to network conditions for consistent efficiency. For details on how parent chain costs are calculated and priced, including the adaptive pricing algorithm, see the [Parent chain pricing deep dive](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). -### Step 3: Execution Phase: State Transition Function +### Step 3: Execution phase: State Transition Function With ordering and batching complete, execution shifts to the State Transition Function (STF), the core of Arbitrum's processing engine. For foundational concepts about how the STF works, see the [State Transition Function gentle introduction](/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx). Arbitrum ensures full Ethereum Virtual Machine (EVM) compatibility via a three-layer architecture. At the base, the Geth core handles EVM execution, aligning behaviors with Ethereum and drawing on its extensively tested code for security. For more technical details about Geth, refer to the [Geth deep dive documentation](/how-arbitrum-works/deep-dives/geth.mdx). @@ -73,13 +73,13 @@ At this stage, the transaction achieves two complementary levels of finality, ea The dual model combines rapid soft finality for seamless experiences with Ethereum-level safeguards for hard finality, along with censorship-resistant paths for assured inclusion. This balance delivers quick feedback alongside strong protections, ideal for high-stakes transactions. -### Step 5: Ensuring Correctness: Validation and Dispute Resolution +### Step 5: Ensuring correctness: Validation and dispute resolution Following execution, Arbitrum verifies correctness through its validation and dispute systems. Central to this is the BoLD (Bounded Liquidity Delay) protocol, an advanced dispute framework enabling permissionless validation. Unlike conventional optimistic rollups, BoLD permits any participant to validate without approval, while ensuring dispute resolution within bounded timeframes to prevent indefinite delays. BoLD facilitates a challenge-based defense where honest parties can protect the chain's state against malice. Disputants narrow conflicts to a single execution step via supporting claims, culminating in a one-step proof (OSP) that Ethereum verifies as an impartial arbiter to determine the outcome. While BoLD's intricacies—such as its multi-round challenge games and economic incentives—are extensive, they enhance decentralization and resilience. Validation occurs through assertions submitted to the Rollup contract; for details on how assertions structure validation and disputes, see the [Assertions deep dive](/how-arbitrum-works/deep-dives/assertions.mdx). For an introduction to BoLD, see the [BoLD Gentle Introduction](/how-arbitrum-works/bold/gentle-introduction.mdx); for technical implementation details, see the [BoLD Technical Deep Dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx); and for economic considerations, see the [Economics of Disputes documentation](/how-arbitrum-works/bold/bold-economics-of-disputes.mdx). -### Step 6: Bridging: Cross-Chain Communication +### Step 6: Bridging: Cross-chain communication Many transactions involve asset or data transfers between Ethereum and Arbitrum, managed through secure bridging protocols. For Parent-to-Child messaging from Ethereum to Arbitrum, options include native token bridging for direct `ETH` deposits, `ERC-20` transfers via the canonical bridge, or support for custom gas tokens. Retryable tickets enable atomic operations with guaranteed retries if execution fails, featuring predictable gas costs and a one-week validity period redeemable by anyone. Direct messaging handles signed EOA messages with verification or unsigned contract messages using address aliasing for security. See the [Parent-to-Child messaging deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) for details. @@ -87,7 +87,7 @@ Parent-to-Child transfers from Arbitrum to Ethereum begin with message creation The canonical bridge architecture comprises asset contracts on both chains, gateway pairs for specific logic, and routers to direct flows. Its security locks tokens on one layer while minting equivalents on the other, with a seven-day challenge period guarding withdrawals. This setup fosters seamless, unified interactions while safeguarding each chain's integrity. -### Step 7: The Economics of Execution: Gas and Fees +### Step 7: The Economics of execution: Gas and fees Fees accumulate across the transaction lifecycle to fund processing and security. Arbitrum's dual-fee model separates child chain gas fees, which cover EVM computation and storage with [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)-style dynamic pricing targeting 7,000,000 gas per second on Arbitrum One, adjusting for congestion, from Parent chain calldata fees. Parent chain calldata fees account for Ethereum data posting based on compressed batch contributions and apply only to Sequencer submissions. For comprehensive details on how parent chain pricing works, including the adaptive pricing algorithm and cost apportionment, see the [Parent chain pricing deep dive](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). For a complete breakdown of how fees are calculated and collected, including both parent and child chain components, refer to the [Gas and fees deep dive](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). @@ -95,7 +95,7 @@ A gas speed limit protects infrastructure by capping throughput at 7,000,000 gas Fee calculation during execution involves assessing child chain gas via EVM standards, estimating parent chain batch impact, applying current pricing, and collecting `ETH` totals. This model covers all costs effectively, with the speed limit reinforcing security by keeping validation in sync. -### Step 8: Advanced Features +### Step 8: Advanced features Arbitrum extends beyond standard Layer 2 capabilities with features like Stylus, which supports smart contracts in languages such as Rust, C, and C++ via WASM. It offers 10-70x faster execution and 100-500x better memory efficiency than the EVM, with full interoperability for cross-calls. Stylus runs in a co-located WASM VM using host I/O for state access—details in the [Stylus Gentle Intro](/stylus/gentle-introduction.mdx). @@ -103,11 +103,11 @@ Timeboost refines ordering to capture MEV for chain operators, protect users fro AnyTrust provides cost-optimized data availability with a mild trust model, relying on a Data Availability Committee (DAC) of `N` members, where at least two are assumed honest. It uses BLS-signed Data Availability Certificates (DACerts) and falls back to Layer 1 posting if needed. Keysets define member keys and thresholds; DACerts include hashes, expirations, and signatures; and servers support various storage, such as local files or Amazon S3. The Sequencer sends batches to the committee, gathers signatures for DACerts, and posts them to Layer 1, defaulting to full data if the required signatures are not present. Ideal for low-cost apps like gaming, as in Arbitrum Nova—explore the [AnyTrust protocol documentation](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). -### Related Topics +### Related topics This overview covers the complete transaction journey through Arbitrum Nitro. For deeper exploration of specific topics, refer to the following resources: -#### Deep Dives +#### Deep dives - [Transaction Lifecycle](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx) - Detailed transaction lifecycle from submission to finality - [Sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx) - How the Sequencer orders, batches, and posts transactions diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index 93a8d20c81..9b734ef89b 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -24,27 +24,27 @@ Under BoLD, a bonded validator's responsibilities are to: - Open challenges to dispute invalid claims made by other validators, and - Confirm valid claims by participating in and winning challenges -BoLD unlocks permissionless validation, ensuring that disputes are resolved within a fixed period (currently equivalent to two challenge periods, plus a two-day grace period for the Security Council to intervene if necessary, and a small delta for computation), effectively removing the risk of delay attacks and making withdrawals to a parent chain more secure. BoLD accomplished this by introducing a new dispute system that allows any single entity to defend Arbitrum against malicious parties—effectively enabling anyone to validate, propose, and defend Arbitrum's chain state without needing permission to do so. +BoLD unlocks permissionless validation, ensuring that disputes are resolved within a fixed period (currently equivalent to two challenge periods, plus a two-day grace period for the Security Council to intervene if necessary, and a small delta for computation), effectively removing the risk of delay attacks and making withdrawals to a parent chain more secure. BoLD accomplished this by introducing a new dispute system that allows any single entity to defend Arbitrum against malicious parties—effectively enabling anyone to validate, propose, and defend Arbitrum's chain state without permission. ## Why did Arbitrum need a new dispute protocol? -In the past, working fraud proofs were limited to allowlisted validators, who could assert the state of the chain. BoLD further decentralizes the protocol by allowing **anyone** to challenge and win disputes, all within a fixed time period. Arbitrum chains will continue to use an interactive proving game between validators and fraud proofs for security, but with the added benefit of this game being completely permissionless and time-bounded to the same length as one challenge period (6.4 days by default). +In the past, working fraud proofs were limited to allowlisted validators, who could assert the state of the chain. BoLD further decentralizes the protocol by allowing **anyone** to challenge and win disputes, all within a fixed time period. Arbitrum chains will continue to use an interactive proving game between validators and fraud proofs for security, with the added benefit that it is completely permissionless and time-bounded to the same length as a single challenge period (6.4 days by default). BoLD can uniquely offer time-bound, permissionless validation because a correct state assertion isn't tied to the validator that bonds their capital to a claim. This feature, coupled with the fact that the child chain states are entirely deterministic, can be proven on Ethereum, meaning that any number of honest parties can rely on BoLD to prove that their claim is correct. Lastly, BoLD does not change the fact that only a single honest party is required to defend Arbitrum. ### BoLD enables Arbitrum to become a Stage 2 rollup -Inspired by [Vitalik’s proposed milestones](https://ethereum-magicians.org/t/proposed-milestones-for-rollups-taking-off-training-wheels/11571), the team over at L2BEAT has assembled a widely recognized framework for evaluating the development of Ethereum Rollups. Both Vitalik and the [L2BEAT framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe) refer to the final stage of Rollup development as "**Stage 2 - No Training Wheels**”. A critical criterion for being considered a Stage 2 Rollup is the ability to allow anyone to validate the child chain state and post fraud proofs to Ethereum without restrictions. This step is a key requirement for Stage 2 because it ensures [“that the system is not controlled by a limited set of entities and instead is subject to the collective scrutiny of the entire community”](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). +Inspired by [Vitalik’s proposed milestones](https://ethereum-magicians.org/t/proposed-milestones-for-rollups-taking-off-training-wheels/11571), the team over at L2BEAT has assembled a widely recognized framework for evaluating the development of Ethereum Rollups. Both Vitalik and the [L2BEAT framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe) refer to the final stage of Rollup development as "**Stage 2 - No Training Wheels**”. A critical criterion for being considered a Stage 2 Rollup is the ability to allow anyone to validate the child chain state and post fraud proofs to Ethereum without restrictions. This step is a key requirement for Stage 2 because it ensures [“that a limited set of entities does not control the system and instead is subject to the collective scrutiny of the entire community”](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). -BoLD enabled permissionless validation by allowing anyone to challenge incorrect Arbitrum state assertions, which unlocks new avenues for participation in securing the network, fostering greater inclusivity and resilience. BoLD achieves this by guaranteeing that a single, honest entity, whose capital is bonded to the correct Arbitrum state assertion, will always prevail against malicious adversaries. +BoLD enabled permissionless validation by allowing anyone to challenge incorrect Arbitrum state assertions, unlocking new avenues for participation in securing the network and fostering greater inclusivity and resilience. BoLD achieves this by guaranteeing that a single, honest entity, whose capital is bonded to the correct Arbitrum state assertion, will always prevail against malicious adversaries. -With BoLD at its core, Arbitrum charts a course towards being recognized as a Stage 2 Rollup by addressing the currently yellow (above) State Validation wedge in [L2BEAT's risk analysis pie chart](https://l2beat.com/scaling/summary). BoLD contributes to a more permissionless, efficient, and robust rollup ecosystem. +With BoLD at its core, Arbitrum charts a course toward Stage 2 Rollup recognition by addressing the currently yellow (above) State Validation wedge in [L2BEAT's risk analysis pie chart](https://l2beat.com/scaling/summary). BoLD contributes to a more permissionless, efficient, and robust rollup ecosystem. ### BoLD makes withdrawals safer to the parent chain -In the past, there was a period following a state assertion, known as the “challenge period,” during which any validator could open a dispute over the validity of a given child chain state root. If no disputes occurred during the challenge period, the protocol would confirm the state root and consider it to be valid. +In the past, there was a period following a state assertion, known as the “challenge period,” during which any validator could open a dispute over the validity of a given child chain state root. If no disputes occurred during the challenge period, the protocol would confirm the state root as valid. This challenge period is why you must wait ~1 week (6.4 days) to withdraw assets from Arbitrum One. While this design uses working fraud proofs for security, it is susceptible to [delay attacks](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a), where malicious actors continuously open disputes to extend that challenge period for as long as they’re willing to sacrifice bonds—effectively extending the challenge period indefinitely by an amount equal to the time it takes to resolve each dispute, one by one. This risk is not ideal nor safe, and is why validation for Arbitrum One and Nova was limited to a permissioned set of entities overseen by the Arbitrum DAO. @@ -62,7 +62,7 @@ BoLD addresses these challenges head-on by introducing a time limit on the exist 3. BoLD’s design allows for challenges between the honest party and any number of malicious adversaries to happen in parallel, and 4. The use of a time limit that will automatically confirm the honest party’s claims if the challenger fails to respond. -To summarize with an analogy and the diagram below: Arbitrum’s former dispute protocol assumed that any assertion that gets challenged must be defended against each unique challenger sequentially, like in a “_1v1 tournament_”. BoLD, on the other hand, enabled any single honest party to defend the correct state and guarantee a win, similar to an “_all-vs-all battle royale_” where there must and will always be a single winner in the end. +To summarize with an analogy and the diagram below: Arbitrum’s former dispute protocol assumed that any assertion that gets challenged must be defended against each unique challenger sequentially, like in a “_1v1 tournament_”. BoLD, on the other hand, enabled any single honest party to defend the correct state and guarantee a win, similar to an “_all-vs-all battle royale_” in which there must and will always be a single winner. trustless bonding pools that allow any group of participants to pool their funds together to challenge a dishonest proposer, and win. That is, any group of entities can pool funds into a simple contract that will post an assertion to Ethereum without needing to trust each other. Upon observation of an invalid assertion, validators have one challenge period (~6.4 days) to pool funds in the contract and respond with a counter assertion. Making it easy to pool the funds to participate in the defense of the Arbitrum trustlessly improves decentralization and the safety of BoLD. +BoLD ships with trustless bonding pools that allow any group of participants to pool their funds together to challenge a dishonest proposer, and win. That is, any group of entities can pool funds into a simple contract that will post an assertion to Ethereum without needing to trust each other. Upon observing an invalid assertion, validators have a challenge period (~6.4 days) to pool funds in the contract and respond with a counterassertion. Making it easy to pool the funds to participate in the defense of the Arbitrum trustlessly improves decentralization and the safety of BoLD. #### Q: Does the bond requirement only mean that whales can validate Arbitrum One? -Validating Arbitrum One is **free and accessible**. All Arbitrum One nodes, by default, are watchtower validators, meaning they can detect and report invalid assertions posted to Ethereum. +Validating Arbitrum One is **free and accessible**. By default, all Arbitrum One nodes are watchtower validators, meaning they can detect and report invalid assertions posted to Ethereum. -However, becoming an assertion proposer requires a bond, as without it, anyone could delay all Arbitrum bridged assets by one week. However, BoLD allows anyone to propose assertions and also challenge invalid assertions via pool contracts, helping keep proposers accountable for their actions. +However, becoming an assertion proposer requires a bond, as without it, anyone could delay all Arbitrum-bridged assets by one week. However, BoLD allows anyone to propose assertions and also challenge invalid assertions via pool contracts, helping keep proposers accountable for their actions. #### Q: How does BoLD disincentivize malicious actors from attacking an Arbitrum chain? -Honest, bonded parties will always be refunded, while malicious actors always stand to lose 100% of their bond. Malicious actors stand to lose everything at each challenge. The BoLD delay is bounded, and additional challenges would not increase the delay of a particular assertion. +Honest parties will always be refunded, while malicious actors will always stand to lose 100% of their bond. Malicious actors stand to lose everything at each challenge. The BoLD delay is bounded, and additional challenges would not increase the delay of a particular assertion. #### Q: In the event of a challenge, what happens to the confiscated funds from malicious actors for Arbitrum One? -Recall that BoLD enables any validator to put up a bond to propose assertions about the child chain state. These assertions about the child chain state are deterministic, and so an honest party who puts up a bond on the correct assertion will always win in disputes. In these scenarios, the honest party will eventually have their bonds reimbursed while the malicious actor will lose all of their funds. +Recall that BoLD enables any validator to put up a bond to propose assertions about the child chain state. These assertions about the child chain state are deterministic, so an honest party who posts a bond on the correct assertion will always win in disputes. In these scenarios, the honest party will eventually have their bonds reimbursed while the malicious actor will lose all of their funds. -In BoLD, all costs spent by malicious actors are confiscated and sent to the Arbitrum DAO treasury. A small reward, called the Defender's Bounty, of 1% will go to entities who put down challenge bonds in defense of Arbitrum One. For the remaining funds, the Arbitrum DAO will have full discretion over how to utilize the funds confiscated from a malicious actor. Applications include, but is not limited to: +In BoLD, all costs spent by malicious actors are confiscated and sent to the Arbitrum DAO treasury. A small reward, called the Defender's Bounty, of 1% will go to entities who put down challenge bonds in defense of Arbitrum One. For the remaining funds, the Arbitrum DAO will have full discretion over how to use those confiscated from a malicious actor. Applications include, but are not limited to: - Using the confiscated funds to refund the parent chain gas costs to honest parties, - Rewarding or reimbursing the honest parties with some, or all, of the confiscated funds over the 1% Defender's Bounty, @@ -154,23 +154,23 @@ As always, an Arbitrum chain can choose how it wishes to structure and manage co It’s tempting to think that rewarding the honest proposer in a dispute can only make the protocol stronger, but this turns out not to be true, because an adversary can sometimes profit by placing the honest bonds themselves. -This situation creates perverse incentives that threaten the security of BoLD. Here’s an example, from Ed Felten: +This situation creates perverse incentives that threaten BoLD's security. Here’s an example, from Ed Felten:

That said, there’s no harm in paying the honest proposer a fair interest rate on their bond, so they don’t suffer for having helped the protocol by locking up their capital in a bond. -Therefore, the BoLD AIP proposes that honest parties be rewarded with 1% of the confiscated bonds from a dishonest party, in the event of a challenge. This reward applies only to entities that deposit challenge bonds and participate in defending Arbitrum against a challenge. The exact amount rewarded to honest parties will be proportional to the amount the defender deposits into the protocol during a challenge, making bonding pool participants eligible. +Therefore, the BoLD AIP proposes that honest parties be rewarded with 1% of the bonds confiscated from a dishonest party in the event of a challenge. This reward applies only to entities that deposit challenge bonds and participate in defending Arbitrum against a challenge. The exact amount rewarded to honest parties will be proportional to the amount the defender deposits into the protocol during a challenge, making bonding pool participants eligible. #### Q: Why is `ARB` not the bonding token used for BoLD on Arbitrum One? Although BoLD supports using an `ERC-20` token, Ethereum, specifically `WETH`, was chosen over `ARB` for a few reasons: 1. **Arbitrum One and Arbitrum Nova both inherit their security from Ethereum already.** Arbitrum One and Nova rely on Ethereum for both data availability and as the referee for determining winners during fraud-proof disputes. Ethereum’s value is also relatively independent of Arbitrum, especially when compared to `ARB`. -2. Adversaries might be able to exploit the potential instability of `ARB` when trying to win challenges. Suppose an adversary deposits their bond in `ARB`, and can create an impression that they have a nontrivial chance of winning the challenge. This impression might drive down the value of `ARB`, which would decrease the adversary's cost to create more bonds (i.e., more spam) during the challenge, which in turn could increase the adversary's chances of winning (which would drive `ARB` lower, making the attack cheaper still for the adversary, etc.) +2. Adversaries might be able to exploit the potential instability of `ARB` when trying to win challenges. Suppose an adversary deposits their bond in `ARB` and can create an impression that they have a nontrivial chance of winning the challenge. This impression might drive down the value of `ARB`, which would decrease the adversary's cost to create more bonds (i.e., more spam) during the challenge, which in turn could increase the adversary's chances of winning (which would drive `ARB` lower, making the attack cheaper still for the adversary, etc.). 3. **Access to liquidity**: Ethereum has greater liquidity than `ARB`. In the event of an attack on Arbitrum, access and ease of pooling funds may become crucial. 4. **Fraud proofs are submitted to, and arbitrated on, the parent chain (Ethereum).** The bonding of capital to make assertions is done so on the parent chain (Ethereum), since Ethereum is the arbitrator of disputes. If BoLD were to use `ARB` instead of Ethereum, a large amount of `ARB` must be pre-positioned on the parent chain, which is more difficult to do when compared to pre-positioning Ethereum on the parent chain (Ethereum). @@ -178,16 +178,16 @@ An Arbitrum chain owner may choose to use any token they wish for bonding if the #### Q: Can the required token for the validator be set to `ARB`, and can network `ETH` revenues get distributed for validator incentives for Arbitrum One? -Yes. The asset that a validator uses to become a proposer in BoLD is configurable to any `ERC-20` token, including `ARB`. For Arbitrum One, `ETH` is used for bonds for various reasons mentioned above. The Arbitrum DAO can change this asset type at any time via a governance proposal. Should such an economic incentive model exist, the source and denomination of funds used to incentivize validators will be at the discretion of the Arbitrum DAO. Again, though, we don't see `ARB`-based bonding as a good idea at present; see the last question. +Yes. The asset a validator uses to become a proposer in BoLD can be configured to any `ERC-20` token, including `ARB`. For Arbitrum One, `ETH` is used as a bond for various reasons mentioned above. The Arbitrum DAO can change this asset type at any time via a governance proposal. Should such an economic incentive model exist, the source and denomination of funds used to incentivize validators will be at the discretion of the Arbitrum DAO. Again, though, we don't see `ARB`-based bonding as a good idea at present; see the last question. #### Q: How are honest parties reimbursed for bonding their capital to help secure Arbitrum One? The Arbitrum DAO reimburses “active” proposers with a fair interest rate, as a way of removing the disincentive to participate, by reimbursing honest parties who bond their capital and propose assertions for Arbitrum One. The interest rate should be denominated in `ETH` and should be equal to the annualized yield that Ethereum mainnet validators receive, which at the time of writing, is an APR between 3% to 4% (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). This interest is considered a reimbursement because this payment reimburses the honest party for the opportunity cost of locking up their capital and should not be perceived as a “reward” - for the same [reasons why the protocol does not reward honest parties with the funds confiscated from a malicious actor](#q-why-are-honest-parties-not-automatically-rewarded-with-confiscated-funds-from-a-malicious-actor)). These reimbursement payments can be paid out upon an active proposer’s honest assertion being confirmed on Ethereum and will be calculated and handled offchain by the Arbitrum Foundation. -BoLD makes it permissionless for any validator to become a proposer and also introduces a way to pay a service fee to honest parties for locking up capital to do so. Validators are not considered as active proposers until they successfully propose an assertion _with_ a bond. To become an active proposer for Arbitrum One post-BoLD, a validator must propose a child chain state assertion to Ethereum. If they do not have an active bond on the parent chain, they then need to attach a bond to their assertion to post the assertion successfully. Subsequent assertions posted by the same address will move the already-supplied bond to their latest proposed assertion. -Meanwhile, if an entity, say Bob, has posted a successor assertion to one previously made by another entity, Alice, then Bob would be considered by the protocol to be the current active proposer. Alice would no longer be considered as the active proposer by the protocol, and once Alice’s assertion is confirmed, she will receive a refund of her assertion bond. There can only be one “active” proposer at any point in time. +BoLD makes it permissionless for any validator to become a proposer and introduces a way to pay service fees to honest parties for locking up capital to do so. Validators are not considered as active proposers until they successfully propose an assertion _with_ a bond. To become an active proposer for Arbitrum One post-BoLD, a validator must propose a child chain state assertion to Ethereum. If they do not have an active bond on the parent chain, they need to attach a bond to their assertion to post it successfully. Subsequent assertions posted by the same address will move the already-supplied bond to their latest proposed assertion. +Meanwhile, if an entity, say Bob, has posted a successor assertion to one previously made by another entity, Alice, then Bob would be considered the current active proposer by the protocol. Alice will no longer be considered the active proposer by the protocol, and once her assertion is confirmed, she will receive a refund of her assertion bond. There can only be one “active” proposer at any point in time. -The topic of economic and incentive models for BoLD on Arbitrum One is valuable. It deserves the full focus and attention of the community via a separate proposal or discussion, decoupled from this proposal to bring BoLD to mainnet. Details regarding proposed economic or incentive models for BoLD will require continued research and development work. However, deploying BoLD as-is represents a substantial improvement to Arbitrum's security, even without addressing economic-related concerns. The DAO may, through governance, choose to fund other parties or modify this reimbursement model at any time. +The topic of economic and incentive models for BoLD on Arbitrum One is valuable. It deserves the full focus and attention of the community via a separate proposal or discussion, decoupled from this proposal to bring BoLD to mainnet. Details regarding proposed economic or incentive models for BoLD will require ongoing research and development. However, deploying BoLD as-is represents a substantial improvement to Arbitrum's security, even without addressing economic-related concerns. The DAO may, through governance, choose to fund other parties or modify this reimbursement model at any time. For Arbitrum chains, any economic model can be configured alongside BoLD if chain owners decide to adopt BoLD. @@ -195,11 +195,11 @@ For Arbitrum chains, any economic model can be configured alongside BoLD if chai The proposed service fee should correlate to the annualized income that Ethereum mainnet validators receive over the same period. At the time of writing, the estimated annual income for Ethereum mainnet validators is approximately 3% to 4% of their bond (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). -The fee is applied to the total amount bonded over the duration of time that a proposer is active. A validator will need to deposit `ETH` into the contracts on the parent chain to become a proposer. So those deposited funds will indeed be unable to be used for yield in other scenarios. The decision on the source of funds for the yield is entirely up to the ArbitrumDAO to decide. +The fee is applied to the total amount bonded over the duration of a proposer's activity. A validator must deposit `ETH` into the contracts on the parent chain to become a proposer. So those deposited funds will indeed be unable to be used for yield in other scenarios. The decision on the source of funds for the yield is entirely up to the ArbitrumDAO. #### Q: For Arbitrum One, will the offchain computation costs get reimbursed? (i.e., the costs for a validator computing the hashes for a challenge) -Reimbursements will not be made for any offchain computation costs, as we view these to be costs borne by all honest operators, alongside the maintenance and infrastructure costs that regularly arise from running a node. +Reimbursements will not be made for any offchain computation costs, as we view these as costs borne by all honest operators, alongside the maintenance and infrastructure costs that regularly arise from running a node. Our testing has demonstrated that the cost of running a sub-challenge in BoLD, the most computationally-heavy step, on an AWS r5.4xlarge EC2 instance, costs around USD \$2.50 (~\$1 hour for one challenge with 2.5 hour duration) using [on-demand prices for U.S. East (N. Virginia)](https://instances.vantage.sh/aws/ec2/r5.4xlarge). Therefore, the additional costs from offchain compute are assumed to be negligible relative to the regular infra costs of operating a node. @@ -208,16 +208,16 @@ Our testing has demonstrated that the cost of running a sub-challenge in BoLD, t Although this AIP proposes that both Arbitrum One and Nova upgrade to use BoLD, we recommend the removal of the [allowlist of validators for Arbitrum One while keeping Nova permissioned with a DAO-controlled allowlist of entities](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators) - unchanged from today. This decision comes from two reasons: -First, Arbitrum Nova’s TVL is much lower than Arbitrum One’s TVL (~\$17B vs. ~\$46M at the time of writing, from [L2Beat](https://l2beat.com/scaling/summary)). This lower TVL means that the high bond sizes necessary for preventing spam and delay attacks would comprise a significant proportion of Nova’s TVL, which we believe introduces a centralization risk, as very few parties would have an incentive to secure Nova. A solution here would be to lower the bond sizes, -Second, the lower bond sizes reduce the costs of delay griefing attacks (where malicious actors delay the chain’s progress) and therefore hurt the security of the chain. We believe enabling permissionless validation for Nova is not worth the capital requirement tradeoffs, given the unique security model of AnyTrust chains. +First, Arbitrum Nova’s TVL is much lower than Arbitrum One’s TVL (~\$17B vs. ~\$46M at the time of writing, from [L2Beat](https://l2beat.com/scaling/summary)). This lower TVL means that the high bond sizes necessary to prevent spam and delay attacks would comprise a significant share of Nova’s TVL, which we believe introduces a centralization risk, as very few parties would have an incentive to secure Nova. A solution here would be to lower the bond sizes, +Second, the lower bond sizes increase the cost of delaying griefing attacks (where malicious actors delay the chain’s progress) and thereby undermine the chain's security. We believe enabling permissionless validation for Nova is not worth the capital requirement trade-offs, given the unique security model of AnyTrust chains. -Notably, since Arbitrum Nova's security already depends on at least one DAC member providing honest data availability, trusting the same committee to have at least one member provide honest validation does not add a major trust assumption. This trust assumption requires all DAC members also to run validators. If the DAC is also validating the chain, a feature the Offchain Labs team has been working on, Fast Withdrawals, would allow users to withdraw assets from Nova in ~15 minutes, or the time it takes to reach parent chain finality. This finality is made possible by the DAC attesting to and instantly confirming an assertion. Fast Withdrawals will be the subject of a future forum post and snapshot vote. +Notably, since Arbitrum Nova's security already depends on at least one DAC member providing honest data availability, trusting the same committee to have at least one member provide honest validation does not add a major trust assumption. This trust assumption requires all DAC members to run validators as well. If the DAC is also validating the chain, a feature the Offchain Labs team has been working on, Fast Withdrawals, would allow users to withdraw assets from Nova in ~15 minutes, or the time it takes to reach parent chain finality. This finality is made possible by the DAC, which attests to and instantly confirms an assertion. Fast Withdrawals will be the subject of a future forum post and snapshot vote. #### Q: When it comes to viewing the upfront assertion bond (to be a proposer) as the security budget for Arbitrum One, is it possible for an attacker to go above the security budget, and if so, what happens then? -The upfront capital to post assertions (onchain action) is 3,600 `ETH`, with subsequent sub-challenge assertions requiring 555/79 `ETH` (per level) - this applies to both honest proposers and malicious entities. A malicious entity can post multiple invalid top-level assertions and/or open multiple challenges, and the honest entity can +The upfront capital to post assertions (onchain action) is 3,600 `ETH`, with subsequent sub-challenge assertions requiring 555/79 `ETH` (per level). This cost applies to both honest proposers and malicious entities. A malicious entity can post multiple invalid top-level assertions and/or open multiple challenges, and the honest entity can -It is critical to note that Arbitrum state transitions are entirely deterministic. An honest party bonded to the correct state assertion will receive all their costs refunded, while a malicious entity stands to lose everything. Additionally, BoLD’s design ensures that any party bonded to the correct +It is critical to note that Arbitrum state transitions are entirely deterministic. An honest party bonded to the correct state assertion will receive all their costs refunded, while a malicious entity stands to lose everything. Additionally, BoLD’s design ensures that any party bonded to the correct. If a malicious entity wanted to attack Arbitrum, they would need to deposit 3600 `ETH` to propose an invalid state assertion. @@ -235,11 +235,11 @@ If a malicious entity wanted to attack Arbitrum, they would need to deposit 3600 #### Q: How do BoLD-based L3s challenge periods operate, considering the worst-case scenario? -To recap, both Arbitrum’s current dispute protocol and BoLD require assertions to be posted to the parent chain and employ interactive proving, which involves a back-and-forth between two entities until a single step of disagreement is reached. That single disputed step then gets submitted to contracts on the parent chain, which will eventually declare a winner. For L2s, such as Arbitrum One, BoLD must be deployed on a credibly neutral, censorship-resistant backend to ensure a fair resolution of disputes. Ethereum, therefore, is the ideal candidate for deploying the BoLD protocol on L2s. +To recap, both Arbitrum’s current dispute protocol and BoLD require assertions to be posted to the parent chain and employ interactive proving, which involves a back-and-forth between two entities until a single step of disagreement is reached. That single disputed step then gets submitted to contracts on the parent chain, which will eventually declare a winner. For L2s such as Arbitrum One, BoLD must be deployed on a credibly neutral, censorship-resistant backend to ensure fair dispute resolution. Ethereum is therefore the ideal candidate for deploying the BoLD protocol on L2s. -But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. In the event that the parent chain (in this case, L2) is getting repeatedly censored or if the L2 sequencer is offline, every block-level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/deep-dives/sequencer.mdx)). If this were to happen, challenge resolution would get delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! +But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. If the parent chain (in this case, L2) is getting repeatedly censored or if the L2 sequencer is offline, every block-level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/deep-dives/sequencer.mdx)). If this were to happen, challenge resolution would get delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! -To mitigate the risk of this issue manifesting for Arbitrum chains, Offchain Labs has included a feature called _Delay Buffer_ as part of BoLD’s 1.0.0 release. The _Delay Buffer_ feature aims to limit the negative effects of: prolonged parent chain censorship, prolonged sequencer censorship, and/or unexpected sequencer outages. This buffer is configurable by setting a time threshold that decrements when unexpected delays occur. Once that time threshold passes, the force inclusion window is lowered, effectively enabling entities to make moves without the 24-hour delay per move. +To mitigate the risk of this issue manifesting on Arbitrum chains, Offchain Labs has included a feature called _Delay Buffer_ in BoLD’s 1.0.0 release. The _Delay Buffer_ feature aims to limit the negative effects of: prolonged parent chain censorship, prolonged sequencer censorship, and/or unexpected sequencer outages. This buffer is configurable by setting a time threshold that decrements when unexpected delays occur. Once that time threshold is reached, the force inclusion window is reduced, effectively allowing entities to make moves without the 24-hour delay per move. Under reasonable parameterization, the sequencer could be offline/censoring for 24 hours twice, before the force inclusion window drops from 24 hours to a minimum inclusion time. The force inclusion window gradually (over weeks) replenishes to its original value over time as long as the sequencer is on "good behavior" - regularly sequencing messages without unexpected delays. We believe that the Delay Buffer feature provides stronger guarantees of censorship resistance for Arbitrum chains. @@ -253,7 +253,7 @@ The autopooling feature is not available on State Transition Function (STF) determines how blockchain systems change state when processing transactions. The STF takes the current blockchain state (account balances, smart contract data, and ledger information) plus an input (transaction or block) and deterministically computes the new state. This deterministic property ensures all network nodes reach the same result, maintaining consensus. +A State Transition Function (STF) determines how blockchain systems change state when processing transactions. The STF takes the current blockchain state (account balances, smart contract data, and ledger information) and an input (transaction or block) to compute the new state deterministically. This deterministic property ensures all network nodes reach the same result, maintaining consensus. -With Arbitrum, the STF plays an even more pivotal role. Arbitrum executes transactions offchain in batches, periodically submitting summaries to the parent chain. This leverages offchain computation for higher throughput and lower gas costs while maintaining Ethereum's security. To safeguard against incorrect or malicious offchain execution, Arbitrum employs a challenge mechanism known as fraud proofs. If a dispute arises, the STF can be recomputed step-by-step onchain, enabling the network to verify the validity of the offchain computations and ensure that the errors or fraudulent behavior are detected and rectified. +With Arbitrum, the STF plays an even more pivotal role. Arbitrum executes transactions offchain in batches, periodically submitting summaries to the parent chain. This approach leverages offchain computation to achieve higher throughput and lower gas costs while maintaining Ethereum's security. To safeguard against incorrect or malicious offchain execution, Arbitrum employs a challenge mechanism called fraud proofs. If a dispute arises, the STF can be recomputed step-by-step onchain, enabling the network to verify the validity of offchain computations and ensure that errors or fraudulent behavior are detected and rectified. The Arbitrum Nitro Stack STF mirrors Ethereum's STF with key modifications for Arbitrum chain requirements. The function processes ordered transactions and outputs the updated state from the transaction batch. Stylus expands Arbitrum's execution model beyond the Ethereum Virtual Machine (EVM) by adding WebAssembly (WASM)–based execution, allowing high-performance contracts in Rust, C, and C++ to run alongside traditional EVM contracts. The integration -of Stylus introduces several modifications to the STF, including: +The Stylus introduces several modifications to the STF, including: ### Stylus-specific transaction processing diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index f52e208159..9dbc50f122 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -7,11 +7,11 @@ user_story: As a current or prospective Arbitrum user, I need learn more about N content_type: get-started --- -ArbOS is the child chain EVM hypervisor that provides the execution environment for the Arbitrum chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: +ArbOS is the child EVM hypervisor for the Arbitrum chain, providing the execution environment for the chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: ### 1. Managing network resources -It allocates and tracks resources necessary for executing transactions on the child chain. +It allocates and tracks the resources needed to execute transactions on the child chain. ### 2. Block production @@ -23,15 +23,15 @@ It facilitates communication between the parent and child chains, supporting fun ### 4. Enhanced EVM execution -ArbOS operates its instrumented instance of Geth to execute smart contracts, incorporating additional logic specific to the child chain environment. +ArbOS runs its instrumented Geth instance to execute smart contracts, incorporating additional logic specific to the child chain environment. ### 5. Stylus-specific tasks in ArbOS ArbOS manages host I/O calls, memory operations, and execution context for Stylus transactions, ensuring efficient and deterministic processing with the WASM runtime. -By offloading tasks that would execute at a high cost on the parent chain, ArbOS enables these operations to be performed quickly and cost-effectively on the child chain. This design reduces computational and storage costs and offers significant flexibility, allowing the child chain code to evolve or be customized more easily than a parent chain-enforced architecture. +By offloading high-cost tasks from the parent chain, ArbOS enables them to be executed quickly and cost-effectively on the child chain. This design reduces computational and storage costs and offers significant flexibility, allowing the child chain code to evolve or be customized more easily than in a parent-chain-enforced architecture. -While Ethereum's STF forms the basis for secure and deterministic state updates, Arbitrum's Nitro stack builds on this foundation with key modifications–ranging from dual gas accounting to cross-chain messaging–to optimize performance and flexibility. These innovations are realized through minimal yet strategic modifications to Geth, integrated seamlessly with ArbOS, forming the "geth sandwich." +While Ethereum's STF provides a secure, deterministic basis for state updates, Arbitrum's Nitro stack builds on this foundation with key modifications — ranging from dual gas accounting to cross-chain messaging — to optimize performance and flexibility. These innovations are realized through minimal yet strategic modifications to Geth, integrated seamlessly with ArbOS, forming the "geth sandwich." With the introduction of Stylus, Arbitrum extends its execution model beyond the EVM, enabling high-performance WASM-based smart contracts. This integration introduces additional modifications to Geth, ensuring compatibility with Stylus transactions while preserving Ethereum-like execution guarantees. These changes include handling Stylus-specific transaction types and ensuring smooth interaction between the EVM and WASM environments. @@ -41,13 +41,13 @@ In the following section, we'll dive deep into these modifications, exploring ho A precompile consists of a Solidity interface in `contracts/src/precompiles/` and a corresponding Golang implementation in `precompiles/`. Using Geth's ABI generator, `solgen/gen.go` generates `solgen/go/precompilesgen/precompilesgen.go`, which collects the ABI data of the precompiles. The [runtime installer](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L379) uses this generated file to check the type safety of each precompile's implementer. -[The installer](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L379) uses runtime reflection to ensure each implementer has all the right methods and signatures. This reflection includes restricting access to stateful objects like the EVM and `statedb` based on the declared purity. Additionally, the installer verifies and populates event function pointers to provide each precompile the ability to emit logs and know their gas costs. Additional configuration, like restricting a precompile's methods to only be callable by chain owners is possible by adding precompile wrappers like `ownerOnly` and `debugOnly` to their [installation entry](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L403). +[The installer](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L379) uses runtime reflection to ensure each implementer has all the right methods and signatures. This reflection includes restricting access to stateful objects, such as the EVM and `statedb`, based on their declared purity. Additionally, the installer verifies and populates event function pointers, enabling each precompile to emit logs and determine its gas cost. Additional configurations, such as restricting a precompile's methods to be callable only by the chain owner, are possible by adding precompile wrappers like `ownerOnly` and `debugOnly` to their [installation entry](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L403). -Completion of calling, dispatching, and recording of precompile methods occurs via runtime reflection, which avoids any human error manually parsing and writing bytes could introduce, and uses Geth's stable APIs for [packing and unpacking](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L438) values. +Completion of calling, dispatching, and recording of precompile methods occurs via runtime reflection, which avoids any human error that manually parsing and writing bytes could introduce, and uses Geth's stable APIs for [packing and unpacking](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L438) values. Each time a transaction calls a method of a child chain-specific precompile, a [`call context`](https://github.com/OffchainLabs/nitro/blob/f11ba39cf91ee1fe1b5f6b67e8386e5efd147667/precompiles/context.go#L26) gets created to track and record the gas burnt. For convenience, it also provides access to the public fields of the underlying [`TxProcessor`](https://github.com/OffchainLabs/nitro/blob/8e786ec6d1ac3862be85e0c9b5ac79cbd883791c/arbos/tx_processor.go#L38). Because sub-transactions could revert without updates to this struct, the `TxProcessor` only makes public what is safe, such as the amount of parent chain calldata paid by the top-level transaction. -For a complete list of precompiles refer to the [precompile references](/build-decentralized-apps/precompiles/02-reference.mdx). +For a complete list of precompiles, refer to the [precompile references](/build-decentralized-apps/precompiles/02-reference.mdx). ## Messages @@ -55,13 +55,13 @@ An [`L1IncomingMessage`](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e98 ## Retryables -A retryable is a special message type for creating atomic parent chain to child chain messages; for details, see [parent-to-child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). +A retryable is a special message type for creating an atomic parent-to-child chain; for details, see [parent-to-child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). ## ArbOS state ArbOS's state is viewed and modified via [`ArbosState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L36) objects, which provide convenient abstractions for working with the underlying data of its [`backingStorage`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/storage/storage.go#L51). The backing storage's [keyed subspace strategy](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/storage/storage.go#L21) makes [`ArbosState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L36)'s convenient getters and setters possible, minimizing the need to work directly with the specific keys and values of the underlying storage's [`stateDB`](https://github.com/OffchainLabs/go-ethereum/blob/0ba62aab54fd7d6f1570a235f4e3a877db9b2bd0/core/state/statedb.go#L66). -Because two [`ArbosState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L36) objects with the same [`backingStorage`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/storage/storage.go#L51) contain and mutate the same underlying state, different `ArbosState` objects can provide different views of ArbOS's contents. [`Burner`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/burn/burn.go#L11) objects, which track gas usage while working with the `ArbosState`, provide the internal mechanism. Some are read-only, causing transactions to revert with `vm.ErrWriteProtection` upon a mutating request. Others demand the caller have elevated privileges. Meanwhile, others dynamically charge users when doing stateful work. This view is chosen for safety when [`OpenArbosState()`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L57) creates the object and may never change. +Because two [`ArbosState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L36) objects with the same [`backingStorage`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/storage/storage.go#L51) contain and mutate the same underlying state, different `ArbosState` objects can provide different views of ArbOS's contents. [`Burner`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/burn/burn.go#L11) objects, which track gas usage while working with the `ArbosState`, provide the internal mechanism. Some are read-only, causing transactions to revert with `vm.ErrWriteProtection` when a mutating request is issued. Others demand that the caller have elevated privileges. Meanwhile, others dynamically charge users when doing stateful work. This view is chosen for safety when [`OpenArbosState()`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L57) creates the object and may never change. [`arbosVersion`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L37), [`updgradeVersion`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L38) and [`upgradeTimestamp`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L39) ArbOS upgrades are scheduled to happen [when finalizing the first block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350) after the `upgradeTimestamp`. @@ -76,20 +76,20 @@ This component maintains the last 256 parent chain block hashes in a circular bu In addition to supporting the [`ArbAggregator precompile`](/build-decentralized-apps/precompiles/02-reference.mdx#arbaggregator), the parent chain pricing state provides tools for determining the parent chain component of a transaction's gas costs. This part of the state tracks the total amount of funds collected from transactions in parent chain gas fees and the funds spent by batch posters to post data breaches on the parent chain. -Based on this information, ArbOS maintains a parent chain data fee, which is also tracked as part of this state, determining how much transaction fees will cost for parent chain fees. ArbOS dynamically adjusts this value so that fees collected are approximately equal to batch posting costs. -For more details about details of parent chain pricing, see [Parent chain pricing](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). +Based on this information, ArbOS maintains a parent chain data fee, which is also tracked in this state and determines how much the parent chain fee will cost. ArbOS dynamically adjusts this value so that fees collected are approximately equal to batch posting costs. +For more details about darent chain pricing, see [Parent chain pricing](/how-arbitrum-works/deep-dives/parent-chain-pricing.mdx). ### [`l2PricingState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/l2pricing/l2pricing.go#L14) The child chain pricing state tracks child chain resource usage to determine a reasonable child chain gas price. This process considers various factors, including user demand, the state of Geth, and the computational speed limit. The primary mechanism for doing so consists of a pair of pools, one larger than the other, that drain as child chain–specific resources are consumed and filled as time passes. Parent chain-specific resources, such as parent chain `calldata`, are not accounted for in the pools since they do not directly impact the computational workload of network actors. Instead, the design of the speed limit mechanism regulates execution resources to ensure consistent system performance and synchronization. -While much of this state is accessible through the [`ArbGasInfo`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`ArbOwner`](/build-decentralized-apps/precompiles/02-reference.mdx#arbowner) precompiles, most changes are automatic and happen during [block production](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L77) and the [transaction hooks](/how-arbitrum-works/deep-dives/geth.mdx#hooks). Each of an incoming message's transactions removes the parent chain component of the gas it uses from the pool. Afterward, the message's timestamp [informs the pricing mechanism](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L336) of the time passed as ArbOS [finalizes the block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350). +While much of this state is accessible through the [`ArbGasInfo`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`ArbOwner`](/build-decentralized-apps/precompiles/02-reference.mdx#arbowner) precompiles, most changes are automatic and happen during [block production](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L77) and the [transaction hooks](/how-arbitrum-works/deep-dives/geth.mdx#hooks). Each transaction in an incoming message removes the parent chain component of the gas it consumes from the pool. Afterward, the message's timestamp [informs the pricing mechanism](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L336) of the time passed as ArbOS [finalizes the block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350). -ArbOS's larger gas pool [determines](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/l2pricing/pools.go#L98) the per-block gas limit, setting a dynamic [upper limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) on the amount of compute gas a child chain block may have. This limit is always enforced, though it's done in the [`GasChargingHook`](/how-arbitrum-works/deep-dives/geth.mdx#gascharginghook) for the first transaction to avoid sharp decreases in the parent chain gas price from over-inflating the compute component purchased to above the gas limit. Enforicng this improves UX by allowing the first transaction to succeed rather than requiring a resubmission. Because the first transaction lowers the space left in the block, subsequent transactions do not employ this strategy and may fail from such compute-component inflation. This space is acceptable because such transactions are only present in cases where the system is under heavy load. The result is that the user's transaction is dropped without charges since the state transition fails early. Those trusting the Sequencer can rely on the transaction being automatically resubmitted in such a scenario. +ArbOS's larger gas pool [determines](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/l2pricing/pools.go#L98) the per-block gas limit, setting a dynamic [upper limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) on the amount of compute gas a child chain block may have. This limit is always enforced, though it's done in the [`GasChargingHook`](/how-arbitrum-works/deep-dives/geth.mdx#gascharginghook) for the first transaction to avoid sharp decreases in the parent chain gas price from over-inflating the compute component purchased to above the gas limit. Enforcing this improves UX by allowing the first transaction to succeed rather than requiring a resubmission. Because the first transaction reduces the space left in the block, subsequent transactions do not use this strategy and may fail due to compute-component inflation. This space is acceptable because such transactions occur only when the system is under heavy load. The result is that the user's transaction is dropped without charges since the state transition fails early. Those trusting the Sequencer can rely on the automatic resubmission of a transaction in such a scenario. -We need a per-block gas limit because arbitrator WAVM execution is much slower than native transaction execution. This limit means there can only be so much gas, roughly translating to wall-block time–in a child chain block. It also allows ArbOS to limit the size of blocks should demand continue to surge even as the price rises. +We need a per-block gas limit because arbitrator WAVM execution is much slower than native transaction execution. This limit means there can only be so much gas, roughly translating to wall-block time, in a child chain block. It also allows ArbOS to limit the size of blocks should demand continue to surge even as prices rise. -ArbOS's per-block gas limit is distinct from Geth's block limit, which ArbOS [sets sufficiently high](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L166) to never run out. This approach is safe since Geth's block limit exists to constrain the work done per block, which ArbOS already does via its own per-block gas limit. Though it'll never run out, a block's transactions use the [same Geth gas pool](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L199) to maintain the invariant that the pool decreases monotonically after each transaction. Block headers [use the Geth block limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L67) for internal consistency and to ensure gas estimation works. There are distinct from the [`gasLeft`](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) variable, which ephemerally exists outside of the global state to keep child chain blocks from exceeding ArbOS's per-block gas limit and to deduct space where the state transition failed or [used negligible amounts](https://github.com/OffchainLabs/nitro/blob/faf55a1da8afcabb1f3c406b291e721bfde71a05/arbos/block_processor.go#L328) of compute gas. ArbOS does not need to persist `gasLeft` because its pool induces a revert, and transactions use the Geth block limit during EVM execution. +ArbOS's per-block gas limit is distinct from Geth's block limit, which ArbOS [sets sufficiently high](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L166) never to run out. This approach is safe since Geth's block limit exists to constrain the work done per block, which ArbOS already does via its own per-block gas limit. Though it'll never run out, a block's transactions use the [same Geth gas pool](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L199) to maintain the invariant that the pool decreases monotonically after each transaction. Block headers [use the Geth block limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L67) for internal consistency and to ensure gas estimation works. They are distinct from the [`gasLeft`](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) variable, which ephemerally exists outside of the global state to keep child chain blocks from exceeding ArbOS's per-block gas limit and to deduct space where the state transition failed or [used negligible amounts](https://github.com/OffchainLabs/nitro/blob/faf55a1da8afcabb1f3c406b291e721bfde71a05/arbos/block_processor.go#L328) of compute gas. ArbOS does not need to persist `gasLeft` because its pool induces a revert, and transactions use the Geth block limit during EVM execution. ## Child chain gas pricing @@ -97,7 +97,7 @@ The child chain gas price on a given Arbitrum chain has a set floor, which is qu ## Estimating child chain gas -Calling an Arbitrum Node's `eth_estimateGas` RPC gives a value sufficient to cover the full transaction fee at the given child chain gas price, i.e., the value returned from `eth_estimateGas` multiplied by the child chain gas price tells you how much total Ether is required for the transaction to succeed. Note that this means that for a given operation the value returned by `eth_estimateGas` will change over time (as the parent chain calldata price fluctuates). See [2-D fees](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9) and [How to estimate gas in Arbitrum](/build-decentralized-apps/02-how-to-estimate-gas.mdx) for more information. +Calling an Arbitrum Node's `eth_estimateGas` RPC gives a value sufficient to cover the full transaction fee at the given child chain gas price, i.e., the value returned from `eth_estimateGas` multiplied by the child chain gas price tells you how much total Ether is required for the transaction to succeed. Note that this means the value returned by `eth_estimateGas` for a given operation will change over time (as the parent chain's calldata price fluctuates). See [2-D fees](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9) and [How to estimate gas in Arbitrum](/build-decentralized-apps/02-how-to-estimate-gas.mdx) for more information. ## Child chain gas fees @@ -105,9 +105,9 @@ Child chain gas fees work very similarly to gas on Ethereum. The amount of gas i The child chain basefee is set by a version of the "exponential mechanism" widely discussed in the Ethereum community and shown to be equivalent to Ethereum's EIP-1559 gas pricing mechanism. -The algorithm compares gas usage against the [speed limit](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#the-speed-limit) parameter, the target amount of gas per second that the chain can handle sustainably over time. (The speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, it gets added to the backlog. Whenever the clock ticks one second, the speed limit subtracts from the backlog, but the backlog can never go below zero. +The algorithm compares gas usage against the [speed limit](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#the-speed-limit) parameter —the target amount of gas per second that the chain can sustainably handle over time. (The speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, it gets added to the backlog. Whenever the clock ticks a second, the speed limit is subtracted from the backlog, but the backlog can never go below zero. -Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage because usage is above the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit so more gas usage can be welcomed. +Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage because usage is above the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit, so more gas usage can be welcomed. More precisely, the basefee is an exponential function of the backlog, `F = exp(-a(B-b))`, where `a` and `b` are suitably chosen constants: `a` controls how rapidly the price escalates with the backlog, and `b` allows a small backlog before the basefee escalation begins. @@ -119,17 +119,17 @@ The Sequencer prioritizes transactions on a first-come, first-served basis. Beca When a transaction schedules another, the subsequent transaction's execution [will be included](https://github.com/OffchainLabs/go-ethereum/blob/d52739e6d54f2ea06146fdc44947af3488b89082/internal/ethapi/api.go#L999) when estimating gas via the node's RPC. Finding a gas estimate for a transaction is only possible if all the transactions succeed at a given gas limit. This estimation is especially important when working with retryables and scheduling `redeem` attempts. -Because a call to `redeem` donates all of the call's gas, doing multiple requires limiting the amount of gas provided to each sub-call. Otherwise, the first will take all of the gas and force the second to fail, irrespective of the estimation's gas limit. +Because a call to `redeem` consumes all the call's gas, doing multiple calls requires limiting the gas provided to each sub-call. Otherwise, the first will take all of the gas and force the second to fail, irrespective of the estimation's gas limit. Gas estimation for retryable submissions is possible via the [`NodeInterface`](/build-decentralized-apps/nodeinterface/02-reference.mdx) and similarly requires the auto-redeem attempt to succeed. ## The speed limit -The security of Nitro chains depends on the assumption that when one validator creates an assertion, other validators will check it and respond with a correct assertion and a challenge if it is wrong. This assumption requires that the other validators have the time and resources to check each assertion quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for assertions. +The security of Nitro chains depends on the assumption that when one validator creates an assertion, other validators will check it and respond with a correct assertion and a challenge if it is wrong. This assumption requires that the other validators have the time and resources to check each assertion and issue a timely challenge quickly. The Arbitrum protocol accounts for this when setting deadlines for assertions. -This approach sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will get farther and farther in the future. Due to the limit enforced by the Rollup protocol contracts on how far a deadline can be in the future, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. +This approach sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published faster than the speed limit, their deadlines will get farther and farther into the future. Due to the Rollup protocol's limit on how far a deadline can be in the future, this will eventually slow new assertions, thereby enforcing the effective speed limit. -Being able to set the speed limit accurately depends on being able to estimate the time required to validate an assertion, with some accuracy. Any uncertainty in estimating validation time will force us to lower the speed limit to be safe. We do not want to lower the speed limit, so we try to enable accurate estimation. +Being able to set the speed limit accurately depends on estimating the time required to validate an assertion with some accuracy. Any uncertainty in estimating validation time will force us to lower the speed limit to be safe. We do not want to lower the speed limit, so we try to enable accurate estimation. ## Stylus-specific differences @@ -181,7 +181,7 @@ Stylus contracts leverage an advanced caching system to minimize execution overh - **LRU (Least Recently Used) caching**: Keeps the most recently accessed Stylus contracts in memory for fast execution. - **Persistent long-term caching**: Caching for selected contracts may occur across blocks based on an economic auction model. -- **Init costs and execution pricing**: Instead of a flat gas cost, Stylus contracts have dynamic execution costs based on WASM complexity. ArbOS maintains pricing parameters (`initCost`, `cachedCost`) that adjust based on future optimizations in WASM execution. +- **Init costs and execution pricing**: Instead of a flat gas cost, Stylus contracts have dynamic execution costs based on WASM complexity. ArbOS maintains pricing parameters (`initCost`, `cachedCost`) that are adjusted based on future WASM execution optimizations. ### 3. Interaction with ArbOS and Geth diff --git a/docs/how-arbitrum-works/deep-dives/assertions.mdx b/docs/how-arbitrum-works/deep-dives/assertions.mdx index fa25d60ce2..e4348e1797 100644 --- a/docs/how-arbitrum-works/deep-dives/assertions.mdx +++ b/docs/how-arbitrum-works/deep-dives/assertions.mdx @@ -44,19 +44,19 @@ Validators and proposers serve different roles. Validators validate transactions ::: -Except for the assertion number, the contents of the assertion are all just claims by the assertion's proposer. Arbitrum doesn't know at first whether any of these fields are correct. The protocol should eventually confirm the assertion if all of these fields are correct. The protocol should eventually reject the assertion if one or more of these fields are incorrect. +Except for the assertion number, the assertion's contents are merely claims by its proposer. Arbitrum doesn't know at first whether any of these fields are correct. The protocol should eventually confirm the assertion if all of these fields are correct. The protocol should eventually reject the assertion if any of these fields are incorrect. -An assertion implicitly claims that its predecessor assertion is correct, which means that it also claims the correctness of a complete history of the chain: a sequence of ancestor assertions that reaches back to the birth of the chain. +An assertion implicitly claims that its predecessor is correct, meaning it also asserts the correctness of the entire chain's history: a sequence of ancestor assertions that reaches back to the chain's genesis. -An assertion also implicitly claims that its older siblings (older assertions with the same predecessor), if there are any, are incorrect. If two assertions are siblings, and the older sibling is correct––then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. +An assertion also implicitly claims that its older siblings (other assertions with the same predecessor) are incorrect, if any exist. If two assertions are siblings, and the older sibling is correct––then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. -The assertion is assigned a deadline, which indicates how much time other validators have to respond to it. For an assertion `R` with no older siblings, this will equal the time the assertion was posted, plus an interval of time known as the challenge Period; subsequent younger siblings will have the same deadline as their oldest sibling (`R`). You don't need to do anything if you're a validator and agree that an assertion is correct. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the party who proposed the first assertion (or another party acting in support of that assertion). More on challenges below: +The assertion is assigned a deadline, which indicates how much time other validators have to respond to it. For an assertion `R` with no older siblings, the deadline will equal the time when the assertion posts, plus an interval of time known as the challenge Period; subsequent younger siblings will have the same deadline as their oldest sibling (`R`). You don't need to do anything if you're a validator and agree that an assertion is correct. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the party that proposed the first assertion (or another party acting in support of that assertion). More on challenges below: ## Delays -Even if the Assertion Tree has multiple conflicting assertions and multiple disputes are in progress, validators can continue making new assertions. Honest validators will build on one valid assertion (intuitively, an assertion is also an implicit claim of the validity of all of its parent assertions). Likewise, users can continue transacting on the child chain since transactions will continue to post in the chain's inbox. +Even if the Assertion Tree has multiple conflicting assertions and multiple disputes are in progress, validators can continue making new assertions. Honest validators will build on one valid assertion (intuitively, an assertion is also an implicit claim of the validity of all of its parent assertions). Likewise, users can continue transacting on the child chain, as transactions will still post to the chain's inbox. -The only delay users experience during a dispute is their [Child to parent chain messages](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) (i.e., withdrawals). A key property of BoLD is that we can guarantee that, in the common case, their withdrawals/messages will only get delayed for one challenge period. In the case of an actual dispute, the withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. +The only delay users experience during a dispute is in their [Child-to-parent chain messages](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) (i.e., withdrawals). A key property of BoLD is that, in the common case, their withdrawals/messages will only experience a delay of one challenge period. In the event of a dispute, withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. ## Staking and validator incentives @@ -94,6 +94,6 @@ Multiple disputes may be active simultaneously if conflicting assertions arise i - **Honest validators can continue asserting**, building on the last correct assertion. - **Users can keep transacting** on the child chain without disruption. -- **Child-to-parent chain withdrawals** may experience delays - Typically, withdrawals experience a single challenge period (6.4 days) delay. - A key property of BoLD is that we can guarantee that in the common case, withdrawals/messages will only experience delay of one challenge period. In the case of an actual dispute, the withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. +- **Child-to-parent chain withdrawals** may experience delays - Typically, withdrawals experience a single challenge period (6.4 days) delay. - A key property of BoLD is that we can guarantee that, in the common case, withdrawals/messages will only experience a delay of one challenge period. In the event of a dispute, withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. Despite these delays, Arbitrum guarantees that honest assertions always succeed, maintaining Ethereum-level security. diff --git a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx index 9815dc4030..96160c03ae 100644 --- a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx +++ b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx @@ -13,7 +13,7 @@ content_type: get-started Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/deep-dives/sequencer.mdx#real-time-sequencer-feed). -Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. +Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes reorganize to adopt the transactions confirmed on the parent chain, treating it as the definitive source of truth. As discussed in the [considerations and limitations section](/how-arbitrum-works/deep-dives/sequencer.mdx#considerations-and-limitations), these methods suit different applications. diff --git a/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx b/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx index ed68bc9a6c..fe8b24e25f 100644 --- a/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx +++ b/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx @@ -97,7 +97,7 @@ The following diagram shows the four methods for submitting transactions to the You can submit transactions directly to the Delayed Inbox contract on the Parent chain without using the Sequencer. This method provides: -- **Censorship resistance** - Your transaction will be included even if the Sequencer refuses to process it +- **Censorship resistance** - Transaction inclusion even if the Sequencer refuses to process it - **Availability guarantee** - Transactions work even when the Sequencer is offline - **Decentralization** - Reduces dependency on the Sequencer @@ -126,7 +126,7 @@ To submit a transaction through the Delayed Inbox: ### Force inclusion after delays -If your transaction isn't processed within 24 hours, call the [`forceInclusion`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/SequencerInbox.sol#L284) function on the `SequencerInbox` contract. This guarantees your transaction will be included regardless of Sequencer status. +If your transaction doesn't get processed within 24 hours, call the [`forceInclusion`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/SequencerInbox.sol#L284) function on the `SequencerInbox` contract. This function ensures that transactions get included regardless of the Sequencer's status. ### Using the Arbitrum SDK diff --git a/docs/stylus/concepts/how-it-works.md b/docs/stylus/concepts/how-it-works.md index 540a573998..ab5c1fdc39 100644 --- a/docs/stylus/concepts/how-it-works.md +++ b/docs/stylus/concepts/how-it-works.md @@ -79,4 +79,4 @@ Stylus doesn't just improve on cost and speed. WASM programs are also safer. Ree ### Fully interoperable -Solidity programs and WASM programs are completely composable. If working in Solidity, a developer can call a Rust program or rely on another dependency in a different language. If working in Rust, all Solidity functionalities are accessible out of the box.gas- +Solidity programs and WASM programs are completely composable. If working in Solidity, a developer can call a Rust program or rely on another dependency in a different language. If working in Rust, all Solidity functionalities are accessible out of the box. From 54c69793de7c825136589d10f0955518561bdcb8 Mon Sep 17 00:00:00 2001 From: Pete Date: Tue, 4 Nov 2025 12:23:38 -0600 Subject: [PATCH 75/75] Fixing broken link --- docs/build-decentralized-apps/03-public-chains.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build-decentralized-apps/03-public-chains.mdx b/docs/build-decentralized-apps/03-public-chains.mdx index 9a92591d75..bbc0b796a6 100644 --- a/docs/build-decentralized-apps/03-public-chains.mdx +++ b/docs/build-decentralized-apps/03-public-chains.mdx @@ -22,11 +22,11 @@ chains, their differences, and the technology stacks that these chains use. ### Arbitrum One -**Arbitrum One** is a child chain Optimistic Rollup chain that implements the Arbitrum Rollup Protocol and settles to Ethereum's Parent chain. It lets you build high-performance Ethereum dApps with low transaction costs and Ethereum-grade security guarantees, introducing no additional trust assumptions. This is made possible by the [Nitro](/how-arbitrum-works/04-state-transition-function/04-modified-Geth-on-arbitrum.mdx) technology stack, a "Geth-at-the-core" architecture that gives Arbitrum One (and Nova) advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. +**Arbitrum One** is a child chain Optimistic Rollup chain that implements the Arbitrum Rollup Protocol and settles to Ethereum's Parent chain. It lets you build high-performance Ethereum dApps with low transaction costs and Ethereum-grade security guarantees, introducing no additional trust assumptions. This is made possible by the [Nitro](/how-arbitrum-works/deep-dives/geth.mdx) technology stack, a "Geth-at-the-core" architecture that gives Arbitrum One (and Nova) advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. ### Arbitrum Nova -**Arbitrum Nova** is a high-performance alternative to Arbitrum One's chain. While Arbitrum One implements the purely Trustless Rollup protocol, Arbitrum Nova implements the mostly trustless [AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) protocol. The key difference between Rollup and AnyTrust is that the AnyTrust protocol introduces an additional trust assumption in the form of a Data Availability Committee (DAC). This committee (detailed below) is responsible for expediting the process of storing, batching, and posting child chain transaction data to Ethereum's parent chain. This lets you use Arbitrum in scenarios that demand performance and affordability, while Arbitrum One is optimal for scenarios that demand Ethereum's pure trustlessness. +**Arbitrum Nova** is a high-performance alternative to Arbitrum One's chain. While Arbitrum One implements the purely Trustless Rollup protocol, Arbitrum Nova implements the mostly trustless [AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) protocol. The key difference between Rollup and AnyTrust is that the AnyTrust protocol introduces an additional trust assumption in the form of a Data Availability Committee (DAC). This committee (detailed below) is responsible for expediting the process of storing, batching, and posting child chain transaction data to Ethereum's parent chain. This lets you use Arbitrum in scenarios that demand performance and affordability, while Arbitrum One is optimal for scenarios that demand Ethereum's pure trustlessness. ## What Arbitrum testnet chains are available?

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

F^N*2ce%CWuFO|0yb}BLtFJ7R8 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 - - - + + + - + diff --git a/static/img/haw-malicious-rollup-chain.svg b/static/img/haw-malicious-rollup-chain.svg new file mode 100755 index 0000000000..446c9ac298 --- /dev/null +++ b/static/img/haw-malicious-rollup-chain.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/haw-normal-rollup-chain.svg b/static/img/haw-normal-rollup-chain.svg new file mode 100755 index 0000000000..88b71ac531 --- /dev/null +++ b/static/img/haw-normal-rollup-chain.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/haw-rollup-challenges.svg b/static/img/haw-rollup-challenges.svg new file mode 100755 index 0000000000..c79161cf1a --- /dev/null +++ b/static/img/haw-rollup-challenges.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/haw-transaction-lifecycle.svg b/static/img/haw-transaction-lifecycle.svg index beaf48de24..51881c27f7 100755 --- a/static/img/haw-transaction-lifecycle.svg +++ b/static/img/haw-transaction-lifecycle.svg @@ -1,10 +1,10 @@ - - - + + + - + From ae5ce800c56230de9a8b3ecda2d0283e6ee469c5 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:43:20 -0500 Subject: [PATCH 02/75] Removing existing a-gentle-intro; being replaced with Inside Arbitrum Nitro --- .../01-a-gentle-introduction.mdx | 87 ------------------- 1 file changed, 87 deletions(-) delete mode 100644 docs/how-arbitrum-works/01-a-gentle-introduction.mdx diff --git a/docs/how-arbitrum-works/01-a-gentle-introduction.mdx b/docs/how-arbitrum-works/01-a-gentle-introduction.mdx deleted file mode 100644 index 002fdb745d..0000000000 --- a/docs/how-arbitrum-works/01-a-gentle-introduction.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: 'A gentle introduction' -description: 'Learn the fundamentals of Nitro, Arbitrum stack.' -author: dzgoldman -sme: dzgoldman -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. -content_type: get-started ---- - -import ImageWithCaption from '@site/src/components/ImageCaptions/'; - -:::info - -This page gives a high-level overview. It explains Arbitrum, its purpose, and a brief "how it works." As you progress through the articles in this section, the content will get more technical and dive deeper into each component(s) and function(s) of the Arbitrum technology stack. - -::: - -Arbitrum is a technology suite designed to improve Ethereum. You can use Arbitrum chains for the same things you do on Ethereum, like using Web3 apps and deploying smart contracts. The difference is that your transactions will be cheaper and faster. Our main product, Arbitrum Rollup, is an Optimistic Rollup protocol that offers the same security as Ethereum. - -### But why? - -Ethereum is awesome, but it has its limitations. The Ethereum Blockchain can handle only about 20 to 40 transactions per second (TPS) for all users. Once it reaches this limit, users must compete for space to have their transactions included, increasing fees. - -Arbitrum Rollup solves this issue! Here's how it works: an Arbitrum Rollup Chain acts as a submodule within Ethereum. Unlike regular Ethereum transactions, we don't need Ethereum nodes to handle every Arbitrum transaction. Instead, Ethereum takes an ["innocent until proven guilty"](https://insights.deribit.com/market-research/making-sense-of-rollups-part-2-dispute-resolution-on-arbitrum-and-optimism/) stance with Arbitrum. Initially, the Parent chain assumes that actions on Arbitrum follow the rules. If there is a rule violation (like someone claiming, "Now I have all of your money"), that claim is challengeable on the parent chain. In this case, we can prove fraud, disregard the invalid claim, and penalize the guilty party. This ability to investigate and confirm fraud on the parent chain is Arbitrum's main feature and explains why it benefits from Ethereum's security. - -### How do these fraud proofs work? - -People who help manage the Arbitrum chain on the parent chain are called validators. They make claims about the chain's state, dispute others' claims, and more. Most Arbitrum users are unlikely to run a validator, just as most Ethereum users do not operate their parent chain staking node. However, anyone can become a validator; you don't need special permission ([once the allowlist gets lifted](https://docs.arbitrum.foundation/state-of-progressive-decentralization)). You only need to run the [open source validator software](https://github.com/OffchainLabs/nitro) and bond `ETH` if required. - -The chain stays secure if there is at least one honest validator. It only takes one trustworthy fraud prover to catch many bad actors. These features make the system "Trustless." Users do not depend on any specific group to keep their funds safe. - -### Who does this fraud proofing? - -This step is where the "Rollup" part comes in. Arbitrum Rollup chains handle user transaction data by posting it directly on Ethereum. This setup means that as long as Ethereum is secure, anyone can see what happens on Arbitrum. They can also spot and prove any fraud that occurs. - -Validators are the nodes that help move the Arbitrum Chain state forward on the parent chain. They make claims about the chain's state and can dispute claims made by others. Most Arbitrum users are unlikely to want to run a validator, just as most Ethereum users typically don't run their parent chain staking nodes. However, anyone can become a validator. Once the allowlist gets removed, users only need to run the open-source validator software and bond `ETH` if they need to take action. - -The network stays secure if there is at least one honest validator, which means that just one trustworthy fraud prover can catch any number of bad actors. This setup makes the system "trustless"; users do not have to rely on any specific person to keep their funds safe. - -### The game - -It's not as complicated as it seems. If two validators disagree, only one is telling the truth. In the event of a dispute, the two validators engage in an interactive game, where they respond to each other in a call-and-response format. This process allows them to narrow their disagreement to a single computational step—something straightforward, like multiplying two numbers. This step executes on the parent chain, which shows which party is honest. For a more detailed explanation, see here. - -Users only experience delays when they withdraw funds from Arbitrum back to Ethereum. When withdrawing directly from Arbitrum to Ethereum, users usually wait one week to receive their funds on the parent chain. However, users can skip this waiting period if they use a fast bridge application, often for a small fee. Other activities do not have this delay, like depositing funds from Ethereum to Arbitrum or using a decentralized application (dApp) on the Arbitrum chain. - -### How is it cheaper? - -Arbitrum helps lower user transaction costs by reducing the strain on the parent chain. The primary way it does this is by processing transactions in batches. A batch can contain several hundred child chain transactions and gets submitted as one parent chain transaction. This batching makes interacting with the parent chain cheaper since you save on overhead costs compared to submitting each transaction individually. - -Additionally, Arbitrum posts transaction data on the parent chain in a compressed format. It only decompresses this data within the child chain environment, reducing the amount of information that needs storing on the parent chain. - -### How does it all work together? - -At the most basic level, an Arbitrum chain works like this: - - - -Users and contracts put messages into the inbox. The chain reads the messages one at a time and processes each one. This processing updates the state of the chain and produces some outputs. - -If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then, the chain will see your transaction, execute it, and produce some outputs: a transaction receipt and any withdrawals that your transaction initiated. - -Execution is deterministic, meaning that the contents of its inbox uniquely determine the chain's behavior. Because of this, the result of your transaction is knowable as soon as it gets put in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) - -All of the technical details in this document connect to this diagram. To get from this diagram to a complete description of Arbitrum, we'll need to answer questions like these: - -- Who keeps track of the inbox, Chain state, and outputs? -- How does Arbitrum make sure that the chain state and outputs are correct? -- How can Ethereum users and contracts interact with Arbitrum? -- How does Arbitrum support Ethereum-compatible contracts and transactions? -- How are ETH and tokens transferred into and out of Arbitrum chains, and how are they managed while on the chain? -- How can I run my own Arbitrum node or validator? - -### Nitro's Design: The Four Big Ideas - -The essence of Nitro and its key innovations lie in four big ideas. We'll list them here with a quick summary of each. We will unpack them in more detail in later sections. - -**Big Idea: Sequencing, Followed by Deterministic Execution**: Nitro processes transactions with a two-phase strategy. First, the transactions get organized into a single-ordered sequence, and Nitro commits to that sequence. Then, the transactions get processed in that sequence by a deterministic State Transition Function. - -**Big Idea: Geth at the Core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum ("Geth") Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatibility with Ethereum. - -**Big Idea: Separate Execution from Proving**: Nitro takes the same source code and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. - -**Big Idea: Optimistic Rollup with Interactive Fraud Proofs**: Nitro settles transactions to the parent Ethereum chain using an Optimistic Rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. -Now that we have covered the foundational concepts, the big picture, and the four big ideas of Arbitrum Nitro, we will begin a journey following a transaction through the Arbitrum protocol. In the next section, the transaction lifecycle begins. From f3fed7bde164e4ea0e4816119b886c5588228481 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:46:26 -0500 Subject: [PATCH 03/75] moving sequencer to deep-dives --- .../{03-sequencer.mdx => deep-dives/sequencer.mdx} | 0 .../transaction-lifecycle.mdx} | 0 vercel.json | 10 ++++++++++ 3 files changed, 10 insertions(+) rename docs/how-arbitrum-works/{03-sequencer.mdx => deep-dives/sequencer.mdx} (100%) rename docs/how-arbitrum-works/{02-transaction-lifecycle.mdx => deep-dives/transaction-lifecycle.mdx} (100%) diff --git a/docs/how-arbitrum-works/03-sequencer.mdx b/docs/how-arbitrum-works/deep-dives/sequencer.mdx similarity index 100% rename from docs/how-arbitrum-works/03-sequencer.mdx rename to docs/how-arbitrum-works/deep-dives/sequencer.mdx diff --git a/docs/how-arbitrum-works/02-transaction-lifecycle.mdx b/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx similarity index 100% rename from docs/how-arbitrum-works/02-transaction-lifecycle.mdx rename to docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx diff --git a/vercel.json b/vercel.json index f326c07c26..1b971b40a9 100644 --- a/vercel.json +++ b/vercel.json @@ -190,6 +190,16 @@ "destination": "/how-arbitrum-works/transaction-lifecycle", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/sequencer/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/transaction-lifecycle/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/transaction-lifecycle/?)", + "permanent": false + }, { "source": "/(docs/inside_arbitrum/?)", "destination": "/how-arbitrum-works/a-gentle-introduction", From e478373f1b414c627c79c5f239cae6cfbdfc285d Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:48:19 -0500 Subject: [PATCH 04/75] moving state-transition-function to deep-dives --- .../01-stf-gentle-intro.mdx | 0 .../02-stf-inputs.mdx | 0 .../03-ethereum-vs-arbitrum.mdx | 0 .../04-modified-geth-on-arbitrum.mdx | 0 .../04-state-transition-function/05-arbos.mdx | 0 .../06-stylus-execution-path.mdx | 0 vercel.json | 30 +++++++++++++++++++ 7 files changed, 30 insertions(+) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/01-stf-gentle-intro.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/02-stf-inputs.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/03-ethereum-vs-arbitrum.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/04-modified-geth-on-arbitrum.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/05-arbos.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/04-state-transition-function/06-stylus-execution-path.mdx (100%) diff --git a/docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/01-stf-gentle-intro.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/01-stf-gentle-intro.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/02-stf-inputs.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/02-stf-inputs.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/03-ethereum-vs-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/03-ethereum-vs-arbitrum.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/03-ethereum-vs-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/03-ethereum-vs-arbitrum.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/04-modified-geth-on-arbitrum.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/04-modified-geth-on-arbitrum.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/05-arbos.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/05-arbos.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/05-arbos.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/06-stylus-execution-path.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/06-stylus-execution-path.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/06-stylus-execution-path.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/06-stylus-execution-path.mdx diff --git a/vercel.json b/vercel.json index 1b971b40a9..4d2742ebad 100644 --- a/vercel.json +++ b/vercel.json @@ -195,6 +195,36 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/arbos/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/arbos/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/ethereum-vs-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/ethereum-vs-arbitrum/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/modified-geth-on-arbitrum/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/stf-gentle-intro/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stf-gentle-intro/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/stf-inputs/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stf-inputs/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/state-transition-function/stylus-execution-path/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stylus-execution-path/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/transaction-lifecycle/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/transaction-lifecycle/?)", From 203d7218c649b23048b479505d9091621229f154 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:49:25 -0500 Subject: [PATCH 05/75] Moving validation-and-proving to deep-dives --- .../01-validation-and-proving.mdx | 0 .../02-rollup-protocol.mdx | 0 .../03-proving-and-challenges.mdx | 0 vercel.json | 15 +++++++++++++++ 4 files changed, 15 insertions(+) rename docs/how-arbitrum-works/{ => deep-dives}/05-validation-and-proving/01-validation-and-proving.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/05-validation-and-proving/02-rollup-protocol.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/05-validation-and-proving/03-proving-and-challenges.mdx (100%) diff --git a/docs/how-arbitrum-works/05-validation-and-proving/01-validation-and-proving.mdx b/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/01-validation-and-proving.mdx similarity index 100% rename from docs/how-arbitrum-works/05-validation-and-proving/01-validation-and-proving.mdx rename to docs/how-arbitrum-works/deep-dives/05-validation-and-proving/01-validation-and-proving.mdx diff --git a/docs/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx b/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/02-rollup-protocol.mdx similarity index 100% rename from docs/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx rename to docs/how-arbitrum-works/deep-dives/05-validation-and-proving/02-rollup-protocol.mdx diff --git a/docs/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx b/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/03-proving-and-challenges.mdx similarity index 100% rename from docs/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx rename to docs/how-arbitrum-works/deep-dives/05-validation-and-proving/03-proving-and-challenges.mdx diff --git a/vercel.json b/vercel.json index 4d2742ebad..7474f51e3c 100644 --- a/vercel.json +++ b/vercel.json @@ -230,6 +230,21 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/transaction-lifecycle/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/validation-and-proving/proving-and-challenges/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/proving-and-challenges/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/validation-and-proving/rollup-protocol/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/rollup-protocol/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/validation-and-proving/validation-and-proving/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/validation-and-proving/?)", + "permanent": false + }, { "source": "/(docs/inside_arbitrum/?)", "destination": "/how-arbitrum-works/a-gentle-introduction", From e8d7dd98335e70c724759c029640c48adaaace3e Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:50:14 -0500 Subject: [PATCH 06/75] Moving gas-and-fees to deep-dives --- docs/how-arbitrum-works/{ => deep-dives}/09-gas-fees.mdx | 0 vercel.json | 5 +++++ 2 files changed, 5 insertions(+) rename docs/how-arbitrum-works/{ => deep-dives}/09-gas-fees.mdx (100%) diff --git a/docs/how-arbitrum-works/09-gas-fees.mdx b/docs/how-arbitrum-works/deep-dives/09-gas-fees.mdx similarity index 100% rename from docs/how-arbitrum-works/09-gas-fees.mdx rename to docs/how-arbitrum-works/deep-dives/09-gas-fees.mdx diff --git a/vercel.json b/vercel.json index 7474f51e3c..f256e9ea53 100644 --- a/vercel.json +++ b/vercel.json @@ -190,6 +190,11 @@ "destination": "/how-arbitrum-works/transaction-lifecycle", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/gas-fees/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/sequencer/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", From 542ff3060e79db653544abd9af4656ce0b7ef96c Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:51:20 -0500 Subject: [PATCH 07/75] Moving L1-to-L2 and L2-to-L1 messaging to deep-dives --- .../{ => deep-dives}/10-l1-to-l2-messaging.mdx | 0 .../{ => deep-dives}/11-l2-to-l1-messaging.mdx | 0 vercel.json | 10 ++++++++++ 3 files changed, 10 insertions(+) rename docs/how-arbitrum-works/{ => deep-dives}/10-l1-to-l2-messaging.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/11-l2-to-l1-messaging.mdx (100%) diff --git a/docs/how-arbitrum-works/10-l1-to-l2-messaging.mdx b/docs/how-arbitrum-works/deep-dives/10-l1-to-l2-messaging.mdx similarity index 100% rename from docs/how-arbitrum-works/10-l1-to-l2-messaging.mdx rename to docs/how-arbitrum-works/deep-dives/10-l1-to-l2-messaging.mdx diff --git a/docs/how-arbitrum-works/11-l2-to-l1-messaging.mdx b/docs/how-arbitrum-works/deep-dives/11-l2-to-l1-messaging.mdx similarity index 100% rename from docs/how-arbitrum-works/11-l2-to-l1-messaging.mdx rename to docs/how-arbitrum-works/deep-dives/11-l2-to-l1-messaging.mdx diff --git a/vercel.json b/vercel.json index f256e9ea53..cf0add74b8 100644 --- a/vercel.json +++ b/vercel.json @@ -195,6 +195,16 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/l1-to-l2-messaging/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/l2-to-l1-messaging/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/sequencer/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/sequencer/?)", From b696331ed8e13421694a857a7af8e31f93e8b9c7 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 09:52:29 -0500 Subject: [PATCH 08/75] Moving AnyTrust protocol and Data Availability to deep-dives --- .../{ => deep-dives}/08-anytrust-protocol.mdx | 0 .../{ => deep-dives}/12-data-availability.mdx | 0 vercel.json | 10 ++++++++++ 3 files changed, 10 insertions(+) rename docs/how-arbitrum-works/{ => deep-dives}/08-anytrust-protocol.mdx (100%) rename docs/how-arbitrum-works/{ => deep-dives}/12-data-availability.mdx (100%) diff --git a/docs/how-arbitrum-works/08-anytrust-protocol.mdx b/docs/how-arbitrum-works/deep-dives/08-anytrust-protocol.mdx similarity index 100% rename from docs/how-arbitrum-works/08-anytrust-protocol.mdx rename to docs/how-arbitrum-works/deep-dives/08-anytrust-protocol.mdx diff --git a/docs/how-arbitrum-works/12-data-availability.mdx b/docs/how-arbitrum-works/deep-dives/12-data-availability.mdx similarity index 100% rename from docs/how-arbitrum-works/12-data-availability.mdx rename to docs/how-arbitrum-works/deep-dives/12-data-availability.mdx diff --git a/vercel.json b/vercel.json index cf0add74b8..bd62d0131c 100644 --- a/vercel.json +++ b/vercel.json @@ -190,6 +190,16 @@ "destination": "/how-arbitrum-works/transaction-lifecycle", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/anytrust-protocol/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/anytrust-protocol/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/data-availability/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/gas-fees/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", From 657d9200dd1a3c3e7df41fc7af0ac7601cc97be3 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 12:36:31 -0500 Subject: [PATCH 09/75] renamed files; added admonitions for deep-dives on Inside Arbitrum Nitro --- .../01-inside-arbitrum-nitro.mdx | 35 ++++--------------- ...trum.mdx => modified-geth-on-arbitrum.mdx} | 0 ...ust-protocol.mdx => anytrust-protocol.mdx} | 0 ...2-messaging.mdx => l1-to-l2-messaging.mdx} | 0 ...1-messaging.mdx => l2-to-l1-messaging.mdx} | 0 5 files changed, 6 insertions(+), 29 deletions(-) rename docs/how-arbitrum-works/deep-dives/04-state-transition-function/{04-modified-geth-on-arbitrum.mdx => modified-geth-on-arbitrum.mdx} (100%) rename docs/how-arbitrum-works/deep-dives/{08-anytrust-protocol.mdx => anytrust-protocol.mdx} (100%) rename docs/how-arbitrum-works/deep-dives/{10-l1-to-l2-messaging.mdx => l1-to-l2-messaging.mdx} (100%) rename docs/how-arbitrum-works/deep-dives/{11-l2-to-l1-messaging.mdx => l2-to-l1-messaging.mdx} (100%) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 61fd9bb4ad..db12a0929a 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -81,15 +81,6 @@ Once the transactions are sequenced, they are run through the _state transition Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the state transition function will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions so the state transition function never sees them - and this reduces cost and therefore keeps transactions fees low - but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) - - The state transition function is deterministic, which means that its behavior depends only on the current state and the contents of the next transaction - and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. It follows that anyone who knows the transaction sequence can computate the state transition function for themselves - and all honest parties who do this are guaranteed to get identical results. This is the normal way that Nitro nodes operate: get the transaction sequence, and run the state transition function locally. No consensus mechanism is needed for this. @@ -104,13 +95,11 @@ The Sequencer also publishes its sequence on the L1 Ethereum chain. Periodically The Sequencer's batches are compressed using a general-purpose data compression algorithm called "Brotli", on its highest-compression setting. - ## Geth at the Core @@ -128,12 +117,10 @@ Because the top and bottom layers rely heavily on code from Geth, this structure The State Transition Function consists of the bottom Geth layer, and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox, and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and at the end will emit the header of a new block (in Ethereum's block header format) which will be appended to the Nitro chain. - +::: ## Separating Execution from Proving @@ -530,29 +517,21 @@ When the ticket is redeemed, the pre-packaged transaction runs with sender and o This mechanism is a bit more cumbersome than ordinary L1 to L2 transactions, but it has the advantage that the submission cost is predictable and the ticket will always be available for redemption if the submission cost is paid. As long as there is some user who is willing to redeem the ticket, the L2 transaction will eventually be able to execute and will not be silently dropped. - - ### L2 to L1 ticket-based calls Calls from L2 and L1 operate in a similar way, with a ticket-based system. An L2 contract can call a method of the precompiled ArbSys contract, to send a transaction to L1. When the execution of the L2 transaction containing the submission is confirmed at L1 (some days later), a ticket is created in the L1 outbox contract. The ticket can be triggered by anyone who calls a certain L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. These L2-to-L1 tickets have unlimited lifetime, until they're successfully redeemed. No rent is required, as the tickets (actually a Merkle hash of the tickets) are recorded in Ethereum storage, which does not require rent. (The cost of allocating storage for the ticket Merkle roots is covered by L2 transaction fees.) - +For further reading take a look at the [L2-to-L1-messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) deep dive. ## Gas and Fees @@ -669,10 +648,8 @@ Once the Sequencer has collected enough signatures, it can aggregate the signatu If the Sequencer fails to collect enough signatures within a few minutes, it will abandon the attempt to use the Committee, and will "fall back to rollup" by posting the full data directly to the L1 chain, as it would do in a non-AnyTrust chain. The L2 software can understand both data posting formats (via DACert or via full data) and will handle each one correctly. - diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/04-modified-geth-on-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/04-state-transition-function/modified-geth-on-arbitrum.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/04-modified-geth-on-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/04-state-transition-function/modified-geth-on-arbitrum.mdx diff --git a/docs/how-arbitrum-works/deep-dives/08-anytrust-protocol.mdx b/docs/how-arbitrum-works/deep-dives/anytrust-protocol.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/08-anytrust-protocol.mdx rename to docs/how-arbitrum-works/deep-dives/anytrust-protocol.mdx diff --git a/docs/how-arbitrum-works/deep-dives/10-l1-to-l2-messaging.mdx b/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/10-l1-to-l2-messaging.mdx rename to docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx diff --git a/docs/how-arbitrum-works/deep-dives/11-l2-to-l1-messaging.mdx b/docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/11-l2-to-l1-messaging.mdx rename to docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx From 66212508baa02979dcec060dba0f86b381ca4c19 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 12:44:25 -0500 Subject: [PATCH 10/75] Moved stf/validation-proving docs to deep-dives --- .../01-stf-gentle-intro.mdx | 0 .../01-validation-and-proving.mdx | 0 .../02-rollup-protocol.mdx | 0 .../02-stf-inputs.mdx | 0 .../03-ethereum-vs-arbitrum.mdx | 0 .../03-proving-and-challenges.mdx | 0 .../05-arbos.mdx | 0 .../06-stylus-execution-path.mdx | 0 .../modified-geth-on-arbitrum.mdx | 0 vercel.json | 45 +++++++++++++++++++ 10 files changed, 45 insertions(+) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/01-stf-gentle-intro.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{05-validation-and-proving => }/01-validation-and-proving.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{05-validation-and-proving => }/02-rollup-protocol.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/02-stf-inputs.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/03-ethereum-vs-arbitrum.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{05-validation-and-proving => }/03-proving-and-challenges.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/05-arbos.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/06-stylus-execution-path.mdx (100%) rename docs/how-arbitrum-works/deep-dives/{04-state-transition-function => }/modified-geth-on-arbitrum.mdx (100%) diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/01-stf-gentle-intro.mdx b/docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/01-stf-gentle-intro.mdx rename to docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx diff --git a/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/01-validation-and-proving.mdx b/docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/05-validation-and-proving/01-validation-and-proving.mdx rename to docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx diff --git a/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/02-rollup-protocol.mdx b/docs/how-arbitrum-works/deep-dives/02-rollup-protocol.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/05-validation-and-proving/02-rollup-protocol.mdx rename to docs/how-arbitrum-works/deep-dives/02-rollup-protocol.mdx diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/02-stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/02-stf-inputs.mdx rename to docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/03-ethereum-vs-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/03-ethereum-vs-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx diff --git a/docs/how-arbitrum-works/deep-dives/05-validation-and-proving/03-proving-and-challenges.mdx b/docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/05-validation-and-proving/03-proving-and-challenges.mdx rename to docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/05-arbos.mdx rename to docs/how-arbitrum-works/deep-dives/05-arbos.mdx diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/06-stylus-execution-path.mdx b/docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/06-stylus-execution-path.mdx rename to docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx diff --git a/docs/how-arbitrum-works/deep-dives/04-state-transition-function/modified-geth-on-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/04-state-transition-function/modified-geth-on-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum.mdx diff --git a/vercel.json b/vercel.json index bd62d0131c..191a1ed3e0 100644 --- a/vercel.json +++ b/vercel.json @@ -200,6 +200,51 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/arbos/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/arbos/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/ethereum-vs-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/ethereum-vs-arbitrum/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/modified-geth-on-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stf-gentle-intro/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/stf-gentle-intro/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stf-inputs/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/stf-inputs/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/stylus-execution-path/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/stylus-execution-path/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/proving-and-challenges/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/proving-and-challenges/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/rollup-protocol/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/rollup-protocol/?)", + "permanent": false + }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/validation-and-proving/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/validation-and-proving/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/gas-fees/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", From ea1cd6196cd85b552e6005d57f98325c60fb4967 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 13:10:39 -0500 Subject: [PATCH 11/75] renamed stf-inputs; added admonition to stf-inputs in Inside Arbitrum Nitro --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 6 ++++++ .../deep-dives/{02-stf-inputs.mdx => stf-inputs.mdx} | 0 2 files changed, 6 insertions(+) rename docs/how-arbitrum-works/deep-dives/{02-stf-inputs.mdx => stf-inputs.mdx} (100%) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index db12a0929a..1ade0b9b6e 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -85,6 +85,12 @@ The state transition function is deterministic, which means that its behavior de It follows that anyone who knows the transaction sequence can computate the state transition function for themselves - and all honest parties who do this are guaranteed to get identical results. This is the normal way that Nitro nodes operate: get the transaction sequence, and run the state transition function locally. No consensus mechanism is needed for this. +:::info More information + +For additional reading on STF inputs see the [STF Inputs deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). + +::: + ## How the Sequencer Publishes the Sequence So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed, and batches posted on L1 Ethereum. diff --git a/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx rename to docs/how-arbitrum-works/deep-dives/stf-inputs.mdx From 79d70716e7f9b5180cffe81e761b81cfa81ae842 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 6 Aug 2025 14:01:58 -0500 Subject: [PATCH 12/75] rollup-protocol - Added glossary terms from rollup-protocol - Modified rollup-protocol to remove duplication from Inside Arbitrum Nitro - Left details about assertions that are missing - Renamed rollup-protocol to assertions - Added admonition to Inside Arbitrum Nitro to the assertion deep dive --- .../01-inside-arbitrum-nitro.mdx | 114 ++++---- .../deep-dives/02-rollup-protocol.mdx | 272 ------------------ .../deep-dives/assertions.mdx | 108 +++++++ docs/partials/glossary/_assertion.mdx | 6 + .../glossary/_deterministic-proving.mdx | 13 + docs/partials/glossary/_execution-claim.mdx | 7 + .../glossary/_permissionless_validation.mdx | 7 + .../glossary/_predecessor-assertion.mdx | 7 + .../glossary/_state-transition-function.mdx | 2 +- .../glossary/_trustless-verification.mdx | 9 + 10 files changed, 218 insertions(+), 327 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/02-rollup-protocol.mdx create mode 100644 docs/how-arbitrum-works/deep-dives/assertions.mdx create mode 100644 docs/partials/glossary/_deterministic-proving.mdx create mode 100644 docs/partials/glossary/_execution-claim.mdx create mode 100644 docs/partials/glossary/_permissionless_validation.mdx create mode 100644 docs/partials/glossary/_predecessor-assertion.mdx create mode 100644 docs/partials/glossary/_trustless-verification.mdx diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 1ade0b9b6e..68bccb87e6 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -225,7 +225,7 @@ First, _if you're an Arbitrum user or developer, you don't need to understand th You're welcome to study, observe, and even participate in the rollup protocol, but you don't need to, and most people won't. So if you're a typical train passenger who just wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! -The second thing to understand about the rollup protocol is that _the protocol doesn't decide the tresults of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is done. The role of the rollup protocol is to confirm transaction results that, as far as Arbitrum users are concerned, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) +The second thing to understand about the rollup protocol is that _the protocol doesn't decide the results of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is done. The role of the rollup protocol is to confirm transaction results that, as far as Arbitrum users are concerned, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) You might wonder why we need the rollup protocol. If everyone knows the results of transactions already, why bother confirming them? The rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The whole point of a Layer 2 scaling system is to run transactions without Ethereum needing to do all of the work - and indeed Arbitrum can go fast enough that Ethereum couldn't hope to monitor every Arbitrum transaction. But once a result is confirmed, Ethereum knows about it and can rely on it, enabling operations on Ethereum such as processing withdrawals of funds from Nitro back to L1. @@ -237,33 +237,33 @@ The key security property of the rollup protocol is that any one honest validato ## The Rollup Chain -The rollup protocol tracks a chain of rollup blocks - we'll call these "RBlocks" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of RBlocks as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. +The rollup protocol tracks a chain of rollup blocks - we'll call these "assertions" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. -Validators can propose RBlocks. New RBlocks will be _unresolved_ at first. Eventually every RBlock will be _resolved_, by being either _confirmed_ or _rejected_. The confirmed RBlocks make up the confirmed history of the chain. +Validators can propose assertions. New assertions will be _unresolved_ at first. Eventually every assertion will be _resolved_, by being either _confirmed_ or _rejected_. The confirmed assertions make up the confirmed history of the chain. -Each RBlock contains: +Each assertion contains: -- the RBlock number -- the predecessor RBlock number: RBlock number of the last RBlock before this one that is (claimed to be) correct +- the assertion number +- the predecessor assertion number: assertion number of the last assertion before this one that is (claimed to be) correct - the number of L2 blocks that have been created in the chain's history - the number of inbox messages have been consumed in the chain's history - a hash of the outputs produced over the chain's history -Except for the RBlock number, the contents of the RBlock are all just claims by the RBlock's proposer. Arbitrum doesn't know at first whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the RBlock. If one or more of these fields are incorrect, the protocol should eventually reject the RBlock. +Except for the assertion number, the contents of the assertion are all just claims by the assertion's proposer. Arbitrum doesn't know at first whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the assertion. If one or more of these fields are incorrect, the protocol should eventually reject the assertion. -An RBlock is implicitly claiming that its predecessor RBlock is correct. This implies, transitively, that an RBlock implicitly claims the correctness of a complete history of the chain: a sequence of ancestor RBlock that reaches all the way back to the birth of the chain. +An assertion is implicitly claiming that its predecessor assertion is correct. This implies, transitively, that an assertion implicitly claims the correctness of a complete history of the chain: a sequence of ancestor assertion that reaches all the way back to the birth of the chain. -An RBlock is also implicitly claiming that its older siblings (older RBlocks with the same predecessor), if there are any, are incorrect. If two RBlocks are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. +An assertion is also implicitly claiming that its older siblings (older assertions with the same predecessor), if there are any, are incorrect. If two assertions are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. -The RBlock is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an RBlock is correct, you don't need to do anything. If you disagree with an RBlock, you can post another RBlock with a different result, and you'll probably end up in a challenge against the first RBlock's staker. (More on challenges below.) +The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's staker. (More on challenges below.) In the normal case, the rollup chain will look like this: -On the left, representing an earlier part of the chain's history, we have confirmed RBlocks. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed RBlocks, RBlock 94, is called the "latest confirmed RBlock." On the right, we see a set of newer proposed RBlocks. The protocol can't yet confirm or reject them, because their deadlines haven't run out yet. The oldest RBlock whose fate has yet to be determined RBlock 95, is called the "first unresolved RBlock." +On the left, representing an earlier part of the chain's history, we have confirmed assertions. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed assertions, assertion 94, is called the "latest confirmed assertion." On the right, we see a set of newer proposed assertions. The protocol can't yet confirm or reject them, because their deadlines haven't run out yet. The oldest assertion whose fate has yet to be determined assertion 95, is called the "first unresolved assertion." -Notice that a proposed RBlock can build on an earlier proposed RBlock. This allows validators to continue proposing RBlocks without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed RBlocks will be valid, so they will all eventually be accepted. +Notice that a proposed assertion can build on an earlier proposed assertion. This allows validators to continue proposing assertions without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed assertions will be valid, so they will all eventually be accepted. Here's another example of what the chain state might look like, if several validators are being malicious. It's a contrived example, designed to illustrate a variety of cases that can come up in the protocol, all smashed into a single scenario. @@ -271,62 +271,62 @@ Here's another example of what the chain state might look like, if several valid There's a lot going on here, so let's unpack it. -- RBlock 100 has been confirmed -- RBlock 101 claimed to be a correct successor to RBlock 100, but 101 was rejected (hence the X drawn in it) -- RBlock 102 was eventually confirmed as the correct successor to 100 -- RBlock 103 was confirmed and is now the latest confirmed RBlock -- RBlock 104 was proposed as a successor to RBlock 103, and 105 was proposed as a successor to 104. 104 was rejected as incorrect, and as a consequence 105 was rejected because its predecessor was rejected -- RBlock 106 is unresolved. It claims to be a correct successor to RBlock 103 but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved RBlock -- RBlocks 107 and 108 claim to chain from 106. They are also unresolved. If 106 is rejected, they will be automatically rejected too -- RBlock 109 disagrees with RBlock 106, because they both claim the same predecessor. At least one of them will eventually be rejected, but the protocol hasn't yet resolved them. -- RBlock 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will be automatically rejected too. -- RBlock 111 claims to follow 104. 111 will inevitably be rejected because its predecessor has already been rejected. But it hasn't been rejected yet, because the protocol resolves RBlocks in RBlock number order, so the protocol will have to resolve 106 through 110, in order, before it can resolve 111. After 110 has been resolved, 111 can be rejected immediately. +- assertion 100 has been confirmed +- assertion 101 claimed to be a correct successor to assertion 100, but 101 was rejected (hence the X drawn in it) +- assertion 102 was eventually confirmed as the correct successor to 100 +- assertion 103 was confirmed and is now the latest confirmed assertion +- assertion 104 was proposed as a successor to assertion 103, and 105 was proposed as a successor to 104. 104 was rejected as incorrect, and as a consequence 105 was rejected because its predecessor was rejected +- assertion 106 is unresolved. It claims to be a correct successor to assertion 103 but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved assertion +- assertions 107 and 108 claim to chain from 106. They are also unresolved. If 106 is rejected, they will be automatically rejected too +- assertion 109 disagrees with assertion 106, because they both claim the same predecessor. At least one of them will eventually be rejected, but the protocol hasn't yet resolved them. +- assertion 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will be automatically rejected too. +- assertion 111 claims to follow 104. 111 will inevitably be rejected because its predecessor has already been rejected. But it hasn't been rejected yet, because the protocol resolves assertions in assertion number order, so the protocol will have to resolve 106 through 110, in order, before it can resolve 111. After 110 has been resolved, 111 can be rejected immediately. -Again: this sort of thing is very unlikely in practice. In this diagram, at least four parties must have staked on wrong RBlocks, adn when the dust settles at least four parties will have lost their stakes. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram is designed to illustrate the variety of situations that are possible in principle, and how the protocol would deal with them. +Again: this sort of thing is very unlikely in practice. In this diagram, at least four parties must have staked on wrong assertions, adn when the dust settles at least four parties will have lost their stakes. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram is designed to illustrate the variety of situations that are possible in principle, and how the protocol would deal with them. ### Staking At any given time, some validators will be stakers, and some will not. Stakers deposit funds that are held by the Arbitrum Layer 1 contracts and will be confiscated if the staker loses a challenge. Nitro chains accept stakes in `ETH`. -A single stake can cover a chain of RBlocks. Every staker is staked on the lastest confirmed RBlock; and if you're staked on an RBlock, you can also stake on one successor of that RBlock. So you might be staked on a sequence of RBlocks that represent a single coherent claim about the correct history of the chain. A single stake suffices to commit you to that sequence of RBlocks. +A single stake can cover a chain of assertions. Every staker is staked on the lastest confirmed assertion; and if you're staked on an assertion, you can also stake on one successor of that assertion. So you might be staked on a sequence of assertions that represent a single coherent claim about the correct history of the chain. A single stake suffices to commit you to that sequence of assertions. -In order to create a new RBlock, you must be a staker, and you must already be staked on the predecessor of the new RBlock you're creating. The stake requirement for RBlock creation ensures that anyone who creates a new RBlock has something to lose if that RBlock is eventually rejected. +In order to create a new assertion, you must be a staker, and you must already be staked on the predecessor of the new assertion you're creating. The stake requirement for assertion creation ensures that anyone who creates a new assertion has something to lose if that assertion is eventually rejected. The protocol keeps track of the current required stake amount. Normally this will equal the base stake amount, which is a parameter of the Nitro chain. But if the chain has been slow to make progress lately, the required stake will increase, as described in more detail below. The rules for staking are as follows: -- If you're not staked, you can stake on the latest confirmed RBlock. When doing this, you deposit the current minimum stake amount. -- If you're staked on an RBlock, you can also add your stake to any one successor of that RBlock. (The protocol tracks the maximum RBlock number you're staked on, and let's you add your stake to any successor of that RBlock, updating your maximum to that successor.) This doesn't require you to place a new stake. - - A special case of adding your stake to a successor RBlock is when you create a new RBlock as a successor to an RBlock you're already staked on. -- If you're staked only on the latest confirmed RBlock (and possibly earlier RBlocks), you or anyone else can ask to have your stake refunded. Your staked funds will be returned to you, and you will no longer be a staker. -- If you lose a challenge, your stake is removed from all RBlocks and you forfeit your staked funds. +- If you're not staked, you can stake on the latest confirmed assertion. When doing this, you deposit the current minimum stake amount. +- If you're staked on an assertion, you can also add your stake to any one successor of that assertion. (The protocol tracks the maximum assertion number you're staked on, and let's you add your stake to any successor of that assertion, updating your maximum to that successor.) This doesn't require you to place a new stake. + - A special case of adding your stake to a successor assertion is when you create a new assertion as a successor to an assertion you're already staked on. +- If you're staked only on the latest confirmed assertion (and possibly earlier assertions), you or anyone else can ask to have your stake refunded. Your staked funds will be returned to you, and you will no longer be a staker. +- If you lose a challenge, your stake is removed from all assertions and you forfeit your staked funds. -Notice that once you are staked on an RBlock, there is no way to unstake. You are committed to that RBlock. Eventually one of two things will happen: that RBlock will be confirmed, or you will lose your stake. The only way to get your stake back is to wait until all of the RBlocks you are staked on are confirmed. +Notice that once you are staked on an assertion, there is no way to unstake. You are committed to that assertion. Eventually one of two things will happen: that assertion will be confirmed, or you will lose your stake. The only way to get your stake back is to wait until all of the assertions you are staked on are confirmed. #### Setting the current minimum stake amount -One detail we deferred earlier is how the current minimum stake amount is set. Normally, this is just equal to the base stake amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming RBlocks, the stake requirement will escalate temporarily. Specifically, the base stake amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved RBlock passed. This ensures that if malicious parties are placing false stakes to try to delay progress (despite the fact that they're losing those stakes), the stake requirement goes up so that the cost of such a delay attack increases exponentially. As RBlock resolution starts advancing again, the stake requirement will go back down. +One detail we deferred earlier is how the current minimum stake amount is set. Normally, this is just equal to the base stake amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming assertions, the stake requirement will escalate temporarily. Specifically, the base stake amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved assertion passed. This ensures that if malicious parties are placing false stakes to try to delay progress (despite the fact that they're losing those stakes), the stake requirement goes up so that the cost of such a delay attack increases exponentially. As assertion resolution starts advancing again, the stake requirement will go back down. -### Rules for Confirming or Rejecting RBlocks +### Rules for Confirming or Rejecting assertions -The rules for resolving RBlocks are fairly simple. -The first unresolved RBlock can be confirmed if: +The rules for resolving assertions are fairly simple. +The first unresolved assertion can be confirmed if: -- the RBlock's predecessor is the latest confrimed RBlock, and -- the RBlock's deadline has passed, and +- the assertion's predecessor is the latest confrimed assertion, and +- the assertion's deadline has passed, and - there is at least one staker, and -- all stakers are staked on the RBlock +- all stakers are staked on the assertion -The first unresolved RBlock can be rejected if: +The first unresolved assertion can be rejected if: -- the RBlock's predecessor has been rejected, or +- the assertion's predecessor has been rejected, or - all the following are true: - - the RBlock's deadline has passed, and + - the assertion's deadline has passed, and - there is at least one staker, and - - no staker is staked on the RBlock + - no staker is staked on the assertion -A consequence of these rules is that once the first unresolved RBlock's deadline has passed (and assuming there is at least one staker staked on something other than the latest confirmed RBlock), the only way the RBlock can be unresolvable is if at least one staker is staked on it and at least one staker is staked on a different RBlock with the same predecessor. If this happens, the two stakers are disagreeing about which RBlock is correct. It's time for a challenge, to resolve the disagreement. +A consequence of these rules is that once the first unresolved assertion's deadline has passed (and assuming there is at least one staker staked on something other than the latest confirmed assertion), the only way the assertion can be unresolvable is if at least one staker is staked on it and at least one staker is staked on a different assertion with the same predecessor. If this happens, the two stakers are disagreeing about which assertion is correct. It's time for a challenge, to resolve the disagreement. + ArbOS is a trusted "system glue" component that acts as the hypervisor and facilitates the State Transition Function (execution environment) on the child chain. ArbOS provides functions needed for a Layer 2 system, such as cross-chain communication, resource accounting and Layer 2 related fee economics, and chain management. ### Why ArbOS? @@ -444,6 +446,8 @@ In Arbitrum, much of the work that would otherwise have to be done expensively a Supporting these functions in Layer 2 trusted software, rather than building them in to the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. Having a trusted operating system at Layer 2 also has significant advantages in flexibility, because Layer 2 code is easier to evolve, or to customize for a particular chain, then a Layer-1 enforced architecture would be. + + ArbOS also provides child chain-specific precompiles with methods smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available in Arbitrum chains. ## Full Nodes diff --git a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx index 9813733c03..0358465009 100644 --- a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx @@ -7,6 +7,8 @@ user_story: As a current or prospective Arbitrum user, I need learn more about N content_type: get-started --- + + ## Precompiles A precompile consists of a Solidity interface in `contracts/src/precompiles/` and a corresponding Golang implementation in `precompiles/`. Using Geth's ABI generator, `solgen/gen.go` generates `solgen/go/precompilesgen/precompilesgen.go`, which collects the ABI data of the precompiles. The [runtime installer](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L379) uses this generated file to check the type safety of each precompile's implementer. @@ -17,37 +19,7 @@ Completion of calling, dispatching, and recording of precompile methods occurs v Each time a transaction calls a method of a child chain-specific precompile, a [`call context`](https://github.com/OffchainLabs/nitro/blob/f11ba39cf91ee1fe1b5f6b67e8386e5efd147667/precompiles/context.go#L26) gets created to track and record the gas burnt. For convenience, it also provides access to the public fields of the underlying [`TxProcessor`](https://github.com/OffchainLabs/nitro/blob/8e786ec6d1ac3862be85e0c9b5ac79cbd883791c/arbos/tx_processor.go#L38). Because sub-transactions could revert without updates to this struct, the `TxProcessor` only makes public what is safe, such as the amount of parent chain calldata paid by the top-level transaction. -## Precompile descriptions - -- `ArbAggregator`: Provides methods for configuring transaction aggregation. The Arbitrum One Sequencer is the default aggregator unless changed by users. The precompile manages fee collection and batch posters for chain aggregation. - -- `ArbGasInfo`: Retrieves various gas-related statistics, including gas prices in both `wei` and `Ink`, parent chain gas price estimates, transaction fees, and congestion metrics. It is crucial in estimating transaction costs and adjusting gas pricing dynamically. - -- `ArbRetryableTx`: Handles retryable transactions, enabling parent-to-child messaging with delayed execution. The precompile manages retryables, checks expiration times, extends their lifetime, and cancels pending retryables. - -- `ArbSys`: Provides system-level utilities for interacting with the Arbitrum chain. It exposes methods to retrieve chain-specific information such as block numbers, chain IDs, and gas availability. It also supports child-to-parent messaging and contract aliasing. - -- `ArbWasm`: Facilitates the deployment and management of Stylus contracts on Arbitrum Nitro. It provides lifecycle management for WASM-based programs, including activation, expiration handling, memory footprint calculation, and version tracking. - -- `ArbWasmCache`: Manages Stylus caching mechanisms. It allows chain owners or designated managers to cache WASM programs for efficient execution, reduce computation costs, and improve call performance. - -- `ArbAddressTable`: Implements a compression scheme for frequently used addresses, allowing smart contracts to reference addresses using shorter representations, thus reducing calldata costs. - -- `ArbBLS` (disabled): Previously used for registering BLS public keys but is deprecated in Nitro. - -- `ArbDebug`: A debugging tool enabled by the `AllowDebugPrecompiles` flag. It provides mechanisms to emit test events, trigger reverts, and panic the chain for testing purposes. - -- `ArbFunctionTable` (no longer used): Originally designed to assist with function table compression, but is now deprecated in Nitro. - -- `ArbInfo`: Retrieves account information, including balances and deployed contract code, providing a lightweight alternative to calling `eth_getCode` or `eth_getBalance`. - -- `ArbOwner`: Allows chain owners to manage key network parameters, including gas pricing, scheduling upgrades, and setting various chain limits. The precompile is only accessible to chain owners. - -- `ArbOwnerPublic`: A read-only version of `ArbOwner` that allows users to query information about current chain owners and governance settings. - -- `ArbosTest` (legacy): A historical precompile used for burning arbitrary amounts of gas. It has limited utility in Nitro. - -- `ArbStatistics`: Provides historical data about the chain's state before the Nitro upgrade. Most functions that required this precompile in Arbitrum Classic now have better alternatives. +For a complete list of precompiles refer to the [precompile references](/build-decentralized-apps/precompiles/02-reference.mdx). ## Messages @@ -78,6 +50,8 @@ In addition to supporting the [`ArbAggregator precompile`](/build-decentralized- Based on this information, ArbOS maintains a parent chain data fee, which is also tracked as part of this state, determining how much transaction fees will cost for parent chain fees. ArbOS dynamically adjusts this value so that fees collected are approximately equal to batch posting costs. + + ## Parent chain pricing model Efficient handling of parent chain gas costs is crucial for the Arbitrum network's scalability and economic sustainability. The Sequencer implements a dynamic parent chain pricing model to ensure that fees collected from transactions closely match the actual costs incurred when posting data to the parent chain. This section details the challenges in pricing parent chain resources, how fees are collected and allocated, and how the system adjusts to maintain equilibrium over time. From e607011e49bdbca5662d109fec0661bb6bd565e5 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 7 Aug 2025 07:46:50 -0500 Subject: [PATCH 16/75] redirects --- .../data-availability.mdx} | 0 sidebars.js | 10 +++++----- vercel.json | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) rename docs/{how-arbitrum-works/deep-dives/12-data-availability.mdx => run-arbitrum-node/data-availability.mdx} (100%) diff --git a/docs/how-arbitrum-works/deep-dives/12-data-availability.mdx b/docs/run-arbitrum-node/data-availability.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/12-data-availability.mdx rename to docs/run-arbitrum-node/data-availability.mdx diff --git a/sidebars.js b/sidebars.js index 107f5e85d7..9d88f37810 100644 --- a/sidebars.js +++ b/sidebars.js @@ -821,6 +821,11 @@ const sidebars = { id: 'run-arbitrum-node/l1-ethereum-beacon-chain-rpc-providers', label: 'L1 Ethereum RPC providers', }, + { + type: 'doc', + id: 'run-arbitrum-node/data-availability', + label: 'Data Availability', + }, { type: 'html', value: @@ -1075,11 +1080,6 @@ const sidebars = { id: 'how-arbitrum-works/gas-fees', label: 'Gas and fees', }, - { - type: 'doc', - id: 'how-arbitrum-works/data-availability', - label: 'Data Availability', - }, { type: 'link', href: 'https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf', diff --git a/vercel.json b/vercel.json index 191a1ed3e0..5da6b13d4b 100644 --- a/vercel.json +++ b/vercel.json @@ -200,6 +200,11 @@ "destination": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/data-availability/?)", + "destination": "/(docs/run-arbitrum-node/data-availability/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/arbos/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/arbos/?)", From fc13589c8d9f2e42c30b9a98ee8919dce52ee4d7 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 7 Aug 2025 07:53:25 -0500 Subject: [PATCH 17/75] removed stylus-execution-path; included content in arbos with a new section --- .../deep-dives/05-arbos.mdx | 71 ++++++++++++ .../deep-dives/06-stylus-execution-path.mdx | 109 ------------------ 2 files changed, 71 insertions(+), 109 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx diff --git a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx index 0358465009..88509debec 100644 --- a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx @@ -377,3 +377,74 @@ The security of Nitro chains depends on the assumption that when one Stylus integrates into the State Transition Function (STF), covering execution flow, messaging handling, caching, and interactions with ArbOS and Geth. + +### 1. Execution flow of a Stylus transaction + +When a Transaction interacts with a Stylus contract, its execution follows a distinct path compared to EVM transactions: + +- **Transaction submission and routing** + - The transaction is included in a child chain block by the Sequencer. + - Geth processes the transaction and determines its target contract. + - If the target is a Stylus contract, ArbOS routes execution to the WASM runtime instead of the EVM. +- **Stylus execution within ArbOS** + - ArbOS retrieves the Stylus program from its cache (`stylus/src/cache.rs`) or loads it from storage if not cached. + - The WebAssembly System Interface (Go-WASI) initializes a secure execution environment. + - The WASM module executes within ArbOS, processing instructions efficiently and calling host I/O functions. +- **Host I/O operations for blockchain state access** + - Stylus contracts do not use EVM opcodes. Instead, they interact with the blockchain through host I/O calls handled by ArbOS. + - These include storage access (`TLOAD` `TSTORE`), arithmetic operations (`MULMOD`, `ADDMOD`), and context retrieval (`GETCALLER`, `GETCALLVALUE`). + - ArbOS ensures these operations are efficient and compatible with Ethereum's state model. + - **State commitment and finalization** + - Once execution is complete, ArbOS finalizes storage changes and updates logs and receipts. + - Geth processes the final transaction result and commits it to the state tree. + +This process bypasses the EVM interpreter entirely, allowing Stylus contracts to execute significantly faster than their Solidity counterparts. + +### 2. Stylus caching and gas pricing + +- **Stylus gas pricing model** + Unlike standard EVM gas pricing, Stylus pricing follows a multi-dimensional cost model, incorporating: + - **Ink cost (memory and execution cost)** + - Measure in `Ink` units (Stylus's equivalent of computational gas). + - `Ink` pricing varies based on execution complexity, memory usage, and computation steps. + - Complex WASM operations consume more `Ink`, directly impacting execution costs. + - **Opcode pricing** + - WASM instructions are assigned individual execution costs similar to EVM opcodes. + - Heavy computation opcodes are priced higher. + - Cheap opcodes (e.g., simple arithmetic, bitwise operations) have minimal costs. + - **Host I/O pricing** + - Stylus introduces fine-grained pricing for different I/O calls: + - **Storage read/writes**: Priced based on access pattern and data size. + - **Precompile calls**: Stylus-specific precompiles have fixed execution costs. + - **External calls to EVM contracts**: Encapsulated within ArbOS transaction handling, with additional gas considerations. + +#### Stylus caching + +Stylus contracts leverage an advanced caching system to minimize execution overhead within ArbOS: + +- **LRU (Least Recently Used) caching**: Keeps the most recently accessed Stylus contracts in memory for fast execution. +- **Persistent long-term caching**: Caching for selected contracts may occur across blocks based on an economic auction model. +- **Init costs and execution pricing**: Instead of a flat gas cost, Stylus contracts have dynamic execution costs based on WASM complexity. ArbOS maintains pricing parameters (`initCost`, `cachedCost`) that adjust based on future optimizations in WASM execution. + +### 3. Interaction with ArbOS and Geth + +| Execution Stage | Handled By | +| ---------------------- | --------------------------------------------------------- | +| Transaction submission | **Geth** (identifies target contract) | +| Stylus execution | **ArbOS** (switches to WASM runtime) | +| Host I/O calls | **ArbOS** (handles storage, call data, context retrieval) | +| State commitment | **Geth and ArbOS** (finalizes updates, commits to state) | + +### 4. Go-WASI and co-threads in Stylus execution + +ArbOS executes Stylus contracts using Go-WASI, a WASM-compatible runtime with custom optimizations for Arbitrum. Key features include: + +- **Memory management**: WASM modules execute in a sandboxed environment with strict memory allocation policies. +- **Co-threads for efficient execution**: Instead of traditional synchronous execution, Stylus employs co-threading, enabling lightweight task switching and parallelism where possible. +- **Deterministic execution**: Ensures that Stylus contracts remain fully deterministic and compatible with Ethereum's consensus model. + +These optimizations make Stylus an extremely efficient execution environment, capable of outperforming the EVM while maintaining security and compatibility with Ethereum's state model. diff --git a/docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx b/docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx deleted file mode 100644 index 8f18cdd560..0000000000 --- a/docs/how-arbitrum-works/deep-dives/06-stylus-execution-path.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: 'Stylus execution path' -description: 'Learn the fundamentals of Nitro, Arbitrum stack.' -author: petevielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. -content_type: get-started ---- - -This article details how Stylus integrates into the State Transition Function (STF), covering execution flow, messaging handling, caching, and interactions with ArbOS and Geth. - -## 1. Execution flow of a Stylus transaction - -When a Transaction interacts with a Stylus contract, its execution follows a distinct path compared to EVM transactions: - -### Transaction submission and routing - -- The transaction is included in a child chain block by the Sequencer. - -- Geth processes the transaction and determines its target contract. - -- If the target is a Stylus contract, ArbOS routes execution to the WASM runtime instead of the EVM. - -### Stylus execution within ArbOS - -- ArbOS retrieves the Stylus program from its cache (`stylus/src/cache.rs`) or loads it from storage if not cached. - -- The WebAssembly System Interface (Go-WASI) initializes a secure execution environment. - -- The WASM module executes within ArbOS, processing instructions efficiently and calling host I/O functions. - -### Host I/O operations for blockchain state access - -- Stylus contracts do not use EVM opcodes. Instead, they interact with the blockchain through host I/O calls handled by ArbOS. - -- These include storage access (`TLOAD` `TSTORE`), arithmetic operations (`MULMOD`, `ADDMOD`), and context retrieval (`GETCALLER`, `GETCALLVALUE`). - -- ArbOS ensures these operations are efficient and compatible with Ethereum's state model. - -#### State commitment and finalization - -- Once execution is complete, ArbOS finalizes storage changes and updates logs and receipts. - -- Geth processes the final transaction result and commits it to the state tree. - -This process bypasses the EVM interpreter entirely, allowing Stylus contracts to execute significantly faster than their Solidity counterparts. - -## 2. Stylus caching and gas pricing - -### Stylus gas pricing model - -Unlike standard EVM gas pricing, Stylus pricing follows a multi-dimensional cost model, incorporating: - -- **Ink cost (memory and execution cost)** - - - Measure in `Ink` units (Stylus's equivalent of computational gas). - - - `Ink` pricing varies based on execution complexity, memory usage, and computation steps. - - - Complex WASM operations consume more `Ink`, directly impacting execution costs. - -- **Opcode pricing** - - - WASM instructions are assigned individual execution costs similar to EVM opcodes. - - - Heavy computation opcodes are priced higher. - - - Cheap opcodes (e.g., simple arithmetic, bitwise operations) have minimal costs. - -- **Host I/O pricing** - - - Stylus introduces fine-grained pricing for different I/O calls: - - - **Storage read/writes**: Priced based on access pattern and data size. - - - **Precompile calls**: Stylus-specific precompiles have fixed execution costs. - - - **External calls to EVM contracts**: Encapsulated within ArbOS transaction handling, with additional gas considerations. - -### Stylus caching - -Stylus contracts leverage an advanced caching system to minimize execution overhead within ArbOS: - -- **LRU (Least Recently Used) caching**: Keeps the most recently accessed Stylus contracts in memory for fast execution. - -- **Persistent long-term caching**: Caching for selected contracts may occur across blocks based on an economic auction model. - -- **Init costs and execution pricing**: Instead of a flat gas cost, Stylus contracts have dynamic execution costs based on WASM complexity. ArbOS maintains pricing parameters (`initCost`, `cachedCost`) that adjust based on future optimizations in WASM execution. - -## 3. Interaction with ArbOS and Geth - -| Execution Stage | Handled By | -| ---------------------- | --------------------------------------------------------- | -| Transaction submission | **Geth** (identifies target contract) | -| Stylus execution | **ArbOS** (switches to WASM runtime) | -| Host I/O calls | **ArbOS** (handles storage, call data, context retrieval) | -| State commitment | **Geth and ArbOS** (finalizes updates, commits to state) | - -## 4. Go-WASI and co-threads in Stylus execution - -ArbOS executes Stylus contracts using Go-WASI, a WASM-compatible runtime with custom optimizations for Arbitrum. Key features include: - -- **Memory management**: WASM modules execute in a sandboxed environment with strict memory allocation policies. - -- **Co-threads for efficient execution**: Instead of traditional synchronous execution, Stylus employs co-threading, enabling lightweight task switching and parallelism where possible. - -- **Deterministic execution**: Ensures that Stylus contracts remain fully deterministic and compatible with Ethereum's consensus model. - -These optimizations make Stylus an extremely efficient execution environment, capable of outperforming the EVM while maintaining security and compatibility with Ethereum's state model. From e882a9c8a0e01c63c50b7e229c7ca1fe8032b978 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 7 Aug 2025 07:54:42 -0500 Subject: [PATCH 18/75] removed gentle intros for stf, validation and proving --- .../deep-dives/01-stf-gentle-intro.mdx | 36 ------------------- .../deep-dives/01-validation-and-proving.mdx | 22 ------------ 2 files changed, 58 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx delete mode 100644 docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx diff --git a/docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx b/docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx deleted file mode 100644 index 1339fcb306..0000000000 --- a/docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: 'A gentle introduction' -description: 'Learn the fundamentals of Nitro, Arbitrum stack.' -author: petevielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. -content_type: get-started ---- - -A State Transition Function (STF) is a core mechanism in blockchain systems that defines how the system evolves from one state to another when transactions are processed. At its essence, the STF takes the current state of the blockchain–a comprehensive snapshot of account balances, smart contract data, and other ledger information–and an input (such as a transaction or a block of transactions) and deterministically computes the new state. This deterministic property is crucial because it ensures that all nodes in a decentralized network arrive at the same result when applying transactions, thereby maintaining consensus across the system. - -With Arbitrum, the STF plays an even more pivotal role. Offchain transactions are executed in batches according to this function, with the STF periodically submitting a concise summary of changes to the parent chain. This approach leverages offchain computation to boost throughput and reduce gas costs while anchoring the process to Ethereum's robust security model. To safeguard against incorrect or malicious offchain execution, Arbitrum employs a challenge mechanism known as fraud proofs. If a dispute arises, the STF can be recomputed step-by-step onchain, enabling the network to verify the validity of the offchain computations and ensure that the errors or fraudulent behavior are detected and rectified. - -Beyond these foundational aspects, the STF on the Arbitrum Nitro Stack closely mirrors Ethereum's STF in its overall structure but incorporates several key modifications to accommodate the unique requirements of the Arbitrum chain. Essentially, the function receives a sequence of ordered transactions as its input, applies a defined set of rules to these inputs, and produces a new final state that reflects all the updates from the batch of transactions. - -With the introduction of Stylus, Arbitrum expands its execution model beyond the Ethereum Virtual Machine (EVM) by adding WebAssembly (WASM)–based smart contract execution. This enhancement allows high-performance smart contracts written in Rust, C, and C++ to run alongside traditional EVM contracts. The integration of Stylus introduces several modifications to the STF, including: - -### Stylus-specific transaction processing - -A modified version of Geth that recognizes and processes Stylus transactions, ensuring proper inclusion in state transitions. - -### Execution in a WASM runtime - -Stylus transactions execute in ArbOS's WASM runtime instead of the EVM, enabling faster execution and more efficient computation. - -### Stylus gas accounting and pricing - -Unlike standard EVM transactions, Stylus transactions introduce new gas pricing models that account for factors such as opcode pricing, host I/O operations, and Ink usage costs. - -### Interoperability with the EVM - -Stylus contracts can interact seamlessly with Solidity contracts, enabling hybrid applications that leverage EVM and WASM execution environments. - -These Stylus-related changes aim to maintain compatibility with Ethereum's execution model while introducing a more efficient, flexible, and scalable alternative for smart contract development. - -In the following sections, we will explain what these inputs are and how Arbitrum nodes receive them. We will also discuss the rules implemented in the Arbitrum Nitro Stack's STF, highlighting the differences between how state transitions occur in Ethereum, Arbitrum, and Stylus-based execution environments. Stylus-specific execution tasks handled within ArbOS will be covered separately, focusing on host I/O operations, caching, and WASM memory management. diff --git a/docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx b/docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx deleted file mode 100644 index bc55188bed..0000000000 --- a/docs/how-arbitrum-works/deep-dives/01-validation-and-proving.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Validation and Proving Mechanisms -description: 'Learn the fundamentals of validation and proving mechanisms on Arbitrum.' -author: pete-vielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need to learn more about validation and proving mechanisms. -content_type: get-started ---- - -The validation and proving mechanism in Arbitrum ensures the integrity of offchain execution while maintaining Ethereum's security guarantees. As an Optimistic Rollup, Arbitrum assumes that transactions execute correctly unless challenged. Arbitrum employs interactive fraud proofs to resolve conflicts efficiently, if a dispute arises. - -At the core of Arbitrum's validation model is the separation of execution and proving: transactions execute optimistically, while state transitions can be verified onchain if necessary. Arbitrum achieves this through WAVM (WebAssembly for Arbitrum Virtual Machine), a modified WASM format optimized for proving, and the BoLD dispute protocol, which resolves disagreements using an interactive, multi-round challenge system. - -This section will explore two primary topics: - -## [Rollup protocol and validation](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx) - -Reviews how Arbitrum records and validates transactions, the role of validators, and the mechanics of state confirmations. - -## [Proving and challenge protocols](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx) - -Discusses how the protocol handles resolving disputes using interactive proofs and narrowing conflicts down to a single execution step. From 9e6d2896b513c652efbae91a5d3a1f43c3af76de Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 7 Aug 2025 09:10:03 -0500 Subject: [PATCH 19/75] Removed proving and challenges; dup content; opcodes for WAVM seems like granular detail --- .../deep-dives/03-proving-and-challenges.mdx | 444 ------------------ 1 file changed, 444 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx diff --git a/docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx b/docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx deleted file mode 100644 index 64ef819cf3..0000000000 --- a/docs/how-arbitrum-works/deep-dives/03-proving-and-challenges.mdx +++ /dev/null @@ -1,444 +0,0 @@ ---- -title: Proving and Challenge Protocol -description: 'Learn the fundamentals of the Arbitrum proving and challenge protocols' -author: pete-vielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need to learn more about the Arbitrum proving and challenge protocols. -content_type: get-started ---- - -import ImageZoom from '@site/src/components/ImageZoom'; - -This document details the mechanisms for proving correct execution and resolving disputes in the Rollup Protocol. It explains how the system separates ordinary execution from proving, transforms WASM into a specialized proving format (WAVM), and employs interactive fraud proofs to resolve disputes efficiently. - -## 1. Separating execution from proving - - - -One of the key challenges in designing a practical Rollup system is balancing fast, ordinary execution with the need for reliable proofs of that execution. Nitro addresses this challenge by using the same source code for both purposes but compiling it to different targets: - -- **Execution compilation**: - - The [Nitro node software](https://github.com/OffchainLabs/nitro) is compiled with the ordinary Go compiler into native code for the target architecture. - - This native binary is distributed as source code and as a Docker image, making it deployable on various nodes. -- **Proving compilation**: - - For proving, only the portion of the code that is the State Transition Function (STF) gets compiled by the Go compiler into WebAssembly (WASM). - - The generated WASM code transforms into a specialized format called WAVM. - - In any dispute regarding the STF, the WAVM code is referenced to resolve the correct result. - -## 2. WAVM: A specialized proving format - -WAVM is a modified version of WASM designed to meet the needs of fraud proofs. The following features describe it: - -- **Portability and Structure**: - - WASM was selected because it is portable, well-specified, and supported by robust tools. -- **Modifications made in WAVM**: - - **Removal of unused features**: - - WAVM removes some WASM features that the Go compiler never generates. The transformation phase ensures these features are absent. - - **Restrictions on certain features**: - - Floating-point instructions: WAVM does not contain floating-point instructions. Instead, any floating-point operations get replaced by calls to the Berkeley SoftFloat library. - - Rationale: Using software floating-point libraries reduces the risk of incompatibilities between different architecture. - - **Nested control flow**: - - WAVM flattens control flow constructs by converting them into jump instructions. - - **Variable-time instructions**: - -Some instructions in WASM may take a variable amount of time to execute. WAVM transforms these into constructs with fixed-cost instructions to simplify proving. - - **Additional opcodes for blockchain interaction**: - - WAVM adds new opcodes to enable the code to interact with the blockchain environment. - - For example, new instructions allow the WAVM code to read and write the chain's global state, retrieve the next message from the chain's inbox, or signal a successful end to the STF execution. - -## 3. `ReadPreImage` and the hash oracle trick - -An interesting instruction in WAVM is `ReadPreImage`, which the "hash oracle trick" uses. This mechanism works as follows: - -- **Functionality of `ReadPreImage`**: - - **Input**: A hash `H` and an offset `I`. - - **Output**: The word of data at offset `I` in the preimage of `H` along with the number of bytes written (zero if `I` is at or beyond the end). -- **Constraints for safety**: - - Generating a preimage for an arbitrary hash is infeasible. Therefore, the instruction is allowed only when: - - The preimage is publicly known - - The preimage's size is known to be less than a fixed upper bound (approximately 110 kbytes). -- **Usage examples in Nitro**: - - **State tree access**: - - Nitro's state tree is stored offchain as a Merkle tree, with nodes indexed by their Merkle hashes. - - The STF only stores the root hash but can retrieve any node's contents using `ReadPreImage`. - - **Block headers**: - - The instruction fetches recent publicly known child chain block headers of bounded size. - -:::info Historical Note - -This "hash oracle trick" originates from the original Arbitrum design, where the Merkle hash of a data structure is stored and full contents are retrievable on demand. - -::: - -## 4. Resolving disputes using interactive fraud proofs - -Disputes resolution in Optimistic Rollups is a critical design decision. The protocol must decide which execution version is correct when two parties disagree. - -### 4.1 Overview of dispute resolution - -- **Optimistic Rollups**: - - Assume that assertions about execution are correct unless challenged. -- **Dispute Resolution Options**: - - **Interactive proving**: - - Parties engage in a challenge game to narrow down the dispute executed steps. - - **Re-executing transactions**: - - The parent chain re-executes transactions, checking each state transition. - -:::note - -Zero-knowledge Rollups avoid the dispute situation by directly proving correctness via ZK proofs. - -::: - -### 4.2 Interactive proving - -Arbitrum favors interactive proving due to its efficiency and flexibility. - - - -#### The interactive proving process - -1. **Initial claim and dispute start**: - - Suppose Alice claims that the chain will produce a specific result. Bob disagrees. -2. **Bisection of the dispute**: - - **First round**: - - Alice posts an assertion covering `N` steps. - - Bob challenges the assertion. - - Alice then provides two sub-assertions, each covering `N/2` steps. - - **Subsequent rounds**: - - Bob chooses one half to challenge, and the process repeats––halving the disputed steps until only a single instruction remains. -3. **Final one-step proof**: - - Once the dispute narrows to a single execution step, the parent chain referee verifies that one-step claim. - -#### Simplified bisection protocol - -- **Step-by-step breakdown**: - - Alice provides a commitment to the entire computation history. - - She bisects her claim into two halves. - - Bob selects the half he disputes. - - This iteration of the bisection continues until the dispute reaches a single instruction. - -#### Why bisection correctly identifies a cheater - -1. **If Alice's claim is correct**: - - Every bisection provides truthful intermediate states. - - Bob's challenge eventually leads to a correct one-step proof, allowing Alice to win. -2. **If Alice's claim is incorrect**: - - One of Alice's halves will be false at some bisection. - - Bob can always choose the incorrect half, ultimately forcing an incorrect one-step proof that is not verifiable. - - Thus, an honest party will always be able to challenge a dishonest claim. - -### 4.3 Re-executing transactions (alternative approach) - -- **Mechanism**: - - Each transaction would include a state hash after its execution. - - In case of a dispute, the parent chain would re-execute every transaction to verify the correctness. -- **Drawbacks**: - - Requires a state claim for every transaction, increasing computational load. - - In a dispute, the entire transaction must be re-executed onchain, leading to high gas costs. - -:::info - -Interactive proving is more efficient in optimistic and pessimistic cases, as it minimizes onchain computation and adapts to Ethereum's gas limits. - -::: - -## 5. Interactive fraud proofs and the challenge protocol - -Interactive fraud proofs form the basis for resolving proposer disputes when conflicting assertions are made. - -### 5.1 Dispute scenario - -- **Example setup**: - - Suppose the Rollup chain includes assertions 93 and 95, which are siblings (both following assertion 92). - - Alice is bonded on assertion 93, while Bob is bonded on assertion 95. - - Bob's bonding on 95 implies that assertion 93 must be incorrect. -- **Initiation of the challenge**: - - An interactive challenge is initiated automatically when two proposers place bonds on sibling assertions. - - Multiple assertions may participate in a single challenge. - - The protocol records and referees the challenge and eventually declares a winner, confiscating the bonds of the losing parties and removing them as proposers. - -### 5.2 The two-phase challenge game - -1. **Bisection phase**: - - The goal is to narrow the dispute to a single execution step. - - At each stage, claims are bisected into smaller segments (first over child chain blocks, then over "big steps" of 2²⁶ instructions, and finally to a single instruction). - - The parent chain referee only checks that the moves have "the right shape" (e.g., that the bisection was performed correctly) without evaluating the correctness of execution. -2. **One-step proof phase**: - - Once the dispute reduces to one instruction, any player can initiate the one-step proof. - - The parent chain executes the disputed instruction using the proof data provided. - - If the one-step proof is correct, the disputed edge is confirmed, and the challenges resolves. - -### 5.3 Efficiency considerations - -- **Optimistic case**: - - Interactive proving allows a single assertion to cover all transactions in a block. -- **Pessimistic case**: - - Only one instruction is re-executed onchain during a dispute. -- **Gas limits**: - - The interactive proving model can work with higher per-transaction gas limits since most work is done offchain. -- **Implementation flexibility**: - - The system only requires verification a one-step proof onchain, rather than full transaction re-execution. - -### 5.4 `ChallengeManager`: The arbiter - - - -- **Role**: - - The `ChallengeManager` contract arbitrates the challenge game. - - It tracks assertion histories, timers, and state commitments. -- **State machine**: - - A state machine represents the challenge with several distinct phases: - - **Block challenge**: - - The challenge begins by bisecting over global states (including block hashes) to narrow down the dispute to a single block. - - **Big-step execution challenge**: - - Upon identifying the block, the execution challenge bisects a "chunk" of 2²⁶ instructions. - - **Small-step execution challenge**: - - This phase bisects the chunk until the dispute narrows to a single instruction. - - **One-step proof**: - - A final onchain one-step proof confirms the disputed instruction. -- **Winning the challenge**: - - Winning is not instantaneous; a built-in time delay safeguards against erroneous challenge resolutions. - - This delay allows time for diagnosing and correcting errors via contract upgrades if necessary. - -## 6. One-step proof assumptions - -The one-step proof (OSP) is the final arbiter of a single disputed instruction. Its design accounts for several key assumptions: - -### 6.1 Assumptions for correct execution - -- **Correct cases**: - - In a challenge involving at least one honest party, the honest side will always prove a reachable case. - - An arbitrator generates the WAVM code (from a valid WASM compile) and should not encounter unreachable cases in correct execution. - -### 6.2 Handling unreachable cases - -- **Definition**: - - An unreachable case is a situation that is assumed never to arise during correct execution. -- **Behavior in malicious challenges**: - - In challenges between malicious assertions, unreachable cases may occur and can be handled arbitrarily by the one-step proof. -- **Safety in honest challenges**: - - An honest party never needs to prove an unreachable case. - - If a dishonest party attempts to force an unreachable case, it will be preceded by an invalid reachable case, ensuring that the dishonest party eventually loses the challenge. - -### 6.3 Additional safety assumptions - -- **WAVM code validity**: - - The WAVM code produced by the arbitrator comes from valid WASM compile. It is checked using `wasm-validate` from the WebAssembly Binary Toolkit (WABT). -- **Inbox message size**: - - Inbox messages must be small enough (no larger than 117,964 bytes) to be fully available for proving. -- **Preimage requests**: - - Preimages requested via `ReadPreImage` must be known and within the size limit (117,964 bytes). - - Examples include block headers, state trie nodes, and recent child chain block headers. - -## 7. WASM to WAVM transformation - -Not all WASM instructions are mapped directly 1:1 to WAVM opcodes. The transformation design simplifies execution for proving and enables additional blockchain interactions. - -### 7.1 Transformation process overview - -- **Source**: - - The Go compiler produces WASM code. -- **Transformation**: - - A simple transformation stage converts the WASM code into WAVM code. -- **Purpose**: - - Ensure that the WAVM code is free from unused features, restricted in its functionality where necessary, and augmented with additional opcodes for blockchain interaction. - -### 7.2 Key differences between WASM and WAVM - -- **Removed features**: - - Any WASM features not generated by the Go compiler are removed. -- **Restricted features**: - - Berkeley SoftFloat library calls replace floating-point instructions. - - The nested control flow flattens into jumps. - - Variable-time instructions transform into fixed-cost instructions. -- **Added opcodes**: - - New opcodes additions for interacting with the blockchain (e.g., reading global state, fetching inbox messages, signaling completion). - -### 7.3 Translation of specific WASM constructs - -- **Block and loop**: - - In WASM, blocks contain instructions and branch instructions for exiting blocks. - - In WAVM, since instructions are flat, branch instructions are replaced with jumps to predetermined destinations. -- **If and Else**: - - Translated into a block with an `ArbitraryJumpIf` instructions. - - **Structure example**: - - Begin block with endpoint `end` - - Conditional jump to `else` block - - [if-statement instructions] - - Unconditional branch (to skip else) - - `Else` block: [else-statement instructions] - - `End` block -- **Branch instructions (`br` and `br_if`)**: - - Translated into `ArbitraryJump` and `ArbitraryJumpIf` with jump destinations known at compile time. -- **Branch table (`br_table`)**: - - Translated to a series of conditional checks for each possible branch, with a default branch if no conditions are met. -- **`Local.tee`**: - - Implemented by duplicating the local value (using a `Dup` opcode) followed by a `LocalSet`. -- **Return**: - - The function signature knows the number of return values: - - A `MoveFromStackToInternal` opcode is added for each return value. - - A loop uses `IsStackBoundary` to clean up the stack. - - Finally, `MoveFromInternalToStack` opcodes are added for each return value, followed by a `Return` opcode. -- **Floating-point instructions**: - - `f32` and `f64` values are bitcast to `i32` and `i64`. - - Cross-module calls go to the floating-point library. - - Return values are bitcast back to floating-point types. - -### 7.4 WAVM custom opcodes not in WASM - -WAVM includes several unique opcodes that simplifying proving. They breakdown into several categories: - -#### Invariants and Codegen internal opcodes - -- **General assumptions**: - - Many opcodes assume specific items on the stack (e.g., "pops an `i32" means the top stack item must be an `i32`). - - WASM validation and arbitrator code generation maintain these invariants. -- **Examples of custom opcodes**: - -| Opcode | Name | Description | -| ------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| 0x8000 | `EndBlock` | Pops an item from the block stack. | -| 0x8001 | `EndBlockIf` | Peeks the top value (assumed `i32`) and, if non-zero, pops an item from the block stack. | -| 0x8002 | `InitFrame` | Pops a caller module index (`i32`), a caller module internals offset (`i32`), and a return `InternalRef`; creates a stack frame with these details and the locals Merkle root. | -| 0x8003 | `ArbitraryJumpIf` | Pops an `i32`; if non-zero, jumps to the program counter provided in the argument data. | -| 0x8004 | `PushStackBoundary` | Pushes a stack boundary marker onto the stack. | -| 0x8005 | `MoveFromStackToInternal` | Pops an item from the stack and pushes it to an internal stack. | -| 0x8006 | `MoveFromInternalToStack` | Pops an item from the internal stack and pushes it back onto the stack. | -| 0x8007 | `IsStackBoundary` | Pops an item from the stack; if it is a stack boundary, pushes an `i32` with value 1; otherwise, 0. | -| 0x8008 | `Dup` | Peeks at the top stack item and pushes a duplicate. | - -#### Linking opcode - -- **Purpose**: - - Generated for linking modules together: -- **Opcode**: - -| Opcode | Name | Description | -| ------ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0x8009 | `CrossModuleCall` | Pushes current program counter, module number, and module internals offset; splits the argument data into function index and module index; jumps to the beginning of that function. | - -#### Host calls - -- **Used in host call implementations**: - - They enable libraries to perform host calls and access the caller's memory. -- **Examples of host call opcodes**: - -| Opcode | Name | Description | -| ------ | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0x800A | `CallerModuleInternalCall` | Pushes the current program counter, module number, and module internals offset; retrieves caller module internals offset; jumps to caller module function if valid, otherwise errors. | -| 0x8010 | `GetGlobalStateBytes32` | Pops a pointer and index; writes the global state bytes32 value (if all alignment and bounds checks pass) to the pointer. | -| 0x8011 | `SetGlobalStateBytes32` | Pops a pointer and index; reads a bytes32 value from memory and writes it into the global state. | -| 0x8012 | `GetGlobalStateU64` | Pops a pointer and index; writes the global state u64 value to memory (with alignment and bounds checking). | -| 0x8013 | SetGlobalStateU64 | Pops a pointer and index; reads a u64 from memory and writes it into the global state. | -| 0x8020 | `ReadPreImage` | Pops an offset and pointer; reads a 32-byte Keccak-256 hash from memory; writes up to 32 bytes of its preimage starting from the offset; pushes the number of bytes written. | -| 0x8021 | `ReadInboxMessage` | Pops an offset, pointer, and i64 message number; attempts to read an inbox message; if out-of-bounds, enters a “too far” state; writes up to 32 bytes and pushes the number of bytes written. | -| 0x8022 | `HaltAndSetFinished` | Sets the machine status to finished, halting execution and marking it as successful. | - -## 8. WAVM floating-point implementation - -Floating-point operations in WAVM are handled differently to ensure determinism and consistency: - -- **Implementation using Berkeley SoftFloat**: - - Instead of implementation IEEE 754-2019 directly in WAVM, floating-point instructions are replaced with calls to the Berkeley SoftFloat-3e library. - - The soft float library is linked, and floating-point operations are implemented via cross-module calls. -- **Known divergences**: - - For example, floating-point to integer truncation will saturate on overflow (instead of erroring), which is safer and more consistent with x86 behavior. - - These divergences follow proposals (e.g., saturating opcodes) that are not yet widely adopted. - -## 9. WAVM modules and linking - -WASM's notion of modules is extended in WAVM to support multi-module programs. This extension allows: - -### 9.1 Entrypoint module - -- **Definition**: - - The entry point module is the starting point of execution. -- **Behavior**: - - It calls any modules' start functions if specified. - - If then calls the main module's `main` function: - - **For Go**: - - Sets `argv` to `["js"]` (to mimic the JS environment) and calls `run`. - - **For Rust**: - - Simply calls `main` with no arguments. - -### 9.2 Library exports - -- **Export naming convention**: - - Libraries export function using the pattern `module__name`. - - This convention allows future libraries or the main module to import these functions. -- **Example**: - - The `wasi-stub` library provides functions that Rust imports, adhering to the WebAssembly System Interface (WASI). - -### 9.3 WAVM guest calls - -- **Mechanism**: - - Libraries can call exports of the main module using the naming scheme `"env"` `"wavm_guest_call__*"`. -- **Usage example**: - - `go-stub` calls Go's resume function when queueing asynchronous events via `wavm_guest_call_resume()`, and retrieves the new stack pointer with `wavm_guest_call_getsp()`. - -### 9.4 Caller module internals call - -- **Purpose**: - - Each stack frame retains information about the caller module and its internals offset. -- **Implementation**: - - WAVM appends four "internal" functions to each module that perform small memory load or store operations. - - Libraries use opcodes such as `wavm_caller_{load,store}{8,32}` to access their caller's memory. - - Only libraries can access their caller's memory; restrictions prevent the main module from doing so. - -## 10. Stylus proving and fraud detection - -Stylus introduces an execution path alongside the EVM, enabling - smart Contract - execution in WebAssembly (WASM). Given that Stylus program are fraud-proven directly rather than -interpreted via Geth's EVM implementation––the proving mechanism required modifications to the standard -Arbitrum proving architecture. - -### 10.1 Proving Stylus programs - -Unlike EVM-based contracts, Stylus programs are dynamically linked into the replay machine when proving fraud. This is achieved through two key opcodes: - -- **`LinkModule`**: Loads the Stylus contract's WASM module into the replay machine. -- **`UnlinkModule`**: Removes the module once execution completes. - -These opcodes ensure that Stylus contracts are treated as part as part of the replay machine, allowing for precise fraud-proof bisection at the WASM level. - -### 10.2 Execution-proving separation - -Stylus leverages Arbitrum's execution-proving separation, where the replay machine runs in WAVM, and disputes over Stylus transactions follow the standard interactive fraud-proof protocol (BoLD), which means: - -1. A challenge initiates if a validator disputes the execution of a Stylus transaction. -2. The dispute narrows to a single WAVM opcode via the bisection protocol. -3. The One-Step Proof (OSP) mechanism extends to handle Stylus-specific operations, proving the correctness of WASM execution at the opcode level. - -### 10.3 Internal function calls in proofs - -Since Stylus programs interact with the blockchain through host I/O's, fraud proofs must ensure correct execution of cross-module calls. The following additional proving opcodes facilitate Stylus program execution: - -- **`CrossModuleInternalCall`**: Allows internal functions within a Stylus module to be proven independently. -- **`CrossModuleForward`**: Ensures host I/O calls are accurately relayed through `forward.wat`, maintaining consistency in fraud proofs. - -### 10.4 Error recovery and chain safety - -Stylus introduces a novel Error Guard mechanism to prevent malicious programs from halting the chain. If an error occurs within a Stylus program during proving: - -1. Execution reverts to the main replay machine context. -2. The replay machine resets the program's execution state using an Error Guard stack. -3. If recovery is not possible, the transaction is flagged as invalid, ensuring Stylus fraud proofs remain deterministic. - -### 10.5 One-Step Proofs for Stylus - -The One-Step Prover extends to validate Stylus-specific opcodes, which include: - -- **Memory operations** (e.g., `MemoryGrow`, `HeapAlloc`) -- **Host I/O's** (e.g., `storage_load_bytes32`, `return_data`) -- **Gas metering** within WASM execution - -By integrating these functionalities, Stylus ensures WASM contract execution can be fraud-proven like EVM transactions, while leveraging Arbitrum's existing BoLD fraud-proof architecture. From d4d7de55db40553f7aa90867c1276add1df0a974 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 7 Aug 2025 09:14:47 -0500 Subject: [PATCH 20/75] redirects --- ...modified-geth-on-arbitrum.mdx => geth.mdx} | 0 sidebars.js | 71 ++++++------------- vercel.json | 5 ++ 3 files changed, 27 insertions(+), 49 deletions(-) rename docs/how-arbitrum-works/deep-dives/{modified-geth-on-arbitrum.mdx => geth.mdx} (100%) diff --git a/docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/geth.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum.mdx rename to docs/how-arbitrum-works/deep-dives/geth.mdx diff --git a/sidebars.js b/sidebars.js index 9d88f37810..cbb880ead5 100644 --- a/sidebars.js +++ b/sidebars.js @@ -990,78 +990,57 @@ const sidebars = { items: [ { type: 'doc', - id: 'how-arbitrum-works/a-gentle-introduction', - label: 'A gentle introduction', - }, - { - type: 'doc', - id: 'how-arbitrum-works/transaction-lifecycle', - label: 'Sequencing, Followed by Deterministic Execution', - }, - { - type: 'doc', - id: 'how-arbitrum-works/sequencer', - label: 'The Sequencer and Censorship Resistance', + id: 'how-arbitrum-works/01-inside-arbitrum-nitro', + label: 'Inside Arbitrum Nitro', }, { - type: 'doc', - id: 'how-arbitrum-works/l1-to-l2-messaging', - label: 'Parent to Child chain messaging', + type: 'link', + href: 'https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf', + label: 'Nitro whitepaper', }, { type: 'category', - label: 'State Transition Function', + label: 'Deep dives', items: [ { type: 'doc', - label: 'STF Overview', - id: 'how-arbitrum-works/state-transition-function/stf-gentle-intro', - }, - { - type: 'doc', - label: 'STF inputs', - id: 'how-arbitrum-works/state-transition-function/stf-inputs', + label: 'AnyTrust', + id: 'how-arbitrum-works/deep-dives/anytrust-protocol', }, { type: 'doc', - label: 'Ethereum vs Arbitrum', - id: 'how-arbitrum-works/state-transition-function/ethereum-vs-arbitrum', + label: 'Assertions', + id: 'how-arbitrum-works/deep-dives/assertions', }, { type: 'doc', - label: 'Modified Geth on Arbitrum', - id: 'how-arbitrum-works/state-transition-function/modified-geth-on-arbitrum', + label: 'L1 to L2 Messaging', + id: 'how-arbitrum-works/deep-dives/l1-to-l2-messaging', }, { type: 'doc', - label: 'ArbOS', - id: 'how-arbitrum-works/state-transition-function/arbos', + label: 'L2 to L1 Messaging', + id: 'how-arbitrum-works/deep-dives/l2-to-l1-messaging', }, { type: 'doc', - label: 'Stylus execution path', - id: 'how-arbitrum-works/state-transition-function/stylus-execution-path', + label: 'Geth', + id: 'how-arbitrum-works/deep-dives/geth', }, - ], - }, - { - type: 'category', - label: 'Validation and Proving', - items: [ { type: 'doc', - label: 'Validation and proving overview', - id: 'how-arbitrum-works/validation-and-proving/validation-and-proving', + label: 'Sequencer', + id: 'how-arbitrum-works/deep-dives/sequencer', }, { type: 'doc', - label: 'Rollup protocol', - id: 'how-arbitrum-works/validation-and-proving/rollup-protocol', + label: 'STF inputs', + id: 'how-arbitrum-works/deep-dives/stf-inputs', }, { type: 'doc', - label: 'Proving and challenges', - id: 'how-arbitrum-works/validation-and-proving/proving-and-challenges', + label: 'Transaction lifecycle', + id: 'how-arbitrum-works/deep-dives/transaction-lifecycle', }, ], }, @@ -1080,12 +1059,6 @@ const sidebars = { id: 'how-arbitrum-works/gas-fees', label: 'Gas and fees', }, - { - type: 'link', - href: 'https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf', - label: 'Nitro whitepaper', - }, - { type: 'category', label: 'The BoLD dispute protocol', diff --git a/vercel.json b/vercel.json index 5da6b13d4b..d923055758 100644 --- a/vercel.json +++ b/vercel.json @@ -205,6 +205,11 @@ "destination": "/(docs/run-arbitrum-node/data-availability/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/geth/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/deep-dives/state-transition-function/arbos/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/arbos/?)", From 8b408b9f8999de62a84a16fdb92b51deda0c88b3 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 10:38:33 -0500 Subject: [PATCH 21/75] Refactoring pages for readability --- .../timeboost/gentle-introduction.mdx | 29 ++++++------------- .../timeboost/how-to-use-timeboost.mdx | 14 +++++++++ .../timeboost/troubleshoot-timeboost.mdx | 4 +-- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/docs/how-arbitrum-works/timeboost/gentle-introduction.mdx b/docs/how-arbitrum-works/timeboost/gentle-introduction.mdx index bcfa012395..cc8b43d34b 100644 --- a/docs/how-arbitrum-works/timeboost/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/timeboost/gentle-introduction.mdx @@ -16,13 +16,6 @@ This introduction will walk you through Arbit Timeboost is the culmination of over a year of [research and development](https://arxiv.org/abs/2306.02179) by the team at Offchain Labs. It is currently live on Arbitrum One and Arbitrum Nova, and is available for Arbitrum Orbit chains, whose owners can adopt and customize it as they choose. -### In a nutshell - -- The old "First-Come, First-Serve (FCFS)" ordering policy has many benefits, including a great UX and protection from harmful types of MEV. However, nearly all MEV on the chain is extracted by searchers who invest wastefully in hardware and spamming to win latency races (which negatively strains the network and leads to congestion). Timeboost is a new transaction ordering policy that preserves many of the great benefits of FCFS while unlocking a path for chain owners to capture some of the available MEV on their network and introducing an auction to reduce latency, racing, and, ultimately, spam. -- Timeboost introduces a few new components to an Arbitrum chain’s infrastructure: a sealed-bid second-price auction and a new "express lane" at an Arbitrum chain’s sequencer. Valid transactions submitted to the express lane will be sequenced immediately with no delay, while all other transactions submitted to the chain’s sequencer will experience a nominal delay (default: 200ms). The auction winner is granted the sole right to control the express lane for pre-defined, temporary intervals. The default block time for Arbitrum chains will continue to be industry-leading at 250ms, even with Timeboost enabled. What will change with Timeboost is that some transactions not in the express lane will be delayed to the next block. -- Timeboost is an optional feature for Arbitrum chains aimed at two types of groups of entities: (1) chain owners and their ecosystems and (2) sophisticated onchain actors and searchers. Chain owners can use Timeboost to capture additional revenue from the MEV their chain generates already, and sophisticated onchain actors and searchers will spend their resources on buying rights for the express lane (instead of spending those resources on winning latency races, which otherwise leads to spam and congestion on the network). -- Timeboost will work with both centralized and [decentralized sequencer setups](https://medium.com/@espressosys/espresso-systems-and-offchain-labs-publish-decentralized-timeboost-specification-b29ff20c5db8). The specification for a centralized sequencer is public ([here](https://github.com/OffchainLabs/timeboost-design)); implementing this spec [allowed us to deliver Timeboost to market](https://forum.arbitrum.foundation/t/constitutional-aip-proposal-to-adopt-timeboost-a-new-transaction-ordering-policy/25167/1) sooner, instead of waiting for the completion of the design and implementation of a decentralized sequencer. - ## Why do Arbitrum chains need Timeboost? Today, Arbitrum chains order incoming transactions on a "First-Come, First-Serve (FCFS)" basis. This ordering policy was chosen as the default for Arbitrum chains because it is simple to understand and implement, enables fast block times (starting at 250ms and down to 100ms if desired), and protects users from harmful types of MEV like front-running & sandwich attacks. @@ -91,21 +84,11 @@ Before placing a bid in the auction, a party must deposit funds into the `Auctio Once the autonomous auctioneer determines an auction winner, the `Auction` contract will deduct the second-highest bid amount from the account of the highest bidder and transfer those funds to a `beneficiary` account designated by the chain owner by default. The `expressLaneControllerAddress` specified in the highest bid will become the express lane controller for the round. -### Default parameters - -Below are a few of the default Timeboost parameters mentioned earlier. All these parameters and more are configurable by the chain owner. + | -| Parameter name | Description | Recommended default value | -| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -| `roundDurationSeconds` | Duration of time that the sequencer will honor the express lane privileges for transactions signed by the current round’s express lane controller. | 60 seconds | -| `auctionClosingSeconds` | Time before the start of the next round. The autonomous auctioneer will not accept bids during this time interval. | 15 seconds | -| `beneficiary` | Address where proceeds from the Timeboost auction are sent to when `flushBeneficiaryBalance()` gets called on the auction contract. | An address controlled by the chain's owner | -| `_biddingToken` | Address of the token used to make bids in the Timeboost auction. It can be any `ERC-20` token (assuming the token chosen does not have fee-on-transfer, rebasing, transfer hooks, or otherwise non-standard `ERC-20` logic). | `WETH` | -| `nonExpressDelayMsec` | The artificial delay applied to the arrival timestamp of non-express lane transactions _before_ the non-express lane transactions are sequenced. | 0.2 seconds, or 200 milliseconds | -| `reservePrice` | The minimum bid amount accepted by the auction contract for the current Timeboost auction, denominated in `_biddingToken`. | None | -| `_minReservePrice` | A value that must be equal to or below the `reservePrice` to act as a "floor minimum" for Timeboost bids. Enforced by the auction contract. | 0.001 `WETH` | +## FAQs -## Who is Timeboost for, and how do I use it? +#### Who is Timeboost for, and how do I use it? Timeboost is an optional addition to an Arbitrum chain’s infrastructure, meaning that enabling Timeboost is at the discretion of the chain owner and that an Arbitrum chain can fully function normally without Timeboost. @@ -128,3 +111,9 @@ Timeboost adds a unique twist to your existing or prospective MEV strategies tha As with many new features and upgrades to Arbitrum Nitro, Timeboost is an optional feature that chain owners may choose to deploy and customize however they see fit. Deploying and enabling/disabling Timeboost on a live Arbitrum chain will not halt or impact the chain but will instead influence the chain's transaction ordering policy. An Arbitrum chain will, by default, fall back to FCFS if Timeboost is deployed but disabled or if there is no express lane controller for a given round. It is recommended that Arbitrum teams holistically assess the applicability and use cases of Timeboost for their chain before deploying and enabling Timeboost. This is because some Arbitrum chains may not have that much MEV (e.g., arbitrage) to begin with. Furthermore, we recommend that Arbitrum chains start with the default parameters recommended by Offchain Labs and closely monitor the results and impacts on your chain’s ecosystem over time before considering adjusting any of the parameters. + +:::info Additional FAQs + +For more frequently asked questions refer to the [Timeboost FAQ](/how-arbitrum-works/timeboost/timeboost-faq.mdx). + +::: diff --git a/docs/how-arbitrum-works/timeboost/how-to-use-timeboost.mdx b/docs/how-arbitrum-works/timeboost/how-to-use-timeboost.mdx index bac3235c6f..b1a28994f7 100644 --- a/docs/how-arbitrum-works/timeboost/how-to-use-timeboost.mdx +++ b/docs/how-arbitrum-works/timeboost/how-to-use-timeboost.mdx @@ -548,6 +548,20 @@ Here is an example query on how to look up and download historical bid data: download: s3://timeboost-auctioneer-arb1/ue2/validated-timeboost-bids/2025/06/09/0130304-0130343.csv.gzip to ./local.csv.gzip ``` +## Default parameters + +Below are a few of the default Timeboost parameters mentioned earlier. All these parameters and more are configurable by the chain owner. + +| Parameter name | Description | Recommended default value | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| `roundDurationSeconds` | Duration of time that the sequencer will honor the express lane privileges for transactions signed by the current round’s express lane controller. | 60 seconds | +| `auctionClosingSeconds` | Time before the start of the next round. The autonomous auctioneer will not accept bids during this time interval. | 15 seconds | +| `beneficiary` | Address where proceeds from the Timeboost auction are sent to when `flushBeneficiaryBalance()` gets called on the auction contract. | An address controlled by the chain's owner | +| `_biddingToken` | Address of the token used to make bids in the Timeboost auction. It can be any `ERC-20` token (assuming the token chosen does not have fee-on-transfer, rebasing, transfer hooks, or otherwise non-standard `ERC-20` logic). | `WETH` | +| `nonExpressDelayMsec` | The artificial delay applied to the arrival timestamp of non-express lane transactions _before_ the non-express lane transactions are sequenced. | 0.2 seconds, or 200 milliseconds | +| `reservePrice` | The minimum bid amount accepted by the auction contract for the current Timeboost auction, denominated in `_biddingToken`. | None | +| `_minReservePrice` | A value that must be equal to or below the `reservePrice` to act as a "floor minimum" for Timeboost bids. Enforced by the auction contract. | 0.001 `WETH` | + ## Troubleshooting and best practices Our guide on [Troubleshooting Timeboost](/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx) provides more information on how response times work and how express lane transactions are sequenced, along with common errors and best practices for using Timeboost. diff --git a/docs/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx b/docs/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx index 65ec7985a1..82e65c7b5e 100644 --- a/docs/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx +++ b/docs/how-arbitrum-works/timeboost/troubleshoot-timeboost.mdx @@ -14,7 +14,7 @@ The express lane time advantage is currently set to 200ms, while the current blo Express lane transactions are processed in the order of their `sequenceNumber`, which is a field in every express lane transaction. The `sequenceNumber` field is important because transactions with `sequenceNumber = n` can only be sequenced after all the transactions from `sequenceNumber = 0` to `sequenceNumber = n-1` have been sequenced. The first expected sequence number for a new round is zero and increments for each accepted transaction. -There is a special "dontcare" sequence number (2^64 - 1) that can be used to indicate that you don't care about ordering of this express lane submission relative to others. Transactions with the "dontcare" sequence number will be sequenced right away without waiting for any other transactions. Note that normal nonce ordering within transactions for an account is still respected, so transactions from the same account will still be ordered by their nonce regardless of sequence number. The express lane controller can send `ExpressLaneSubmissions` with both "dontcare" and normal sequence numbers within the same round. +There is a special "dontcare" sequence number (`2^64 - 1`) that can be used to indicate that you don't care about ordering of this express lane submission relative to others. Transactions with the "dontcare" sequence number will be sequenced right away without waiting for any other transactions. Note that normal nonce ordering within transactions for an account is still respected, so transactions from the same account will still be ordered by their nonce regardless of sequence number. The express lane controller can send `ExpressLaneSubmissions` with both "dontcare" and normal sequence numbers within the same round. ## How response times work @@ -36,7 +36,7 @@ In this scenario, a `null` response is immediately returned after you send an ex If the express lane controller decides to send a burst of transactions to the express lane with ascending values for the `sequenceNumber`, then the sequencer will attempt to process them in the order defined by the `sequenceNumber` (as explained above). However, if the transactions arrive out-of-order at the sequencer, then the transactions that do not have the expected `sequenceNumber` will be buffered (up to a limit) to be processed until the sequencer receives the transaction with the expected `sequenceNumber`. Once the sequencer receives the transaction with the expected `sequenceNumber`, then the sequencer will begin processing the buffered transaction with the next `sequenceNumber`. In other words, a transaction will only be sequenced into a block once transactions with the other, missing sequence numbers arrive to fill in the “gap” between the expected `sequencerNumber` and a given transaction’s `sequenceNumber`. -A block-based timeout is applied to all express lane transactions, even those in the buffer, such that any transactions accepted (meaning `sequenceNumber` is consumed) by the sequencer will be dropped if they are not sequenced into a block within 5 blocks. This timeout can occur if the cummulative gas usage of transactions (express lane or otherwise) fill up 5 blocks worth of transactions _before_ all of the buffered express lane transactions are sequenced. No timeout error will be returned in this case and we recommend checking transaction receipts for confirmation on whether your transactions were sequenced into a block or not. Note that each Arbitrum block has a gas limit of 32 million gas and 1 Arbitrum block is produced every 250ms. This block-based timeout is likely to be reached before the limit on buffered transactions is hit in almost all cases. +A block-based timeout is applied to all express lane transactions, even those in the buffer, such that any transactions accepted (meaning `sequenceNumber` is consumed) by the sequencer will be dropped if they are not sequenced into a block within five blocks. This timeout can occur if the cummulative gas usage of transactions (express lane or otherwise) fill up 5 blocks worth of transactions _before_ all of the buffered express lane transactions are sequenced. No timeout error will be returned in this case and we recommend checking transaction receipts for confirmation on whether your transactions were sequenced into a block or not. Note that each Arbitrum block has a gas limit of 32 million gas and 1 Arbitrum block is produced every 250ms. This block-based timeout is likely to be reached before the limit on buffered transactions is hit in almost all cases. ## Common error responses From c32820e13f16075702d744370b971225cab47895 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 10:49:12 -0500 Subject: [PATCH 22/75] Modified sidebars --- .../02-block-numbers-and-time.mdx | 4 +++- sidebars.js | 17 +---------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx index ab51f8b57e..5aa4a39a4e 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx @@ -17,7 +17,9 @@ Throughout this and other pages, we mention how the block number of a chain does ::: -As in Ethereum, Arbitrum clients submit transactions, and the system executes those transactions later. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the Sequencer](/how-arbitrum-works/03-sequencer.mdx) or via the chain's [Delayed Inbox](/how-arbitrum-works/03-sequencer.mdx). +As in Ethereum, Arbitrum clients submit transactions, and the system executes those transactions later. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the Sequencer](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#sequencing-followed-by-deterministic-execution) or via the chain's [Delayed Inbox](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#inboxes-fast-and-slow). + +Sequencing, Followed by Deterministic Execution Once in the chain's core inbox contract, transactions are processed in order. Generally, some time will elapse between when a message is put into the inbox (and timestamped) and when the contract processes the message and carries out the transaction requested by the message. diff --git a/sidebars.js b/sidebars.js index cbb880ead5..20264249b7 100644 --- a/sidebars.js +++ b/sidebars.js @@ -990,7 +990,7 @@ const sidebars = { items: [ { type: 'doc', - id: 'how-arbitrum-works/01-inside-arbitrum-nitro', + id: 'how-arbitrum-works/inside-arbitrum-nitro', label: 'Inside Arbitrum Nitro', }, { @@ -1044,21 +1044,6 @@ const sidebars = { }, ], }, - { - type: 'doc', - id: 'how-arbitrum-works/anytrust-protocol', - label: 'AnyTrust protocol', - }, - { - type: 'doc', - id: 'how-arbitrum-works/l2-to-l1-messaging', - label: 'Child to parent chain messaging', - }, - { - type: 'doc', - id: 'how-arbitrum-works/gas-fees', - label: 'Gas and fees', - }, { type: 'category', label: 'The BoLD dispute protocol', From 1b79d45ca26f779174be7eedff875ce3a6bf3368 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 13:35:14 -0500 Subject: [PATCH 23/75] fixing broken links --- .../02-how-to-estimate-gas.mdx | 4 ++-- .../03-public-chains.mdx | 8 +++---- .../04-cross-chain-messaging.mdx | 4 ++-- .../01-comparison-overview.mdx | 6 ++--- .../arbitrum-vs-ethereum/03-rpc-methods.mdx | 2 +- .../04-solidity-support.mdx | 2 +- .../custom-gas-token-sdk.mdx | 2 +- .../precompiles/02-reference.mdx | 2 +- .../reference/07-debugging-tools.mdx | 2 +- .../reference/08-mainnet-risks.mdx | 2 +- .../token-bridging/02-token-bridge-ether.mdx | 2 +- .../token-bridging/03-token-bridge-erc20.mdx | 4 ++-- .../02-how-to-bridge-tokens-standard.mdx | 2 +- .../bold/bold-technical-deep-dive.mdx | 6 ++--- .../bold/gentle-introduction.mdx | 12 +++++----- .../deep-dives/assertions.mdx | 2 +- .../{09-gas-fees.mdx => gas-and-fees.mdx} | 0 docs/how-arbitrum-works/deep-dives/geth.mdx | 6 ++--- .../deep-dives/l1-to-l2-messaging.mdx | 6 ++--- .../deep-dives/l2-to-l1-messaging.mdx | 6 ++--- .../deep-dives/sequencer.mdx | 2 +- .../arbos-releases/01-overview.mdx | 2 +- .../01-get-started.mdx | 2 +- .../02-deploy-das.mdx | 4 ++-- .../04-configure-dac.mdx | 4 ++-- .../more-types/02-run-validator-node.mdx | 2 +- docs/stylus/concepts/how-it-works.md | 2 +- docs/welcome/get-started.mdx | 24 +++++++++---------- sidebars.js | 5 ++++ vercel.json | 5 ++++ 30 files changed, 71 insertions(+), 61 deletions(-) rename docs/how-arbitrum-works/deep-dives/{09-gas-fees.mdx => gas-and-fees.mdx} (100%) diff --git a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx index 74f660ee95..76ab19b3bd 100644 --- a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx +++ b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx @@ -11,7 +11,7 @@ Head over to [the Stylus gas docs](/stylus/reference/opcode-hostio-pricing) for ::: -This how-to is intended for users and developers interested in understanding how gas operates in Arbitrum, how it's calculated, and how to estimate it before submitting transactions. More detailed information about these calculations can be found in this [Medium article](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9) and the [Gas and Fees](/how-arbitrum-works/09-gas-fees.mdx) page. +This how-to is intended for users and developers interested in understanding how gas operates in Arbitrum, how it's calculated, and how to estimate it before submitting transactions. More detailed information about these calculations can be found in this [Medium article](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9) and the [Gas and Fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) page. ## Skip the formula, focus on practical know-how @@ -46,7 +46,7 @@ This buffer takes into account the cost of posting the transaction, batched and - L1S, which estimates the amount of data the transaction will take up in the batch by compressing the transaction with Brotli. - L1P, which is the child chain's estimated view of the current parent chain's price of data (per byte), which the child chain dynamically adjusts over time. -More information is available [in this page](/how-arbitrum-works/09-gas-fees.mdx). +More information is available [in this page](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). ``` L1 Estimated Cost (L1C) = L1 price per byte of data (L1P) * Size of data to be posted in bytes (L1S) diff --git a/docs/build-decentralized-apps/03-public-chains.mdx b/docs/build-decentralized-apps/03-public-chains.mdx index ff7dbe471c..510613a1bd 100644 --- a/docs/build-decentralized-apps/03-public-chains.mdx +++ b/docs/build-decentralized-apps/03-public-chains.mdx @@ -13,11 +13,11 @@ Arbitrum chains are child chain solutions built on top of the Ethereum blockchai ### Arbitrum One -**Arbitrum One** is a child chain Optimistic Rollup chain that implements the Arbitrum Rollup protocol and settles to Ethereum's parent chain. It lets you build high-performance Ethereum dApps with low transaction costs and Ethereum-grade security guarantees, introducing no additional trust assumptions. This is made possible by the [Nitro](/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx) technology stack, a "Geth-at-the-core" architecture that gives Arbitrum One (and Nova) advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. +**Arbitrum One** is a child chain Optimistic Rollup chain that implements the Arbitrum Rollup protocol and settles to Ethereum's parent chain. It lets you build high-performance Ethereum dApps with low transaction costs and Ethereum-grade security guarantees, introducing no additional trust assumptions. This is made possible by the [Nitro](/how-arbitrum-works/deep-dives/geth.mdx) technology stack, a "Geth-at-the-core" architecture that gives Arbitrum One (and Nova) advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. ### Arbitrum Nova -**Arbitrum Nova** is a high-performance alternative to Arbitrum One's chain. While Arbitrum One implements the purely trustless Rollup protocol, Arbitrum Nova implements the mostly trustless [AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) protocol. The key difference between Rollup and AnyTrust is that the AnyTrust protocol introduces an additional trust assumption in the form of a Data Availability Committee (DAC). This committee (detailed below) is responsible for expediting the process of storing, batching, and posting child chain transaction data to Ethereum's parent chain. This lets you use Arbitrum in scenarios that demand performance and affordability, while Arbitrum One is optimal for scenarios that demand Ethereum's pure trustlessness. +**Arbitrum Nova** is a high-performance alternative to Arbitrum One's chain. While Arbitrum One implements the purely trustless Rollup protocol, Arbitrum Nova implements the mostly trustless [AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) protocol. The key difference between Rollup and AnyTrust is that the AnyTrust protocol introduces an additional trust assumption in the form of a Data Availability Committee (DAC). This committee (detailed below) is responsible for expediting the process of storing, batching, and posting child chain transaction data to Ethereum's parent chain. This lets you use Arbitrum in scenarios that demand performance and affordability, while Arbitrum One is optimal for scenarios that demand Ethereum's pure trustlessness. ## What Arbitrum testnet chains are available? @@ -57,11 +57,11 @@ Finally, Arbitrum Sepolia is a testnet chain. It's designed for testing purposes ### Nitro -Nitro is the technology that powers Arbitrum One, Arbitrum Nova (with AnyTrust configuration),and Arbitrum Sepolia. It's designed to offer high throughput and low cost, making it ideal for scaling Ethereum applications. Nitro is a major upgrade to the “Classic” stack, offering several improvements including advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. You can find more information about Nitro in [How Arbitrum works](/how-arbitrum-works/01-a-gentle-introduction.mdx). +Nitro is the technology that powers Arbitrum One, Arbitrum Nova (with AnyTrust configuration),and Arbitrum Sepolia. It's designed to offer high throughput and low cost, making it ideal for scaling Ethereum applications. Nitro is a major upgrade to the “Classic” stack, offering several improvements including advanced calldata compression, separate contexts for common execution and fault proving, Ethereum parent chain gas compatibility, and more. You can find more information about Nitro in [How Arbitrum works](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx). ### AnyTrust (variant of Nitro) -AnyTrust is a variant of the Nitro technology stack that lowers costs by accepting a mild trust assumption. The AnyTrust protocol relies on an external Data Availability Committee (DAC) to store data and provide it on demand. The DAC has `N` members, of which AnyTrust assumes at least two are honest. Keeping the data offchain in the happy/common case means the system can charge the user significantly lower fees. You can find more information about AnyTrust in [Anytrust protocol](/how-arbitrum-works/08-anytrust-protocol.mdx). +AnyTrust is a variant of the Nitro technology stack that lowers costs by accepting a mild trust assumption. The AnyTrust protocol relies on an external Data Availability Committee (DAC) to store data and provide it on demand. The DAC has `N` members, of which AnyTrust assumes at least two are honest. Keeping the data offchain in the happy/common case means the system can charge the user significantly lower fees. You can find more information about AnyTrust in [Anytrust protocol](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). ### Classic (deprecated) diff --git a/docs/build-decentralized-apps/04-cross-chain-messaging.mdx b/docs/build-decentralized-apps/04-cross-chain-messaging.mdx index c3edf35e81..9707215093 100644 --- a/docs/build-decentralized-apps/04-cross-chain-messaging.mdx +++ b/docs/build-decentralized-apps/04-cross-chain-messaging.mdx @@ -11,7 +11,7 @@ The Arbitrum protocol and related tooling makes it easy for developers to build Arbitrary parent to child chain contract calls can be created via the Inbox's `createRetryableTicket` method; upon publishing the parent chain transaction, the child chain side will typically get included within minutes. Commonly, the child chain execution will automatically succeed, but if reverts, and it can be rexecuted via a call to the `redeem` method of the [`ArbRetryableTx`](/build-decentralized-apps/precompiles/02-reference.mdx#arbretryabletx) precompile. -For details and protocol specification, see [Parent to child chain messages](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +For details and protocol specification, see [Parent to child chain messages](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). For an example of retryable tickets in action, see the [`Greeter`](https://github.com/OffchainLabs/arbitrum-tutorials/tree/master/packages/greeter) tutorial, which uses the [Arbitrum SDK](../../sdk). @@ -19,6 +19,6 @@ For an example of retryable tickets in action, see the [`Greeter`](https://githu Similarly, child chain contracts can send Arbitrary messages for execution on the parent chain. These are initiated via calls to the [`ArbSys`](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) precompile contract's `sendTxToL1` method. Upon confirmation (about one week later), they can execute by retrieving the relevant data via a call to `NodeInterface` contract's `constructOutboxProof` method, and then executing them via the `Outbox`'s `executeTransaction` method. -For details and protocol specification, see [Child to parent chain messages](/how-arbitrum-works/11-l2-to-l1-messaging.mdx). +For details and protocol specification, see [Child to parent chain messages](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). For a demo, see the [Outbox Tutorial](https://github.com/OffchainLabs/arbitrum-tutorials/tree/master/packages/outbox-execute). diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx index f930f09604..e7b3faae21 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx @@ -26,13 +26,13 @@ You can deploy Solidity contracts onto Arbitrum just like you do on Ethereum. Th ## Fees -The fees for executing an Arbitrum transaction work like gas fees on Ethereum. However, Arbitrum transactions must also pay a fee component to cover the cost of posting their calldata to the parent chain (for example, calldata on Arbitrum One, a child chain, is posted to Ethereum, a parent chain). Find more information about the two components of gas fees in [Gas and fees](/how-arbitrum-works/09-gas-fees.mdx) and parent chain pricing. +The fees for executing an Arbitrum transaction work like gas fees on Ethereum. However, Arbitrum transactions must also pay a fee component to cover the cost of posting their calldata to the parent chain (for example, calldata on Arbitrum One, a child chain, is posted to Ethereum, a parent chain). Find more information about the two components of gas fees in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) and parent chain pricing. ## Cross-chain messaging -Arbitrum chains support arbitrary message passing from a parent chain (for example, a parent chain like Ethereum) to a child chain (for example, a child chain like Arbitrum One or Arbitrum Nova). These are commonly known as "parent chain to child chain messages". Developers using this functionality should familiarize themselves with how they work. Find more information about it in [Parent chain to child chain messaging](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +Arbitrum chains support arbitrary message passing from a parent chain (for example, a parent chain like Ethereum) to a child chain (for example, a child chain like Arbitrum One or Arbitrum Nova). These are commonly known as "parent chain to child chain messages". Developers using this functionality should familiarize themselves with how they work. Find more information about it in [Parent chain to child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). -Similarly, Arbitrum chains can also send messages to the parent chain. Find more information about them in [Child chain to parent chain messaging and the outbox](/how-arbitrum-works/11-l2-to-l1-messaging.mdx). +Similarly, Arbitrum chains can also send messages to the parent chain. Find more information about them in [Child chain to parent chain messaging and the outbox](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). ## Precompiles diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx index 2c76e88038..be9a42ae3b 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx @@ -21,7 +21,7 @@ When calling [`eth_getTransactionByHash`](https://ethereum.org/en/developers/doc ### Transaction types -In addition to the [three transaction types](https://ethereum.org/en/developers/docs/transactions/#types-of-transactions) currently supported on Ethereum, Arbitrum adds additional types listed below and [documented in full detail here](/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx#transaction-types). +In addition to the [three transaction types](https://ethereum.org/en/developers/docs/transactions/#types-of-transactions) currently supported on Ethereum, Arbitrum adds additional types listed below and [documented in full detail here](/how-arbitrum-works/deep-dives/geth.mdx#transaction-types). On RPC calls that return transactions, the `type` field will reflect the custom codes where applicable. diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx index b7256b2295..ba0b825d3b 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx @@ -22,5 +22,5 @@ Although Arbitrum supports Solidity code, there are differences in the effects o | `block.difficulty` | Returns the constant 1. | | `block.prevrandao` | Returns the constant 1. | | `block.number` | Returns an "estimate" of the block number of the first non-Arbitrum ancestor chain at which the sequencer received the transaction. For more information, see [Block numbers and time](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx). | -| `msg.sender` | Works the same way it does on Ethereum for regular child chain to child chain transactions. For transactions submitted via the delayed inbox, it will return the child chain address alias of the parent chain contract that triggered the message. For more information, see [address aliasing](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#address-aliasing). | +| `msg.sender` | Works the same way it does on Ethereum for regular child chain to child chain transactions. For transactions submitted via the delayed inbox, it will return the child chain address alias of the parent chain contract that triggered the message. For more information, see [address aliasing](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#address-aliasing). | | OPCODE `PUSH0` | This OPCODE was added as part of ArbOS 11 and is now supported. | diff --git a/docs/build-decentralized-apps/custom-gas-token-sdk.mdx b/docs/build-decentralized-apps/custom-gas-token-sdk.mdx index f3c788cb65..de547de75c 100644 --- a/docs/build-decentralized-apps/custom-gas-token-sdk.mdx +++ b/docs/build-decentralized-apps/custom-gas-token-sdk.mdx @@ -26,7 +26,7 @@ You should use `EthBridger` when bridging the native token between the parent ch 2. **`Erc20Bridger` Context:** - **APIs:** `getApproveGasTokenRequest` and `approveGasToken`. - - **Purpose:** In the scenario of bridging `ERC-20` assets to an Arbitrum chain, these APIs play a crucial role. Token Bridging on Arbitrum Nitro stack uses retryable tickets and needs a specific fee to be paid for the creation and redemption of the ticket. For more information about retryable tickets, please take a look at [our chapter about retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets) part of our docs. The Arbitrum chain operates as a custom gas token network, necessitating the payment of fees in native tokens for the creation of retryable tickets and their redemption on the Arbitrum chain. To cover the submission and execution fees associated with retryable tickets on the Arbitrum chain, an adequate number of native tokens must be approved and allocated to the parent chain to cover the fees. + - **Purpose:** In the scenario of bridging `ERC-20` assets to an Arbitrum chain, these APIs play a crucial role. Token Bridging on Arbitrum Nitro stack uses retryable tickets and needs a specific fee to be paid for the creation and redemption of the ticket. For more information about retryable tickets, please take a look at [our chapter about retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets) part of our docs. The Arbitrum chain operates as a custom gas token network, necessitating the payment of fees in native tokens for the creation of retryable tickets and their redemption on the Arbitrum chain. To cover the submission and execution fees associated with retryable tickets on the Arbitrum chain, an adequate number of native tokens must be approved and allocated to the parent chain to cover the fees. :::note Important Notes diff --git a/docs/build-decentralized-apps/precompiles/02-reference.mdx b/docs/build-decentralized-apps/precompiles/02-reference.mdx index e8ef670ce5..06230a68a2 100644 --- a/docs/build-decentralized-apps/precompiles/02-reference.mdx +++ b/docs/build-decentralized-apps/precompiles/02-reference.mdx @@ -148,7 +148,7 @@ import ArbOwnerPublicRef from '../../for-devs/dev-tools-and-resources/partials/p ### `ArbRetryableTx` -ArbRetryableTx ([Interface](https://github.com/OffchainLabs/@@nitroPrecompilesRepositorySlug=nitro-precompile-interfaces@@/blob/@@nitroPrecompilesCommit=fe4121240ca1ee2cbf07d67d0e6c38015d94e704@@/ArbRetryableTx.sol) | [Implementation](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.6.8@@/@@nitroPathToPrecompiles=precompiles@@/ArbRetryableTx.go)) provides methods for managing retryables. The model has been adjusted for Nitro, most notably in terms of how retry transactions are scheduled. For more information on retryables, please see [the retryable documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets). +ArbRetryableTx ([Interface](https://github.com/OffchainLabs/@@nitroPrecompilesRepositorySlug=nitro-precompile-interfaces@@/blob/@@nitroPrecompilesCommit=fe4121240ca1ee2cbf07d67d0e6c38015d94e704@@/ArbRetryableTx.sol) | [Implementation](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.6.8@@/@@nitroPathToPrecompiles=precompiles@@/ArbRetryableTx.go)) provides methods for managing retryables. The model has been adjusted for Nitro, most notably in terms of how retry transactions are scheduled. For more information on retryables, please see [the retryable documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets). Precompile address: `0x000000000000000000000000000000000000006E` diff --git a/docs/build-decentralized-apps/reference/07-debugging-tools.mdx b/docs/build-decentralized-apps/reference/07-debugging-tools.mdx index 9cded53979..9e7624baf9 100644 --- a/docs/build-decentralized-apps/reference/07-debugging-tools.mdx +++ b/docs/build-decentralized-apps/reference/07-debugging-tools.mdx @@ -15,7 +15,7 @@ The following tools will help you debug your decentralized apps (dApps): [Tenderly](https://tenderly.co/) is an all-in-one Web3 development platform that empowers developers to build, test, monitor, and operate smart contracts from inception to mass adoption. Tenderly's debugging options focus on providing developers with efficient and user-friendly tools to identify and fix smart contract bugs and production issues. The Debugger enables developers to inspect smart contracts by analyzing precise lines of code in a human-readable format. With Tenderly's Simulator, developers can play out specific historical transactions and current transaction outcomes before sending them onchain, allowing them to change relevant parameters and source code to test and debug contracts. The platform streamlines the debugging process, saving time and resources while improving smart contract reliability. -Although Tenderly provides great debugging options, there are certain limitations when debugging [parent-to-child chain messages](../../how-arbitrum-works/10-l1-to-l2-messaging.mdx) (also known as Retryable Tickets), due to the utilization of custom Geth errors. For further information on this constraint, please refer to the following [resource](../../for-devs/troubleshooting-building#i-tried-to-create-a-retryable-ticket-but-the-transaction-reverted-on-l1--how-can-i-debug-the-issue). +Although Tenderly provides great debugging options, there are certain limitations when debugging [parent-to-child chain messages](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) (also known as Retryable Tickets), due to the utilization of custom Geth errors. For further information on this constraint, please refer to the following [resource](../../for-devs/troubleshooting-building#i-tried-to-create-a-retryable-ticket-but-the-transaction-reverted-on-l1--how-can-i-debug-the-issue). ### Arbiscan diff --git a/docs/build-decentralized-apps/reference/08-mainnet-risks.mdx b/docs/build-decentralized-apps/reference/08-mainnet-risks.mdx index 8a1ed096b6..082a2331aa 100644 --- a/docs/build-decentralized-apps/reference/08-mainnet-risks.mdx +++ b/docs/build-decentralized-apps/reference/08-mainnet-risks.mdx @@ -6,7 +6,7 @@ author: dzgoldman # Arbitrum: Understanding the risks -Arbitrum One is the first permissionless Ethereum parent chain rollup with full Ethereum smart contract functionality, and is [live on mainnet](https://offchain.medium.com/mainnet-for-everyone-27ce0f67c85e) — as is [Nova](https://medium.com/offchainlabs/its-time-for-a-new-dawn-nova-is-open-to-the-public-a081df1e4ad2), our first [AnyTrust chain](/how-arbitrum-works/08-anytrust-protocol.mdx); We're sure you're (almost) as excited as we are! +Arbitrum One is the first permissionless Ethereum parent chain rollup with full Ethereum smart contract functionality, and is [live on mainnet](https://offchain.medium.com/mainnet-for-everyone-27ce0f67c85e) — as is [Nova](https://medium.com/offchainlabs/its-time-for-a-new-dawn-nova-is-open-to-the-public-a081df1e4ad2), our first [AnyTrust chain](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx); We're sure you're (almost) as excited as we are! Here are some risks you should know about before using the system: ### State Of progressive decentralization diff --git a/docs/build-decentralized-apps/token-bridging/02-token-bridge-ether.mdx b/docs/build-decentralized-apps/token-bridging/02-token-bridge-ether.mdx index bb98fae0ca..34807638f9 100644 --- a/docs/build-decentralized-apps/token-bridging/02-token-bridge-ether.mdx +++ b/docs/build-decentralized-apps/token-bridging/02-token-bridge-ether.mdx @@ -41,7 +41,7 @@ ArbSys(100).withdrawEth{ value: 2300000 }(destAddress) Upon withdrawing, the Ether balance is burnt on the Arbitrum side, and will later be made available on the Ethereum side. -`ArbSys.withdrawEth` is a convenience function equivalent to calling `ArbSys.sendTxToL1` with empty `calldataForL1`. Like any other `sendTxToL1` call, it will require an additional call to `Outbox.executeTransaction` on the parent chain after the dispute period elapses for the user to finalize claiming their funds on the parent chain (see [Child to parent chain messaging](/how-arbitrum-works/11-l2-to-l1-messaging.mdx)). Once the withdrawal is executed from the Outbox, the user's `ETH` balance will be credited on the parent chain. +`ArbSys.withdrawEth` is a convenience function equivalent to calling `ArbSys.sendTxToL1` with empty `calldataForL1`. Like any other `sendTxToL1` call, it will require an additional call to `Outbox.executeTransaction` on the parent chain after the dispute period elapses for the user to finalize claiming their funds on the parent chain (see [Child to parent chain messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)). Once the withdrawal is executed from the Outbox, the user's `ETH` balance will be credited on the parent chain. The following diagram depicts the process that funds follow during a withdraw operation. diff --git a/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx b/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx index 4a183c8778..dd8eb6ee24 100644 --- a/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx +++ b/docs/build-decentralized-apps/token-bridging/03-token-bridge-erc20.mdx @@ -46,11 +46,11 @@ Our architecture consists of three types of contracts: -All Ethereum to Arbitrum token transfers are initiated via the router contract on the parent chain, the `L1GatewayRouter` contract. `L1GatewayRouter` forwards the token's deposit call to the appropriate gateway contract on the parent chain, the `L1ArbitrumGateway` contract. `L1GatewayRouter` is responsible for mapping the parent chain token addresses to L1Gateway contracts, thus acting as a parent/child chain address oracle and ensuring each token corresponds to only one gateway. The `L1ArbitrumGateway` then communicates to its counterpart gateway contract on the child chain, the `L2ArbitrumGateway` contract (typically/expectedly via [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx)). +All Ethereum to Arbitrum token transfers are initiated via the router contract on the parent chain, the `L1GatewayRouter` contract. `L1GatewayRouter` forwards the token's deposit call to the appropriate gateway contract on the parent chain, the `L1ArbitrumGateway` contract. `L1GatewayRouter` is responsible for mapping the parent chain token addresses to L1Gateway contracts, thus acting as a parent/child chain address oracle and ensuring each token corresponds to only one gateway. The `L1ArbitrumGateway` then communicates to its counterpart gateway contract on the child chain, the `L2ArbitrumGateway` contract (typically/expectedly via [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)). -Similarly, Arbitrum to Ethereum transfers are initiated via the router contract on the child chain, the `L2GatewayRouter` contract, which calls the token's gateway contract on the child chain, the `L2ArbitrumGateway` contract, which in turn communicates to its corresponding gateway contract on the parent chain, the `L1ArbitrumGateway` contract (typically/expectedly via [sending child-to-parent messages to the outbox](/how-arbitrum-works/11-l2-to-l1-messaging.mdx)). +Similarly, Arbitrum to Ethereum transfers are initiated via the router contract on the child chain, the `L2GatewayRouter` contract, which calls the token's gateway contract on the child chain, the `L2ArbitrumGateway` contract, which in turn communicates to its corresponding gateway contract on the parent chain, the `L1ArbitrumGateway` contract (typically/expectedly via [sending child-to-parent messages to the outbox](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx)). diff --git a/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx b/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx index 6ffe855a39..941e63cb53 100644 --- a/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx +++ b/docs/build-decentralized-apps/token-bridging/bridge-tokens-programmatically/02-how-to-bridge-tokens-standard.mdx @@ -172,7 +172,7 @@ As mentioned before, you can also call the method `outboundTransferCustomRefund` ## Step 5: Wait for execution on the child chain -After calling the deposit method (or the `outboundTransferCustomRefund` if you’re choosing the manual way), you’ll have to wait a bit until the message is executed on the child chain. We will verify the status of the underlying retryable ticket created to bridge the tokens. Check this page to learn more about [parent-to-child chain messages, also known as retryables](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +After calling the deposit method (or the `outboundTransferCustomRefund` if you’re choosing the manual way), you’ll have to wait a bit until the message is executed on the child chain. We will verify the status of the underlying retryable ticket created to bridge the tokens. Check this page to learn more about [parent-to-child chain messages, also known as retryables](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). You can programmatically wait for the execution of the transaction on the child chain using Arbitrum’s SDK. You should first wait for the execution of the submission transaction (the one sent to the router contract) and then the execution of the child chain transaction. diff --git a/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx b/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx index 24bc45ffb4..b607105a3b 100644 --- a/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx +++ b/docs/how-arbitrum-works/bold/bold-technical-deep-dive.mdx @@ -61,7 +61,7 @@ The current implementation of BoLD involves both onchain and offchain components - **Edge:** Edges are a portion of a claim made by a validator about the history of the chain from some end state all the way back to some initial state. Edges are the fundamental unit in a challenge. -- **Fraud proofs:** Proofs that prove or disprove that an invalid state transition has taken place. These proofs are generated by challenge participants and are submitted to a chain's parent chain. For example, Arbitrum Rollups that settle onto Ethereum will have their proofs submitted to Ethereum and verified via a smart contract. In this case, these proofs allow Ethereum to be the final arbiter of disagreements over assertions in the Rollup contracts, which cannot be falsified by any parties as there is only a single, correct result of executing a `WASM` instruction on a pre-state. WASM is the assembly language that is used to represent programs whose execution is being disputed. In fact, Arbitrum, before and after BoLD, uses a slightly different language called WAVM when executing challenges. The difference is not important to this discussion, but for details, see the page outlining the differences between [WASM and WAVM](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx#7-wasm-to-wavm-transformation). +- **Fraud proofs:** Proofs that prove or disprove that an invalid state transition has taken place. These proofs are generated by challenge participants and are submitted to a chain's parent chain. For example, Arbitrum Rollups that settle onto Ethereum will have their proofs submitted to Ethereum and verified via a smart contract. In this case, these proofs allow Ethereum to be the final arbiter of disagreements over assertions in the Rollup contracts, which cannot be falsified by any parties as there is only a single, correct result of executing a `WASM` instruction on a pre-state. WASM is the assembly language that is used to represent programs whose execution is being disputed. In fact, Arbitrum, before and after BoLD, uses a slightly different language called WAVM when executing challenges. The difference is not important to this discussion, but for details, see the page outlining the differences between [WASM and WAVM](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#wavm). - **Honest validator:** An entity that knows the correct state of the Arbitrum child chain and who may want to participate in creating assertions, confirming assertions, and/or challenging invalid assertions if they exist. More specifically, this entity must run an Arbitrum full node in `MakeNodes`, `Defensive`, `StakeLatest`, or `ResolveNodes` mode as described in the [How to run a validator](/run-arbitrum-node/more-types/02-run-validator-node.mdx). Note that there must always be an active proposer (i.e., a validator who actively submits new assertions) to advance the chain and who will need to run a validator in `MakeNodes` mode. @@ -156,7 +156,7 @@ At its core, the disagreement between validators looks something like this: Their disagreement is about an Arbitrum block somewhere between batch 5 and batch 10. Here’s how the actual challenge begins in this example: -Validators have to fetch all blocks between batch 5 and batch 10 and create a Merkle commitment out of them as a Merkle tree with 2^26+1 leaves. If there are fewer than 2^26 blocks in between the assertions, the last block is repeated to pad the leaves of the tree to that value. Validators then create an “edge” data structure, which contains the following fields: +Validators have to fetch all blocks between batch 5 and batch 10 and create a Merkle commitment out of them as a Merkle tree with `2^26+1` leaves. If there are fewer than 2^26 blocks in between the assertions, the last block is repeated to pad the leaves of the tree to that value. Validators then create an “edge” data structure, which contains the following fields: - **start_hash:** the start_hash of the claimed assertion and is also the end_hash of the previous assertion @@ -198,7 +198,7 @@ A validator can make a bisection move on an edge as long as that edge is “riva The number of steps of execution at which validators could disagree within a single Arbitrum block has a max of 2^42. To play a game of bisections on this amount of hashes would be unreasonable from a space requirement, as each history commitment would require 4.35Tb worth of hashes. Instead, BoLD plays the bisection game over different levels of granularity of this space of 2^42 hashes that we call sub-challenges that can be viewed as recursive execution of the dispute resolution process. -As a reminder, the bisection game is an iterative and interactive process. The first sub-challenge is at the block level and is where validators disagree over Arbitrum blocks between two assertions. The disagreeing validators create “edges” containing history commitments to all the blocks in between those two assertions, which is a max of 2^26 child chain blocks, and commence the bisection game. As they progressively narrow down to a single block of disagreement, the validators then begin the next phase of the challenge process by opening a sub-challenge over up to 2^19 **BigSteps**, which are each 2^23 steps of WASM execution. Once they reach a single disagreement at the BigStep level, they open a final sub-challenge over a maximum of 2^23 SmallSteps, which are each a single step of WASM execution. The bisection game is the same at each sub-challenge level, and opening a sub-challenge requires placing another “challenge bond”. The magnitudes of challenge bonds are different at each sub-challenge level. +As a reminder, the bisection game is an iterative and interactive process. The first sub-challenge is at the block level and is where validators disagree over Arbitrum blocks between two assertions. The disagreeing validators create “edges” containing history commitments to all the blocks in between those two assertions, which is a max of `2^26` child chain blocks, and commence the bisection game. As they progressively narrow down to a single block of disagreement, the validators then begin the next phase of the challenge process by opening a sub-challenge over up to `2^19` **BigSteps**, which are each `2^23` steps of WASM execution. Once they reach a single disagreement at the BigStep level, they open a final sub-challenge over a maximum of `2^23` SmallSteps, which are each a single step of WASM execution. The bisection game is the same at each sub-challenge level, and opening a sub-challenge requires placing another “challenge bond”. The magnitudes of challenge bonds are different at each sub-challenge level. #### One step proof diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index da99129c22..0a45eaee12 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -19,7 +19,7 @@ BoLD replaces the previous, permissioned fr ## In a nutshell: - Validation for Arbitrum One and Arbitrum Nova is a privileged action currently limited to an [allow-listed set of parties, maintained by the Arbitrum DAO](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators) to reduce the risks of _[delay attacks](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a)_. _Delay attacks_ are a class of attacks where malicious entities can open as many disputes as they are willing to forfeit bonds during the challenge period to delay confirmations of assertions (equal to the time needed to resolve those disputes one by one). -- BoLD, an acronym for Bounded Liquidity Delay, is a new challenge resolution protocol for Arbitrum chains that enables permissionless validation by mitigating the risks of delay attacks against [Optimistic rollups like Arbitrum](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx). This is possible because BoLD's design ensures disputes will be resolved within a fixed time window, currently set to equal one challenge period (~6.4 days) for Arbitrum One and Arbitrum Nova. If there is a dispute, BoLD guarantees the maximum total time to be equal to two challenge periods (one for raising disputes, one for resolving disputes), a two day grace period for the Security Council to intervene if necessary, and a small delta for computing challenges. +- BoLD, an acronym for Bounded Liquidity Delay, is a new challenge resolution protocol for Arbitrum chains that enables permissionless validation by mitigating the risks of delay attacks against [Optimistic rollups like Arbitrum](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol). This is possible because BoLD's design ensures disputes will be resolved within a fixed time window, currently set to equal one challenge period (~6.4 days) for Arbitrum One and Arbitrum Nova. If there is a dispute, BoLD guarantees the maximum total time to be equal to two challenge periods (one for raising disputes, one for resolving disputes), a two day grace period for the Security Council to intervene if necessary, and a small delta for computing challenges. - Enabling permissionless validation is key milestone on [Arbitrum’s journey to becoming a Stage 2 Rollup](https://docs.arbitrum.foundation/state-of-progressive-decentralization) - the most advanced and mature rollup technology categorization, according to [L2Beat](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). With BoLD, **any honest party can validate and bond their funds to post a correct child chain state assertions to win disputes against malicious entities.** ## What _exactly_ is BoLD? @@ -84,12 +84,12 @@ The BoLD protocol provides the guardrails and rules for how validators challenge Let’s dive in to an overview of how BoLD actually works. -1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to it's parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge. This is where BoLD comes into play. +1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to it's parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge. This is where BoLD comes into play. 2. **A challenge is opened:** When another validator observes and disagrees with the end state represented by `Block Z`, they can permissionlessly open a challenge by asserting and bonding capital to a claim on a different end state, represented by an assertion `Block Y`. At this point in time, there are now two asserted states: `Block A → Block Z` and `Block A → Block Y`. Each of these asserted states, at this point in time now that there's a challenge, are referred to _edges_ while a Merkle tree of asserted states from some start to endpoint (e.g., `Block A → Block Z`) is more formally known as a _history commitment._ It is important to note that Ethereum at this point in time has no notion of which edge(s) is correct or incorrect - edges are simply a portion of a claim made by a validator about the history of the chain from some end state all the way back to some initial state. Also note that because a bond put up by a validator is tied to an assertion rather than the party who put up that bond, there can be any number of honest, anonymous parties that can open challenges against incorrect claims. It is important to note that the bonds put up to open challenges are held in the rollup contract. There is a prescribed procedure for what the Arbitrum Foundation is expected to do with these funds; see Step 5 below for a summary. -3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to come to an agreement on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective _history commitments_ until they arrive at a single step of instruction where an arbiter, like Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/05-validation-and-proving/01-validation-and-proving.mdx) - BoLD only changes some minor, but important, details in the resolution process. Let’s dive into what happens next: +3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to come to an agreement on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective _history commitments_ until they arrive at a single step of instruction where an arbiter, like Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) - BoLD only changes some minor, but important, details in the resolution process. Let’s dive into what happens next: - **Block challenges**: When a challenge is opened, the edges are called _level-zero edges_ since they are at the granularity of Arbitrum blocks. The disputing parties take turns bisecting their history commitments until they identify the specific block that they disagree on. - - **Big-step challenge:** Now that the parties have narrowed down their dispute to a single block, the back-and-forth bisection exercise continues within that block. Note that this block is agreed by all parties to be some state after the initial state, but before the final states. This time, however, the parties will narrow down on a specific _range_ of instructions for the State Transition Function within the block - essentially working towards identifying a set of instructions within which their disagreement lies. This range is currently defined as 2^20 steps of `WASM` instructions, which is the assembly of choice for validating Arbitrum chains. - - **One-step challenge:** Within that range of 2^20 instructions, the back-and-forth bisecting continues until all parties arrive at a single step of instruction that they disagree on. At this point in time, parties agree on the initial state of Arbitrum before the step but disagree on the end state one step immediately after. Remember that since Arbitrum’s state is entirely deterministic, there is only one correct end state. + - **Big-step challenge:** Now that the parties have narrowed down their dispute to a single block, the back-and-forth bisection exercise continues within that block. Note that this block is agreed by all parties to be some state after the initial state, but before the final states. This time, however, the parties will narrow down on a specific _range_ of instructions for the State Transition Function within the block - essentially working towards identifying a set of instructions within which their disagreement lies. This range is currently defined as `2^20` steps of `WASM` instructions, which is the assembly of choice for validating Arbitrum chains. + - **One-step challenge:** Within that range of `2^20` instructions, the back-and-forth bisecting continues until all parties arrive at a single step of instruction that they disagree on. At this point in time, parties agree on the initial state of Arbitrum before the step but disagree on the end state one step immediately after. Remember that since Arbitrum’s state is entirely deterministic, there is only one correct end state. 4. **One-step proof:** Once a challenge is isolated down to a dispute about a single step, both parties run that step to produce, and then submit, a one-step proof to the OneStepProof smart contract on the parent chain (e.g., Ethereum). A one-step proof is a proof that a single step of computation results in a particular state. The smart contract on the parent chain will execute the disputed step to validate the correctness of a submitted proof from the two parties. It is at this point that the honest party's proof will be deemed valid and its tree of edges will be confirmable by time, while the dishonest party will have their edges rejected by timeout. 5. **Confirmation:** Once the honest one-step edge is confirmed, the protocol will work on confirming or rejecting the parent edges until it reaches the level-zero edge of the honest party. With the honest party’s level-zero edge now confirmed, the honest party’s assertion bond can be withdrawn. Meanwhile, the dishonest party has their bonds taken away to ensure the dishonest party is always punished. - There is another way that a level-zero edge can get confirmed: time. At each of the mini-stages of the challenge (block challenge, big-step challenge, one-step challenge), a timer increments upwards towards some challenge period, _T_ defined by BoLD. This timer begins ticking for a party when they submit their bisected history commitment until their challenger submits their bisected history commitment in response. An edge is automatically confirmed if the timer reaches _T._ @@ -113,7 +113,7 @@ Assertion bond sizes can be thought of as a “security deposit” that an entit **Challenge bond sizes** -If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their own assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is not tied up to specific addresses. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx), and certain moves within a challenge have an additional bond required to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1110 `ETH` to fully resolve a dispute, which will also get reimbursed upon the confirmation of assertions by the protocol. +If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their own assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is not tied up to specific addresses. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges), and certain moves within a challenge have an additional bond required to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1110 `ETH` to fully resolve a dispute, which will also get reimbursed upon the confirmation of assertions by the protocol. The rationale behind the specific challenge bond size was made using something called a “resource ratio” - defined as the cost ratio between an adversary and an honest party when participating in the interactive fraud proof game. The value was chosen to ensure that the malicious party will pay 10x the marginal costs of the honest party. This resource ratio, coupled with the fact that an honest party will always get their bonds refunded while a malicious party loses everything, helps prevent and deter attacks to begin with. diff --git a/docs/how-arbitrum-works/deep-dives/assertions.mdx b/docs/how-arbitrum-works/deep-dives/assertions.mdx index aecbda4cd0..fa25d60ce2 100644 --- a/docs/how-arbitrum-works/deep-dives/assertions.mdx +++ b/docs/how-arbitrum-works/deep-dives/assertions.mdx @@ -56,7 +56,7 @@ The assertion is assigned a deadline, which indicates how much time other valida Even if the Assertion Tree has multiple conflicting assertions and multiple disputes are in progress, validators can continue making new assertions. Honest validators will build on one valid assertion (intuitively, an assertion is also an implicit claim of the validity of all of its parent assertions). Likewise, users can continue transacting on the child chain since transactions will continue to post in the chain's inbox. -The only delay users experience during a dispute is their [Child to parent chain messages](/how-arbitrum-works/11-l2-to-l1-messaging.mdx) (i.e., withdrawals). A key property of BoLD is that we can guarantee that, in the common case, their withdrawals/messages will only get delayed for one challenge period. In the case of an actual dispute, the withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. +The only delay users experience during a dispute is their [Child to parent chain messages](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) (i.e., withdrawals). A key property of BoLD is that we can guarantee that, in the common case, their withdrawals/messages will only get delayed for one challenge period. In the case of an actual dispute, the withdrawals/messages will be delayed by no more than two challenge periods, regardless of the adversaries' behavior during the challenge. ## Staking and validator incentives diff --git a/docs/how-arbitrum-works/deep-dives/09-gas-fees.mdx b/docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx similarity index 100% rename from docs/how-arbitrum-works/deep-dives/09-gas-fees.mdx rename to docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx diff --git a/docs/how-arbitrum-works/deep-dives/geth.mdx b/docs/how-arbitrum-works/deep-dives/geth.mdx index 771ff89f77..3e0258d9ef 100644 --- a/docs/how-arbitrum-works/deep-dives/geth.mdx +++ b/docs/how-arbitrum-works/deep-dives/geth.mdx @@ -135,11 +135,11 @@ It represents a user deposit from a parent chain to a child chain. This represen ### [`ArbitrumSubmitRetryableTx`](https://github.com/OffchainLabs/go-ethereum/blob/7503143fd13f73e46a966ea2c42a058af96f7fcf/core/types/arb_types.go#L232) -It represents a retryable submission and may schedule an [`ArbitrumRetryTx`](#arbitrumretrytx) if enough gas is available. Fore more info, please see the [retryables documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets). +It represents a retryable submission and may schedule an [`ArbitrumRetryTx`](#arbitrumretrytx) if enough gas is available. Fore more info, please see the [retryables documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets). ### [`ArbitrumRetryTx`](https://github.com/OffchainLabs/go-ethereum/blob/7503143fd13f73e46a966ea2c42a058af96f7fcf/core/types/arb_types.go#L161) -These calls get scheduled by calls using the `redeem` method of the [`ArbRetryableTx`](/build-decentralized-apps/precompiles/02-reference.mdx#arbretryabletx) precompile and via retryable auto-redemption. Fore more info, please see the [retryables documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets). +These calls get scheduled by calls using the `redeem` method of the [`ArbRetryableTx`](/build-decentralized-apps/precompiles/02-reference.mdx#arbretryabletx) precompile and via retryable auto-redemption. Fore more info, please see the [retryables documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets). ### [`ArbitrumInternalTx`](https://github.com/OffchainLabs/nitro/blob/8e786ec6d1ac3862be85e0c9b5ac79cbd883791c/arbos/internal_tx.go) @@ -167,7 +167,7 @@ Nitro's Geth is configurable with the following [child chain-specific chain para ### `EnableArbos` -Introduces [ArbOS](/how-arbitrum-works/04-state-transition-function/05-arbos.mdx), converting what would otherwise be a vanilla parent chain into a child chain Arbitrum rollup. +Introduces [ArbOS](/how-arbitrum-works/deep-dives/arbos.mdx), converting what would otherwise be a vanilla parent chain into a child chain Arbitrum rollup. ### `AllowDebugPrecompiles` diff --git a/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx b/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx index 94d45fef5b..39e9e8b568 100644 --- a/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx +++ b/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx @@ -9,7 +9,7 @@ content_type: get-started import ImageZoom from '@site/src/components/ImageZoom'; -In the [Bypassing the Sequencer](/how-arbitrum-works/02-transaction-lifecycle.mdx#bypassing-the-sequencer) section, we introduced an alternative way for users to submit transactions to a child chain by going through the parent chain's Delayed Inbox contract instead of sending them directly to the Sequencer. This approach is one example of a parent-to-child messaging path. More broadly, parent-to-child chain messaging covers all ways to: +In the [Bypassing the Sequencer](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx#bypassing-the-sequencer) section, we introduced an alternative way for users to submit transactions to a child chain by going through the parent chain's Delayed Inbox contract instead of sending them directly to the Sequencer. This approach is one example of a parent-to-child messaging path. More broadly, parent-to-child chain messaging covers all ways to: - Submit child chain bound transaction from a parent chain - Deposit `ETH` or native tokens from a parent chain to a child chain @@ -22,7 +22,7 @@ We generally categorize these parent-to-child chain messaging methods as follows - **`ETH` Bridging**: For Arbitrum chains that use `ETH` as their gas token, users can deposit `ETH` onto a child chain via the Delayed Inbox. - **Custom gas token bridging**: For Arbitrum chains that use a custom gas token, users can deposit that chain's native token to a child chain using the same mechanism. -2. **Transaction via the Delayed Inbox**: As described in the [Bypassing the Sequencer](/how-arbitrum-works/02-transaction-lifecycle.mdx#bypassing-the-sequencer) section, this method allows users to send transactions through the parent chain. It includes two sub-types of messages: +2. **Transaction via the Delayed Inbox**: As described in the [Bypassing the Sequencer](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx#bypassing-the-sequencer) section, this method allows users to send transactions through the parent chain. It includes two sub-types of messages: - **Unsigned messages**: General arbitrary data or function calls - **Signed messages**: Messages that include a signature, enabling certain authenticated actions @@ -105,7 +105,7 @@ modifier onlyFromMyL1Contract() override { Arbitrum provides a _Delayed Inbox_ contract on the parent chain that can deliver arbitrary messages to the child chain. This functionality is important for two reasons: 1. **General cross-chain messaging**: Allows parent chain EOAs or parent chain contracts to send messages or transactions to a child chain. This functionality is critical for bridging assets (other than the chain's native token) and performing cross-chain operations. -2. **Censorship resistance**: It ensures the Arbitrum chain remains censorship-resistant, even if the Sequencer misbehaves or excludes certain transactions; refer to [Bypassing the Sequencer](/how-arbitrum-works/02-transaction-lifecycle.mdx#bypassing-the-sequencer) for more details. +2. **Censorship resistance**: It ensures the Arbitrum chain remains censorship-resistant, even if the Sequencer misbehaves or excludes certain transactions; refer to [Bypassing the Sequencer](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdxtransaction-lifecycle.mdx#bypassing-the-sequencer) for more details. Users can send child chain transactions through the Delayed Inbox in two primary ways: diff --git a/docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx b/docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx index f0e2cc472c..3f4e2af9d3 100644 --- a/docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx +++ b/docs/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx @@ -15,7 +15,7 @@ allows for arbitrary child chain to contract calls, i.e., messages initiated from the child chain, which eventually resolve in execution on the parent chain. Child-to-parent chain messages (aka "outgoing" messages) bear some things in common with Arbitrum's [parent chain to child chain -messages](/how-arbitrum-works/10-l1-to-l2-messaging.mdx), which are "in reverse" though with +messages](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx), which are "in reverse" though with differences, which we'll explore in this section. ## Protocol flow @@ -69,7 +69,7 @@ We refer to `NodeInterface` as a "virtual" contract; its methods are accessible ### Why child to parent chain messages require manual execution -Unlike [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx), which can execute automatically with pre-funded gas, child-to-parent chain message must undergo manual execution because Ethereum (parent chain) does not support scheduled execution. +Unlike [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx), which can execute automatically with pre-funded gas, child-to-parent chain message must undergo manual execution because Ethereum (parent chain) does not support scheduled execution. However, applications can implement execution markets that allow third parties to execute messages for a fee. @@ -108,7 +108,7 @@ The following diagram depicts the process that funds follow during a withdrawal ## `ERC-20` token withdrawal -Arbitrum has a canonical bridge design and architecture, which we explain in detail in the [Token bridging](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#token-bridging) section of Bridging from a parent chain to a child chain article. This section will explain how the Arbitrum canonical bridge works on the child-to-parent chain token bridging. +Arbitrum has a canonical bridge design and architecture, which we explain in detail in the [Token bridging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#token-bridging) section of Bridging from a parent chain to a child chain article. This section will explain how the Arbitrum canonical bridge works on the child-to-parent chain token bridging. 1. Initiation of a child-to-parent chain transfer occurs via the `L2GatewayRouter` contract on the child chain. 2. The token's gateway contract (`L2ArbitrumGateway`) on the child chain gets called. diff --git a/docs/how-arbitrum-works/deep-dives/sequencer.mdx b/docs/how-arbitrum-works/deep-dives/sequencer.mdx index a705a4db43..b1a53449d2 100644 --- a/docs/how-arbitrum-works/deep-dives/sequencer.mdx +++ b/docs/how-arbitrum-works/deep-dives/sequencer.mdx @@ -269,7 +269,7 @@ Developers and users should consider the appropriate level of finality based on ## Censorship Timeout -As mentioned in the original [Arbitrum BoLD Forum Post](https://forum.arbitrum.foundation/t/aip-bold-permissionless-validation-for-arbitrum/23232/70?), the initial release of [Arbitrum BoLD](../how-arbitrum-works/bold/gentle-introduction.mdx) will come with a feature called ”Censorship Timeout” (originally called “Delay Buffer”). For Arbitrum One and Arbitrum Nova, it is proposed that this feature be enabled by default alongside BoLD’s upgrade. +As mentioned in the original [Arbitrum BoLD Forum Post](https://forum.arbitrum.foundation/t/aip-bold-permissionless-validation-for-arbitrum/23232/70?), the initial release of [Arbitrum BoLD](/how-arbitrum-works/bold/gentle-introduction.mdx) will come with a feature called ”Censorship Timeout” (originally called “Delay Buffer”). For Arbitrum One and Arbitrum Nova, it is proposed that this feature be enabled by default alongside BoLD’s upgrade. Censorship Timeout aims to limit the negative effects of: diff --git a/docs/run-arbitrum-node/arbos-releases/01-overview.mdx b/docs/run-arbitrum-node/arbos-releases/01-overview.mdx index e237ad6107..5db55b5bbd 100644 --- a/docs/run-arbitrum-node/arbos-releases/01-overview.mdx +++ b/docs/run-arbitrum-node/arbos-releases/01-overview.mdx @@ -27,7 +27,7 @@ import PublicPreviewBannerPartial from '../../node-running/partials/_upgrade-cad ArbOS upgrades are carried out by the chain's owner; in the case of Arbitrum One and Nova, the owner is the Arbitrum DAO and so an upgrade will require a governance proposal and vote to pass to complete the upgrade. [This is an example of a Nitro release that contains an ArbOS version bump, specifically to ArbOS 11](https://github.com/OffchainLabs/nitro/releases/tag/v2.2.0). -Visit [How Arbitrum works](/how-arbitrum-works/01-a-gentle-introduction.mdx) to learn more about Nitro's architecture; more information about ArbOS software releases is available on [the Arbitrum DAO forum](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695). +Visit [How Arbitrum works](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) to learn more about Nitro's architecture; more information about ArbOS software releases is available on [the Arbitrum DAO forum](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695). ## List of available ArbOS releases diff --git a/docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx b/docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx index 851435f8c5..f1de268bbe 100644 --- a/docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx +++ b/docs/run-arbitrum-node/data-availability-committees/01-get-started.mdx @@ -15,7 +15,7 @@ content_type: overview This section offers information and a series of how-to guides to help you along the process of setting up a Data Availability Committee. These guides target two audiences: Committee members who wish to deploy a Data Availability Server, and chain owners who wish to configure their chain with the information of the Committee. -Before following the guides in this section, you should be familiar with how the AnyTrust protocol works and the role of the DAC in the protocol. Refer to the [AnyTrust Protocol](/how-arbitrum-works/08-anytrust-protocol.mdx) documentation to learn more. +Before following the guides in this section, you should be familiar with how the AnyTrust protocol works and the role of the DAC in the protocol. Refer to the [AnyTrust Protocol](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) documentation to learn more. ## If you are a DAC member diff --git a/docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx b/docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx index 2b52b5c25b..3792e63992 100644 --- a/docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx +++ b/docs/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx @@ -22,7 +22,7 @@ For more information related to configuring a DAC, refer to the [Introduction](/ This how-to assumes that you're familiar with: -- The DAC's role in the AnyTrust protocol. Refer to [Inside AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) for a refresher. +- The DAC's role in the AnyTrust protocol. Refer to [Inside AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) for a refresher. - [Kubernetes](https://kubernetes.io/). The examples in this guide use Kubernetes to containerize your DAS. ## How does a DAS work? @@ -427,7 +427,7 @@ After you decode a batch poster transaction and get its `data` within the functi The first part (1 byte) is the `header flag`, which is used to specify which type of batch it is. Here we need to check if it has bit `0x80` (For example, `0x88` and `0x80` are both valid, but `0x55` is wrong). -The second part (32 bytes) is the keyset hash. You can learn more about what keyset is [here](/how-arbitrum-works/08-anytrust-protocol.mdx#keysets). +The second part (32 bytes) is the keyset hash. You can learn more about what keyset is [here](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx#keysets). The third part (32 bytes) is the data hash, and this is what we need to retrieve data. When you get this hash, you can retrieve data directly by following what we demonstrate in Step 4. diff --git a/docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx b/docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx index 3b9a622367..f30aeed4e6 100644 --- a/docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx +++ b/docs/run-arbitrum-node/data-availability-committees/04-configure-dac.mdx @@ -21,7 +21,7 @@ In this how-to, you'll learn how to configure the DAC in your chain. Refer to th This how-to assumes that you're familiar with: -- The DAC's role in the AnyTrust protocol. Refer to [Inside AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) for a refresher. +- The DAC's role in the AnyTrust protocol. Refer to [Inside AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) for a refresher. - [Kubernetes](https://kubernetes.io/). The examples in this guide use Kubernetes to containerize your DAS. - [How to deploy a Data Availability Server (DAS)](/run-arbitrum-node/data-availability-committees/02-deploy-das.mdx). This is needed to understand where the data we'll be handling in this guide comes from. - The [Foundry toolkit](https://github.com/foundry-rs/foundry) @@ -44,7 +44,7 @@ The AnyTrust protocol assumes that for the `n` members of the DAC, a minimum of To perform this signing operation, each DAC member must generate their own set of BLS public and private keys. They should do this independently and ensure these keys are random and only used by them. You can find more information about how to generate a BLS pair of keys in [Generating BLS Keys](/run-arbitrum-node/data-availability-committees/deploy-das#step-1-generate-the-bls-keypair). -An AnyTrust chain needs to know all DAC members' public keys to validate the integrity of the data being batched and posted. A _keyset_ is a list of all DAC members' RPC endpoint and BLS public key. Additionally, it also contains information about how many signatures are needed to approve a Data Availability Certificate (DACert), via a special `assumed-honest` parameter (i.e., the `h` parameter we mentioned above). This design lets the chain owner modify the DAC membership over time, and DAC members change their keys if needed. See [Inside AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) for more information. +An AnyTrust chain needs to know all DAC members' public keys to validate the integrity of the data being batched and posted. A _keyset_ is a list of all DAC members' RPC endpoint and BLS public key. Additionally, it also contains information about how many signatures are needed to approve a Data Availability Certificate (DACert), via a special `assumed-honest` parameter (i.e., the `h` parameter we mentioned above). This design lets the chain owner modify the DAC membership over time, and DAC members change their keys if needed. See [Inside AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) for more information. We use this keyset, and its hash to configure the `SequencerInbox` contract with the valid keyset, and also the batch poster (to request storing information) and full nodes (to request information already stored). diff --git a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx index e3e0ff3c84..35862dd0e4 100644 --- a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx +++ b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx @@ -13,7 +13,7 @@ This page describes the different strategies a validator may follow and provides This how-to assumes that you're familiar with the following: - How to run a full node (see instructions [here](/run-arbitrum-node/02-run-full-node.mdx)) -- [How the Rollup protocol works](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx) +- [How the Rollup protocol works](/how-arbitrum-works/inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) - [How BoLD works](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx#how-bold-uses-ethereum), if you're running a validator for a chain that has BoLD activated ## Validation strategies diff --git a/docs/stylus/concepts/how-it-works.md b/docs/stylus/concepts/how-it-works.md index 205ed0084c..0ba7c7466c 100644 --- a/docs/stylus/concepts/how-it-works.md +++ b/docs/stylus/concepts/how-it-works.md @@ -41,7 +41,7 @@ EVM contracts continue to execute the same way they were before Stylus. When cal Nitro operates in two modes: a "happy case" where it compiles execution history to native code, and a "sad case" during validator disputes, where it compiles execution history to WASM for interactive fraud proofs on Ethereum. Stylus builds on Nitro's fraud-proving technology, allowing it to verify both execution history and WASM programs deployed by developers. -Stylus is made possible by Nitro’s ability to replay and verify disputes using WASM. Validators bisect disputes until an invalid step is identified and proven onchain through a [“one-step proof.”](/how-arbitrum-works/05-validation-and-proving/03-proving-and-challenges.mdx#simplified-bisection-protocol). This deterministic fraud-proving capability ensures the correctness of any arbitrary program compiled to WASM. The combination of WASM's and Nitro's properties enables this technological leap we call Stylus. +Stylus is made possible by Nitro’s ability to replay and verify disputes using WASM. Validators bisect disputes until an invalid step is identified and proven onchain through a [“one-step proof.”](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#dissection-protocol-simplified-version). This deterministic fraud-proving capability ensures the correctness of any arbitrary program compiled to WASM. The combination of WASM's and Nitro's properties enables this technological leap we call Stylus. For more details on Nitro’s architecture, refer to the [documentation](/how-arbitrum-works/01-a-gentle-introduction.mdx) or the [Nitro whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf). diff --git a/docs/welcome/get-started.mdx b/docs/welcome/get-started.mdx index b9e8a3c6c1..5a64f6f5a2 100644 --- a/docs/welcome/get-started.mdx +++ b/docs/welcome/get-started.mdx @@ -14,17 +14,17 @@ Arbitrum suite along with onboarding guidance tailored to specific audiences. The Arbitrum suite includes the protocols, chains, services, and SDKs that power the Arbitrum ecosystem: -| Component | Description | -| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| [Arbitrum Rollup](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx) | A **protocol** for scaling Ethereum smart contracts. | -| [Arbitrum AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) | A **protocol** for scaling Ethereum smart contracts even further, with a mild trust assumption. | -| [Arbitrum Nitro](/how-arbitrum-works/01-a-gentle-introduction.mdx) | The node **software** that codifies the Rollup and AnyTrust protocols. | -| [Arbitrum nodes](/run-arbitrum-node/02-run-full-node.mdx) | **Machines** that run Nitro in order to service and/or interact with an Arbitrum chain. | -| [Arbitrum One](https://portal.arbitrum.io/?chains=arbitrum-one) | A public Rollup **chain**. | -| [Arbitrum Nova](https://portal.arbitrum.io/?chains=arbitrum-nova) | A public AnyTrust **chain**. | -| [Arbitrum bridge](https://bridge.arbitrum.io/) | Lets you move `ETH` and `ERC-20` tokens between Ethereum, Arbitrum, and select Arbitrum (Orbit) chains. | -| [Arbitrum (Orbit) chains](https://orbit.arbitrum.io/) | Lets you run your own Rollup and AnyTrust chains. | -| [Arbitrum Stylus](/stylus/gentle-introduction.mdx) | Lets you write EVM-compatible smart contracts in Rust and any other language that compiles to Wasm. | +| Component | Description | +| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| [Arbitrum Rollup](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) | A **protocol** for scaling Ethereum smart contracts. | +| [Arbitrum AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) | A **protocol** for scaling Ethereum smart contracts even further, with a mild trust assumption. | +| [Arbitrum Nitro](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) | The node **software** that codifies the Rollup and AnyTrust protocols. | +| [Arbitrum nodes](/run-arbitrum-node/02-run-full-node.mdx) | **Machines** that run Nitro in order to service and/or interact with an Arbitrum chain. | +| [Arbitrum One](https://portal.arbitrum.io/?chains=arbitrum-one) | A public Rollup **chain**. | +| [Arbitrum Nova](https://portal.arbitrum.io/?chains=arbitrum-nova) | A public AnyTrust **chain**. | +| [Arbitrum bridge](https://bridge.arbitrum.io/) | Lets you move `ETH` and `ERC-20` tokens between Ethereum, Arbitrum, and select Arbitrum (Orbit) chains. | +| [Arbitrum (Orbit) chains](https://orbit.arbitrum.io/) | Lets you run your own Rollup and AnyTrust chains. | +| [Arbitrum Stylus](/stylus/gentle-introduction.mdx) | Lets you write EVM-compatible smart contracts in Rust and any other language that compiles to Wasm. | ## Arbitrum for users @@ -68,6 +68,6 @@ The Arbitrum suite includes the protocols, chains, services, and SDKs that power | Resource | Description | | -------------------------------------------------------------------------------------------------- | ------------------------------------------------- | | [Inside Nitro](/how-arbitrum-works/01-a-gentle-introduction.mdx) | A technical deep dive into Nitro's architecture. | -| [Inside AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) | A technical deep dive into the AnyTrust protocol. | +| [Inside AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) | A technical deep dive into the AnyTrust protocol. | | [Arbitrum whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf) | The original whitepaper that introduced Nitro. | | [DAO docs](https://docs.arbitrum.foundation/gentle-intro-dao-governance) | Docs that support members of the Arbitrum DAO. | diff --git a/sidebars.js b/sidebars.js index 20264249b7..f0db3c0976 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1042,6 +1042,11 @@ const sidebars = { label: 'Transaction lifecycle', id: 'how-arbitrum-works/deep-dives/transaction-lifecycle', }, + { + type: 'doc', + label: 'Gas and fees', + id: 'how-arbitrum-works/deep-dives/gas-and-fees', + }, ], }, { diff --git a/vercel.json b/vercel.json index d923055758..ddfa6fedff 100644 --- a/vercel.json +++ b/vercel.json @@ -205,6 +205,11 @@ "destination": "/(docs/run-arbitrum-node/data-availability/?)", "permanent": false }, + { + "source": "/(docs/how-arbitrum-works/deep-dives/gas-fees/?)", + "destination": "/(docs/how-arbitrum-works/deep-dives/gas-and-fees/?)", + "permanent": false + }, { "source": "/(docs/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum/?)", "destination": "/(docs/how-arbitrum-works/deep-dives/geth/?)", From b5226014e12f81738668d1efd919b05877f64089 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 14:26:05 -0500 Subject: [PATCH 24/75] updating broken links --- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 2 +- docs/how-arbitrum-works/deep-dives/05-arbos.mdx | 2 +- docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx | 2 +- docs/how-arbitrum-works/deep-dives/stf-inputs.mdx | 6 +++--- .../advanced-configurations/02-bold.mdx | 4 ++-- .../01-use-a-custom-gas-token-anytrust.mdx | 2 +- .../02-use-a-custom-gas-token-rollup.mdx | 4 ++-- .../common-configurations/07-fee-management.mdx | 4 ++-- .../07-canonical-factory-contracts.mdx | 2 +- .../04-maintain-your-chain/04-guidance/03-state-growth.mdx | 2 +- .../06-monitoring-tools-and-considerations.mdx | 2 +- .../how-tos/arbitrum-chain-finality.mdx | 6 +++--- docs/partials/_gentle-intro-partial.mdx | 2 +- docs/run-arbitrum-node/arbos-releases/arbos11.mdx | 2 +- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index dc666908b4..d0e092cd20 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -124,7 +124,7 @@ Because the top and bottom layers rely heavily on code from Geth, this structure The State Transition Function consists of the bottom Geth layer, and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox, and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and at the end will emit the header of a new block (in Ethereum's block header format) which will be appended to the Nitro chain. :::info More information -For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works/deep-dives/modified-geth-on-arbitrum.mdx) +For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works/deep-dives/geth.mdx) ::: diff --git a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx index 88509debec..a162baf619 100644 --- a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/05-arbos.mdx @@ -27,7 +27,7 @@ An [`L1IncomingMessage`](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e98 ## Retryables -A retryable is a special message type for creating atomic parent chain to child chain messages; for details, see [parent-to-child chain messaging](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +A retryable is a special message type for creating atomic parent chain to child chain messages; for details, see [parent-to-child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). ## ArbOS state diff --git a/docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx b/docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx index 2c6e43f21f..5fa5b6cbde 100644 --- a/docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx +++ b/docs/how-arbitrum-works/deep-dives/gas-and-fees.mdx @@ -18,7 +18,7 @@ The parent chain component is the product of the Geth would pay to bonders in a vanilla parent chain, such as the computation and storage charges applying the State Transition Function entails. ArbOS charges additional fees for executing its child chain-specific [precompiles](/build-decentralized-apps/precompiles/01-overview.mdx), whose fees are dynamically priced according to the specific resources used while executing the call. -The following sections will detail how to calculate parent and child chain fees. If you do not need precise calculations or a technical understanding, skip to the next section, [Parent chain to child chain messaging](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +The following sections will detail how to calculate parent and child chain fees. If you do not need precise calculations or a technical understanding, skip to the next section, [Parent chain to child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). ## Parent chain gas pricing diff --git a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx index 02c2696ee7..51585e0856 100644 --- a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx +++ b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx @@ -13,11 +13,11 @@ content_type: get-started First, nodes subscribe to the Sequencer feed, receiving the upcoming ordered transactions -published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/03-sequencer.mdx#real-time-sequencer-feed). +published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/deep-dives/sequencer.mdx#real-time-sequencer-feed). In addition to the Sequencer Feed, Arbitrum nodes subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those previously provided by the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. -As discussed in the [considerations and limitations section](/how-arbitrum-works/03-sequencer.mdx#considerations-and-limitations), these methods may be more appropriate for different applications depending on their specific requirements. +As discussed in the [considerations and limitations section](/how-arbitrum-works/deep-dives/sequencer.mdx#considerations-and-limitations), these methods may be more appropriate for different applications depending on their specific requirements. Arbitrum nodes reliably receive an ordered set of transactions through these mechanisms, which serve as inputs for the State Transition Function (STF). The function then processes these transactions and outputs the final state, ensuring consistency and security across the network. @@ -28,7 +28,7 @@ Arbitrum supports submitting a variety of message types to its chains. These mes - Messages submitted directly to the Sequencer as child chain messages - Messages submitted to the parent chain -For more details on message types beyond standard child chain transactions, please refer to the [parent-to-child chain messaging documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +For more details on message types beyond standard child chain transactions, please refer to the [parent-to-child chain messaging documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). In the system, we refer to these messages as `L1IncomingMessage` [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54). diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/02-bold.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/02-bold.mdx index 35f4c19b60..98a75a8c40 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/02-bold.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/02-bold.mdx @@ -3,7 +3,7 @@ title: 'BoLD configuration parameters' sidebar_label: 'BoLD configuration parameters' description: 'Learn about the various parameters that can be configured for Arbitrum BoLD' author: dlee -sme: dlee +sme: dleeencer user_story: As a current or prospective Arbitrum chain owner, I need to understand the various configuration parameters with Arbitrum BoLD content_type: how-to --- @@ -18,7 +18,7 @@ read these two guides first before proceeding with changing any of the parameter To read more about Arbitrum BoLD, please refer to the [Gentle Introduction for BoLD](../../../how-arbitrum-works/bold/gentle-introduction.mdx). :::caution -As mentioned in our guide on [BoLD adoption for Arbitrum chains](../../bold-adoption-for-arbitrum-chains.mdx), the recommendation is that Arbitrum chains keep validation permissioned by having `disableValidatorWhitelist` be `false` (which is the default) and by having a list of validators on the whitelist via the `validators[]` array. Furthermore, it is recommended that the [Censorship Timeout](../../../how-arbitrum-works/03-sequencer.mdx#censorship-timeout) feature be kept disabled. +As mentioned in our guide on [BoLD adoption for Arbitrum chains](../../bold-adoption-for-arbitrum-chains.mdx), the recommendation is that Arbitrum chains keep validation permissioned by having `disableValidatorWhitelist` be `false` (which is the default) and by having a list of validators on the whitelist via the `validators[]` array. Furthermore, it is recommended that the [Censorship Timeout](/how-arbitrum-works/deep-dives/sequencer.mdx#censorship-timeout) feature be kept disabled. ::: ## Table of Arbitrum BoLD parameters diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/01-use-a-custom-gas-token-anytrust.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/01-use-a-custom-gas-token-anytrust.mdx index 56aab7576a..4c1c46def1 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/01-use-a-custom-gas-token-anytrust.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/01-use-a-custom-gas-token-anytrust.mdx @@ -44,4 +44,4 @@ These methods use L1 to refer to the parent chain of the Arbitrum chain. These parameter changes are strongly recommended to avoid charging users for a non-existent parent chain's base fee. The impact of not doing this is that Nitro will apply a parent chain's fee to all transactions. As Nitro assumes the native asset is `ETH`, all fees are expected to be denominated in `ETH`. This has the consequence of overcharging users for parent chain fees in native tokens that are more expensive than `ETH` (for example, if you use wrapped `BTC` as the custom gas token). In the case for tokens with prices much lower than `ETH`, the impact is far less pronounced. -In either case we strongly recommend taking these steps to avoid any issues with chain economics. You can read more about how Nitro manages fees in [Gas and fees](/how-arbitrum-works/09-gas-fees.mdx). +In either case we strongly recommend taking these steps to avoid any issues with chain economics. You can read more about how Nitro manages fees in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx). diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/02-use-a-custom-gas-token-rollup.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/02-use-a-custom-gas-token-rollup.mdx index b8526ab37f..9e404b7e38 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/02-use-a-custom-gas-token-rollup.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/02-use-a-custom-gas-token-rollup.mdx @@ -14,7 +14,7 @@ Custom gas token support for Rollups is currently limited to L2s that post data ::: -When deploying an Arbitrum chain in [Rollup mode](/how-arbitrum-works/12-data-availability.mdx#rollup-mode), you can use a custom `ERC-20` token as the native gas token. This token is usable for Transaction fees on that specific Arbitrum chain and reimbursing the Batch poster for data posted to Ethereum. An example would be an L2 Rollup that uses `USDC` as its custom gas token but pays `ETH` to post data to L1 Ethereum. +When deploying an Arbitrum chain in [Rollup mode](/run-arbitrum-node/data-availability.mdx#rollup-mode), you can use a custom `ERC-20` token as the native gas token. This token is usable for Transaction fees on that specific Arbitrum chain and reimbursing the Batch poster for data posted to Ethereum. An example would be an L2 Rollup that uses `USDC` as its custom gas token but pays `ETH` to post data to L1 Ethereum. Enabling a custom fee token for a Rollup chain requires additional configuration compared to an [AnyTrust chain](/launch-arbitrum-chain/02-configure-your-chain/common-configurations/01-use-a-custom-gas-token-anytrust.mdx); it also introduces important exchange-rate considerations. This guide outlines specific implementation steps and operational considerations for chain owners or operators to consider when enabling a custom fee token for Rollups. @@ -615,5 +615,5 @@ You can refer to the source files for more details on: - [fee-token-pricers](https://github.com/OffchainLabs/nitro-contracts/tree/main/test/foundry/fee-token-pricers) - [createERC20Rollup.ts](https://github.com/OffchainLabs/nitro-contracts/blob/main/scripts/createERC20Rollup.ts) -You can also find more info about how Nitro manages [gas and fees](/how-arbitrum-works/09-gas-fees.mdx) here. If you’re unsure how to configure the Rollup correctly or have questions about fee pricer implementations, please get in touch with Offchain Labs or your chain’s deployment provider. +You can also find more info about how Nitro manages [gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) here. If you’re unsure how to configure the Rollup correctly or have questions about fee pricer implementations, please get in touch with Offchain Labs or your chain’s deployment provider. ```` diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/07-fee-management.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/07-fee-management.mdx index 39e8705492..875b3ec743 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/07-fee-management.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/07-fee-management.mdx @@ -25,8 +25,8 @@ There are four fee types that are collected on every transaction of an Arbitrum You can find more detailed information about these fee types in these pages: -- [L2 fees](/how-arbitrum-works/09-gas-fees.mdx#child-chain-gas-pricing) for the Arbitrum chain base fee and surplus fee -- [L1 fees](/how-arbitrum-works/09-gas-fees.mdx#parent-chain-gas-pricing) for the Parent chain base fee and surplus fee +- [L2 fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#child-chain-gas-pricing) for the Arbitrum chain base fee and surplus fee +- [L1 fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#parent-chain-gas-pricing) for the Parent chain base fee and surplus fee ## How to configure the fees collected? diff --git a/docs/launch-arbitrum-chain/03-deploy-an-arbitrum-chain/07-canonical-factory-contracts.mdx b/docs/launch-arbitrum-chain/03-deploy-an-arbitrum-chain/07-canonical-factory-contracts.mdx index 5f786b2390..175da50d9d 100644 --- a/docs/launch-arbitrum-chain/03-deploy-an-arbitrum-chain/07-canonical-factory-contracts.mdx +++ b/docs/launch-arbitrum-chain/03-deploy-an-arbitrum-chain/07-canonical-factory-contracts.mdx @@ -8,7 +8,7 @@ content_type: how-to import { AddressExplorerLink as AEL } from '@site/src/components/AddressExplorerLink'; -Deploying new Arbitrum chains is usually done through a `RollupCreator` contract that processes the creation of the needed contracts and sends the initialization messages from the parent to the child chain. Similarly, creating a token bridge for an Arbitrum chain is usually done using a `TokenBridgeCreator` contract that creates the token bridge contracts in both the parent and child chains (this last one via [Parent-to-child messages](/how-arbitrum-works/10-l1-to-l2-messaging.mdx)). +Deploying new Arbitrum chains is usually done through a `RollupCreator` contract that processes the creation of the needed contracts and sends the initialization messages from the parent to the child chain. Similarly, creating a token bridge for an Arbitrum chain is usually done using a `TokenBridgeCreator` contract that creates the token bridge contracts in both the parent and child chains (this last one via [Parent-to-child messages](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)). This page describes the benefits of using these canonical factory contracts and lists their addresses in all supported chains. diff --git a/docs/launch-arbitrum-chain/04-maintain-your-chain/04-guidance/03-state-growth.mdx b/docs/launch-arbitrum-chain/04-maintain-your-chain/04-guidance/03-state-growth.mdx index 85d58d9e59..7012fe4492 100644 --- a/docs/launch-arbitrum-chain/04-maintain-your-chain/04-guidance/03-state-growth.mdx +++ b/docs/launch-arbitrum-chain/04-maintain-your-chain/04-guidance/03-state-growth.mdx @@ -20,7 +20,7 @@ When we say ‘state size’, we mean the total amount of data recorded on the b The state growth rate is simply the rate at which state size increases. A high state growth rate creates higher requirements for nodes to process state transitions and perform operations needed to keep up with the tip of the chain. -The critical Nitro stack parameter affecting state growth and state growth rate is the **gas speed limit**. Offchain Labs has set the gas speed limit to a default (7,000,000 gas/s), ensuring a safe, sustained operating limit for Arbitrum chains. You can read more about the nuances of the gas speed limit [here](/how-arbitrum-works/09-gas-fees.mdx#the-speed-limit). +The critical Nitro stack parameter affecting state growth and state growth rate is the **gas speed limit**. Offchain Labs has set the gas speed limit to a default (7,000,000 gas/s), ensuring a safe, sustained operating limit for Arbitrum chains. You can read more about the nuances of the gas speed limit [here](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#the-speed-limit). The default gas speed limit is designed to ensure Arbitrum chains operate performantly and sustainably. diff --git a/docs/launch-arbitrum-chain/04-maintain-your-chain/06-monitoring-tools-and-considerations.mdx b/docs/launch-arbitrum-chain/04-maintain-your-chain/06-monitoring-tools-and-considerations.mdx index b3382e7298..276b94a6e5 100644 --- a/docs/launch-arbitrum-chain/04-maintain-your-chain/06-monitoring-tools-and-considerations.mdx +++ b/docs/launch-arbitrum-chain/04-maintain-your-chain/06-monitoring-tools-and-considerations.mdx @@ -21,7 +21,7 @@ The Arbitrum chain (Orbit) Verification Script is currently under active develop ## Arbitrum chain (Orbit) retryables tracker -[Retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx) are messages sent from a parent chain and executed on the Arbitrum chain. Due to their asynchronous nature (they are executed several minutes after being created), if insufficient funds are provided at the time of creation, they might not automatically redeem (execute) upon arrival at the Arbitrum chain. When this occurs, a manual redemption of the ticket is required. The [Arbitrum chain (Orbit) retryables tracker](https://github.com/OffchainLabs/Orbit-retryable-tracker) is designed to assist in identifying and displaying the status of retryable tickets sent from a parent chain to the Arbitrum chain, and it reports any tickets that have not been automatically redeemed. +[Retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) are messages sent from a parent chain and executed on the Arbitrum chain. Due to their asynchronous nature (they are executed several minutes after being created), if insufficient funds are provided at the time of creation, they might not automatically redeem (execute) upon arrival at the Arbitrum chain. When this occurs, a manual redemption of the ticket is required. The [Arbitrum chain (Orbit) retryables tracker](https://github.com/OffchainLabs/Orbit-retryable-tracker) is designed to assist in identifying and displaying the status of retryable tickets sent from a parent chain to the Arbitrum chain, and it reports any tickets that have not been automatically redeemed. ## Data Availability Server (DAS) health checks diff --git a/docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx b/docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx index 137a172032..75028fb34d 100644 --- a/docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx +++ b/docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx @@ -9,11 +9,11 @@ content_type: how-to ## Child chain transactions -Generally, transactions executed through the sequencer on Arbitrum chains [achieve finality](/how-arbitrum-works/02-transaction-lifecycle.mdx) equivalent to their parent chain once the relevant transaction data has been [posted in a batch](/how-arbitrum-works/05-validation-and-proving/02-rollup-protocol.mdx). This means that transactions on Arbitrum chains are considered final in minutes. +Generally, transactions executed through the sequencer on Arbitrum chains [achieve finality](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx) equivalent to their parent chain once the relevant transaction data has been [posted in a batch](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol). This means that transactions on Arbitrum chains are considered final in minutes. ## Parent chain → child chain transactions -Messages being sent through the Delayed Inbox of a parent chain as [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#retryable-tickets), including deposits through token bridges, are released by the [sequencer](/how-arbitrum-works/03-sequencer.mdx) once it has reasonable confidence of finality on the parent chain. For example, on an L2 chain settling to Ethereum, the sequencer will release delayed messages to the inbox after 40 blocks. Following this, the transaction must complete another finality period for the Ethereum transaction that prompted it to achieve finality. +Messages being sent through the Delayed Inbox of a parent chain as [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#retryable-tickets), including deposits through token bridges, are released by the [sequencer](/how-arbitrum-works/deep-dives/sequencer.mdx) once it has reasonable confidence of finality on the parent chain. For example, on an L2 chain settling to Ethereum, the sequencer will release delayed messages to the inbox after 40 blocks. Following this, the transaction must complete another finality period for the Ethereum transaction that prompted it to achieve finality. Arbitrum chain L3s may configure the finality of transactions executed through the Delayed Inbox to depend on different layers of finality. By default, Arbitrum chains will rely on the number of L1 block confirmations, effectively finalizing an L3 deposit as soon as L1 finalizes the batch posted by Arbitrum One or when a DACert is posted by Arbitrum Nova. This would be on the order of tens of minutes. @@ -33,4 +33,4 @@ Note, however, that if you choose to enable fast bridging, a re-org of un-finali ## Child chain → parent chain transactions -Normally, [outgoing transactions](/how-arbitrum-works/11-l2-to-l1-messaging.mdx) must wait until the assertion that includes their L2 message is confirmed (~one week) before a client can execute the message on L1. However, in the near future [AnyTrust](/how-arbitrum-works/08-anytrust-protocol.mdx) chains will be able to leverage their DAC to enable fast confirmations of withdrawals through the native token bridge. By immediately confirming assertions that have been signed by the DAC, finality can be reduced to ~15 minutes. +Normally, [outgoing transactions](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) must wait until the assertion that includes their L2 message is confirmed (~one week) before a client can execute the message on L1. However, in the near future [AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) chains will be able to leverage their DAC to enable fast confirmations of withdrawals through the native token bridge. By immediately confirming assertions that have been signed by the DAC, finality can be reduced to ~15 minutes. diff --git a/docs/partials/_gentle-intro-partial.mdx b/docs/partials/_gentle-intro-partial.mdx index c46bba3e07..01d34c0cfd 100644 --- a/docs/partials/_gentle-intro-partial.mdx +++ b/docs/partials/_gentle-intro-partial.mdx @@ -39,7 +39,7 @@ Additionally, as long as there’s even just one honest validator, the chain wil #### Q: And how exactly is “fraud” “proven”? Sounds complicated. -Oh, it’s not so bad. In essence, if two validators disagree, only one of them (at most) can be telling the truth. In a dispute, the two validators play an interactive, call-and-response game in which they narrow down their dispute to a single computational step (think of something small and simple, like multiplying two numbers). This one step gets executed on L1 and will necessarily prove that the honest party was telling the truth. For a more detailed rundown, see [here](/how-arbitrum-works/05-validation-and-proving/01-validation-and-proving.mdx). +Oh, it’s not so bad. In essence, if two validators disagree, only one of them (at most) can be telling the truth. In a dispute, the two validators play an interactive, call-and-response game in which they narrow down their dispute to a single computational step (think of something small and simple, like multiplying two numbers). This one step gets executed on L1 and will necessarily prove that the honest party was telling the truth. For a more detailed rundown, see [here](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#validators). #### Q: This dispute game obviously takes some time; does this impose any sort of delay on Arbitrum users' transactions? diff --git a/docs/run-arbitrum-node/arbos-releases/arbos11.mdx b/docs/run-arbitrum-node/arbos-releases/arbos11.mdx index e15831d778..21e3ed2855 100644 --- a/docs/run-arbitrum-node/arbos-releases/arbos11.mdx +++ b/docs/run-arbitrum-node/arbos-releases/arbos11.mdx @@ -22,7 +22,7 @@ Formal release notes can be found [here](https://github.com/OffchainLabs/nitro/r - [EIP-3855: PUSH0 instruction](https://eips.ethereum.org/EIPS/eip-3855) - [EIP-3860: Limit and meter initcode](https://eips.ethereum.org/EIPS/eip-3860) - [EIP-6049: Deprecate SELFDESTRUCT](https://eips.ethereum.org/EIPS/eip-6049) -- Improvements and fixes for [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum child chain base fee only, while the network fee collects child chain congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/08-anytrust-protocol.mdx) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee. +- Improvements and fixes for [retryable tickets](/how-arbitrum-works/1deep-dives/l1-to-l2-messaging.mdx) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum child chain base fee only, while the network fee collects child chain congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee. - Fixes an issue where the [`ArbOwnerPublic` precompile](/build-decentralized-apps/precompiles/02-reference.mdx#arbownerpublic) returned the incorrect list of chain owners. This does not change the parties who are able to perform chain owner actions. As intended, only the Arbitrum DAO is able to take chain owner actions for Arbitrum One and Nova. - Resolves an issue where the [`arbBlockHash` method](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) would take up all the gas when reverting. The previous incorrect behavior meant that if a transaction calls `arbBlockHash` with an out-of-range block number, then the transaction would consume all the gas when reverting. - Addition of the [`L1RewardReceipient`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`L1RewardRate`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) precompile methods to view the parent chain pricing parameters and make it easier to view the current chain configuration. From 28f35f3cb6c54751838d81dea56fb9653d2044f8 Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 14:38:15 -0500 Subject: [PATCH 25/75] fixing broken links --- .../02-how-to-estimate-gas.mdx | 2 +- .../arbitrum-vs-ethereum/03-rpc-methods.mdx | 24 +++++++++---------- .../01-inside-arbitrum-nitro.mdx | 2 +- .../bold/gentle-introduction.mdx | 2 +- .../deep-dives/{05-arbos.mdx => arbos.mdx} | 4 ++-- .../deep-dives/l1-to-l2-messaging.mdx | 2 +- docs/partials/_bold-config-params.mdx | 4 ++-- docs/partials/_gentle-intro-partial.mdx | 2 +- .../arbos-releases/arbos11.mdx | 2 +- .../more-types/02-run-validator-node.mdx | 2 +- docs/stylus/concepts/how-it-works.md | 2 +- docs/welcome/get-started.mdx | 2 +- 12 files changed, 25 insertions(+), 25 deletions(-) rename docs/how-arbitrum-works/deep-dives/{05-arbos.mdx => arbos.mdx} (95%) diff --git a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx index 76ab19b3bd..1f37af35d3 100644 --- a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx +++ b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx @@ -21,7 +21,7 @@ Multiplying the value obtained from `eth_estimateGas` by the child chain gas pri Alternatively, to obtain the gas limit for your transaction, you can call `NodeInterface.gasEstimateComponents()` and then use the first result, which is `gasEstimate`. Next, to find the total cost, you need to multiply this amount by the child chain gas price, which is available in the third result, `baseFee`. -Note that when working with parent to child chain messages (also known as [retryable tickets](/how-arbitrum-works/10-l1-to-l2-messaging.mdx)), you can use the function [`L1ToL2MessageGasEstimator.estimateAll()`](https://github.com/OffchainLabs/arbitrum-sdk/blob/main/src/lib/message/L1ToL2MessageGasEstimator.ts#L215) of the Arbitrum SDK or [`NodeInterface.estimateRetryableTicket()`](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.6.8@@/nodeInterface/NodeInterface.go#L120) to get all the gas information needed to send a successful transaction. +Note that when working with parent to child chain messages (also known as [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx)), you can use the function [`L1ToL2MessageGasEstimator.estimateAll()`](https://github.com/OffchainLabs/arbitrum-sdk/blob/main/src/lib/message/L1ToL2MessageGasEstimator.ts#L215) of the Arbitrum SDK or [`NodeInterface.estimateRetryableTicket()`](https://github.com/OffchainLabs/@@nitroRepositorySlug=nitro@@/blob/@@nitroVersionTag=v3.6.8@@/nodeInterface/NodeInterface.go#L120) to get all the gas information needed to send a successful transaction. ## Breaking down the formula diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx index be9a42ae3b..80e4f68859 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx @@ -25,14 +25,14 @@ In addition to the [three transaction types](https://ethereum.org/en/developers/ On RPC calls that return transactions, the `type` field will reflect the custom codes where applicable. -| Transaction type code | Transaction type name | Description | -| --------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `100` | `ArbitrumDepositTxType` | Used to deposit `ETH` from a parent chain to child chain via the Arbitrum bridge | -| `101` | `ArbitrumUnsignedTxType` | Used to call a child chain contract from a parent chain, originated by a user through the Arbitrum bridge | -| `102` | `ArbitrumContractTxType` | Used to call a child chain contract from a parent chain, originated by a contract through the Arbitrum bridge | -| `104` | `ArbitrumRetryTxType` | Used to [manually redeem a retryable ticket](/how-arbitrum-works/10-l1-to-l2-messaging.mdx) on a child chain that failed to execute automatically (usually due to low gas) | -| `105` | `ArbitrumSubmitRetryableTxType` | Used to [submit a retryable ticket](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#submission) via the Arbitrum bridge on the parent chain | -| `106` | `ArbitrumInternalTxType` | Internal transactions created by the ArbOS itself for certain state updates, like the parent chain base fee and the block number | +| Transaction type code | Transaction type name | Description | +| --------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `100` | `ArbitrumDepositTxType` | Used to deposit `ETH` from a parent chain to child chain via the Arbitrum bridge | +| `101` | `ArbitrumUnsignedTxType` | Used to call a child chain contract from a parent chain, originated by a user through the Arbitrum bridge | +| `102` | `ArbitrumContractTxType` | Used to call a child chain contract from a parent chain, originated by a contract through the Arbitrum bridge | +| `104` | `ArbitrumRetryTxType` | Used to [manually redeem a retryable ticket](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) on a child chain that failed to execute automatically (usually due to low gas) | +| `105` | `ArbitrumSubmitRetryableTxType` | Used to [submit a retryable ticket](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#submission) via the Arbitrum bridge on the parent chain | +| `106` | `ArbitrumInternalTxType` | Internal transactions created by the ArbOS itself for certain state updates, like the parent chain base fee and the block number | ### Additional fields @@ -46,9 +46,9 @@ On RPC calls that return transactions, the following fields are added to the ret On RPC calls that return transactions, the following fields will have a different content than what's received on Ethereum. -| Field name | Description | -| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `from` | On parent to child chain transactions, this field will contain the [_aliased_ version](/how-arbitrum-works/10-l1-to-l2-messaging.mdx#address-aliasing) of the parent chain's `msg.sender` | +| Field name | Description | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `from` | On parent to child chain transactions, this field will contain the [_aliased_ version](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx#address-aliasing) of the parent chain's `msg.sender` | ## Transaction receipts @@ -61,7 +61,7 @@ On RPC calls that return transaction receipts, the following fields are added to | Field name | Description | | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `l1BlockNumber` | The block number of the first non-Arbitrum ancestor chain that would be used for `block.number` calls. More information in [Block numbers and time](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx) | -| `gasUsedForL1` | Amount of gas spent on parent chain calldata in units of child chain gas. More information in [Gas and fees](/how-arbitrum-works/09-gas-fees.mdx) | +| `gasUsedForL1` | Amount of gas spent on parent chain calldata in units of child chain gas. More information in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) | ## Blocks diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index d0e092cd20..04ea39ea7b 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -360,7 +360,7 @@ We'll describe the dissection part of the protocol twice. First, we'll give a si :::info More information -For further reading on Assertions and how to create them refer to the [Assertion Deep-dive](/how-arbitrum-works/deep-dives/assertion.mdx). +For further reading on Assertions and how to create them refer to the [Assertion Deep-dive](/how-arbitrum-works/deep-dives/assertions.mdx). ::: diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index 0a45eaee12..bb0dfffb5c 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -229,7 +229,7 @@ If a malicious entity wanted to attack Arbitrum, they would need to deposit 3600 To recap, both Arbitrum’s current dispute protocol and BoLD require assertions to be posted to the parent chain and employ interactive proving, which involves a back-and-forth between two entities until a single step of disagreement is reached. That single step (of disagreement) is then submitted to contracts on the parent chain. Those contracts are used to declare a winner. For L2s, like Arbitrum One, BoLD must be deployed on a credibly-neutral, censorship-resistant backend to ensure disputes are fairly resolved. Ethereum, therefore, is the perfect candidate for deployment of the BoLD protocol for L2s. -But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. In the event that the parent chain (in this case, L2) is being repeatedly censored or if the L2 sequencer is offline, every block level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/03-sequencer.mdx)). If this were to happen, challenge resolution would be delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! +But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. In the event that the parent chain (in this case, L2) is being repeatedly censored or if the L2 sequencer is offline, every block level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/deep-dives/sequencer.mdx)). If this were to happen, challenge resolution would be delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! To mitigate the risk of this issue manifesting for Arbitrum chains, Offchain Labs has included a feature called _Delay Buffer_ as part of BoLD’s 1.0.0 release. The _Delay Buffer_ feature aims to limit the negative effects of: prolonged parent chain censorship, prolonged sequencer censorship, and/or unexpected sequencer outages. This is accomplished by implementing some time threshold that is decremented when unexpected delays occur. Once that time threshold is met, the force inclusion window is lowered - effectively enabling entities to make moves without the 24 hour delay-per-move. diff --git a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx similarity index 95% rename from docs/how-arbitrum-works/deep-dives/05-arbos.mdx rename to docs/how-arbitrum-works/deep-dives/arbos.mdx index a162baf619..e3198ff411 100644 --- a/docs/how-arbitrum-works/deep-dives/05-arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -330,9 +330,9 @@ Users and developers can access parent chain fee-related data through the follow The child chain pricing state tracks child chain resource usage to determine a reasonable child chain gas price. This process considers various factors, including user demand, the state of Geth, and the computational speed limit. The primary mechanism for doing so consists of a pair of pools, one larger than the other, that drain as child chain–specific resources are consumed and filled as time passes. Parent chain-specific resources, such as parent chain `calldata`, are not accounted for in the pools since they do not directly impact the computational workload of network actors. Instead, the design of the speed limit mechanism regulates execution resources to ensure consistent system performance and synchronization. -While much of this state is accessible through the [`ArbGasInfo`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`ArbOwner`](/build-decentralized-apps/precompiles/02-reference.mdx#arbowner) precompiles, most changes are automatic and happen during [block production](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L77) and the [transaction hooks](/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx#hooks). Each of an incoming message's transactions removes the parent chain component of the gas it uses from the pool. Afterward, the message's timestamp [informs the pricing mechanism](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L336) of the time passed as ArbOS [finalizes the block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350). +While much of this state is accessible through the [`ArbGasInfo`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`ArbOwner`](/build-decentralized-apps/precompiles/02-reference.mdx#arbowner) precompiles, most changes are automatic and happen during [block production](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L77) and the [transaction hooks](/how-arbitrum-works/deep-dives/geth.mdx#hooks). Each of an incoming message's transactions removes the parent chain component of the gas it uses from the pool. Afterward, the message's timestamp [informs the pricing mechanism](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L336) of the time passed as ArbOS [finalizes the block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350). -ArbOS's larger gas pool [determines](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/l2pricing/pools.go#L98) the per-block gas limit, setting a dynamic [upper limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) on the amount of compute gas a child chain block may have. This limit is always enforced, though it's done in the [`GasChargingHook`](/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx#gascharginghook) for the first transaction to avoid sharp decreases in the parent chain gas price from over-inflating the compute component purchased to above the gas limit. Enforicng this improves UX by allowing the first transaction to succeed rather than requiring a resubmission. Because the first transaction lowers the space left in the block, subsequent transactions do not employ this strategy and may fail from such compute-component inflation. This space is acceptable because such transactions are only present in cases where the system is under heavy load. The result is that the user's transaction is dropped without charges since the state transition fails early. Those trusting the Sequencer can rely on the transaction being automatically resubmitted in such a scenario. +ArbOS's larger gas pool [determines](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/l2pricing/pools.go#L98) the per-block gas limit, setting a dynamic [upper limit](https://github.com/OffchainLabs/nitro/blob/2ba6d1aa45abcc46c28f3d4f560691ce5a396af8/arbos/block_processor.go#L146) on the amount of compute gas a child chain block may have. This limit is always enforced, though it's done in the [`GasChargingHook`](/how-arbitrum-works/deep-dives/geth.mdx#gascharginghook) for the first transaction to avoid sharp decreases in the parent chain gas price from over-inflating the compute component purchased to above the gas limit. Enforicng this improves UX by allowing the first transaction to succeed rather than requiring a resubmission. Because the first transaction lowers the space left in the block, subsequent transactions do not employ this strategy and may fail from such compute-component inflation. This space is acceptable because such transactions are only present in cases where the system is under heavy load. The result is that the user's transaction is dropped without charges since the state transition fails early. Those trusting the Sequencer can rely on the transaction being automatically resubmitted in such a scenario. We need a per-block gas limit because arbitrator WAVM execution is much slower than native transaction execution. This limit means there can only be so much gas, roughly translating to wall-block time–in a child chain block. It also allows ArbOS to limit the size of blocks should demand continue to surge even as the price rises. diff --git a/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx b/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx index 39e9e8b568..120c26fee8 100644 --- a/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx +++ b/docs/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx @@ -105,7 +105,7 @@ modifier onlyFromMyL1Contract() override { Arbitrum provides a _Delayed Inbox_ contract on the parent chain that can deliver arbitrary messages to the child chain. This functionality is important for two reasons: 1. **General cross-chain messaging**: Allows parent chain EOAs or parent chain contracts to send messages or transactions to a child chain. This functionality is critical for bridging assets (other than the chain's native token) and performing cross-chain operations. -2. **Censorship resistance**: It ensures the Arbitrum chain remains censorship-resistant, even if the Sequencer misbehaves or excludes certain transactions; refer to [Bypassing the Sequencer](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdxtransaction-lifecycle.mdx#bypassing-the-sequencer) for more details. +2. **Censorship resistance**: It ensures the Arbitrum chain remains censorship-resistant, even if the Sequencer misbehaves or excludes certain transactions; refer to [Bypassing the Sequencer](/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx#bypassing-the-sequencer) for more details. Users can send child chain transactions through the Delayed Inbox in two primary ways: diff --git a/docs/partials/_bold-config-params.mdx b/docs/partials/_bold-config-params.mdx index 3c5e61a6db..a679177a54 100644 --- a/docs/partials/_bold-config-params.mdx +++ b/docs/partials/_bold-config-params.mdx @@ -18,8 +18,8 @@ | `smallStepLeafSize` | Maximum number of steps in the "small step" level history committment. The product of `bigStepLeafSize`, `smallStepLeafSize`, and `numBigStepLevel` should equal to the maximum number of WAVM opcodes theoretically possible in the execution of an Arbitrum block, with a small buffer. It is not recommended to change this value. | 2^23 | | `numBigStepLevel` | Number of "big step" levels. It is not recommended to change this value. | 1 | | `maxDataSize` | Maximum size of data that can be posted onto the parent chain, in KB | `117964` for L2s, and `104857` for L3s | -| `isDelayBufferable` | A parameter to enable or disable the delay buffer, otherwise known as the [Censorship Timeout](../how-arbitrum-works/03-sequencer.mdx#censorship-timeout) feature. | `false` | -| `bufferConfig.max` | The maximum amount of time that the delay buffer can be. More information on how the delay buffer value changes over time and how it is used to calculate the force inclusion window can be found [here](../how-arbitrum-works/03-sequencer.mdx#censorship-timeout). | `2^32` - note that this configuration value is measured using Ethereum blocks for an L2 Arbitrum chain (settling to Ethereum) or an L3 Arbitrum chain settling to Arbitrum One or Arbitrum Nova. If the chain settles to a different type of parent chain, you must use its parent chain's `block.number` timing. It is recommended that you set this value to be higher than the batch posting frequency of your chain and ideally higher than the `bufferConfig.threshold` of your chain. | +| `isDelayBufferable` | A parameter to enable or disable the delay buffer, otherwise known as the [Censorship Timeout](/how-arbitrum-works/deep-dives/sequencer.mdx#censorship-timeout) feature. | `false` | +| `bufferConfig.max` | The maximum amount of time that the delay buffer can be. More information on how the delay buffer value changes over time and how it is used to calculate the force inclusion window can be found [here](/how-arbitrum-works/deep-dives/sequencer.mdx#censorship-timeout). | `2^32` - note that this configuration value is measured using Ethereum blocks for an L2 Arbitrum chain (settling to Ethereum) or an L3 Arbitrum chain settling to Arbitrum One or Arbitrum Nova. If the chain settles to a different type of parent chain, you must use its parent chain's `block.number` timing. It is recommended that you set this value to be higher than the batch posting frequency of your chain and ideally higher than the `bufferConfig.threshold` of your chain. | | `bufferConfig.threshold` | The minimum amount of time that the force inclusion window can be reduced to, in the case of prolonged sequencer censorship and/or unexpected sequencer outages. The `delayBuffer`, starting from `bufferConfig.max`, is decremented by the difference between a delayed message's delay beyond `bufferConfig.threshold` so it is important to set the threshold to some value greater than the regular batch posting frequency of your chain and also greater than `delayBlocks` on your chain | `2^32` - note that this configuration value is measured using Ethereum blocks for an L2 Arbitrum chain (settling to Ethereum) or an L3 Arbitrum chain settling to Arbitrum One or Arbitrum Nova. If the chain settles to a different type of parent chain, you must use its parent chain's `block.number` timing. It is recommended that you set this value to be higher than batch posting frequency of your chain, but lower than the `delayBlocks` of your chain. | | `bufferConfig.replenishRateInBasis` | The rate at which the delay buffer will replenish linearly | 500 (or 5% replenishment rate), meaning that one minute will be replenished for every 20 minutes where there are no messages delayed beyond `bufferConfig.threshold` | | `validators` | An array of addresses that are allowed to post assertions to the parent chain, when BoLD is in permissioned mode (i.e., when `disableValidatorWhitelist` is `false`) | The list of whitelisted validators allowed to progress the chain (by regularly posting assertions to the parent chain) | diff --git a/docs/partials/_gentle-intro-partial.mdx b/docs/partials/_gentle-intro-partial.mdx index 01d34c0cfd..e55b61c653 100644 --- a/docs/partials/_gentle-intro-partial.mdx +++ b/docs/partials/_gentle-intro-partial.mdx @@ -55,7 +55,7 @@ For one, Arbitrum transactions are submitted on the L1 in batches; typically, a We really meant it, yes. Different layer 2 protocols emphasize and optimize for different things; Arbitrum was created with Ethereum compatibility as a top priority. This means users can use Arbitrum with all their favorite Ethereum wallets; developers can build and deploy contracts with all their favorite Ethereum libraries and tooling; in fact, most of the time, the experience of using Arbitrum will feel identical to that of using Ethereum (with the important exception of it being much cheaper and faster). -Much development went into achieving this level of Ethereum compatibility. But at its core: the Arbitrum itself uses a fork of [Geth](/how-arbitrum-works/04-state-transition-function/04-modified-geth-on-arbitrum.mdx) — the most widely used Ethereum implementation — with modifications to transform it into a trustless layer 2. This means most of the code running in Arbitrum is identical to the code running in Ethereum. We call this cutting-edge approach Nitro (developers can see the codebase [here](https://github.com/OffchainLabs/nitro)). +Much development went into achieving this level of Ethereum compatibility. But at its core: the Arbitrum itself uses a fork of [Geth](/how-arbitrum-works/deep-dives/geth.mdx) — the most widely used Ethereum implementation — with modifications to transform it into a trustless layer 2. This means most of the code running in Arbitrum is identical to the code running in Ethereum. We call this cutting-edge approach Nitro (developers can see the codebase [here](https://github.com/OffchainLabs/nitro)). #### Q: So builders can do all the stuff they do on Ethereum on Arbitrum, nice! But can they do _more_? diff --git a/docs/run-arbitrum-node/arbos-releases/arbos11.mdx b/docs/run-arbitrum-node/arbos-releases/arbos11.mdx index 21e3ed2855..9a1e158cd5 100644 --- a/docs/run-arbitrum-node/arbos-releases/arbos11.mdx +++ b/docs/run-arbitrum-node/arbos-releases/arbos11.mdx @@ -22,7 +22,7 @@ Formal release notes can be found [here](https://github.com/OffchainLabs/nitro/r - [EIP-3855: PUSH0 instruction](https://eips.ethereum.org/EIPS/eip-3855) - [EIP-3860: Limit and meter initcode](https://eips.ethereum.org/EIPS/eip-3860) - [EIP-6049: Deprecate SELFDESTRUCT](https://eips.ethereum.org/EIPS/eip-6049) -- Improvements and fixes for [retryable tickets](/how-arbitrum-works/1deep-dives/l1-to-l2-messaging.mdx) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum child chain base fee only, while the network fee collects child chain congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee. +- Improvements and fixes for [retryable tickets](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx) to ensure that the fee calculation to redeem retryable tickets will take into account both the infrastructure fee and the network fee. The infrastructure fee is the minimum child chain base fee only, while the network fee collects child chain congestion charges. This is important for [AnyTrust chains](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) like Arbitrum Nova because members of the Data Availability Committee (DAC) gets paid a percentage of the infrastructure fee but not the network fee. Previously, the calculations to determine the fee for redeeming retryable tickets did not consider the infrastructure fee. - Fixes an issue where the [`ArbOwnerPublic` precompile](/build-decentralized-apps/precompiles/02-reference.mdx#arbownerpublic) returned the incorrect list of chain owners. This does not change the parties who are able to perform chain owner actions. As intended, only the Arbitrum DAO is able to take chain owner actions for Arbitrum One and Nova. - Resolves an issue where the [`arbBlockHash` method](/build-decentralized-apps/precompiles/02-reference.mdx#arbsys) would take up all the gas when reverting. The previous incorrect behavior meant that if a transaction calls `arbBlockHash` with an out-of-range block number, then the transaction would consume all the gas when reverting. - Addition of the [`L1RewardReceipient`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) and [`L1RewardRate`](/build-decentralized-apps/precompiles/02-reference.mdx#arbgasinfo) precompile methods to view the parent chain pricing parameters and make it easier to view the current chain configuration. diff --git a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx index 35862dd0e4..4e98e26836 100644 --- a/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx +++ b/docs/run-arbitrum-node/more-types/02-run-validator-node.mdx @@ -13,7 +13,7 @@ This page describes the different strategies a validator may follow and provides This how-to assumes that you're familiar with the following: - How to run a full node (see instructions [here](/run-arbitrum-node/02-run-full-node.mdx)) -- [How the Rollup protocol works](/how-arbitrum-works/inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) +- [How the Rollup protocol works](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol) - [How BoLD works](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx#how-bold-uses-ethereum), if you're running a validator for a chain that has BoLD activated ## Validation strategies diff --git a/docs/stylus/concepts/how-it-works.md b/docs/stylus/concepts/how-it-works.md index 0ba7c7466c..b9d98d8500 100644 --- a/docs/stylus/concepts/how-it-works.md +++ b/docs/stylus/concepts/how-it-works.md @@ -43,7 +43,7 @@ Nitro operates in two modes: a "happy case" where it compiles execution history Stylus is made possible by Nitro’s ability to replay and verify disputes using WASM. Validators bisect disputes until an invalid step is identified and proven onchain through a [“one-step proof.”](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#dissection-protocol-simplified-version). This deterministic fraud-proving capability ensures the correctness of any arbitrary program compiled to WASM. The combination of WASM's and Nitro's properties enables this technological leap we call Stylus. -For more details on Nitro’s architecture, refer to the [documentation](/how-arbitrum-works/01-a-gentle-introduction.mdx) or the [Nitro whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf). +For more details on Nitro’s architecture, refer to the [documentation](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) or the [Nitro whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf). ## Why does this matter? diff --git a/docs/welcome/get-started.mdx b/docs/welcome/get-started.mdx index 5a64f6f5a2..ba4adfad1f 100644 --- a/docs/welcome/get-started.mdx +++ b/docs/welcome/get-started.mdx @@ -67,7 +67,7 @@ The Arbitrum suite includes the protocols, chains, services, and SDKs that power | Resource | Description | | -------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -| [Inside Nitro](/how-arbitrum-works/01-a-gentle-introduction.mdx) | A technical deep dive into Nitro's architecture. | +| [Inside Nitro](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx) | A technical deep dive into Nitro's architecture. | | [Inside AnyTrust](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx) | A technical deep dive into the AnyTrust protocol. | | [Arbitrum whitepaper](https://github.com/OffchainLabs/nitro/blob/master/docs/Nitro-whitepaper.pdf) | The original whitepaper that introduced Nitro. | | [DAO docs](https://docs.arbitrum.foundation/gentle-intro-dao-governance) | Docs that support members of the Arbitrum DAO. | From 892bae7fd09cfb93f380b8fe75b5897f089b64db Mon Sep 17 00:00:00 2001 From: Pete Date: Thu, 14 Aug 2025 14:44:12 -0500 Subject: [PATCH 26/75] last of the broken links --- docs/build-decentralized-apps/02-how-to-estimate-gas.mdx | 4 ++-- docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx | 2 +- docs/how-arbitrum-works/deep-dives/arbos.mdx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx index 1f37af35d3..f045be0fd9 100644 --- a/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx +++ b/docs/build-decentralized-apps/02-how-to-estimate-gas.mdx @@ -35,7 +35,7 @@ As explained in the Medium article, the transaction fees to pay at any given mom Transaction fees (TXFEES) = L2 Gas Price (P) * Gas Limit (G) ``` -This Gas Limit includes the gas of the child chain computation and an additional buffer to cover the parent chain gas to be paid by the Sequencer when [posting the batch including this transaction on the parent chain](/how-arbitrum-works/03-sequencer.mdx). +This Gas Limit includes the gas of the child chain computation and an additional buffer to cover the parent chain gas to be paid by the Sequencer when [posting the batch including this transaction on the parent chain](/how-arbitrum-works/deep-dives/sequencer.mdx). ``` Gas Limit (G) = Gas used on L2 (L2G) + Extra Buffer for L1 cost (B) @@ -75,7 +75,7 @@ We'll use one resource available in Arbitrum: the [`NodeInterface`](/build-decen - L1P (L1 estimated price per byte of data) ⇒ Estimated cost of posting 1 byte of data on the parent chain: - Call `NodeInterface.GasEstimateComponents()`, get the fourth element `l1BaseFeeEstimate` and multiply it by 16. - L1S (Size of data to be posted on L1, in bytes) ⇒ This will depend on the data of the transaction. Keep in mind that Arbitrum adds a fixed amount to this number to make up for the static part of the transaction, which is also posted on the parent chain (140 bytes). We can do a small calculation to obtain this value: call `NodeInterface.GasEstimateComponents()` take the second element, `gasEstimateForL1` (this is equivalent to `B` in our formula), multiply it by P and divide it by L1P. - - For Arbitrum Nova (AnyTrust), the size of the data is also a fixed value, as only the Data Availability Certificate (DAC) is posted on the parent chain, [as explained here](/how-arbitrum-works/08-anytrust-protocol.mdx#data-availability-certificates). + - For Arbitrum Nova (AnyTrust), the size of the data is also a fixed value, as only the Data Availability Certificate (DAC) is posted on the parent chain, [as explained here](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx#data-availability-certificates). :::note For L1P and L1S, you can also call `NodeInterface.gasEstimateL1Component()` to get `l1BaseFeeEstimate` and `gasEstimateForL1` diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 04ea39ea7b..2a485b2a0b 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -668,6 +668,6 @@ If the Sequencer fails to collect enough signatures within a few minutes, it wil :::info More information -For a deep dive into AnyTrust, refer to the [AnyTrust Deep Dive](/how-arbitrum-works/deep-dive/anytrust-protocol.mdx). +For a deep dive into AnyTrust, refer to the [AnyTrust Deep Dive](/how-arbitrum-works/deep-dives/anytrust-protocol.mdx). ::: diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index e3198ff411..7fdb53acdf 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -352,7 +352,7 @@ Child chain gas fees work very similarly to gas on Ethereum. The amount of gas i The child chain basefee is set by a version of the "exponential mechanism" widely discussed in the Ethereum community and shown to be equivalent to Ethereum's EIP-1559 gas pricing mechanism. -The algorithm compares gas usage against the [speed limit](/how-arbitrum-works/09-gas-fees.mdx#the-speed-limit) parameter, the target amount of gas per second that the chain can handle sustainably over time. (The speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, it gets added to the backlog. Whenever the clock ticks one second, the speed limit subtracts from the backlog, but the backlog can never go below zero. +The algorithm compares gas usage against the [speed limit](/how-arbitrum-works/deep-dives/gas-and-fees.mdx#the-speed-limit) parameter, the target amount of gas per second that the chain can handle sustainably over time. (The speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, it gets added to the backlog. Whenever the clock ticks one second, the speed limit subtracts from the backlog, but the backlog can never go below zero. Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage because usage is above the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit so more gas usage can be welcomed. From 0bedc3a8133532c8fd639a1b11a443ec02b830ea Mon Sep 17 00:00:00 2001 From: Pete Date: Fri, 15 Aug 2025 16:37:14 -0500 Subject: [PATCH 27/75] Editing BoLD gentle intro --- .../bold/gentle-introduction.mdx | 182 +++++++++--------- 1 file changed, 95 insertions(+), 87 deletions(-) diff --git a/docs/how-arbitrum-works/bold/gentle-introduction.mdx b/docs/how-arbitrum-works/bold/gentle-introduction.mdx index bb0dfffb5c..f4b19e6818 100644 --- a/docs/how-arbitrum-works/bold/gentle-introduction.mdx +++ b/docs/how-arbitrum-works/bold/gentle-introduction.mdx @@ -10,51 +10,49 @@ sme: leeederek import ImageZoom from '@site/src/components/ImageZoom'; -This introduction is for those who want to learn about BoLD: a new dispute protocol for optimistic rollups that enables **permissionless validation for Arbitrum chains**. BoLD stands for Bounded Liquidity Delay and is currently deployed on a Arbitrum One, Arbitrum Nova, and Arbitrum Sepolia. +Bounded Liquidity Delay (BoLD) is a new dispute protocol for optimistic rollups that enables permissionless validation for Arbitrum chains. BoLD is available on Arbitrum One, Arbitrum Nova, and Arbitrum Sepolia. -This next-generation dispute protocol technology is now available for any Arbitrum chain to upgrade to and is live in production on Arbitrum One, Nova, and Arbitrum Sepolia. - -BoLD replaces the previous, permissioned fraud proof protocol for Arbitrum One and Arbitrum Nova, as well as for any Arbitrum chain (who wishes to adopt BoLD). - -## In a nutshell: - -- Validation for Arbitrum One and Arbitrum Nova is a privileged action currently limited to an [allow-listed set of parties, maintained by the Arbitrum DAO](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators) to reduce the risks of _[delay attacks](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a)_. _Delay attacks_ are a class of attacks where malicious entities can open as many disputes as they are willing to forfeit bonds during the challenge period to delay confirmations of assertions (equal to the time needed to resolve those disputes one by one). -- BoLD, an acronym for Bounded Liquidity Delay, is a new challenge resolution protocol for Arbitrum chains that enables permissionless validation by mitigating the risks of delay attacks against [Optimistic rollups like Arbitrum](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol). This is possible because BoLD's design ensures disputes will be resolved within a fixed time window, currently set to equal one challenge period (~6.4 days) for Arbitrum One and Arbitrum Nova. If there is a dispute, BoLD guarantees the maximum total time to be equal to two challenge periods (one for raising disputes, one for resolving disputes), a two day grace period for the Security Council to intervene if necessary, and a small delta for computing challenges. -- Enabling permissionless validation is key milestone on [Arbitrum’s journey to becoming a Stage 2 Rollup](https://docs.arbitrum.foundation/state-of-progressive-decentralization) - the most advanced and mature rollup technology categorization, according to [L2Beat](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). With BoLD, **any honest party can validate and bond their funds to post a correct child chain state assertions to win disputes against malicious entities.** +BoLD replaces the previous, permissioned fraud proof protocol for Arbitrum One, Nova, and Sepolia, as well as for any Arbitrum chain that wishes to adopt BoLD. ## What _exactly_ is BoLD? -BoLD, is an upgrade to Arbitrum's existing dispute protocol. Specifically, BoLD changes some of the rules used by validators to open and resolve disputes about Arbitrum’s state to ensure only valid states get confirmed on an Arbitrum chain’s parent chain, such as Ethereum. +BoLD is an upgrade to Arbitrum's existing dispute protocol. Specifically, BoLD modifies some of the rules used by validators to open and resolve disputes about Arbitrum's state, ensuring that only valid states receive confirmation on an Arbitrum chain's parent chain, such as Ethereum. -The current dispute protocol has working fraud proofs and is used in production today by Arbitrum chains. The changes BoLD brings enable anyone to participate in the validation of the state of the chain and enhance security around all child to parent chain messages (including withdrawals). +The current dispute protocol features working fraud proofs and is currently used in production by Arbitrum chains. The changes BoLD brings enable anyone to participate in the validation of the state of the chain and enhance security around all child-to-parent chain messages (including withdrawals). -Under BoLD, a bonded validator’s responsibilities are to: +Under BoLD, a bonded validator's responsibilities are to: -- Post claims about an Arbitrum chain’s state to its parent chain (for Arbitrum One, the parent chain is Ethereum), +- Post claims about an Arbitrum chain's state to its parent chain (for Arbitrum One, the parent chain is Ethereum), - Open challenges to dispute invalid claims made by other validators, and - Confirm valid claims by participating in and winning challenges. -The goal of BoLD is to unlock permissionless validation by ensuring that disputes are resolved within a fixed period (currently equivalent to two challenge periods, plus a two-day grace period for the Security Council to intervene if necessary and a small delta for computation), effectively removing the risk of delay attacks and making withdrawals to a parent chain more secure. BoLD accomplishes this by introducing a new dispute system that lets any single entity defend Arbitrum against malicious parties - effectively allowing anyone to validate, propose, and defend an Arbitrum chain’s state without needing permission to do so. +The goal of BoLD is to unlock permissionless validation by ensuring that disputes are resolved within a fixed period (currently equivalent to two challenge periods, plus a two-day grace period for the Security Council to intervene if necessary and a small delta for computation), effectively removing the risk of delay attacks and making withdrawals to a parent chain more secure. BoLD accomplishes this by introducing a new dispute system that allows any single entity to defend Arbitrum against malicious parties, effectively enabling anyone to validate, propose, and defend an Arbitrum chain's state without requiring permission to do so. ## Why does Arbitrum need a new dispute protocol? -While Arbitrum chains today benefit from working fraud proofs, BoLD introduces a few subtle but innovative changes that let _anyone_ challenge and win disputes - all within a fixed time period. In other words, Arbitrum chains will continue to be secured with an interactive proving game between validators using fraud proofs, but with the added benefit of this game being completely permissionless and time-bounded to the same length as one challenge period (or 6.4 days, by default). +While Arbitrum chains today benefit from working with fraud proofs, BoLD introduces a few subtle yet innovative changes that allow _anyone_ to challenge and win disputes - all within a fixed period. In other words, Arbitrum chains will continue to be secured with an interactive proving game between validators using fraud proofs, but with the added benefit of this game being completely permissionless and time-bounded to the same length as one challenge period (or 6.4 days, by default). -Under the hood, the reason why BoLD can offer time-bound, permissionless validation is because a correct Arbitrum state assertion is **not tied to the entity that bonds their capital to a claim**. This property, coupled with the fact that the child chain states are completely deterministic and can be proven on Ethereum, means that **any number of honest parties** can rely on BoLD to prove that their claim is correct. Lastly, a property that will not change with BoLD is the fact that there needs to only be one honest party defending Arbitrum. +Under the hood, the reason why BoLD can offer time-bound, permissionless validation is because a correct Arbitrum state assertion is **not tied to the entity that bonds their capital to a claim**. This property, coupled with the fact that the child chain states are completely deterministic and can be proven on Ethereum, means that **any number of honest parties** can rely on BoLD to prove that their claim is correct. Lastly, a property that will not change with BoLD is the fact that there needs to be only one honest party defending Arbitrum. ### BoLD brings Arbitrum closer to being recognized as a Stage 2 rollup -Inspired by [Vitalik’s proposed milestones](https://ethereum-magicians.org/t/proposed-milestones-for-rollups-taking-off-training-wheels/11571), the team over at L2Beat has assembled a widely recognized framework for evaluating the development Ethereum Rollups. Both Vitalik and the [L2Beat framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe) refer to the final stage of rollup development as _“Stage 2 - No Training Wheels”_. A critical criterion for being considered a Stage 2 rollup is to allow anyone to validate the child chain state and post fraud proofs to Ethereum without restraints. This is considered a key requirement for Stage 2 because it ensures _[“that the system is not controlled by a limited set of entities and instead is subject to the collective scrutiny of the entire community”](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe)._ +Inspired by [Vitalik’s proposed milestones](https://ethereum-magicians.org/t/proposed-milestones-for-rollups-taking-off-training-wheels/11571), the team over at L2Beat has assembled a widely recognized framework for evaluating the development of Ethereum Rollups. Both Vitalik and the [L2Beat framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe) refer to the final stage of rollup development as _“Stage 2 - No Training Wheels”_. A critical criterion for being considered a Stage 2 rollup is the ability to allow anyone to validate the child chain state and post fraud proofs to Ethereum without restrictions. Permissionless validation is a key requirement for Stage 2 because it ensures _[“that a limited set of entities does not control the system and instead is subject to the collective scrutiny of the entire community”](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe)._ -BoLD enables permissionless validation by allowing _anyone_ to challenge incorrect Arbitrum state assertions and therefore unlocks new avenues for participation in securing the network, fostering greater inclusivity and resilience. This is made possible because BoLD guarantees that a single, honest entity who has their capital bonded to the correct Arbitrum state assertion will always win against malicious adversaries. The research and work to bring BoLD to life underscores Arbitrum's commitment to scaling Ethereum without compromising on security. +BoLD enables permissionless validation by allowing anyone to challenge incorrect Arbitrum state assertions, thereby unlocking new avenues for participation in securing the network and fostering greater inclusivity and resilience. Permissionless validation is possible because BoLD guarantees that a single, honest entity with its capital bonded to the correct Arbitrum state assertion will always win against malicious adversaries. The research and work to bring BoLD to life underscores Arbitrum's commitment to scaling Ethereum without compromising on security. -With BoLD at its core, Arbitrum charts a course towards being recognized as a Stage 2 rollup by addressing the currently yellow (above) State Validation wedge in [L2Beat's risk analysis pie chart](https://l2beat.com/scaling/summary). BoLD contributes to a more permissionless, efficient, and robust rollup ecosystem. Additionally, BoLD will be available as an upgrade for all Arbitrum chains who wish to adopt it to reap the aforementioned benefits. +With BoLD at its core, Arbitrum is on course to being recognized as a Stage 2 rollup by addressing the currently yellow (above) State Validation wedge in [L2Beat's risk analysis pie chart](https://l2beat.com/scaling/summary). BoLD contributes to a more permissionless, efficient, and robust rollup ecosystem. Additionally, BoLD will be available as an upgrade for all Arbitrum chains that wish to adopt it, allowing them to reap the benefits. + + + + + + ### BoLD makes withdrawals to parent chain Ethereum safer -Today, there is a period of time, following a state assertion, called the “challenge period,” where any validator can open a dispute over the validity of a given the child chain state root. If there are no disputes during the challenge period, the protocol confirms the state root and considers it to be valid - this property is what makes Arbitrum an optimistic rollup. This challenge period is why you must wait ~1 week (6.4 days to be exact) to withdraw assets from Arbitrum One, for example. While this design is secured with working fraud proofs, it is susceptible to [delay attacks](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a), where malicious actors continuously open disputes to extend that challenge period for as long as they’re willing to sacrifice bonds - effectively extending the challenge period indefinitely by an amount equal to the time it takes to resolve each dispute, one by one. This risk is not ideal nor safe, and is why validation for Arbitrum One and Nova is confined to a permissioned set of entities overseen by the Arbitrum DAO. +Before BoLD, there is a period, following a state assertion, called the “challenge period,” during which any validator can open a dispute over the validity of a given child chain state root. If there are no disputes during the challenge period, the protocol confirms the state root and considers it to be valid - this property is what makes Arbitrum an optimistic rollup. This challenge period is why you must wait ~1 week (6.4 days to be exact) to withdraw assets from Arbitrum One, for example. While this design uses working fraud proofs for security, it is susceptible to [delay attacks](https://medium.com/offchainlabs/solutions-to-delay-attacks-on-rollups-434f9d05a07a), where malicious actors continuously open disputes to extend that challenge period for as long as they’re willing to sacrifice bonds - effectively extending the challenge period indefinitely by an amount equal to the time it takes to resolve each dispute, one by one. This risk is neither ideal nor safe, which is why validation for Arbitrum One and Nova (pre-BoLD) used a permissioned set of entities overseen by the Arbitrum DAO. -BoLD addresses these challenges head-on by introducing a time limit on the existing rollup protocol for resolving disputes, effectively ensuring that challenges conclude within a 6.4-day window (this window can changed by the DAO for Arbitrum One and Nova). This is possible due to two reasons: (1) BoLD’s design allows for challenges between the honest party and any number of malicious adversaries to happen in parallel, and (2) the use of a time limit that will automatically confirm the honest party’s claims if the challenger fails to respond. +BoLD addressed these challenges head-on by introducing a time limit on the existing rollup protocol for resolving disputes, effectively ensuring that challenges conclude within a 6.4-day window (the DAO can change this window for Arbitrum One and Nova). This time limit is possible due to two reasons: (1) BoLD’s design allows for challenges between the honest party and any number of malicious adversaries to happen in parallel, and (2) the use of a time limit that will automatically confirm the honest party’s claims if the challenger fails to respond. To summarize with an analogy and the diagram below: Arbitrum’s current dispute protocol assumes that any assertion that gets challenged must be defended against each unique challenger sequentially, like in a _“1v1 tournament”_. BoLD, on the other hand, enables any single honest party to defend the correct state and be guaranteed to win, similar to an _“all-vs-all battle royale”_ where there must and will always be a single winner in the end. @@ -72,168 +70,178 @@ To summarize with an analogy and the diagram below: Arbitrum’s current dispute className="img-600px" /> + + + + + + :::note -The timer/clocks above are arbitrary and instead represent the duration of challenges and how challenges are sequential today but can take place in parallel with BoLD. The duration of challenges are independent from one another. +The timer/clocks above are arbitrary and instead represent the duration of challenges and how challenges are sequential today, but can take place in parallel with BoLD. The duration of challenges is independent from one another. ::: ## How is this possible? -The BoLD protocol provides the guardrails and rules for how validators challenge claims about the state of an Arbitrum chain. Since Arbitrum’s state is deterministic, there will always be only one correct state for a given input of onchain operations and transactions. The beauty of BoLD’s design guarantees that disputes will be resolved within a fixed time window, removing the risk of delay attacks and ultimately enabling anyone to bond their funds to and successfully defend that singular correct state of Arbitrum. +The BoLD protocol provides the guardrails and rules for how validators challenge claims about the state of an Arbitrum chain. Since Arbitrum’s state is deterministic, there will always be only one correct state for a given input of onchain operations and transactions. The beauty of BoLD’s design ensures that disputes will be resolved within a fixed time window, eliminating the risk of delay attacks and ultimately enabling anyone to bond their funds to and successfully defend the singular correct state of Arbitrum. -Let’s dive in to an overview of how BoLD actually works. +Let’s dive into an overview of how BoLD works: -1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to it's parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge. This is where BoLD comes into play. -2. **A challenge is opened:** When another validator observes and disagrees with the end state represented by `Block Z`, they can permissionlessly open a challenge by asserting and bonding capital to a claim on a different end state, represented by an assertion `Block Y`. At this point in time, there are now two asserted states: `Block A → Block Z` and `Block A → Block Y`. Each of these asserted states, at this point in time now that there's a challenge, are referred to _edges_ while a Merkle tree of asserted states from some start to endpoint (e.g., `Block A → Block Z`) is more formally known as a _history commitment._ It is important to note that Ethereum at this point in time has no notion of which edge(s) is correct or incorrect - edges are simply a portion of a claim made by a validator about the history of the chain from some end state all the way back to some initial state. Also note that because a bond put up by a validator is tied to an assertion rather than the party who put up that bond, there can be any number of honest, anonymous parties that can open challenges against incorrect claims. It is important to note that the bonds put up to open challenges are held in the rollup contract. There is a prescribed procedure for what the Arbitrum Foundation is expected to do with these funds; see Step 5 below for a summary. -3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to come to an agreement on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective _history commitments_ until they arrive at a single step of instruction where an arbiter, like Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) - BoLD only changes some minor, but important, details in the resolution process. Let’s dive into what happens next: - - **Block challenges**: When a challenge is opened, the edges are called _level-zero edges_ since they are at the granularity of Arbitrum blocks. The disputing parties take turns bisecting their history commitments until they identify the specific block that they disagree on. - - **Big-step challenge:** Now that the parties have narrowed down their dispute to a single block, the back-and-forth bisection exercise continues within that block. Note that this block is agreed by all parties to be some state after the initial state, but before the final states. This time, however, the parties will narrow down on a specific _range_ of instructions for the State Transition Function within the block - essentially working towards identifying a set of instructions within which their disagreement lies. This range is currently defined as `2^20` steps of `WASM` instructions, which is the assembly of choice for validating Arbitrum chains. - - **One-step challenge:** Within that range of `2^20` instructions, the back-and-forth bisecting continues until all parties arrive at a single step of instruction that they disagree on. At this point in time, parties agree on the initial state of Arbitrum before the step but disagree on the end state one step immediately after. Remember that since Arbitrum’s state is entirely deterministic, there is only one correct end state. -4. **One-step proof:** Once a challenge is isolated down to a dispute about a single step, both parties run that step to produce, and then submit, a one-step proof to the OneStepProof smart contract on the parent chain (e.g., Ethereum). A one-step proof is a proof that a single step of computation results in a particular state. The smart contract on the parent chain will execute the disputed step to validate the correctness of a submitted proof from the two parties. It is at this point that the honest party's proof will be deemed valid and its tree of edges will be confirmable by time, while the dishonest party will have their edges rejected by timeout. -5. **Confirmation:** Once the honest one-step edge is confirmed, the protocol will work on confirming or rejecting the parent edges until it reaches the level-zero edge of the honest party. With the honest party’s level-zero edge now confirmed, the honest party’s assertion bond can be withdrawn. Meanwhile, the dishonest party has their bonds taken away to ensure the dishonest party is always punished. - - There is another way that a level-zero edge can get confirmed: time. At each of the mini-stages of the challenge (block challenge, big-step challenge, one-step challenge), a timer increments upwards towards some challenge period, _T_ defined by BoLD. This timer begins ticking for a party when they submit their bisected history commitment until their challenger submits their bisected history commitment in response. An edge is automatically confirmed if the timer reaches _T._ +1. **An assertion is made:** Validators begin by taking the most recent confirmed [assertion](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#arbitrum-rollup-protocol), called `Block A`, and assert that some number of transactions afterward, using Nitro’s deterministic State Transition Function (STF), will result in an end state, `Block Z`. If a validator claims that the end state represented by `Block Z` is correct, they will bond their funds to `Block Z` and propose that state to its parent chain. (For more details on how bonding works, see [Bold technical deep dive](/how-arbitrum-works/bold/bold-technical-deep-dive.mdx)). If nobody disagrees after a certain amount of time, known as the challenge period, then the state represented by the assertion `Block Z` is confirmed as the correct state of an Arbitrum chain. However, if someone disagrees with the end state `Block Z`, they can submit a challenge, which is where the new BoLD protocol comes into play. +2. **A challenge is opened:** When another validator observes and disagrees with the end state represented by `Block Z`, they can permissionlessly open a challenge by asserting and bonding capital to a claim on a different end state, represented by an assertion `Block Y`. At this point, there are now two asserted states: `Block A → Block Z` and `Block A → Block Y`. Each of these asserted states, at this point now that there's a challenge, is referred to as an _edge_ while a Merkle tree of asserted states from some start to endpoint (e.g., `Block A → Block Z`) is more formally known as a _history commitment._ It is important to note that Ethereum at this point has no notion of which edge(s) are correct or incorrect - edges are simply a portion of a claim made by a validator about the history of the chain from some end state back to some initial state. Also note that because a bond put up by a validator is to an assertion rather than the party that put up that bond, there can be any number of honest, anonymous parties that can open challenges against incorrect claims. It is important to note that the bonds put up to open challenges get held in the rollup contract. There is a prescribed procedure for how the Arbitrum Foundation should utilize these funds; see Step 5 below for a summary. +3. **Multi-level, interactive dissection begins:** To resolve the dispute, the disagreeing entities will need to agree on what the _actual, correct_ asserted state should be. [It would be tremendously expensive to re-execute](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) and compare everything from `Block A → Block Z` and `Block A → Block Y`, especially since there could be potentially millions of transactions in between `A`, `Z`, and `Y`. Instead, entities take turns bisecting their respective _history commitments_ until they arrive at a single step of instruction where an arbiter, such as Ethereum, can declare a winner. Note that [this system is very similar to how challenges are resolved on Arbitrum chains today](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges) - BoLD only changes some minor, but necessary, details in the resolution process. Let’s dive into what happens next: + - **Block challenges**: When a challenge gets opened, the edges which are named _level-zero edges_ since they are at the granularity of Arbitrum blocks. The disputing parties take turns bisecting their historical commitments until they identify the specific block on which they disagree. + - **Big-step challenge:** Now that the parties have narrowed down their dispute to a single block, the back-and-forth bisection exercise continues within that block. Note that this block is agreed upon by all parties to be a state that follows the initial state but precedes the final states. This time, however, the parties will narrow down to a specific _range_ of instructions for the State Transition Function within the block - essentially working towards identifying a set of instructions within which their disagreement lies. This range default is `2^20` steps of `WASM` instructions, which is the assembly of choice for validating Arbitrum chains. + - **One-step challenge:** Within that range of `2^20` instructions, the back-and-forth bisecting continues until all parties arrive at a single step of instruction that they disagree on. At this point, parties agree on the initial state of Arbitrum before the step, but disagree on the end state one step immediately after. Remember that since Arbitrum’s state is entirely deterministic, there is only one correct end state. +4. **One-step proof:** Once a challenge is isolated down to a dispute about a single step, both parties run that step to produce, and then submit, a one-step proof to the OneStepProof smart contract on the parent chain (e.g., Ethereum). A one-step proof is a proof that a single step of computation results in a particular state. The smart contract on the parent chain will execute the disputed step to validate the correctness of a submitted proof from the two parties. It is at this point that the honest party's proof will be deemed valid and its tree of edges will be confirmed by time, while the dishonest party will have their edges rejected due to timeout. +5. **Confirmation:** Once the honest one-step edge is confirmed, the protocol will work on confirming or rejecting the parent edges until it reaches the level-zero edge of the honest party. With the honest party’s level-zero edge now confirmed, the honest party’s assertion bond gets withdrawn. Meanwhile, the dishonest party has its bonds taken away to ensure that it is always held accountable. + - There is another way that a level-zero edge can get confirmed: time. At each of the mini-stages of the challenge (block challenge, big-step challenge, one-step challenge), a timer increments upward toward some challenge period, _T_ defined by BoLD. This timer begins ticking for a party when they submit their bisected history commitment, and it continues until their challenger submits their bisected history commitment in response. An edge is automatically confirmed if the timer reaches _T._ 6. Reimbursements for the honest party's parent chain gas costs and mini-bonds made at the other challenge levels are handled by the Arbitrum Foundation. -That’s it! We’ve now walked through each of the steps that validators will take to dispute challenges with the BoLD protocol. One final note here is that each of the steps explained above can take place concurrently and this is one of the reasons why BoLD can guarantee that disputes are resolved within a fixed time frame. +That’s it! We’ve now walked through each of the steps that validators will take to dispute challenges with the BoLD protocol. You can carry out each of the steps explained above concurrently, which is one of the reasons why BoLD guarantees a resolution to disputes within a fixed timeframe. ## Frequently asked questions about BoLD (FAQ): #### Q: How does bonding work? -The entities responsible for posting assertions about Arbitrum state to Ethereum are called validators. If posting assertions were free, anyone could create conflicting assertions to always delay withdrawals by 14 days instead of seven. As such, Arbitrum requires validators to put in a “security deposit”, known as a bond, to be allowed to post assertions. Validators can withdraw their bond as soon as their latest posted assertion has been confirmed, and end their responsibilities. These bonds can be any `ERC-20` token and should be set to a large enough value (e.g., 200 `WETH`) to make it economically infeasible for an adversary to attack an Arbitrum chain and to mitigate against spam (that would otherwise delay confirmations). Requiring a high bond to post assertions about Arbitrum seems centralizing, as we are replacing an allowlist of validators with instead a system that requires a lot of money to participate in. To address this, there is a [contract](https://github.com/OffchainLabs/BoLD/blob/main/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol) that anyone can use to deploy a bonding pool as a way of crowdsourcing funds from others who wish to help defend Arbitrum but who may not individually be able to put up the large upfront bond itself. The use of bonding pools, coupled with the fact that there can be any number of honest anonymous parties ready to defend Arbitrum, means that these high bond values do not harm decentralization. +The entities responsible for posting assertions about Arbitrum state to Ethereum are called validators. If posting assertions were free, anyone could create conflicting assertions always to delay withdrawals by 14 days instead of seven. As such, Arbitrum requires validators to put in a “security deposit”, known as a bond, to be allowed to post assertions. Validators can withdraw their bond as soon as their latest posted assertion receives confirmation, and they will then end their responsibilities. These bonds can be any `ERC-20` token. They should be set to a large enough value (e.g., 200 `WETH`) to make it economically infeasible for an adversary to attack an Arbitrum chain and to mitigate against spam (that would otherwise delay confirmations). Requiring a high bond to post assertions about Arbitrum seems centralized, as we are replacing an allowlist of validators with a system that requires a lot of money to participate in. To address this, there is a [contract](https://github.com/OffchainLabs/BoLD/blob/main/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol) that anyone can use to deploy a bonding pool as a way of crowdsourcing funds from others who wish to help defend Arbitrum but who may not individually be able to put up the large upfront bond itself. The use of bonding pools, coupled with the fact that there can be any number of honest anonymous parties ready to defend Arbitrum, means that these high bond values do not harm decentralization. #### Q: Why are the bond sizes so high for Arbitrum One? -There are two types of “bonds” in BoLD: **assertion and challenge.** The below sizes are carefully calculated and set for Arbitrum One using a variety of factors, including TVL and optimizing for a balance between cost for honest parties and security of the protocol. As always, the exact bond sizes for an Arbitrum chain using BoLD is entirely up to the chain owner to decide, if they choose to adopt BoLD at all. +There are two types of “bonds” in BoLD: **assertion and challenge**. The sizes below are carefully calculated and set for Arbitrum One, using a variety of factors, including TVL, to optimize a balance between the cost for honest parties and the security of the protocol. As always, the exact bond sizes for an Arbitrum chain using BoLD is entirely up to the chain owner to decide, if they choose to adopt BoLD at all. **Assertion bond sizes** -Assertion bond sizes can be thought of as a “security deposit” that an entity puts down to fulfill the role of a proposer (i.e., a validator who proposes state assertions to the parent chain). The bond sizes are high because the role of a proposer assumes a big responsibility - their role is to ensure that the chain progresses. Accordingly, the bond also acts as a deterrence to _delay attacks_, where the attacker would sacrifice the bond in order to cause roughly a week of delay in a group of withdrawals. If the bond is too small or free, there may not be enough deterrence against this type of attack. Validators who choose to be proposers can withdraw their bond as soon as their most recent posted assertion has been confirmed by the protocol. We expect there to be very few proposers for Arbitrum One as only one is sufficient for safety and full functioning of the chain. +Assertion bond sizes are akin to a “security deposit” that an entity deposits to fulfill the role of a proposer (i.e., a validator who proposes state assertions to the parent chain). The bond sizes are high because the role of a proposer assumes a big responsibility - their role is to ensure that the chain progresses. Accordingly, the bond also acts as a deterrent to _delay attacks_, where the attacker would sacrifice the bond to cause roughly a week of delay in a group of withdrawals. If the bond is too small or free, there may not be sufficient deterrence against this type of attack. Validators who choose to be proposers can withdraw their bond as soon as the protocol has confirmed their most recent posted assertion. We expect there to be very few proposers for Arbitrum One, as only one is sufficient for safety and full functioning of the chain. **Challenge bond sizes** -If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their own assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is not tied up to specific addresses. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges), and certain moves within a challenge have an additional bond required to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1110 `ETH` to fully resolve a dispute, which will also get reimbursed upon the confirmation of assertions by the protocol. +If someone disagrees with a posted assertion from a proposer, they can pool funds together to propose their assertion that represents the correct history of the chain. Upon doing so, a challenge between the two claims will begin. Anyone can participate in the challenge, as it is permissionless. To resolve a challenge, participants will incur compute and gas costs due to the [interactive fraud proof game](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#challenges). Additionally, certain moves within a challenge require an extra bond to prevent resource exhaustion and spam from adversaries. These moves within a challenge require smaller, **challenge bonds**. The proposed challenge bonds for Arbitrum One are 1,110 `ETH` to fully resolve a dispute, which will also be reimbursed upon confirmation of assertions by the protocol. -The rationale behind the specific challenge bond size was made using something called a “resource ratio” - defined as the cost ratio between an adversary and an honest party when participating in the interactive fraud proof game. The value was chosen to ensure that the malicious party will pay 10x the marginal costs of the honest party. This resource ratio, coupled with the fact that an honest party will always get their bonds refunded while a malicious party loses everything, helps prevent and deter attacks to begin with. +The rationale behind the specific challenge bond size is based on a concept known as a “resource ratio,” defined as the cost ratio between an adversary and an honest party when participating in the interactive fraud proof game. Selecting this value ensured that the malicious party would pay 10 times the marginal costs of the honest party. This resource ratio, coupled with the fact that an honest party will always have its bonds refunded while a malicious party loses everything, helps prevent and deter attacks from the outset. -To summarize with a scenario, this effectively means that defending against a \$1B dollar attack would require ~\$100M of bonds. The ~\$100M would be reimbursed upon winning a challenge, where the \$1B put up by an adversary would be lost. The proposal aims to send the confiscated funds to the treasury by setting the “excess state receiver” address to the [DAO’s treasury address](https://arbiscan.io/address/0xF3FC178157fb3c87548bAA86F9d24BA38E649B58). The tradeoff here is that the higher the resource ratio we want, the more expensive it is for both honest and evil parties to make claims in disputes. +To summarize with a scenario, this effectively means that defending against a \$1B dollar attack would require ~\$100M of bonds. The ~\$100M would get reimbursed upon winning a challenge, where the \$1B bonded by an adversary would get forfeited. The proposal aims to send the confiscated funds to the treasury by setting the “excess state receiver” address to the [DAO’s treasury address](https://arbiscan.io/address/0xF3FC178157fb3c87548bAA86F9d24BA38E649B58). The tradeoff here is that the higher the resource ratio we want, the more expensive it is for both honest and evil parties to make claims in disputes. **Bonding pools as a way to allow people to participate in assertion posting** -BoLD ships with trustless bonding pools that allow any group of participants to pool their funds together to challenge a dishonest proposer, and win. That is, any group of entities can pool funds into a simple contract that will post an assertion to Ethereum without needing to trust each other. Upon observation of an invalid assertion, validators have one challenge period (~6.4 days) to pool funds in the contract and respond with a counter assertion. We believe that making it easy to pool the funds to participate in the defense of Arbitrum trustlessly and improves decentralization and the safety of BoLD. +BoLD ships with trustless bonding pools that allow any group of participants to pool their funds together to challenge a dishonest proposer, and win. That is, any group of entities can pool funds into a simple contract that will post an assertion to Ethereum without needing to trust each other. Upon observation of an invalid assertion, validators have one challenge period (~6.4 days) to pool funds in the contract and respond with a counter assertion. Making it easy to pool the funds to participate in the defense of the Arbitrum trustlessly improves decentralization and the safety of BoLD. #### Q: Does the bond requirement only mean that whales can validate Arbitrum One? -Validating Arbitrum One is **free and accessible**. All Arbitrum One nodes, by default, are watchtower validators meaning they can detect and report invalid assertions posted to Ethereum. +Validating Arbitrum One is **free and accessible**. All Arbitrum One nodes, by default, are watchtower validators, meaning they can detect and report invalid assertions posted to Ethereum. -However, becoming an assertion proposer requires a bond, as without it, anyone could delay all Arbitrum bridged assets by one week. However, BoLD allows for anyone to propose assertions and also challenge invalid assertions via pool contracts, helping keep proposers accountable for their actions. +However, becoming an assertion proposer requires a bond, as without it, anyone could delay all Arbitrum bridged assets by one week. However, BoLD allows anyone to propose assertions and also challenge invalid assertions via pool contracts, helping keep proposers accountable for their actions. #### Q: How does BoLD disincentivize malicious actors from attacking an Arbitrum chain? -Bonds put up by honest parties will always be refunded while malicious actors always stand to lose 100% of their bond. Malicious actors stand to lose everything at each challenge. BoLD delay is bounded and additional challenges would not increase the delay of a particular assertion. +Honest, bonded parties will always be refunded, while malicious actors always stand to lose 100% of their bond. Malicious actors stand to lose everything at each challenge. The BoLD delay is bounded, and additional challenges would not increase the delay of a particular assertion. #### Q: In the event of a challenge, what happens to the confiscated funds from malicious actors for Arbitrum One? -Recall that BoLD enables any validator to put up a bond to propose assertions about the child chain state. These assertions about the child chain state are deterministic and so an honest party who puts up a bond on the correct assertion will always win in disputes. In these scenarios, the honest party will eventually have their bonds reimbursed while the malicious actor will lose all of their funds. +Recall that BoLD enables any validator to put up a bond to propose assertions about the child chain state. These assertions about the child chain state are deterministic, and so an honest party who puts up a bond on the correct assertion will always win in disputes. In these scenarios, the honest party will eventually have their bonds reimbursed while the malicious actor will lose all of their funds. -In BoLD, all costs spent by malicious actors are confiscated and sent to the Arbitrum DAO treasury. A small reward, called the Defender's Bounty, of 1% will be awarded to entities who put down challenge bonds in defense of Arbitrum One. For the remainder of the funds, the Arbitrum DAO will have full discretion over what to do with the funds confiscated from a malicious actor. This includes, but is not limited to: +In BoLD, all costs spent by malicious actors are confiscated and sent to the Arbitrum DAO treasury. A small reward, called the Defender's Bounty, of 1% will go to entities who put down challenge bonds in defense of Arbitrum One. For the remaining funds, the Arbitrum DAO will have full discretion over how to utilize the funds confiscated from a malicious actor. Applications include, but is not limited to: - Using the confiscated funds to refund the parent chain gas costs to honest parties, -- Rewarding or reimbursing the honest parties with some, or all, of the confiscated funds in excess of the 1% Defender's Bounty, +- Rewarding or reimbursing the honest parties with some, or all, of the confiscated funds over the 1% Defender's Bounty, - Burning some, or all, of the confiscated funds, or - Keep some, or all, of the confiscated funds within the Arbitrum DAO Treasury -As always, an Arbitrum chain can choose how they wish to structure and manage confiscated funds from dishonest parties. +As always, an Arbitrum chain can choose how it wishes to structure and manage confiscated funds from dishonest parties. #### Q: Why are honest parties not automatically rewarded with confiscated funds from a malicious actor? It’s tempting to think that rewarding the honest proposer in a dispute can only make the protocol stronger, but this turns out not to be true, because an adversary can sometimes profit by placing the honest bonds themselves. -This creates perverse incentives that threaten the security of BoLD. Here’s an example, from Ed Felten: +This situation creates perverse incentives that threaten the security of BoLD. Here’s an example, from Ed Felten: That said, there’s no harm in paying the honest proposer a fair interest rate on their bond, so they don’t suffer for having helped the protocol by locking up their capital in a bond. -Therefore, the BoLD AIP proposes that the honest parties be rewarded 1% of confiscated bonds from a dishonest party, in the event of a challenge. This reward applies only to entities who deposit challenge bonds and participate in defending Arbitrum against a challenge. The exact amount rewarded to honest parties will be proportional to the amount defender’s deposited into the protocol during a challenge, making bonding pool participants eligible. The process by which this reward is calculated will be done offchain and payouts will require a DAO vote because the confiscated funds are always sent to a DAO-controlled address. +Therefore, the BoLD AIP proposes that honest parties be rewarded with 1% of the confiscated bonds from a dishonest party, in the event of a challenge. This reward applies only to entities that deposit challenge bonds and participate in defending Arbitrum against a challenge. The exact amount rewarded to honest parties will be proportional to the amount the defender deposits into the protocol during a challenge, making bonding pool participants eligible. -#### Q: Why is `ARB` not the bonding token used in BoLD? on Arbitrum One? +#### Q: Why is `ARB` not the bonding token used for BoLD on Arbitrum One? Although BoLD supports using an `ERC-20` token, Ethereum, specifically `WETH`, was chosen over `ARB` for a few reasons: -1. **Arbitrum One & Arbitrum Nova both inherit their security from Ethereum already,** Arbitrum One and Nova rely on Ethereum for both data availability and as the referee for determining winners during fraud-proof disputes. It follows then that Ethereum continues to be used in BoLD, which is meant to permissionlessly secure Arbitrum even further. Ethereum’s value is also relatively independent of Arbitrum, especially when compared to `ARB`. -2. Adversaries might be able to exploit the potential instability of `ARB` when trying to win challenges. Suppose an adversary deposits their bond in `ARB`, and can create an impression that they have a nontrivial chance of winning the challenge. This might drive down the value of `ARB`, which would decrease the adversary's cost to create more bonds (i.e., more spam) during the challenge, which in turn could increase the adversary's chances of winning (which would drive `ARB` lower, making the attack cheaper still for the adversary, etc.) +1. **Arbitrum One and Arbitrum Nova both inherit their security from Ethereum already.** Arbitrum One and Nova rely on Ethereum for both data availability and as the referee for determining winners during fraud-proof disputes. Ethereum’s value is also relatively independent of Arbitrum, especially when compared to `ARB`. +2. Adversaries might be able to exploit the potential instability of `ARB` when trying to win challenges. Suppose an adversary deposits their bond in `ARB`, and can create an impression that they have a nontrivial chance of winning the challenge. This impression might drive down the value of `ARB`, which would decrease the adversary's cost to create more bonds (i.e., more spam) during the challenge, which in turn could increase the adversary's chances of winning (which would drive `ARB` lower, making the attack cheaper still for the adversary, etc.) 3. **Access to liquidity**: Ethereum has greater liquidity than `ARB`. In the event of an attack on Arbitrum, access and ease of pooling funds may become crucial. -4. **Fraud proofs are submitted to, and arbitrated on the parent chain (Ethereum).** The bonding of capital to make assertions is done so on the parent chain (Ethereum), since Ethereum is the arbitrator of disputes. If BoLD were to use `ARB` instead of Ethereum, a large amount of `ARB` must be pre-positioned on the parent chain which is more difficult to do when compared to pre-positioning Ethereum on the parent chain (Ethereum). +4. **Fraud proofs are submitted to, and arbitrated on, the parent chain (Ethereum).** The bonding of capital to make assertions is done so on the parent chain (Ethereum), since Ethereum is the arbitrator of disputes. If BoLD were to use `ARB` instead of Ethereum, a large amount of `ARB` must be pre-positioned on the parent chain, which is more difficult to do when compared to pre-positioning Ethereum on the parent chain (Ethereum). -An Arbitrum chain owner may choose to use any token they wish for bonding, if they adopt and use BoLD permissionless validation. +An Arbitrum chain owner may choose to use any token they wish for bonding if they adopt and use BoLD permissionless validation. -#### Q: Can the required token for the validator be set to `ARB` and can network `ETH` revenues be distributed for validator incentives for Arbitrum One? +#### Q: Can the required token for the validator be set to `ARB`, and can network `ETH` revenues get distributed for validator incentives for Arbitrum One? -Yes. The asset that a validator uses to become a proposer in BoLD can be set to any `ERC-20` token, including `ARB`. For Arbitrum One, `ETH` is used for bonds for various reasons mentioned above. The Arbitrum DAO can change this asset type at any time via a governance proposal. Should such an economic incentive model exist, the source and denomination of funds used to incentivize validators will be at the discretion of the Arbitrum DAO. Again, though, we don't see `ARB`-based bonding as a good idea at present; see the last question. +Yes. The asset that a validator uses to become a proposer in BoLD is configurable to any `ERC-20` token, including `ARB`. For Arbitrum One, `ETH` is used for bonds for various reasons mentioned above. The Arbitrum DAO can change this asset type at any time via a governance proposal. Should such an economic incentive model exist, the source and denomination of funds used to incentivize validators will be at the discretion of the Arbitrum DAO. Again, though, we don't see `ARB`-based bonding as a good idea at present; see the last question. #### Q: How are honest parties reimbursed for bonding their capital to help secure Arbitrum One? -The Arbitrum DAO reimburses “active” proposers with a fair interest rate, as a way of removing the disincentive to participate, by reimbursing honest parties who bond their own capital and propose assertions for Arbitrum One. The interest rate should be denominated in `ETH` and should be equal to the annualized yield that Ethereum mainnet validators receive, which at the time of writing, is an APR between 3% to 4% (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). This interest is considered a reimbursement because this payment reimburses the honest party for the opportunity cost of locking up their capital and should not be perceived as a “reward” - for the same [reasons why the protocol does not reward honest parties with the funds confiscated from a malicious actor](#q-why-are-honest-parties-not-automatically-rewarded-with-confiscated-funds-from-a-malicious-actor)). These reimbursement payments can be paid out upon an active proposer’s honest assertion being confirmed on Ethereum and will be calculated and handled offchain by the Arbitrum Foundation. +The Arbitrum DAO reimburses “active” proposers with a fair interest rate, as a way of removing the disincentive to participate, by reimbursing honest parties who bond their capital and propose assertions for Arbitrum One. The interest rate should be denominated in `ETH` and should be equal to the annualized yield that Ethereum mainnet validators receive, which at the time of writing, is an APR between 3% to 4% (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). This interest is considered a reimbursement because this payment reimburses the honest party for the opportunity cost of locking up their capital and should not be perceived as a “reward” - for the same [reasons why the protocol does not reward honest parties with the funds confiscated from a malicious actor](#q-why-are-honest-parties-not-automatically-rewarded-with-confiscated-funds-from-a-malicious-actor)). These reimbursement payments can be paid out upon an active proposer’s honest assertion being confirmed on Ethereum and will be calculated and handled offchain by the Arbitrum Foundation. -BoLD makes it permissionless for any validator to become a proposer and also introduces a way to pay a service fee to honest parties for locking up capital to do so. Validators are not considered active proposers until they successfully propose an assertion _with_ a bond. In order to become an active proposer for Arbitrum One, post-BoLD, a validator has to propose a child chain state assertion to Ethereum. If they do not have an active bond on the parent chain, they then need to attach a bond to their assertion in order to successfully post the assertion. Subsequent assertions posted by the same address will simply move the already-supplied bond to their latest proposed assertion. Meanwhile, if an entity, say Bob, has posted a successor assertion to one previously made by another entity, Alice, then Bob would be considered by the protocol to be the current active proposer. Alice would no longer be considered by the protocol as the active proposer and once Alice’s assertion is confirmed, then Alice gets her assertion bond refunded. There can only be one “active” proposer at any point in time. +BoLD makes it permissionless for any validator to become a proposer and also introduces a way to pay a service fee to honest parties for locking up capital to do so. Validators are not considered as active proposers until they successfully propose an assertion _with_ a bond. To become an active proposer for Arbitrum One post-BoLD, a validator must propose a child chain state assertion to Ethereum. If they do not have an active bond on the parent chain, they then need to attach a bond to their assertion to post the assertion successfully. Subsequent assertions posted by the same address will move the already-supplied bond to their latest proposed assertion. +Meanwhile, if an entity, say Bob, has posted a successor assertion to one previously made by another entity, Alice, then Bob would be considered by the protocol to be the current active proposer. Alice would no longer be considered as the active proposer by the protocol, and once Alice’s assertion is confirmed, she will receive a refund of her assertion bond. There can only be one “active” proposer at any point in time. -The topic of economic and incentive models for BoLD on Arbitrum One is valuable and we believe it deserves the full focus and attention of the community via a separate proposal/discussion - decoupled from this proposal to bring BoLD to mainnet. Details around proposed economic or incentive models for BoLD will need continued research and development work, but the deployment of BoLD as-is represents a substantial improvement to the security of Arbitrum even without economic-related concerns being resolved. The DAO may choose, via governance, to fund other parties or change this reimbursement model at any time. +The topic of economic and incentive models for BoLD on Arbitrum One is valuable. It deserves the full focus and attention of the community via a separate proposal or discussion, decoupled from this proposal to bring BoLD to mainnet. Details regarding proposed economic or incentive models for BoLD will require continued research and development work. However, deploying BoLD as-is represents a substantial improvement to Arbitrum's security, even without addressing economic-related concerns. The DAO may, through governance, choose to fund other parties or modify this reimbursement model at any time. -For Arbitrum chains, any economic model can be implemented alongside BoLD, if chain owners decide to adopt BoLD. +For Arbitrum chains, any economic model can be configured alongside BoLD if chain owners decide to adopt BoLD. -#### Q: For Arbitrum One proposers, is the service fee applied to the amount bonded? If that’s the case, the `ETH` would be locked and thus unable to be used to generate yield elsewhere. So, which assets are used to generate this yield for the service fee? Would it involve some `ETH` from the Arbitrum bridge? +#### Q: For Arbitrum One proposers, is the service fee applied to the amount bonded? If that’s the case, the `ETH` would be locked and thus unable to be used to generate yield elsewhere. So, which assets get used to create this yield for the service fee? Would it involve some `ETH` from the Arbitrum bridge? -The proposed service fee should correlate to the annualized income that Ethereum mainnet validators receive, over the same time period. At the time of writing, the estimated annual income for Ethereum mainnet validators is approximately 3% to 4% of their bond (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). +The proposed service fee should correlate to the annualized income that Ethereum mainnet validators receive over the same period. At the time of writing, the estimated annual income for Ethereum mainnet validators is approximately 3% to 4% of their bond (based on [CoinDesk Indices Composite Ether Staking Rate (CESR)](https://www.coindesk.com/indices/ether/cesr) benchmark and [_Rated.Network_](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). -The fee is applied to the total amount bonded over the duration of time that a proposer is active. A validator will need to deposit `ETH` into the contracts on the parent chain to become a proposer and so those deposited funds will indeed be unable to be used for yield in other scenarios. The decision on the source of funds for the yield is entirely up to the ArbitrumDAO to decide. +The fee is applied to the total amount bonded over the duration of time that a proposer is active. A validator will need to deposit `ETH` into the contracts on the parent chain to become a proposer. So those deposited funds will indeed be unable to be used for yield in other scenarios. The decision on the source of funds for the yield is entirely up to the ArbitrumDAO to decide. -#### Q: For Arbitrum One, will the offchain compute costs be reimbursed? (i.e., the costs for a validator computing the hashes for a challenge) +#### Q: For Arbitrum One, will the offchain computation costs get reimbursed? (i.e., the costs for a validator computing the hashes for a challenge) -Reimbursement will not be made for offchain compute costs as we view these to be costs borne by all honest operators, alongside the maintenance and infra costs that regularly arise from running a node. +Reimbursements will not be made for any offchain computation costs, as we view these to be costs borne by all honest operators, alongside the maintenance and infrastructure costs that regularly arise from running a node. -Our testing has demonstrated that the cost of running a sub-challenge in BoLD, the most computationally-heavy step, on an AWS r5.4xlarge EC2 instance, costs around \$2.50 USD (~\$1 hour for one challenge with 2.5 hour duration) using [on-demand prices for U.S. East (N. Virginia)](https://instances.vantage.sh/aws/ec2/r5.4xlarge). Therefore, the additional costs from offchain compute is assumed to be negligible relative to the regular infra costs of operating a node. +Our testing has demonstrated that the cost of running a sub-challenge in BoLD, the most computationally-heavy step, on an AWS r5.4xlarge EC2 instance, costs around USD \$2.50 (~\$1 hour for one challenge with 2.5 hour duration) using [on-demand prices for U.S. East (N. Virginia)](https://instances.vantage.sh/aws/ec2/r5.4xlarge). Therefore, the additional costs from offchain compute are assumed to be negligible relative to the regular infra costs of operating a node. #### Q: How will BoLD impact Arbitrum Nova? -Although this AIP proposes that both Arbitrum One and Nova upgrade to use BoLD, we recommend for the removal of the [allowlist of validators for Arbitrum One while keeping Nova permissioned with a DAO-controlled allowlist of entities](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators) - unchanged from today. +Although this AIP proposes that both Arbitrum One and Nova upgrade to use BoLD, we recommend the removal of the [allowlist of validators for Arbitrum One while keeping Nova permissioned with a DAO-controlled allowlist of entities](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators) - unchanged from today. -This decision was made for two reasons. First, Arbitrum Nova’s TVL is much lower than Arbitrum One’s TVL, (~\$17B vs. ~\$46M at the time of writing, from [L2Beat](https://l2beat.com/scaling/summary)). This means that the high bond sizes necessary for preventing spam and delay attacks would make up a significant proportion of Nova’s TVL - which we believe introduces a centralization risk as very few parties would be incentivized to secure Nova. A solution here would be to lower the bond sizes, which brings us to the second reason: lower bond sizes reduce the costs of delay griefing attacks (where malicious actors delay the chain’s progress) and therefore hurt the security of the chain. We believe enabling permissionless validation for Nova is not worth the capital requirement tradeoffs, given the unique security model of AnyTrust chains. +This decision comes from two reasons: +First, Arbitrum Nova’s TVL is much lower than Arbitrum One’s TVL (~\$17B vs. ~\$46M at the time of writing, from [L2Beat](https://l2beat.com/scaling/summary)). This lower TVL means that the high bond sizes necessary for preventing spam and delay attacks would comprise a significant proportion of Nova’s TVL, which we believe introduces a centralization risk, as very few parties would have an incentive to secure Nova. A solution here would be to lower the bond sizes, +Second, the lower bond sizes reduce the costs of delay griefing attacks (where malicious actors delay the chain’s progress) and therefore hurt the security of the chain. We believe enabling permissionless validation for Nova is not worth the capital requirement tradeoffs, given the unique security model of AnyTrust chains. -Notably, since Arbitrum Nova's security already depends on at least one DAC member providing honest data availability, trusting the same committee to have at least one member provide honest validation does not add a major trust assumption. This requires all DAC members also to run validators. If the DAC is also validating the chain, a feature the Offchain Labs team has been working on, Fast Withdrawals, would allow users to withdraw assets from Nova in ~15 minutes, or the time it takes to reach parent chain finality. This is made possible by the DAC attesting to and instantly confirming an assertion. Fast Withdrawals will be the subject of future forum post and snapshot vote. +Notably, since Arbitrum Nova's security already depends on at least one DAC member providing honest data availability, trusting the same committee to have at least one member provide honest validation does not add a major trust assumption. This trust assumption requires all DAC members also to run validators. If the DAC is also validating the chain, a feature the Offchain Labs team has been working on, Fast Withdrawals, would allow users to withdraw assets from Nova in ~15 minutes, or the time it takes to reach parent chain finality. This finality is made possible by the DAC attesting to and instantly confirming an assertion. Fast Withdrawals will be the subject of a future forum post and snapshot vote. -#### Q: When it comes to viewing the upfront assertion bond (to be a proposer) as the security budget for Arbitrum One, is it possible for an attacker to go above the security budget and, if yes, what happens then? +#### Q: When it comes to viewing the upfront assertion bond (to be a proposer) as the security budget for Arbitrum One, is it possible for an attacker to go above the security budget, and if so, what happens then? -The upfront capital to post assertions (onchain action) is 3600 `ETH`, with subsequent sub-challenge assertions requiring 555/79 `ETH` (per level) - this applies to honest proposers as well as malicious entities. A malicious entity can post multiple invalid top level assertions and/or open multiple challenges and the honest entity can +The upfront capital to post assertions (onchain action) is 3,600 `ETH`, with subsequent sub-challenge assertions requiring 555/79 `ETH` (per level) - this applies to both honest proposers and malicious entities. A malicious entity can post multiple invalid top-level assertions and/or open multiple challenges, and the honest entity can -It is critical to note that Arbitrum state transitions are entirely deterministic. An honest party bonded to the correct state assertion, the honest party will get all their costs refunded while a malicious entity stands to lose everything. Additionally, BoLD’s design ensures that any party bonded to the correct +It is critical to note that Arbitrum state transitions are entirely deterministic. An honest party bonded to the correct state assertion will receive all their costs refunded, while a malicious entity stands to lose everything. Additionally, BoLD’s design ensures that any party bonded to the correct If a malicious entity wanted to attack Arbitrum, they would need to deposit 3600 `ETH` to propose an invalid state assertion. :::info Node Running Info - Anyone can run an Arbitrum node (today and post-BoLD) -- The default mode is `watchtower`, which chills out and watches the chain in action. It will alert you if it sees something wrong on chain but no action is taken. It requires **no** funds and **doesn't** take any onchain action. +- The default mode is `watchtower`, which chills out and watches the chain in action. It will alert you if it detects something wrong on the chain, but it takes no action. It requires **no** funds and **doesn't** take any onchain action. - Other "modes" that nodes can run are: `stakeLatest`, `resolveNodes`, `makeNodes`, and `defensive`. All of these modes **require** funds and **will** take onchain action. - Nodes running in this mode are considered validators because they validate what they see and take onchain action. - Running a `watchtower` node is **not** a validator. -- Proposers are a special role, they strictly run in `makeNodes` mode. This means a proposer is someone running an Arbitrum node in `makeNodes` mode, also making them a validator. +- Proposers are in a special role; they strictly run in `makeNodes` mode. This role means a proposer is someone running an Arbitrum node in `makeNodes` mode, also making them a validator. - For more information about see [Running a Node](/run-arbitrum-node/01-overview.mdx) and [Validation strategies](/run-arbitrum-node/more-types/02-run-validator-node.mdx#validation-strategies). - ::: + +::: #### Q: How do BoLD-based L3s challenge periods operate, considering the worst-case scenario? -To recap, both Arbitrum’s current dispute protocol and BoLD require assertions to be posted to the parent chain and employ interactive proving, which involves a back-and-forth between two entities until a single step of disagreement is reached. That single step (of disagreement) is then submitted to contracts on the parent chain. Those contracts are used to declare a winner. For L2s, like Arbitrum One, BoLD must be deployed on a credibly-neutral, censorship-resistant backend to ensure disputes are fairly resolved. Ethereum, therefore, is the perfect candidate for deployment of the BoLD protocol for L2s. +To recap, both Arbitrum’s current dispute protocol and BoLD require assertions to be posted to the parent chain and employ interactive proving, which involves a back-and-forth between two entities until a single step of disagreement is reached. That single disputed step then gets submitted to contracts on the parent chain, which will eventually declare a winner. For L2s, such as Arbitrum One, BoLD must be deployed on a credibly neutral, censorship-resistant backend to ensure a fair resolution of disputes. Ethereum, therefore, is the ideal candidate for deploying the BoLD protocol on L2s. -But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. In the event that the parent chain (in this case, L2) is being repeatedly censored or if the L2 sequencer is offline, every block level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/deep-dives/sequencer.mdx)). If this were to happen, challenge resolution would be delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! +But you might now be wondering: what about L3 Arbitrum chains that don’t settle to Ethereum? Unlike L2s that settle to Ethereum, assertions on an L3’s state need to be posted to an L2 either via (A) the L3 Sequencer or (B) the Delayed Inbox queue managed by the L2 sequencer on L2. In the event that the parent chain (in this case, L2) is getting repeatedly censored or if the L2 sequencer is offline, every block-level assertion and/or sub-challenge assertion would need to wait 24 hours before they can bypass the sequencer (using the the`SequencerInbox`’s `forceInclusion` method described [here](/how-arbitrum-works/deep-dives/sequencer.mdx)). If this were to happen, challenge resolution would get delayed by a time _t_ where _t_ = (24 hours) \* number of moves for a challenge. To illustrate with sample numbers, if a challenge takes 50 sequential moves to resolve, then the delay would be 50 days! -To mitigate the risk of this issue manifesting for Arbitrum chains, Offchain Labs has included a feature called _Delay Buffer_ as part of BoLD’s 1.0.0 release. The _Delay Buffer_ feature aims to limit the negative effects of: prolonged parent chain censorship, prolonged sequencer censorship, and/or unexpected sequencer outages. This is accomplished by implementing some time threshold that is decremented when unexpected delays occur. Once that time threshold is met, the force inclusion window is lowered - effectively enabling entities to make moves without the 24 hour delay-per-move. +To mitigate the risk of this issue manifesting for Arbitrum chains, Offchain Labs has included a feature called _Delay Buffer_ as part of BoLD’s 1.0.0 release. The _Delay Buffer_ feature aims to limit the negative effects of: prolonged parent chain censorship, prolonged sequencer censorship, and/or unexpected sequencer outages. This buffer is configurable by setting a time threshold that decrements when unexpected delays occur. Once that time threshold passes, the force inclusion window is lowered, effectively enabling entities to make moves without the 24-hour delay per move. -Under reasonable parameterization, the sequencer could be offline / censoring for 24 hours twice, before the force inclusion window is effectively dropped from 24 hours to a minimum inclusion time. The force inclusion window gradually (over weeks) replenishes to it's original value over time as long as the sequencer is on "good behavior" - regularly sequencing messages without unexpected delays. We believe that the Delay Buffer feature provides stronger guarantees of censorship resistance for Arbitrum chains. +Under reasonable parameterization, the sequencer could be offline/censoring for 24 hours twice, before the force inclusion window drops from 24 hours to a minimum inclusion time. The force inclusion window gradually (over weeks) replenishes to its original value over time as long as the sequencer is on "good behavior" - regularly sequencing messages without unexpected delays. We believe that the Delay Buffer feature provides stronger guarantees of censorship resistance for Arbitrum chains. The methodology for calculating the parameters, specifically for L3 Arbitrum chains, will be made available at a later date for teams who wish to use BoLD. @@ -245,20 +253,20 @@ The autopooling feature is not available on Date: Fri, 15 Aug 2025 16:41:38 -0500 Subject: [PATCH 28/75] fixing broken link --- .../launch-arbitrum-chain/bold-adoption-for-arbitrum-chains.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/launch-arbitrum-chain/bold-adoption-for-arbitrum-chains.mdx b/docs/launch-arbitrum-chain/bold-adoption-for-arbitrum-chains.mdx index bea9b5b2b8..2a3b740a1e 100644 --- a/docs/launch-arbitrum-chain/bold-adoption-for-arbitrum-chains.mdx +++ b/docs/launch-arbitrum-chain/bold-adoption-for-arbitrum-chains.mdx @@ -70,7 +70,7 @@ Arbitrum BoLD is not an upgrade to a different type of proving architecture and #### Use of your project's native token as the bonding asset to secure the chain -Arbitrum BoLD enables the chain owner to use any `ERC-20` token on the parent chain as the bond for validators to participate in securing the network. By default, this token will be `WETH` for Arbitrum One and we do not recommend teams to use alternative tokens as the bonding asset. For more information on the rationale, we recommend teams consult our documentation to understand [why `WETH` was selected for Arbitrum One](/how-arbitrum-works/bold/gentle-introduction.mdx#q-why-is-arb-not-the-bonding-token-used-in-bold-on-arbitrum-one) (and not `ARB`). +Arbitrum BoLD enables the chain owner to use any `ERC-20` token on the parent chain as the bond for validators to participate in securing the network. By default, this token will be `WETH` for Arbitrum One and we do not recommend teams to use alternative tokens as the bonding asset. For more information on the rationale, we recommend teams consult our documentation to understand [why `WETH` was selected for Arbitrum One](/how-arbitrum-works/bold/gentle-introduction.mdx#q-why-is-arb-not-the-bonding-token-used-for-bold-on-arbitrum-one) (and not `ARB`). #### Increased censorship resistance for `L3` Arbitrum chains From 179a8be11b38aa00416e40f26fd5ebadaec41943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Fri, 15 Aug 2025 14:46:59 -0700 Subject: [PATCH 29/75] add re-written stf gentle intro + stf inputs, bypassing deffective prettify config --- .../01-stf-gentle-intro.mdx | 39 ++++++++++++ .../02-stf-inputs.mdx | 60 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx create mode 100644 docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx b/docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx new file mode 100644 index 0000000000..4d5a937ee2 --- /dev/null +++ b/docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx @@ -0,0 +1,39 @@ +--- +title: 'A gentle introduction' +description: 'Learn the fundamentals of Nitro, Arbitrum stack.' +author: petevielhaber +sme: Mehdi +user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. +content_type: get-started +--- + +A State Transition Function (STF) determines how blockchain systems change state when processing transactions. The STF takes the current blockchain state (account balances, smart contract data, and ledger information) plus an input (transaction or block) and deterministically computes the new state. This deterministic property ensures all network nodes reach the same result, maintaining consensus. + +With Arbitrum, the STF plays an even more pivotal role. Arbitrum executes transactions offchain in batches, periodically submitting summaries to the parent chain. This leverages offchain computation for higher throughput and lower gas costs while maintaining Ethereum's security. To safeguard against incorrect or malicious offchain execution, Arbitrum employs a challenge mechanism known as fraud proofs. If a dispute arises, the STF can be recomputed step-by-step onchain, enabling the network to verify the validity of the offchain computations and ensure that the errors or fraudulent behavior are detected and rectified. + +The Arbitrum Nitro Stack STF mirrors Ethereum's STF with key modifications for Arbitrum chain requirements. The function processes ordered transactions and outputs the updated state from the transaction batch. + +Stylus expands Arbitrum's execution model beyond the Ethereum Virtual +Machine (EVM) by adding WebAssembly (WASM)–based execution, allowing +high-performance contracts in Rust, C, and C++ to run alongside traditional EVM contracts. The integration +of Stylus introduces several modifications to the STF, including: + +### Stylus-specific transaction processing + +A modified version of Geth that recognizes and processes Stylus transactions, ensuring proper inclusion in state transitions. + +### Execution in a WASM runtime + +Stylus transactions execute in ArbOS's WASM runtime instead of the EVM, enabling faster execution and more efficient computation. + +### Stylus gas accounting and pricing + +Unlike standard EVM transactions, Stylus transactions introduce new gas pricing models that account for factors such as opcode pricing, host I/O operations, and Ink usage costs. + +### Interoperability with the EVM + +Stylus contracts can interact seamlessly with Solidity contracts, enabling hybrid applications that leverage EVM and WASM execution environments. + +These Stylus-related changes aim to maintain compatibility with Ethereum's execution model while introducing a more efficient, flexible, and scalable alternative for smart contract development. + +The following sections cover STF inputs, node processing, and implementation rules, highlighting differences between Ethereum, Arbitrum, and Stylus execution environments. Stylus-specific execution tasks handled within ArbOS will be covered separately, focusing on host I/O operations, caching, and WASM memory management. diff --git a/docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx b/docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx new file mode 100644 index 0000000000..d23205d671 --- /dev/null +++ b/docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx @@ -0,0 +1,60 @@ +--- +title: 'Inputs to the State Transition Function' +description: 'Learn the fundamentals of Nitro, Arbitrum stack.' +author: petevielhaber +sme: Mehdi +user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. +content_type: get-started +--- + +Arbitrum nodes receive + transaction + inputs through two channels: + +Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/03-sequencer.mdx#real-time-sequencer-feed). + +Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. + +As discussed in the [considerations and limitations section](/how-arbitrum-works/03-sequencer.mdx#considerations-and-limitations), these methods suit different applications. + +These transactions serve as inputs for the State Transition Function (STF). + +## Message types + +Arbitrum supports multiple message types: These messages fall into two broad categories: + +- Messages submitted directly to the Sequencer as child chain messages +- Messages submitted to the parent chain + +For other message types, see the [parent-to-child chain messaging documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). + +In the system, we refer to these messages as `L1IncomingMessage` (Feel free to inspect the [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54) ). + +When submitted to the Sequencer feed, messages receive unique identifiers for proper routing. Below is the list of message types, their associated constant values, and descriptions: + +```solidity +uint8 constant L2_MSG = 3; +uint8 constant L1MessageType_L2FundedByL1 = 7; +uint8 constant L1MessageType_submitRetryableTx = 9; +uint8 constant L1MessageType_ethDeposit = 12; +uint8 constant L1MessageType_batchPostingReport = 13; +uint8 constant L2MessageType_unsignedEOATx = 0; +uint8 constant L2MessageType_unsignedContractTx = 1; + +uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8; +uint8 constant INITIALIZATION_MSG_TYPE = 11; +``` + +| Message Type | Value | Description | +| ---------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `L2MessageType_unsignedEOATx` | 0 | Unsigned child chain messages from EOAs submitted to the parent chain. | +| `L2MessageType_unsignedContractTx` | 1 | Unsigned child chain messages submitted to the parent chain. | +| `L2_MSG` | 3 | Child chain messages submitted directly to the Sequencer. | +| `L1MessageType_L2FundedByL1` | 7 | Child chain messages that go to the parent chain's Delayed Inbox, with funding provided on the parent chain itself. | +| `ROLLUP_PROTOCOL_EVENT_TYPE` | 8 | Arbitrum Classic used it for messages sent to bridge, Nitro does not use it. | +| `L1MessageType_submitRetryableTx` | 9 | Submitting parent chain messages to the child chain via retryable tickets. | +| `INITIALIZATION_MSG_TYPE` | 11 | The first message added to a new Rollup inbox. Its presence indicates proper initialization of the Rollup. | +| `L1MessageType_ethDeposit` | 12 | Child chain messages that handle deposits of native tokens (`ETH`) into the child chain. | +| `L1MessageType_batchPostingReport` | 13 | Used by the Sequencer to update the pricing model based on payment(s) by the batch poster. | + +These identifiers enable nodes to route messages correctly. From 76b8817ad4529ec6a3d12b6e27c4227a9ed35cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Fri, 15 Aug 2025 14:52:31 -0700 Subject: [PATCH 30/75] mv re-written stf gentle intro + stf inputs, bypassing deffective prettify config --- .../01-stf-gentle-intro.mdx | 0 .../02-stf-inputs.mdx | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/how-arbitrum-works/{04-state-transition-function => deep-dives}/01-stf-gentle-intro.mdx (100%) rename docs/how-arbitrum-works/{04-state-transition-function => deep-dives}/02-stf-inputs.mdx (100%) diff --git a/docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx b/docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/01-stf-gentle-intro.mdx rename to docs/how-arbitrum-works/deep-dives/01-stf-gentle-intro.mdx diff --git a/docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx similarity index 100% rename from docs/how-arbitrum-works/04-state-transition-function/02-stf-inputs.mdx rename to docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx From 3895a209989d9e65b8f9d6daf6874e0b1b45e249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Fri, 15 Aug 2025 15:51:13 -0700 Subject: [PATCH 31/75] simplify stf-inputs deep dive --- .../deep-dives/02-stf-inputs.mdx | 60 ------------------- .../deep-dives/stf-inputs.mdx | 52 +++++++--------- 2 files changed, 22 insertions(+), 90 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx diff --git a/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx deleted file mode 100644 index d23205d671..0000000000 --- a/docs/how-arbitrum-works/deep-dives/02-stf-inputs.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: 'Inputs to the State Transition Function' -description: 'Learn the fundamentals of Nitro, Arbitrum stack.' -author: petevielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. -content_type: get-started ---- - -Arbitrum nodes receive - transaction - inputs through two channels: - -Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/03-sequencer.mdx#real-time-sequencer-feed). - -Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. - -As discussed in the [considerations and limitations section](/how-arbitrum-works/03-sequencer.mdx#considerations-and-limitations), these methods suit different applications. - -These transactions serve as inputs for the State Transition Function (STF). - -## Message types - -Arbitrum supports multiple message types: These messages fall into two broad categories: - -- Messages submitted directly to the Sequencer as child chain messages -- Messages submitted to the parent chain - -For other message types, see the [parent-to-child chain messaging documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). - -In the system, we refer to these messages as `L1IncomingMessage` (Feel free to inspect the [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54) ). - -When submitted to the Sequencer feed, messages receive unique identifiers for proper routing. Below is the list of message types, their associated constant values, and descriptions: - -```solidity -uint8 constant L2_MSG = 3; -uint8 constant L1MessageType_L2FundedByL1 = 7; -uint8 constant L1MessageType_submitRetryableTx = 9; -uint8 constant L1MessageType_ethDeposit = 12; -uint8 constant L1MessageType_batchPostingReport = 13; -uint8 constant L2MessageType_unsignedEOATx = 0; -uint8 constant L2MessageType_unsignedContractTx = 1; - -uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8; -uint8 constant INITIALIZATION_MSG_TYPE = 11; -``` - -| Message Type | Value | Description | -| ---------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `L2MessageType_unsignedEOATx` | 0 | Unsigned child chain messages from EOAs submitted to the parent chain. | -| `L2MessageType_unsignedContractTx` | 1 | Unsigned child chain messages submitted to the parent chain. | -| `L2_MSG` | 3 | Child chain messages submitted directly to the Sequencer. | -| `L1MessageType_L2FundedByL1` | 7 | Child chain messages that go to the parent chain's Delayed Inbox, with funding provided on the parent chain itself. | -| `ROLLUP_PROTOCOL_EVENT_TYPE` | 8 | Arbitrum Classic used it for messages sent to bridge, Nitro does not use it. | -| `L1MessageType_submitRetryableTx` | 9 | Submitting parent chain messages to the child chain via retryable tickets. | -| `INITIALIZATION_MSG_TYPE` | 11 | The first message added to a new Rollup inbox. Its presence indicates proper initialization of the Rollup. | -| `L1MessageType_ethDeposit` | 12 | Child chain messages that handle deposits of native tokens (`ETH`) into the child chain. | -| `L1MessageType_batchPostingReport` | 13 | Used by the Sequencer to update the pricing model based on payment(s) by the batch poster. | - -These identifiers enable nodes to route messages correctly. diff --git a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx index 51585e0856..d23205d671 100644 --- a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx +++ b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx @@ -9,30 +9,28 @@ content_type: get-started Arbitrum nodes receive transaction - inputs through a dual-channel approach that enhances reliability and consistency. + inputs through two channels: -First, nodes subscribe -to the Sequencer feed, receiving the upcoming ordered transactions -published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/deep-dives/sequencer.mdx#real-time-sequencer-feed). +Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/03-sequencer.mdx#real-time-sequencer-feed). -In addition to the Sequencer Feed, Arbitrum nodes subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those previously provided by the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. +Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. -As discussed in the [considerations and limitations section](/how-arbitrum-works/deep-dives/sequencer.mdx#considerations-and-limitations), these methods may be more appropriate for different applications depending on their specific requirements. +As discussed in the [considerations and limitations section](/how-arbitrum-works/03-sequencer.mdx#considerations-and-limitations), these methods suit different applications. -Arbitrum nodes reliably receive an ordered set of transactions through these mechanisms, which serve as inputs for the State Transition Function (STF). The function then processes these transactions and outputs the final state, ensuring consistency and security across the network. +These transactions serve as inputs for the State Transition Function (STF). ## Message types -Arbitrum supports submitting a variety of message types to its chains. These messages fall into two broad categories: +Arbitrum supports multiple message types: These messages fall into two broad categories: - Messages submitted directly to the Sequencer as child chain messages - Messages submitted to the parent chain -For more details on message types beyond standard child chain transactions, please refer to the [parent-to-child chain messaging documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). +For other message types, see the [parent-to-child chain messaging documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). -In the system, we refer to these messages as `L1IncomingMessage` [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54). +In the system, we refer to these messages as `L1IncomingMessage` (Feel free to inspect the [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54) ). -When submitted to the Sequencer feed, messages are tagged with a unique identifier, ensuring Arbitrum nodes correctly differentiate and process them. Below is the list of message types, their associated constant values, and descriptions: +When submitted to the Sequencer feed, messages receive unique identifiers for proper routing. Below is the list of message types, their associated constant values, and descriptions: ```solidity uint8 constant L2_MSG = 3; @@ -47,22 +45,16 @@ uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8; uint8 constant INITIALIZATION_MSG_TYPE = 11; ``` -- `L2_MSG` (3): Child chain messages submitted directly to the Sequencer. - -- `L1MessageType_L2FundedByL1` (7): Child chain messages that go to the parent chain's Delayed Inbox, with funding provided on the parent chain itself. - -- `L1MessageType_submitRetryableTx` (9): Submitting parent chain messages to the child chain via retryable tickets. - -- `L1MessageType_ethDeposit` (12): Child chain messages that handle deposits of native tokens (`ETH`) into the child chain. - -- `L1MessageType_batchPostingReport` (13): Used by the Sequencer to update the pricing model based on payment(s) by the batch poster. - -- `L2MessageType_unsignedEOATx` (0): Child chain messages submitted by externally owned accounts (EOAs) to the parent chain that does not include a signature. - -- `L2MessageType_unsignedContractTx` (1): Child chain messages submitted on the parent chain that does not include a signature. - -- `ROLLUP_PROTOCOL_EVENT_TYPE` (8): Arbitrum Classic used it for messages sent to bridge, Nitro does not use it. - -- `INITIALIZATION_MSG_TYPE` (11): The first message added to a new Rollup inbox. Its presence indicates proper initialization of the Rollup. - -These tagged identifiers enable Arbitrum nodes to parse incoming messages and direct their payloads appropriately, ensuring smooth and reliable network operation. +| Message Type | Value | Description | +| ---------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `L2MessageType_unsignedEOATx` | 0 | Unsigned child chain messages from EOAs submitted to the parent chain. | +| `L2MessageType_unsignedContractTx` | 1 | Unsigned child chain messages submitted to the parent chain. | +| `L2_MSG` | 3 | Child chain messages submitted directly to the Sequencer. | +| `L1MessageType_L2FundedByL1` | 7 | Child chain messages that go to the parent chain's Delayed Inbox, with funding provided on the parent chain itself. | +| `ROLLUP_PROTOCOL_EVENT_TYPE` | 8 | Arbitrum Classic used it for messages sent to bridge, Nitro does not use it. | +| `L1MessageType_submitRetryableTx` | 9 | Submitting parent chain messages to the child chain via retryable tickets. | +| `INITIALIZATION_MSG_TYPE` | 11 | The first message added to a new Rollup inbox. Its presence indicates proper initialization of the Rollup. | +| `L1MessageType_ethDeposit` | 12 | Child chain messages that handle deposits of native tokens (`ETH`) into the child chain. | +| `L1MessageType_batchPostingReport` | 13 | Used by the Sequencer to update the pricing model based on payment(s) by the batch poster. | + +These identifiers enable nodes to route messages correctly. From f451e3a0046221c92235f996455590e9097b3f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Fri, 15 Aug 2025 15:56:47 -0700 Subject: [PATCH 32/75] fix links --- docs/how-arbitrum-works/deep-dives/stf-inputs.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx index d23205d671..9815dc4030 100644 --- a/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx +++ b/docs/how-arbitrum-works/deep-dives/stf-inputs.mdx @@ -11,11 +11,11 @@ content_type: get-started transaction inputs through two channels: -Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/03-sequencer.mdx#real-time-sequencer-feed). +Nodes subscribe to the Sequencer feed, receiving upcoming ordered transactions published in real time. To learn more, refer to the [real-time sequencer feed documentation](/how-arbitrum-works/deep-dives/sequencer.mdx#real-time-sequencer-feed). Nodes also subscribe to the `SequencerBatchDelivered` event on the parent chain. This event occurs whenever a batch of transactions gets delivered to the parent chain via the batch poster. Upon receiving this event, nodes verify that the transactions recorded on the parent chain match those from the Sequencer feed. If discrepancies arise, nodes re-organize to adopt the transactions confirmed on the parent chain, using the parent chain as the definitive source of truth. -As discussed in the [considerations and limitations section](/how-arbitrum-works/03-sequencer.mdx#considerations-and-limitations), these methods suit different applications. +As discussed in the [considerations and limitations section](/how-arbitrum-works/deep-dives/sequencer.mdx#considerations-and-limitations), these methods suit different applications. These transactions serve as inputs for the State Transition Function (STF). @@ -26,7 +26,7 @@ Arbitrum supports multiple message types: These messages fall into two broad cat - Messages submitted directly to the Sequencer as child chain messages - Messages submitted to the parent chain -For other message types, see the [parent-to-child chain messaging documentation](/how-arbitrum-works/10-l1-to-l2-messaging.mdx). +For other message types, see the [parent-to-child chain messaging documentation](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). In the system, we refer to these messages as `L1IncomingMessage` (Feel free to inspect the [source code reference](https://github.com/OffchainLabs/nitro/blob/4ac7e9268e9885a025e0060c9ec30f9612f9e651/arbos/incomingmessage.go#L54) ). From 13e9630cc89efc094313303c0596c2821a78c897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Fri, 15 Aug 2025 18:04:55 -0700 Subject: [PATCH 33/75] simplify transaction lifecycle article --- .../deep-dives/transaction-lifecycle.mdx | 107 ++++++++++++++---- 1 file changed, 85 insertions(+), 22 deletions(-) diff --git a/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx b/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx index f7622ecc94..ed68bc9a6c 100644 --- a/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx +++ b/docs/how-arbitrum-works/deep-dives/transaction-lifecycle.mdx @@ -1,21 +1,39 @@ --- -title: Sequencing, Followed by Deterministic Execution -description: 'Learn the fundamentals of the Arbitrum Transaction Lifecycle, sequencing, and deterministic execution.' +title: Transaction lifecycle on Arbitrum +description: 'Learn how transactions are submitted and processed on Arbitrum, including sequencer and non-sequencer pathways.' author: pete-vielhaber sme: Mehdi user_story: As a current or prospective Arbitrum user, I need to learn more about the transaction lifecycle. -content_type: get-started +content_type: concept --- import ImageZoom from '@site/src/components/ImageZoom'; -This section explores the various methods users can employ to submit transactions for inclusion on the Arbitrum chain. We discuss the different pathways available—sending transactions to the Sequencer or bypassing it by submitting transactions through the Delayed Inbox contract on the parent chain. By outlining these options, we aim to clarify how users can interact with the network, detail the processes involved in each method, and identify the modules responsible for handling these transactions. This overview will enhance your understanding of the initial steps in Arbitrum ecosystem's Transaction lifecycle and prepare you for a detailed exploration of transaction inclusion mechanisms in the subsequent sections. +You can submit transactions to the Arbitrum chain through two main pathways: -The first subsection, [Submitting Transactions to the Sequencer](#submitting-transactions-to-the-sequencer), presents four different methods users can utilize to send their transactions to the sequencer: via Public RPC, Third-Party RPC, Arbitrum Nodes, and the Sequencer Endpoint. Transactions sent through the first three pathways will route through our Load Balancer before reaching the sequencer. In contrast, the Sequencer Endpoint allows transactions to bypass the Load Balancer and be sent directly to the sequencer. +1. **Through the Sequencer** - The standard method for most transactions +2. **Bypassing the Sequencer** - Using the Delayed Inbox contract on the Parent chain -The second subsection, [Bypassing the Sequencer](#bypassing-the-sequencer), describes an alternative method where users can include their transactions on the Arbitrum chain without relying on the sequencer. By sending transactions directly to the Delayed Inbox contract on the parent chain, users gain additional flexibility, ensuring that their transactions can be processed even if the sequencer is unavailable or if they prefer not to use it. +This guide explains both methods, when to use each one, and how they work within Arbitrum's transaction lifecycle. -This diagram illustrates the various pathways for submitting transactions to the Arbitrum chain. It highlights the options for sending transactions through the sequencer or bypassing it and using the Delayed Inbox contract on the parent chain. +## Transaction submission methods + +### Sequencer pathways + +You can send transactions to the Sequencer through four methods: + +- Public RPC endpoints +- Third-party RPC providers +- Self-hosted Arbitrum nodes +- Direct Sequencer endpoint + +The first three options route through a load balancer, while the Sequencer endpoint connects directly. + +### Non-sequencer pathway + +You can also submit transactions directly to the Delayed Inbox contract on the Parent chain. This method works even when the Sequencer is unavailable and provides additional censorship resistance. + +The following diagram shows the different ways you can submit transactions to Arbitrum: Arbitrum One, Arbitrum Nova, and Arbitrum Sepolia. These endpoints are rate-limited, making them best for: -Arbitrum provides public RPCs for its main chains: Arbitrum One, Arbitrum Nova, and Arbitrum Sepolia. Due to their rate-limited nature, these RPC endpoints are suitable for less resource-intensive operations. Public RPCs can be an accessible option for general use cases and light interactions with the network. +- Testing and development +- Light usage and general interactions +- Applications with low transaction volume For more details on the specific RPC endpoints for each chain, please see [this section](https://docs.arbitrum.io/build-decentralized-apps/reference/node-providers#arbitrum-public-rpc-endpoints) of the documentation. -### 2. Third-Party RPC +### Third-party RPC + +Third-party node providers offer enhanced performance and higher rate limits. Many providers that support Ethereum also support Arbitrum chains. Use third-party RPCs when you need: -Users also have the option to interact with Arbitrum's public chains using third-party node providers. These providers are often the same popular ones used for Ethereum, making them reliable choices for resource-intensive operations. We recommend using these third-party providers when performance and scalability are critical. +- Higher throughput +- Better performance +- More reliable uptime +- Advanced features like analytics You can find a list of supported third-party providers [here](https://docs.arbitrum.io/build-decentralized-apps/reference/node-providers#third-party-rpc-providers). -### 3. Arbitrum Nodes +### Arbitrum nodes -Another approach for sending transactions to the sequencer is through self-hosted Arbitrum nodes. Running a node gives you direct control over your transactions, which go to the sequencer via the Sequencer Feed. +Running your own Arbitrum node provides maximum control and privacy. Your transactions connect to the Sequencer through the Sequencer Feed. Consider this option if you need: + +- Complete control over transaction handling +- Maximum privacy +- Custom node configurations Please see the [Arbitrum Node](https://docs.arbitrum.io/run-arbitrum-node/overview) documentation to learn more about setting up and running a node. -### 4. Sequencer Endpoint +### Sequencer endpoint + +The Sequencer endpoint provides the fastest path to transaction submission by bypassing the load balancer. This endpoint only supports: -The Sequencer Endpoint is the most direct method for users looking to minimize delays in their transactions reaching the sequencer. Unlike standard RPC URLs, the Sequencer Endpoint supports only `eth_sendRawTransaction` and `eth_sendRawTransactionConditional` calls, bypassing the load balancer entirely. This endpoint makes it an optimal choice for users who require the quickest transaction processing time. +- `eth_sendRawTransaction` +- `eth_sendRawTransactionConditional` -The diagram below shows different ways to submit transactions to the Sequencer: +Use this method when you need the lowest possible latency for time-sensitive transactions. + +The following diagram shows the four methods for submitting transactions to the Sequencer: -To send a transaction to the Delayed Inbox instead of submitting it to the sequencer, users can construct their transaction and then call the [`sendL2Message`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/AbsInbox.sol#L150) function, passing the data of the serialized signed transaction as an argument. This function allows users to send a generic child chain messages to the chain, suitable for any message that does not require parent chain validation. +### Using the Delayed Inbox + +To submit a transaction through the Delayed Inbox: + +1. **Construct your transaction** and serialize it +2. **Call [`sendL2Message`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/AbsInbox.sol#L150)** with your serialized transaction data +3. **Wait for processing** or force inclusion after 24 hours + +### Force inclusion after delays + +If your transaction isn't processed within 24 hours, call the [`forceInclusion`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/SequencerInbox.sol#L284) function on the `SequencerInbox` contract. This guarantees your transaction will be included regardless of Sequencer status. + +### Using the Arbitrum SDK -If the sequencer is not back online within 24 hours or decides to censor the transaction, users can invoke the [`forceInclusion`](https://github.com/OffchainLabs/nitro-contracts/blob/fbbcef09c95f69decabaced3da683f987902f3e2/src/bridge/SequencerInbox.sol#L284) function on the `SequencerInbox` contract. This action ensures their transaction is included on the chain, bypassing the sequencer's role. +The Arbitrum SDK simplifies Delayed Inbox interactions through the [`InboxTools`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L64C14-L64C24) class: -Additionally, the Arbitrum SDK provides the [`InboxTools`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L64C14-L64C24) class, which simplifies the process of submitting transactions to the Delayed Inbox. Users can utilize the [`sendChildSignedTx`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L401C16-L401C33) method to send the transaction and the [`forceInclude`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L367) method to ensure its inclusion. The SDK also offers helper methods like [`signChildTx`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L429) to assist with signing the transaction during the creation of the serialized signed transaction hex string, streamlining the entire process. +| Method | Purpose | +| -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| [`sendChildSignedTx`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L401C16-L401C33) | Submit transaction to Delayed Inbox | +| [`forceInclude`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L367) | Force transaction inclusion after 24 hours | +| [`signChildTx`](https://github.com/OffchainLabs/arbitrum-sdk/blob/792a7ee3ccf09842653bc49b771671706894cbb4/src/lib/inbox/inbox.ts#L429) | Helper for transaction signing | From ecde4dd4bfff0481eaa98a6dc3ef5ce1219e2e95 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 07:44:05 -0500 Subject: [PATCH 34/75] moved content from 03-eth-vs-arb to build-dapps/arb-vs-eth/01-comparison-overview.mdx --- .../01-comparison-overview.mdx | 62 ++++++- .../02-block-numbers-and-time.mdx | 2 +- .../deep-dives/03-ethereum-vs-arbitrum.mdx | 154 ------------------ docs/how-arbitrum-works/deep-dives/arbos.mdx | 32 ++++ 4 files changed, 87 insertions(+), 163 deletions(-) delete mode 100644 docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx index e7b3faae21..dfeb048a17 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.mdx @@ -12,32 +12,78 @@ Arbitrum is designed to be as compatible and consistent with Ethereum as possibl This section describes the differences, perks, and gotchas that devs are advised to be aware of when working with Arbitrum. This first page serves as an overview of where you might find these differences, with links to the relevant pages when needed. -## Block numbers and time +## STF in Ethereum + +In Ethereum, the STF receives transactions as inputs, processes them via the EVM, and produces the final state as output. + +The Ethereum state is a vast data structure represented by a modified Merkle Patricia Trie. This structure holds all accounts, linking them via hashes and reducing the entire state to a single root hash stored on the blockchain. + +The Ethereum Virtual Machine (EVM) operates similarly to a mathematical function: given an input, it produces a deterministic output. Ethereum's STF encapsulates this behavior: + +$$ +Y(S, T) = S' +$$ + +Here, `S` represents the current state, `T` denotes the transaction, and `S'` is the new state resulting from the execution of `T`. + +The EVM operates as a stack machine with a maximum depth of 1024 items. Each item is a 256-bit word, chosen for compatibility with 256-bit cryptography (e.g., Keccak-256 hashes and secp256k1 signatures). + +During execution, the EVM uses transient _memory_ (a word-addresses byte array) that only persists for the duration of a transaction. In contrast, each contract maintains a persistent Merkle Patricia _storage_ trie–a word-addressable word array–that forms part of the global state. + +smart contract bytecode compiles into a series of EVM opcodes +that perform standard stack operations (such as `XOR`, `AND`, `ADD`, `SUB`) and blockchain-specific operations +(such as `ADDRESS`, `BALANCE`, `BLOCKHASH`). + +Geth (go-Ethereum) is one of the primary + client + implementations of Ethereum, serving as the practical embodiment of both the STF and the EVM execution +engine. It processes transactions by executing the smart contract's bytecode and updating the global +state, ensuring that every state change is deterministic and secure. + +In essence, Geth converts transaction inputs into precise computational steps within the EVM, maintaining the intricate data structures that underpin Ethereum's blockchain. Its robust design not only powers the core operations of Ethereum but also provides the foundation for advanced modificaitons in platforms like the Arbitrum Nitro stack. + +## STF on Arbitrum + +The Arbitrum Nitro stack implements a modified version of Ethereum's STF. While it retains the core principles of Ethereum, several Arbitrum-specific features and processes distinguish it from Ethereum's implementation. Key differences include: + +### Block numbers and time Time in Arbitrum chains is tricky. The timing assumptions one is used to making about Ethereum blocks don't exactly carry over into the timing of Arbitrum blocks. See [Block numbers and time](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx) for details about how block numbers and time are handled in Arbitrum. -## RPC methods +### RPC methods Although the majority of RPC methods follow the same behavior as Ethereum, some methods might produce a different result, or add more information, when used on an Arbitrum chain. You can find more information about these differences in [RPC methods](/build-decentralized-apps/arbitrum-vs-ethereum/03-rpc-methods.mdx). -## Solidity support +### Solidity support You can deploy Solidity contracts onto Arbitrum just like you do on Ethereum. There are only a few minor differences in behavior. Find more information about it in [Solidity support](/build-decentralized-apps/arbitrum-vs-ethereum/04-solidity-support.mdx). -## Fees +### Gas accounting + +In Arbitrum, executing a transaction incurs two costs, one for executing on the child chain and another for submitting transaction batches to the parent chain. This dual fee structure requires a different approach to gas accounting. + +### Base fee mechanism -The fees for executing an Arbitrum transaction work like gas fees on Ethereum. However, Arbitrum transactions must also pay a fee component to cover the cost of posting their calldata to the parent chain (for example, calldata on Arbitrum One, a child chain, is posted to Ethereum, a parent chain). Find more information about the two components of gas fees in [Gas and fees](/how-arbitrum-works/deep-dives/gas-and-fees.mdx) and parent chain pricing. +Gas prices and base fees on Arbitrum change differently from Ethereum's. Arbitrum maintains two base fees: one to track the cost of execution on the child chain and another to estimate the cost of posting batches to the parent chain. The mechanism that changes the child chain's base fee differs from what is currently on Ethereum. -## Cross-chain messaging +### Cross-chain messaging Arbitrum chains support arbitrary message passing from a parent chain (for example, a parent chain like Ethereum) to a child chain (for example, a child chain like Arbitrum One or Arbitrum Nova). These are commonly known as "parent chain to child chain messages". Developers using this functionality should familiarize themselves with how they work. Find more information about it in [Parent chain to child chain messaging](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). Similarly, Arbitrum chains can also send messages to the parent chain. Find more information about them in [Child chain to parent chain messaging and the outbox](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx). -## Precompiles +### Precompiles Besides supporting all precompiles available in Ethereum, Arbitrum provides child chain-specific precompiles with methods smart contracts can call the same way they can solidity functions. You can find a full reference of them in [Precompiles](/build-decentralized-apps/precompiles/01-overview.mdx). -## NodeInterface +### NodeInterface The Arbitrum Nitro software includes a special `NodeInterface` contract available at address `0xc8` that is only accessible via RPCs (it's not actually deployed onchain, and thus can't be called by smart contracts). Find more information about this interface in [NodeInterface](/build-decentralized-apps/nodeinterface/01-overview.mdx). + +### Custom transaction types + +Nitro Geth introduces several child chain-specific transaction types that utilize the non-standard [EIP-2718: Typed Transaction Envelope](https://eips.ethereum.org/EIPS/eip-2718). These types represent different transactions on the Arbitrum chain, such as retryable transactions. + +### Stylus in the STF + +With the introduction of Stylus, Arbitrum Nitro now supports executing smart contracts written in Rust, C, and C++, offering a high-performance alternative to the EVM. Unlike standard Ethereum transactions, Stylus contracts execute in a WASM-based runtime within ArbOS, leveraging efficient host I/O operations and optimized caching mechanisms. diff --git a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx index 5aa4a39a4e..af3d9fe8d6 100644 --- a/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx +++ b/docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx @@ -19,7 +19,7 @@ Throughout this and other pages, we mention how the block number of a chain does As in Ethereum, Arbitrum clients submit transactions, and the system executes those transactions later. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the Sequencer](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#sequencing-followed-by-deterministic-execution) or via the chain's [Delayed Inbox](/how-arbitrum-works/01-inside-arbitrum-nitro.mdx#inboxes-fast-and-slow). -Sequencing, Followed by Deterministic Execution +## Sequencing, Followed by Deterministic Execution Once in the chain's core inbox contract, transactions are processed in order. Generally, some time will elapse between when a message is put into the inbox (and timestamped) and when the contract processes the message and carries out the transaction requested by the message. diff --git a/docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx b/docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx deleted file mode 100644 index d72d6b7544..0000000000 --- a/docs/how-arbitrum-works/deep-dives/03-ethereum-vs-arbitrum.mdx +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: 'State Transition Function: Ethereum vs. Arbitrum' -description: 'Learn the fundamentals of Nitro, Arbitrum stack.' -author: petevielhaber -sme: Mehdi -user_story: As a current or prospective Arbitrum user, I need learn more about Nitros design. -content_type: get-started ---- - -import ImageZoom from '@site/src/components/ImageZoom'; - -This section explains the architecture and implementation of the State Transition Function (STF) in Ethereum and the Arbitrum Nitro stack, highlighting their similarities and key differences. - -## STF in Ethereum - -In Ethereum, the STF receives transactions as inputs, processes them via the EVM, and produces the final state as output. - -The Ethereum state is a vast data structure represented by a modified Merkle Patricia Trie. This structure holds all accounts, linking them via hashes and reducing the entire state to a single root hash stored on the blockchain. - -The Ethereum Virtual Machine (EVM) operates similarly to a mathematical function: given an input, it produces a deterministic output. Ethereum's STF encapsulates this behavior: - -$$ -Y(S, T) = S' -$$ - -Here, `S` represents the current state, `T` denotes the transaction, and `S'` is the new state resulting from the execution of `T`. - -The EVM operates as a stack machine with a maximum depth of 1024 items. Each item is a 256-bit word, chosen for compatibility with 256-bit cryptography (e.g., Keccak-256 hashes and secp256k1 signatures). - -During execution, the EVM uses transient _memory_ (a word-addresses byte array) that only persists for the duration of a transaction. In contrast, each contract maintains a persistent Merkle Patricia _storage_ trie–a word-addressable word array–that forms part of the global state. - -smart contract bytecode compiles into a series of EVM opcodes -that perform standard stack operations (such as `XOR`, `AND`, `ADD`, `SUB`) and blockchain-specific operations -(such as `ADDRESS`, `BALANCE`, `BLOCKHASH`). - -Geth (go-Ethereum) is one of the primary - client - implementations of Ethereum, serving as the practical embodiment of both the STF and the EVM execution -engine. It processes transactions by executing the smart contract's bytecode and updating the global -state, ensuring that every state change is deterministic and secure. - -In essence, Geth converts transaction inputs into precise computational steps within the EVM, maintaining the intricate data structures that underpin Ethereum's blockchain. Its robust design not only powers the core operations of Ethereum but also provides the foundation for advanced modificaitons in platforms like the Arbitrum Nitro stack. - -## STF on Arbitrum - -The Arbitrum Nitro stack implements a modified version of Ethereum's STF. While it retains the core principles of Ethereum, several Arbitrum-specific features and processes distinguish it from Ethereum's implementation. Key differences include: - -### Gas accounting - -In Arbitrum, executing a transaction incurs two costs, one for executing on the child chain and another for submitting transaction batches to the parent chain. This dual fee structure requires a different approach to gas accounting. - -### Base fee mechanism - -Gas prices and base fees on Arbitrum change differently from Ethereum's. Arbitrum maintains two base fees: one to track the cost of execution on the child chain and another to estimate the cost of posting batches to the parent chain. The mechanism that changes the child chain's base fee differs from what is currently on Ethereum. - -### Cross-chain bridge functionalities - -Arbitrum supports cross-chain messaging and regular transactions, facilitating seamless interactions between the child and parent chains. - -### Block time and block number - -The Arbitrum chain uses two block numbers: the child chain's block number, and the block number of the first non-Arbitrum ancestor chain. Additionally, block times are determined by the child chain's sequencer clock, as described in the [Block numbers and time documentation](/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.mdx). - -### Precompiles - -Specific precompiled contracts on the Arbitrum chain will process Arbitrum-specific features. Moreover, individual Arbitrum chains may implement their own custom precompiles. - -### Custom transaction types - -Nitro Geth introduces several child chain-specific transaction types that utilize the non-standard [EIP-2718: Typed Transaction Envelope](https://eips.ethereum.org/EIPS/eip-2718). These types represent different transactions on the Arbitrum chain, such as retryable transactions. - -### Stylus in the STF - -With the introduction of Stylus, Arbitrum Nitro now supports executing smart contracts written in Rust, C, and C++, offering a high-performance alternative to the EVM. Unlike standard Ethereum transactions, Stylus contracts execute in a WASM-based runtime within ArbOS, leveraging efficient host I/O operations and optimized caching mechanisms. - -## Implementation overview - -The Arbitrum STF is implemented using a modified version of Geth and integrated with ArbOS. This combination allows Arbitrum to support additional functionalities while maintaining compatibility with Ethereum's core execution model. The following diagram provides an abstract overview: - - - -The organization of the Nitro node software has three main layers: - -1. **Base layer (Geth Core)**: This layer comprises the core components of Geth that emulate EVM contract execution and maintain Ethereum's state data structures. Nitro integrates this code as a library with minor modifications to insert additional hooks. - -2. **Middle layer (ArbOS)**: ArbOS is custom software that extends child chain functionalities. It decompresses and parses Sequencer data batches, accounts for parent chain gas costs (collecting fees for reimbursement), and supports cross-chain bridge operations (e.g., Ether and token deposits and withdrawals). More details about ArbOS are in the [next section](#arbos-overview). - -3. **Top layer (Node software)**: Primarily derived from Geth, this layer handles network connections, incoming RPC requests, and other high-level functionalities required to operate an Ethereum-compatible blockchain node. - -Because both the top and bottom layers are Geth-based, this architecture is often referred to as a "geth sandwich"–with Geth as the "bread" and ArbOS as the "filling." - -The State Transition Function (STF) itself consists of the modified Geth core (base layer) combined with a portion of ArbOS (middle layer). In practice, the STF is a designated function within the source code (including all the code it calls), which: - -- Takes the bytes of a transaction received in the inbox as input. - -- Operates on a modifiable copy of the Ethereum state tree. - -- May modify the state during execution. - -- Emits a new block header (formatted in Ethereum's block header structure) that appends to the Nitro chain. - -## Modified Geth on Nitro - -[Nitro's](https://github.com/OffchainLabs/nitro) design builds upon the robust foundation of Geth with targeted modifications that enable it to support child chain-specific functionalities. These modifications include: - -### Custom hooks and interface adaptions - -Nitro integrates a series of custom hooks within Geth's transaction processing flow. These hooks allow Nitro to implement dual gas accounting, manage parent chain calldata fees, and handle custom transaction types–such as retryable transactions–without deviating from Ethereum's core logic. - -### Strategic re-appropriations of core types - -By adapting key data structures and interfaces within Geth, Nitro ensures that state transitions and transaction executions can seamlessly accommodate child chain optimizations. These adaptations maintain compatibility with Ethereum's existing architecture while enabling enhanced functionality. - -### Minimal yet essential adjustments - -The modifications made to Geth are deliberately minimal to preserve its stability and security properties. This "modified Geth" layer, in tandem with ArbOS, provides the necessary enhancements for Nitro's STF without compromising the deterministic behavior of the EVM. - -### Stylus-specific features - -Geth is modified to route Stylus transactions, handle custom gas accounting, and track Stylus-specific state changes, ensuring seamless execution within Arbitrum Nitro. - -Detailed technical explanations of these modifications are in the following sections, where we dive deeper into how Nitro's custom hooks, interface implementations, and Geth adaptations come together to support an advanced, high-performance STF. - -## ArbOS overview - -ArbOS is the child chain EVM hypervisor that provides the execution environment for the Arbitrum chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: - -### Managing network resources - -It allocates and tracks resources necessary for executing transcations on the child chain. - -### Block production - -ArbOS processes incoming sequencer data batches to produce child chain blocks, ensuring the state is updated correctly. - -### Cross-chain messaging - -It facilitates communication between the parent and child chains, supporting functionalities like Ether and token deposits and withdrawals. - -### Enhanced EVM execution - -ArbOS operates its instrumented instance of Geth to execute smart contracts, incorporating additional logic specific to the child chain environment. - -### Stylus-specific tasks in ArbOS - -ArbOS manages host I/O calls, memory operations, and execution context for Stylus transactions, ensuring efficient and deterministic processing with the WASM runtime. - -By offloading tasks that would execute at a high cost on the parent chain, ArbOS enables these operations to be performed quickly and cost-effectively on the child chain. This design reduces computational and storage costs and offers significant flexibility, allowing the child chain code to evolve or be customized more easily than a parent chain-enforced architecture. - -While Ethereum's STF forms the basis for secure and deterministic state updates, Arbitrum's Nitro stack builds on this foundation with key modifications–ranging from dual gas accounting to cross-chain messaging–to optimize performance and flexibility. These innovations are realized through minimal yet strategic modifications to Geth, integrated seamlessly with ArbOS, forming the "geth sandwich." - -With the introduction of Stylus, Arbitrum extends its execution model beyond the EVM, enabling high-performance WASM-based smart contracts. This integration introduces additional modifications to Geth, ensuring compatibility with Stylus transactions while preserving Ethereum-like execution guarantees. These changes include handling Stylus-specific transaction types and ensuring smooth interaction between the EVM and WASM environments. - -In the following section, we'll dive deep into these modifications, exploring how Nitro leverages 'Geth at the core' and the custom enhancements provided by ArbOS to deliver an advanced, high-performance STF. Stylus-specific tasks within ArbOS are covered separately to highlight its role in managing execution, host I/O, and memory operations. diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index 7fdb53acdf..9e4b1d65ba 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -7,6 +7,38 @@ user_story: As a current or prospective Arbitrum user, I need learn more about N content_type: get-started --- +## ArbOS overview + +ArbOS is the child chain EVM hypervisor that provides the execution environment for the Arbitrum chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: + +### Managing network resources + +It allocates and tracks resources necessary for executing transcations on the child chain. + +### Block production + +ArbOS processes incoming sequencer data batches to produce child chain blocks, ensuring the state is updated correctly. + +### Cross-chain messaging + +It facilitates communication between the parent and child chains, supporting functionalities like Ether and token deposits and withdrawals. + +### Enhanced EVM execution + +ArbOS operates its instrumented instance of Geth to execute smart contracts, incorporating additional logic specific to the child chain environment. + +### Stylus-specific tasks in ArbOS + +ArbOS manages host I/O calls, memory operations, and execution context for Stylus transactions, ensuring efficient and deterministic processing with the WASM runtime. + +By offloading tasks that would execute at a high cost on the parent chain, ArbOS enables these operations to be performed quickly and cost-effectively on the child chain. This design reduces computational and storage costs and offers significant flexibility, allowing the child chain code to evolve or be customized more easily than a parent chain-enforced architecture. + +While Ethereum's STF forms the basis for secure and deterministic state updates, Arbitrum's Nitro stack builds on this foundation with key modifications–ranging from dual gas accounting to cross-chain messaging–to optimize performance and flexibility. These innovations are realized through minimal yet strategic modifications to Geth, integrated seamlessly with ArbOS, forming the "geth sandwich." + +With the introduction of Stylus, Arbitrum extends its execution model beyond the EVM, enabling high-performance WASM-based smart contracts. This integration introduces additional modifications to Geth, ensuring compatibility with Stylus transactions while preserving Ethereum-like execution guarantees. These changes include handling Stylus-specific transaction types and ensuring smooth interaction between the EVM and WASM environments. + +In the following section, we'll dive deep into these modifications, exploring how Nitro leverages 'Geth at the core' and the custom enhancements provided by ArbOS to deliver an advanced, high-performance STF. Stylus-specific tasks within ArbOS are covered separately to highlight its role in managing execution, host I/O, and memory operations. + ## Precompiles From 3913a8e9dd822a29d437ddc9bd272fa56fef3635 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 07:54:57 -0500 Subject: [PATCH 35/75] Editing contents for duplication --- docs/how-arbitrum-works/deep-dives/arbos.mdx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/docs/how-arbitrum-works/deep-dives/arbos.mdx b/docs/how-arbitrum-works/deep-dives/arbos.mdx index 9e4b1d65ba..06cdcca986 100644 --- a/docs/how-arbitrum-works/deep-dives/arbos.mdx +++ b/docs/how-arbitrum-works/deep-dives/arbos.mdx @@ -7,8 +7,6 @@ user_story: As a current or prospective Arbitrum user, I need learn more about N content_type: get-started --- -## ArbOS overview - ArbOS is the child chain EVM hypervisor that provides the execution environment for the Arbitrum chain. Acting as a trusted "system glue" component within the STF, ArbOS is responsible for: ### Managing network resources @@ -39,9 +37,7 @@ With the introduction of Stylus, Arbitrum extends its execution model beyond the In the following section, we'll dive deep into these modifications, exploring how Nitro leverages 'Geth at the core' and the custom enhancements provided by ArbOS to deliver an advanced, high-performance STF. Stylus-specific tasks within ArbOS are covered separately to highlight its role in managing execution, host I/O, and memory operations. - - -## Precompiles +## How precompiles work A precompile consists of a Solidity interface in `contracts/src/precompiles/` and a corresponding Golang implementation in `precompiles/`. Using Geth's ABI generator, `solgen/gen.go` generates `solgen/go/precompilesgen/precompilesgen.go`, which collects the ABI data of the precompiles. The [runtime installer](https://github.com/OffchainLabs/nitro/blob/bc6b52daf7232af2ca2fec3f54a5b546f1196c45/precompiles/precompile.go#L379) uses this generated file to check the type safety of each precompile's implementer. @@ -67,11 +63,11 @@ ArbOS's state is viewed and modified via [`ArbosState`](https://github.com/Offch Because two [`ArbosState`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L36) objects with the same [`backingStorage`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/storage/storage.go#L51) contain and mutate the same underlying state, different `ArbosState` objects can provide different views of ArbOS's contents. [`Burner`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/burn/burn.go#L11) objects, which track gas usage while working with the `ArbosState`, provide the internal mechanism. Some are read-only, causing transactions to revert with `vm.ErrWriteProtection` upon a mutating request. Others demand the caller have elevated privileges. Meanwhile, others dynamically charge users when doing stateful work. This view is chosen for safety when [`OpenArbosState()`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L57) creates the object and may never change. -Must of ArbOS's state exists to facilitate its [precompiles](/build-decentralized-apps/precompiles/02-reference.mdx). The parts that aren't are detailed below. - [`arbosVersion`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L37), [`updgradeVersion`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L38) and [`upgradeTimestamp`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/arbosState/arbosstate.go#L39) ArbOS upgrades are scheduled to happen [when finalizing the first block](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/block_processor.go#L350) after the `upgradeTimestamp`. +Most of ArbOS's state exists to facilitate its [precompiles](/build-decentralized-apps/precompiles/02-reference.mdx). The parts that aren't are detailed below. + ### [`blockhashes`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/blockhash/blockhash.go#L15) This component maintains the last 256 parent chain block hashes in a circular buffer. This component allows the [`TxProcessor`](https://github.com/OffchainLabs/nitro/blob/8e786ec6d1ac3862be85e0c9b5ac79cbd883791c/arbos/tx_processor.go#L38) to implement the `BLOCKHASH` and `NUMBER` opcodes and supports the precompile methods that involve the Outbox. To avoid changing the ArbOS state outside of a transaction, blocks made from messages with a new parent chain–block number update this info during an [`InternalTxUpdateL1BlockNumber`](https://github.com/OffchainLabs/nitro/blob/fa36a0f138b8a7e684194f9840315d80c390f324/arbos/internal_tx.go#L24) [`ArbitrumInternalTx`](https://github.com/OffchainLabs/nitro/blob/8e786ec6d1ac3862be85e0c9b5ac79cbd883791c/arbos/internal_tx.go) included as the first transaction of the block. @@ -82,8 +78,6 @@ In addition to supporting the [`ArbAggregator precompile`](/build-decentralized- Based on this information, ArbOS maintains a parent chain data fee, which is also tracked as part of this state, determining how much transaction fees will cost for parent chain fees. ArbOS dynamically adjusts this value so that fees collected are approximately equal to batch posting costs. - - ## Parent chain pricing model Efficient handling of parent chain gas costs is crucial for the Arbitrum network's scalability and economic sustainability. The Sequencer implements a dynamic parent chain pricing model to ensure that fees collected from transactions closely match the actual costs incurred when posting data to the parent chain. This section details the challenges in pricing parent chain resources, how fees are collected and allocated, and how the system adjusts to maintain equilibrium over time. From 4ea344dda541ab4f344074f6a5818015d1bdd750 Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 12:38:21 -0500 Subject: [PATCH 36/75] Editing Inside Arbitrum Nitro for readability/grammar/tense --- .../01-inside-arbitrum-nitro.mdx | 471 ++++++++---------- 1 file changed, 219 insertions(+), 252 deletions(-) diff --git a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx index 2a485b2a0b..770af22d04 100644 --- a/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx +++ b/docs/how-arbitrum-works/01-inside-arbitrum-nitro.mdx @@ -9,26 +9,26 @@ content_type: get-started import ImageWithCaption from '@site/src/components/ImageCaptions/'; -This document is a deep-dive explanation of Arbitrum Nitro's design and the rationale for it. This isn't API documentation, nor is it a guided tour of the code - look elsewhere for those. "Inside Arbitrum Nitro" is for people who want to understand Nitro's design. +This document provides a comprehensive explanation of Arbitrum Nitro's design and the rationale behind it. This document isn't API documentation, nor is it a guided tour of the code - look elsewhere for those. "Inside Arbitrum Nitro" is for individuals who want to gain a deeper understanding of Nitro's design. -The body of this document will describe Arbitrum Rollup, this primary use case of the Nitro technology and the one used on the Arbitrum One chain. This is a variant use case, called AnyTrust, which is used by the Arbitrum Nova chain. AnyTrust is covered by a section at the end of this document. +The body of this document will describe Arbitrum Rollup, the primary use case of the Nitro technology, used on the Arbitrum One chain. There is a variant use case, called AnyTrust, deployed on the Arbitrum Nova chain. AnyTrust is a configuration that introduces mild trust assumptions and utilizes alternative data availability (Alt-DA), as discussed in a section at the end of this document. ## Why use Arbitrum? Why use Nitro? Arbitrum is an L2 scaling solution for Ethereum, offering a unique combination of benefits: - **Trustless security**: security rooted in Ethereum, with any one party able to ensure correct Layer 2 results -- **Compatability with Ethereum**: able to run unmodified EVM contracts and unmodified Ethereum transactions +- **Compatibility with Ethereum**: able to run unmodified EVM contracts and unmodified Ethereum transactions - **Scalability**: moving contracts' computation and storage off of the main Ethereum chain, allowing much higher throughput - **Minimum cost**: designed and engineered to minimize the L1 gas footprint of the system, minimizing per-transaction cost -Some other Layer 2 systems provide some of these features, but to our knowledge no other system offers the same combination of features at the same cost. +Some other Layer 2 systems offer some of these features, but to our knowledge, no other system provides the same combination of features at the same cost. Nitro is a major upgrade to Arbitrum, improving over "classic" Arbitrum in several ways: - **Advanced Calldata Compression**, which further drives down transaction costs on Arbitrum by reducing the amount of data posted to L1. - **Separate Contexts for Common Execution and Fault Proving**, increasing the performance of L1 nodes, and thus offering lower fees. -- **Ethereum L1 Gas Compatability**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. +- **Ethereum L1 Gas Compatibility**, bringing pricing and accounting for EVM operations perfectly in line with Ethereum. - **Additional L1 Interoperability**, including tighter synchronization with L1 block numbers, and full support for all Ethereum L1 precompiles. - **Safe retryables**, eliminating the failure mode where a retryable ticket fails to get created. - **Geth Tracing**, for even broader debugging support. @@ -43,16 +43,16 @@ At the most basic level, an Arbitrum chain works like this: src="/img/haw-eds-napkin-drawing.png" /> -People and contracts put messages into the inbox. The chain reads the messages one at a time, and processes each one. This updates the state of the chain and produces some outputs. +People and contracts put messages into the inbox. The chain reads the messages one at a time and processes each one. This processing updates the state of the chain and produces some outputs. -If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then the chain will see your transaction, execute it, and produce some outputs: a transaction receipt, and any withdrawals that your transaction initiated. +If you want an Arbitrum chain to process a transaction for you, you need to put that transaction into the chain's inbox. Then, the chain will process your transaction, execute it, and produce some outputs: a transaction receipt and any withdrawals that your transaction initiated. -Execution is deterministic - which means that the chain's behavior is uniquely determined by the contents of its inbox. Because of this, the result of your transaction is knowable as soon as your transaction has been put in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) +Execution is deterministic - which means that the contents of its inbox uniquely determine the chain's behavior. Because of this, the result of your transaction is knowable as soon as it gets placed in the inbox. Any Arbitrum node will be able to tell you the result. (And you can run an Arbitrum node yourself if you want.) -All of the technical details in this document is connected to this diagram. To get from this diagram to a full description of Arbitrum, we'll need to answer questions like these: +All of the technical details in this document connect to this diagram (shown above). To get from this diagram to a full description of Arbitrum, we'll need to answer questions like these: - Who keeps track of the inbox, chain state, and outputs? -- How does Arbitrum make sure that the chain state and ouputs are correct? +- How does Arbitrum make sure that the chain state and outputs are correct? - How can Ethereum users and contracts interact with Arbitrum? - How does Arbitrum support Ethereum-compatible contracts and transactions? - How are `ETH` and tokens transferred into and out of Arbitrum chains, and how are they managed while on chain? @@ -60,200 +60,189 @@ All of the technical details in this document is connected to this diagram. To g ## Nitro's Design: The Four Big Ideas -The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a very quick summary of each, then we'll unpack in more detail in later sections. +The essence of Nitro, and its key innovations, lie in four big ideas. We'll list them here with a summary of each, and then we'll unpack them in more detail in later sections. -- **Sequencing, Followed by Deterministic Execution**: Nitro processes transactions with a two-phase strategy. First, the transactions are organized into a single ordered sequence, and Nitro commits to that sequence. Then the transactions are processed, in that sequence, by a deterministic state transition function. -- **Geth at the Core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatability with Ethereum. +- **Sequencing, Followed by Deterministic Execution**: Nitro processes transactions with a two-phase strategy. First, transactions get organized into a single ordered sequence, and Nitro commits to that sequence. Then, the transactions are processed in that sequence by a deterministic State Transition Function (STF). +- **Geth at the Core**: Nitro supports Ethereum's data structures, formats, and virtual machine by compiling in the core code of the popular go-ethereum (Geth) Ethereum node software. Using Geth as a library in this way ensures a very high degree of compatibility with Ethereum. - **Separate Execution from Proving**: Nitro takes the same source and compiles it twice, once to native code for execution in a Nitro node, optimized for speed, and again to WASM for use in proving, optimized for portability and security. - **Optimistic Rollup with Interactive Fraud Proofs**: Nitro settles transactions to the Layer 1 Ethereum chain using an optimistic rollup protocol, including the interactive fraud proofs pioneered by Arbitrum. ## Sequencing, Followed by Deterministic Execution -This diagram summarizes how transactions are processed in Nitro. +This diagram illustrates the process of how transaction processing works in Nitro. Let's follow a user's transaction through this process. -First, the user creates a transaction, uses their wallet to sign it, and sends it to the Nitro chain's Sequencer. The Sequencer's job, as its name implies, is to take the arriving transactions, put them into an ordered sequence, and publishes that sequence. +First, the user creates a transaction, uses their wallet to sign it, and sends it to the Nitro chain's Sequencer. The Sequencer's job, as its name implies, is to take the arriving transactions, put them into an ordered sequence, and publish that sequence. -Once the transactions are sequenced, they are run through the _state transition function_, one by one, in order. The state transition function takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. +Once the transactions are sequenced, they go to the _State Transition Function (STF)_ for processing, one by one, in order. The STF takes as input the current state of the chain (account balances, contract code, and so on), along with the next transaction. It updates the state and sometimes emits a new Layer 2 block on the Nitro chain. -Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the state transition function will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions so the state transition function never sees them - and this reduces cost and therefore keeps transactions fees low - but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) +Because the protocol doesn't trust the Sequencer not to put garbage into its sequence, the STF will detect and discard any invalid (e.g., improperly formed) transactions in the sequence. A well-behaved Sequencer will filter out invalid transactions, so the STF never sees them - and this reduces cost and therefore keeps transaction fees low - but Nitro will still work correctly no matter what the Sequencer puts into its feed. (Transactions in the fees are signed by their senders, so the Sequencer can't create forged transactions.) -The state transition function is deterministic, which means that its behavior depends only on the current state and the contents of the next transaction - and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. +The state transition function is deterministic, meaning its behavior depends only on the current state and the contents of the next transaction, and nothing else. Because of this determinism, the result of a transaction `T` will depend only on the genesis state of the chain, the transactions before `T` in the sequence, and `T` itself. -It follows that anyone who knows the transaction sequence can computate the state transition function for themselves - and all honest parties who do this are guaranteed to get identical results. This is the normal way that Nitro nodes operate: get the transaction sequence, and run the state transition function locally. No consensus mechanism is needed for this. +Anyone who knows the transaction sequence can compute the STF independently, and all honest parties who do so are guaranteed to obtain identical results. Nitro nodes normally operate as follows: retrieve the transaction sequence and execute the State Transition Function locally. There is no requirement for a consensus mechanism. :::info More information -For additional reading on STF inputs see the [STF Inputs deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). +For additional reading on STF inputs, see the [STF Inputs deep-dive](/how-arbitrum-works/deep-dives/stf-inputs.mdx). ::: ## How the Sequencer Publishes the Sequence -So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed, and batches posted on L1 Ethereum. +So how do nodes get the sequence? The Sequencer publishes it in two ways: a real-time feed and batches posted on L1 Ethereum. -The real-time feed is published by the Sequencer so that anyone who subscribes to the feed receives instant notifications of each transaction as it is sequenced. Nitro nodes can subscribe to the feed directly from the Sequencer, or through a relay that fowards the feed. The feed represents the Sequencer's promise that it will record transactions in a particular order. If the Sequencer is honest and doesn't have a long downtime, this promise will be kept. So anyone who trusts the Sequencer to keep its promises can rely on the feed to get instant information about the transaction sequence - and they can run the sequenced transactions through the state transition function to learn the results of each transaction immediately. This is "soft finality" for transactions; it's "soft" because it depends on the Sequencer keeping its promises. +The real-time feed is published by the Sequencer so that anyone who subscribes to the feed receives instant notifications of each transaction as it is sequenced. Nitro nodes can subscribe to the feed directly from the Sequencer, or through a relay that forwards the feed. The feed represents the Sequencer's promise to record transactions in a particular order. If the Sequencer is honest and doesn't experience prolonged downtime, the Sequencer will fulfill its promise. Anyone who trusts the Sequencer to keep its promises can rely on the feed to obtain instant information about the transaction sequence. They can then run the sequenced transactions through the STF to immediately learn the results of each transaction. This process is called "soft finality" for transactions; it's "soft" because it relies on the Sequencer keeping its promises. -The Sequencer also publishes its sequence on the L1 Ethereum chain. Periodically - perhaps every few minutes in production - the Sequencer concatenates the next group of transactions is the feed, compresses them for efficiency, and posts the result as calldata on Ethereum. This is the final and official record of the transaction sequence. As soon as this Ethereum transaction has finality on Ethereum, the Layer 2 Nitro transactions it records will have finality. These transactions are final because their position in the sequence has finality, and the outcome of the transactions is deterministic and knowable to any party. This is "hard finality." +The Sequencer also publishes its sequence on the L1 Ethereum chain. Periodically, every few minutes in production, the Sequencer concatenates the next group of transactions in the feed, compresses them for efficiency, and posts the result as calldata (blobs) on Ethereum. This process is the final and official record of the transaction sequence. -The Sequencer's batches are compressed using a general-purpose data compression algorithm called "Brotli", on its highest-compression setting. +As soon as this Ethereum transaction achieves finality on the Ethereum blockchain, the Layer 2 Nitro transactions it records will also achieve finality. These transactions are final because their position in the sequence has finality, and the outcome of the transactions is deterministic and knowable to any party. This process is "hard finality." + +The Sequencer compresses its batches using the Brotli algorithm at its highest compression setting. :::info More information -To learn more about the Sequencer in depth take a look at the [Sequencer Deep Dive](/how-arbitrum-works/deep-dives/sequencer.mdx) +To learn more about the Sequencer in depth, take a look at the [Sequencer Deep Dive](/how-arbitrum-works/deep-dives/sequencer.mdx) ::: ## Geth at the Core -The second key design idea in Nitro is "Geth at the Core." Here "Geth" refers to go-ethereum, the most common node software for Ethereum. As its name would suggest, go-ethereum is written in the Go programming language, as is almost all of Nitro. +The second key design idea in Nitro is "Geth at the Core." Here, "Geth" refers to go-ethereum, the most common node software for Ethereum. As its name suggests, go-ethereum is written in the Go programming language, as is almost all of Nitro. -The software that makes up a Nitro node can be thought of as built in three main layers, which are shown above: +You can think of the software that comprises a Nitro node as being organized into three primary layers (shown above): - The base layer is the core of Geth - the parts of Geth that emulate the execution of EVM contracts and maintain the data structures that make up the Ethereum state. Nitro compiles in this code as a library, with a few minor modifications to add necessary hooks. -- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decomopressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll dig in to the details of ArbOS below. -- The top layer consists of node software, mostly drawn from Geth. This handles connections are incoming RPC requests from clients and provides the other top-level functionality required to operate an Ethereum-compatible blockchain node. +- The middle layer, which we call ArbOS, is custom software that provides additional functions associated with Layer 2 functionality, such as decomopressing the parsing the Sequencer's data batches, accounting for Layer 1 gas costs and collecting fees to reimburse for them, and supporting cross-chain bridge functionalities such as deposits of Ether and tokens from L1 and withdrawals of the same back to L1. We'll delve into the details of ArbOS below. +- The top layer consists of node software, mostly drawn from Geth. This layer handles connections, incoming RPC requests from clients, and provides the other top-level functionality required to operate an Ethereum-compatible blockchain node. -Because the top and bottom layers rely heavily on code from Geth, this structure has been dubbed a "Geth sandwich." Strictly speaking, Geth plays the role of the bread in the sandwich, and ArbOS is the filling, but this sandwich is named for the bread. +Because the top and bottom layers rely heavily on code from Geth, this structure has been dubbed a "Geth sandwich." Strictly speaking, Geth plays the role of the bread in the sandwich, and ArbOS is the filling, but this sandwich receives its name from the bread. -The State Transition Function consists of the bottom Geth layer, and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox, and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and at the end will emit the header of a new block (in Ethereum's block header format) which will be appended to the Nitro chain. +The State Transition Function consists of the bottom Geth layer and a portion of the middle ArbOS layer. In particular, the STF is a designated function in the source code, and implicitly includes all of the code called by that function. The STF takes as input the bytes of a transaction received in the inbox and has access to a modifiable copy of the Ethereum state tree. Executing the STF may modify the state, and it will ultimately emit the header of a new block (in Ethereum's block header format), which will be appended to the Nitro chain. :::info More information + For a deep dive into the Geth, refer to the [Geth Deep Dive](/how-arbitrum-works/deep-dives/geth.mdx) ::: ## Separating Execution from Proving -One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary exectuion, versus being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, abut compiling it to different targets for the two cases. - -When compiling the Nitro node software for _execution_, the ordinary Go compiler is used, producing native code for the target architecture, which of course will be different for different node deployments. (The node software is distributed in source code form, and as a Docker image containing a compiled binary.) +One of the challenges in designing a practical rollup system is the tension between wanting the system to perform well in ordinary execution and being able to reliably prove the results of execution. Nitro resolves this tension by using the same source code for both execution and proving, but compiling it to different targets for the two cases. -Separately, for _proving_, the portion of the code that is the State Transition Function is compiled by the Go compiled to WebAssembly (WASM), which is a typed, portable machine code format. The WASM code then goes through a simple transaction into a format we call WAVM, which is detailed below. If there is a dispute about the correct result of computing the STF, it is resolved with a reference to the WAVM code. +The Go compiler compiles the Nitro node software for _execution_, producing native code for the target architecture, which, of course, differs for each node deployment. (The node software distribution is in source code form, and as a Docker image containing a compiled binary.) - +Separately, for _proving_, the portion of the code that is the State Transition Function is compiled by the Go compiler to WebAssembly (WASM), a typed and portable machine code format. The WASM code then undergoes a simple transformation into a format we call WAVM, which is described in detail below. If there is a dispute about the correct result of computing the STF, achieving a resolution comes from referencing the WAVM code. ### WAVM -The WASM format has many features that make it a good vehicle for fraud proofs - it is portable, structured, well-specified, and has reasonably good tools and support - but it needs a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. +The WASM format has many features that make it a good vehicle for fraud proofs - it is portable, structured, well-specified, and has reasonably good tools and support - but it requires a few modifications to do the job completely. Nitro uses a slightly modified version of WASM, which we call WAVM. A simple transformation stage turns the WASM code produced by the Go compiler into WAVM code suitable for proving. -WAVM differs from WASM in three main ways. First, WAVM removes some features of WASM that are not generated by the Go compiler; the transformation phase verifies that these features are not present. +WAVM differs from WASM in three main ways. First, WAVM removes certain features of WASM that are not generated by the Go compiler; the transformation phase ensures that these features are not present. -Second, WAVM restricts a few features of WASM. For example, WAVM does not contain floating-point instructions, so the transformer replaces floating-point instructions with calls to the Berekeley SoftFloat library. (We use software floating-point to reduce the risk of floating-point incompatibilities between architectures. The core Nitro functions never use floating-point, but the Go runtime does use some floating-point operations.) WAVM does not contain nested control flow, so the transformer flattens control flow constructs, turning control flow instructions into jumps. Some WASM instructions take a variable amount of time to execute, which we avoid in WAVM by transforming them into constructs using fixed cost instructions. These transformations simplify proving. +Second, WAVM restricts a few features of WASM. For example, WAVM does not contain floating-point instructions, so the transformer replaces floating-point instructions with calls to the Berkeley SoftFloat library. (We use software floating-point to reduce the risk of floating-point incompatibilities between architectures. The core Nitro functions never use floating-point, but the Go runtime does use some floating-point operations.) WAVM does not contain nested control flow, so the transformer flattens control flow constructs by turning control flow instructions into jumps. Some WASM instructions take a variable amount of time to execute, which we avoid in WAVM by transforming them into constructs using fixed cost instructions. These transformations simplify proving. -Third, WAVM adds a few opcodes to enable interaction with the blockchain environment. For example, new instructions allow the WAVM code to read and write the chain's global state, to get the next message from the chain's inbox, or to signal a successful end to executing the State Transition Function. +Third, WAVM introduces a few additional opcodes to facilitate interaction with the blockchain environment. For example, new instructions enable the WAVM code to read and write the chain's global state, retrieve the next message from the chain's inbox, or signal a successful completion of executing the State Transition Function. ### ReadPreImage and the Hash Oracle Trick -The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zer ofi `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions can only be used in a context where the preimage is publicly known, and where the size of the preimage is known to be less than a fixed upper bound of about 110 kbytes. +The most interesting new instruction is `ReadPreImage` which takes as input a hash `H` and a offest `I`, and returns the word of data at offset `I` of the preimage of `H` (and the number of bytes written, which is zer ofi `I` is at or after the end of the preimage). Of course, it is not feasible in general to produce a preimage from an arbitrary hash. For safety, the `ReadPreImage` instructions are only usable in a context where the preimage is publicly known and the size of the preimage is known to be less than a fixed upper bound of approximately 110 kbytes. -(In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest part, assuming that the full history of the L1 Ethereum chain is available. For convenience, a hash preimage can also be supplied by a third party such as a public server, and the correctness of the supplied value is easily verified.) +(In this context, "publicly known" information is information that can be derived or recovered efficiently by any honest party, assuming that the full history of the L1 Ethereum chain is available. For convenience, providing a hash preimage by a third party, such as a public server, and the correctness of the supplied value is easily verified.) -As an example, the state of a Nitro chain is maintained in Ethereum's state tree format, which is organized as a Merkle tree. Nodes of the tree are stored in a database, indexed by the Merkle hash of the node. In Nitro, the state tree is kept outside of the State Transition Function's storage, with the STF only knowing the root hash of the tree. Given the hash of a tree node, the STF can recover the tree node's contents by using `ReadPreImage`, relying on the fact that the full contents of the tree are publicly known and that nodes in the Ethereum state tree will always be smaller than the upper bound on preimage size. In this manner, the STF is able to arbitrarily read and write to the state tree, despite only storing its root hash. +As an example, maintaining the state of a Nitro chain mimics Ethereum's state tree format, which is a Merkle tree. Nodes of the tree are stored in a database, indexed by the Merkle hash of the node. In Nitro, the state tree is kept outside of the State Transition Function's storage, with the STF only knowing the root hash of the tree. Given the hash of a tree node, the STF can recover the tree node's contents by using `ReadPreImage`, relying on the fact that the full contents of the tree are publicly known and that nodes in the Ethereum state tree will always be smaller than the upper bound on preimage size. In this manner, the STF can arbitrarily read and write to the state tree, despite only storing its root hash. -The only other use of `ReadPreImage` is to fetch the contents of recent L2 block headers, given the header hash. This is safe because the block headers are publicly known and have bounded size. +The only other use of `ReadPreImage` is to fetch the contents of recent L2 block headers, given the header hash. This method is safe because the block headers are publicly known and have a bounded size. -This "Hash Oracle Trick" of storing the Merkle hash of a data structure, and relying on protocol participants to store the full structure and thereby support fetch-by-hash of the contents, goes back to the original Arbitrum design. +The "Hash Oracle Trick" of storing the Merkle hash of a data structure and relying on protocol participants to store the full structure, thereby supporting fetch-by-hash of the contents, dates back to the original Arbitrum design. ## Optimistic Rollup Arbitrum is an optimistic rollup. Let's unpack that term. _Rollup_ -Arbitrum is a rollup, which means that the inputs to the chain - the messages that are put into the inbox - are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they would need to determine the current correct state of the chain - they have the full history of the inbox, and the results are uniquely determined by the inbox history, so they can reconstruct the state of the chain based only on public information, if needed. +Arbitrum is a rollup, which means that the inputs to the chain—the messages that go into the inbox—are all recorded on the Ethereum chain as calldata. Because of this, everyone has the information they need to determine the current correct state of the chain. They have the full history of the inbox, and the inbox history uniquely determines the results, allowing them to reconstruct the state of the chain based only on public information, if needed. -This also allows anyone to be a full participant in the Arbitrum protocol, to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. +This posting of calldata enables anyone to be a full participant in the Arbitrum protocol, allowing them to run an Arbitrum node or participate as a validator. Nothing about the history or state of the chain is a secret. _Optimistic_ -Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by letting any party (a "validator") post on Layer 1 a rollup block that that party claims is correct, and then giving everyone else a chance to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will take part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if there's some collusion going on.) +Arbitrum is optimistic, which means that Arbitrum advances the state of its chain by allowing any party (a "validator") to post a rollup block on Layer 1 that the party claims is correct, and then giving everyone else the opportunity to challenge that claim. If the challenge period (roughly a week) passes and nobody has challenged the claimed rollup block, Arbitrum confirms the rollup block as correct. If someone challenges the claim during the challenge period, then Arbitrum uses an efficient dispute resolution protocol (detailed below) to identify which party is lying. The liar will forfeit a deposit, and the truth-teller will receive part of that deposit as a reward for their efforts (some of the deposit is burned, guaranteeing that the liar is punished even if collusion is involved). -Because a party who tries to cheat will lose a deposit, attempts to cheat should be very rare, and the normal case will be a single party posting a correct rollup block, and nobody challenging it. +Because a party that tries to cheat will lose a deposit, attempts to cheat should be very rare. The normal case will be a single party posting a correct rollup block, with nobody challenging it. ### Resolving disputes using interactive fraud proofs -Among optimistic rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a certain result, and Bob disagrees. How will the protocol decide which version to accept? +Among optimistic rollups, the most important design decision is how to resolve disputes. Suppose Alice claims that the chain will produce a particular result, and Bob disagrees. How will the protocol decide which version to accept? -There are basically two choices: interactive proving, or re-executing transactions. Arbitrum uses interactive proving, which we believe is more efficient and more flexible. Much of the design of Arbitrum follows from this fact. +There are basically two options: interactive proving or re-executing transactions. Arbitrum uses interactive proving, which we believe is more efficient and more flexible. Much of Arbitrum's design follows from this fact. ### Interactive proving -The idea of interactive proving is that Alice and Bob will engage in a back-and-forth protocol, refereed by an L1 contract, to resolve their dispute with minimal work required from any L1 contract. +The idea of interactive proving is that Alice and Bob will engage in a back-and-forth protocol, mediated by an L1 contract, to resolve their dispute with minimal work required from any L1 contract. -Arbitrum's approach is based on dissection of the dispute. If Alice's cliam covers `N` steps of execution, she posts two claims of size `N/2` which combine to yield her initial `N-step` claim, then Bob picks one of Alice's `N/2-step` claims to challenge. Now the size of the dispute has been cut in half. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute is narrowed down to a single step that the L1 referee needs to resolve the dispute by looking at what the instruction actually does and whether Alice's claim about it is correct. +Arbitrum's approach involves dissecting the dispute. If Alice's claim covers `N` steps of execution, she posts two claims of size `N/2`, which combine to yield her initial `N-step` claim. Then, Bob picks one of Alice's `N/2-step` claims to challenge. Now the size of the dispute has been halved. This process continues, cutting the dispute in half at each stage, until they are disagreeing about a single step of execution. Note that so far, the L1 referee hasn't had to think about execution "on the merits." It is only once the dispute narrows to a single step that the L1 mediator (referee) needs to resolve the dispute by looking at what the instruction does and whether Alice's claim about it is correct. -The key principle behind interactive proving is that if Alice and Bob are in a dispute, Alice and Bob should do as much off-chain work as possible needed to resolve their dispute, rather than putting that work onto an L1 contract. +The key principle behind interactive proving is that if Alice and Bob are in a dispute, they should perform as much off-chain work as possible to resolve it, rather than delegating that work to a Layer 1 (L1) contract. ### Re-executing transactions -The alternative to interactive proving would be to have a rollup block contain a claimed machine stat ehash after every individual transaction. Then in case of a dispute, the L1 referee would emulate the execution of an entire transaction, to see whether the outcome matches Alice's claim. +The alternative to interactive proving would be to have a rollup block contain a claimed machine state hash after every individual transaction. In the event of a dispute, the L1 referee would emulate the execution of an entire transaction to determine whether the outcome matches Alice's claim. ### Why interactive proving is better -We belive strongly that interactive proving is the superior approach, for the following reasons. +We strongly believe that interactive proving is the superior approach for the following reasons. -- **More efficient in the optimistic case**: Because interactive proving can resolve disputes that are larger than one transaction, it can allow a rollup block to contain only a single claim about the end state of the chain after all of the execution covered by the block. By contrast, re-execution requires posting a state claim for each transaction within the rollup block. With hundreds or thousands of transactions per rollup block, this is a substantial difference in L1 footprint - and L1 footprint is the main component of cost. -- **More efficient in the pessimistic case**: In case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that ALice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims - Bob does that, off-chain.) Only one instructions needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. -- **Higher per-transaction gas limit**: Interactive proving can escape from Ethereum's tight per-transaction gas limit. The gas limit isn't infinite, for obvious reasons, but it can be larger than on Ethereum. As far as Ethereum is concerned, the only downside of a gas-heavy Arbitrum transaction is that it may require an interactive fraud proof with slightly more steps (and only if indeed it is fraudulent). By contrast, re-execution of the transaction (which is more expensive than executing it directly) within a single Ethereum transaction. -- **More implementation flexibility**: Interactive proving allows more flexibility in implementation. All that is necessary is the ability to verify a one-step proof on Ethereum. By contrast, re-execution approaches are tethered to limitations of the EVM. +- **More efficient in the optimistic case**: Because interactive proving can resolve disputes that are larger than one transaction, it can allow a rollup block to contain only a single claim about the end state of the chain after all of the execution covered by the block. By contrast, re-execution requires posting a state claim for each transaction within the rollup block. With hundreds or thousands of transactions per rollup block, this represents a substantial difference in L1 footprint, which is the main component of the cost. +- **More efficient in the pessimistic case**: In the case of a dispute, interactive proving requires the L1 referee contract only to check that Alice and Bob's actions "have the right shape," for example, that Alice has divided her `N-step` claim into two claims half as large. (The referee doesn't need to evaluate the correctness of Alice's claims - Bob does that, off-chain.) Only one instruction needs to be re-executed. By contrast, re-execution requires the L1 referee to emulate the execution of an entire transaction. +- **Higher per-transaction gas limit**: Interactive proving can escape from Ethereum's tight per-transaction gas limit. The gas limit isn't infinite, for obvious reasons, but it can be larger than on Ethereum. As far as Ethereum is concerned, the only downside of a gas-heavy Arbitrum transaction is that it may require an interactive fraud proof with slightly more steps (and only if the transaction is indeed fraudulent). By contrast, re-execution of the transaction (which is more expensive than executing it directly) is within a single Ethereum transaction. +- **More implementation flexibility**: Interactive proving allows more flexibility in implementation. All that is necessary is the ability to verify a one-step proof on Ethereum. By contrast, re-execution approaches have limitations based on the EVM. ### Interactive proving drives the design of Arbitrum -Much of the design of Arbitrum is driven by the opportunities opened up by interactive proving. If you're reading about some feature of Arbitrum, and you're wondering why it exists, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why questions" about Arbitrum relate to interactive proving. - - +Much of Arbitrum's design is driven by the opportunities opened up by interactive proving. Suppose you're reading about a feature of Arbitrum and wondering why it exists. In that case, two good questions to ask are: "How does this support interactive proving?" and "How does this take advantage of interactive proving?" The answers to most "why questions" about Arbitrum relate to interactive proving. ## Arbitrum Rollup Protocol Before diving into the rollup protocol, there are two things we need to cover. -First, _if you're an Arbitrum user or developer, you don't need to understand the rollup protocol_. You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working, but you don't spend your time monitoring it or studying its internals. +First, _if you're an Arbitrum user or developer, you don't need to understand the rollup protocol_. You don't ever need to think about it, unless you want to. Your relationship with it can be like a train passenger's relationship with the train's engine: you know it exists, you rely on it to keep working. Still, you don't spend your time monitoring it or studying its inner workings. -You're welcome to study, observe, and even participate in the rollup protocol, but you don't need to, and most people won't. So if you're a typical train passenger who just wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! +You're welcome to study, observe, and even participate in the rollup protocol, but it's not required, and most people won't. So if you're a typical train passenger who wants to read or talk to your neighbor, you can skip right to the [next section](#validators) of this document. If not, read on! -The second thing to understand about the rollup protocol is that _the protocol doesn't decide the results of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is done. The role of the rollup protocol is to confirm transaction results that, as far as Arbitrum users are concerned, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) +The second thing to understand about the rollup protocol is that _the protocol doesn't decide the results of transactions, it only confirms the results_. The results are uniquely determined by the sequence of messages in the chain's inbox. So once your transaction message is in the chain's inbox, its result is knowable - and Arbitrum nodes will report that your transaction is complete. The role of the rollup protocol is to confirm transaction results that, from the perspective of Arbitrum users, have already occurred. (This is why Arbitrum users can effectively ignore the rollup protocol.) -You might wonder why we need the rollup protocol. If everyone knows the results of transactions already, why bother confirming them? The rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The whole point of a Layer 2 scaling system is to run transactions without Ethereum needing to do all of the work - and indeed Arbitrum can go fast enough that Ethereum couldn't hope to monitor every Arbitrum transaction. But once a result is confirmed, Ethereum knows about it and can rely on it, enabling operations on Ethereum such as processing withdrawals of funds from Nitro back to L1. +You might wonder why we need the rollup protocol. If everyone already knows the results of transactions, why bother confirming them? The rollup protocol exists for two reasons. First, somebody might lie about a result, and we need a definitive, trustless way to tell who is lying. Second, Ethereum doesn't know the results. The primary purpose of a Layer 2 scaling system is to process transactions without requiring Ethereum to handle all the work. Indeed, Arbitrum can execute transactions at a speed that Ethereum cannot match, while monitoring every transaction on Arbitrum. However, once a result is confirmed, Ethereum is aware of it and can rely on it, enabling operations on Ethereum, such as processing withdrawals of funds from Nitro back to L1. With those preliminaries behind us, let's jump into the details of the rollup protocol. -The parties who participate in the protocol are called _validators_. Some validators will choose to be bonders - they will place an `ETH` deposit which they'll be able to recover if they're not caught cheating. In the common case, it's expected that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any on-chain actions, can be run permissionlessly (see "validators" below). +Some parties that participate in the protocol are _validators_. Some validators will choose to be bonders; they will place an `ETH` deposit, which they can recover if they're not cheating. In the common case, the expectation is that only one validator will be bonded, since as long as it's bonded on the current outcome, and there are no conflicting claims, there's no need for other parties to bond/take any action. The protocol allows for these roles to be permissionless in principle; currently on Arbitrum One, validators/bonders are allowlisted (see "State of Progressive Decentralization"). "Watchtower validators," who monitor the chain but don't take any on-chain actions, can be run permissionlessly (see "validators" below). -The key security property of the rollup protocol is that any one honest validator can force the correct execution of the chain to be confirmed. This means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire) can force your transactions to be processed correctly. And that is true no matter how many malicious people are trying to stop you. +The key security property of the rollup protocol is that any one honest validator can ensure the correct execution of the chain is confirmed. This security means that execution of an Arbitrum chain is as trustless as Ethereum. You, and you alone (or someone you hire), can ensure that your transactions are processed correctly. And that is true no matter how many malicious people are trying to stop you. ## The Rollup Chain -The rollup protocol tracks a chain of rollup blocks - we'll call these "assertions" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. +The rollup protocol tracks a chain of rollup blocks, which we'll refer to as "assertions" for clarity. "They're not the same as Layer 1 Ethereum blocks, and also not the same as Layer 2 Nitro blocks. You can think of assertions as forming a separate chain, which the Arbitrum rollup protocol manages and oversees. -Validators can propose assertions. New assertions will be _unresolved_ at first. Eventually every assertion will be _resolved_, by being either _confirmed_ or _rejected_. The confirmed assertions make up the confirmed history of the chain. +Validators can propose assertions. New assertions will be _unresolved_ at first. Eventually, every assertion will be _resolved_, either by being _confirmed_ or _rejected_. The confirmed assertions make up the confirmed history of the chain. Each assertion contains: - the assertion number - the predecessor assertion number: assertion number of the last assertion before this one that is (claimed to be) correct - the number of L2 blocks that have been created in the chain's history -- the number of inbox messages have been consumed in the chain's history +- the number of inbox messages that have been consumed in the chain's history - a hash of the outputs produced over the chain's history -Except for the assertion number, the contents of the assertion are all just claims by the assertion's proposer. Arbitrum doesn't know at first whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the assertion. If one or more of these fields are incorrect, the protocol should eventually reject the assertion. +Except for the assertion number, the contents of the assertion consist solely of claims made by the assertion's proposer. Arbitrum doesn't initially know whether any of these fields are correct. If all of these fields are correct, the protocol should eventually confirm the assertion. If one or more of these fields are incorrect, the protocol should eventually reject the assertion. -An assertion is implicitly claiming that its predecessor assertion is correct. This implies, transitively, that an assertion implicitly claims the correctness of a complete history of the chain: a sequence of ancestor assertion that reaches all the way back to the birth of the chain. +An assertion implicitly claims that its predecessor assertion is correct. This claim implies, transitively, that an assertion implicitly claims the correctness of a complete history of the chain: a sequence of ancestor assertions that reaches back to the birth of the chain. -An assertion is also implicitly claiming that its older siblings (older assertions with the same predecessor), if there are any, are incorrect. If two assertions are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. +An assertion also implicitly claims that its older siblings (older assertions with the same predecessor, if any) are incorrect. If two assertions are siblings, and the older sibling is correct, then the younger sibling is considered incorrect, even if everything else in the younger sibling is true. The assertion is assigned a deadline, which says how long other validators have to respond to it. If you're a validator, and you agree that an assertion is correct, you don't need to do anything. If you disagree with an assertion, you can post another assertion with a different result, and you'll probably end up in a challenge against the first assertion's bonder. (More on challenges below.) @@ -261,84 +250,72 @@ In the normal case, the rollup chain will look like this: -On the left, representing an earlier part of the chain's history, we have confirmed assertions. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed assertions, assertion 94, is called the "latest confirmed assertion." On the right, we see a set of newer proposed assertions. The protocol can't yet confirm or reject them, because their deadlines haven't run out yet. The oldest assertion whose fate has yet to be determined assertion 95, is called the "first unresolved assertion." +On the left, representing an earlier part of the chain's history, we have confirmed assertions. These have been fully accepted and recorded by the Layer 1 contracts that manage the chain. The newest of the confirmed assertions, assertion 94, is referred to as the "latest confirmed assertion." On the right, we see a set of newer proposed assertions. The protocol can't yet confirm or reject them, because their deadlines have not yet expired. The oldest assertion whose fate remains to be determined, assertion 95, is referred to as the "first unresolved assertion." -Notice that a proposed assertion can build on an earlier proposed assertion. This allows validators to continue proposing assertions without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed assertions will be valid, so they will all eventually be accepted. +Notice that a proposed assertion can build on an earlier proposed assertion. This "building" allows validators to continue proposing assertions without needing to wait for the protocol to confirm the previous one. Normally, all of the proposed assertions will be valid, so they will all eventually be accepted. -Here's another example of what the chain state might look like, if several validators are being malicious. It's a contrived example, designed to illustrate a variety of cases that can come up in the protocol, all smashed into a single scenario. +Here's another example of what the chain state might look like if several validators are being malicious. It's a contrived example, designed to illustrate various cases that can arise in the protocol, all condensed into a single scenario. -There's a lot going on here, so let's unpack it. +A lot is going on here, so let's unpack it. -- assertion 100 has been confirmed -- assertion 101 claimed to be a correct successor to assertion 100, but 101 was rejected (hence the X drawn in it) -- assertion 102 was eventually confirmed as the correct successor to 100 -- assertion 103 was confirmed and is now the latest confirmed assertion -- assertion 104 was proposed as a successor to assertion 103, and 105 was proposed as a successor to 104. 104 was rejected as incorrect, and as a consequence 105 was rejected because its predecessor was rejected -- assertion 106 is unresolved. It claims to be a correct successor to assertion 103 but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved assertion -- assertions 107 and 108 claim to chain from 106. They are also unresolved. If 106 is rejected, they will be automatically rejected too -- assertion 109 disagrees with assertion 106, because they both claim the same predecessor. At least one of them will eventually be rejected, but the protocol hasn't yet resolved them. -- assertion 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will be automatically rejected too. -- assertion 111 claims to follow 104. 111 will inevitably be rejected because its predecessor has already been rejected. But it hasn't been rejected yet, because the protocol resolves assertions in assertion number order, so the protocol will have to resolve 106 through 110, in order, before it can resolve 111. After 110 has been resolved, 111 can be rejected immediately. +- Assertion 100 has been confirmed +- Assertion 101 claimed to be a correct successor to assertion 100, but 101 was rejected (hence the X drawn in it) +- Assertion 102 was eventually confirmed as the correct successor to 100 +- Assertion 103 received confirmation and is now the latest confirmed assertion +- Assertion 104 is the proposed successor to assertion 103, and 105 is the proposed successor to 104. 104 was rejected as incorrect, and as a consequence, 105 was rejected because its predecessor was rejected +- Assertion 106 is unresolved. It claims to be a correct successor to assertion 103, but the protocol hasn't yet decided whether to confirm or reject it. It is the first unresolved assertion +- Assertions 107 and 108 claim to chain from 106. They are also unresolved. If 106 rejects, 107 and 108 will automatically reject too +- Assertion 109 disagrees with assertion 106, because they both claim the same predecessor. Eventually, 109 or 106 will be rejected, but the protocol hasn't yet resolved them. +- Assertion 110 claims to follow 109. It is unresolved. If 109 is rejected, 110 will also be rejected automatically. +- Assertion 111 claims to follow 104. 111 will be rejected because its predecessor has already been denied. However, it hasn't been rejected yet, because the protocol resolves assertions in assertion number order. Therefore, the protocol must resolve assertions 106 through 110 in order before it can resolve assertion 111. After 110 has resolved, 111 can be rejected immediately. -Again: this sort of thing is very unlikely in practice. In this diagram, at least four parties must have bonded on wrong assertions, adn when the dust settles at least four parties will have lost their bonds. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram is designed to illustrate the variety of situations that are possible in principle, and how the protocol would deal with them. +Again, this is very unlikely in practice. In this diagram, at least four parties must have bonded on wrong assertions, and when the dust settles, at least four parties will have lost their bonds. The protocol handles these cases correctly, of course, but they're rare corner cases. This diagram aims to illustrate the variety of situations that are possible in principle and how the protocol would address them. ### Bonding -At any given time, some validators will be bonders, and some will not. Bonders deposit funds that are held by the Arbitrum Layer 1 contracts and will be confiscated if the bonder loses a challenge. Nitro chains accept bonds in `ETH`. +At any given time, some validators will be bonders, and some will not. Bonders deposit funds that are held by the Arbitrum Layer 1 contracts, and if the bonder loses a challenge, the contract will confiscate the funds. Nitro chains accept bonds in `ETH`. -A single bond can cover a chain of assertions. Every bonder is bonded on the lastest confirmed assertion; and if you're bonded on an assertion, you can also bond on one successor of that assertion. So you might be bonded on a sequence of assertions that represent a single coherent claim about the correct history of the chain. A single bond suffices to commit you to that sequence of assertions. +A single bond can cover a chain of assertions. Every bonder places a bond on the latest confirmed assertion, and if you bond on an assertion, you can also bond on one successor of that assertion. You might bond to a sequence of assertions that represent a single, coherent claim about the correct history of the chain. A single bond suffices to commit you to that sequence of assertions. -In order to create a new assertion, you must be a bonder, and you must already be bonded on the predecessor of the new assertion you're creating. The bond requirement for assertion creation ensures that anyone who creates a new assertion has something to lose if that assertion is eventually rejected. +To create a new assertion, you must be a bonder, and you must already have a bond on the predecessor of the new assertion you're creating. The bond requirement for assertion creation ensures that anyone who makes a new assertion has something to lose if that assertion becomes rejected. -The protocol keeps track of the current required bond amount. Normally this will equal the base bond amount, which is a parameter of the Nitro chain. But if the chain has been slow to make progress lately, the required bond will increase, as described in more detail below. +The protocol tracks the current required bond amount. Normally, this will equal the base bond amount, which is a parameter of the Nitro chain. But if the chain has been slow to make progress lately, the required bond will increase, as described in more detail below. The rules for bonding are as follows: -- If you're not bonded, you can bond on the latest confirmed assertion. When doing this, you deposit the current minimum bond amount. -- If you're bonded on an assertion, you can also add your bond to any one successor of that assertion. (The protocol tracks the maximum assertion number you're bonded on, and let's you add your bond to any successor of that assertion, updating your maximum to that successor.) This doesn't require you to place a new bond. - - A special case of adding your bond to a successor assertion is when you create a new assertion as a successor to an assertion you're already bonded on. -- If you're bonded only on the latest confirmed assertion (and possibly earlier assertions), you or anyone else can ask to have your bond refunded. Your bonded funds will be returned to you, and you will no longer be a bonder. -- If you lose a challenge, your bond is removed from all assertions and you forfeit your bonded funds. +- If you have no active bond, you can bond on the latest confirmed assertion. When doing this, you deposit the current minimum bond amount. +- If you have a bond on an assertion, you can also add your bond to any one successor of that assertion. (The protocol tracks the assertion number that you have a bond with, and lets you add your bond to any successor of that assertion, updating your maximum to that successor.) This new assertion doesn't require you to place a new bond. + - A special case of adding your bond to a successor assertion is when you create a new assertion as a successor to an assertion for which you already have a bond. +- If you're bonded only on the latest confirmed assertion (and possibly earlier assertions), you or anyone else can ask to have your bond refunded. Your bonded funds will be returned to you, and you will no longer be a bonded individual. +- If you lose a challenge, your bond is removed from all assertions, and you forfeit your bonded funds. -Notice that once you are bonded on an assertion, there is no way to unbond. You are committed to that assertion. Eventually one of two things will happen: that assertion will be confirmed, or you will lose your bond. The only way to get your bond back is to wait until all of the assertions you are bonded on are confirmed. +Notice that once you have a bond on an assertion, there is no way to unbond. You are committed to that assertion. Eventually, one of two things will happen: that assertion will be confirmed, or you will lose your bond. The only way to get your bond back is to wait until all of the assertions to which you have a bond are confirmed. #### Setting the current minimum bond amount -One detail we deferred earlier is how the current minimum bond amount is set. Normally, this is just equal to the base bond amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming assertions, the bond requirement will escalate temporarily. Specifically, the base bond amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved assertion passed. This ensures that if malicious parties are placing false bonds to try to delay progress (despite the fact that they're losing those bond), the bond requirement goes up so that the cost of such a delay attack increases exponentially. As assertion resolution starts advancing again, the bond requirement will go back down. +One detail we deferred earlier is determining the current minimum bond amount. Typically, this is just equal to the base bond amount, which is a parameter of the Nitro chain. However, if the chain has been slow to make progress in confirming assertions, the bond requirement will escalate temporarily. Specifically, the base bond amount is multiplied by a factor that is exponential in the time since the deadline of the first unresolved assertion passed. This bond amount ensures that if malicious parties place false bonds to try to delay progress (despite losing those bonds), the bond requirement increases. Consequently, the cost of such a delay attack increases exponentially. As assertion resolution starts advancing again, the bond requirement will decrease. ### Rules for Confirming or Rejecting assertions The rules for resolving assertions are fairly simple. The first unresolved assertion can be confirmed if: -- the assertion's predecessor is the latest confrimed assertion, and +- the assertion's predecessor is the latest confirmed assertion, and - the assertion's deadline has passed, and - there is at least one bonder, and - all bonders are bonded on the assertion -The first unresolved assertion can be rejected if: - -- the assertion's predecessor has been rejected, or -- all the following are true: - - the assertion's deadline has passed, and - - there is at least one bonder, and - - no bonder is bonded on the assertion - -A consequence of these rules is that once the first unresolved assertion's deadline has passed (and assuming there is at least one bonder bonded on something other than the latest confirmed assertion), the only way the assertion can be unresolvable is if at least one bonder is bonded on it and at least one bonder is bonded on a different assertion with the same predecessor. If this happens, the two bonders are disagreeing about which assertion is correct. It's time for a challenge, to resolve the disagreement. - - +A consequence of these rules is that once the first unresolved assertion's deadline has passed (and assuming there is at least one bonder bonded on something other than the latest confirmed assertion), the only way the assertion can be unresolvable is if at least one bonder is bonded on it and at least one bonder is bonded on a different assertion with the same predecessor. If this happens, the two bonders disagree about which assertion is correct. It's time for a challenge, to resolve the disagreement. ### Challenges @@ -346,21 +323,21 @@ Suppose the rollup chain looks like this: -assertions 93 and 95 are siblings (they both have 92 as predecessor). Alice is bonded on 93 and Bob is bonded on 95. +Assertions 93 and 95 are siblings (they both have 92 as a predecessor). Alice has a bond on 93, and Bob has a bond on 95. -At this point we know that Alice and Bob disagree about the correctness of assertion 93, with Alice committed to 93 being correct and Bob committed to 93 being incorrect. (Bob is bonded on 95, and 95 implicitly claims that 92 is the last correct assertion before it, which implies that 93 must be incorrect.) +At this point, we know that Alice and Bob disagree about the correctness of assertion 93, with Alice committed to 93 being correct and Bob committed to 93 being incorrect. (Bob has a bond on 95, and 95 implicitly claims that 92 is the last correct assertion before it, which implies that 93 must be incorrect.) -Whenever two bonders are bonded on sibling assertions, and neither of those bonders is already in a challenge, anyone can start a challenge between the two. The rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's bond. The loser will be removed as a bonder. +Whenever two bonders have bonds on sibling assertions, and neither of those bonders is already in a challenge, anyone can start a challenge between the two. The rollup protocol will record the challenge and referee it, eventually declaring a winner and confiscating the loser's bond. The loser will also no longer be bound to their assertion. The challenge is a game in which Alice and Bob alternate moves, with an Ethereum contract as the referee. Alice, the defender, moves first. The game will operate in two phases: dissection, followed by a one-step proof. Dissection will narrow down the size of the dispute until it is a dispute about just one instruction of execution. Then the one-step proof will determine who is right about that one instruction. -We'll describe the dissection part of the protocol twice. First, we'll give a simplified version which is easier to understand but less efficient. Then we'll describe how the real version differs from the simplified one. +We'll describe the dissection part of the protocol twice. First, we'll give a simplified version that is easier to understand but less efficient. We will then explain how the real version differs from the simplified one. :::info More information -For further reading on Assertions and how to create them refer to the [Assertion Deep-dive](/how-arbitrum-works/deep-dives/assertions.mdx). +For further reading on Assertions and how to create them, refer to the [Assertion Deep-dive](/how-arbitrum-works/deep-dives/assertions.mdx). ::: @@ -368,247 +345,239 @@ For further reading on Assertions and how to create them refer to the [Assertion Alice is defending the claim that starting with the state in the predecessor assertion, the state of the Virtual Machine can advance to the state specified in assertion A. Essentially she is claiming that the Virtual Machine can execute `N` instructions, and that that execution will consume `M` inbox messages and transform the hash of outputs from `H` to `H`. -Alice's first move requires her to dissect her claims about intermediate states between the beginning (0 instructions executed) and the end (`N` instructions executed). So we require Alice to divide her claim in half, and post the state at the half-way point, after `N/2` instructions have been executed. +Alice's first move requires her to dissect her claims about intermediate states between the beginning (0 instructions executed) and the end (`N` instructions executed). Therefore, we require Alice to divide her claim in half and post the state at the halfway point, after executing `N/2` instructions. Now Alice has effectively bisected her `N-step` assertion into two (`N/2`)-step assertions. Bob has to point to one of those two half-size assertions and claim it is wrong. -At this point we're effectively back in the original situation: Alice having made an assertion that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must make a one-step proof which will be checked by the EthBridge. +At this point, we're effectively back in the original situation: Alice having asserted that Bob disagrees with. But we have cut the size of the assertion in half, from `N` to `N/2`. We can apply the same method again, with Alice bisecting and Bob choosing one of the halves, to reduce the size to `N/4`. And we can continue bisecting, so that after a logarithmic number of rounds, Alice and Bob will be disagreeing about a single step of execution. That's where the dissection phase of the protocol ends, and Alice must provide a one-step proof, which the EthBridge will verify. ### Why Dissection Correctly Identifies a Cheater -Before talking about the complexities of the real challenge protocol, let's stop to understand why the simplified version of the protocol is correct. Here correctness means two things: (1) if Alice's initial claim is correct, Alice can always win the challenge, and (2) if Alice's initial claim is incorrect, Bob can always win the challenge. +Before discussing the complexities of the real challenge protocol, let's pause to understand why the simplified version of the protocol is correct. Here, correctness means two things: (1) if Alice's initial claim is correct, Alice can always win the challenge, and (2) if Alice's initial claim is incorrect, Bob can always win the challenge. -To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending a correct claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove, so that claim will be provable and Alice can win the challenge. +To prove (1), observe that if Alice's initial claim is correct, she can offer a truthful midpoint claim, and both of the implied half-size claims will be correct. So whichever half Bob objects to, Alice will again be in the position of defending an accurate claim. At each stage of the protocol, Alice will be defending a correct claim. At the end, Alice will have a correct one-step claim to prove so that that claim will be provable and Alice can win the challenge. -To prove (2), observe that if Alice's initial claim is incorrect, this can only be because her claimed endpoint after `N` steps is incorrect. Now when Alice offers her midpoint state claim, that midpoint claim is either correct or incorrect. If it's incorrect, then Bob can challenge Alice's first-half claim, which will be incorrect. If Alice's midpoint state claim is correct, then her second-half claim must be incorrect, so Bob can challenge that. So whatever Alice does, Bob will be able to challenge an incorrect half-size claim. At each stage of the protocol, Bob can identify an incorrect claim to challenge. At the end, Alice will have an incorrect one-step claim to prove, which she will be unable to do, so Bob can win the challenge. +To prove (2), observe that if Alice's initial claim is incorrect, this can only be because her claimed endpoint after `N` steps is incorrect, then when Alice offers her midpoint state claim, that midpoint claim is either correct or incorrect. If it's incorrect, then Bob can challenge Alice's first-half claim, which will be incorrect. If Alice's midpoint state claim is correct, then her second-half claim must be incorrect so that Bob can challenge that. So whatever Alice does, Bob will be able to challenge an incorrect half-size claim. At each stage of the protocol, Bob can identify an incorrect claim to challenge. Ultimately, Alice will have an incorrect one-step claim to prove, which she will be unable to do, allowing Bob to win the challenge. (If you're a stickler for mathematical precision, it should be clear how these arguments can be turned into proofs by induction on `N`.) ### The Real Dissection Protocol -The real dissection protocol is conceptually similar to the simplified one described above, but with several changes that improve efficiency or deal with necessary corner cases. Here is a list of the differences. +The real dissection protocol is conceptually similar to the simplified one described above, but with several modifications that enhance efficiency or address necessary corner cases. Here is a list of the differences. -- **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an assertion, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute transforms into a dispute about a single execution of the State Transition Function or in other words about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). -- **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This requires posting `K-1` intermediate claims, at points evenly spaced through the claimed execution. This reduces the number of rounds by a factor of log(`K`)/log(`2`). -- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in a challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This reduces the number of moves in the game by an additional factor of 2, because the size is cut by a factor of `K` for every move, rather than for every two moves. -- **Deal With The Empty-Inbox Case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might half, or it might have to wait because its inbox is exhausted so it can't go on until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (but not the initial claim) to claim a special end state that means essentially that the specified amount of execution is not possible under the current conditions. -- **Time Limits**: Each player is given a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Think of the time allowance as being about a week. +- **Dissection over L2 blocks, then over instructions**: Alice's assertion is over an assertion, which asserts the results of creating some number of Layer 2 Nitro blocks. Dissection first occurs over these Layer 2 blocks, to narrow the dispute down to a dispute about a single Layer 2 Nitro block. At this point, the dispute shifts to a dispute about a single execution of the State Transition Function, or in other words, about the execution of a sequence of WAVM instructions. The protocol then executes the recursive dissection sub-protocol again, this time over WAVM instructions, to narrow the dispute to a single instruction. The dispute concludes with a one-step proof of a single instruction (or a party failing to act and losing by timeout). +- **K-way dissection**: Rather than dividing a claim into two segments of size `N/2`, we divide it into `K` segments of size `N/K`. This division requires posting `K-1` intermediate claims at points evenly spaced through the claimed execution, which reduces the number of rounds by a factor of log(`K`)/log(`2`). +- **Answer a dissection with a dissection**: Rather than having each round of the protocol require two moves, where Alice dissects and Bob chooses a segment to challenge, we instead require Bob, in challenging a segment, to post his own claimed endpoint state for that segment. Alice will then respond by identifying a subsegment, posting an alternative endpoint for that segment, and dissecting it. This segmentation reduces the number of moves in the game by an additional factor of 2, because the size is cut by a factor of `K` for every move, rather than for every two moves. +- **Deal With The Empty-Inbox Case**: The real AVM can't always execute `N` units of gas without getting stuck. The machine might halt, or it might have to wait because its inbox is exhausted, so it cannot proceed until more messages arrive. So Bob must be allowed to respond to Alice's claim of `N` units of execution by claiming that `N` steps are not possible. The real protocol thus allows any response (except the initial claim) to claim a special end state, which means that the specified amount of execution is not possible under the current conditions. +- **Time Limits**: Each player has a time allowance. The total time a player uses for all of their moves must be less than the time allowance, or they lose the game. Consider the time allowance to be approximately one week. -It should be clear that these changes don't affect the basic correctness of the challenge protocol. They do, however, improve its efficiency and enable it to handle all of the cases that can come up in practice. +These changes don't affect the basic correctness of the challenge protocol. They do, however, improve its efficiency and enable it to handle all the cases that can arise in practice. ### Efficiency -The challenge protocol is designed so that the dispute can be resolved with a minimum of work required by the protocol (via its Layer 1 Ethereum contracts) in its role as referee. When it is Alice's move, the protocol only needs to keep track of the time Alice uses, and ensure that her move does include `K-1` intermediate points as required. The protocol doesn't need to pay attention to whether those claims are correct in any way; it only needs to know whether Alice's move "has the right shape." +The challenge protocol design is to resolve disputes with a minimal amount of work required by the protocol (via its Layer 1 Ethereum contracts) in its role as referee. When it is Alice's turn, the protocol only needs to keep track of the time Alice uses and ensure that her move includes `K-1` intermediate points as required. The protocol doesn't need to pay attention to whether those claims are correct in any way; it only needs to know whether Alice's move "has the right shape." -The only point where the protocol needs to evaluate a move "on the merits" is at the one-step proof, where it needs to look at Alice's proof and determine whether the proof that was provided does indeed establish that the virtual machine moves from the before state to the claimed after state after one step of computation. - - +The only point where the protocol needs to evaluate a move "on the merits" is at the one-step proof, where it must examine Alice's proof to determine whether it establishes that the virtual machine transitions from the before state to the claimed after state after one step of computation. ## Validators -Some Arbitrum nodes will choose to act as _validators_. This means that they watch the progress of the rollup protocol and participate in that protocol to advance the state of the chain securely. +Some Arbitrum nodes will choose to act as _validators_, meaning they monitor the progress of the rollup protocol and participate in it to advance the state of the chain securely. -Not all nodes will choose to do this. Because the rollup protocol doesn't decide what the chain will do but merely confirms the correct behavior that is fully determined by the inbox messages, a node can ignore the rollup protocol and simply compute for itself the correct behavior. For more on what such nodes might do, see the Full Nodes section. +Not all nodes will choose to do this. Because the rollup protocol doesn't dictate what the chain will do but merely confirms the correct behavior, determined by the inbox messages, a node can ignore the rollup protocol and compute the correct behavior itself. For more on what such nodes might do, see the Full Nodes section. Offchain Labs provides open source validator software, including a pre-built Docker image. -Every validator can choose their own approach, but we expect validators to follow three common strategies: +Every validator can choose which strategy to employ, but we expect validators to follow three common strategies: -- The _active validator_ strategy tries to advance the state of the chain by proposing new assertions. An active validator is always bonded, because creating an assertion requires being bonded. A chain really only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. -- The _defensive validator_ strategy watches the rollup protocol operate. If only correct assertions are proposed, this strategy doesn't bond. But if an incorrect assertion is proposed, this strategy intervenes by posting a correct assertion or bonding on a correct assertion that another party has posted. This strategy avoids bonding when things are going well, but if someone is dishonest it bonds in order to defend the correct outcome. -- The _watchtower validator_ strategy never bonds. It simply watches the rollup protocol and if an incorrect assertion is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to bond will be willing to intervene in order to take some of the dishonest proposer's bond, and that that can happen before the dishonest assertion's deadline expires. (In practice this will allow several days for a response.) +- The _active validator_ strategy tries to advance the state of the chain by proposing new assertions. An active validator is always bonded, because creating an assertion requires being bonded. A chain only needs one honest active validator; any more is an inefficient use of resources. For the Arbitrum One chain, Offchain Labs runs an active validator. +- The _defensive validator_ strategy watches the rollup protocol operate. If only correct assertions get proposed, this strategy doesn't bond. However, if an incorrect assertion is proposed, this strategy intervenes by posting a correct assertion or bonding to a correct assertion that another party has already posted. This strategy avoids bonding when things are going well, but if someone is dishonest, it bonds to defend the correct outcome. +- The _watchtower validator_ strategy never bonds. It simply monitors the rollup protocol and, if an incorrect assertion is proposed, it raises the alarm (by whatever means it chooses) so that others can intervene. This strategy assumes that other parties who are willing to bond will be willing to intervene to take some of the dishonest proposer's bond, and that that can happen before the dishonest assertion's deadline expires. (In practice, this will allow several days for a response.) -Under normal conditions, validators using the defensive and watchtower strategies won't do anything except observe. A malicious actor who is considering whether to try cheating won't be able to tell how many defensive and watchtower validators are operating incognito. Perhaps some defensive validators will announce themselves, but others probably won't, so a would-be attacker will always have to worry that defenders are waiting to emerge. +Under normal conditions, validators using the defensive and watchtower strategies won't do anything except observe. A malicious actor considering whether to cheat won't be able to determine how many defensive and watchtower validators are operating incognito. Some defensive validators may announce themselves, but others won't, so a would-be attacker will always have to worry that defenders are waiting to emerge. -The underlying protocol supports permissionless validation, i.e., anyone can do it. Currently on Arbitrum One, validators that require bond (i.e., active and defensive validators) are whitelisted; see State of Progressive Decentralization. +The underlying protocol supports permissionless validation, meaning that anyone can participate. Currently, on Arbitrum One, validators that require a bond (i.e., active and defensive validators) are allowlisted; see the State of Progressive Decentralization. -Who will be validators? Anyone will be able to do it, but most people will choose not to. In practice we expect people to validate a chain for several reasons. +Who will be validators? Anyone can do it, but most people will choose not to. In practice, we expect people to validate a chain for several reasons. -- Validators could be paid for their work, by the party that created the chain or someone else. A chain could be configured such that a portion of the funds from user transaction fees are paid directly to validators. -- Parties who have significant assets at bond on a chain, such as dApp developers, exchanges, power-users, and liquidity providers, may choose to validate in order to protect their investment. -- Anyone who chooses to validate can do so. Some users will probably choose to validate in order to protect their own interests or just to be good citizens. But ordinary users don't need to validate, and we expect that the vast majority of users won't. +- Validators could be paid for their work by the party that created the chain or someone else. A chain is configurable, allowing a portion of the funds from user transaction fees to be paid directly to validators. +- Parties that have significant assets bonded on a chain, such as dApp developers, exchanges, power-users, and liquidity providers, may choose to validate to protect their investment. +- Anyone who chooses to validate can do so. Some users will probably choose to validate to protect their interests or just to be good citizens. But ordinary users don't need to validate, and we expect that the vast majority of users won't. ## ArbOS -ArbOS is a trusted "system glue" component that acts as the hypervisor and facilitates the State Transition Function (execution environment) on the child chain. ArbOS provides functions needed for a Layer 2 system, such as cross-chain communication, resource accounting and Layer 2 related fee economics, and chain management. +ArbOS is a trusted "system glue" component that acts as the hypervisor, facilitating the State Transition Function (execution environment) on the child chain. ArbOS provides functions necessary for a Layer 2 system, including cross-chain communication, resource accounting, Layer 2-related fee economics, and chain management. ### Why ArbOS? In Arbitrum, much of the work that would otherwise have to be done expensively at Layer 1 is instead done by ArbOS, trustlessly performing these functions at the speed and low cost of Layer 2. -Supporting these functions in Layer 2 trusted software, rather than building them in to the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. Having a trusted operating system at Layer 2 also has significant advantages in flexibility, because Layer 2 code is easier to evolve, or to customize for a particular chain, then a Layer-1 enforced architecture would be. +Supporting these functions in Layer 2 trusted software, rather than building them into the L1-enforced rules of the architecture as Ethereum does, offers significant advantages in cost because these operations can benefit from the lower cost of computation and storage at Layer 2, instead of having to manage those resources as part of a Layer 1 contract. Having a trusted operating system at Layer 2 also offers significant advantages in flexibility, as Layer 2 code is easier to evolve or customize for a particular chain than a Layer 1-enforced architecture would be. -ArbOS also provides child chain-specific precompiles with methods smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available in Arbitrum chains. +ArbOS also provides child chain-specific precompiles with methods that smart contracts can call the same way they can Solidity functions. Visit the [precompiles conceptual page](/build-decentralized-apps/precompiles/01-overview.mdx) for more information about how these work and the [precompiles reference page](/build-decentralized-apps/precompiles/02-reference.mdx) for a full reference of the precompiles available in Arbitrum chains. ## Full Nodes -As the name suggests, full nodes in Arbitrum play the same role that full nodes play in Ethereum: they know the state of the chain and they provide an API that others can use to interact with the chain. +As the name suggests, full nodes in Arbitrum play the same role as full nodes in Ethereum: they maintain the state of the chain and provide an API that others can use to interact with the chain. -Arbitrum full nodes normally "live at Layer 2" which means that they don't worry about the rollup protocol but simply treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. +Arbitrum full nodes normally "live at Layer 2," which means that they don't worry about the rollup protocol but treat their Arbitrum chain as a mechanism that feeds inbox messages to the State Transition Function to evolve the Layer 2 chain and produce outputs. ## The Sequencer -The Sequencer is a specially designated full node, which is given limited power to control the ordering of transactions. This allows the Sequencer to guarantee the results of user transactions immediately, without needing to wait for anything to happen on Ethereum. So no need to wait five minutes or so for block confirmations - and no need to even wait 15 seconds for Ethereum to make a block. +The Sequencer is a specially designated full node, which has limited power to control the ordering of transactions. This ordering allows the Sequencer to guarantee the results of user transactions immediately, without requiring any wait for events on Ethereum. So, there's no need to wait five minutes or so for block confirmations - and no need to wait even 15 seconds for Ethereum to make a block. -Clients interact with the Sequencer in exactly the same way they would interact with any full node, for example by giving their wallet software a network URL that happens to point to the Sequencer. +Clients interact with the Sequencer in the same way they would with any full node, for example, by providing their wallet software with a network URL that happens to point to the Sequencer. Currently, on the Arbitrum One and Arbitrum Nova chains, the Sequencer is run by Offchain Labs. ### Instant confirmation -Without a Sequencer, a node can predict what the results of a client transaction will be, but the node can't be sure, because it can't know or control how the transactions it submits will be ordered in the inbox, relative to transactions submitted by other nodes. +Without a Sequencer, a node can predict the results of a client transaction. However, it cannot determine the order of transactions in the inbox, as it lacks control over how these transactions are arranged compared to those submitted by other nodes. -The Sequencer is given more control over ordering, so it has the power to assign its clients' transaction a position in the inbox queue, thereby ensuring that it can determine the results of client transactions immediately. The Sequencer's power to reorder has limits (see below for details) but it does have more power than anyone else to influence transaction ordering. +The Sequencer does have control over ordering, allowing it to assign its clients' transactions a position in the inbox queue, thereby ensuring that it can determine the results of client transactions immediately. The Sequencer's power to reorder has limits (see below for details), but it does have more power than anyone else to influence transaction ordering. ### Inboxes, fast and slow When we add a Sequencer, the operation of the inbox changes. - Only the Sequencer can put new messages directly into the inbox. The Sequencer tags the messages it is submitting with an Ethereum block number and timestamp. (ArbOS ensures that these are non-decreasing, adjusting them upward if necessary to avoid decreases.) -- Anyone else can submit a message, but messages submitted by non-Sequencer nodes will be put into the "delayed inbox" queue, which is managed by an L1 Ethereum contract. +- Anyone else can submit a message, but messages submitted by non-Sequencer nodes will go into the "delayed inbox" queue (managed by an L1 Ethereum contract). - Messages in the delayed inbox queue will wait there until the Sequencer chooses to "release" them into the main inbox, where they will be added to the end of the inbox. A well-behaved Sequencer will typically release delayed messages after about ten minutes, for reasons explained below. - - Alternatively, if a message has been in the delayed inbox queue for longer than a maxmium delay interval (currently 24 hours on Arbitrum One) then anyone can force it to be promoted to the main inbox. (This ensures that the Sequencer can only delay messages but can't censor them.) + - Alternatively, if a message has been in the delayed inbox queue for longer than a maximum delay interval (currently 24 hours on Arbitrum One), then anyone can force it to be promoted to the main inbox. (This ensures that the Sequencer can only delay messages but can't censor them.) -### If the Sequencer is well-behaved... +### If the Sequencer is well-behaved -A well-behaved Sequencer will accept transactions from all requesters and treat them fairly, giving each one a promised transaction result as quickly as it can. +A well-behaved Sequencer will accept transactions from all requesters and treat them fairly, providing each one with a promised transaction result as quickly as possible. -It will also minimize the delay it imposes on non-Sequencer transactions by releasing delayed messages promptly, consistent with the goal of providing strong promises of transaction results. Specifically, if the Sequencer believes that 40 confirmation blocks are needed to have good confidence of finality on Ethereum, then it will release delayed messages after 40 blocks. This is enough to ensure that the Sequencer knows exactly which transactions will precede its current transaction, because those preceding transactions have finality. There is no need for a benign Sequencer to delay non-Sequencer messages more than that, so it won't. +It will also minimize the delay it imposes on non-Sequencer transactions by promptly releasing delayed messages, consistent to provide strong guarantees of transaction results. Specifically, if the Sequencer believes that 40 confirmation blocks are required to achieve confidence in finality on Ethereum, then it will release delayed messages after 40 blocks. This belief is enough to ensure that the Sequencer knows exactly which transactions will precede its current transaction, because those preceding transactions have finality. There is no need for a benign Sequencer to delay non-Sequencer messages more than that, so it won't. -This does mean that transactions that go through the delayed inbox will take longer to get finality. Their time to finality will roughly double, because they will have to wait one finality period for promotion, then another finality period for the Ethereum transaction that promoted them to achieve finality. +However, this belief does mean that transactions that go through the delayed inbox will take longer to get finality. Their time to finality will double (roughly), because they will have to wait one finality period for promotion, then another finality period for the Ethereum transaction that promoted them to achieve finality. -This is the basic tradeoff of having a Sequencer: if your message uses the Sequencer, finality is `C` blocks faster; but if your message doesn't use the Sequencer, finality is `C` blocks slower. This is usually a good tradeoff, because most transactions will use the Sequencer; and because the practical difference between instant and 10-minute finality is bigger than the difference between 10-minute and 20-minute finality. +This delay is the tradeoff of having a Sequencer: if your message uses the Sequencer, finality is `C` blocks faster; but if your message doesn't use the Sequencer, finality is `C` blocks slower. This balance is usually a good tradeoff, as most transactions will utilize the Sequencer, and because the practical difference between instant and 10-minute finality is greater than the difference between 10-minute and 20-minute finality. -So a Sequencer is generally a win, if the Sequencer is well-behaved. +A Sequencer is generally a win if the Sequencer is well-behaved. -### If the Sequencer is malicious... +### If the Sequencer is malicious -A malicious Sequencer, on the other hand, could cause some pain. If it refuses to handle your transactions, you're forced to go through the delayed inbox, with longer delay. And a malicious Sequencer has great power to front-run everyone's transactions, so it could profit greatly at users' expense. +A malicious Sequencer, on the other hand, could cause some pain. If it refuses to handle your transactions, you must go through the delayed inbox, which has a longer delay. A malicious Sequencer has the power to front-run everyone's transactions so that it could profit greatly at users' expense. -On Arbitrum One, Offchain Labs currently runs a Sequencer which is well-behaved - we promise! This will be useful but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. +On Arbitrum One, Offchain Labs currently operates a well-behaved Sequencer - we promise! This Sequencer will be useful, but it's not decentralized. Over time, we'll switch to decentralized, fair sequencing, as described below. -Because the Sequencer will be run by a trusted party at first, and will be decentralized later, we haven't built in mechanism to directly punish a misbehaving Sequencer. We're asking users to trust the centralized Sequencer at first, until we switch to decentralized fair sequencing later. +Since a trusted party will initially run the Sequencer and it will be decentralized later, we haven't built a mechanism to punish a misbehaving Sequencer directly. We're asking users to trust the centralized Sequencer initially, until we transition to decentralized fair sequencing later. ### Decentralized fair sequencing -Viewed from 30,000 feet, decentralized fair sequencing isn't too complicated. Instead of being a single centralized server, the Sequencer is a committee of servers, and as long as a large enough supermajority of the committee is honest, the Sequencer will establish a fair ordering over transactions. +Viewed from 30,000 feet, decentralized fair sequencing isn't too complicated. Instead of being a single centralized server, the Sequencer is a committee of servers. As long as a large enough supermajority of the Committee is honest, the Sequencer will establish a fair ordering over transactions. -How to achieve this is more complicated. Research by a team at Cornell Tech, including Offchain Labs and Co-founder Steven Goldfeder, developed the first-ever decentralized fair sequencing algorithm. With some improvements that are under developement, these concepts will form the basis for our longer-term solution, of a fair decentralized Sequencer. +Achieving this is more complicated. Research by a team at Cornell Tech, including Offchain Labs and Co-founder Steven Goldfeder, developed the first-ever decentralized fair sequencing algorithm. With some improvements currently under development, these concepts will form the basis for our longer-term solution: a fair, decentralized Sequencer. ## Bridging -We have already covered how users interact with L2 contracts - they submit transactions by putting messages int othe chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2 - how an L1 contract calls an L2 contract, and vice versa. +We have already covered how users interact with L2 contracts - they submit transactions by putting messages into the chain's inbox, or having a full node Sequencer or aggregator do so on their behalf. Let's talk about how contracts interact between L1 and L2 - how an L1 contract calls an L2 contract, and vice versa. -The L1 and L2 chains run asynchronously from each other, so it is not possible to make a cross-chain call that produces a result wihtin the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was successfully submitted for later execution.) +The L1 and L2 chains operate asynchronously, so it is not possible to make a cross-chain call that produces a result within the same transaction as the caller. Instead, cross-chain calls must be asynchronous, meaning that the caller submits the call at some point in time, and the call runs later. As a consequence, a cross-chain contract-to-contract call can never produce a result that is available to the calling contract (except for acknowledgement that the call was submitted successfully for later execution). ### L1 contracts can submit L2 transactions An L1 contract can submit an L2 transaction, just like a user would, by calling the Nitro chain's inbox contract on Ethereum. This L2 transaction will run later, producing results that will not be available to the L1 caller. The transaction will execute at L2, but the L1 caller won't be able to see any results from the L2 transaction. -The advantage of this method is that it is simple and has relatively low latency. The disadvantage compared to the other method we'll describe soon, is that the L2 transaction might revert if the L1 caller doesn't get the L2 gas price and max gas amount right. Because the L1 caller can't see the result of its L2 transaction, it can't be absolutely sure that its L2 transaction will succeed. +The advantage of this method is that it is simple and has relatively low latency. The disadvantage compared to the other method we'll describe soon is that the L2 transaction might revert if the L1 caller doesn't set the L2 gas price and maximum gas amount correctly. Because the L1 caller can't see the result of its L2 transaction, it can't be sure that its L2 transaction will succeed. -This would introduce a serious a problem for certain types of L1 to L2 interactions. Consider a transaction that includes depositing a token on L1 to be made available at some address on L2. If the L1 side succeeds, but the L2 side reverts, you've just sent some tokens to the L1 inbox contract that are unrecoverable on either L2 or L1. Not good. +Doing this would introduce a serious problem for certain types of L1-to-L2 interactions. Consider a transaction that involves depositing a token on L1 to be made available at a specific address on L2. If the L1 side succeeds, but the L2 side reverts, you've just sent some tokens to the L1 inbox contract that are unrecoverable on either L2 or L1. Not good. ### L1 to L2 ticket-based transactions -Fortunately, we have another method for L1 and L2 calls, which is more robust against gas-related failures, that uses a ticket-based system. The idea is that an L1 contract can submit a "retryable" transaction. The Nitro chain will try to run that transaction. If the transaction succeeds, nothing else needs to happen. But if the transaction fails, Nitro will create a "ticketID" that identifies that failed transaction. Later, anyone can call a special pre-compiled contract at L2, providing the `ticketID`, to try redeeming the ticekt and re-executing the transaction. +Fortunately, we have another method for L1 and L2 calls, which is more robust against gas-related failures, that uses a ticket-based system. The idea is that an L1 contract can submit a "retryable" transaction. The Nitro chain will try to run that transaction. If the transaction is successful, no further action is required. But if the transaction fails, Nitro will create a "ticketID" that identifies that failed transaction. Later, anyone can call a special pre-compiled contract at L2, providing the `ticketID`, to attempt to redeem the ticket and re-execute the transaction. -When saving a transaction for retry, Nitro records the sender's address, destination address, callvalue, and calldata. All of this is saved, and the callvalue is deducted from the sender's account and (logically) attached to the saved transaction. +When saving a transaction for retry, Nitro records the sender's address, destination address, callvalue, and calldata. All of this gets saved, and the callvalue is deducted from the sender's account and (logically) attached to the saved transaction. -If the redemption succeeds, the transaction is done, a receipt is issued for it, and the `ticketID` is canceled and can't be used again. If the redemption fails, for example because the packaged transaction fails, the redemption reports failure and the `ticketID` remains available for redemption. +If the redemption is successful, the transaction completes, a receipt is issued, and the `ticketID` is canceled and can't be used again. If the redemption fails, for example, because the packaged transaction fails, the redemption reports failure, and the `ticketID` remains available for redemption. -Normally the originally submitter will try to cause their transaction to succeed immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only require a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop which others can redeem later. +Normally, the original submitter will attempt to ensure their transaction succeeds immediately, so it never needs to be recovered or retried. As an example, our "token deposit" use case above should, in the happy, common case, still only require a single signature from the user. If this initial execution fails, the `ticketID` will still exist as a backstop, which others can redeem later. -Submitting a transaction in this way carries a price in`ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket is valid for about a week. If the ticket has not been redeemed in that period, it is deleted. +Submitting a transaction in this way carries a price in'ETH` which the submitter must pay, which varies based on the calldata size of the transaction. Once submitted, the ticket remains valid for approximately one week. If the ticket redemption doesn't occur within that period, it will get deleted. -When the ticket is redeemed, the pre-packaged transaction runs with sender and origin equal to the original submitted, and with the destination, callvalue, and calldata the submitter provided at the time of the submission. +When the ticket is redeemed, the pre-packaged transaction runs with the sender and origin equal to the original submitted values, and with the destination, callvalue, and calldata provided by the submitter at the time of submission. -This mechanism is a bit more cumbersome than ordinary L1 to L2 transactions, but it has the advantage that the submission cost is predictable and the ticket will always be available for redemption if the submission cost is paid. As long as there is some user who is willing to redeem the ticket, the L2 transaction will eventually be able to execute and will not be silently dropped. +This mechanism is more cumbersome than ordinary L1 to L2 transactions. However, it has the advantage that the submission cost is predictable and the ticket will always be available for redemption if the submission cost is paid. As long as a user is willing to redeem the ticket, the Layer 2 transaction will eventually be executed and will not be deleted. :::info More information -For a deeper look into L1-to-L2 Messaging read more in the [deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). +For a deeper look into L1-to-L2 Messaging, read more in the [deep dive](/how-arbitrum-works/deep-dives/l1-to-l2-messaging.mdx). ::: ### L2 to L1 ticket-based calls -Calls from L2 and L1 operate in a similar way, with a ticket-based system. An L2 contract can call a method of the precompiled ArbSys contract, to send a transaction to L1. When the execution of the L2 transaction containing the submission is confirmed at L1 (some days later), a ticket is created in the L1 outbox contract. The ticket can be triggered by anyone who calls a certain L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. +Calls from L2 and L1 operate similarly, utilizing a ticket-based system. An L2 contract can call a method of the precompiled ArbSys contract to send a transaction to L1. When the execution of the L2 transaction containing the submission receives confirmation on L1 (potentially some days later), a ticket gets created in the L1 outbox contract. The ticket is triggerable by anyone who calls an L1 outbox method and submits the `ticketID`. The ticket is only marked as redeemed if the L1 transaction does not revert. -These L2-to-L1 tickets have unlimited lifetime, until they're successfully redeemed. No rent is required, as the tickets (actually a Merkle hash of the tickets) are recorded in Ethereum storage, which does not require rent. (The cost of allocating storage for the ticket Merkle roots is covered by L2 transaction fees.) +These L2-to-L1 tickets have an unlimited lifetime, until they're successfully redeemed. No rent is required, as a record of the ticket (actually a Merkle hash of the tickets) gets stored on Ethereum storage, which does not require rent. (L2 transaction fees cover the cost of allocating storage for the ticket Merkle roots.) :::info More information -For further reading take a look at the [L2-to-L1-messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) deep dive. +For further reading, take a look at the [L2-to-L1-messaging](/how-arbitrum-works/deep-dives/l2-to-l1-messaging.mdx) deep dive. ## Gas and Fees -NitroGas (so-called to avoid confusion wtih Layer 1 Ethereum gas) is used by Arbitrum to track the cost of execution on a Nitro chain. It works the same as Ethereum gas, in the sense that every EVM instructions costs the same amount of gas that it would on Ethereum. +NitroGas (so-called to avoid confusion with Layer 1 Ethereum gas) is used by Arbitrum to track the execution cost on a Nitro chain. It works similarly to Ethereum gas, in that every EVM instruction incurs the same amount of gas as it would on Ethereum. ## The Speed Limit -The security of Nitro chains depends on the assumption that when one validator creates an assertion, other validators will check it, and respond with a correct assertion and a challenge if it is wrong. This requires that the other validators have the time and resources to check each assertion quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for assertions. +The security of Nitro chains relies on the assumption that when one validator creates an assertion, other validators will verify it and respond with a correct assertion and a challenge if it is incorrect. This assumption requires that the other validators have the time and resources to check each assertion quickly enough to issue a timely challenge. The Arbitrum protocol takes this into account in setting deadlines for assertions. -This sets an effective speed limit on execution of a Nitro chain: in the long run the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will get farther and farther in the future. Due to the limit, enforced by the rollup protocol contracts, on how far in the future a deadline can be, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. +This security feature sets an effective speed limit on execution of a Nitro chain: in the long run, the chain cannot make progress faster than a validator can emulate its execution. If assertions are published at a rate faster than the speed limit, their deadlines will go further into the future. Due to the limit imposed by the rollup protocol contracts on how far into the future a deadline can be, this will eventually cause new assertions to be slowed down, thereby enforcing the effective speed limit. -Being able to set the speed limit accurately depends on being able to estimate the time required to validate an assertion, with some accuracy. Any uncertainty in estimating validation time will force us to set the speed limit lower, to be safe. And we do not want to set the speed limit lower, so we try to enable accurate estimation. +Being able to set the speed limit accurately depends on being able to estimate the time required to validate an assertion, with some accuracy. Any uncertainty in estimating validation time will force us to set the speed limit lower to ensure safety. We do not want to lower the speed limit, so we aim to enable accurate estimation of the speed limit. ## Fees -User transactions pay fees, to cover the cost of operating the chain. These fees are assessed and collected by ArbOS at L2. They are denominated in `ETH`. +User transactions pay fees to cover the operating costs of the chain. These fees are assessed and collected by ArbOS at L2 (denominated in `ETH`). -Fees are charged for two resources that a transaction can use: +Two types of resources can incur fees during a transaction: - **L2 gas**: an Ethereum-equivalent amount of gas, as required to execute the transaction on the Nitro chain -- **L1 calldata**: a fee per unit of L1 calldata attributable to the transaction, which is charged only if the transaction came in via the Sequencer, and is paid to the Sequencer to cover its costs +- **L1 calldata**: a fee per unit of L1 calldata attributable to the transaction, only chargeable if the transaction came in via the Sequencer, and is paid to the Sequencer to cover its costs ## L2 gas fees -L2 gas fees work very similarly to gas on Ethereum. A transaction uses some amount of gas, and this is multiplied by the current basefee to get the L2 gas fee charged to the transaction. +L2 gas fees work very similarly to gas on Ethereum. A transaction consumes a certain amount of gas, which gets multiplied by the current base fee to determine the L2 gas fee for the transaction.. -The L2 basefee is set by a version of the "exponential mechanism" which has been widely discussed in the Ethereum community, and which has been shown equivalent to Ethereum's EIP-1559 gas pricing mechanism. +A version of the "exponential mechanism" sets the L2 base fee, which has been widely discussed in the Ethereum community and shown to be equivalent to Ethereum's EIP-1559 gas pricing mechanism. -The algorithm compares gas usage against a parameter called the "speed limit" which is the taret amount of gas per second that the chain can handle sustainably over time. (Currently the speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, that gas is added to the backlog. Whenever the clock ticks one second, the speed limit is subtracted from the backlog; but the backlog can never go below zero. +The algorithm compares gas usage against a parameter called the "speed limit," which is the target amount of gas per second that the chain can handle sustainably over time. (Currently, the speed limit on Arbitrum One is 7,000,000 gas per second.) The algorithm tracks a gas backlog. Whenever a transaction consumes gas, that gas gets added to the backlog. Whenever the clock ticks one second, the speed limit gets subtracted from the backlog; however, the backlog can never go below zero. -Intuitively, if the backlog grows, the algorithm should increase the gas price, to slow gas usage, because usage is above the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the below the sustainable limit so more gas usage can be welcomed. +Intuitively, if the backlog grows, the algorithm should increase the gas price to slow gas usage, as usage exceeds the sustainable level. If the backlog shrinks, the price should decrease again because usage has been below the sustainable limit, allowing for the accommodation of more gas usage. -To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a` and `b` are suitably chosen constants: `a` controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. +To make this more precise, the basefee is an exponential function of the backlog, $$ F = exp(-a(B-b)) $$, where `a' and `b`are suitably chosen constants:`a' controls how rapidly the price escalates with backlog, and `b` allows a small backlog before the basefee escalation begins. ### L1 calldata fees -L1 calldata fees exist because the Sequencer, or the batch poster which posts the Sequencer's transaction batches on Ethereum, incurs costs in L1 gas to post transactions on Ethereum as calldata. Funds collected in L1 calldata fees are credited to the batch poster to cover its costs. +L1 calldata fees exist because the Sequencer, or the batch poster, which posts the Sequencer's transaction batches on Ethereum, incurs costs in L1 gas to post transactions on Ethereum as calldata. Funds collected in L1 calldata fees are credited to the batch poster to cover its costs. -Every transaction that comes in through the Sequencer will pay an L1 calldata fee. Transactions that come in through the delayed inbox do not pay this fee because they don't add to batch posting costs - but these transactions pay gas fees to Ethereum when they are put into the delayed inbox. +Every transaction that comes in through the Sequencer will pay an L1 calldata fee. Transactions that come in through the delayed inbox do not incur this fee because they don't contribute to batch posting costs. However, these transactions do pay gas fees to Ethereum when added to the delayed inbox. -The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of how many bytes the transaction will add to the compressed batch it is in; the formula for this includes an estimate of how compressible the transaction is. Second, it multiplies the computed size estimate by the current price per estimated byte, to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 basefee to translate the fee into L2 gas units. The result is reported as the "poster fee" for the transaction. +The L1 pricing algorithm assigns an L1 calldata fee to each Sequencer transaction. First, it computes the transaction's size, which is an estimate of the number of bytes the transaction will add to the compressed batch it is in; the formula for this calculation includes an estimate of how compressible the transaction is. Second, it multiplies the computed size estimate by the current price per estimated byte to determine the transaction's L1 calldata `wei`, in `wei`. Finally, it divides this cost by the current L2 base fee to translate the fee into L2 gas units. The result gets reported as the "poster fee" for the transaction. -The price per estimated byte is set by a dynamic algorithm that compares the total L1 calldata fees collected to the total fees actually paid by batch posters, and tries to bring the two as close to equality as possible. If the batch posters' costs have been less than fee receipts, the price will increase, and if batch poster costs have exceeded fee receipts, the price will decrease. +The dynamic algorithm determines the price per estimated byte by comparing the total L1 calldata fees collected to the total fees paid by batch posters. It aims to align these two amounts as closely as possible. If batch posters pay less than the collected fees, the algorithm will adjust the price accordingly. Conversely, if their costs exceed the collected fees, it will result in a decrease in the price. ### Total fee and gas estimation -The total fee charged to a transaction is the L2 basefee, multiplied by the sum of the L2 gas used plus the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a basefee limit that is below the current basefee. Ethereum also allows a "tip" but Nitro ignores this field and never collects any tips. +The total fee charged for a transaction is the L2 base fee multiplied by the sum of the L2 gas used and the L1 calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a base fee limit that is below the current base fee. Ethereum also allows a "tip," but Nitro ignores this field and never collects any tips. ## Inside AnyTrust AnyTrust is a variant of Arbitrum Nitro technology that lowers costs by accepting a mild trust assumption. -The Arbitrum protocol requires that all Arbitrum nodes, including validators (nodes that verify correctness of the chain and are prepared to bond on correct results), have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of cost in Arbitrum. +The Arbitrum protocol requires that all Arbitrum nodes, including validators, have access to the data of every L2 transaction in the Arbitrum chain's inbox. An Arbitrum rollup provides data access by posting the data (in batched, compressed form) on L1 Ethereum as calldata. The Ethereum gas to pay for this is the largest component of the cost in Arbitrum. -AnyTrust relies instead on an external Data Availability Committee (hereafter, "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be avialble so that the rollup protocol can function correctly. +AnyTrust relies instead on an external Data Availability Committee (hereinafter referred to as "the Committee") to store data and provide it on demand. The Committee has `N` members, of which AnyTrust assumes at least two are honest. This assumption means that if `N-1` Committee members promise to provide access to some data, at least one of the promising parties must be honest, ensuring that the data will be available so that the rollup protocol can function correctly. ### Keysets -A Keyset specifies the public keys of Committee members and the number of signatures required for a Data Availability Certificate to be valid. Keysets make Committee membership changes possible and provide Committee members the ability to change their keys. +A Keyset specifies the public keys of Committee members and the number of signatures required for a Data Availability Certificate to be valid. Keysets enable Committee membership changes and provide Committee members with the ability to update their keys. A Keyset contains: @@ -616,55 +585,53 @@ A Keyset contains: - for each Committee member, a BLS public key, and - the number of Committee signatures required -Keysets are identified by their hashes. -An L1 KeysetManager contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the KeysetManager contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This allows the contents to be recovered later by anyone, given only the Keyset hash. +Keysets are identifiable by their hashes. +An L1 KeysetManager contract maintains a list of currently valid Keysets. The L2 chain's Owner can add or remove Keysets from this list. When a Keyset becomes valid, the KeysetManager contract emits an L1 Ethereum event containing the Keyset's hash and full contents. This emission allows the contents to be recovered later by anyone, provided only the Keyset hash is known. -Although the API does not limit the number of Keysets that can be valid at the same time, normally only one Keyset will be valid. +Although the API does not limit the number of Keysets that can be valid at the same time, normally, only one Keyset will be valid. ### Data Availability Certificates -A central concept in AnyTrust in the Data Availability Certificate (hereafter, a "DACert"). A DACert contains: +A central concept in AnyTrust is the Data Availability Certificate (hereinafter referred to as a "DACert"). A DACert contains: -- the hash of a data block, and -- an expiration, and -- proof that `N-1` Committee members have signed the (hash, expiration time) pair, consisting of: - - the hash of the Keyset used in signing, and - - a bitmap saying which Committee members signed, and - - a BLS aggregated signature (over the BLS12-381 curve) proving that those parties signed +- The hash of a data block, and +- An expiration, and +- Proof that `N-1` Committee members have signed the (hash, expiration time) pair, consisting of: + - The hash of the Keyset used in signing, and + - A bitmap saying which Committee members signed, and + - A BLS aggregated signature (over the BLS12-381 curve) proving that those parties signed Because of the `2-of-N` trust assumption, a DACert constitutes proof that the block's data (i.e., the preimage of the hash in the DACert) will be available from at least one honest Committee member, at least until the expiration time. -AnyTrust gives the sequencer two ways to post a data block on L1: it can post the full data as above, or it can post a DACert proving availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity are checked by L2 code. - -In ordinary (non-AnyTrust) Nitro, the Arbitrum sequencer posts data blocks on the L1 chains as calldata. The hashes of the data blocks are committed by the L1 inbox contract, allowing the data to be reliably read by L2 code. +AnyTrust provides the Sequencer with two options for posting a data block on L1: it can post the full data as described above, or it can post a DACert proving the availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity get checked by L2 code. -AnyTrust gives the sequencer two ways to post a data block on L1: it can post the full data as above, or it can post a DACert proving availability of the data. The L1 inbox contract will reject any DACert that uses an invalid Keyset; the other aspects of DACert validity are checked by L2 code. +In ordinary (non-AnyTrust) Nitro, the Arbitrum sequencer posts data blocks on the L1 chains as calldata. The L1 inbox contract commits the hashes of the data blocks, making the data reliably readable to L2 code. -The L2 code that reads data from the inbox reads a full-data block as in ordinary Nitro. If it sees a DACert instead, it checks the validity of the DACert, with reference to the Keyset specified by the DACert (which is known to be valid because the L1 inbox verified that). The L2 code verifies that: +The L2 code that reads data from the inbox reads a full data block, just like in ordinary Nitro. If it sees a DACert instead, it checks the validity of the DACert, regarding the Keyset specified by the DACert (which is known to be valid because the L1 inbox verified that). The L2 code verifies that: -- the number of signers is at least the number required by the Keyset, and -- the aggregated signature is valid for the claimed signers, and -- the expiration time is at least two weeks after the current L2 timestamp +- The number of signers is at least the number required by the Keyset, and +- The aggregated signature is valid for the claimed signers, and +- The expiration time is at least two weeks after the current L2 timestamp If the DACert is invalid, the L2 code discards the DACert and moves on to the next data block. If the DACert is valid, the L2 code reads the data block, which is guaranteed to be available because the DACert is valid. ### Data Availability Servers -Committee members run Data Availability Server (DAS) software. The DAS exposes two APIs: +Committee members run the Data Availability Server (DAS) software. The DAS exposes two APIs: -- The Sequencer API, which is meant to be called only by the Arbitrum chain's Sequencer, is a JSON-RPC interface allowing the Sequencer to submit data blocks to the DAS for storage. Deployments will typically block access to this API from callers other than the Sequencer. -- The REST API, which is meant to be available to the world, is a RESTful HTTP(S) based protocol that allows data blocks to be fetched by hash. This API is fully cacheable, and deployments may use a caching proxy or CDN to increase scale and protect against DoS attacks. +- The Sequencer API, which is to be called only by the Arbitrum chain's Sequencer, is a JSON-RPC interface allowing the Sequencer to submit data blocks to the DAS for storage. Deployments will typically block access to this API from callers other than the Sequencer. +- The REST API, which is to be available to the world, is a RESTful HTTP(S) based protocol that allows fetching data blocks by hash. This API is fully cacheable, and deployments can utilize a caching proxy or CDN to increase scalability and protect against DoS attacks. Only Committee members have reason to support the Sequencer API. We expect others to run the REST API, and that is helpful. (More on that below.) -The DAS software, based on configuration options, can store its data in local files, or in a Badger database, or on Amazon S3, or redundantly across multiple backing stores. The software also supports optional caching in memory (using Bigcache) or in a Redis instance. +The DAS software, based on configuration options, can store its data in local files, a Badger database, Amazon S3, or redundantly across multiple backing stores. The software also supports optional caching in memory (using Bigcache) or in a Redis instance. ### Sequencer-Committee Interaction -When the Arbitrum sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (normally three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then the member signs the (hash, expiration time) pair using its BLS key, and returns the signature with a success indicator to the sequencer. +When the Arbitrum sequencer produces a data batch that it wants to post using the Committee, it sends the batch's data, along with an expiration time (usually three weeks in the future) via RPC to all Committee members in parallel. Each Committee member stores the data in its backing store, indexed by the data's hash. Then, the member signs the (hash, expiration time) pair using its BLS key and returns the signature along with a success indicator to the Sequencer. Once the Sequencer has collected enough signatures, it can aggregate the signatures and create a valid DACert for the (hash, expiration time) pair. The Sequencer then posts that DACert to the L1 inbox contract, making it available to the AnyTrust chain software at L2. -If the Sequencer fails to collect enough signatures within a few minutes, it will abandon the attempt to use the Committee, and will "fall back to rollup" by posting the full data directly to the L1 chain, as it would do in a non-AnyTrust chain. The L2 software can understand both data posting formats (via DACert or via full data) and will handle each one correctly. +If the Sequencer fails to collect enough signatures within a few minutes, it will abandon the attempt to use the Committee and "fall back to rollup" by posting the full data directly to the L1 chain, as it would in a non-AnyTrust chain. The L2 software can understand both data posting formats (via DACert or full data) and handles each one correctly. :::info More information From a8bcdd5c14f6649dd1e0c8f083d8db35d8b9ba0c Mon Sep 17 00:00:00 2001 From: Pete Date: Wed, 20 Aug 2025 14:00:33 -0500 Subject: [PATCH 37/75] Merge branch 'master' into haw-v25 --- .github/pull_request_template.md | 44 + dependencies.json | 8 +- .../precompile-tables/_ArbAddressTable.mdx | 159 ++- .../precompile-tables/_ArbAggregator.mdx | 123 +- .../partials/precompile-tables/_ArbDebug.mdx | 153 ++- .../precompile-tables/_ArbFunctionTable.mdx | 69 +- .../precompile-tables/_ArbGasInfo.mdx | 472 +++++++- .../partials/precompile-tables/_ArbInfo.mdx | 47 +- .../partials/precompile-tables/_ArbOwner.mdx | 1010 ++++++++++++++++- .../precompile-tables/_ArbOwnerPublic.mdx | 215 +++- .../precompile-tables/_ArbRetryableTx.mdx | 196 +++- .../precompile-tables/_ArbStatistics.mdx | 28 +- .../partials/precompile-tables/_ArbSys.mdx | 290 ++++- .../partials/precompile-tables/_ArbWasm.mdx | 455 +++++++- .../precompile-tables/_ArbWasmCache.mdx | 146 ++- .../partials/precompile-tables/_ArbosTest.mdx | 25 +- docs/for-devs/third-party-docs/contribute.mdx | 54 +- .../01-fast-withdrawals.mdx | 3 +- .../arbitrum-chain-finality.mdx | 0 .../migrate-between-raases.mdx | 65 ++ docs/learn-more/contribute.mdx | 8 - docs/partials/_glossary-partial.mdx | 520 +++------ docs/partials/glossary/_raas.mdx | 7 + docs/run-arbitrum-node/01-overview.mdx | 2 +- docs/run-arbitrum-node/02-run-full-node.mdx | 6 + docs/run-arbitrum-node/data-availability.mdx | 2 +- ...orbit-sequencer-compatible-cli-partial.mdx | 2 +- .../run-full-node/_optional-parameters.mdx | 2 +- ...-run-feed-relay.mdx => run-feed-relay.mdx} | 0 .../sequencer/02-read-sequencer-feed.mdx | 2 +- .../05-high-availability-sequencer-docs.mdx | 4 +- docs/stylus/quickstart.mdx | 2 +- scripts/build-glossary.ts | 6 +- scripts/precompile-reference-generator.ts | 7 + sidebars.js | 26 +- src/resources/globalVars.js | 2 +- static/glossary.json | 378 ++---- vercel.json | 10 + 38 files changed, 3768 insertions(+), 780 deletions(-) create mode 100644 .github/pull_request_template.md rename docs/launch-arbitrum-chain/{how-tos => 02-configure-your-chain/common-configurations}/arbitrum-chain-finality.mdx (100%) create mode 100644 docs/launch-arbitrum-chain/migrate-between-raases.mdx delete mode 100644 docs/learn-more/contribute.mdx create mode 100644 docs/partials/glossary/_raas.mdx rename docs/run-arbitrum-node/{sequencer/01-run-feed-relay.mdx => run-feed-relay.mdx} (100%) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..50db5c2687 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,44 @@ +Thank you for contributing to our docs! + +Please fill out the below to ensure your doc gets quickly approved and merged. + +## Description + + + +## Document type + + + +- [ ] Gentle introduction +- [ ] Quickstart +- [ ] How-to +- [ ] Concept +- [ ] FAQ +- [ ] Troubleshooting +- [ ] Reference +- [ ] Third-party content +- [ ] Not applicable + +## Checklist + + + +- [ ] I have read the [CONTRIBUTE.md](../CONTRIBUTE.md) guidelines +- [ ] My changes follow the style conventions outlined in CONTRIBUTE.md +- [ ] I have used sentence-case for titles and headers +- [ ] I have used descriptive link text (not "here" or "this") +- [ ] I have separated procedural from conceptual content where appropriate +- [ ] I have tested my changes locally with `yarn start` or `yarn build` +- [ ] My code follows the existing code style and conventions +- [ ] I have added/updated frontmatter for new documents +- [ ] I have checked for broken links +- [ ] I have verified that my changes don't break the build +- Third-party docs only: Do you agree to the third-party content policy outlined within [CONTRIBUTE.md](../CONTRIBUTE.md)? + - [ ] Yes + - [ ] Not applicable + +## Additional Notes + + + diff --git a/dependencies.json b/dependencies.json index ea3597c89b..7bdb19eabf 100644 --- a/dependencies.json +++ b/dependencies.json @@ -35,8 +35,8 @@ "name": "Arbitrum Orbit SDK", "repo": "https://github.com/OffchainLabs/arbitrum-orbit-sdk", "currentDocsVersion": "0.23.1", - "latestRelease": "v0.23.4", - "latestReleaseDate": "2025-07-22", + "latestRelease": "v0.23.5", + "latestReleaseDate": "2025-07-30", "docsPath": "docs/arbitrum-docs/launch-arbitrum-chain", "description": "SDK for building Arbitrum Orbit chains" }, @@ -55,8 +55,8 @@ "name": "Arbitrum Token Bridge Contracts", "repo": "https://github.com/OffchainLabs/token-bridge-contracts", "currentDocsVersion": "v1.2.3", - "latestRelease": "v1.2.3", - "latestReleaseDate": "2024-08-19", + "latestRelease": "v1.2.5", + "latestReleaseDate": "2025-08-06", "docsPath": "docs/arbitrum-docs/build-decentralized-apps/token-bridging", "description": "Smart contracts for the Arbitrum token bridge" } diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAddressTable.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAddressTable.mdx index bf2556317b..58f56af201 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAddressTable.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAddressTable.mdx @@ -7,5 +7,162 @@ Description - + +
+ +
addressExists() + + +
+ Interface + + + + + Implementation + + + AddressExists checks if an address exists in the table + + + + compress() + + + + Interface + + + + + Implementation + + + Compress and returns the bytes that represent the address + + + + decompress() + + + + Interface + + + + + Implementation + + + + Decompress the compressed bytes at the given offset with those of the corresponding account + + + + + lookup() + + + + Interface + + + + + Implementation + + + Lookup the index of an address in the table + + + + lookupIndex() + + + + Interface + + + + + Implementation + + + LookupIndex for an address in the table by index + + + + register() + + + + Interface + + + + + Implementation + + + Register adds an account to the table, shrinking its compressed representation + + + + size() + + + + Interface + + + + + Implementation + + + Size gets the number of addresses in the table + + diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAggregator.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAggregator.mdx index c5cdd81ddb..1367ae31f0 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAggregator.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbAggregator.mdx @@ -10,11 +10,11 @@ - ⚠️undefined + ⚠️getPreferredAggregator() Interface @@ -22,21 +22,21 @@ Implementation - undefined + Deprecated: Do not use this method. - ⚠️undefined + ⚠️getDefaultAggregator() Interface @@ -44,21 +44,21 @@ Implementation - undefined + Deprecated: Do not use this method. - ⚠️undefined + getBatchPosters() Interface @@ -66,21 +66,21 @@ Implementation - undefined + GetBatchPosters gets the addresses of all current batch posters - ⚠️undefined + addBatchPoster() Interface @@ -88,13 +88,104 @@ Implementation - undefined + Adds additional batch poster address + + + + getFeeCollector() + + + + Interface + + + + + Implementation + + + GetFeeCollector gets a batch poster's fee collector + + + + setFeeCollector(address batchPoster, address newFeeCollector) + + + + Interface + + + + + Implementation + + + + SetFeeCollector sets a batch poster's fee collector (caller must be the batch poster, its + fee collector, or an owner) + + + + + ⚠️getTxBaseFee() + + + + Interface + + + + + Implementation + + + Deprecated: always returns zero + + + + ⚠️setTxBaseFee(address aggregator, uint256 feeInL1Gas) + + + + Interface + + + + + Implementation + + + Deprecated: no-op diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbDebug.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbDebug.mdx index f2e265dd1a..c4bb4612bf 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbDebug.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbDebug.mdx @@ -7,7 +7,140 @@ Description - + + + + becomeChainOwner() + + + + Interface + + + + + Implementation + + + Caller becomes a chain owner + + + + events(bool flag, bytes32 value) + + + + Interface + + + + + Implementation + + + Emits events with values based on the args provided + + + + eventsView() + + + + Interface + + + + + Implementation + + + Tries (and fails) to emit logs in a view context + + + + customRevert() + + + + Interface + + + + + Implementation + + + Throws a custom error + + + + panic() + + + + Interface + + + + + Implementation + + + Halts the chain by panicking in the STF + + + + legacyError() + + + + Interface + + + + + Implementation + + + Throws a hardcoded error + + @@ -21,11 +154,11 @@ - + + + + + + + + + + + + + + + + + + + +
- undefined + Basic Interface @@ -33,7 +166,7 @@ Implementation @@ -45,11 +178,11 @@
- undefined + Mixed Interface @@ -57,7 +190,7 @@ Implementation @@ -69,11 +202,11 @@
- undefined + Store Interface @@ -81,7 +214,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbFunctionTable.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbFunctionTable.mdx index bf2556317b..f6ed192a69 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbFunctionTable.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbFunctionTable.mdx @@ -7,5 +7,72 @@ Description
+ upload() + + + Interface + + + + Implementation + + Upload does nothing
+ size() + + + Interface + + + + Implementation + + Size returns the empty table's size, which is 0
+ get(address addr, uint256 index) + + + Interface + + + + Implementation + + Get reverts since the table is empty
diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbGasInfo.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbGasInfo.mdx index 013ebe89f9..8d011cbde0 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbGasInfo.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbGasInfo.mdx @@ -10,11 +10,11 @@ - undefined + getPricesInWeiWithAggregator() Interface @@ -22,7 +22,253 @@ + Implementation + + + GetPricesInWeiWithAggregator gets prices in wei when using the provided aggregator + + + + getPricesInWei() + + + + Interface + + + + + Implementation + + + GetPricesInWei gets prices in wei when using the caller's preferred aggregator + + + + getPricesInArbGasWithAggregator() + + + + Interface + + + + + Implementation + + + + GetPricesInArbGasWithAggregator gets prices in ArbGas when using the provided aggregator + + + + + getPricesInArbGas() + + + + Interface + + + + + Implementation + + + GetPricesInArbGas gets prices in ArbGas when using the caller's preferred aggregator + + + + getGasAccountingParams() + + + + Interface + + + + + Implementation + + + GetGasAccountingParams gets the rollup's speed limit, pool size, and tx gas limit + + + + getMinimumGasPrice() + + + + Interface + + + + + Implementation + + + GetMinimumGasPrice gets the minimum gas price needed for a transaction to succeed + + + + getL1BaseFeeEstimate() + + + + Interface + + + + + Implementation + + + GetL1BaseFeeEstimate gets the current estimate of the L1 basefee + + + + getL1BaseFeeEstimateInertia() + + + + Interface + + + + + Implementation + + + + GetL1BaseFeeEstimateInertia gets how slowly ArbOS updates its estimate of the L1 basefee + + + + + getL1RewardRate() + + + + Interface + + + + + Implementation + + + GetL1RewardRate gets the L1 pricer reward rate + + + + getL1RewardRecipient() + + + + Interface + + + + + Implementation + + + GetL1RewardRecipient gets the L1 pricer reward recipient + + + + getL1GasPriceEstimate() + + + + Interface + + + + + Implementation + + + GetL1GasPriceEstimate gets the current estimate of the L1 basefee + + + + getCurrentTxL1GasFees() + + + + Interface + + + + Implementation @@ -34,11 +280,11 @@ - undefined + getGasBacklog() Interface @@ -46,21 +292,21 @@ Implementation - undefined (Available since ArbOS 20) + GetGasBacklog gets the backlogged amount of gas burnt in excess of the speed limit - undefined + getPricingInertia() Interface @@ -68,21 +314,23 @@ Implementation - undefined (Available since ArbOS 20) + + GetPricingInertia gets how slowly ArbOS updates the L2 basefee in response to backlogged gas + - undefined + getGasBacklogTolerance() Interface @@ -90,21 +338,24 @@ Implementation - undefined (Available since ArbOS 20) + + GetGasBacklogTolerance gets the forgivable amount of backlogged gas ArbOS will ignore when + raising the basefee + - undefined + getL1PricingSurplus() Interface @@ -112,21 +363,24 @@ Implementation - undefined (Available since ArbOS 20) + + GetL1PricingSurplus gets the surplus of funds for L1 batch posting payments (may be + negative) + - undefined + getPerBatchGasCharge() Interface @@ -134,13 +388,185 @@ Implementation - undefined (Available since ArbOS 20) + + GetPerBatchGasCharge gets the base charge (in L1 gas) attributed to each data batch in the + calldata pricer + + + + + getAmortizedCostCapBips() + + + + Interface + + + + + Implementation + + + GetAmortizedCostCapBips gets the cost amortization cap in basis points + + + + getL1FeesAvailable() + + + + Interface + + + + + Implementation + + + GetL1FeesAvailable gets the available funds from L1 fees + + + + getL1PricingEquilibrationUnits() + + + + Interface + + + + + Implementation + + + + GetL1PricingEquilibrationUnits gets the equilibration units parameter for L1 price + adjustment algorithm (Available since ArbOS 20) + + + + + getLastL1PricingUpdateTime() + + + + Interface + + + + + Implementation + + + + GetLastL1PricingUpdateTime gets the last time the L1 calldata pricer was updated (Available + since ArbOS 20) + + + + + getL1PricingFundsDueForRewards() + + + + Interface + + + + + Implementation + + + + GetL1PricingFundsDueForRewards gets the amount of L1 calldata payments due for rewards (per + the L1 reward rate) (Available since ArbOS 20) + + + + + getL1PricingUnitsSinceUpdate() + + + + Interface + + + + + Implementation + + + + GetL1PricingUnitsSinceUpdate gets the amount of L1 calldata posted since the last update + (Available since ArbOS 20) + + + + + getLastL1PricingSurplus() + + + + Interface + + + + + Implementation + + + + GetLastL1PricingSurplus gets the L1 pricing surplus as of the last update (may be negative) + (Available since ArbOS 20) + diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbInfo.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbInfo.mdx index bf2556317b..3170201765 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbInfo.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbInfo.mdx @@ -7,5 +7,50 @@ Description - + + + + getBalance() + + + + Interface + + + + + Implementation + + + GetBalance retrieves an account's balance + + + + getCode() + + + + Interface + + + + + Implementation + + + GetCode retrieves a contract's deployed code + + diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwner.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwner.mdx index 2e7924da8e..2b1b81e666 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwner.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwner.mdx @@ -10,11 +10,11 @@ - undefined + addChainOwner() Interface @@ -22,7 +22,603 @@ + Implementation + + + AddChainOwner adds account as a chain owner + + + + removeChainOwner() + + + + Interface + + + + + Implementation + + + RemoveChainOwner removes account from the list of chain owners + + + + isChainOwner() + + + + Interface + + + + + Implementation + + + IsChainOwner checks if the account is a chain owner + + + + getAllChainOwners() + + + + Interface + + + + + Implementation + + + GetAllChainOwners retrieves the list of chain owners + + + + setNativeTokenManagementFrom() + + + + Interface + + + + + Implementation + + + future. + + + + addNativeTokenOwner() + + + + Interface + + + + + Implementation + + + AddNativeTokenOwner adds account as a native token owner + + + + removeNativeTokenOwner() + + + + Interface + + + + + Implementation + + + RemoveNativeTokenOwner removes account from the list of native token owners + + + + isNativeTokenOwner() + + + + Interface + + + + + Implementation + + + IsNativeTokenOwner checks if the account is a native token owner + + + + getAllNativeTokenOwners() + + + + Interface + + + + + Implementation + + + GetAllNativeTokenOwners retrieves the list of native token owners + + + + setL1BaseFeeEstimateInertia() + + + + Interface + + + + + Implementation + + + + SetL1BaseFeeEstimateInertia sets how slowly ArbOS updates its estimate of the L1 basefee + + + + + setL2BaseFee() + + + + Interface + + + + + Implementation + + + SetL2BaseFee sets the L2 gas price directly, bypassing the pool calculus + + + + setMinimumL2BaseFee() + + + + Interface + + + + + Implementation + + + SetMinimumL2BaseFee sets the minimum base fee needed for a transaction to succeed + + + + setSpeedLimit() + + + + Interface + + + + + Implementation + + + SetSpeedLimit sets the computational speed limit for the chain + + + + setMaxTxGasLimit() + + + + Interface + + + + + Implementation + + + SetMaxTxGasLimit sets the maximum size a tx (and block) can be + + + + setL2GasPricingInertia() + + + + Interface + + + + + Implementation + + + SetL2GasPricingInertia sets the L2 gas pricing inertia + + + + setL2GasBacklogTolerance() + + + + Interface + + + + + Implementation + + + SetL2GasBacklogTolerance sets the L2 gas backlog tolerance + + + + getNetworkFeeAccount() + + + + Interface + + + + + Implementation + + + GetNetworkFeeAccount gets the network fee collector + + + + getInfraFeeAccount() + + + + Interface + + + + + Implementation + + + GetInfraFeeAccount gets the infrastructure fee collector + + + + setNetworkFeeAccount() + + + + Interface + + + + + Implementation + + + SetNetworkFeeAccount sets the network fee collector to the new network fee account + + + + setInfraFeeAccount() + + + + Interface + + + + + Implementation + + + SetInfraFeeAccount sets the infra fee collector to the new network fee account + + + + scheduleArbOSUpgrade(uint64 newVersion, uint64 timestamp) + + + + Interface + + + + + Implementation + + + ScheduleArbOSUpgrade to the requested version at the requested timestamp + + + + setL1PricingEquilibrationUnits() + + + + Interface + + + + + Implementation + + + Sets equilibration units parameter for L1 price adjustment algorithm + + + + setL1PricingInertia() + + + + Interface + + + + + Implementation + + + Sets inertia parameter for L1 price adjustment algorithm + + + + setL1PricingRewardRecipient() + + + + Interface + + + + + Implementation + + + Sets reward recipient address for L1 price adjustment algorithm + + + + setL1PricingRewardRate() + + + + Interface + + + + + Implementation + + + Sets reward amount for L1 price adjustment algorithm, in wei per unit + + + + setL1PricePerUnit() + + + + Interface + + + + + Implementation + + + Set how much ArbOS charges per L1 gas spent on transaction data. + + + + setPerBatchGasCharge() + + + + Interface + + + + + Implementation + + + Sets the base charge (in L1 gas) attributed to each data batch in the calldata pricer + + + + setBrotliCompressionLevel() + + + + Interface + + + + Implementation @@ -30,5 +626,413 @@ Sets the Brotli compression level used for fast compression (default level is 1) + + + setAmortizedCostCapBips() + + + + Interface + + + + + Implementation + + + Sets the cost amortization cap in basis points + + + + releaseL1PricerSurplusFunds() + + + + Interface + + + + + Implementation + + + Releases surplus funds from L1PricerFundsPoolAddress for use + + + + setInkPrice() + + + + Interface + + + + + Implementation + + + Sets the amount of ink 1 gas buys + + + + setWasmMaxStackDepth() + + + + Interface + + + + + Implementation + + + Sets the maximum depth (in wasm words) a wasm stack may grow + + + + setWasmFreePages() + + + + Interface + + + + + Implementation + + + Gets the number of free wasm pages a tx gets + + + + setWasmPageGas() + + + + Interface + + + + + Implementation + + + Sets the base cost of each additional wasm page + + + + setWasmPageLimit() + + + + Interface + + + + + Implementation + + + Sets the initial number of pages a wasm may allocate + + + + setWasmMaxSize() + + + + Interface + + + + + Implementation + + + decompression. + + + + setWasmMinInitGas(uint8 gas, uint16 cached) + + + + Interface + + + + + Implementation + + + Sets the minimum costs to invoke a program + + + + setWasmInitCostScalar() + + + + Interface + + + + + Implementation + + + Sets the linear adjustment made to program init costs + + + + setWasmExpiryDays() + + + + Interface + + + + + Implementation + + + Sets the number of days after which programs deactivate + + + + setWasmKeepaliveDays() + + + + Interface + + + + + Implementation + + + Sets the age a program must be to perform a keepalive + + + + setWasmBlockCacheSize() + + + + Interface + + + + + Implementation + + + Sets the number of extra programs ArbOS caches during a given block + + + + addWasmCacheManager() + + + + Interface + + + + + Implementation + + + Adds account as a wasm cache manager + + + + removeWasmCacheManager() + + + + Interface + + + + + Implementation + + + Removes account from the list of wasm cache managers + + + + setChainConfig() + + + + Interface + + + + + Implementation + + + Sets serialized chain config in ArbOS state + + + + setCalldataPriceIncrease() + + + + Interface + + + + + Implementation + + + (EIP-7623) + + + + + + + + + + + + + + + + + + +
EventSolidity interfaceGo implementationDescription
+ OwnerActs + + + Interface + + + + Implementation + + / Emitted when a successful call is made to this precompile
diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwnerPublic.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwnerPublic.mdx index 79ba73a15c..17f31b788c 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwnerPublic.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbOwnerPublic.mdx @@ -10,11 +10,11 @@ - undefined + isChainOwner() Interface @@ -22,13 +22,214 @@ Implementation - undefined (Available since ArbOS 11) + IsChainOwner checks if the user is a chain owner + + + + rectifyChainOwner() + + + + Interface + + + + + Implementation + + + RectifyChainOwner checks if the account is a chain owner (Available since ArbOS 11) + + + + getAllChainOwners() + + + + Interface + + + + + Implementation + + + GetAllChainOwners retrieves the list of chain owners + + + + isNativeTokenOwner() + + + + Interface + + + + + Implementation + + + IsNativeTokenOwner checks if the account is a native token owner + + + + getAllNativeTokenOwners() + + + + Interface + + + + + Implementation + + + GetAllNativeTokenOwners retrieves the list of native token owners + + + + getNetworkFeeAccount() + + + + Interface + + + + + Implementation + + + GetNetworkFeeAccount gets the network fee collector + + + + getInfraFeeAccount() + + + + Interface + + + + + Implementation + + + GetInfraFeeAccount gets the infrastructure fee collector + + + + getBrotliCompressionLevel() + + + + Interface + + + + + Implementation + + + + GetBrotliCompressionLevel gets the current brotli compression level used for fast + compression + + + + + getScheduledUpgrade() + + + + Interface + + + + + Implementation + + + Returns (0, 0, nil) if no ArbOS upgrade is scheduled. + + + + isCalldataPriceIncreaseEnabled() + + + + Interface + + + + + Implementation + + + (EIP-7623) is enabled @@ -44,11 +245,11 @@ - undefined + ChainOwnerRectified Interface @@ -56,7 +257,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbRetryableTx.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbRetryableTx.mdx index 16ee015423..74dac69fa3 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbRetryableTx.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbRetryableTx.mdx @@ -10,11 +10,11 @@ - undefined + redeem() Interface @@ -22,7 +22,142 @@ + Implementation + + + + Redeem schedules an attempt to redeem the retryable, donating all of the call's gas to the + redeem attempt + + + + + getLifetime() + + + + Interface + + + + + Implementation + + + GetLifetime gets the default lifetime period a retryable has at creation + + + + getTimeout() + + + + Interface + + + + + Implementation + + + GetTimeout gets the timestamp for when ticket will expire + + + + keepalive() + + + + Interface + + + + + Implementation + + + Keepalive adds one lifetime period to the ticket's expiry + + + + getBeneficiary() + + + + Interface + + + + + Implementation + + + GetBeneficiary gets the beneficiary of the ticket + + + + cancel() + + + + Interface + + + + + Implementation + + + Cancel the ticket and refund its callvalue to its beneficiary + + + + getCurrentRedeemer() + + + + Interface + + + + Implementation @@ -30,6 +165,31 @@ Gets the redeemer of the current retryable redeem attempt + + + submitRetryable() + + + + Interface + + + + + Implementation + + + + Do not call. This method represents a retryable submission to aid explorers. Calling it will + always revert. + + @@ -44,11 +204,11 @@ - + + + + + + + +
- undefined + TicketCreated Interface @@ -56,7 +216,7 @@ Implementation @@ -66,11 +226,11 @@
- undefined + LifetimeExtended Interface @@ -78,7 +238,7 @@ Implementation @@ -88,11 +248,11 @@
- undefined + RedeemScheduled Interface @@ -100,7 +260,7 @@ Implementation @@ -110,11 +270,11 @@
- undefined + Canceled Interface @@ -122,7 +282,7 @@ Implementation @@ -132,11 +292,11 @@
- undefined + Redeemed Interface @@ -144,7 +304,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbStatistics.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbStatistics.mdx index bf2556317b..cfa5712417 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbStatistics.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbStatistics.mdx @@ -7,5 +7,31 @@ Description
+ getStats() + + + Interface + + + + Implementation + + + GetStats returns the current block number and some statistics about the rollup's pre-Nitro + state +
diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbSys.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbSys.mdx index c912fdd5ff..c003eed386 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbSys.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbSys.mdx @@ -7,7 +7,277 @@ Description - + + + + arbBlockNumber() + + + + Interface + + + + + Implementation + + + ArbBlockNumber gets the current L2 block number + + + + arbBlockHash() + + + + Interface + + + + + Implementation + + + ArbBlockHash gets the L2 block hash, if sufficiently recent + + + + arbChainID() + + + + Interface + + + + + Implementation + + + ArbChainID gets the rollup's unique chain identifier + + + + arbOSVersion() + + + + Interface + + + + + Implementation + + + ArbOSVersion gets the current ArbOS version + + + + getStorageGasAvailable() + + + + Interface + + + + + Implementation + + + GetStorageGasAvailable returns 0 since Nitro has no concept of storage gas + + + + isTopLevelCall() + + + + Interface + + + + + Implementation + + + IsTopLevelCall checks if the call is top-level (deprecated) + + + + mapL1SenderContractAddressToL2Alias() + + + + Interface + + + + + Implementation + + + MapL1SenderContractAddressToL2Alias gets the contract's L2 alias + + + + wasMyCallersAddressAliased() + + + + Interface + + + + + Implementation + + + WasMyCallersAddressAliased checks if the caller's caller was aliased + + + + myCallersAddressWithoutAliasing() + + + + Interface + + + + + Implementation + + + + MyCallersAddressWithoutAliasing gets the caller's caller without any potential aliasing + + + + + withdrawEth() + + + + Interface + + + + + Implementation + + + WithdrawEth send paid eth to the destination on L1 + + + + sendTxToL1() + + + + Interface + + + + + Implementation + + + SendTxToL1 sends a transaction to L1, adding it to the outbox + + + + sendMerkleTreeState() + + + + Interface + + + + + Implementation + + + + SendMerkleTreeState gets the root, size, and partials of the outbox Merkle tree state + (caller must be the 0 address) + + + @@ -21,11 +291,11 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- undefined + L2ToL1Tx Interface @@ -33,7 +303,7 @@ Implementation @@ -43,11 +313,11 @@
- undefined + L2ToL1Transaction Interface @@ -55,7 +325,7 @@ Implementation @@ -67,11 +337,11 @@
- undefined + SendMerkleUpdate Interface @@ -79,7 +349,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasm.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasm.mdx index 878c463a57..4975d12e07 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasm.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasm.mdx @@ -7,7 +7,448 @@ Description
+ activateProgram() + + + Interface + + + + Implementation + + Compile a wasm program with the latest instrumentation
+ stylusVersion() + + + Interface + + + + Implementation + + Gets the latest stylus version
+ codehashVersion() + + + Interface + + + + Implementation + + Gets the stylus version that program with codehash was most recently compiled with
+ codehashKeepalive() + + + Interface + + + + Implementation + + Extends a program's expiration date (reverts if too soon)
+ codehashAsmSize() + + + Interface + + + + Implementation + + Gets a program's asm size in bytes
+ programVersion() + + + Interface + + + + Implementation + + Gets the stylus version that program at addr was most recently compiled with
+ programInitGas() + + + Interface + + + + Implementation + + Gets the cost to invoke the program
+ programMemoryFootprint() + + + Interface + + + + Implementation + + Gets the footprint of program at addr
+ programTimeLeft() + + + Interface + + + + Implementation + + Gets returns the amount of time remaining until the program expires
+ inkPrice() + + + Interface + + + + Implementation + + Gets the amount of ink 1 gas buys
+ maxStackDepth() + + + Interface + + + + Implementation + + Gets the wasm stack size limit
+ freePages() + + + Interface + + + + Implementation + + Gets the number of free wasm pages a tx gets
+ pageGas() + + + Interface + + + + Implementation + + Gets the base cost of each additional wasm page
+ pageRamp() + + + Interface + + + + Implementation + + Gets the ramp that drives exponential memory costs
+ pageLimit() + + + Interface + + + + Implementation + + Gets the maximum initial number of pages a wasm may allocate
+ minInitGas() + + + Interface + + + + Implementation + + Gets the minimum costs to invoke a program
+ initCostScalar() + + + Interface + + + + Implementation + + Gets the linear adjustment made to program init costs
+ expiryDays() + + + Interface + + + + Implementation + + Gets the number of days after which programs deactivate
+ keepaliveDays() + + + Interface + + + + Implementation + + Gets the age a program must be to perform a keepalive
+ blockCacheSize() + + + Interface + + + + Implementation + + Gets the number of extra programs ArbOS caches during a given block.
@@ -21,11 +462,11 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- undefined + ProgramActivated Interface @@ -33,7 +474,7 @@ Implementation @@ -43,11 +484,11 @@
- undefined + ProgramLifetimeExtended Interface @@ -55,7 +496,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasmCache.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasmCache.mdx index 359384999a..98dd3de021 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasmCache.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbWasmCache.mdx @@ -7,7 +7,145 @@ Description
+ isCacheManager() + + + Interface + + + + Implementation + + See if the user is a cache manager owner.
+ allCacheManagers() + + + Interface + + + + Implementation + + Retrieve all authorized address managers.
+ cacheCodehash() + + + Interface + + + + Implementation + + Deprecated: replaced with CacheProgram.
+ cacheProgram() + + + Interface + + + + Implementation + + + Caches all programs with a codehash equal to the given address. Caller must be a cache + manager or chain owner. +
+ evictCodehash() + + + Interface + + + + Implementation + + + Evicts all programs with the given codehash. Caller must be a cache manager or chain owner. +
+ codehashIsCached() + + + Interface + + + + Implementation + + Gets whether a program is cached. Note that the program may be expired.
@@ -21,11 +159,11 @@ - + + + + + + + +
- undefined + UpdateProgramCache Interface @@ -33,7 +171,7 @@ Implementation diff --git a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbosTest.mdx b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbosTest.mdx index bf2556317b..6917a6a040 100644 --- a/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbosTest.mdx +++ b/docs/for-devs/dev-tools-and-resources/partials/precompile-tables/_ArbosTest.mdx @@ -7,5 +7,28 @@ Description
+ burnArbGas() + + + Interface + + + + Implementation + + BurnArbGas unproductively burns the amount of L2 ArbGas
diff --git a/docs/for-devs/third-party-docs/contribute.mdx b/docs/for-devs/third-party-docs/contribute.mdx index 35546ddc8c..4856509bcd 100644 --- a/docs/for-devs/third-party-docs/contribute.mdx +++ b/docs/for-devs/third-party-docs/contribute.mdx @@ -4,31 +4,53 @@ description: "Discover how to contribute third-party resources to Arbitrum's doc sidebar_position: 0 --- -**Third-party docs** are documents that help readers of Arbitrum docs use other products, services, and protocols (like the ones listed in the [Arbitrum portal](https://portal.arbitrum.io/)) with Arbitrum products. +Third-party docs are articles that help readers of Arbitrum docs use other products, services, and protocols (like the ones listed in the [Arbitrum portal](https://portal.arbitrum.io/)). These documents are usually authored by partner teams, but can be authored by anyone. They follow the same general process that [core docs](/for-devs/contribute#add-a-new-core-document) follow, in addition to the following guidelines: -1. **Eligibility** +## 1.Eligibility + - Third-party docs are intended to support products listed in the [Arbitrum portal](https://portal.arbitrum.io/), or infrastructure and services that those products use. - To submit your project to the Arbitrum portal, [apply using this Google form](@@portalApplicationForm=https://docs.google.com/forms/d/e/1FAIpQLSc_v8j7sc4ffE6U-lJJyLMdBoIubf7OIhGtCqvK3cGPGoLr7w/viewform@@). -2. **Purpose** - - The purpose of our `Third-party docs` sections is to **_meet Arbitrum developer (or user) demand for guidance that helps them use non-Arbitrum products with Arbitrum products_**. + +## 2.Purpose + + - The purpose of our `Third-party docs` sections is to_meet Arbitrum developer (or user) demand for guidance that helps them use non-Arbitrum products with Arbitrum products. - It's _not_ meant to drive traffic to your product (although that may happen); it's meant to solve problems that our readers are actually facing, which are directly related to Arbitrum products. -3. **Maintenance expectations** + +## 3.Maintenance expectations + - Offchain Labs can't commit to maintaining third-party docs, but we make it easy for you to maintain them. - - Ensure that your document's YAML frontmatter contains a `third_party_content_owner` property, with the Github username of the designated maintainer. This person will be assigned to your document's issues and PRs, and will be expected to resolve them in a timely manner. -4. **Organization** - - Third-party docs are organized within the `Third-party content` node located at the bottom of each documentation section's sidebar. + - Ensure that your document's YAML frontmatter contains a `third_party_content_owner` property, with the GitHub username of the designated maintainer. This person will be assigned to your document's issues and PRs, and will be expected to resolve them in a timely manner. + +## 4.Organization + + - Third-party docs are organized within the `Third-party content` node located at the bottom of each documentation section's sidebar in path `docs/for-devs/third-party-docs//.mdx` - This node's content is grouped by third-party product. If/when this becomes unwieldy, we'll begin grouping products by [portal](https://portal.arbitrum.io/) category. -5. **Limited document types** - - To manage our team's limited capacity, third-party documents must be either **_Quickstarts_**, **_How-tos_**, or **_Concepts_**. See [document types](/for-devs/contribute#document-type-conventions). -6. **Incremental contributions: One document at a time, procedures first** + +## 5.Limited document types + + - To manage our team's limited capacity, third-party documents must be either_Quickstarts_,_How-tos_, or_Concepts_. See [document types](/for-devs/contribute#document-type-conventions). + +## 6.Incremental contributions: One document at a time, procedures first + - Third-party document PRs should contain at most one new document. - - Any given product's first docs contribution should be a **_Quickstart_** or **_How-to_**. + - Any given product's first docs contribution should be a_Quickstart_ or_How-to_. - Additional documents will be merged only if we can verify that our readers are deriving value from your initial contribution. - The way that we verify this isn't yet formally established, and it isn't publicly disclosed. Our current approach combines a number of objective and subjective measures. -7. **Policy acknowledgment** + +## 7.Policy acknowledgment + - Before merging third-party documentation PRs, we ask contributors to acknowledge that they've read, understood, and agree with the following policies: - 1. **Content ownership**: As the author, you retain ownership of and responsibility for the content you contribute. You're free to use your content in any way you see fit outside of Arbitrum's docs. Remember that when contributing content to our documentation, you must ensure you have the necessary rights to do so, and that the content doesn't infringe on the intellectual property rights of others. - 2. **License for use**: By contributing your content to our documentation, you grant Offchain Labs a non-exclusive, royalty-free license to use, reproduce, adapt, translate, distribute, and display the content in our documentation. This allows us to integrate your content into our docs and make it available to all users. - 3. **Right to modify or remove**: Offchain Labs reserves the right to modify or remove third-party content from our documentation at any time. This might be necessary due to a range of reasons, such as content becoming outdated, receiving very low pageviews over an extended period, or misalignment with our guidelines or goals. + +### 1.Content ownership + +As the author, you retain ownership of and responsibility for the content you contribute. You're free to use your content in any way you see fit outside of Arbitrum's docs. Remember that when contributing content to our documentation, you must ensure you have the necessary rights to do so, and that the content doesn't infringe on the intellectual property rights of others. + +### 2.License for use + +By contributing your content to our documentation, you grant Offchain Labs a non-exclusive, royalty-free license to use, reproduce, adapt, translate, distribute, and display the content in our documentation. This allows us to integrate your content into our docs and make it available to all users. + +### 3.Right to modify or remove + +Offchain Labs reserves the right to modify or remove third-party content from our documentation at any time. This might be necessary due to a range of reasons, such as content becoming outdated, receiving very low page views over an extended period, or misalignment with our guidelines or goals. diff --git a/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/01-fast-withdrawals.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/01-fast-withdrawals.mdx index 0f7028a03c..8522360b04 100644 --- a/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/01-fast-withdrawals.mdx +++ b/docs/launch-arbitrum-chain/02-configure-your-chain/advanced-configurations/01-fast-withdrawals.mdx @@ -192,7 +192,8 @@ The following parameters need to be configured in those nodes. | Option | Description | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `--node.staker.enable-fast-confirmation=true` | Enables fast withdrawals in the validator node | +| `--node.bold.enable-fast-confirmation=true` | Enables fast withdrawals in the validator node (Bold validator only) | +| `--node.staker.enable-fast-confirmation=true` | Enables fast withdrawals in the validator node (Legacy validator only) | | `--node.staker.make-assertion-interval=0h15m0s` | Since assertions need to be created for them to be confirmed, the minimum interval to create these assertions should be set to an amount close to the `minimumAssertionPeriod` defined in the Rollup contract. Modify `0h15m0s` to the configured value. | :::note diff --git a/docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx b/docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx similarity index 100% rename from docs/launch-arbitrum-chain/how-tos/arbitrum-chain-finality.mdx rename to docs/launch-arbitrum-chain/02-configure-your-chain/common-configurations/arbitrum-chain-finality.mdx diff --git a/docs/launch-arbitrum-chain/migrate-between-raases.mdx b/docs/launch-arbitrum-chain/migrate-between-raases.mdx new file mode 100644 index 0000000000..331b64dc6d --- /dev/null +++ b/docs/launch-arbitrum-chain/migrate-between-raases.mdx @@ -0,0 +1,65 @@ +--- +title: 'Migrate between RaaSes' +sidebar_label: 'Migrate between RaaSes' +description: 'Learn how to migrate your chain from a RaaS provider' +sidebar_position: '2' +author: 'Lam' +sme: '' +editor: 'anegg0' +target_audience: 'Chain owners and operators using RaaS providers' +--- + +import { VanillaAdmonition } from '@site/src/components/VanillaAdmonition/'; + +## Overview of the provider migration process + +A migration between RaaS providers is an operational handoff, not a redeployment of the rollup. With planning, downtime can be kept to minutes, while the total transfer spans several days for infrastructure, partners, and communications. The new operator must stand up shadow infrastructure, replicate data, and pass health checks before the DNS and Batch‑poster handover. + + + +This document is provided for informational purposes only and does not constitute an end-to-end guide for executing the migration. An infrastructure migration between RaaS providers will require significant planning between the two providers. Offchain Labs is unable to support a third party in an infrastructure handoff. OCL does not have special knowledge or a private “fast path.” This document provides the extent of our guidance. All questions about handoff planning should be between the two RaaS teams. We can provide [introductions to RaaSes](https://docs.arbitrum.io/launch-arbitrum-chain/third-party-integrations/third-party-providers#rollup-as-a-service-raas-providers). + + + +#### Who should read this doc? + +Chain owners and operators. + +#### What are the must-transfer items? + +Sequencer runtime, batch poster, staker/validators, DAC signer +set for AnyTrust, RPC/explorer domains, alerting/monitoring credentials. Your RaaS may have other requirements. + +#### Do chain ID or L1 contracts change? + +Normally, no, the chain will stay on the same chain ID and L1 rollup contracts. + +#### Who coordinates ecosystem partners? + +Chain Owner. Typical partners include oracles, indexers, +bridges, wallets, analytics, and custody, among others. + +#### How long is the downtime? + +With planning, you can keep downtime to minutes. RPC nodes will stop serving write transactions like `eth_sendRawTransaction` a few minutes before downtime. + +The full transfer (infra spin-up, partner handovers, comms) typically spans several days. + +#### What should we monitor during handover? + +Retryables creation, batch posting cadence, Assertion Confirmation, base fee, sequencer health, DAC signer liveness. Please see '[Monitoring Tools and Considerations](https://docs.arbitrum.io/launch-arbitrum-chain/maintain-your-chain/monitoring-tools-and-considerations)’ for more information. + +#### What legal/administrative assets need to move? + +Domains (RPC/explorer), CDN accounts, SSL certificates, and GitHub/S3 buckets that host snapshots. Your RaaS provider may have different requirements. + +#### What is the process involved in migrating an existing Arbitrum (Orbit) chain from one RaaS operator to another? + +Chain migration will require close coordination between the old and new chain operators. With proper planning and coordination, a migration can result in only a few minutes of downtime, with the total transfer process occurring over several days. + +An end-to-end migration will require: + +1. The new operator will spin up appropriate nodes & infrastructure (e.g., validators, sequencers) +2. Ownership transfer of any on-chain contracts. +3. Ownership transfer of any important community assets / URLs (e.g., RPC or explorer URLs) +4. Updating onchain parameters responsible for identifying nodes (e.g., Validator whitelist) diff --git a/docs/learn-more/contribute.mdx b/docs/learn-more/contribute.mdx deleted file mode 100644 index 4f7c3501cf..0000000000 --- a/docs/learn-more/contribute.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: 'Contribute docs' -description: "Learn how to contribute to Arbitrum's documentation" ---- - -import ContributeDocsPartial from '../partials/_contribute-docs-partial.mdx'; - - diff --git a/docs/partials/_glossary-partial.mdx b/docs/partials/_glossary-partial.mdx index b06031cc8e..b4355922bb 100644 --- a/docs/partials/_glossary-partial.mdx +++ b/docs/partials/_glossary-partial.mdx @@ -1,588 +1,404 @@ +### Active Validator {#active-validator} + +A bonded [Validator](/intro/glossary#validator) that makes disputable assertions to advance the state of an Arbitrum chain or to challenge the validity of others' assertions. (Not to be confused with the [Sequencer](/intro/glossary#sequencer).) + ### Address Alias {#address-alias} -

DCd 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