diff --git a/arbitrum-docs/audit-reports.mdx b/arbitrum-docs/audit-reports.mdx index 062e26736..fefc0d943 100644 --- a/arbitrum-docs/audit-reports.mdx +++ b/arbitrum-docs/audit-reports.mdx @@ -1,15 +1,15 @@ # Security Audit Reports -- [Code4rena, 6/17/2024: Arbitrum BoLD](https://code4rena.com/reports/2024-05-arbitrum-foundation) - -- [Trail of Bits, 6/10/2024: Arbitrum Stylus](https://github.com/trailofbits/publications/blob/master/reviews/2024-05-offchain-arbitrumstylus-securityreview.pdf) - -- [Trail of Bits, 5/2/2024: Arbitrum BoLD & Delay Buffer](https://github.com/trailofbits/publications/blob/master/reviews/2024-04-offchainbold-securityreview.pdf) - -- [Trail of Bits, 1/6/2023: Governance, Token Bridge ](https://github.com/ArbitrumFoundation/governance/blob/master/audits/trail_of_bits_governance_report_1_6_2023.pdf) - -- [Trail of Bits, 10/10/2022: Nitro Node & Core Contracts](https://github.com/OffchainLabs/nitro/blob/master/audits/Trail_Of_Bits_Nitro_10_2022.pdf) - -- [ ConsenSys Diligence, 6/24/2022: Nitro Node & Core Contracts](https://github.com/OffchainLabs/nitro/blob/master/audits/ConsenSys_Diligence_Nitro_Contracts_5_2022.pdf) - -- [ ConsenSys Diligence, 11/5/2021: Core Contracts, Token Bridge](https://github.com/OffchainLabs/nitro/blob/master/audits/ConsenSys_Diligence_Arbitrum_Contracts_11_2021.pdf) +| Auditor | Audit date | Audited code | View report | +|-------------------------|------------|------------------------------------------------|-----------------------------------------------------------------------------------------| +| **ConsenSys Diligence** | 11/05/2021 | Core Contracts, Token Bridge | [view](hosted-audit-reports/ConsenSys_Diligence_Arbitrum_Contracts_11_2021.pdf) | +| **ConsenSys Diligence** | 06/24/2022 | Nitro Node & Core Contracts | [view](hosted-audit-reports/ConsenSys_Diligence_Nitro_Contracts_5_2022.pdf) | +| **Trail of Bits** | 10/10/2022 | Nitro Node & Core Contracts | [view](hosted-audit-reports/Trail_Of_Bits_Nitro_10_2022.pdf) | +| **Trail of Bits** | 01/06/2023 | Governance& Token Bridge | [view](hosted-audit-reports/trail_of_bits_governance_report_1_6_2023.pdf) | +| **chainsecurity** | 03/20/2024 | Nova Fee Router Updates (ArbOS 31) | [view](https://www.chainsecurity.com/security-audit/offchain-labs-fund-distribution) | +| **Trail of Bits** | 05/02/2024 | Arbitrum BoLD & Delay Buffer | [view](hosted-audit-reports/2024-04-offchainbold-securityreview.pdf) | +| **Code4rena** | 06/17/2024 | Arbitrum BoLD: Public Audit Competition Report | [view](https://code4rena.com/reports/2024-05-arbitrum-foundation) | +| **Trail of Bits** | 06/10/2024 | Arbitrum Stylus | [view](hosted-audit-reports/2024-05-offchain-arbitrumstylus-securityreview.pdf) | +| **Trail of Bits** | 07/24/2024 | Arbos30 Nitro upgrade | [view](hosted-audit-reports/2024-04-offchain-arbos-30-nitro-upgrade-securityreview.pdf) | +| **Trail of Bits** | 07/24/2024 | Arbos 31 | [view](hosted-audit-reports/2024-04-offchain-arbos-31-securityreview.pdf) | +| **Trail of Bits** | 07/24/2024 | l1-l3-teleporter | [view](hosted-audit-reports/2024-04-offchain-l1-l3-teleporter-securityreview.pdf) | diff --git a/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.md b/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.md index 42920b9e6..92afee552 100644 --- a/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.md +++ b/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/01-comparison-overview.md @@ -10,7 +10,7 @@ content_type: concept Arbitrum is designed to be as compatible and consistent with Ethereum as possible, from its high-level RPCs to its low-level bytecode and everything in between. Decentralized app (dApp) developers with experience building on Ethereum will likely find that little-to-no new specific knowledge is required to build on Arbitrum. -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 these differences, with links to the relevant pages when needed. +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 diff --git a/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.md b/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.md index b06304b04..cdd477129 100644 --- a/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.md +++ b/arbitrum-docs/build-decentralized-apps/arbitrum-vs-ethereum/02-block-numbers-and-time.md @@ -1,7 +1,7 @@ --- -title: 'Block numbers and time' +title: 'Block gas limit, numbers and time' sidebar_position: 2 -description: This concept page provides information about the differences between Arbitrum and Ethereum in terms of block numbers and timing, so developers can easily understand what to expect when deploying to Arbitrum +description: This concept page provides information about the differences between Arbitrum and Ethereum in terms of block gas limit, numbers and timing, so developers can easily understand what to expect when deploying to Arbitrum author: dzgoldman target_audience: developers who want to build on Arbitrum content_type: concept @@ -15,9 +15,17 @@ With the release of Arbitrum Orbit, Arbitrum chains can now be L2s that settle t As in Ethereum, Arbitrum clients submit transactions, and the system executes those transactions at some later time. In Arbitrum, clients submit transactions by posting messages to the Ethereum chain, either [through the sequencer](/how-arbitrum-works/sequencer.md#happycommon-case-sequencer-is-live-and-well-behaved) or via the chain's [delayed inbox](/how-arbitrum-works/sequencer.md#unhappyuncommon-case-sequencer-isnt-doing-its-job). -Once in the chain's core inbox contract, transactions are processed in order. Generally, some time will elapse between the time when a message is put into the inbox (and timestamped) and the time when the contract processes the message and carries out the transaction requested by the message. +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. -In this page we describe what does this mechanism mean for the block numbers and the time assumptions of the transactions submitted to Arbitrum. +Additionally, since the calldata of Arbitrum transactions (or the DAC certificate on AnyTrustchains) is posted to Ethereum, the gas paid when executing them includes an L1 component to cover the costs of the batch poster. + +This page describes what this mechanism means for the block gas limit, block numbers, and the time assumptions of the transactions submitted to Arbitrum. + +## Block gas limit + +When submitting a transaction to Arbitrum, the user is required to cover the execution cost on Arbitrum and the relative cost of posting its calldata to Ethereum. Arbitrum manages this [2-dimensional fee structure](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9) by adjusting the transaction's gas limit to cover the L1 posting costs. Hence, a given transaction might show a very high value as the gas limit. + +Then, the gas limit of an Arbitrum block is set as the sum of the total gas limit (execution + adjustment of the L1 costs) of all transactions. Because of that, the `gasLimit` shown when querying a block will likely be higher than the effective block gas limit (32 million). To check the actual gas used for execution on a specific block, we can look at the `gasUsed` field. ## Block numbers: Arbitrum vs. Ethereum diff --git a/arbitrum-docs/build-decentralized-apps/reference/01-node-providers.md b/arbitrum-docs/build-decentralized-apps/reference/01-node-providers.md index 25c2aa08f..da4e615de 100644 --- a/arbitrum-docs/build-decentralized-apps/reference/01-node-providers.md +++ b/arbitrum-docs/build-decentralized-apps/reference/01-node-providers.md @@ -15,11 +15,11 @@ Complete [this form](@portalApplicationForm@) , if you'd like to see your projec This section provides an overview of the available public RPC endpoints for different Arbitrum chains and necessary details to interact with them. -| Name | RPC Url(s) | Chain ID | Block explorer | Underlying chain | Tech stack | Sequencer feed URL | Sequencer endpoint⚠️ | -| -------------------------- | -------------------------------------- | -------- | -------------------------------------- | ---------------- | ---------------- | ------------------------------------- | ------------------------------------------------ | -| Arbitrum One | https://arb1.arbitrum.io/rpc | 42161 | https://arbiscan.io/ | Ethereum | Nitro (Rollup) | wss://arb1.arbitrum.io/feed | https://arb1-sequencer.arbitrum.io/rpc | -| Arbitrum Nova | https://nova.arbitrum.io/rpc | 42170 | https://nova.arbiscan.io/ | Ethereum | Nitro (AnyTrust) | wss://nova.arbitrum.io/feed | https://nova-sequencer.arbitrum.io/rpc | -| Arbitrum Sepolia (Testnet) | https://sepolia-rollup.arbitrum.io/rpc | 421614 | https://sepolia.arbiscan.io | Sepolia | Nitro (Rollup) | wss://sepolia-rollup.arbitrum.io/feed | https://sepolia-rollup-sequencer.arbitrum.io/rpc | +| Name | RPC Url(s) | Chain ID | Block explorer | Underlying chain | Tech stack | Sequencer feed URL | Sequencer endpoint⚠️ | +| -------------------------- | -------------------------------------- | -------- | --------------------------- | ---------------- | ---------------- | ------------------------------------- | ------------------------------------------------ | +| Arbitrum One | https://arb1.arbitrum.io/rpc | 42161 | https://arbiscan.io/ | Ethereum | Nitro (Rollup) | wss://arb1.arbitrum.io/feed | https://arb1-sequencer.arbitrum.io/rpc | +| Arbitrum Nova | https://nova.arbitrum.io/rpc | 42170 | https://nova.arbiscan.io/ | Ethereum | Nitro (AnyTrust) | wss://nova.arbitrum.io/feed | https://nova-sequencer.arbitrum.io/rpc | +| Arbitrum Sepolia (Testnet) | https://sepolia-rollup.arbitrum.io/rpc | 421614 | https://sepolia.arbiscan.io | Sepolia | Nitro (Rollup) | wss://sepolia-rollup.arbitrum.io/feed | https://sepolia-rollup-sequencer.arbitrum.io/rpc | :::caution @@ -44,7 +44,7 @@ Alternatively, to interact with public Arbitrum chains, you can rely on many of | Provider | Arb One? | Arb Nova? | Arb Sepolia? | Websocket? | | ------------------------------------------------------------------------------------ | -------- | --------- | ------------ | ---------- | | [1RPC](https://docs.1rpc.io/overview/supported-networks#arbitrum) | ✅ | | | | -| [Alchemy](https://docs.alchemy.com/reference/arbitrum-api-quickstart) | ✅ | | ✅ | ✅ | +| [Alchemy](https://docs.alchemy.com/reference/arbitrum-api-quickstart) | ✅ | ✅ | ✅ | ✅ | | [Allnodes](https://arbitrum.publicnode.com) | ✅ | ✅ | | ✅ | | [Ankr](https://www.ankr.com/docs/rpc-service/chains/chains-list/#arbitrum) | ✅ | | | ✅ | | [Blast](https://blastapi.io/public-api/arbitrum) | ✅ | ✅ | | ✅ | diff --git a/arbitrum-docs/for-devs/third-party-docs/TheGraph/thegraph.md b/arbitrum-docs/for-devs/third-party-docs/TheGraph/thegraph.md new file mode 100644 index 000000000..ca29c6a86 --- /dev/null +++ b/arbitrum-docs/for-devs/third-party-docs/TheGraph/thegraph.md @@ -0,0 +1,185 @@ +# The Graph + +Getting historical data on a smart contract can be frustrating when building a dApp. [The Graph](https://thegraph.com/) provides an easy way to query smart contract data through APIs known as subgraphs, which utilize `GraphQL`.  The Graph's infrastructure relies on a decentralized network of indexers, enabling your dApp to become truly decentralized. + +## Quick start + +These subgraphs only take a few minutes to set up and get running. To get started, follow these three steps: + +1. [Initialize your subgraph project](#1-initialize-your-subgraph-project) +2. [Deploy & publish](#2-deploy--publish) +3. [Query from your dApp](#sample-query) + +Pricing: **All developers receive 100K free monthly queries on the decentralized network**. After these free queries, you only pay based on usage at $4 for every 100K queries. + +Here's a step by step walkthrough: + +## 1. Initialize your subgraph project + +### Create a subgraph on Subgraph Studio⁠ + +Go to the [Subgraph Studio](https://thegraph.com/studio/) and connect your wallet. Once your wallet is connected, you can begin by clicking "Create a Subgraph". Please choose a good name for the subgraph: this name can't be edited later. It is recommended to use Title Case: "Subgraph Name Chain Name." + +![Create a Subgraph](https://lh7-us.googleusercontent.com/docsz/AD_4nXf8OTdwMxlKQGKzIF_kYR7NPKeh9TmWnZBYxb7ft_YbdOdx_VVtbp6PslN7N1KGUzNpIDCmaXppdrllM1cw_J4L8Na03BXOWzJTK1POCve0nkRjQYgWJ60QHAdtQ4Niy83SMM8m0F0f-N-AJj4PDqDPlA5M?key=fnI6SyFgXU9SZRNX5C5vPQ) + +You will then land on your subgraph's page. All the CLI commands you need will be visible on the right side of the page: + +![CLI commands](https://lh7-us.googleusercontent.com/docsz/AD_4nXe3YvCxiOH_LupSWe8zh9AmP-VrV4PlOq3f7Ix6hNlBUYcANUFuLuVIWR74OGiBs0nrugTyT0v3o6RPmTsgHONdv_ZJNWtcDWEkRntXPHlQGFcqmEBa-D6j4aoIPzUKYdOJMVUPu8O3fwjdZ4IaXXZoTzY?key=fnI6SyFgXU9SZRNX5C5vPQ) + +### Install the Graph CLI⁠ + +On your local machine, run the following: + +```shell +npm install -g @graphprotocol/graph-cli +``` + +### Initialize your Subgraph⁠ + +You can copy this directly from your subgraph page to include your specific subgraph slug: + +```shell +graph init --studio +``` + +You'll be prompted to provide some info on your subgraph like this: + +![cli sample](https://lh7-us.googleusercontent.com/docsz/AD_4nXdTAUsUb5vbs3GtCrhKhuXM1xYoqqooYTxw6lfJfYtLJNP8GKVOhTPmjxlM1b6Qpx-pXNVOzRuc8BL12wZXqy4MIj8ja0tp15znfuJD_Mg84SSNj3JpQ4d31lNTxPYnpba4UOzZx8pmgOIsbI7vCz70v9gC?key=fnI6SyFgXU9SZRNX5C5vPQ) + +Simply have your contract verified on the block explorer, and the CLI will automatically obtain the ABI and set up your subgraph. The default settings will generate an entity for each event. + +## 2. Deploy & publish + +### Deploy to Subgraph Studio⁠ + +First, run these commands in your terminal + +```shell +graph codegen +graph build +``` + +Then, invoke these commands to authenticate and deploy your subgraph. You can copy these commands directly from your subgraph's page in Studio to include your specific deploy key and subgraph slug: + +```shell +graph auth --studio +graph deploy --studio +``` + +You will be asked for a version label. You can enter something like `V0.0.1`, but you're free to choose the format. + +### Test your subgraph⁠ + +You can test your subgraph by making a sample query in the playground section. The Details tab will show you an API endpoint. You can use that endpoint to test from your dApp. + +![Playground](https://lh7-us.googleusercontent.com/docsz/AD_4nXf3afwSins8_eO7BceGPN79VvwolDxmFNUnkPk0zAJCaUA-3-UAAjVvrMzwr7q9vNYWdrEUNgm2De2VfQpWauiT87RkFc-cVfoPSsQbYSgsmwhyY1-tpPdv2J1H4JAMq70nfWBhb8PszZBFjsbDAaJ5eto?key=fnI6SyFgXU9SZRNX5C5vPQ) + +### Publish your subgraph to The Graph's decentralized network + +Once your subgraph is ready for production, you can publish it to the decentralized network. On your subgraph's page in Subgraph Studio, click on the Publish button: + +![publish button](https://edgeandnode.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fa7d6afae-8784-4b15-a90e-ee8f6ee007ba%2F2f9c4526-123d-4164-8ea8-39959c8babbf%2FUntitled.png?table=block&id=37005371-76b4-4780-b044-040a570e3af6&spaceId=a7d6afae-8784-4b15-a90e-ee8f6ee007ba&width=1420&userId=&cache=v2) + +Before you can query your subgraph, Indexers need to begin serving queries on it. In order to streamline this process, you can curate your own subgraph using `$GRT`. + +When publishing, you'll see the option to curate your subgraph. As of May 2024, it is recommended that you curate your own subgraph with at least 3,000 `$GRT` to ensure that it is indexed and available for querying as soon as possible. + +![Publish screen](https://lh7-us.googleusercontent.com/docsz/AD_4nXerUr-IgWjwBZvp9Idvz5hTq8AFB0n_VlXCzyDtUxKaCTANT4gkk-2O77oW-a0ZWOh3hnqQsY7zcSaLeCQin9XU1NTX1RVYOLFX9MuVxBEqcMryqgnGQKx-MbDnOWKuMoLBhgyVWQereg3cdWtCPcTQKFU?key=fnI6SyFgXU9SZRNX5C5vPQ) + +## 3. Query your Subgraph + +Congratulations! You can now query your subgraph on the decentralized network! + +You can start querying any subgraph on the decentralized network by passing a `GraphQL` query into the subgraph's query URL, which can be found at the top of its Explorer page. + +Here's an example from the [CryptoPunks Ethereum subgraph](https://thegraph.com/explorer/subgraphs/HdVdERFUe8h61vm2fDyycHgxjsde5PbB832NHgJfZNqK) by Messari: + +![Query URL](https://lh7-us.googleusercontent.com/docsz/AD_4nXebivsPOUjPHAa3UVtvxoYTFXaGBao9pQOAJvFK0S7Uv0scfL6TcTVjmNCzT4DgsIloAQyrPTCqHjFPtmjyrzoKkfSeV28FjS32F9-aJJm0ILAHey2gqMr7Seu4IqPz2d__QotsWG3OKv2dEghiD74eypzs?key=fnI6SyFgXU9SZRNX5C5vPQ) + +The query URL for this subgraph is: + +```shell +https://gateway-arbitrum.network.thegraph.com/api/**[api-key]**/subgraphs/id/HdVdERFUe8h61vm2fDyycHgxjsde5PbB832NHgJfZNqK +``` + +Now, you simply need to  fill in your own API Key to start sending `GraphQL` queries to this endpoint. + +### Getting your own API key + +![API keys](https://lh7-us.googleusercontent.com/docsz/AD_4nXdz7H8hSRf2XqrU0jN3p3KbmuptHvQJbhRHOJh67nBfwh8RVnhTsCFDGA_JQUFizyMn7psQO0Vgk6Vy7cKYH47OyTq5PqycB0xxLyF4kSPsT7hYdMv2MEzAo433sJT6VlQbUAzgPnSxKI9a5Tn3ShSzaxI?key=fnI6SyFgXU9SZRNX5C5vPQ) + +In Subgraph Studio, you'll see the "API Keys" menu at the top of the page. Here, you can create API Keys. + +## Appendix + +### Sample query + +This query shows the most expensive CryptoPunks sold. + +```graphql +{ + trades(orderBy: priceETH, orderDirection: desc) { + priceETH + tokenId + } +} +``` + +Passing this into the query URL returns this result: + +```graphql +{ + "data": { + "trades": [ + { + "priceETH": "124457.067524886018255505", + "tokenId": "9998" + }, + { + "priceETH": "8000", + "tokenId": "5822" + }, +// ... +``` + +💡 Trivia: Looking at the top sales on [CryptoPunks website](https://cryptopunks.app/cryptopunks/topsales) it looks like the top sale is Punk #5822, not #9998. Why? Because they censored the flash-loan sale that happened. + +### Sample code + +```js +const axios = require('axios'); + +const graphqlQuery = `{ + trades(orderBy: priceETH, orderDirection: desc) { + priceETH + tokenId + } +}`; +const queryUrl = + 'https://gateway-arbitrum.network.thegraph.com/api/[api-key]/subgraphs/id/HdVdERFUe8h61vm2fDyycHgxjsde5PbB832NHgJfZNqK'; + +const graphQLRequest = { + method: 'post', + url: queryUrl, + data: { + query: graphqlQuery, + }, +}; + +// Send the `GraphQL` query +axios(graphQLRequest) + .then((response) => { + // Handle the response here + const data = response.data.data; + console.log(data); + }) + .catch((error) => { + // Handle any errors + console.error(error); + }); +``` + +### Additional resources: + +- To explore all the ways you can optimize & customize your subgraph for better performance, read more about [creating a subgraph here](https://thegraph.com/docs/en/developing/creating-a-subgraph/). +- You can find more information in our article about [querying data from your subgraph](https://thegraph.com/docs/en/querying/querying-the-graph/). diff --git a/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-30-nitro-upgrade-securityreview.pdf b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-30-nitro-upgrade-securityreview.pdf new file mode 100644 index 000000000..39f9ead05 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-30-nitro-upgrade-securityreview.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-31-securityreview.pdf b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-31-securityreview.pdf new file mode 100644 index 000000000..4c86f982c Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-arbos-31-securityreview.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/2024-04-offchain-l1-l3-teleporter-securityreview.pdf b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-l1-l3-teleporter-securityreview.pdf new file mode 100644 index 000000000..3a7c30b06 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/2024-04-offchain-l1-l3-teleporter-securityreview.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/2024-04-offchainbold-securityreview.pdf b/arbitrum-docs/hosted-audit-reports/2024-04-offchainbold-securityreview.pdf new file mode 100644 index 000000000..21290f4b5 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/2024-04-offchainbold-securityreview.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/2024-05-offchain-arbitrumstylus-securityreview.pdf b/arbitrum-docs/hosted-audit-reports/2024-05-offchain-arbitrumstylus-securityreview.pdf new file mode 100644 index 000000000..66c10c6cc Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/2024-05-offchain-arbitrumstylus-securityreview.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Arbitrum_Contracts_11_2021.pdf b/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Arbitrum_Contracts_11_2021.pdf new file mode 100644 index 000000000..4e93ced01 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Arbitrum_Contracts_11_2021.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Nitro_Contracts_5_2022.pdf b/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Nitro_Contracts_5_2022.pdf new file mode 100644 index 000000000..7fb9bc8f6 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/ConsenSys_Diligence_Nitro_Contracts_5_2022.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/Trail_Of_Bits_Nitro_10_2022.pdf b/arbitrum-docs/hosted-audit-reports/Trail_Of_Bits_Nitro_10_2022.pdf new file mode 100644 index 000000000..06a051692 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/Trail_Of_Bits_Nitro_10_2022.pdf differ diff --git a/arbitrum-docs/hosted-audit-reports/trail_of_bits_governance_report_1_6_2023.pdf b/arbitrum-docs/hosted-audit-reports/trail_of_bits_governance_report_1_6_2023.pdf new file mode 100644 index 000000000..4c62ab4a1 Binary files /dev/null and b/arbitrum-docs/hosted-audit-reports/trail_of_bits_governance_report_1_6_2023.pdf differ diff --git a/arbitrum-docs/how-arbitrum-works/bold/gentle-introduction.md b/arbitrum-docs/how-arbitrum-works/bold/gentle-introduction.md index 3e0e64338..54d7eca19 100644 --- a/arbitrum-docs/how-arbitrum-works/bold/gentle-introduction.md +++ b/arbitrum-docs/how-arbitrum-works/bold/gentle-introduction.md @@ -88,7 +88,7 @@ That’s it! We’ve now walked through each of the steps that validators will t ## The Economics of Disputes in Arbitrum BoLD -:::tip +:::tip This section on BoLD's economics only applies to Arbitrum One, following the [BoLD DAO vote](https://forum.arbitrum.foundation/t/aip-bold-permissionless-validation-for-arbitrum/23232). As always, Arbitrum Orbit chain owners have full discretion over whether they adopt BoLD and how to use BoLD for the benefit of their project & users. The structure for how BoLD is used for Arbitrum One (outlined below) can be used to inform decisions around how BoLD is used for your Orbit chain(s). ::: @@ -97,15 +97,18 @@ Given that participation in BoLD is permissionless, it is recommended that the s BoLD lets validators permissionlessly become proposers and challengers if they want to. The role of a proposer is required to help progress the chain which requires bonding ETH, proposing and then posting state assertions to the parent chain. This bond is known as an “assertion bond”. The chain only needs 1 proposer to make progress. Therefore, most parties can watch the chain and independently verify assertions without being a proposer. In the unhappy case where there is a dispute about a proposed state assertion, BoLD lets anyone permissionlessly put up a bond of ETH to open challenges in the defense of Arbitrum (in their capacity as a challenger to invalid state assertions). This bond is known as a “challenge bond”. While both of these bonds can be any ERC20 token and be set to any size, this proposal recommends the use of the WETH ERC20 token & the following bond sizes: -* Assertion bonds: 3600 ETH - required from validators to bond their funds to an assertion in the eventual hopes of having that assertion be confirmed by the rollup protocol. This is a one-time bond required to be able to start posting assertions. This bond can be withdrawn once a validator’s assertion is confirmed and can alternatively be put together via a trustless bonding pool. -* Challenge-bonds, per level: 555/79 ETH (UPDATED) - required from validators to open challenges against an assertion observed on Ethereum, for each level. Note that “level” corresponds to the level of granularity at which the interactive dissection game gets played over, starting at the block level, moving on to a range of WASM execution steps, and then finally to the level of a single step of execution. These values were carefully calculated to optimize for the resource ratio and gas costs in the event of an attack, as explained in the[Economics of Disputes in Arbitrum BoLD](https://github.com/OffchainLabs/BoLD/blob/main/docs/research-specs/Economics.pdf) and the [BoLD whitepaper](https://arxiv.org/abs/2404.10491). This effectively means that an entity that has already put up a bond to propose an assertion does not need to put up a separate assertion bond to challenge an invalid state assertion that they observe. To be explicitly clear, a validator would still require 555 ETH and 79 ETH for on-going challenges. These additional challenge bond amounts are needed to participate in the interactive dispute game (back and forth) and narrows down the disagreement to a single step of execution that is then proven on Ethereum. The 555 ETH and 79 ETH challenge bonds can be put together via a trustless bonding pool, and does not all have to be put up by the validator that opened the challenge. These bonds can be refunded at the end of a challenge and can also alternatively be put together by the community using a trustless bonding pool. + +- Assertion bonds: 3600 ETH - required from validators to bond their funds to an assertion in the eventual hopes of having that assertion be confirmed by the rollup protocol. This is a one-time bond required to be able to start posting assertions. This bond can be withdrawn once a validator’s assertion is confirmed and can alternatively be put together via a trustless bonding pool. +- Challenge-bonds, per level: 555/79 ETH (UPDATED) - required from validators to open challenges against an assertion observed on Ethereum, for each level. Note that “level” corresponds to the level of granularity at which the interactive dissection game gets played over, starting at the block level, moving on to a range of WASM execution steps, and then finally to the level of a single step of execution. These values were carefully calculated to optimize for the resource ratio and gas costs in the event of an attack, as explained in the [Economics of Disputes in Arbitrum BoLD](https://github.com/OffchainLabs/BoLD/blob/main/docs/research-specs/Economics.pdf) and the [BoLD whitepaper](https://arxiv.org/abs/2404.10491). This effectively means that an entity that has already put up a bond to propose an assertion does not need to put up a separate assertion bond to challenge an invalid state assertion that they observe. To be explicitly clear, a validator would still require 555 ETH and 79 ETH for on-going challenges. These additional challenge bond amounts are needed to participate in the interactive dispute game (back and forth) and narrows down the disagreement to a single step of execution that is then proven on Ethereum. The 555 ETH and 79 ETH challenge bonds can be put together via a trustless bonding pool, and does not all have to be put up by the validator that opened the challenge. These bonds can be refunded at the end of a challenge and can also alternatively be put together by the community using a trustless bonding pool. BoLD makes permissionless validation possible for Arbitrum rollup chains and marks a major step towards [full decentralization](https://docs.arbitrum.foundation/state-of-progressive-decentralization). This significant milestone also lays the groundwork for productive discussions about future economic incentives for those participating in the protocol since anyone can participate. ### Reimbursements and penalities + Once all of a validator’s proposed assertions are confirmed, a validator can withdraw their bond in full. Other costs spent by the honest parties to defend Arbitrum, such as the L1 gas costs and the challenge bonds, are fully refundable following confirmation of all sub-challenges. Challenge bonds will be automatically refundable in-protocol while L1 gas costs will be reimbursed by the Arbitrum Foundation using an off-chain procedure. All costs spent by malicious actors, including the assertion bond, are confiscated and sent to an Arbitrum DAO controlled address at the conclusion of a challenge. All eligible entities who wish to be paid a reward or be reimbursed by the Arbitrum DAO or the Arbitrum Foundation are expected to undergo the Arbitrum Foundation’s KYC process. #### Service fee for “Active” proposers + A service fee is to be paid to active block-level proposers as a way of removing the disincentive for participation by honest parties who bond their own capital and propose assertions for Arbitrum One. The fee should be denominated in ETH and 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 stake (based on [CoinDesk Indices Composite Ether Staking Rate (CESR) benchmark](https://www.coindesk.com/indices/ether/cesr) and [Rated.Network](https://explorer.rated.network/network?network=mainnet&timeWindow=all&rewardsMetric=average&geoDistType=all&hostDistType=all&soloProDist=stake)). This fee is not a “reward” for the same reasons why the protocol does not automatically reward honest parties with all the funds confiscated from a malicious actor. This service fee can be paid out upon an active proposer’s top-level assertion being confirmed on Ethereum and will be calculated using the duration of time that the proposer was considered active by the protocol. The procedure that calculates this will be handled off-chain 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. @@ -117,19 +120,20 @@ This service fee would not apply to entities that use the DAO’s funds to becom As mentioned above in Step 5, once all of a validator’s assertions are confirmed, a validator can withdraw their full assertion bond and have their challenge bonds refunded automatically. Funds from a malicious party will be confiscated and sent to the ArbitrumDAO treasury. #### Rewards and Reimbursements for Defenders - "Defender's Bounty" + The service fee described above is meant to incentivize or reimburse an honest, active proposer for locking up their capital to propose assertions and advance the chain. Similarly, in the event of an attack, a reward is paid out to honest defenders using confiscated funds from malicious actors. This reward is defined as the "Defender's Bounty". Specifically, 1% (one percent) of the confiscated funds from a malicious actor is proposed to be rewarded to honest parties who deposit a challenge bond and post assertions as part of a sub-challenge, proportional to the amount that a defender has put up to defend a correct state assertion during the challenge. Note that any gas costs spent by honest parties to defend Arbitrum One during a challenge is 100% refundable by the Arbitrum Foundation. In this model, honest defenders and proposers of Arbitrum One stand are incentivized to participate while malicious actors stand to lose everything they spent attacking Arbitrum One. + - How to reimburse the challenge bond and gas costs to honest parties, and - What to do with the funds confiscated from a malicious actor (including, but not limited to, rewarding the honest parties with a portion of the confiscated funds, burning the confiscated funds in its entirety, or sending the confiscated funds to the DAO treasury). -Note that honest parties are not automatically rewarded with the funds confiscated from malicious actors to avoid creating a situation where honest parties wastefully compete to be the first one to make each honest move in the interactive fraud proof game. Additionally, BOLD resolves disputes by determining which top-level assertion is correct, without necessarily being able to classify every move as “honest” or “malicious” as part of the interactive fraud proof game without off-chain knowledge. +Note that honest parties are not automatically rewarded with the funds confiscated from malicious actors to avoid creating a situation where honest parties wastefully compete to be the first one to make each honest move in the interactive fraud proof game. Additionally, BOLD resolves disputes by determining which top-level assertion is correct, without necessarily being able to classify every move as “honest” or “malicious” as part of the interactive fraud proof game without off-chain knowledge. Defenders are only eligible for this reward if they deposit a challenge bond (555 or 79 ETH, depending on the level), posted an on-chain assertion as part of a sub-challenge (i.e. not the top-level assertion), and have had their on-chain sub-challenge assertion get confirmed by the protocol. The calculation for this reward is conducted off-chain by the Arbitrum Foundation and payment will be made via an Arbitrum DAO vote (since confiscated funds go to a Arbitrum DAO-controlled address). The topic of further improvements and new economic and incentive models for BoLD are 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 additional or new 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 resolved. - ## What can I do with BoLD today? Today, BoLD is deployed on a public testnet using Ethereum Sepolia as a base layer for anyone to experiment with and test on. The intent behind this testnet is purely to demonstrate, first-hand, how disputes can effectively resolved by a single party in a fixed challenge period on Arbitrum chains. Feedback gained from developers, users, and researchers will help improve and strengthen BoLD’s design. @@ -146,7 +150,7 @@ If you’re intrigued by what BoLD can unlock for Arbitrum chains, we encourage :::caution Withdrawals leading up to a BOLD upgrade -The confirmation timing on any withdrawal that is in-flight when the BoLD upgrade is activated will be delayed until the first BoLD assertion is confirmed. This means that for any Arbitrum chain that upgrades to use BoLD, including Arbitrum One and Arbitrum Nova, all pending withdrawals to L1 Ethereum that were initiated _before_ the upgrade will be delayed by 1 challenge period, plus the time between the withdrawal was initiated and the time that the BoLD upgrade takes place. This is because the upgrade effectively "resets" the challenge period for that are not yet finalized. +The confirmation timing on any withdrawal that is in-flight when the BoLD upgrade is activated will be delayed until the first BoLD assertion is confirmed. This means that for any Arbitrum chain that upgrades to use BoLD, including Arbitrum One and Arbitrum Nova, all pending withdrawals to L1 Ethereum that were initiated _before_ the upgrade will be delayed by 1 challenge period, plus the time between the withdrawal was initiated and the time that the BoLD upgrade takes place. This is because the upgrade effectively "resets" the challenge period for that are not yet finalized. For example, if the upgrade happened at time _t_, then a withdrawal initiated at a time _t-2_ days will need to wait an additional _6.4_ days for their withdrawal to be finalized, totaling 8.4 days of maximum delay. Withdrawals that finalize before the upgrade takes place at time _t_ will be unaffected. In other words, the maximum delay a withdrawal will experience leading up to the upgrade is 12.8 days (two challenge periods). @@ -165,9 +169,11 @@ BOLD is in `alpha`, which means there are a lot of planned improvements on the r ## 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 7. 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 ERC20 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 a whitelist 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. #### 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 Orbit chain using BoLD is entirely up to the chain owner to decide, if they choose to adopt BoLD at all. **Assertion bond sizes** @@ -187,25 +193,30 @@ To summarize with a scenario, this effectively means that defending against a $1 BoLD ships with trust-less 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 1 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. #### 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. #### 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. #### 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 L2 state. These assertions about the L2 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: + - Using the confiscated funds to refund L1 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, - 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 Orbit chain can choose how they wish to structure and manage confiscated funds from dishonest parties. +As always, an Orbit chain can choose how they wish 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 stakes themselves. This creates perverse incentives that threaten the security of BoLD. Here’s an example, from Ed Felten: @@ -220,6 +231,7 @@ That said, there’s no harm in paying the honest proposer a fair interest rate 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 off-chain and payouts will require a DAO vote because the confiscated funds are always sent to a DAO-controlled address. #### Q: Why is $ARB not the bonding token used in BoLD? on Arbitrum One? + Although BoLD supports using an ERC20 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 the $ARB. @@ -229,47 +241,54 @@ Although BoLD supports using an ERC20 token, Ethereum, specifically WETH, was ch An Orbit 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 distribute for validator incentive for Arbitrum One? + Yes. The asset that a validator uses to become a proposer in BoLD can be set to any ERC20 token, including $ARB. For Arbitrum One, $ETH is used for bonds due to a variety of reasons mentioned above. The Arbitrum DAO can change this asset type at any time via a governance proposal. The source and denomination of funds used to incentive validators, should such an economic incentive model exist, will be at the discretion of the Arbitrum DAO. #### 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](https://www.notion.so/Arbitrum-BoLD-FAQ-93210f430a6a470792496be040ac9990?pvs=21). These reimbursement payments can be paid out upon an active proposer’s honest assertion being confirmed on Ethereum and will be calculated and handled off-chain 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 an L2 state assertion to Ethereum. If they do not have an active bond on L1, 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 1 “active” proposer at any point in time. +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](https://www.notion.so/Arbitrum-BoLD-FAQ-93210f430a6a470792496be040ac9990?pvs=21). These reimbursement payments can be paid out upon an active proposer’s honest assertion being confirmed on Ethereum and will be calculated and handled off-chain 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 an L2 state assertion to Ethereum. If they do not have an active bond on L1, 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 1 “active” proposer at any point in time. The topic of economic and incentive models for BoLD on Arbitrum One are 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 resolved. The DAO may choose, via governance, to fund other parties or change this reimbursement model at any time. For Orbit chains, any economic model can be implemented 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? -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 stake (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 time period. At the time of writing, the estimated annual income for Ethereum mainnet validators is approximately 3% to 4% of their stake (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 L1 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. #### Q: For Arbitrum One, will the off-chain compute costs be reimbursed? (i.e. the costs for a validator computing the hashes for a challenge) + Reimbursement will not be made for off-chain 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. 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 1 challenge with 2.5hour duration) using [on-demand prices for US East (N. Virginia)](https://instances.vantage.sh/aws/ec2/r5.4xlarge). Therefore, the additional costs from off-chain compute is 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 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. 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 grieving 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 L1 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. #### 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? -The upfront capital to post assertions 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 -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 +The upfront capital to post assertions 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 + +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 If a malicious entity wanted to attack Arbitrum, they would need to deposit 3600 ETH to propose an invalid state assertion. #### 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. -But you might now be wondering: what about L3 Orbit 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](https://docs.arbitrum.io/how-arbitrum-works/sequencer#unhappyuncommon-case-sequencer-isnt-doing-its-job)). 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 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 Orbit 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](https://docs.arbitrum.io/how-arbitrum-works/sequencer#unhappyuncommon-case-sequencer-isnt-doing-its-job)). 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. +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. 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. @@ -280,13 +299,17 @@ The methodology for calculating the parameters, specifically for L3 Orbit chains Anyone can deploy an assertion bonding pool using [`AssertionStakingPoolCreator.sol`](https://github.com/OffchainLabs/BoLD/blob/main/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol) as a means to crowdsource funds to put up a bond for an assertion. To defend Arbitrum using a bonding pool, an entity would first deploy this pool with the assertion they believe is correct and wish to put up a bond to challenge an adversary's assertion. Then, anyone can verify that the claimed assertion is correct by running the inputs through their node's State Transition Function (STF). If other parties agree that the assertion is correct, then they can deposit their funds into the contract. When enough funds have been deposited, anyone can permissionlessly trigger the creation of the assertion on-chain to start the challenge. Finally, once the honest parties' assertion is confirmed by the dispute protocol, all involved entities can get their funds reimbursed and can withdraw. The Arbitrum Nitro node validation software also comes with an optional feature called "auto pooling," where the entire workflow of assertion bonding pool deployment and depositing funds into the said pool are automated. If "auto pooling" is activated & the private key controlling the validator has funds, a pool will be trustlessly deployed alongside an assertion with the available funds. If a validator with the "auto pooling" feature enabled sees an assertion on-chain that it agrees with _and_ a bonding pool already exists for that assertion, then the validator will automatically deposit funds into the bonding pool to "join" the others who are backing that on-chain assertion in a trustless manner. #### Q: What type of hardware will be necessary to run a BoLD validator? + The minimum hardware requirements for running a BoLD validator is still being researched and finalized. The goal, however, is that regular consumer hardware (i.e. laptop) can effectively be used by an honest party to secure an Arbitrum chain using BoLD in the average case. #### Q: How do BoLD validators communicate with one another? Is it over a P2P network? + BoLD validators for Arbitrum chains communicate directly with smart contracts on L1 Ethereum. This means that opening challenges, submitting bisected history commitments, one-step proofs, and confirmations are all refereed on Ethereum. There is no p2p between validators. #### Q: For an L3 Orbit chain, secured using BoLD, that settles to Arbitrum One, does the one-step proof happen on the parent chain? + Yes #### Q: For Arbitrum One, does implementing BoLD reduce the scope or remove the need for the Arbitrum Security Council? + BoLD can limit the scope of Arbitrum One and Nova’s reliance on the Security Council as it takes Arbitrum chains one-step closer to full decentralization. diff --git a/arbitrum-docs/launch-orbit-chain/concepts/custom-gas-token-sdk.md b/arbitrum-docs/launch-orbit-chain/concepts/custom-gas-token-sdk.md index da16ec2d3..04f4fa094 100644 --- a/arbitrum-docs/launch-orbit-chain/concepts/custom-gas-token-sdk.md +++ b/arbitrum-docs/launch-orbit-chain/concepts/custom-gas-token-sdk.md @@ -30,6 +30,14 @@ Custom gas token support in the Arbitrum SDK introduces a suite of APIs designed **Note** that these APIs are just needed for `custom gas token` orbit chains and for ETH-powered rollup and anytrust orbit chains, you don't need to use them. -**Note** that when native tokens are transferred to the custom gas token orbit chain, they function equivalently to ETH on EVM chains. This means that these tokens will exhibit behavior identical to that of ETH, which is the native currency on EVM chains. This similarity in functionality is a key feature to consider in transactions and operations within the orbit chain. +**Note** that when native tokens are transferred to the custom gas token orbit chain, they function equivalently to ETH on EVM chains. This means these tokens will exhibit behavior identical to that of ETH, the native currency on EVM chains. This similarity in functionality is a key feature to consider in transactions and operations within the orbit chain. **Note** that everything else is under the hood, and the custom gas token code paths will be executed just if the `L2Network` object config has a `nativeToken` field. + +### Registering a custom token in the Token Bridge + +When [registering a custom token in the Token Bridge](/build-decentralized-apps/token-bridging/03-token-bridge-erc20.md#setting-up-your-token-with-the-generic-custom-gateway) of a custom-gas-token Orbit chain, there's an additional step to perform before calling `registerTokenToL2`. + +Since the Token Bridge [router](https://github.com/OffchainLabs/token-bridge-contracts/blob/main/contracts/tokenbridge/ethereum/gateway/L1OrbitGatewayRouter.sol#L142-L144) and the [generic-custom gateway](https://github.com/OffchainLabs/token-bridge-contracts/blob/main/contracts/tokenbridge/ethereum/gateway/L1OrbitCustomGateway.sol#L203-L210) expect to have allowance to transfer the native token from the `msg.sender()` to the inbox contract, it's usually the token in the parent chain who handles those approvals. In the [TestCustomTokenL1](https://github.com/OffchainLabs/token-bridge-contracts/blob/main/contracts/tokenbridge/test/TestCustomTokenL1.sol#L158-L168), we offer as an example of implementation. We see that the contract transfers the native tokens to itself and then approves the router and gateway contracts. If we follow that implementation, we only need to send an approval transaction to the native token to allow the TestCustomTokenL1 to transfer the native token from the caller of the `registerTokenToL2` function to itself. + +You can find a [tutorial that deploys two tokens and registers them in the Token Bridge of a custom-gas-token-based chain](https://github.com/OffchainLabs/arbitrum-tutorials/tree/master/packages/custom-token-bridging). diff --git a/arbitrum-docs/launch-orbit-chain/how-tos/customize-precompile.mdx b/arbitrum-docs/launch-orbit-chain/how-tos/customize-precompile.mdx index 9a07a52db..1f1b3820d 100644 --- a/arbitrum-docs/launch-orbit-chain/how-tos/customize-precompile.mdx +++ b/arbitrum-docs/launch-orbit-chain/how-tos/customize-precompile.mdx @@ -18,7 +18,7 @@ To support these additional use-cases, follow the instructions described in [How ::: -There are four primary ways to customize your chain's precompiles: +There are five primary ways to customize your chain's precompiles: 1. Add new methods to an existing [precompile][precompile_impl_dir_link]. 2. Create a new precompile. diff --git a/arbitrum-docs/launch-orbit-chain/infra-options-orbit-chains.md b/arbitrum-docs/launch-orbit-chain/infra-options-orbit-chains.md index 0b8fa37a9..ffdc38af7 100644 --- a/arbitrum-docs/launch-orbit-chain/infra-options-orbit-chains.md +++ b/arbitrum-docs/launch-orbit-chain/infra-options-orbit-chains.md @@ -41,6 +41,7 @@ For applications that require the ability to transfer assets to chains outside o - [Hyperlane](https://www.hyperlane.xyz/) - [Axelar](https://axelar.network/) - [Across](https://across.to/) +- [Decent](https://www.decent.xyz/) ## Data availability diff --git a/arbitrum-docs/node-running/how-tos/running-an-orbit-node.mdx b/arbitrum-docs/node-running/how-tos/running-an-orbit-node.mdx index 2d713e958..446446c7b 100644 --- a/arbitrum-docs/node-running/how-tos/running-an-orbit-node.mdx +++ b/arbitrum-docs/node-running/how-tos/running-an-orbit-node.mdx @@ -56,7 +56,16 @@ An example of `chain.info-json` is available in the next section. --chain.name= ``` -#### 3. AnyTrust chains + +#### 3. `execution.forwarding-target` + +You need to set the --execution.forwarding-target flag if you are running a regular full node (Not sequencer). + +```shell +--execution.forwarding-targe= +``` + +#### 4. AnyTrust chains For Anytrust chains, you need to to add the following flags to the command or configuration: @@ -96,7 +105,7 @@ Or: - Example: ```shell wordWrap=true - docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 @latestNitroNodeImage@ --parent-chain.connection.url= --chain.id= --chain.name= --http.api=net,web3,eth --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --chain.info-json= + docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 @latestNitroNodeImage@ --parent-chain.connection.url= --chain.id= --chain.name= --http.api=net,web3,eth --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --chain.info-json= --execution.forwarding-targe= ``` - Ensure that `/some/local/dir/arbitrum` already exists otherwise the directory might be created with `root` as owner, and the Docker container won't be able to write to it diff --git a/arbitrum-docs/partials/_glossary-partial.md b/arbitrum-docs/partials/_glossary-partial.md index c335a7678..1f268453e 100644 --- a/arbitrum-docs/partials/_glossary-partial.md +++ b/arbitrum-docs/partials/_glossary-partial.md @@ -110,7 +110,7 @@ A distributed digital ledger that is used to record transactions and store data 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.

-### BOLD {#bold} +### 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.

diff --git a/arbitrum-docs/partials/_troubleshooting-building-partial.md b/arbitrum-docs/partials/_troubleshooting-building-partial.md index 48e79f379..e856b3a5e 100644 --- a/arbitrum-docs/partials/_troubleshooting-building-partial.md +++ b/arbitrum-docs/partials/_troubleshooting-building-partial.md @@ -408,7 +408,7 @@ When querying the receipt of a Classic transaction on a Nitro node, there's some

-To get the exact fees paid, you can query a Classic node, which will return all the exact information. +To get the exact fees paid, you can query a Classic node, which will return all the accurate information in an object called feeStats. That object will contain all the information split into the four different gas fields: prices, unitsUsed and paid (which is price * unitsUsed).

diff --git a/arbitrum-docs/partials/_troubleshooting-orbit-partial.md b/arbitrum-docs/partials/_troubleshooting-orbit-partial.md index ec40595fa..bd8c7358f 100644 --- a/arbitrum-docs/partials/_troubleshooting-orbit-partial.md +++ b/arbitrum-docs/partials/_troubleshooting-orbit-partial.md @@ -129,7 +129,7 @@ Similar to bridges and block explorers, there are many third-party indexing solu ### Can I increase the maximum contract size for my Orbit chain?

-Yes, but only on testnets for now. You can use our Orbit SDK (available for deployments on testnet), and configure the parameters MaxCodeSize and MaxInitCodeSize when calling prepareNodeConfig. +Yes, Orbit supports an increased smart contract size limit of up to 96kB. You can use our Orbit SDK and configure the parameters MaxCodeSize and MaxInitCodeSize when calling prepareNodeConfig. Note that the smart contract size limit parameters can't be changed via upgrade after deployment.

diff --git a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos30.md b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos30.md index 76e007531..7a2d1833d 100644 --- a/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos30.md +++ b/arbitrum-docs/run-arbitrum-node/arbos-releases/arbos30.md @@ -7,28 +7,32 @@ author: dlee :::caution Note to Orbit chains -Upgrading your Orbit chain to ArbOS 30 or deploying a new Orbit chain with ArbOS 30 is **not yet supported or encouraged**. This page will be updated with requirements, upgrade instructions, and associated details when available. When ArbOS 30 Bianca is ready for Orbit mainnet adoption and all requirements have been formally tagged and published, Orbit chain owners and RaaS teams will need to follow [these instructions to upgrade](../../launch-orbit-chain/how-tos/arbos-upgrade.md). When the time comes, Orbit chain owners will need to upgrade their Nitro node versions, deploy new versions of [`nitro-contracts`](https://github.com/OffchainLabs/nitro-contracts) (using the [Orbit action contracts](https://github.com/OffchainLabs/orbit-actions)), set a new Wasm module root, and perform any ArbOS 30 Bianca specific configurations or actions. +Upgrading your Orbit chain to ArbOS 30 or deploying a new Orbit chain with ArbOS 30 is **not yet supported or encouraged**. This page will be updated with requirements, upgrade instructions, and associated details when available. When ArbOS 30 Bianca is ready for Orbit mainnet adoption and all requirements have been formally tagged and published, Orbit chain owners and RaaS teams will need to follow [these instructions to upgrade](../../launch-orbit-chain/how-tos/arbos-upgrade.md). When the time comes, Orbit chain owners will need to upgrade their Nitro node versions, deploy new versions of [`nitro-contracts`](https://github.com/OffchainLabs/nitro-contracts) (using the [Orbit action contracts](https://github.com/OffchainLabs/orbit-actions)), set a new Wasm module root, and perform any ArbOS 30 Bianca specific configurations or actions. ::: ArbOS 30 Bianca will be shipped as a Nitro release, which will be available on Docker hub. For Arbitrum One and Arbitrum Nova, the ArbOS 30 Bianca upgrade requires a governance vote to activate and so this release of Nitro will be a mandatory upgrade for Arbitrum One and Nova node operators if the on-chain DAO vote for the upgrade proposal passes. The Arbitrum docs will remain the canonical home for information regarding ArbOS releases, with more details found on the [ArbOS Software Releases Overview page](./01-overview.md). ### Requirements: + - A minimum Nitro version of 3.0.0, but the exact version is yet to be tagged and released. - An upgrade to a new, unreleased version of [`nitro-contracts`](https://github.com/OffchainLabs/nitro-contracts) - The setting of a new Wasm module root (that will be added here when available) ### High-level description of ArbOS 30 changes + ArbOS 30 Bianca is a major upgrade for Arbitrum chains and ArbOS upgrades can be seen as Arbitrum’s equivalent of a hard fork - more can be read about the subject over in [Arbitrum ArbOS upgrades](https://forum.arbitrum.foundation/t/arbitrum-arbos-upgrades/19695). Please note that ArbOS 30 Bianca is an upgrade that builds upon [ArbOS 20 Atlas](./arbos20.md). ArbOS 30 Bianca brings many features, improvements, and bug fixes to Arbitrum chains. The full list of changes can be found in the Nitro release notes for [Nitro 3.0.0](https://github.com/OffchainLabs/nitro/releases/tag/v3.0.0) or higher (as Nitro 3.0.0 is the first Nitro version that adds support for ArbOS 30 Bianca). Highlighted below are a few of the most impactful and critical features that are introduced with ArbOS 30: -- Activation of [Stylus](../../stylus/stylus-gentle-introduction.md) on Arbitrum chains through the addition of a new WebAssembly-based virtual machine that runs alongside the EVM. Stylus enables developers to write smart contracts in new programming languages that compile down to WASM, like Rust, that are more efficient and safer than Solidity smart contracts while retaining complete interoperability. + +- Activation of [Stylus](../../stylus/stylus-gentle-introduction.md) on Arbitrum chains through the addition of a new WebAssembly-based virtual machine that runs alongside the EVM. Stylus enables developers to write smart contracts in new programming languages that compile down to WASM, like Rust, that are more efficient and safer than Solidity smart contracts while retaining complete interoperability. - Adoption of [RIP-7212](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md), a precompile for verifying the [`Secp256r1 or P-256 curve`](https://www.nervos.org/knowledge-base/what_is_secp256r1) on Arbitrum chains. Adding support for this precompile allows account abstraction wallets to cheaply verify a type of signature widely used in passkeys and secure enclaves. -- V0 support for Arbitrum Nitro node snap sync, enabling a Nitro node to sync from a snapshot already accepted from L1 through the propagation of blockstate from other nodes in the network. +- V0 support for Arbitrum Nitro node snap sync, enabling a Nitro node to sync from a snapshot already accepted from L1 through the propagation of blockstate from other nodes in the network. - A change to the transaction fee router contracts on Arbitrum Nova to allow for fees collected to be automatically sent to the ArbitrumDAO Treasury on Arbitrum One. Currently, the ArbitrumDAO receives Arbitrum Nova transaction fees are sent to a ArbitrumDAO controlled address that requires a consitutional proposal to move, which is less efficient. This change is specific to Arbitrum Nova and is not expected to impact Orbit chains. ### Reference links for ArbOS 30 Bianca -- [Nitro v3.0.0 release notes](https://github.com/OffchainLabs/nitro/releases/tag/v3.0.0). Note that this is the *first* version that supports ArbOS 30 Bianca, but Nitro 3.0.0 is not the *required* version. The final, required version of Nitro for ArbOS 30 Bianca is unreleased but will be shared here on this page when available. + +- [Nitro v3.0.0 release notes](https://github.com/OffchainLabs/nitro/releases/tag/v3.0.0). Note that this is the _first_ version that supports ArbOS 30 Bianca, but Nitro 3.0.0 is not the _required_ version. The final, required version of Nitro for ArbOS 30 Bianca is unreleased but will be shared here on this page when available. - [AIP: Activate Stylus and Enable Next-Gen WebAssembly Smart Contracts (ArbOS 30)](https://forum.arbitrum.foundation/t/aip-activate-stylus-and-enable-next-gen-webassembly-smart-contracts-arbos-30/22970) - [AIP: Support RIP-7212 for Account Abstraction Wallets (ArbOS 30)](https://forum.arbitrum.foundation/t/aip-support-rip-7212-for-account-abstraction-wallets-arbos-30/23298) - [AIP: Nova Fee Router Proposal (ArbOS 30)](https://forum.arbitrum.foundation/t/aip-nova-fee-router-proposal-arbos-30/23310) diff --git a/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md b/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md index 7ee7d114e..a43e3b939 100644 --- a/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md +++ b/arbitrum-docs/run-arbitrum-node/more-types/02-run-validator-node.md @@ -57,6 +57,7 @@ Here we describe different strategies that validators follow and provide instruc ```shell docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum @latestNitroNodeImage@ --parent-chain.connection.url=https://l1-mainnet-node:8545 --chain.id=42161 --node.staker.enable --node.staker.strategy=Defensive --parent-chain.wallet.password="SOME SECURE PASSWORD" ``` +- For Orbit chains, you need to set the `--chain.info-json=` flag instead of `--chain.id=` - To verify validator is working, this log line shows the wallet is setup correctly: ```shell INFO [09-28|18:43:49.367] running as validator txSender=0x... actingAsWallet=0x... whitelisted=true strategy=Defensive @@ -66,3 +67,10 @@ Here we describe different strategies that validators follow and provide instruc - `txSender` and `actingAsWallet` should both be present and not `nil` - The log line `validation succeeded` shows that the L2 block validator is working - The log line `found correct assertion` shows that the L1 validator is working + +#### Orbit chains: grant whitlelist + +- You need to be the chain owner to include a new validator address in the allowlist: +- Find your `upgradeExecutor` contract address. +- Send transactions to the `executeCall` method of the`upgradeExecutor` contract and set the `target` address to your Rollup contract's address, set the `targetCalldata` to `0xa3ffb772{Your new allowlist validator address}`. (`0xa3ffb772` is the signature of `setValidator(address[],bool[])`) +- Call your Rollup contract's `isValidator(address)` and check the result. diff --git a/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md b/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md index d243a1d43..2bb97024d 100644 --- a/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md +++ b/arbitrum-docs/run-arbitrum-node/nitro/01-build-nitro-locally.md @@ -24,7 +24,7 @@ This how-to assumes that you're running one of the following operating systems: #### For [Debian](https://docs.docker.com/engine/install/debian)/[Ubuntu](https://docs.docker.com/engine/install/ubuntu) -```bash +```shell for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done # Add Docker's official GPG key: sudo apt-get update @@ -51,7 +51,7 @@ Depending on whether your Mac has an Intel processor or Apple silicon, download After installing docker, you might want to be able to run it with your current user instead of root. You can run the following commands to do so. -```bash +```shell sudo groupadd docker sudo usermod -aG docker $USER newgrp docker @@ -61,7 +61,7 @@ For troubleshooting, check Docker's section in [their documentation](https://doc ### Step 2. Download the Nitro source code -```bash +```shell git clone --branch @nitroVersionTag@ https://github.com/OffchainLabs/nitro.git cd nitro git submodule update --init --recursive --force @@ -69,7 +69,7 @@ git submodule update --init --recursive --force ### Step 3. Build the Nitro node Docker image -```bash +```shell docker build . --tag nitro-node ``` @@ -83,7 +83,7 @@ If you want to build the node binaries natively, execute steps 1-3 of the [Build #### For Debian/Ubuntu -```bash +```shell apt install git curl build-essential cmake npm golang clang make gotestsum wabt lld-13 python3 npm install --global yarn ln -s /usr/bin/wasm-ld-13 /usr/local/bin/wasm-ld @@ -93,7 +93,7 @@ ln -s /usr/bin/wasm-ld-13 /usr/local/bin/wasm-ld Install [Homebrew](https://brew.sh/) package manager and add it to your `PATH` environment variable: -```bash +```shell /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" echo "export PATH=/opt/homebrew/bin:$PATH" >> ~/.zprofile && source ~/.zprofile ``` @@ -102,37 +102,37 @@ echo "export PATH=/opt/homebrew/bin:$PATH" >> ~/.zprofile && source ~/.zprofile Install essentials: -```bash +```shell brew install git curl make cmake npm go gvm golangci-lint wabt llvm gotestsum npm install --global yarn sudo mkdir -p /usr/local/bin sudo ln -s /opt/homebrew/opt/llvm/bin/wasm-ld /usr/local/bin/wasm-ld ``` -### Step 5. Configure node [16.19](https://github.com/nvm-sh/nvm) +### Step 5. Configure node [18](https://github.com/nvm-sh/nvm) #### For Debian/Ubuntu -```bash +```shell curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash source "$HOME/.bashrc" -nvm install 16.19 -nvm use 16.19 +nvm install 18 +nvm use 18 ``` #### For MacOS -```bash +```shell curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" -nvm install 16.19 -nvm use 16.19 +nvm install 18 +nvm use 18 ``` ### Step 6. Configure Rust [1.73](https://www.rust-lang.org/tools/install) -```bash +```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" rustup install 1.73 @@ -142,29 +142,29 @@ rustup target add wasm32-wasi --toolchain 1.73 cargo install cbindgen ``` -### Step 7. Configure Go [1.20](https://github.com/moovweb/gvm) +### Step 7. Configure Go [1.21](https://github.com/moovweb/gvm) #### Install Bison ##### For Debian/Ubuntu -```bash +```shell sudo apt-get install bison ``` ##### For MacOS -```bash +```shell brew install bison ``` #### Install and configure Go -```bash +```shell bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) source "$HOME/.gvm/scripts/gvm" -gvm install go1.20 -gvm use go1.20 --default +gvm install go1.21 +gvm use go1.21 --default curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.54.2 ``` @@ -172,20 +172,20 @@ If you use zsh, replace `bash` with `zsh`. #### Install foundry -```bash +```shell curl -L https://foundry.paradigm.xyz | bash foundryup ``` ### Step 8. Start build -```bash +```shell make ``` ### Step 9. Produce binaries -```bash +```shell make build ``` @@ -193,7 +193,7 @@ make build To run your node using the generated binaries, use the following command from the `nitro` folder, with your desired parameters -```bash +```shell ./target/bin/nitro ``` @@ -207,6 +207,6 @@ ERROR[05-21|21:59:17.415] unable to find validator machine directory for the on- Try add flag: -```bash +```shell --validation.wasm.allowed-wasm-module-roots={WASM_MODULE_ROOT} ``` diff --git a/arbitrum-docs/stylus/concepts/stylus-cache-manager.md b/arbitrum-docs/stylus/concepts/stylus-cache-manager.md new file mode 100644 index 000000000..cd563906b --- /dev/null +++ b/arbitrum-docs/stylus/concepts/stylus-cache-manager.md @@ -0,0 +1,40 @@ +--- +title: 'Stylus caching strategy' +description: 'A conceptual overview of the Stylus caching strategy and `CacheManager` contract, and explaining its functionality.' +sme: mahsa-moosavi +target_audience: 'Developers deploying smart contracts using Stylus.' +sidebar_position: 3 +--- + +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.** + + + +import PublicPreviewBannerPartial from '../partials/_stylus-public-preview-banner-partial.md'; + + + +## CacheManager contract + +The core component of our caching strategy is the [`CacheManager` contract](https://github.com/OffchainLabs/stylus-contracts/blob/c51ab1dc90f543caf579600162f77e053984b8cd/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. + +The `CacheManager` defines how contracts remain in the cache and how they compete with other contracts for cache space. Its primary purpose is to reduce high initialization costs, ensuring efficient contract activation and usage. The contract includes methods for adding and removing cache entries, querying the status of cached contracts, and managing the lifecycle of cached data. + +### Key features + +The `CacheManager` plays a crucial role in our caching strategy by keeping a specific set of contracts in memory rather than retrieving them from disk. This significantly reduces the activation time for frequently accessed contracts. The `CacheManager` contract is an on-chain contract that accepts bids for inserting contract code into the cache. It then calls a precompile that loads or unloads the contracts in the `ArbOS` cache, which follows the on-chain cache but operates locally in the client and marks the contract as in or out of the cache in the `ArbOS` state. + +The cache operates through an auction system where dApp developers submit bids to insert their contracts into the cache. If the cache is at capacity, lower bids are evicted to make space for higher bids. The cache maintains a minimum heap of bids for `codeHashes`, with bids encoded as `bid << 64 + index`, where `index` represents the position in the list of all bids. When an insertion exceeds the cache's maximum size, items are popped off the minimum heap and deleted until there is enough space to insert the new item. Contracts with equal bids will be popped in a random order, while the smallest bid is evicted first. + +To ensure that developers periodically pay to maintain their position in the cache, we use a global decay parameter computed by `decay = block.timestamp * _decay`. This inflates the value of bids over time, making newer bids more valuable. + +### Cache access and costs + +During activation, we compute the contract's initialization costs for both non-cached and cached initialization. These costs take into account factors such as the number of functions, types, code size, data length, and memory usage. It's important to note that accessing an uncached contract does not automatically add it to the `CacheManager`'s cache. Only explicit calls to the `CacheManager` contract will add a contract to the cache. If a contract is removed from the cache, calling the contract becomes more expensive unless it is re-added. + +To see how much gas contract initialization would cost, you need to call `programInitGas(address)` from the [ArbWasm precompile](https://github.com/OffchainLabs/nitro/blob/d906798140e562500beb9005d2503b0272852298/precompiles/ArbWasm.go). This function returns both the initialization cost when the contract is cached and when it is not. diff --git a/arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx b/arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx new file mode 100644 index 000000000..2624ef9cc --- /dev/null +++ b/arbitrum-docs/stylus/how-tos/debugging-stylus-tx.mdx @@ -0,0 +1,174 @@ +--- +title: 'How to debug Stylus transactions using Cargo Stylus Replay' +description: 'This how-to explains how to perform trace calls and use GDB to replay and debug Stylus transactions, providing detailed analysis and troubleshooting.' +author: mahsamoosavi +sme: mahsamoosavi +target_audience: 'Developers deploying smart contracts using Stylus' +content_type: how-to +sidebar_position: 2 +--- + +import PublicPreviewBannerPartial from '../partials/_stylus-public-preview-banner-partial.md'; + + + +Debugging smart contracts can be challenging, especially when dealing with complex transactions. The `cargo-stylus-replay` crate simplifies the debugging process by allowing developers to replay Stylus transactions. This tool leverages GDB to provide an interactive debugging experience, enabling developers to set breakpoints, inspect state changes, and trace the execution flow step-by-step. This capability is crucial for identifying and resolving issues, ensuring that smart contracts function correctly and efficiently. + +### Overview + +Cargo Stylus is a tool designed to simplify the development and debugging process for smart contracts written in Rust for the Stylus execution environment. One of its powerful features is the `cargo-stylus-replay` crate, which provides essential functionalities for developers: + +1. **Trace transactions**: Perform trace calls against Stylus transactions using Ethereum nodes' `debug_traceTransaction` RPC. This feature enables developers to analyze the execution flow and state changes of their transactions in a detailed manner. +2. **Debugging with GDB**: Replay and debug the execution of a Stylus transaction using the GNU Debugger (GDB). This allows developers to set breakpoints, inspect variables, and step through the transaction execution line by line, providing an in-depth understanding of the transaction's behavior. + +### Replaying transactions + +**Note:** Currently, this has only been tested on Linux, x86 systems with GDB installed. + +#### Requirements + +- **Rust** (version 1.77 or higher) +- **Crates**: `cargo-stylus`, `cargo-stylus-replay`, `cargo-stylus-check` +- **GNU Debugger (GDB)** +- **[Cast](https://book.getfoundry.sh/cast/)** (an Ethereum CLI tool) +- **Local Arbitrum Sepolia node** with tracing endpoints enabled or a [local Stylus dev node](https://arbitrum-docs-ncyp5gty1-offchain-labs.vercel.app/run-arbitrum-node/run-local-dev-node) + +`cargo-stylus-replay` allows users to debug the execution of a Stylus transaction using [GDB](https://sourceware.org/gdb/) against the Rust source code. + +### Installation and setup + +1. **Install the required crates and GDB**: First, let's ensure that the following crates are installed: + +```sh +cargo install cargo-stylus cargo-stylus-replay cargo-stylus-check +``` + +Install GDB if it's not already installed: + +```sh +sudo apt-get install gdb +``` + +2. **Deploy your Stylus contract**: For this guide, we demonstrate how to debug the execution of the `increment()` method in the [stylus-hello-world](https://github.com/OffchainLabs/stylus-hello-world) smart contract. In Rust, it looks something like this, within `src/lib.rs`: + +```sh +#[external] +impl Counter { + ... + /// Increments number and updates its value in storage. + pub fn increment(&mut self) { + let number = self.number.get(); + self.set_number(number + U256::from(1)); + } + ... +} +``` + +Set your RPC endpoint to a node with **tracing enabled** and your private key: + +```sh +export RPC_URL=... +export PRIV_KEY=... +``` + +and deploy your contract: + +```sh +cargo stylus deploy --private-key=$PRIV_KEY --endpoint=$RPC_URL +``` + +You should see an output similar to: + +```sh +contract size: 4.0 KB +wasm size: 12.1 KB +contract size: 4.0 KB +deployed code at address: 0x2c8d8a1229252b07e73b35774ad91c0b973ecf71 +wasm already activated! +``` + +3. **Send a transaction**: First, set the address of the deployed contract as an environment variable: + +```sh +export ADDR=0x2c8d8a1229252b07e73b35774ad91c0b973ecf71 +``` + +And send a transaction using `Cast`: + +```sh +cast send --rpc-url=$RPC_URL --private-key=$PRIV_KEY $ADDR "increment()" +``` + +4. **Replay the transaction with GDB**: Now, we can replay the transaction with cargo stylus and GDB to inspect each step of it against our source code. Make sure GDB is installed and that you are on a Linux, x86 system. + Also, you should set the transaction hash as an environment variable: + +```sh +export TX_HASH=0x18b241841fa0a59e02d3c6d693750ff0080ad792204aac7e5d4ce9e20c466835 +``` + +And replay the transaction: + +```sh +cargo stylus replay --tx=$TX_HASH --endpoint=$RPC_URL +``` + +GDB will load and set a breakpoint automatically at the `user_entrypoint` internal Stylus function. + +```sh +[Detaching after vfork from child process 370003] + +Thread 1 "cargo-stylus-re" hit Breakpoint 1, stylus_hello_world::user_entrypoint (len=4) at src/lib.rs:38 +38 #[entrypoint] +(gdb) +``` + +5. **Debugging with GDB**: Now, set a breakpoint at the `increment()` method: + +```sh +(gdb) b stylus_hello_world::Counter::increment +Breakpoint 2 at 0x7ffff7e4ee33: file src/lib.rs, line 69. +``` + +Then, type `c` to continue the execution and you will reach that line where `increment` is called: + +```sh +(gdb) c +``` + +Once you reach the `increment` method, inspect the state: + +```sh +Thread 1 "cargo-stylus-re" hit Breakpoint 2, stylus_hello_world::Counter::increment (self=0x7fffffff9ae8) at src/lib.rs:69 +69 let number = self.number.get(); +(gdb) p number +``` + +### Trace a transaction + +For traditional tracing, `cargo stylus` supports calls to `debug_traceTransaction`. To trace a transaction, you can use the following command: + +```sh +cargo stylus trace [OPTIONS] --tx +``` + +Options: + +```sh + -e, --endpoint RPC endpoint [default: http://localhost:8547] + -t, --tx Tx to replay + -p, --project Project path [default: .] + -h, --help Print help + -V, --version Print version +``` + +Run the following command to obtain a trace output: + +```sh +cargo stylus trace --tx=$TX_HASH --endpoint=$RPC_URL +``` + +This will produce a trace of the functions called and [ink](https://docs.arbitrum.io/stylus/concepts/stylus-gas#ink-and-gas) left along each method: + +```sh +[{"args":[0,0,0,4],"endInk":846200000,"name":"user_entrypoint","outs":[],"startInk":846200000},{"args":[],"endInk":846167558,"name":"msg_reentrant","outs":[0,0,0,0],"startInk":846175958},{"args":[],"endInk":846047922,"name":"read_args","outs":[208,157,224,138],"startInk":846061362},{"args":[],"endInk":845914924,"name":"msg_value","outs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startInk":845928364},{"args":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"endInk":227196069,"name":"storage_load_bytes32","outs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startInk":844944549},{"args":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],"endInk":226716083,"name":"storage_cache_bytes32","outs":[],"startInk":226734563},{"args":[0],"endInk":226418732,"name":"storage_flush_cache","outs":[],"startInk":226486805},{"args":[],"endInk":226362319,"name":"write_result","outs":[],"startInk":226403481},{"args":[],"endInk":846200000,"name":"user_returned","outs":[0,0,0,0],"startInk":846200000}] +``` diff --git a/arbitrum-docs/stylus/reference/testnet-information.md b/arbitrum-docs/stylus/reference/testnet-information.md index 30a8945a0..9eab87960 100644 --- a/arbitrum-docs/stylus/reference/testnet-information.md +++ b/arbitrum-docs/stylus/reference/testnet-information.md @@ -21,10 +21,10 @@ Stylus is undergoing major upgrades, and some improvements are expected to requi This table provides an overview of the available public RPC endpoints for the Stylus testnet and necessary details to interact with them. -| Name | RPC URL | Chain ID | Block explorer | Underlying chain | Sequencer feed URL | Sequencer endpoint⚠️ | -| -------------------------------- | -------------------------------------- | -------- | -------------------------------------------- | ---------------- | ------------------------------------- | ------------------------------------------------ | -| Arbitrum Sepolia | https://sepolia-rollup.arbitrum.io/rpc | 421614 | https://sepolia.arbiscan.io | Sepolia | wss://sepolia-rollup.arbitrum.io/feed | https://sepolia-rollup-sequencer.arbitrum.io/rpc | -| Stylus testnet (v2-deprecated) | https://stylusv2.arbitrum.io/rpc | 13331371 | https://stylusv2-explorer.arbitrum.io/ | Arbitrum Sepolia | wss://stylusv2.arbitrum.io/feed | https://stylusv2-sequencer.arbitrum.io/rpc | +| Name | RPC URL | Chain ID | Block explorer | Underlying chain | Sequencer feed URL | Sequencer endpoint⚠️ | +| ------------------------------ | -------------------------------------- | -------- | -------------------------------------------- | ---------------- | ------------------------------------- | ------------------------------------------------ | +| Arbitrum Sepolia | https://sepolia-rollup.arbitrum.io/rpc | 421614 | https://sepolia.arbiscan.io | Sepolia | wss://sepolia-rollup.arbitrum.io/feed | https://sepolia-rollup-sequencer.arbitrum.io/rpc | +| Stylus testnet (v2-deprecated) | https://stylusv2.arbitrum.io/rpc | 13331371 | https://stylusv2-explorer.arbitrum.io/ | Arbitrum Sepolia | wss://stylusv2.arbitrum.io/feed | https://stylusv2-sequencer.arbitrum.io/rpc | | Stylus testnet (v1-deprecated) | https://stylus-testnet.arbitrum.io/rpc | 23011913 | https://stylus-testnet-explorer.arbitrum.io/ | Arbitrum Sepolia | wss://stylus-testnet.arbitrum.io/feed | https://stylus-testnet-sequencer.arbitrum.io/rpc | :::caution diff --git a/arbitrum-docs/stylus/stylus-quickstart.md b/arbitrum-docs/stylus/stylus-quickstart.md index 1e83dc4ca..b92bf000e 100644 --- a/arbitrum-docs/stylus/stylus-quickstart.md +++ b/arbitrum-docs/stylus/stylus-quickstart.md @@ -50,7 +50,7 @@ If you’re using [MetaMask](https://metamask.io/), simply click the dropdown at The Stylus testnet settles directly to the [Arbitrum Sepolia](/build-decentralized-apps/03-public-chains.md#arbitrum-sepolia) testnet. Follow these steps to acquire testnet ETH on the Stylus testnet: -1. Navigate to [https://bwarelabs.com/faucets/arbitrum-stylus-testnet](https://bwarelabs.com/faucets/arbitrum-stylus-testnet). +1. Navigate to [https://bwarelabs.com/faucets/arbitrum-sepolia](https://bwarelabs.com/faucets/arbitrum-sepolia). 2. Enter your wallet address into the text field. 3. Click `Claim` and optionally follow the second step to receive extra testnet tokens. 4. You should now have Sepolia ETH on the Stylus testnet. diff --git a/website/package.json b/website/package.json index 92c3797a7..89bf17867 100644 --- a/website/package.json +++ b/website/package.json @@ -6,7 +6,7 @@ "docusaurus": "docusaurus", "install_sdk_dependencies": "cd ../arbitrum-sdk && yarn install && cd ../website", "generate_precompiles_ref_tables": "ts-node src/scripts/precompile-reference-generator.ts", - "start": "docusaurus start", + "start": "yarn clear && yarn install_sdk_dependencies && docusaurus start", "build_translation": "yarn ts-node ./src/scripts/move-untranslated-files.ts", "build": "yarn install_sdk_dependencies && docusaurus build", "swizzle": "docusaurus swizzle", diff --git a/website/sidebars.js b/website/sidebars.js index 9377a7e6d..e6cdc043f 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -58,7 +58,7 @@ const sidebars = { }, { type: 'doc', - label: 'Block numbers and time', + label: 'Block gas limit, numbers and time', id: 'build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time', }, { @@ -324,6 +324,13 @@ const sidebars = { // q: why use an anchor html tag here? // a: see note at end of file }, + { + type: 'html', + value: + 'Add new validators to Orbit chain ', + // q: why use an anchor html tag here? + // a: see note at end of file + }, { type: 'doc', id: 'launch-orbit-chain/concepts/anytrust-orbit-chain-keyset-generation', @@ -428,6 +435,11 @@ const sidebars = { id: 'stylus/stylus-quickstart', label: 'Quickstart (Rust)', }, + { + type: 'doc', + id: 'stylus/concepts/stylus-cache-manager', + label: 'Stylus caching strategy', + }, { type: 'html', value: @@ -440,6 +452,12 @@ const sidebars = { label: 'Testnets', id: 'stylus/reference/testnet-information', }, + { + type: 'link', + label: 'Stylus by example', + href: 'https://stylus-by-example.org/', + }, + { type: 'category', label: 'Gas and ink', @@ -490,6 +508,11 @@ const sidebars = { label: 'Reduce the size of WASM binaries', id: 'stylus/how-tos/optimizing-binaries', }, + { + type: 'doc', + label: 'Debug Stylus transactions', + id: 'stylus/how-tos/debugging-stylus-tx', + }, { type: 'link', label: 'Rust crate docs', diff --git a/website/src/css/partials/_variables.scss b/website/src/css/partials/_variables.scss index 4be91b5da..ad232fc4c 100644 --- a/website/src/css/partials/_variables.scss +++ b/website/src/css/partials/_variables.scss @@ -12,7 +12,7 @@ --arbitrum-primary-button-bg: black; --arbitrum-primary-button-text: white; --stylus-brand-color-dark: #b70458; - --stylus-brand-color: #E3066E; + --stylus-brand-color: #e3066e; --ifm-color-primary: #007bdd; --ifm-color-primary-dark: #295f78; --ifm-color-primary-darker: #275771; diff --git a/website/src/resources/globalVars.js b/website/src/resources/globalVars.js index dcd3d92cc..d434dd6ee 100644 --- a/website/src/resources/globalVars.js +++ b/website/src/resources/globalVars.js @@ -14,7 +14,7 @@ const sepoliaForceIncludePeriodBlocks = 5760; const globalVars = { // Node docker images - latestNitroNodeImage: 'offchainlabs/nitro-node:v2.3.4-b4cc111', + latestNitroNodeImage: 'offchainlabs/nitro-node:v3.1.0-7d1d84c', latestClassicNodeImage: 'offchainlabs/arb-node:v1.4.5-e97c1a4', // Node snapshots (taken around April 20th, 2013) @@ -31,7 +31,7 @@ const globalVars = { // Nitro Github references nitroRepositorySlug: 'nitro', - nitroVersionTag: 'v2.3.4', + nitroVersionTag: 'v3.1.0', nitroPathToPrecompiles: 'precompiles', nitroContractsRepositorySlug: 'nitro-contracts', diff --git a/website/static/building-faqs.json b/website/static/building-faqs.json index 9ef5ac664..a90563868 100644 --- a/website/static/building-faqs.json +++ b/website/static/building-faqs.json @@ -21,7 +21,7 @@ {"question": "What is the WASM module root?","answer": "

\nThe WASM module root is a 32 byte hash, which is a merkelization of the Go replay binary and its dependencies.\n

\n\n

\nThe replay binary is much too large to post on-chain, so this hash is set in the L1 rollup contract to determine the correct replay binary during fraud proofs.\n

\n\n

\nYou can find more information in How to customize your Orbit chain's behavior.\n

\n\n

\n\n

\n\n","key": "what-is-the-wasm-module-root"}, {"question": "Why do I get a \"gas required exceeds allowance\" when trying to estimate the gas costs of a request?","answer": "

\nDuring an eth_estimateGas call the actual request will be simulated on the node, so if the transaction reverts or if there aren't enough funds in the wallet that's making the call (usually the from parameter), the eth_estimateGas request will return the error gas required exceeds allowance.\n

\n\n

\nMake sure you have enough funds in your wallet, and the gas fields of the request (if you're using them) are correctly set.\n

\n\n","key": "why-do-i-get-a-gas-required-exceeds-allowance-when-trying-to-estimate-the-gas-costs-of-a-request"}, {"question": "How can I verify that an L2 block has been processed as part of a specific RBlock?","answer": "

\nIf you want to verify that the latest confirmed (or created) assertion has processed a specific L2 block, you can follow these steps:\n

\n\n
    \n
  1. From the rollup contract, obtain the latest confirmed (or created) Rblock through the function latestConfirmed (or latestNodeCreated). In this context, we refer to RBlocks as \"nodes\".
  2. \n
  3. Obtain the node information through getNode
  4. \n
  5. Find the NodeCreated event that was emitted when that node was created.
  6. \n
  7. In that NodeCreated event, there's an assertion property that contains the state of the chain before processing the specified blocks, and after processing them. Get the afterState.globalState property
  8. \n
  9. That value contains a bytes32Vals array with the latest L2 block hash processed in the first element.
  10. \n
\n

\nYou can find an example script in our arbitrum-tutorials repository.\n

\n\n","key": "how-can-i-verify-that-an-l2-block-has-been-processed-as-part-of-a-specific-rblock"}, -{"question": "Why is the fee of some Classic transactions slightly different than the multiplication of gasLimit and effectiveGasPrice?","answer": "

\nGas prices in Classic transactions worked a bit differently than in Nitro transactions. Classic transactions handled four different prices: L1 fixed, L1 calldata, L2 computation and L2 storage. You can see all those prices in the Advanced TxInfo of Arbiscan (here's an example).\n

\n\n

\nWhen querying the receipt of a Classic transaction on a Nitro node, there's some calculation done to get an effectiveGasPrice that is close to (but not exactly) what those four prices represent. That's why if you multiply the gasLimit by the effectiveGasPrice you might end up with a transaction fee that is slightly different than the actual fee paid.\n

\n\n

\nTo get the exact fees paid, you can query a Classic node, which will return all the exact information.\n

\n\n

\n\n

\n\n","key": "why-is-the-fee-of-some-classic-transactions-slightly-different-than-the-multiplication-of-gaslimit-and-effectivegasprice"}, +{"question": "Why is the fee of some Classic transactions slightly different than the multiplication of gasLimit and effectiveGasPrice?","answer": "

\nGas prices in Classic transactions worked a bit differently than in Nitro transactions. Classic transactions handled four different prices: L1 fixed, L1 calldata, L2 computation and L2 storage. You can see all those prices in the Advanced TxInfo of Arbiscan (here's an example).\n

\n\n

\nWhen querying the receipt of a Classic transaction on a Nitro node, there's some calculation done to get an effectiveGasPrice that is close to (but not exactly) what those four prices represent. That's why if you multiply the gasLimit by the effectiveGasPrice you might end up with a transaction fee that is slightly different than the actual fee paid.\n

\n\n

\nTo get the exact fees paid, you can query a Classic node, which will return all the accurate information in an object called feeStats. That object will contain all the information split into the four different gas fields: prices, unitsUsed and paid (which is price * unitsUsed).\n

\n\n

\n\n

\n\n","key": "why-is-the-fee-of-some-classic-transactions-slightly-different-than-the-multiplication-of-gaslimit-and-effectivegasprice"}, {"question": "How can I update the information of my bridged token on Arbiscan?","answer": "

\nIf you have a native-L1 token that was bridged to L2 via the standard gateway, you might find that you can't claim ownership of the L2 contract of your token as it was generated by another contract.\n

\n\n

\nTo update its information on Arbiscan (logo, socials, etc.), you can open a ticket through Arbiscan support system and request them to replicate the information of your token on L1 to L2.\n

\n\n

\n\n

\n\n","key": "how-can-i-update-the-information-of-my-bridged-token-on-arbiscan"}, {"question": "Why does my transaction revert with InvalidFEOpcode when using Foundry?","answer": "

\nFoundry and other similar development tools that enable chain forking, do not support Arbitrum precompiles. If your transaction is calling a precompile, it is likely that it will revert with InvalidFEOpcode.\n

\n\n

\nTo rule out that possibility, it is recommended to send the transaction with a different tool.\n

\n\n

\n\n

\n\n","key": "why-does-my-transaction-revert-with-invalidfeopcode-when-using-foundry"}, {"question": "Why do I receive an \"intrinsic gas too low\" error when sending a transaction even with a high gas price?","answer": "

\nThe error intrinsic gas too low usually refers to not providing enough gas to pay for the L1 component of the transaction fees. This is usually a problem related to not setting a high enough gas limit (instead of gas price), due to how Arbitrum handles gas. You can find more information in the article Understanding Arbitrum: 2-dimensional fees and the page How to estimate gas.\n

\n\n

\n\n

\n\n","key": "why-do-i-receive-an-intrinsic-gas-too-low-error-when-sending-a-transaction-even-with-a-high-gas-price"}, diff --git a/website/static/building-orbit-faqs.json b/website/static/building-orbit-faqs.json index e6513d5f5..9cb263dee 100644 --- a/website/static/building-orbit-faqs.json +++ b/website/static/building-orbit-faqs.json @@ -11,7 +11,7 @@ {"question": "Is there any cross-chain bridging solution between two Orbit chains?","answer": "

\nThere is currently no Orbit-to-Orbit native bridging solution, other than going through the parent chain (if they share the same parent chain). However, there are many third-party bridges that have expressed interest in supporting Orbit chains.\n

\n\n

\n\n

\n\n","key": "is-there-any-crosschain-bridging-solution-between-two-orbit-chains"}, {"question": "Is there an official block explorer for Orbit chains?","answer": "

\nOrbit chains deployments usually come with an open-source blockscout explorer by default, but there are many third-party solutions that have expressed interest in supporting Orbit chains.\n

\n\n

\n\n

\n\n","key": "is-there-an-official-block-explorer-for-orbit-chains"}, {"question": "Is there any indexing solution that supports Orbit chains?","answer": "

\nSimilar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Orbit chains.\n

\n\n

\n\n

\n\n","key": "is-there-any-indexing-solution-that-supports-orbit-chains"}, -{"question": "Can I increase the maximum contract size for my Orbit chain?","answer": "

\nYes, but only on testnets for now. You can use our Orbit SDK (available for deployments on testnet), and configure the parameters MaxCodeSize and MaxInitCodeSize when calling prepareNodeConfig.\n

\n\n

\n\n

\n\n","key": "can-i-increase-the-maximum-contract-size-for-my-orbit-chain"}, +{"question": "Can I increase the maximum contract size for my Orbit chain?","answer": "

\nYes, Orbit supports an increased smart contract size limit of up to 96kB. You can use our Orbit SDK and configure the parameters MaxCodeSize and MaxInitCodeSize when calling prepareNodeConfig. Note that the smart contract size limit parameters can't be changed via upgrade after deployment.\n

\n\n

\n\n

\n\n","key": "can-i-increase-the-maximum-contract-size-for-my-orbit-chain"}, {"question": "How can I modify Nitro to force posting an invalid assertion and test the fraud proof mechanism?","answer": "

\nForcing an invalid assertion in the chain is not supported at the moment. However, if you're building Nitro locally, you can run the following test that goes through the whole rollup/challenge mechanism:\n

\n\n```shell\ngo test ./system_tests/ -tags=challengetest -run=TestChallenge\n\n```\n

\n\n

\n\n","key": "how-can-i-modify-nitro-to-force-posting-an-invalid-assertion-and-test-the-fraud-proof-mechanism"}, {"question": "What fee collectors can be configured on my chain?","answer": "

\nThere are 4 fee types that can be configured on an Orbit chain:\n

\n\n
    \n
  • L2 base fee: L2 execution fees corresponding to the minimum base price of the chain. This is paid to the infraFeeAccount, which can be set by calling ArbOwner.setInfraFeeAccount().
  • \n
  • L2 surplus fee: L2 execution fees above the minimum base price (in the case of congestion). This is paid to the networkFeeAccount, which can be set by calling ArbOwner.setNetworkFeeAccount().
  • \n
  • L1 base fee: Relative fees for posting a transaction on the parent chain. This is paid ultimately to the fee collector of the active batch poster. The batch poster can be set by calling SequencerInbox.setIsBatchPoster() on the parent chain. And a different fee collector for that batch poster can be specified by calling ArbAggregator.setFeeCollector().
  • \n
  • L1 surplus fee: Any extra fees rewarded to the batch poster. This is paid to a specific L1RewardRecipient, which can be set by calling ArbOwner.setL1PricingRewardRecipient()
  • \n
\n

\nMore detailed information about fees can be found in the L1 fees and L2 fees pages.\n

\n\n

\nInformation about the precompiles methods can be found in the Precompiles reference page.\n

\n\n","key": "what-fee-collectors-can-be-configured-on-my-chain"} ] \ No newline at end of file diff --git a/website/static/glossary.json b/website/static/glossary.json index 5dd7bb880..d87422759 100644 --- a/website/static/glossary.json +++ b/website/static/glossary.json @@ -21,7 +21,7 @@ "batch":{"title":"Batch","text":"

\nA group of Arbitrum transactions posted in a single transaction on the Underlying Chain into the Fast Inbox by the Sequencer.\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":"

\nA 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":"

\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

"}, +"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":"

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

"}, "cap-finance":{"title":"CAP Finance","text":"

\nWidely considered the most degen community on Arbitrum.\n
\n\n
\nCAP is a decentralized trading protocol. It's designed to be fast and easy to use by anyone.\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

"},