From 43c16d26e1037f62ab1a544c7eca520d1a3a9545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 11:51:39 -0800 Subject: [PATCH 01/13] use Jason notion-docs-generator mod --- package.json | 2 +- yarn.lock | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 480232ce9c..de7f6e1dba 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", "@docusaurus/module-type-aliases": "^3.3.2", - "@offchainlabs/notion-docs-generator": "^0.1.0", + "@offchainlabs/notion-docs-generator": "github:OffchainLabs/notion-docs-generator#add-question-integration", "@offchainlabs/prettier-config": "0.2.1", "@tsconfig/docusaurus": "^2.0.3", "@types/node": "^22.10.10", diff --git a/yarn.lock b/yarn.lock index da65ff6989..fa07b0ce43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4189,10 +4189,9 @@ dependencies: "@octokit/openapi-types" "^24.2.0" -"@offchainlabs/notion-docs-generator@^0.1.0": +"@offchainlabs/notion-docs-generator@github:OffchainLabs/notion-docs-generator#add-question-integration": version "0.1.0" - resolved "https://registry.yarnpkg.com/@offchainlabs/notion-docs-generator/-/notion-docs-generator-0.1.0.tgz#f263c4f7ddc3e47f21b7d479a0a6ba69894fc86e" - integrity sha512-4AEoSGPAgZDvH2B2qSzH5WYPCFVJCNm1YBY7VbK0P6DaQOH9ONkBpm+bYNIsyAg2ktL1WRIXR6SQ+T8g4+rb/Q== + resolved "https://codeload.github.com/OffchainLabs/notion-docs-generator/tar.gz/9b6e0d52ef26e182b92edb277024adfa34303b46" dependencies: "@notionhq/client" "^2.2.3" "@types/node" "^18.11.18" From d7e40b2c67e055fc47c720f48cfc98b116a5415f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 18:34:05 -0800 Subject: [PATCH 02/13] feat: integrate question module to generate miscellaneous Q&A - Import Question, QuestionType, lookupQuestions, renderRichTexts from notion-docs-generator - Add RenderedQuestion type for question rendering - Create helper functions: generateQuestionKey and renderQuestion - Add rendering functions for MDX and JSON output formats - Query all questions from Notion database without filtering - Handle rendering errors gracefully by skipping problematic questions - Generate static/miscellaneous-qa.json and docs/partials/_miscellaneous-QA.mdx --- scripts/notion-update.ts | 233 ++++++++++++++++++++++++++------------- 1 file changed, 156 insertions(+), 77 deletions(-) diff --git a/scripts/notion-update.ts b/scripts/notion-update.ts index 2bfec68fa4..7e883140ca 100644 --- a/scripts/notion-update.ts +++ b/scripts/notion-update.ts @@ -1,4 +1,4 @@ -import { Client } from '@notionhq/client' +import { Client } from '@notionhq/client'; import { FAQ, RenderedKnowledgeItem, @@ -11,10 +11,14 @@ import { LinkableTerms, LinkValidity, RenderMode, -} from '@offchainlabs/notion-docs-generator' -import fs from 'fs' -import dotenv from 'dotenv' -dotenv.config() + Question, + QuestionType, + lookupQuestions, + renderRichTexts, +} from '@offchainlabs/notion-docs-generator'; +import fs from 'fs'; +import dotenv from 'dotenv'; +dotenv.config(); // Local implementation of escapeForJSON utility function escapeForJSON(str: string): string { @@ -23,44 +27,71 @@ function escapeForJSON(str: string): string { .replace(/"/g, '\\"') .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') - .replace(/\t/g, '\\t') + .replace(/\t/g, '\\t'); } +// Helper to convert question text to URL-safe key +function generateQuestionKey(question: string): string { + return question + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .substring(0, 100); +} + +// Helper to render a single Question to RenderedQuestion +function renderQuestion(question: Question, linkableTerms: LinkableTerms): RenderedQuestion { + const questionText = renderRichTexts(question.question, linkableTerms, RenderMode.Plain).trim(); + + const answerText = renderRichTexts(question.answer, linkableTerms, RenderMode.Markdown).trim(); + + return { + question: questionText, + answer: answerText, + key: generateQuestionKey(questionText), + }; +} + +// Rendered question type (similar to RenderedKnowledgeItem but for questions) +type RenderedQuestion = { + question: string; // Plain text question + answer: string; // Markdown formatted answer + key: string; // URL-safe key +}; + // Types type CMSContents = { - getStartedFAQs: RenderedKnowledgeItem[] - nodeRunningFAQs: RenderedKnowledgeItem[] - buildingFAQs: RenderedKnowledgeItem[] - buildingStylusFAQs: RenderedKnowledgeItem[] - orbitFAQs: RenderedKnowledgeItem[] - bridgingFAQs: RenderedKnowledgeItem[] -} + getStartedFAQs: RenderedKnowledgeItem[]; + nodeRunningFAQs: RenderedKnowledgeItem[]; + buildingFAQs: RenderedKnowledgeItem[]; + buildingStylusFAQs: RenderedKnowledgeItem[]; + orbitFAQs: RenderedKnowledgeItem[]; + bridgingFAQs: RenderedKnowledgeItem[]; + miscellaneousQuestions: RenderedQuestion[]; +}; // Notion client const notion = new Client({ auth: process.env.NOTION_TOKEN, -}) +}); // Helper functions export function recordValidity(record: Record): LinkValidity { if (record.status != '4 - Continuously publishing') { - return { reason: 'page not yet marked as ready' } + return { reason: 'page not yet marked as ready' }; } if (record.publishable != 'Publishable') { - return { reason: 'page not marked as publishable' } + return { reason: 'page not marked as publishable' }; } - return 'Valid' + return 'Valid'; } const isValid = (item: KnowledgeItem) => { - return recordValidity(item) === 'Valid' -} + return recordValidity(item) === 'Valid'; +}; // Content getter const getContentFromCMS = async (): Promise => { - const devDocsV2Project = await lookupProject( - notion, - 'Arbitrum developer docs portal v2.0' - ) + const devDocsV2Project = await lookupProject(notion, 'Arbitrum developer docs portal v2.0'); const getStartedFAQs = await lookupFAQs(notion, { filter: { @@ -85,7 +116,7 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); const nodeRunningFAQs = await lookupFAQs(notion, { filter: { @@ -110,7 +141,7 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); const buildingFAQs = await lookupFAQs(notion, { filter: { @@ -135,7 +166,7 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); const buildingStylusFAQs = await lookupFAQs(notion, { filter: { @@ -160,7 +191,7 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); const orbitFAQs = await lookupFAQs(notion, { filter: { @@ -185,7 +216,7 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); const bridgingFAQs = await lookupFAQs(notion, { filter: { @@ -210,7 +241,23 @@ const getContentFromCMS = async (): Promise => { direction: 'ascending', }, ], - }) + }); + + const miscellaneousQuestions = await lookupQuestions(notion, { + // No filter - include ALL questions regardless of status or type + // No sorts - no specific ordering + }); + + // Render questions and filter out any that fail to render + const renderedQuestions: RenderedQuestion[] = []; + for (const question of miscellaneousQuestions) { + try { + renderedQuestions.push(renderQuestion(question, {})); + } catch (error) { + console.error(`Failed to render question ${question.id}:`, error); + // Skip questions that fail to render (e.g., contain unsupported links) + } + } return { getStartedFAQs: getStartedFAQs @@ -231,35 +278,57 @@ const getContentFromCMS = async (): Promise => { bridgingFAQs: bridgingFAQs .filter(isValid) .map((faq: FAQ) => renderKnowledgeItem(faq, {}, RenderMode.Markdown)), - } -} + miscellaneousQuestions: renderedQuestions, + }; +}; // Renderer for FAQs structured data in JSON const renderJSONFAQStructuredData = (faqs: RenderedKnowledgeItem[]) => { const printItem = (faq: RenderedKnowledgeItem) => { - const faqQuestion = escapeForJSON(faq.titleforSort) - const faqAnswer = escapeForJSON(faq.text) - const faqKey = escapeForJSON(faq.key) - return `{"question": "${faqQuestion}","answer": "${faqAnswer}","key": "${faqKey}"}` - } + const faqQuestion = escapeForJSON(faq.titleforSort); + const faqAnswer = escapeForJSON(faq.text); + const faqKey = escapeForJSON(faq.key); + return `{"question": "${faqQuestion}","answer": "${faqAnswer}","key": "${faqKey}"}`; + }; - return '[\n' + faqs.map(printItem).join(',\n') + '\n]' -} + return '[\n' + faqs.map(printItem).join(',\n') + '\n]'; +}; // Renderer for FAQ questions and answers const renderFAQs = (faqs: RenderedKnowledgeItem[]) => { const printItem = (faq: RenderedKnowledgeItem) => { - return `### ${faq.title}` + '\n' + `${faq.text}` - } + return `### ${faq.title}` + '\n' + `${faq.text}`; + }; - return faqs.map(printItem).join('\n\n') -} + return faqs.map(printItem).join('\n\n'); +}; + +// Renderer for Questions in MDX format +const renderQuestions = (questions: RenderedQuestion[]): string => { + const printItem = (q: RenderedQuestion) => { + return `### ${q.question}\n\n${q.answer}`; + }; + + return questions.map(printItem).join('\n\n'); +}; + +// Renderer for Questions structured data in JSON +const renderJSONQuestionStructuredData = (questions: RenderedQuestion[]): string => { + const printItem = (q: RenderedQuestion) => { + const questionText = escapeForJSON(q.question); + const answerText = escapeForJSON(q.answer); + const questionKey = escapeForJSON(q.key); + return `{"question": "${questionText}","answer": "${answerText}","key": "${questionKey}"}`; + }; + + return '[\n' + questions.map(printItem).join(',\n') + '\n]'; +}; async function generateFiles() { - const linkableTerms: LinkableTerms = {} + const linkableTerms: LinkableTerms = {}; // Getting content from the CMS - const cmsContents = await getContentFromCMS() + const cmsContents = await getContentFromCMS(); // Glossary // -------- @@ -271,87 +340,97 @@ async function generateFiles() { page: page, valid: recordValidity(item), notionURL: item.url, - } + }; } - } + }; // FAQs // ---- // Get started fs.writeFileSync( 'static/get-started-faqs.json', - renderJSONFAQStructuredData(cmsContents.getStartedFAQs) - ) + renderJSONFAQStructuredData(cmsContents.getStartedFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-users-partial.mdx', - renderFAQs(cmsContents.getStartedFAQs) - ) + renderFAQs(cmsContents.getStartedFAQs), + ); // Node running fs.writeFileSync( 'static/node-running-faqs.json', - renderJSONFAQStructuredData(cmsContents.nodeRunningFAQs) - ) + renderJSONFAQStructuredData(cmsContents.nodeRunningFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-nodes-partial.mdx', - renderFAQs(cmsContents.nodeRunningFAQs) - ) + renderFAQs(cmsContents.nodeRunningFAQs), + ); // Building fs.writeFileSync( 'static/building-faqs.json', - renderJSONFAQStructuredData(cmsContents.buildingFAQs) - ) + renderJSONFAQStructuredData(cmsContents.buildingFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-building-partial.mdx', - renderFAQs(cmsContents.buildingFAQs) - ) + renderFAQs(cmsContents.buildingFAQs), + ); // Stylus fs.writeFileSync( 'static/building-stylus-faqs.json', - renderJSONFAQStructuredData(cmsContents.buildingStylusFAQs) - ) + renderJSONFAQStructuredData(cmsContents.buildingStylusFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-stylus-partial.mdx', - renderFAQs(cmsContents.buildingStylusFAQs) - ) + renderFAQs(cmsContents.buildingStylusFAQs), + ); // Orbit fs.writeFileSync( 'static/building-orbit-faqs.json', - renderJSONFAQStructuredData(cmsContents.orbitFAQs) - ) + renderJSONFAQStructuredData(cmsContents.orbitFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-arbitrum-chain-partial.mdx', - renderFAQs(cmsContents.orbitFAQs) - ) + renderFAQs(cmsContents.orbitFAQs), + ); // Bridging fs.writeFileSync( 'static/bridging-faqs.json', - renderJSONFAQStructuredData(cmsContents.bridgingFAQs) - ) + renderJSONFAQStructuredData(cmsContents.bridgingFAQs), + ); fs.writeFileSync( 'docs/partials/_troubleshooting-bridging-partial.mdx', - renderFAQs(cmsContents.bridgingFAQs) - ) + renderFAQs(cmsContents.bridgingFAQs), + ); + + // Miscellaneous Questions + fs.writeFileSync( + 'static/miscellaneous-qa.json', + renderJSONQuestionStructuredData(cmsContents.miscellaneousQuestions), + ); + fs.writeFileSync( + 'docs/partials/_miscellaneous-QA.mdx', + renderQuestions(cmsContents.miscellaneousQuestions), + ); } async function main() { try { - await generateFiles() + await generateFiles(); } catch (e: unknown) { if (await handleRenderError(e, notion)) { - process.exit(1) + process.exit(1); } - throw e + throw e; } } main() .then(() => process.exit(0)) - .catch(err => { - console.error(err) - process.exit(1) - }) + .catch((err) => { + console.error(err); + process.exit(1); + }); From f01e43dbed73f9900a74307dc4e981c61914a60f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 18:34:26 -0800 Subject: [PATCH 03/13] feat: add generated miscellaneous Q&A files Generated from Notion question database using the updated notion-update script --- docs/partials/_miscellaneous-QA.mdx | 1210 +++++++++++++++++++++++++++ static/miscellaneous-qa.json | 812 ++++++++++++++++++ 2 files changed, 2022 insertions(+) create mode 100644 docs/partials/_miscellaneous-QA.mdx create mode 100644 static/miscellaneous-qa.json diff --git a/docs/partials/_miscellaneous-QA.mdx b/docs/partials/_miscellaneous-QA.mdx new file mode 100644 index 0000000000..322feb7f6d --- /dev/null +++ b/docs/partials/_miscellaneous-QA.mdx @@ -0,0 +1,1210 @@ +### When building Orbit L2 and Orbit L3 on the mainnet, the advantages of L3 over L2 appear limited to lower gas fees, no Arbitrum DAO approval, and no license fee. Given perceived disadvantages like longer finality and increased bridge processing, what specific features highlight the advantages of Orbit L3? Data or experienced-based insights are needed regarding: 1) Customization, 2) Performance/Operational factors, and 3) Other aspects. + +The choice between Orbit L2 and L3 mainly depends on customization needs and settlement preferences. + +Some common points of confusion first: +• **Arbitrum DAO approval:** Not required for Orbit L2 or L3. +• **AEP license fee:** Applies only if the chain settles directly to Ethereum or any other parent chain. Avoided when settling to Arbitrum One or Nova. +• **Finality & gas fees:** Comparable for L2 and L3 when using the same parent chain; AnyTrust mode provides low fees for both. + +**Key advantages of Orbit L3:** + +1. **Cost optimization:** Avoids AEP license fees by settling to Arbitrum One/Nova instead of Ethereum (**USP of L3**) +2. **Customization:** Greater flexibility in settlement and configuration options, especially when leveraging a parent chain's AnyTrust setup. +3. **Performance:** Faster, cheaper bridging to its parent chain. +4. **Ecosystem alignment:** Stronger integration with the Arbitrum ecosystem, benefiting from shared tooling and potential ecosystem support. + +### Regarding AnyTrust technology, assuming 500 GB of data is stored per month: + +1. What are the costs for DAS storage + server operations? +2. What are the costs when using Celestia DAS? +3. Are there any alternative methods recommended? + Additionally: + • When using the DAS method, is the DACert generation cycle adjustable? How is it set up for Nova? + • For Celestia DA, is the price per 1 MB sufficient, or are there other considerations? + +With AnyTrust, the **same set of entities act as both validators and committee members**, so no additional trust assumptions are needed. + +• **DACert Generation:** There is no fixed generation cycle. DACerts are created **immediately** upon each data store request from the batch poster. +• **Data Posting Parameters:** DACert/data posting is triggered when either: +◦ `--node.batch-poster.max-size` (maximum estimated compressed batch size) is reached, or +◦ `--node.batch-poster.max-delay` (maximum batch posting delay) is reached. + +**Costs:** +Celestia currently costs ~$0.08 USD / MB +An AnyTrust node will cost ~$200/node/month + +### What is the optimal number of validators required to operate a mainnet at the scale of Arbitrum One or Arbitrum Nova? Additionally, how many validators currently participate as stakers in these networks? + +On **Arbitrum One**, validation is **permissionless** under the **[BoLD](https://docs.arbitrum.io/how-arbitrum-works/bold/gentle-introduction)** protocol. Any participant running a BoLD-capable Nitro validator can take part in validation, meaning the number of active validators (or stakers) is **not fixed** and fluctuates over time based on participation. + +In contrast, **Arbitrum Nova** currently uses a **permissioned validation model**. Validation is handled by a set of **approximately 10 whitelisted validators**, with at least **five independent external challengers** apart from the operator to maintain security and integrity. + +For up-to-date information on validator participation and network details, refer to: +• [Arbitrum One – L2BEAT](https://l2beat.com/scaling/projects/arbitrum) +• [Arbitrum Nova – L2BEAT](https://l2beat.com/scaling/projects/nova) + +### Does the Validator receive and process user transactions directly from the RPC Node? It is understood that the RPC Provider represents an RPC Node, and that Validators and the Sequencer are independently connected. Is this understanding of the transaction flow correct? + +**The understanding of the direct transaction flow is incorrect.** +The **Validator cannot queue transactions**. For a transaction to be valid, it must be queued by the **Sequencer**. +The correct flow is: + +1. A user submits a transaction to an **RPC Node**. +2. The RPC Node **forwards** the transaction to the **Sequencer**. +3. The Sequencer **queues and orders** the transaction. +4. The Sequencer then sends the ordered transaction to the **Validator** via the **Sequencer Feed** for verification. + +**Even when a Validator endpoint acts as an RPC Provider, the transaction is immediately forwarded to the Sequencer for ordering, as the Validator's core function is verification.** + +### Arbitrum Sepolia uses a Rollup method. Is there a separate Arbitrum Nova testnet available? + +**No.** Since the **UX** for Arbitrum Rollup and AnyTrust (Nova's underlying technology) is the same, **a separate AnyTrust testnet is not needed.** + +### What is the theoretical maximum tps officially announced by Arbitrum and the prerequisites for it, and What is the realistic maximum tps possible in Arbitrum One and the prerequisites for it? + +In general we prefer to use throughput (gas /s) over TPS, as TPS is dependent on the transaction type. So for any throughput value you can just divide by the gas of your transaction to get TPS (standard is to use `eth_call` which is 22K gas) + +**OFFICIAL TPS:**the maximum official TPS for an orbit chain is, ~14,500 TPS: +• 32M block gas limit +• 100ms block times +• eth_call transactions (22,000 gas/tx) +• Standard hardwareThis value is useful for PEAK load that can be sustained. In practice, prices start to rise and demand slows down + +**REALISTIC TPS:**Taking historical data, during Arbitrum One's highest period of sustained peak usage, Arbitrum One operated at 50M gas/s for several hours. With modifications, several Orbit chains have sustained 100Mgas/s over multiple days with peaks of 400Mgas/s. These chains are built on AnyTrust DA which is our lowest cost configuration for an Orbit chainThe limitation in realistic cases is that higher gas prices caused users to delay their transactions, the hardware/chain operated completely normally. + +It's worth noting, two major focuses on our roadmap: +**1. Scalability**: We have several projects that will improve scalability to ensure Orbit chains can reach 100Megagas/s throughput (10^8 gas units, ~14.2x higher than the current sustainable limit). +a. Dynamic Pricing: [https://blog.arbitrum.io/dynamic-pricing-explainer/](https://blog.arbitrum.io/dynamic-pricing-explainer/) +b. Alt Client Developments: [https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/](https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/) +c. Nitro Max: we are internally benchmarking our node to allow Orbit chains to operate on higher hardware requirements + +**2. Fee Stabilization** +a. We're exploring several levers / set ups that we can implement to allow partners to deploy a chain that has smoother or near-constant fees on the chain + +### Are there any projects currently operating an L3 AnyTrust chain that settles on an L2 AnyTrust chain such as Arbitrum Nova? Additionally, when comparing Rollup and AnyTrust configurations—specifically L2 Rollup + L3 Rollup versus L2 Rollup + L3 AnyTrust—how do transaction fees differ on the L3? + +The only project that is an L3 AnyTrust chain settling on top of an L2 AnyTrust is Playblock. However, we don't encourage this setup. + +In Arbitrum's design, transaction fees are determined by a **two-dimensional gas model**, consisting of: + +1. **Execution cost:** The fee paid on the child chain for computation, storage, and execution resources. +2. **Data availability (DA) cost:** The fee paid on the parent chain for posting transaction data to ensure it is recorded and verifiable. + When execution costs are comparable, the total transaction fee difference primarily depends on the **data availability layer** used. + +**AnyTrust mode** provides significantly lower DA costs than **Rollup mode**, so an **L3 AnyTrust chain** will generally have lower fees than an **L3 Rollup chain**, regardless of whether the parent L2 uses Rollup or AnyTrust. + +Refer explanation doc [here](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9). + +### When connecting to an Orbit L3 node via an AWS Load Balancer (ELB) for HTTPS, issues are seen with Chain ID retrieval, token transfers, and Blockscout layout. The RPC (8449) and Blockscout (4000) ports are forwarded. Are more ports needed, or is the load balancer setup recommended? + +The current configuration, only exposing **ports 8449 and 4000**, should be sufficient if only those two services are needed. + +It is recommended to **configure WS endpoint** as well. The issues described may be due to a **network problem**. + +• **Testing:** Test the connection **without the load balancer** to determine if the issues are caused by the load balancer itself. + +Yes, it is better to have a load balancer. + +### If a chain is built using Orbit L3, is it possible to issue USDC directly on the L3 through Circle? + +A **native deployment of USDC** on an Orbit L3 chain is technically possible; however, only **Circle** can authorize and perform such a deployment. In practice, obtaining a native USDC issuance on an L3 would require coordination and approval from Circle and would likely involve **significant cost and operational complexity**. + +### If a custom gas token is used on the L3, does the batch poster need to hold ETH or ARB on the parent chain? + +It only needs to hold the **native gas token of the parent chain**, since it submits transactions there. For example, if the parent chain is **Arbitrum One or Arbitrum Nova**, the poster must hold **ETH**. The **ARB token is not used** as a gas token on any Arbitrum chain. [This document here](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer) may help understand more about Custom Gas Token on a rollup chain. + +### Is it possible for an Orbit chain to process 1 billion transactions per day (over 10,000 TPS) by adjusting parameters such as block time, gas limit per block, or gas limit per second? + +Simply increasing configuration parameters like block time or gas limits provides only **limited performance improvement (And this can onlu higher upper limit)**, as the main bottleneck lies in **EVM execution speed** and **node performance (determines lower limit)**. Additionally, the **minimum gas cost per on-chain transaction (21,000 gas)** is fixed by the EVM and cannot be reduced. + +To achieve higher throughput, it is recommended to: +• **Aggregate transactions** before submitting them on-chain. +• **Move computation off-chain** and store only the resulting state on-chain. +• Utilize **Stylus (EVM+)**, which significantly improves execution efficiency and can help achieve higher TPS. + +From a technical standpoint, an Orbit chain with **default parameters** achieves a **maximum theoretical throughput of around 6,095 TPS**, but this can be configured up to **approximately 15,238 TPS** (benchmarked against `eth_call` transactions). + +Maximum TPS is primarily governed by two parameters: +• **Block time:** Default is 250 ms, configurable down to 100 ms (a 2.5× increase in TPS). +• **Gas limit per block:** Default is 32,000,000 gas, and increasing this further boosts TPS but also accelerates **state growth**. + +However, it's important to distinguish between **theoretical and practical performance**. In real-world conditions, considering hardware, network latency, and system overhead, an Orbit chain typically achieves **400–700 TPS**, or roughly **33–60 million transactions per day**. + +Any claims of **billion-scale daily on-chain throughput** should therefore be viewed skeptically, as such performance is not technically achievable within realistic system and EVM constraints. + +### Isn't L3 generally understood to be cheaper than L2? What are the technical advantages of choosing L3 regarding customizability, performance, operational differences, and service operation based on platform experience? + +For any Nitro chain is **execution plus data availability (DA)** . The main difference between Orbit L2 and L3 lies in the **settlement layer** (the parent chain), since both use the same **Nitro stack**. The assumption that L3 is cheaper is mostly outdated as both L2 and L3 **can** use **AnyTrust mode**, which allows for similarly low gas fees. However with rollup mode, the dominant cost is L1 data posting. + +**Gas Fees:** +Transaction costs depend primarily on **data availability (DA)** rather than on whether a chain is L2 or L3. Since both can adopt AnyTrust DA, their fees are generally comparable. L3 is therefore not inherently cheaper than L2. Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1. + +Even in rollup mode, the pricing difference between L2 and L3 for gas fees are very similar, since when data is posted to the L2 from the L3, the L2 still needs to post that data to the L1 for DA. meaning even on L3 you will still be paying L2 and L1 DA fees. + +**One small point to note:** +• If it's an L3 chain, the data will be posted to L2 first, afterwards it will be posted to L1 by the L2 chain. +• If it's an L2 chain, then the data will be posted directly to L1. + +**Technical and Operational Advantages of L3:** +• **Settlement Flexibility:** L3 can settle on an L2 such as Arbitrum One or Nova +• **No AEP License Fee:** Chains settling on Arbitrum One or Nova avoid the AEP license fee that applies to L2s settling directly to Ethereum. + +### If building an Orbit L3 chain designed to handle around 1 billion transactions per day (approximately 12,000 TPS assuming even distribution), how many feed relays, full nodes, sequencer relays, sequencers, and validators would be required? The assumption is 80% write activity, 10% execution, and 10% read activity. Can the High-Availability Sequencer Architecture support this throughput? + +The High-Availability Sequencer Architecture is designed to he more reliable than a normal sequencer in that its cannot fail to a single fault point. Before estimating node counts, it is important to understand how **full nodes** and **sequencers** share responsibilities: +• **Read operations (calls):** + +Read-only queries are handled directly by full nodes without involving the sequencer. Read capacity scales horizontally—adding more full nodes increases read throughput. On average, a full node can handle around **1,000–1,500 read requests per second**. To support **10,000 RPS**, roughly **8–10 full nodes** would be needed, with additional nodes recommended for redundancy and traffic spikes. +• **Write operations (transactions):** + +All transactions are sent from full nodes to the sequencer, which orders and executes them. Only the sequencer determines transaction ordering, while full nodes follow and execute in that sequence. Write throughput does **not** scale with the number of full nodes; it is constrained by the **sequencer's single-threaded performance** and the ability of full nodes to keep up. + +The current Arbitrum network sustains around **7–12 million gas per second**, translating to roughly **500–600 simple ETH transfers per second.** Actual performance will vary depending on hardware, configuration, and transaction complexity. + +**Key Takeaway:** +• **Read capacity** can be increased by running additional full nodes. +• **Write capacity** depends on the sequencer's processing power rather than the number of nodes. Along with the power of the full nodes, since they need to be able to keep up with the sequencers transactions. +• The **High-Availability Sequencer Architecture** can be modified for more reliability within the network. + +### Are there any validator nodes directly operated by Arbitrum? + +Yes, we (Offchain Labs) run some validators. + +### How does the sequencer handle transaction surges? For instance, if 100,000 transactions are submitted simultaneously, will all be processed eventually, or will some fail? Additionally, in such cases, is it necessary to use Retryable Tickets to ensure reliable processing? + +The sequencer maintains an internal **transaction queue** to handle incoming transactions. When multiple valid and properly priced transactions arrive simultaneously, they are placed in this queue and processed sequentially over subsequent blocks until the backlog clears. The queue can hold approximately **1,000 transactions by default**, and any remaining transactions will get rejected if they cannot get in the queue within 12 seconds. + +Since the **EVM executes transactions sequentially**, the sequencer can process only one transaction at a time. Transactions can fail in the sequencer or during execution. They will fail in the sequencer if a transaction has an incorrect nonce, incorrect signature, insufficient funds, anything that can be checked before execution which will lead to the transaction never being executed. Transactions can also fail mid execution do to reverting which can happen for many many reasons. In cases of sustained congestion, underpriced transactions may be dropped, requiring resubmission with a higher fee. + +The **queue timeout** is roughly **12 seconds **by default, after which unprocessed transactions may be removed if not yet included in a block. + +**Retryable Tickets** are _not_ used for standard user transactions within an Orbit chain. They are designed for **cross-chain communication** (e.g., L1 → L2 or L2 → L3) to provide a censorship-resistant fallback path, not for managing local transaction load or congestion. + +For setups requiring guaranteed service continuity, refer to the [High-Availability Sequencer documentation](https://docs.arbitrum.io/run-arbitrum-node/sequencer/high-availability-sequencer-docs). + +### In the case of Arbitrum one, the soft limit is 7M gas/s, and if the soft limit is exceeded, a congestion fee is paid, but transaction processing can increase? + +Yes + +### Arbitrum One's gas per second limit is reportedly 7 M Gas/s. However, ChainSpect shows a max TPS of 1,358 tx/s. Mathematically, 7 M Gas/s seems to correspond to ~333 TPS. How does the 1,358 TPS figure arise? + +Additionally, under what conditions could the theoretical maximum of 40,000 TPS be achieved? + +The **7 M Gas/s** is a **soft limit**, not a hard cap. It represents the sustainable throughput target. If the network gas usage exceeds this value, the gas price increases to moderate demand, but transactions can still exceed the soft limit. + +• The observed **1,358 TPS** reflects real-world transactions where blocks may temporarily exceed the soft limit, and transactions vary in gas cost, allowing higher throughput than a simple calculation . +• The **theoretical maximum TPS of 40,000** assumes idealized conditions with **unlimited hardware performance**, minimal transaction gas, and optimal block settings. +• **Hard limits** are defined by node parameters, e.g., minimum block time of 0.25 s and max gas per block of 32 M, which would theoretically allow up to 128 M gas/s. + +Soft limits regulate network congestion, while hard limits define absolute technical boundaries. + +### INFO [06-24|21:31:27.118] InboxTracker sequencerBatchCount=12 messageCount=40 l1Block=8,618,759 l1Timestamp=2025-06-24T15:22:39+0900 + +What does sequencerBatchCount=12 mean and what does messageCount mean here? Does sequencerBatchCount mean that the next batch posting order is 12? And is messageCount the number of L2 blocks so far or is it another messageCount? What does message mean here? + +sequencerBatchCount=12 means your node's inbox tracker already tracked 12 batches from inbox. messageCount=40 means the messages number your node tracked and stored. `sequencerBatchCount` doesn't mean the batchposter will post this count batch next, but it might just indicate your node is still syncing, and next will sync this batch number, the batchposter might already posted a much higher batch number. + +### INFO [06-24|21:46:38.382] Waiting for more batches to post next assertion latestStakedAssertionBatchCount=12 latestStakedAssertionBlockHash=0xa34898fd + +I have a question related to the above, and looking at the log above, is it true that assertions are not processed if the number of batches submitted is small, regardless of the assertion interval? And what is the assertion interval? + +No, this just because your node is still syncing and catching up, I will contact team to modify this log to make it more clear. + +### But could you explain a little more about the role and function of the jwt file here? + +The jwt there will be used when nitro serves `validation_*`, this is used for validator validation communication, you can explore more about this when you test [split validator](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node). + +### When withdrawing ETH from an Orbit L3 to Ethereum L1, does it take 7 days for L3 → L2 finalization and another 7 days for L2 → L1 finalization? Since L2 blocks are generated faster, shouldn't the L3 → L2 withdrawal take less time? What are the minimum and maximum withdrawal times for L3 → L2 and L2 → L1? + +The **7-day withdrawal period** is not determined by block time but by the **fraud-proof (challenge) window** used for **censorship resistance** and **security guarantees**. + +• On **L2 → L1**, the 7-day window is fixed on Arbitrum Rollup chains to allow participants to challenge potentially invalid state transitions. +• On **L3 → L2**, the withdrawal period depends on the **L3's configuration**. An L3 can set a **shorter challenge window** or implement **fast withdrawal mechanisms** to accelerate the process. + +In summary: +• **L3 → L2:** Duration is configurable; can be shorter or near-instant if fast withdrawals are enabled. +• **L2 → L1(Arbitrum 1 → Ethereum Main-net ):** Typically **~7 days**, as defined by Arbitrum's fraud-proof protocol. This 7 day protocol can be configured fewer or more days at the risk of potential malicient but +Thus, total withdrawal time from **L3 → L1** can range from **near-instant (with fast withdrawals)** to **around 14 days** under default Rollup challenge windows. + +### The default value below is 95000. Does this refer to a single transaction?--execution.sequencer.max-tx-data-size int + +Yes + +### INFO [06-24|21:31:41.878] DelayedSequencer: Sequenced              msgnum=1 startpos=24 + +INFO [06-24|21:31:42.699] Reading message result remotely.         msgIdx=40 + +What messages does the msgIdx above mean (is it L2 block order number?) and what do the startpos and msgnum above mean here ? + +Yes, you can roughly think the message here is block number, blocks was produced from message, as you asked a lot of questions regarding batch, segments and blocks, I would suggest you to take a look at [go-batchHandler](https://github.com/OffchainLabs/go-batchhandler), it can help you understand what the relationships among them. + +### https://explorer.anime.xyz/tx/0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4 For the transaction record above, Gas used for L1 is listed as 0. Please explain why. + +Gas estimation is based on previous data, so if the previous tx over paid the L1 gas cost, then next one will cost less, so sometimes it comes out some tx pays `0` L1 gas. + +### Does the rollback above mean that the amount sent from A to B is returned from B to A and the fee is also refunded? If so, is it usually displayed as revert in explore in this case? Please answer. Thank you. + +The re-org in Blockchain means: Let's assume there is a block A (at timestamp T1) with state root S1, and after 3 mins, the blockchain goes to Block B (at timestamp T2, T2=T1+3mins) with state root S2, then the reorg happens, the chain has to reorg to Block A, so at this time, the whole blockchain's state will rollback to S1 too, so no matter what happens after S1, all state will come back to what it was at S1, including your account's balance (So instead of refund, I would say it as fallback). And all those tx after S1 will discard, the explore will even don't show those tx. + +### While testing the sequencer stability on an Orbit L3 chain, sending over 2,000 transactions per second, the base gas fee increased sharply and consumed excessive SepoliaETH. Why did this happen, and how can the base fee be fixed? + +When sending a large amount of TPS (2000 achieves this) It will cause Arbitrum one to go over its 7 million gas a second speed limit. Once gas per second goes over this [speed limit](https://docs.arbitrum.io/launch-arbitrum-chain/maintain-your-chain/guidance/state-size-limit#what-is-the-speed-limit-on-an-arbitrum-chain), gas prices will increase. + +### Is the Gas Used For L1 displayed in blockscout the actual cost of batch posting or an estimated cost? Is this fee deposited into the Sequencer Fee Pool? + +It (Gas Used For L1) is an estimated cost based on previous data. + +Yes, the fee will deposit to `L1PricerFundsPoolAddress` first and send to `feeCollector` later. + +### What portion of the transaction fee serves as sequencer revenue (e.g., L1/L2 gas, base, and congestion fees)?In an Orbit L3 chain, the batch poster posts to its parent chain (L2). It appears that part of the L3 transaction fee is deposited to the batch poster's L2 address. How exactly is the user-paid transaction fee routed to the batch poster's address? + +Refer [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/aep-fee-router/calculate-aep-fees#sequencing-revenue) for sequencer revenue + +The sequencer's revenue and fee flow are determined by how the Orbit chain's fee components are configured. There are four main fee types on an Orbit chain: + +1. **L2 Base Fee:** + This represents the minimum execution fee for processing transactions on the chain. It is deposited into the **infraFeeAccount**, which can be configured via `ArbOwner.setInfraFeeAccount()`. + +2. **L2 Surplus Fee:** + When the network experiences congestion and users pay above the base fee, the surplus portion is directed to the **networkFeeAccount**, set through `ArbOwner.setNetworkFeeAccount()`. + +3. **L1 Base Fee:** + This covers the cost of posting transaction batches to the parent chain. These funds are ultimately paid to the **fee collector** of the **active batch poster**. The batch poster is designated using `SequencerInbox.setIsBatchPoster()` on the parent chain, and its fee collector can be set via `ArbAggregator.setFeeCollector()`.Note: These payments occur **on the child chain**, even though the costs correspond to activity on the parent chain. + +4. **L1 Surplus Fee:** + Any additional rewards associated with batch posting are paid to a specific **L1RewardRecipient**, which can be configured via `ArbOwner.setL1PricingRewardRecipient()`. + +In summary, part of the transaction fee that users pay on the child chain is allocated to cover the posting cost. Then tge fee is directed to the those configured **address** on child chain(or its configured fee collector) as reimbursement for posting batches to the parent chain. + +For more details on fee distribution, please refer to [this documentation](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#parent-chain-costs). + +### Could you explain the three config differences in more detail? + +(config 1)`--node.bold.minimum-gap-to-parent-assertion duration` : If validator creates assertion A, and this validator wants to create assertion B which connect to assertion A, the minimum time gap between assertion A and B(config 2)`--node.staker.make-assertion-interval duration` Your node's minimum time gap during making assertions. (config 3) `--node.bold.assertion-posting-interval duration`(for bold) Your node's minimum time gap during making assertions. (for legacy)If you are deploying your node using the latest version, your node are at bold version. (edited) [https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node) + +### If L2 ETH for batch posting is deposited in the L2 feeCollector, payment must be made in L1 ETH when the Batch Poster delivers the batch to L1. How does bridging L2 ETH to L1 ETH work? + +You can just use the token bridge to withdraw your token to parent chain. + +Here is an example UI for Arbitrum One: [https://portal.arbitrum.io/bridge](https://portal.arbitrum.io/bridge). + +You can also interact with bridge contract to withdraw back, [here](https://docs.arbitrum.io/arbitrum-bridge/quickstart) is the related document. + +### WARN [06-30|12:21:15.071] Could not confirm assertion err="posting this transaction will exceed max mempool size: transaction nonce: 25, unconfirmed nonce: 24, max mempool size: 1" assertionHash=6ee7ff..925542 + +This happens because your staker just sent a tx to l1 and it hasn't been confirmed, did you restart the node not long ago? If not, you can wait some time to see if it can be resolved, usually when the tx 24 confirmed, this warn will be disappeared. You can also check if there is something preventing your validator's tx hasn't been confirmed for a long time (like balance, rpc endpoint and gas). + +### When the sequencer receives more than 2,000 transactions per second, do those transactions accumulate in a queue and get processed in the order they arrive? If the sequencer queue has a fixed size, what happens to transactions that exceed the queue limit, and how many can wait? + +Arbitrum's sequencer does **not use a traditional mempool**. Unlike Ethereum, there is no mechanism for reordering transactions by tip or fee priority. +When a large number of transactions arrive simultaneously: +• Transactions that fit into the **sequencer queue** (default size: **1,024**) are processed in **FIFO (first-in, first-out)** order. +• Transactions arriving while the queue is full are handled in **non-deterministic (random)** order once space becomes available. +• If a transaction is not added to the sequencer queue within the **queue timeout** (default: **12 seconds**), it will **fail** and return an error to the sender. + +The number of transactions that can wait outside the sequencer queue is limited by the **sequencer's available RAM**. A well-configured sequencer will begin **rejecting new transactions** once memory usage reaches safe operational limits to maintain stability. + +### Is the Sequencer Fee Pool Model currently applied to the Orbit chain? How can one find the address of the Sequencer Fee Pool? + +Yes, it applies to orbit chains. + +`infraFeeAccount` :`ArbOwnerPublic.getInfraFeeAccount()`  +`networkFeeAccount` : `ArbOwnerPublic.getNetworkFeeAccount()` `FeeCollectors` : `ArbAggregator.getPreferredAggregator(batchPosterAddress)`  +`L1RewardRecipient` :`ArbGasInfo.getL1RewardRecipient()` + +Those precompiles addresses can be found [here](https://docs.arbitrum.io/build-decentralized-apps/reference/contract-addresses#precompiles) . + +### Can I ignore the warning below? It won't keep coming up. + +WARN [06-24|21:31:39.004] error finding requested sequence number in backlog: sending the entire backlog instead err="error finding backlog segment containing message with SequenceNumber 40" + +Yes + +### How many batches must be submitted to generate an assertion? Even if only one batch is submitted, will an assertion be generated after a certain amount of time? (What is the relevant configuration?) + +The assertion creation doesn't have a strong relationship to batch amount, as your batchposter's message number higher than the latest one recorded on parent chain, then the batch poster can post the batch. Related setting is `--node.bold.assertion-posting-interval` (bold) or `--node.staker.make-assertion-interval` (legacy) + +### How many blocks can a batch poster contain at minimum and maximum, and how many transactions must be included to create a batch? + +It depends on the tx size, we don't usually say how many tx or blocks here, but how much sizes those tx are, the flag is `--node.batch-poster.max-size` + +### What are the current hardware specifications of the nodes that make up Arbitrum one, which is currently being operated by offchain labs?(sequencer, validator, full node, relay, etc.) + +Most of our instances run on a cloud provider and we use Kubernetes to orchestrate the deployment and management of services. As a reminder, Arbitrum One is unique: it was the first L2 blockchain to launch and has been in production for over 3 years. The types of applications and what users do on Arbitrum One is likely to be very different from any other chain and so I'd ask that you keep this in mind while comparing your chain's hardware configurations and performance. + +• Our sequencer runs a minimum of: 10 CPU cores, 90GB of RAM, and a fairly large local NVMe drive, specifically ~6.6TB in size. On AWS, we use `i7ie.3xlarge`. +• The archive node runs on: 2 CPU cores, 40GB RAM, and a large 16TB `gp3` high iops volume +• Validators run on a minimum of 3 CPU cores, 32GB RAM, and a 4TB `gp3` high iops volume +• Regular RPC nodes we run are roughly 4 CPU cores and 32GB RAM. + +Note that most professional node operators for RPC nodes (e.g. Alchemy, Infura, Quicknode, etc) run way larger machines to serve RPC calls because those companies sell RPC-as-a-service for their business and so they have higher requirements for uptime and performance. We do not do that since we do not serve high volume, production calls on our RPC nodes - our RPC nodes are public and free and therefore have a lower requirement for all those things i mention above (latency, perf, uptime, etc) + +For setting up own chain, we do recommend HA set ups. [This repository of helm charts might be valuable to your team](https://github.com/OffchainLabs/community-helm-charts). Again, we want to emphasize that these specifications are for Arbitrum One and its demand/load profile. A new chain or a different chain will have a different demand/load profile and set of users and apps that may mean your chain will use more or less than what Arbitrum One uses. Generally, I believe that better hardware and better configurations/setups in your DevOps environment lead to better outcomes: being able to handle more throughput, transactions, and offering better latency.We're continuously and currently doing optimization work to both increase performance for the same hardware, as well as doing benchmarking to see what performance and throughput look like at higher hardware tiers. + +### Is there a way to prevent the base fee from increasing during congestion, and how long does it take to return to normal after congestion clears? + +C Currently there is no way to lock the base fee, however the chain owner is able to increase the speed limit of their chain along with some other configurations which will mitigate the increase during congestion + +Arbitrum is also **exploring mechanisms to smooth out fee volatility** and better isolate Orbit chains from **L1 gas price fluctuations**. + +### The default value below is 1024. Does this mean that 1024 transactions can be queued at once? If the remaining 1024 is exceeded, will the user receive a network busy error?How is the time for processing and sending a single transaction from the queue adjusted, and how long is it?--execution.sequencer.queue-size int + +No, the queue-size here means the tx number reach to sequencer but haven't been queued yet, if 1024 exceed and the tx can't be added in 12 s, user will get error like `context deadline exceeded` + +### INFO [06-24|21:31:59.632] validated execution                      messageCount=40 globalstate="BlockHash: 0x0a3e00344c3951143eb0f21020d3188ee175ae0de2401b81a799b05dc3a138a8, SendRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, Batch: 12, PosInBatch: 0" WasmRoots=[0x184884e1eb9fefdc158f6c8ac912bb183bf3cf83f0090317e0bc4ac5860baa39] + +Does the messageCount mentioned above refer to the number of the last posted L2 blocks? Does the Batch 12 mentioned above mean that the 12th batch submitted by the batch poster is brought to the validator and verified? Does the PosInBatch: 0 mentioned above mean that there is only one batch? Or what does it mean? + +Although messages here can be used to produce block, but I don't suggest you understand it as block. Yes, batch 12 here means this validator verified to batch 12 and PosInBatch means the position in batch, (because batch can divided into different segments) not means batch number. + +### What determines when batches are generated and posted from a child chain to its parent chain? It appears that a batch is not created for every block. What are the specific criteria for batch generation? + +Batch generation and posting are governed by both **time-based** and **size-based** criteria. The **batch poster** submits a batch to the parent chain when **either** of the following conditions is met: + +1. **Time limit reached:** + ◦ Controlled by the parameter `--node.batch-poster.max-delay`, which defines the **maximum duration** allowed between batch postings (assuming there is activity and the poster is properly funded). +2. **Size limit reached:** + ◦ For **calldata batches**, controlled by `--node.batch-poster.max-size`. + ◦ For **EIP-4844 (blob) batches** (applicable to L2s), controlled by `--node.batch-poster.max-4844-batch-size`. + +In practice, this means a batch is posted **either after a set time interval** or **once enough transaction data has accumulated** to reach the configured maximum batch size. As a result, batches do not correspond one-to-one with blocks on the child chain — multiple blocks may be included in a single batch. + +**Default values: +**`--node.batch-poster.max-delay` : default 1h0m0s +`--node.batch-poster.max-size` : default 100000 + +### What is the config that adjusts the block creation cycle and the number or amount of transactions that can be contained in a single block? If there are no transactions, will an empty block be created after 72 hours like the config below? What is the related config?--node.batch-poster.max-empty-batch-delay duration (default: 72h0m0s) + +The flag which can adjust the block creation cycle is `--execution.sequencer.max-block-speed` , I would suggest you to go through this [code](https://github.com/OffchainLabs/nitro/blob/master/execution/gethexec/sequencer.go#L1451-L1458), the sequencer will try to create the block every `MaxBlockSpeed` , and if no tx, the return of `createBlock` will be false. +As for **--node.batch-poster.max-empty-batch-delay**, yes, this will make batchposter sends an empty batch to l1, and this will results in a new delayed message `batchpostingReport` created, and this will cause a new block on l2. + +### Does Arbitrum One also manually bridging the ETH required for batchposter? + +This can be done by an automatic script and the logic is relatively easy. + +### When a log occurs because the batch poster has no balance, the batch poster's balance is increased, but the batch posting occurs after some time after the balance is charged. How long after the balance is charged is posting possible? And what are the related confirmation logic intervals and configs? + +The minimum check time period is 10 s. however, there is no logs [here](https://github.com/OffchainLabs/nitro/blob/master/arbnode/dataposter/data_poster.go#L1117), I will forward this to our team and maybe add a new log there. + +(Data entry note, as of right now it does not seem there is a log at this function) + +### Please check if the log interpretation below is correct. + +INFO [06-24|21:31:12.131] BatchPoster: batch sent sequenceNumber=11 from=38 to=40 prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0 + +The batch sequence number is 11th and includes L2 Block 38 to 40. (Is this interpretation correct?) / But what does prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0 mean here ? + +Yes, you are right, `preDelayed` means before this batch, how many delayed tx from parent chain are accepted, and `currentDelayed` means after this batch, how many delayed tx are accepted. The totalSegments means how many seg messages are in this batch, it can be user tx batch or also time update message (tell the network to advance timestamp) and so on, all seg message types are [here](https://github.com/OffchainLabs/nitro/blob/master/arbstate/inbox.go#L187-L191). numBlobs=0 which means this batch doesn't post eip4844 blobs. + +### While testing an Orbit L3 node, an issue occurred when using the eth_getLogs query. The problem was traced to a block range exceeding 10,000 blocks. Chainstack, the node provider, mentioned that Arbitrum recommends keeping the block range per eth_getLogs query under 10,000 blocks to avoid errors and performance issues. How can the block range for eth_getLogs be adjusted on the Orbit L3 chain? For context and logs refer here - https://offchainlabs.slack.com/archives/C08373EP1QQ/p1761783628215019?thread_ts=1761726622.755719&cid=C08373EP1QQ + +This issue originates from the node responding to an `invalid block range` parameter in the client's `eth_getLogs` query, not from the parent chain or the node provider. The error indicates that the **client is requesting logs with a block range larger than what the node supports**. To resolve this, you'll need to adjust the query parameters on the **client side**, ensuring that each request spans **no more than 10,000 blocks**. + +Additionally, if you encounter the error `wrong msgIdx got 167230 expected 167228`, this points to **database inconsistency** between components of your node setup. Resetting only one database can create further synchronization issues. + +If the chain is running in **Rollup mode**, the recommended fix is to **delete the entire database** (typically located at `/home/user/.arbitrum/`) and **resync the node** from the parent chain. This ensures full consistency across databases and resolves the indexing mismatch. + +### Regarding the configuration below, the default value is 100000. If the compression rate is 11, how many transactions can be included on average? + +Sorry, different tx has different size, there is no correct way to estimate it, but you can check our mainnet as an example: [https://arbiscan.io/batches](https://arbiscan.io/batches). + +### what a customized relayer cache is and how transactions are processed by adding a customized relayer cache to the High-availability sequencer diagram to make it easier to understand? + +This is an example scenario to explain the solution when sening more transactions than the sequencer's pending transaction queue can handle. + +The general idea is to deploy a relayer that holds the transactions and sends them to the sequencer once the sequencer is able to process them. + +It can also be configured to increase your sequencer's pending transaction queue capacity: +• `--execution.sequencer.queue-size` (default: 1024) +• `--execution.sequencer.queue-timeout` (default: 12s) by setting + +These parameters to higher values, you can increase the sequencer's pending transaction queue size. + +### Batch posters seem to bridge the fees received from L2 to L1 fees at regular intervals. What is the frequency? + +Those funds (network revenue) will be paid to child chain `feeCollector` and will not bridge to L1 automatically.Those funds will be paid after each time batch posting. + +### How is the compression rate of 11 calculated? + +Brotli:11 is best ratio level of compression, you can find it at google's [paper](https://github.com/google/brotli/blob/master/docs/brotli-comparison-study-2015-09-22.pdf). + +### What is the posting interval for batch posters? (What is the related configuration?) + +When the batch poster has at least 1 useful tx, it will wait until whether `--node.batch-poster.max-delay` reaches or `--node.batch-poster.max-size` (calldate posting) / `--node.batch-poster.max-4844-batch-size` (blob posting) reaches, default values for those 2 is 1h0m0s and 100000 bytes(calldata posting) or 0 (blob posting based on parent chain config). Or if there is no tx recorded, batch poster will post an empty batch after `--node.batch-poster.max-empty-batch-delay` . + +### How does gas price fluctuation on Arbitrum compare to Ethereum, where it increases or decreases within a 12.5% range depending on network congestion? + +Arbitrum's gas pricing mechanism works differently from Ethereum's. + +On **Ethereum**, the base fee adjusts by up to **±12.5% per block** based on how full the previous block was. +On **Arbitrum**, the gas price remains fixed at the **MinimumL2BaseFee** until **real-time gas usage exceeds the network's gas speed limit**. Once that threshold is crossed, the base fee increases dynamically according to network backlog using the following formula: +**`F = exp(-a(B - b))`** +Where: +• **F** = current base fee +• **B** = gas backlog +• **a** = parameter controlling how fast the fee rises with congestion +• **b** = threshold backlog before the escalation begins + +This model allows Arbitrum to respond smoothly to congestion, scaling gas prices based on actual network pressure rather than per-block fullness. + +More information can be found in [this documentation](https://docs.arbitrum.io/how-arbitrum-works/state-transition-function/arbos#child-chain-gas-fees). + +### The poster fee for an Orbit L3 test chain has increased by about tenfold since yesterday. Could this be caused by the network status of Arbitrum Sepolia, or is there another reason? + +On Orbit chains, the **batch poster fee** is directly influenced by the **L1 gas price** on the parent chain. If the chain is using **Arbitrum Sepolia** as its parent, any spike in **Sepolia's L1 gas price** will cause the batch posting cost to rise — sometimes by a factor of ten or more. This behavior is expected, as the posting fee scales with the parent chain's gas price. + +### If traffic continues to come in at over 100,000 bytes per Tx(s), how fast can batches be done? + +It will check if batch can be posted every 10s, so answer to this is around 10s. (And you also need to wait the tx confirm time on l1, which is not fixed, some time it will be very fast but some time it may need you to wait several mins or even more) + +### Can the withdrawal time from L3 to Arbitrum One (L2) be reduced compared to the withdrawal time from Arbitrum One (L2) to Ethereum (L1)? + +Yes, anytrust can enable fast withdrawal which can be reduced to **15 mins **for L2s**, **and** 15 seconds** for L3s**. **AnyTrust chains are already placing a trust assumption on their Data Availability Committee (DAC) to provide the data needed for fraud proofs and recreating the chain.It is possible for an Arbitrum chain Rollup to adopt fast withdrawals. However, it would technically no longer be a Rollup as the minimum trust assumption will shift to the trust placed in the Fast Confirmations committee. related [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/fast-withdrawals) + +### In this case, I am curious about why weth and multi call use the existing contracts together and what their roles are. + +weth and multi call are usually specific to the chain and be a constant contract, like on ethereum sepolia, because lof of users will use those 2 contracts, there is no need to deploy a new one when a new user uses it, so when deploy a new chain, the parent chain's weth and multi call contracts we will use the universal one. + +### What does "resolve any unconfirmed assertions" mean in resolve node explanation? (What does resolve mean here?) This is a question from another team member. Is "resolve any unconfirmed assertions" performed by the rollup contract rather than the validator? + +The assertion life cycle is: `assertion created` -> `assertion waiting for challenge` -> `assertion confirmed` in happy case. The resolve mean confirm an assertion, arbitrum is optimistic rollup, the l1 will not do any execution when there is no challenge, so needs to be resolved on rollup contract by validator after it created, I would highly recommend you go through those docs (**[Validation and Proving Mechanisms](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving)**, [rollup protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/rollup-protocol) and [challenge protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/proving-and-challenges)) for a better understanding. + +### How can I call smart contract functions and listen to events emitted by said contracts (Original question asked specifically about changing transaction fee receiver and how to call/read smart contract functions/events) + +This is the [example](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/setup-fee-distributor-contract/index.ts) has code to call arbOwner contract, it is about how to call `arbOwner.setInfraFeeAccount`The contract interface is [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbOwner.sol#L111). +you can use ethers.js to filter those events, here is the [docs](https://docs.ethers.org/v5/concepts/events/).Those events belongs to Rollup and challengeManager. + +### Is there a difference in network fees when executing the same kind of transaction on Orbit L2 and Orbit L3? + +There is no difference of network fee between L2 and L3 chains, but due to parent chain's gas prices changes, the child chain gas will be different in different time. + +### I want to estimate how much transaction fee a batch poster, sequencer, or validator submits to L1 per month, which config should I check and at what cycle should I multiply \* tx average? + +While using math is possible, the easiest and preferred way to do this is to just monitor the batch poster and validator directly to keep track of their funds and how much they used + +### Where is the RPC code located + +For rpc each specific methods implementation, you can check code here. http/ws processing here + +### what are the roles of the nativeToken contract and adminProxy here, and why is validatorWalletCreator needed? + +native token here is 0x0 means you use ethers as gas token, if it is other value, then means this chain will use that as gas token. About proxyAdmin, you can check oz docs. validatorWalletCreator can be used to create wallet for validator to ensure the funds safety. + +### if i use the same validator address as a Makenode address at first and then change it to defensive mode, does it re-stacking every time i change the mode?For example, as i can see below, the money is spent twice.https://sepolia.etherscan.io/address/0x65fF9E2256CBaE32f8Ae18776cF1e66A2BEa436d (Mode : MakeNode->defensive) (twice out)https://sepolia.etherscan.io/address/0x9699040F6e8A10F6831884966ceBfaa2E50fe59B (Mode change is not sure but twice out)In this case, how can I withdraw the stake I made in the previous mode? Could you please guide me on the specific method? + +No, it will just **need** stake once, the stake token of your chain is weth (wrapped ethers, which is an erc20 type of ethers). You can click [here](https://sepolia.etherscan.io/address/0x65ff9e2256cbae32f8ae18776cf1e66a2bea436d#tokentxns) to see your weth transfer history, then you will see there is only 1 time that your address transfer the weth token to your rollup contract, although you deposited twice (2 ethrs), only 1 weth is spent and your address still has 1 weth left, you can check it [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#readContract)  by call `balanceOf` and input is your address, if you want to withdraw weth back to eth, then use your address to connect to etherscan and call withdraw [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#writeContract). + +### is it possible to set up SSL or TLS in the application layer + +There is no application-level ssl setting for nitro, you need to use a Reverse Proxy or cloud hosting solutions. + +### The Arbitrum developer documentation states that fast withdrawal is only recommended on the Anytrust chain. What would the reason be? + +The reason fast withdrawals is only recommended for AnyTrust chains relates to the trust assumptions involved.For AnyTrust chains: The optimal setup is to have all Data Availability Committee (DAC) members also run validators as part of the fast withdrawals committee. This approach leverages the existing trust assumption placed on the DAC operators such that enabling fast withdrawals does not add any new trusted parties.For Rollup chains: While it is possible for an Arbitrum Rollup chain to adopt fast withdrawals, it would technically no longer be a Rollup as the minimum trust assumption will shift to additional trust assumptions. Because rollup mode is designed as trustless, whether to add additional trust assumptions or not needs further thinking. + +### How can I change the batchPoster + +[In development guide to how to change your batch poster](https://github.com/OffchainLabs/arbitrum-docs/pull/2382/files) + +### Would there be any suggestion to reduce the transaction network fee, which currently costs 31,749 gas, to $0.00001? + +1. Adjust gas price setting: Configure node parameters and contract settings to set a lower base fee ceiling. +2. Batch Operations: Set a higher max batch size which can provide some very slightly support here. +3. Configure Soft Gas Limit: Adjust the gas limit settings to maintain lower base fees during normal operation +4. Note: If you are trying to lower down the gas price and increase the tps, you need to make sure your hardware can handle it or it may cause network nodes down. + +### Why is the L1 contract not responsible for checking the validity of an assertions instead of the validators + +You can check our docs [here](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving). Arbitrum is optimistic rollup, optimistic means l1 will optimistically think every assertion is correct rather than rollup will auto verify it. So during a time if no challenge happens, validator will call l1 contract to resolve it. So you are also right, L1 contract is the one that resolves it, but needs validator to call it. + +### Is it possible to make the block creation cycle 4 times a second with a certain configurations + +this config will set the fastest block time to 250 ms, which means the sequencer will try to create block every 250ms, but if last block creation time too long (too many tx) or there is no new tx, the block time gap won't exactly equal to 250ms, but longer than this, so there is no fixed block time on l2. + +### What is the mempool (L1) + +The mempool is a place where pending L1 transactions wait to be picked up and executed on by an eth node + +### How can I adjust batch and asseration cycles? Which flags should I set? + +You can adjust the timing and behavior of the **Batch Poster** and **Assertion** cycles using the following flags: +\*\* + +1. Batch Poster Flags** + `--node.batch-poster.max-delay` **Maximum batch processing delay. + **`--node.batch-poster.poll-interval` **Polling interval** - The time to wait between checking if a batch is ready to be posted. + `--node.batch-poster.error-delay` **Error delay** - The time to wait after an error posting a batch. + `--node.batch-poster.wait-for-max-delay` Wait for the maximum delay even if the batch is full. + `--node.batch-poster.max-empty-batch-delay` Maximum delay before an empty batch can be posted. + ** +2. Assertion Flags (BOLD)\*\* + +These flags are specific to the **BOLD** assertion strategy. +`--node.bold.assertion-posting-interval`**Assertion posting interval. +**`--node.bold.assertion-scanning-interval`**Assertion scanning interval** - The time to wait between scanning for newly created on-chain assertions. +`--node.bold.assertion-confirming-interval`**Assertion confirming interval** - The time to wait between attempts to confirm assertions. +`--node.bold.minimum-gap-to-parent-assertion` minimum duration to wait since the parent assertion was created to post a new assertion +** 3. Assertion Flags (Legacy)** + +`# Staker Interval - The frequency to check L1 rollup state and potentially take action. +--node.staker.staker-interval + +# Make Assertion Interval - The frequency to create a new assertion when using the MakeNodes strategy. + +--node.staker.make-assertion-interval` + +### what are the min and max TX sizes that Batcher submits to L1 in the case where there is no user TX and only system TX, and when user TX is full during batching? And in this case, can it be converted to gas only rather than datasize? + +When tx total size (both user tx and system tx) equal or higher than `--node.batch-poster.max-size`, then it will post batch. The units of this is byte, default 100000 means 100000 bytes. + +### even if there is only a single small transaction in a batch, will it still be posted in an hour + +Small tx is also useful tx, any user's tx accepted by sequencer will be set as useful tx. So the batch will still be posted after 1 hour. + +### Among the MakeNode, Validator, and Resolve nodes, is MakeNode the only required element (mandatory)? + +Technically, yes, you only need MakeNode is enough, but to increase the safety, it would be better to have more validators. + +### Ethereum increases or decreases the Base Fee within a range of 12.5% depending on whether 50% of the block is filled. What is the basis for Arbitrum's Base Fee fluctuations? + +There is a soft gas limit on Arbitrum chains. The default setting is 7m/s. If the gas spent rate is higher than this limit, the network fee will be increased. +Formula: See Arbitrum Gas Fees Documentation ([https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees)) +The soft limit is configurable in node configuration. + +### WARN [06-09|12:11:15.821] Getting file info dir=/home/ellena/nitro_build_2025_06/nitro/machines error="stat /home/ellena/nitro_build_2025_06/nitro/machines: no such file or directory" + +When you run the binary and get this error, this means you don't download the replay binary, you can download it by run `scripts/download-machine.sh` in nitro and copy it to the related machines dir. +Or if you are doing some customization to STF, you need to build it your self by `make build-replay-env` and make sure you set the new wasm module root to your on chain contract too. + +### What is --node.batch-poster.poll-interval duration for + +This sets the interval for checking and sending batches + +### In this case, can you tell me why the weth address is called when staking and how it moves from there to the rollup contract? + +Your rollup contract uses weth as stake token, and the node needs to call weth contract to convert ethers to weth. Because weth is erc20 token, the erc20 token can be transfered by its method `transferFrom` on contract, [here](https://www.linkedin.com/pulse/erc20-decoded-understanding-approvals-allowances-frederick-van-staden) is an article talks about how erc20 token works. + +### So, does that mean that a validator in makenode mode can make assertions even if there is no new batch? I thought that makenode meant submitting a new assertion to a new batch that is different from the existing one. + +No, no relationships I mean is no need to have any specific amount of batch to post the assertion, if your batch number higher than last assertion's, then you are good to post the new one. related logic [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/RollupCore.sol#L471). + +### -> --node.bold.assertion-posting-interval (bold) or --node.staker.make-assertion-interval (legacy) What are the differences between these two? + +The first one is used for validators using the BoLD protocol, the second one is used for validators running the legacy protocol. + +### How much ETH should I fund when running a Sequencer that also participates as a Validator? + +**Sequencer and Validator typically should NOT run on the same node.** However, if asking about funding requirements for the address/wallet: the ETH needed equals the Validator's requirements, plus BatchPoster requirements if you're also running that component. The exact amount varies significantly based on chain activity. + +### Do all L1→L2 message go through the inbox contract? + +Yes, even for bridge contract, it will finally call inbox's `createRetryableTicket` , for more about l1->l2 message, please refer to [this](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging) docs. + +### When I try to build nitro binary, I get the following error: make: wat2wasm: No such file or directory + +You need to make sure you installed all **prerequisites **mentioned in this page: [https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally](https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally) + +### What are all configurations to improve TPS, and what hardware requirements are there to do so + +This is a frequently asked question, and we usually don't say TPS on arbitrum, but gas used per second, currently the gas used per second soft limit on arb1 is 7m, if the ratio higher than this number, then gas price will increase, but if you want to adjust the soft limit, you can call `ArbOwner.SetSpeedLimit`. So if you want to have a higher gas efficiency, I would recommend you to use stylus for contract deployment, for what is stylus, you can check the docs. So why increase the tps harder in decentralized netwrok? Because there will be a lot of fullnodes might join the network, it's easy to increase your own node's performance, but if only your node's performance increased, the other node can't catch up which might cause many users can't follow up the chain and might cause some potential issues. + +### And what exactly is the role of the rollup event box? + +You can take a look at rollupEventBox [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/AbsRollupEventInbox.sol), it has a function `rollupInitialized` which can be used to report init message. + +### What are the differences between fullnode, validator, archive node, and sequencer? How do these node types relate to each other in the Nitro stack? + +**Fullnode:** Syncs chain state and serves RPC requests +**Validator:** Validates based on posted batches and posts assertions to parent chain, will also challenge current assertions if they deem it malicious or incorrect +**Archive Node:** Fullnode that retains all historical state +**Sequencer:** Orders transactions and produces blocks (not a fullnode) +**Batchposter: **Posts queued tx by sequencer to partent chain. + +### What is the minimum network fee (in USD) we can set for our blockchain, and what technical limitations prevent setting it lower? + +The minimum `minL2BaseFee` is currently **0.0001**. Setting it lower than this threshold may cause overflow issues in the system. + +### The code below may not be perfect, but it is a temporary test result. As you can see from the results, only 91 were successful when 500 were sent per second. What configuration should I change to increase TPS? + +I don't know how your script looks like so I have no idea if that failed due to which reason, your tx also might failed because the nonce reason or others when send a batch of txes. But to increase your chain's soft gas limit per second, call ``ArbOwner.SetSpeedLimit``` and use stylus contract to increase the gas efficiency. + +### How can I get all my core contracts address of my orbit chain? + +There is a method named `getCoreContracts()` in chain-sdk, you can get it from your rollup deployment tx receipt. + +### When using a custom gas token in Orbit L3, Batchposter exchanges it for ETH and pays the transaction fee to the parent chain. Can a custom gas token be used even if it is not a listed token or there is no standard for measuring its value? If you could share details regarding using relayer option as you mentioned during the call, that would be appreciated as well. + +Yes, a custom gas token can be used even if it's not a listed token, but it must meet specific requirements: +**Requirements: +**Must be a standard ERC-20 tokenTransfers and approvals +must occur directly via the token contract, not via proxies or hooks +Must not be rebasing or include transfer fees +Must not use transfer callbacks or any onchain behavior that reverts if the sender and recipient are the same +**Fee Token Pricer Contract**: You need to deploy a fee token pricer. Here are 3 types of this pricer contract: Understanding the Fee Token Pricer ([https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer))Fee token pricer is a contract to tell your network the exchange rate between your custom token and ethers. + +### WARN [07-01|18:57:19.915] Could not succeed function after retries retryCount=15 err="could not get assertion creation block for assertion hash 0x34de67082eeaddc3977bcc5a7d4a1e2b4649925b6e18300879c446717dba675c: execution reverted: ASSERTION_NOT_EXIST" + +Your staker tries to read an assertion but it is not exsited. +The most possible reason is because your rpc node has some issues or it hasn't synced to the latest block. Try change to another parent chain endpoint and see if it gets resolved. + +### Regarding the Base Fee, L2 (Arbitrum Sepolia) is approximately 100 times more expensive than L1 (Ethereum Sepolia) on the Testnet. However, on the Mainnet side, L2 is approximately 20 times cheaper. Would there be certain reason for that? + +This is because many devs choose the Arbitrum Sepolia as the testnet and they sent a lot of testing tx on Arb Sepolia, which causes this gas price to continue to be high. + +### What is the difference between the batchPoster and the batchPosterManager + +batchPosterManager has the permission to add or remove batch poster by `setIsBatchPoster` , source code [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/bridge/SequencerInbox.sol#L814). While the batch poster posts batches + +### Up until now, in order to pay the L2 tx fee, I used the deposit function call from L1 to L2 to transfer money, but is it not possible to randomly create money in the network itself without transferring money from L1 to L2 to a specific account in and without transfering from other account in L2 itself? + +Do you mean if it's possible to "create" or "mint" ethers on Layer 2 directly? The answer to this question is no, because l2 can withdraw funds back to l1 and if you create new ethers on l2, which means you can create ethers on l1 too, that is not allowed + +### do eth_get functions (read only) charge a transaction fee? + +No + +### Is there a config that affects the RPS of the newly built node, not the TPS? Is it true that the RPS is only affected by the CPU performance, memory, and network performance of the node rather than the config?In the newly built Nitro node, where is the part of the code that handles the function (Get by Blocknumber or) (eth_raw_sendTransaction) and what are the factors that affect each RPS and TPS performance (how are they different)? + +There is no flag to set that.The code that handles those rpc requests is [here](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/eth/backend.go) ([https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go)). The serve time depends on your machines, and there is some flag to set the max-timeout: + +`--execution.rpc.evm-timeout duration timeout used for eth_call (0=infinite) (default 5s) + --execution.rpc.filter-timeout duration log filter system maximum time filters stay active (default 5m0s) + --execution.rpc.gas-cap uint cap on computation gas that can be used in eth_call/estimateGas (0=infinite) (default 50000000)` + +### Is moving from a L3 to an L2 possible and if so is it easy + +technically it is possible, but it's not easy as you need to re-deploy all contracts and migrate some states also you need to continue to run the l3 node to provide historical state querying + +### What are the default cycle values for the resolve mode validator, make node validator, and defense mode validator + +The config values for the nodes are the same +--node.bold.assertion-confirming-interval duration confirm assertion interval (default 1m0s) +--node.bold.assertion-posting-interval duration assertion posting interval (default 15m0s) +--node.bold.assertion-scanning-interval duration scan assertion interval (default 1m0s) + +### Is an L2 Ether Faucet possible + +There is no way to mint new ethers, so if you build a faucet, you can only top up it by yourself. + +### What is the role of WASM module root? + +**WASM Module Root** is a **cryptographic hash (commitment)** that uniquely identifies a specific version of the **Arbitrum State Transition Function (STF)** compiled to WebAssembly.  +This is needed for fraud proof. + +### ERROR[...] Disabling batch posting due to batch being within reorg resistance margin from layer 1 minimum block or timestamp bounds + +reorgResistanceMargin=10m +firstMsgTimeStamp=X +l1BoundMinTimestamp=Y +firstMsgBlockNumber=Z +l1BoundMinBlockNumber=W + +The batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation__). +You can set `--node.batch-poster.reorg-resistance-margin=0 `and `—-node.batch-poster.l1-block-bound=ignore` to bypass but **very import note** this might cause chain reorg. + +### How should I run the node using the JSON config? (nodeConfig.json) + +Apply `--conf.file` to your node when starting, and remember if you are running with docker, you should mount your config file to the container first and point this flag to that mount point + +### Does that mean that even if there is no tx after 72 hours, an empty batch posting will occur and a new assertion will be submitted in the new batch,right? Or does it mean that if there is no tx, the block is not generated, but empty batch posting is performed for assertion? Didn't you say above that at least one block must be generated before batch posting? + +Empty batch can be posted after 72 hours this is true, empty batch means there is no user tx within the batch, so no need to have user's tx for a batch posting, **but there will be system tx like** `batchPostingReport` **to create a new block,**  And this block won't contain any **user tx**. + +### WARN [06-11|09:12:22.830] error getting max time variation on L1 bound block; falling back on latest block err="429 Too Many Requests: {\"code\":-32007,\"message\":\"50/second request limit reached - reduce calls per second or upgrade your account at quicknode.com\"}" + +This 429 error returned from your parent chain rpc endpoint, you need to check the status of your parent chain rpc endpoint. + +### 1. What does validation\_\* mean here? /Why do I need to copy the jwt file when upgrading SW? Doesn't the validator, not just spli-validtor, also have jwt and perform certain functions? + +The `validation_` is part of auth api by default. If you want to access the auth api, you need to use this jwt secret. Usually we only set `validation_` to auth api endpoint. And `validation_` can be used to query the validation info, this is usually used by validator, normally there is no need to call this endpoint. + +### On the Testnet, withdrawal from L3 to L1 takes approximately 3 hours. Is the L1 block time set shorter because it's a Testnet? On the Mainnet, without any special configuration changes, would the withdrawal from L3 to L2 and L2 to L1 take 7 days each (45,818 L1 blocks)? If so, how can we shorten the withdrawal from L3 to L2 and L2 to L1 when using Roll-up, and by what would the shortest as possible time be? + +For testnet's shorter time, this is because we don't need to give testnet such a long time to ensure the security as the funds are all for testing use cases and it's not real funds. +For mainnet implementation, to reduce the withdraw time, there are some potential options: + +1. Fast Withdrawals (Recommended for AnyTrust) +2. Configure Shorter Challenge Period (Reduces security margin for fraud detection, must carefully evaluate before configuring this) +3. Third-Party Bridge/Liquidity Solutions. (Powered by 3rd party oracles) + +### Where is the code that handles batch posting + +[https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go](https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go) is the repo, MaybePostSequencerBatch is the function + +### How do I deploy the Rollup Creator (factory) contract to a custom parent chain that isn't Ethereum Sepolia or Arbitrum Sepolia? What additional configuration is needed beyond .env and config.ts? + +**We do not recommend deploying your own Rollup Creator contract.** Instead, use the existing official Rollup Creator contracts that are already deployed. If you absolutely must deploy your own, refer to the deployment scripts in the nitro-contracts repository: [https://github.com/OffchainLabs/nitro-contracts](https://github.com/OffchainLabs/nitro-contracts) + +### How are assertions resolved + +To resolve an assertion, your validator will call `confirmAssertion` , just use the default cycle is fine.If you run more than 2 resolves node or makenodes node, they will compete to call this method. + +### WARN [07-01|18:13:26.929] Could not submit latest assertion err="could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1" validatorName=default-validator + +This is **normal behavior** and will usually resolve automatically. Your validator has an unconfirmed transaction in the mempool of parent chain and is waiting for it to be confirmed before submitting the next assertion. This warning does not impact node operation.** +Root Cause** +• **Current situation:** Validator has already sent a transaction (nonce 30) that is still pending in the mempool +• **Mempool limit:** Configured to allow only 1 unconfirmed transaction at a time (default setting) +• **Blocked transaction:** Next transaction (nonce 31) cannot be sent until the previous one confirms** +Resolution** +**Option 1: Wait (Recommended)** +• The pending transaction will confirm automatically +• Once confirmed, the validator will submit the next assertion +• **No action needed** - this is expected behavior +**Option 2: Increase Mempool Size** +If you want to allow multiple unconfirmed transactions simultaneously, increase the mempool limit: +**For BOLD validators:** + +`--node.bold.data-poster.max-mempool-transactions ` +**For legacy validators:** + +`--node.staker.data-poster.max-mempool-transactions ` + +**Log Level Logic:** +• **< 10 minutes:** WARN - considered a temporary issue +• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level + +### But if TPS increases, for example, if 100 sequences are sent per second, will the response speed after each transmission be uniform, or will the overall response speed slow down? + +(didnt see an answer but seems like a useful question) + +### Is the Resolve node responsible for staking at existing assertions, right? + +Resolve node will not only create assertions, and yes it will only make actions on those existing assertions, also it can resolve the assertions. + +### How can we handle transaction overflow when the Sequencer's pending queue reaches capacity, especially when transactions must be processed in order and retries are not possible? + +The Sequencer has a configurable pending transaction queue with adjustable size and timeout parameters. You can tune these settings to handle higher transaction volumes, but there are architectural considerations for scenarios where retries are not possible.** +Configuration Options** +The Sequencer's pending transaction queue can be configured using these flags: +**Queue Size:** + +`--execution.sequencer.queue-size int` +• **Default:** 1024 transactions +• **Purpose:** Sets the maximum number of transactions that can wait in the pending queue +• **Recommendation:** Increase this value based on your expected transaction volume +**Queue Timeout:** + +`--execution.sequencer.queue-timeout duration` +• **Default:** 12 seconds +• **Purpose:** Maximum time a transaction can remain in the queue before being dropped +• **Recommendation:** Consider increasing if your transaction processing has predictable but longer latency requirements** +Solutions for High-Volume Scenarios** +**1. Increase Queue Capacity** +• Scale `queue-size` to accommodate peak transaction loads +• Monitor queue utilization metrics to determine appropriate sizing +• Consider your RAM constraints when setting large queue sizes +**2. Pre-Submission Rate Limiting** +• Implement rate limiting on the client side +• Match submission rate to your Sequencer's processing capacity +• Prevents queue overflow before it happens** +Caveats & Important Notes** +⚠️ **No Built-in Overflow Protection:** Once the queue is full, new transactions are rejected. There's no automatic spillover mechanism. +⚠️ **Memory Constraints:** Very large queue sizes consume significant RAM. Ensure your infrastructure can support the configured queue size. + +This might solve your problems here, but if you will accept a large number of tx at the same time, having a **customized relayer** cache will be better. + +### Is there a config to monitor transaction fees + +No there is no but it is possible to write a simple script to do it for you + +### ERROR[06-10|15:33:12.823] disabling L1 bound as batch posting message is close to the maximum delay + +blockNumber=8,479,298 +l1BoundMinBlockNumberWithBypass=8,490,627 +timestamp=1,749,090,792 +l1BoundMinTimestampWithBypass=1,749,227,592 +l1BlockBoundBypass=1h0m0s + +This ERROR indicates the batch contains very old messages approaching the maximum delay limit. The system automatically disables L1 bound checking as a protection mechanism to allow these old messages to be posted, preventing them from being stuck indefinitely. +However, even if this batch gets posted successfully, you may encounter another related error: `Disabling batch posting due to batch being within reorg resistance margin +from layer 1 minimum block or timestamp bounds` and the batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation) + +### Can I assume that chain sdk deploys not only the rollup creator contract(=factory contract) but also all related rollup contracts? + +chain-sdk is used to deploy the rollup based on current rollup creator, it doesn't deploy rollup creator. + +### ERROR[07-01|18:24:06.947] Could not submit latest assertion + +err="could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1" +validatorName=default-validator + +This ERROR indicates a transaction (nonce 30) has been pending for **over 10 minutes** without confirmation. This is a serious issue requiring immediate investigation - the transaction is likely stuck due to low gas price, L1 congestion, or RPC issues.** +Why This Escalated from WARN to ERROR** +**Log Level Logic:** +• **< 10 minutes:** WARN - considered a temporary issue +• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level +**Situation:** +The escalation to ERROR means nonce 30 has been unconfirmed for over 10 minutes, blocking all subsequent assertions. This is **not normal** temporary waiting.** +Immediate Diagnostic Steps** +**1. Check L1 Pending Transaction** +View the validator address on L1 to inspect the stuck transaction:bash + +_`# Using Etherscan or similar block explorer# Or query via RPC:`_` +eth_getTransactionByHash ` +**2. Identify Root Cause** +**a. Gas Price Too Low (Most Common)** +• Transaction gas price is too low for current L1 network conditions +• L1 miners/validators won't prioritize it +• **Solution:** Increase gas price configuration +**b. Severe L1 Network Congestion** +• L1 network is extremely congested +• Even reasonable gas prices are stuck +• **Solution:** Significantly increase gas price or wait for congestion to clear +c**. RPC Node Problem** +• L1 RPC node may not be properly broadcasting the transaction +• Transaction might not actually be in mempool +• **Solution:** Verify RPC endpoint health, consider switching providers** +Solution Options +Option 1: Increase Mempool Size (Allow System to Continue)** +This lets the validator submit new assertions even while nonce 30 is stuck: +**For legacy validators:**bash + +`--node.staker.data-poster.max-mempool-transactions=10` +**For BOLD validators:**bash + +`--node.bold.data-poster.max-mempool-transactions=10` +**Trade-off:** More capital locked in pending transactions, but assertions continue** +Option 2: Increase Gas Price Configuration** +Make transactions more competitive on L1: + +_`# Increase base gas price`_` +--node.staker.data-poster.target-price-gwei + +`*`# Increase urgency multiplier`*` +--node.staker.data-poster.urgency-gwei + +`*`# Increase max tip`*` +--node.staker.data-poster.max-tip-cap-gwei`** +Option 3: Manually Accelerate Stuck Transaction** +If nonce 30 is genuinely stuck, use Replace-By-Fee (RBF): +**Steps:** + +1. Get transaction details for nonce 30 +2. Send replacement transaction with: + + ◦ **Same nonce:** 30 + ◦ **Higher gas price:** At least 10% increase + ◦ **Same transaction data** + + **Note:** DataPoster should handle this automatically, but if `replacement-times` is configured too conservatively, manual intervention may be needed. + **Check replacement configuration:** + +_`# Default: 5m, 10m, 20m, 30m, 1h, ...# For faster replacement:`_` +--node.staker.data-poster.replacement-times="2m,5m,10m,20m"`** +Option 4: Check DataPoster Status** +Monitor DataPoster internal state:bash + +_`# If metrics are enabled:`_` +curl http://localhost:6070/debug/metrics/prometheus | grep dataposter + +`*`# Key metrics to watch:# - arb_dataposter_latest_unconfirmed_nonce# - arb_dataposter_balance# - arb_dataposter_pending_transactions`**\* +Recommended Complete Configuration** +For validators experiencing persistent stuck transactions: + +_`# Allow multiple pending transactions`_` +--node.staker.data-poster.max-mempool-transactions=10 + +`*`# More aggressive gas pricing`*` +--node.staker.data-poster.target-price-gwei +--node.staker.data-poster.urgency-gwei +--node.staker.data-poster.max-tip-cap-gwei + +`*`# Faster replacement cycle`*` +--node.staker.data-poster.replacement-times="3m,6m,12m,20m,30m" + +`*`# Wait for L1 finality (recommended for security)`*` +--node.staker.data-poster.wait-for-l1-finality=true`**For BOLD validators:** Usually replace`--node.staker`with`--node.bold` in all flags above. + +### What does --node.batch-poster.data-poster.max-mempool-transactions do + +It limits the amount of batch poster transactions in the mempool to the flags amount + +### WARN [07-01|16:52:07.009] Served eth_sendRawTransaction conn=13.125.242.225:51648 reqid=1688 duration=1.01158792s err="nonce too high: address 0xE8b9a6b2A9404E8AF1F7676916C19C7397c94498, tx: 261 state: 107" + +This is a **client-side error**, not a node issue. The user is submitting a transaction with higher, but the account's current nonce on-chain is not matching that one. + +### When deploying a chain with chain-sdk, how do I configure it as a Rollup vs AnyTrust chain? + +Use the `DataAvailabilityCommittee` parameter in `prepareChainConfig()`: +• **`DataAvailabilityCommittee: true`** → AnyTrust chain +• **`DataAvailabilityCommittee: false`** → Rollup chain +**Implementation** +When calling `createRollupPrepareDeploymentParamsConfig`, configure the `DataAvailabilityCommittee` + +### Could you please suggest a test node env that I want to test against lower user tx cost and higher tps? + +**Infrastructure & Node Configuration:** + +1. **Deploy nodes in a nearby location (Optional)**- This reduces latency for their testers. (Note: if you don't need low latency, this is not needed) +2. **Deploy 2-3 full nodes alongside the sequencer** - Full nodes can serve read requests to reduce sequencer load. We can also implement a pre-checker mechanism on these nodes to further reduce sequencer pressure. Provide them with all node endpoints so they distribute transactions across multiple nodes rather than sending everything to one. +3. **Deploy a High Availability sequencer setup** - If they're doing stress testing, this prevents downtime from sequencer failures. +4. **Use only 1 validator** - Sufficient for this testing scenario. +5. **Increase speed limit** (and adjust related speed limit parameters accordingly) - Allows for higher throughput at lower gas prices. +6. **Set `minL2BaseFee` to 0.0001.** +7. **Increase batch size - **This can slightly reduces the per-transaction cost by amortizing L1 posting costs across more transactions. +8. **Deploy on a private chain with low gas - **If deploying the L3 on a private L2, we can set low gas prices to this private chain. However, there's a tradeoff: testing costs will be lower than production costs once migrated to mainnet, which could lead to inaccurate cost projections. +9. Can deploy chain as Anytrust. + **Smart Contract Deployment Recommendations:**Beyond node configuration, we should recommend they deploy their core business contracts as: +10. **Stylus contracts** - This can dramatically reduce gas costs & increase TPS and works well for business logic contracts. +11. **Precompile contracts** - Precompiles allow custom gas cost settings, enabling further cost reduction. The tradeoff is that contract upgrades require ArbOS upgrades, so this should only be used for stateless, mission-critical contracts. + +### And if i look at the contents of the resolve mode validator, there is the following content: + +Gas used every time a new assertion is created and to resolve unconfirmed assertionsAnd +does the above mean that only the further gas fee is used for each new assertion, and the existing staked money is used as is? Or is the additional staking money added again to the new assertion? + +Yes, your staker will only need to staker once, no more staked token needed. + +### as long as the parent chain's contract is functioning normally, can the data in the child chain's (all data) be restored at any time even if it is deleted ? + +yes, all data can be restored from parent chain if you are on rollup mode. But if your parent chain is ethereum and you enable blob posting, you need to connect to a client which supports historical blobs storage. That is because ethereum will prune the blob data after 2 weeks automatically. + +Note: only data that is posted on the parent chain can be easily restored, if data was never posted then restoration will be difficult or potentially not possible + +### I was wondering if it would be okay to run two networks on the same PC with different input config files for testing purposes from the same Nitro code folder? + +Yes, you can do that, but please to make sure the db stored in different path. (by set different `persistent.global-config`), also, the netwrok port needs to be set on different ports. + +### What is a split validator? + +Split validators separate the validation work to a stateless worker, which provides several key benefits: +• **Resource management**: Easier to scale and manage compute resources independently +• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors) +• **Flexibility**: Allows running multiple validation workers for horizontal scalability. +So if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process. + +### What are contract calls and where are the nitro contracts + +You can find almost all our nitro contract in nitro-contracts [repo](https://github.com/OffchainLabs/nitro-contracts), + +### WARN [08-21|16:07:41.536] Served eth_getBalance                    conn=43.203.177.23:34134 reqid=0 duration="115.587µs" err="header not found" + +Might be some reasons; + +1. Your node haven't synced to the latest state. If it is this reason, you can wait some time. +2. (Very low likelihood) You are running a block explorer which uses your another chain's db however connect to your current chain, this one you need to re-run the block explorer and delete its db. +3. Might be your node db crashed. If it is this reason, might need to resync. + +### And what is the meaning of delayBlocks and futureBlocks in the site below and the meaning below, and what is the meaning and difference of delaySeconds and futureSeconds? + +The sequencer's max time variation is configurable via the `setMaxTimeVariation` method of the Sequencer Inbox Contract, which will also be set to prevent chain reorganization when there are no batches for an extended period. +`MaxTimeVariation` struct: + +`struct MaxTimeVariation { +uint256 delayBlocks; +uint256 futureBlocks; +uint256 delaySeconds; +uint256 futureSeconds; +}` +The `MaxTimeVariation` struct defines time boundaries that determine whether your chain remains safe or triggers a reorganization (reorg) when posting batches. It uses both block-based and time-based limits to create acceptable windows for message processing between L1 and L2. + +### What is the difference between the chain SDK and the Orbit setup script (Orbit now Arbitrum chain) + +The orbit SDK is for preparing and deploying an orbit chain, while the orbit setup script should never be used for live production. + +### And what is the dispute window size config, and what is the compression ratio config of the batch? + +The dispute window is configured in the **rollup contract settings**, not in the node configuration. These are set when deploying the rollup:`confirmPeriodBlocks: 45818, `_`// ~6.4 days (for Arbitrum One)`_` ` +You can also call rollup contract `setConfirmPeriodBlocks` to reset this. +CompressionLevel is default to be 11, but you can reset it by `--node.batch-poster.compression-level` + +### And currently, forwarding from the full node to the sequencer is happening on all of one, nove, and sepolia, right? + +This is the general architecture of all arbitrum chains where nodes pick up data and send them to the sequencer + +### ERROR[08-21|13:48:40.883] shut down due to fatal error             err="error starting node: error initializing block validator: cannot validate WasmModuleRoot 0xdb698a2576298f25448bc092e52cf13b1e24141c997135d70f217d674bbeb69a" + +Have you downloaded consensus 40 replay bin? + +`.` + +1. Check your Dockerfile in `Nitro` for a download to the current consensus version (V50 at time of writing `RUN ./download-machine.sh consensus-v50 0x2c54f6e9e378ba320ed9c713a1d9f067a572b1437e4f1c40b1a915d3066c04f2`) +2. If yes, then can ask them cd to ./scripts dir and run ./download-machine.sh with the related arbos info. +3. If not, they need to re-build the replay bin theirselves. + +### What's the difference between WARN and ERROR log levels? Do WARN logs affect node operation? + +**Usually WARN logs do NOT affect node operation.** The node continues to function normally. Only ERROR logs indicate issues that may disrupt node functionality or cause shutdown. + +### After creating the nitro-node image, how do I run the Docker image with the previously created nodeconfig.json as input? (Is there a command guide?)And how do I make the nitro instance accessible from outside? Do I need to set up ports and such to connect from outside? Port connections, etc… + +Let's assume you want to use `/data/arbitrum` dir as the main file to keep your chain data, then: + +1. copy nodeConfig.json to `/data/arbitrum` . +2. run `docker run --rm -it -v /data/arbitrum:/home/user/.arbitrum --conf.file /home/user/.arbitrum/nodeConfig.json` + +Yes, you need to mount too, you can check the port settings in nodeConfig.json and export those ports too. + +### Can I change the gas token of my arbitrum chain after it has been deployed + +No the custom gas token must be set during deployment and cannot be changed afterwards + +### WARN [09-11|15:15:36.645] Served eth_sendRawTransaction            conn=27.122.242.98:11105 reqid=3174655275929179 duration=4.691427ms err="wrong msgIdx got 257 expected 256" + +This logs indicates your sequencer queued the tx 257, however, your node db just keeps 256. Which means your node db fall behind the sequencer. + +### What is the auth-rpc? + +AUTH-RPC is a **separate, JWT-authenticated RPC interface** in Arbitrum Nitro designed for **secure communication** between trusted components or entities.  +By default, it will register `validation_` api, but you can also register some regular api like `eth_` , `net_` + +### If I update my nitro node version will that mean my ArbOS will be upgraded too + +If you upgrade your nitro version, it doesn't mean your ArbOS version will be upgraded too, so your ArbOS version will keep the same, those are 2 separate version system, ArbOS version can only be upgraded by calling  `arbOwner.scheduleArbOSUpgrade` + +### Does L2 submit batches when there are no user transactions? + +**Generally, empty batches are NOT sent.** However, there's a specific exception: +**Normal Operation:** +• BatchPoster only sends batches when there are "useful messages" +• **Useful messages** include: + + ◦ User transactions + ◦ Delayed messages from users + +**Batch Posting Report Message:** +• Every batch will generate a `batch_posting_report` message +• This message is NOT initially marked as "useful" +• Remains non-useful for duration of `--node.batch-poster.max-empty-batch-delay` +**Exception - Empty Batch Submission:** +After `max-empty-batch-delay` expires: +• The `batch_posting_report` message becomes marked as "useful" +• BatchPoster will send a batch containing only this message +• This is technically an "empty batch" (no user transactions, only the report) + +### ERROR[06-13|11:01:25.473] Could not submit latest assertion err="could not auto-deposit funds for assertion creation: test execution of tx errored before sending payable tx: insufficient funds for transfer" validatorName=default-validator + +Your staker address doesn't have enough funds to deposit, please transfer some funds to it. + +### What are the assertion submission frequency and finalization cycle, and what are the configurations? + +Default is 15 mins, to reset it: `--node.bold.assertion-posting-interval` .Finalized cycle, default in test env is 150 blocks, on mainnet is 7 days, you need call rollup contract `setConfirmPeriodBlocks` to reset this. + +### When I run the arbitrum tutorial, I got the following error: `ArbSdkError: Unrecognized network xxx.` + +This is because you are running the tutorial against a custom chain. +Please follow this tutorial ([https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network](https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network)) to add your custom network first. + +### If I delete the db of the child chain and restart it, can I restore all the TXs of the child chain? + +You can restore all TXes that your batchposter already posted, like for now, your sequencer are at msg 257, and your batchposter already posted message 250 to parent chain, then your node can restore to 250. + +### And If i look at the page below, there is a resolve mode among the validators. Does the validator in resolve mode do both cases: staking for correct assertions and challenging for incorrect assertions? How should the resolve cycle be configured in nodeconfig.json? + +Yes, **Resolve Mode does BOTH** - it stakes for correct assertions AND challenges incorrect assertions. +For how to configure it: +--node.staker.strategy=resolveNodes (legacy) +or +--node.bold.strategy=resolvenodes (bold) + +### Does the "error getting latest agreed: no assertion creation logs found" mean the latest new assertion? + +It means your nodes try to find a specific assertion, however, it doesn't find it, this means you need wait some time for your node to sync up. + +### If i want to run the container in the background instead of running it once and then deleting it, i can do something like below, right?Is there anything missing here? + +You can reuse those commands we provide in our docs, which is: + +`docker run --rm -it -v /Your_mount_point:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/nitro-node:v3.6.8-d6c96a5 --conf.file=xxxx` + +### How to run a DAS node + +You can walk through [this](https://docs.arbitrum.io/run-arbitrum-node/data-availability-committees/get-started) guide. It provides you the content how to run a das node. + +### error getting latest agreed: no assertion creation logs found + +For this logs, what I guess is because you just start your node, and it needs some time for makenodes to produce assertion and also other validator needs some time to wait the assertion tx is finalized. So it is expected. + +### In a high-availability sequencer setup, what data does the sequencer pass to Redis, and how does Redis determine the active sequencer and handle load balancing? + +For sequencer coordinator system (redis can also be used on other system), Redis is used for **sequencer coordination**, not load balancing. It stores leadership information, message synchronization data, and configuration to ensure only one active sequencer at a time. + +**Data in Redis** +**1. Leadership Keys** +• `coordinator.chosen` - URL of currently active sequencer (e.g., "[http://sequencer1:8547](http://sequencer1:8547/)") +• `coordinator.liveliness.` - Each sequencer's heartbeat signal +**2. Message Synchronization** +• `coordinator.msgCount` - Current message count (signed) +• `coordinator.finalizedMsgCount` - Finalized message count (signed) +• `coordinator.msg.` - Individual messages (JSON encoded) +• Other sync-related keys +**3. Configuration** +• `coordinator.priorities` - Comma-separated priority list of sequencer URLs + +**The election process:** + +1. The system reads coordinator.priorities to get the ordered list of sequencer URLs +2. It checks each URL in priority order to see if that sequencer has set coordinator.liveliness. = "OK" +3. The first sequencer in the priority list that has its liveliness key set becomes the recommended leader +4. That sequencer attempts to acquire the coordinator.chosen lock **Conditions for a sequencer to become active:** + • Must be synced with the network + • Must have processed all messages up to the current count + • Must successfully acquire the coordinator.chosen lock before it expires + • The lock uses Redis transactions (optimistic locking) to prevent race conditions + +Redis and sequencer coordinator doesn't do traditional load balancing here - it's more of a **failover mechanism, Only ONE sequencer is active at a time (holding the coordinator.chosen lock)** + +### what is the difference between validatior and validation_node + +Validator can be run on one node, but it can also be split to 2 nodes which are validator (staker) and validation node, [here](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node#running-split-validators-for-arbitrum-chains) is the related docs.Here is the benefits: +• Resource management: Easier to scale and manage compute resources independently +• Fault isolation: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors) +• Flexibility: Allows running multiple validation workers for horizontal security + +### And if i look at the Docker-compose.yaml file of the nitro testnode code,(https://github.com/OffchainLabs/nitro-testnode/blob/release/docker-compose.yamlThere are separate validators and validatotion_nodes. What is the difference between these two? + +Split validators separate the validation work to a stateless worker, which provides several key benefits: +• **Resource management**: Easier to scale and manage compute resources independently +• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors) +• **Flexibility**: Allows running multiple validation workers (validation node) for horizontal security. +So if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process. + +### How do you call Arb precompiles and what is the address of such + +Precompile is live on your network, and the address is on top of the file [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbSys.sol#L10), so for ArbSys, it is 0x0000000000000000000000000000000000000064.Then you can use your rpc or other tool like foundry cast to call this address' method `arbOSVersion` + +### Is it possible to set up custom gas tokens for any L2 or L3 configuration (rollup and anytrust) + +a custom gas token is possible in any of those configs though in rollup mode it's more complex. There's documentation on what's required here [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup) + +### what role does the relay service play + +It will connect to sequencer feed, and relay those feed messages to other full nodes, here is [related docs](https://docs.arbitrum.io/run-arbitrum-node/run-feed-relay). Basically it is used to reduce the network pressure of sequencer. + +### can I omit running the download-machine.sh script (after make, make build, make build-replay-env)? + +(We recommend you to run the node with docker instead then you don't need to run so many steps.)You can just run `make build` then `download-machine.sh` , other 2 no need to run anymore. + +### -node.batch-poster.data-poster.dangerous.clear-dbstorage Is there a value for the above config? If I do the above config, will the entire network be initialized? (Will it be reset and create a new block from scratch?) + +No, this will only remove batchposter's `QueuedTx` db, will not clear other db. So the network won't be initialized. But it may caused some queued tx lost. + +### Large gap between last seen and current block number, skipping check for reverts last + +The Batch Poster runs a background monitoring process (pollForReverts) that continuously checks L1 blocks to see if any transactions it submitted have been reverted. However, it find last seen blocks has a large gap to the current block, might be a lot of reasons, network issues might be one of them, you can try change to other parent rpc to see if it can be resolved or not. Also, most warn logs won't affect your node's syncing and behavior as it is not error logs, so you can ignore them. + +### Where is Timeboost supporteed + +They are currently on arb one, nova, and sepolia + +### How do I migrate an existing local Nitro node database to a new Docker-based deployment? Which folders and files need to be transferred? + +Copy the **entire Nitro data folder** to a directory that you will mount to your Docker container. + +### if I create an L2 or L3 using the Nitro stack and a validator wants to recover the amount staked on the parent chain, how can I do so? + +To withdraw your staked token from rollup contract: + +- Wait for your old validator's latest bond assertion to be confirmed +- Call `reduceDeposit()` on the `Rollup` Contract +- Call `withdrawStakerFunds()` to get your bond back + +### What configurations should I set when deploying an L3 instead of an L2 + +For L3s as of right now they must be ran in anytrust mode (I believe I saw this im not sure if its still true), other than that all of the configs can be set to your liking + +### Do I need to move files around to upgrade a node? + +Every time you upgrade the node, there is no need to move any files but just change the image tag unless there is some special changes (we will put note at the release docs if happens). diff --git a/static/miscellaneous-qa.json b/static/miscellaneous-qa.json new file mode 100644 index 0000000000..18b2a6a20f --- /dev/null +++ b/static/miscellaneous-qa.json @@ -0,0 +1,812 @@ +[ + { + "question": "When building Orbit L2 and Orbit L3 on the mainnet, the advantages of L3 over L2 appear limited to lower gas fees, no Arbitrum DAO approval, and no license fee. Given perceived disadvantages like longer finality and increased bridge processing, what specific features highlight the advantages of Orbit L3? Data or experienced-based insights are needed regarding: 1) Customization, 2) Performance/Operational factors, and 3) Other aspects.", + "answer": "The choice between Orbit L2 and L3 mainly depends on customization needs and settlement preferences. \n\nSome common points of confusion first:\n• **Arbitrum DAO approval:** Not required for Orbit L2 or L3.\n• **AEP license fee:** Applies only if the chain settles directly to Ethereum or any other parent chain. Avoided when settling to Arbitrum One or Nova.\n• **Finality & gas fees:** Comparable for L2 and L3 when using the same parent chain; AnyTrust mode provides low fees for both.\n\n**Key advantages of Orbit L3:**\n1. **Cost optimization:** Avoids AEP license fees by settling to Arbitrum One/Nova instead of Ethereum (**USP of L3**)\n2. **Customization:** Greater flexibility in settlement and configuration options, especially when leveraging a parent chain's AnyTrust setup.\n3. **Performance:** Faster, cheaper bridging to its parent chain.\n4. **Ecosystem alignment:** Stronger integration with the Arbitrum ecosystem, benefiting from shared tooling and potential ecosystem support.", + "key": "when-building-orbit-l2-and-orbit-l3-on-the-mainnet-the-advantages-of-l3-over-l2-appear-limited-to-lo" + }, + { + "question": "Regarding AnyTrust technology, assuming 500 GB of data is stored per month:\n1. What are the costs for DAS storage + server operations?\n2. What are the costs when using Celestia DAS?\n3. Are there any alternative methods recommended?\nAdditionally:\n• When using the DAS method, is the DACert generation cycle adjustable? How is it set up for Nova?\n• For Celestia DA, is the price per 1 MB sufficient, or are there other considerations?", + "answer": "With AnyTrust, the **same set of entities act as both validators and committee members**, so no additional trust assumptions are needed.\n\n• **DACert Generation:** There is no fixed generation cycle. DACerts are created **immediately** upon each data store request from the batch poster.\n• **Data Posting Parameters:** DACert/data posting is triggered when either:\n ◦ `--node.batch-poster.max-size` (maximum estimated compressed batch size) is reached, or\n ◦ `--node.batch-poster.max-delay` (maximum batch posting delay) is reached.\n\n**Costs:**\nCelestia currently costs ~$0.08 USD / MB\nAn AnyTrust node will cost ~$200/node/month", + "key": "regarding-anytrust-technology-assuming-500-gb-of-data-is-stored-per-month-1-what-are-the-costs-for-d" + }, + { + "question": "What is the optimal number of validators required to operate a mainnet at the scale of Arbitrum One or Arbitrum Nova? Additionally, how many validators currently participate as stakers in these networks?", + "answer": "On **Arbitrum One**, validation is **permissionless** under the **[BoLD](https://docs.arbitrum.io/how-arbitrum-works/bold/gentle-introduction)** protocol. Any participant running a BoLD-capable Nitro validator can take part in validation, meaning the number of active validators (or stakers) is **not fixed** and fluctuates over time based on participation.\n\nIn contrast, **Arbitrum Nova** currently uses a **permissioned validation model**. Validation is handled by a set of **approximately 10 whitelisted validators**, with at least **five independent external challengers** apart from the operator to maintain security and integrity.\n\nFor up-to-date information on validator participation and network details, refer to:\n• [Arbitrum One – L2BEAT](https://l2beat.com/scaling/projects/arbitrum)\n• [Arbitrum Nova – L2BEAT](https://l2beat.com/scaling/projects/nova)", + "key": "what-is-the-optimal-number-of-validators-required-to-operate-a-mainnet-at-the-scale-of-arbitrum-one-" + }, + { + "question": "Does the Validator receive and process user transactions directly from the RPC Node? It is understood that the RPC Provider represents an RPC Node, and that Validators and the Sequencer are independently connected. Is this understanding of the transaction flow correct?", + "answer": "**The understanding of the direct transaction flow is incorrect.**\nThe **Validator cannot queue transactions**. For a transaction to be valid, it must be queued by the **Sequencer**.\nThe correct flow is:\n1. A user submits a transaction to an **RPC Node**.\n2. The RPC Node **forwards** the transaction to the **Sequencer**.\n3. The Sequencer **queues and orders** the transaction.\n4. The Sequencer then sends the ordered transaction to the **Validator** via the **Sequencer Feed** for verification.\n\n**Even when a Validator endpoint acts as an RPC Provider, the transaction is immediately forwarded to the Sequencer for ordering, as the Validator's core function is verification.**", + "key": "does-the-validator-receive-and-process-user-transactions-directly-from-the-rpc-node-it-is-understood" + }, + { + "question": "Arbitrum Sepolia uses a Rollup method. Is there a separate Arbitrum Nova testnet available?", + "answer": "**No.** Since the **UX** for Arbitrum Rollup and AnyTrust (Nova's underlying technology) is the same, **a separate AnyTrust testnet is not needed.**", + "key": "arbitrum-sepolia-uses-a-rollup-method-is-there-a-separate-arbitrum-nova-testnet-available" + }, + { + "question": "What is the theoretical maximum tps officially announced by Arbitrum and the prerequisites for it, and What is the realistic maximum tps possible in Arbitrum One and the prerequisites for it?", + "answer": "In general we prefer to use throughput (gas /s) over TPS, as TPS is dependent on the transaction type. So for any throughput value you can just divide by the gas of your transaction to get TPS (standard is to use `eth_call` which is 22K gas)\n\n**OFFICIAL TPS:**the maximum official TPS for an orbit chain is, ~14,500 TPS:\n• 32M block gas limit\n• 100ms block times\n• eth_call transactions (22,000 gas/tx)\n• Standard hardwareThis value is useful for PEAK load that can be sustained. In practice, prices start to rise and demand slows down\n\n**REALISTIC TPS:**Taking historical data, during Arbitrum One's highest period of sustained peak usage, Arbitrum One operated at 50M gas/s for several hours. With modifications, several Orbit chains have sustained 100Mgas/s over multiple days with peaks of 400Mgas/s. These chains are built on AnyTrust DA which is our lowest cost configuration for an Orbit chainThe limitation in realistic cases is that higher gas prices caused users to delay their transactions, the hardware/chain operated completely normally.\n\nIt's worth noting, two major focuses on our roadmap:\n**1. Scalability**: We have several projects that will improve scalability to ensure Orbit chains can reach 100Megagas/s throughput (10^8 gas units, ~14.2x higher than the current sustainable limit).\n a. Dynamic Pricing: [https://blog.arbitrum.io/dynamic-pricing-explainer/](https://blog.arbitrum.io/dynamic-pricing-explainer/)\n b. Alt Client Developments: [https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/](https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/)\n c. Nitro Max: we are internally benchmarking our node to allow Orbit chains to operate on higher hardware requirements\n\n**2. Fee Stabilization**\n a. We're exploring several levers / set ups that we can implement to allow partners to deploy a chain that has smoother or near-constant fees on the chain", + "key": "what-is-the-theoretical-maximum-tps-officially-announced-by-arbitrum-and-the-prerequisites-for-it-an" + }, + { + "question": "Are there any projects currently operating an L3 AnyTrust chain that settles on an L2 AnyTrust chain such as Arbitrum Nova? Additionally, when comparing Rollup and AnyTrust configurations—specifically L2 Rollup + L3 Rollup versus L2 Rollup + L3 AnyTrust—how do transaction fees differ on the L3?", + "answer": "The only project that is an L3 AnyTrust chain settling on top of an L2 AnyTrust is Playblock. However, we don't encourage this setup.\n\nIn Arbitrum's design, transaction fees are determined by a **two-dimensional gas model**, consisting of:\n1. **Execution cost:** The fee paid on the child chain for computation, storage, and execution resources.\n2. **Data availability (DA) cost:** The fee paid on the parent chain for posting transaction data to ensure it is recorded and verifiable.\nWhen execution costs are comparable, the total transaction fee difference primarily depends on the **data availability layer** used. \n\n**AnyTrust mode** provides significantly lower DA costs than **Rollup mode**, so an **L3 AnyTrust chain** will generally have lower fees than an **L3 Rollup chain**, regardless of whether the parent L2 uses Rollup or AnyTrust.\n\nRefer explanation doc [here](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9).", + "key": "are-there-any-projects-currently-operating-an-l3-anytrust-chain-that-settles-on-an-l2-anytrust-chain" + }, + { + "question": "When connecting to an Orbit L3 node via an AWS Load Balancer (ELB) for HTTPS, issues are seen with Chain ID retrieval, token transfers, and Blockscout layout. The RPC (8449) and Blockscout (4000) ports are forwarded. Are more ports needed, or is the load balancer setup recommended?", + "answer": "The current configuration, only exposing **ports 8449 and 4000**, should be sufficient if only those two services are needed.\n\nIt is recommended to **configure WS endpoint** as well. The issues described may be due to a **network problem**.\n\n• **Testing:** Test the connection **without the load balancer** to determine if the issues are caused by the load balancer itself.\n\nYes, it is better to have a load balancer.", + "key": "when-connecting-to-an-orbit-l3-node-via-an-aws-load-balancer-elb-for-https-issues-are-seen-with-chai" + }, + { + "question": "If a chain is built using Orbit L3, is it possible to issue USDC directly on the L3 through Circle?", + "answer": "A **native deployment of USDC** on an Orbit L3 chain is technically possible; however, only **Circle** can authorize and perform such a deployment. In practice, obtaining a native USDC issuance on an L3 would require coordination and approval from Circle and would likely involve **significant cost and operational complexity**.", + "key": "if-a-chain-is-built-using-orbit-l3-is-it-possible-to-issue-usdc-directly-on-the-l3-through-circle" + }, + { + "question": "If a custom gas token is used on the L3, does the batch poster need to hold ETH or ARB on the parent chain?", + "answer": "It only needs to hold the **native gas token of the parent chain**, since it submits transactions there. For example, if the parent chain is **Arbitrum One or Arbitrum Nova**, the poster must hold **ETH**. The **ARB token is not used** as a gas token on any Arbitrum chain. [This document here](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer) may help understand more about Custom Gas Token on a rollup chain.", + "key": "if-a-custom-gas-token-is-used-on-the-l3-does-the-batch-poster-need-to-hold-eth-or-arb-on-the-parent-" + }, + { + "question": "Is it possible for an Orbit chain to process 1 billion transactions per day (over 10,000 TPS) by adjusting parameters such as block time, gas limit per block, or gas limit per second?", + "answer": "Simply increasing configuration parameters like block time or gas limits provides only **limited performance improvement (And this can onlu higher upper limit)**, as the main bottleneck lies in **EVM execution speed** and **node performance (determines lower limit)**. Additionally, the **minimum gas cost per on-chain transaction (21,000 gas)** is fixed by the EVM and cannot be reduced.\n\nTo achieve higher throughput, it is recommended to:\n• **Aggregate transactions** before submitting them on-chain.\n• **Move computation off-chain** and store only the resulting state on-chain.\n• Utilize **Stylus (EVM+)**, which significantly improves execution efficiency and can help achieve higher TPS.\n\nFrom a technical standpoint, an Orbit chain with **default parameters** achieves a **maximum theoretical throughput of around 6,095 TPS**, but this can be configured up to **approximately 15,238 TPS** (benchmarked against `eth_call` transactions). \n\nMaximum TPS is primarily governed by two parameters:\n• **Block time:** Default is 250 ms, configurable down to 100 ms (a 2.5× increase in TPS).\n• **Gas limit per block:** Default is 32,000,000 gas, and increasing this further boosts TPS but also accelerates **state growth**.\n\nHowever, it's important to distinguish between **theoretical and practical performance**. In real-world conditions, considering hardware, network latency, and system overhead, an Orbit chain typically achieves **400–700 TPS**, or roughly **33–60 million transactions per day**.\n\nAny claims of **billion-scale daily on-chain throughput** should therefore be viewed skeptically, as such performance is not technically achievable within realistic system and EVM constraints.", + "key": "is-it-possible-for-an-orbit-chain-to-process-1-billion-transactions-per-day-over-10-000-tps-by-adjus" + }, + { + "question": "Isn't L3 generally understood to be cheaper than L2? What are the technical advantages of choosing L3 regarding customizability, performance, operational differences, and service operation based on platform experience?", + "answer": "For any Nitro chain is **execution plus data availability (DA)** . The main difference between Orbit L2 and L3 lies in the **settlement layer** (the parent chain), since both use the same **Nitro stack**. The assumption that L3 is cheaper is mostly outdated as both L2 and L3 **can** use **AnyTrust mode**, which allows for similarly low gas fees. However with rollup mode, the dominant cost is L1 data posting.\n\n**Gas Fees:**\nTransaction costs depend primarily on **data availability (DA)** rather than on whether a chain is L2 or L3. Since both can adopt AnyTrust DA, their fees are generally comparable. L3 is therefore not inherently cheaper than L2. Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1.\n\nEven in rollup mode, the pricing difference between L2 and L3 for gas fees are very similar, since when data is posted to the L2 from the L3, the L2 still needs to post that data to the L1 for DA. meaning even on L3 you will still be paying L2 and L1 DA fees.\n\n**One small point to note:**\n• If it's an L3 chain, the data will be posted to L2 first, afterwards it will be posted to L1 by the L2 chain.\n• If it's an L2 chain, then the data will be posted directly to L1. \n\n**Technical and Operational Advantages of L3:**\n• **Settlement Flexibility:** L3 can settle on an L2 such as Arbitrum One or Nova\n• **No AEP License Fee:** Chains settling on Arbitrum One or Nova avoid the AEP license fee that applies to L2s settling directly to Ethereum.", + "key": "isn-t-l3-generally-understood-to-be-cheaper-than-l2-what-are-the-technical-advantages-of-choosing-l3" + }, + { + "question": "If building an Orbit L3 chain designed to handle around 1 billion transactions per day (approximately 12,000 TPS assuming even distribution), how many feed relays, full nodes, sequencer relays, sequencers, and validators would be required? The assumption is 80% write activity, 10% execution, and 10% read activity. Can the High-Availability Sequencer Architecture support this throughput?", + "answer": "The High-Availability Sequencer Architecture is designed to he more reliable than a normal sequencer in that its cannot fail to a single fault point. Before estimating node counts, it is important to understand how **full nodes** and **sequencers** share responsibilities:\n• **Read operations (calls):**\n\nRead-only queries are handled directly by full nodes without involving the sequencer. Read capacity scales horizontally—adding more full nodes increases read throughput. On average, a full node can handle around **1,000–1,500 read requests per second**. To support **10,000 RPS**, roughly **8–10 full nodes** would be needed, with additional nodes recommended for redundancy and traffic spikes.\n• **Write operations (transactions):**\n\nAll transactions are sent from full nodes to the sequencer, which orders and executes them. Only the sequencer determines transaction ordering, while full nodes follow and execute in that sequence. Write throughput does **not** scale with the number of full nodes; it is constrained by the **sequencer's single-threaded performance** and the ability of full nodes to keep up.\n\nThe current Arbitrum network sustains around **7–12 million gas per second**, translating to roughly **500–600 simple ETH transfers per second.** Actual performance will vary depending on hardware, configuration, and transaction complexity.\n\n**Key Takeaway:**\n• **Read capacity** can be increased by running additional full nodes.\n• **Write capacity** depends on the sequencer's processing power rather than the number of nodes. Along with the power of the full nodes, since they need to be able to keep up with the sequencers transactions.\n• The **High-Availability Sequencer Architecture** can be modified for more reliability within the network.", + "key": "if-building-an-orbit-l3-chain-designed-to-handle-around-1-billion-transactions-per-day-approximately" + }, + { + "question": "Are there any validator nodes directly operated by Arbitrum?", + "answer": "Yes, we (Offchain Labs) run some validators.", + "key": "are-there-any-validator-nodes-directly-operated-by-arbitrum" + }, + { + "question": "How does the sequencer handle transaction surges? For instance, if 100,000 transactions are submitted simultaneously, will all be processed eventually, or will some fail? Additionally, in such cases, is it necessary to use Retryable Tickets to ensure reliable processing?", + "answer": "The sequencer maintains an internal **transaction queue** to handle incoming transactions. When multiple valid and properly priced transactions arrive simultaneously, they are placed in this queue and processed sequentially over subsequent blocks until the backlog clears. The queue can hold approximately **1,000 transactions by default**, and any remaining transactions will get rejected if they cannot get in the queue within 12 seconds.\n\nSince the **EVM executes transactions sequentially**, the sequencer can process only one transaction at a time. Transactions can fail in the sequencer or during execution. They will fail in the sequencer if a transaction has an incorrect nonce, incorrect signature, insufficient funds, anything that can be checked before execution which will lead to the transaction never being executed. Transactions can also fail mid execution do to reverting which can happen for many many reasons. In cases of sustained congestion, underpriced transactions may be dropped, requiring resubmission with a higher fee.\n\nThe **queue timeout** is roughly **12 seconds **by default, after which unprocessed transactions may be removed if not yet included in a block.\n\n**Retryable Tickets** are *not* used for standard user transactions within an Orbit chain. They are designed for **cross-chain communication** (e.g., L1 → L2 or L2 → L3) to provide a censorship-resistant fallback path, not for managing local transaction load or congestion.\n\nFor setups requiring guaranteed service continuity, refer to the [High-Availability Sequencer documentation](https://docs.arbitrum.io/run-arbitrum-node/sequencer/high-availability-sequencer-docs).", + "key": "how-does-the-sequencer-handle-transaction-surges-for-instance-if-100-000-transactions-are-submitted-" + }, + { + "question": "In the case of Arbitrum one, the soft limit is 7M gas/s, and if the soft limit is exceeded, a congestion fee is paid, but transaction processing can increase?", + "answer": "Yes", + "key": "in-the-case-of-arbitrum-one-the-soft-limit-is-7m-gas-s-and-if-the-soft-limit-is-exceeded-a-congestio" + }, + { + "question": "Arbitrum One's gas per second limit is reportedly 7 M Gas/s. However, ChainSpect shows a max TPS of 1,358 tx/s. Mathematically, 7 M Gas/s seems to correspond to ~333 TPS. How does the 1,358 TPS figure arise?\n\nAdditionally, under what conditions could the theoretical maximum of 40,000 TPS be achieved?", + "answer": "The **7 M Gas/s** is a **soft limit**, not a hard cap. It represents the sustainable throughput target. If the network gas usage exceeds this value, the gas price increases to moderate demand, but transactions can still exceed the soft limit.\n\n• The observed **1,358 TPS** reflects real-world transactions where blocks may temporarily exceed the soft limit, and transactions vary in gas cost, allowing higher throughput than a simple calculation .\n• The **theoretical maximum TPS of 40,000** assumes idealized conditions with **unlimited hardware performance**, minimal transaction gas, and optimal block settings.\n• **Hard limits** are defined by node parameters, e.g., minimum block time of 0.25 s and max gas per block of 32 M, which would theoretically allow up to 128 M gas/s.\n\nSoft limits regulate network congestion, while hard limits define absolute technical boundaries.", + "key": "arbitrum-one-s-gas-per-second-limit-is-reportedly-7-m-gas-s-however-chainspect-shows-a-max-tps-of-1-" + }, + { + "question": "INFO [06-24|21:31:27.118] InboxTracker sequencerBatchCount=12 messageCount=40 l1Block=8,618,759 l1Timestamp=2025-06-24T15:22:39+0900\n\nWhat does sequencerBatchCount=12 mean and what does messageCount mean here? Does sequencerBatchCount mean that the next batch posting order is 12? And is messageCount the number of L2 blocks so far or is it another messageCount? What does message mean here?", + "answer": "sequencerBatchCount=12 means your node's inbox tracker already tracked 12 batches from inbox. messageCount=40 means the messages number your node tracked and stored. `sequencerBatchCount` doesn't mean the batchposter will post this count batch next, but it might just indicate your node is still syncing, and next will sync this batch number, the batchposter might already posted a much higher batch number.", + "key": "info-06-24-21-31-27-118-inboxtracker-sequencerbatchcount-12-messagecount-40-l1block-8-618-759-l1time" + }, + { + "question": "INFO [06-24|21:46:38.382] Waiting for more batches to post next assertion latestStakedAssertionBatchCount=12 latestStakedAssertionBlockHash=0xa34898fd\n\nI have a question related to the above, and looking at the log above, is it true that assertions are not processed if the number of batches submitted is small, regardless of the assertion interval? And what is the assertion interval?", + "answer": "No, this just because your node is still syncing and catching up, I will contact team to modify this log to make it more clear.", + "key": "info-06-24-21-46-38-382-waiting-for-more-batches-to-post-next-assertion-lateststakedassertionbatchco" + }, + { + "question": "But could you explain a little more about the role and function of the jwt file here?", + "answer": "The jwt there will be used when nitro serves `validation_*`, this is used for validator validation communication, you can explore more about this when you test [split validator](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node).", + "key": "but-could-you-explain-a-little-more-about-the-role-and-function-of-the-jwt-file-here" + }, + { + "question": "When withdrawing ETH from an Orbit L3 to Ethereum L1, does it take 7 days for L3 → L2 finalization and another 7 days for L2 → L1 finalization? Since L2 blocks are generated faster, shouldn't the L3 → L2 withdrawal take less time? What are the minimum and maximum withdrawal times for L3 → L2 and L2 → L1?", + "answer": "The **7-day withdrawal period** is not determined by block time but by the **fraud-proof (challenge) window** used for **censorship resistance** and **security guarantees**.\n\n• On **L2 → L1**, the 7-day window is fixed on Arbitrum Rollup chains to allow participants to challenge potentially invalid state transitions.\n• On **L3 → L2**, the withdrawal period depends on the **L3's configuration**. An L3 can set a **shorter challenge window** or implement **fast withdrawal mechanisms** to accelerate the process.\n\nIn summary:\n• **L3 → L2:** Duration is configurable; can be shorter or near-instant if fast withdrawals are enabled.\n• **L2 → L1(Arbitrum 1 → Ethereum Main-net ):** Typically **~7 days**, as defined by Arbitrum's fraud-proof protocol. This 7 day protocol can be configured fewer or more days at the risk of potential malicient but \nThus, total withdrawal time from **L3 → L1** can range from **near-instant (with fast withdrawals)** to **around 14 days** under default Rollup challenge windows.", + "key": "when-withdrawing-eth-from-an-orbit-l3-to-ethereum-l1-does-it-take-7-days-for-l3-l2-finalization-and-" + }, + { + "question": "The default value below is 95000. Does this refer to a single transaction?--execution.sequencer.max-tx-data-size int", + "answer": "Yes", + "key": "the-default-value-below-is-95000-does-this-refer-to-a-single-transaction-execution-sequencer-max-tx-" + }, + { + "question": "INFO [06-24|21:31:41.878] DelayedSequencer: Sequenced              msgnum=1 startpos=24\nINFO [06-24|21:31:42.699] Reading message result remotely.         msgIdx=40\n\n\nWhat messages does the msgIdx above mean (is it L2 block order number?) and what do the startpos and msgnum above mean here ?", + "answer": "Yes, you can roughly think the message here is block number, blocks was produced from message, as you asked a lot of questions regarding batch, segments and blocks, I would suggest you to take a look at [go-batchHandler](https://github.com/OffchainLabs/go-batchhandler), it can help you understand what the relationships among them.", + "key": "info-06-24-21-31-41-878-delayedsequencer-sequenced-msgnum-1-startpos-24-info-06-24-21-31-42-699-read" + }, + { + "question": "https://explorer.anime.xyz/tx/0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4 For the transaction record above, Gas used for L1 is listed as 0. Please explain why.", + "answer": "Gas estimation is based on previous data, so if the previous tx over paid the L1 gas cost, then next one will cost less, so sometimes it comes out some tx pays `0` L1 gas.", + "key": "https-explorer-anime-xyz-tx-0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4-for-t" + }, + { + "question": "Does the rollback above mean that the amount sent from A to B is returned from B to A and the fee is also refunded? If so, is it usually displayed as revert in explore in this case? Please answer. Thank you.", + "answer": "The re-org in Blockchain means: Let's assume there is a block A (at timestamp T1) with state root S1, and after 3 mins, the blockchain goes to Block B (at timestamp T2, T2=T1+3mins) with state root S2, then the reorg happens, the chain has to reorg to Block A, so at this time, the whole blockchain's state will rollback to S1 too, so no matter what happens after S1, all state will come back to what it was at S1, including your account's balance (So instead of refund, I would say it as fallback). And all those tx after S1 will discard, the explore will even don't show those tx.", + "key": "does-the-rollback-above-mean-that-the-amount-sent-from-a-to-b-is-returned-from-b-to-a-and-the-fee-is" + }, + { + "question": "While testing the sequencer stability on an Orbit L3 chain, sending over 2,000 transactions per second, the base gas fee increased sharply and consumed excessive SepoliaETH. Why did this happen, and how can the base fee be fixed?", + "answer": "When sending a large amount of TPS (2000 achieves this) It will cause Arbitrum one to go over its 7 million gas a second speed limit. Once gas per second goes over this [speed limit](https://docs.arbitrum.io/launch-arbitrum-chain/maintain-your-chain/guidance/state-size-limit#what-is-the-speed-limit-on-an-arbitrum-chain), gas prices will increase.", + "key": "while-testing-the-sequencer-stability-on-an-orbit-l3-chain-sending-over-2-000-transactions-per-secon" + }, + { + "question": "Is the Gas Used For L1 displayed in blockscout the actual cost of batch posting or an estimated cost? Is this fee deposited into the Sequencer Fee Pool?", + "answer": "It (Gas Used For L1) is an estimated cost based on previous data. \n\nYes, the fee will deposit to `L1PricerFundsPoolAddress` first and send to `feeCollector` later.", + "key": "is-the-gas-used-for-l1-displayed-in-blockscout-the-actual-cost-of-batch-posting-or-an-estimated-cost" + }, + { + "question": "What portion of the transaction fee serves as sequencer revenue (e.g., L1/L2 gas, base, and congestion fees)?In an Orbit L3 chain, the batch poster posts to its parent chain (L2). It appears that part of the L3 transaction fee is deposited to the batch poster's L2 address. How exactly is the user-paid transaction fee routed to the batch poster's address?", + "answer": "Refer [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/aep-fee-router/calculate-aep-fees#sequencing-revenue) for sequencer revenue\n\nThe sequencer's revenue and fee flow are determined by how the Orbit chain's fee components are configured. There are four main fee types on an Orbit chain:\n\n1. **L2 Base Fee:**\nThis represents the minimum execution fee for processing transactions on the chain. It is deposited into the **infraFeeAccount**, which can be configured via `ArbOwner.setInfraFeeAccount()`.\n\n2. **L2 Surplus Fee:**\nWhen the network experiences congestion and users pay above the base fee, the surplus portion is directed to the **networkFeeAccount**, set through `ArbOwner.setNetworkFeeAccount()`.\n\n3. **L1 Base Fee:**\nThis covers the cost of posting transaction batches to the parent chain. These funds are ultimately paid to the **fee collector** of the **active batch poster**. The batch poster is designated using `SequencerInbox.setIsBatchPoster()` on the parent chain, and its fee collector can be set via `ArbAggregator.setFeeCollector()`.Note: These payments occur **on the child chain**, even though the costs correspond to activity on the parent chain.\n\n4. **L1 Surplus Fee:**\nAny additional rewards associated with batch posting are paid to a specific **L1RewardRecipient**, which can be configured via `ArbOwner.setL1PricingRewardRecipient()`.\n\nIn summary, part of the transaction fee that users pay on the child chain is allocated to cover the posting cost. Then tge fee is directed to the those configured **address** on child chain(or its configured fee collector) as reimbursement for posting batches to the parent chain.\n\nFor more details on fee distribution, please refer to [this documentation](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#parent-chain-costs).", + "key": "what-portion-of-the-transaction-fee-serves-as-sequencer-revenue-e-g-l1-l2-gas-base-and-congestion-fe" + }, + { + "question": "Could you explain the three config differences in more detail?", + "answer": "(config 1)`--node.bold.minimum-gap-to-parent-assertion duration` : If validator creates assertion A, and this validator wants to create assertion B which connect to assertion A, the minimum time gap between assertion A and B(config 2)`--node.staker.make-assertion-interval duration` Your node's minimum time gap during making assertions. (config 3) `--node.bold.assertion-posting-interval duration`(for bold) Your node's minimum time gap during making assertions. (for legacy)If you are deploying your node using the latest version, your node are at bold version. (edited) [https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node)", + "key": "could-you-explain-the-three-config-differences-in-more-detail" + }, + { + "question": "If L2 ETH for batch posting is deposited in the L2 feeCollector, payment must be made in L1 ETH when the Batch Poster delivers the batch to L1. How does bridging L2 ETH to L1 ETH work?", + "answer": "You can just use the token bridge to withdraw your token to parent chain.\n\nHere is an example UI for Arbitrum One: [https://portal.arbitrum.io/bridge](https://portal.arbitrum.io/bridge). \n\nYou can also interact with bridge contract to withdraw back, [here](https://docs.arbitrum.io/arbitrum-bridge/quickstart) is the related document.", + "key": "if-l2-eth-for-batch-posting-is-deposited-in-the-l2-feecollector-payment-must-be-made-in-l1-eth-when-" + }, + { + "question": "WARN [06-30|12:21:15.071] Could not confirm assertion err=\"posting this transaction will exceed max mempool size: transaction nonce: 25, unconfirmed nonce: 24, max mempool size: 1\" assertionHash=6ee7ff..925542", + "answer": "This happens because your staker just sent a tx to l1 and it hasn't been confirmed, did you restart the node not long ago? If not, you can wait some time to see if it can be resolved, usually when the tx 24 confirmed, this warn will be disappeared. You can also check if there is something preventing your validator's tx hasn't been confirmed for a long time (like balance, rpc endpoint and gas).", + "key": "warn-06-30-12-21-15-071-could-not-confirm-assertion-err-posting-this-transaction-will-exceed-max-mem" + }, + { + "question": "When the sequencer receives more than 2,000 transactions per second, do those transactions accumulate in a queue and get processed in the order they arrive? If the sequencer queue has a fixed size, what happens to transactions that exceed the queue limit, and how many can wait?", + "answer": "Arbitrum's sequencer does **not use a traditional mempool**. Unlike Ethereum, there is no mechanism for reordering transactions by tip or fee priority.\nWhen a large number of transactions arrive simultaneously:\n• Transactions that fit into the **sequencer queue** (default size: **1,024**) are processed in **FIFO (first-in, first-out)** order.\n• Transactions arriving while the queue is full are handled in **non-deterministic (random)** order once space becomes available.\n• If a transaction is not added to the sequencer queue within the **queue timeout** (default: **12 seconds**), it will **fail** and return an error to the sender.\n\nThe number of transactions that can wait outside the sequencer queue is limited by the **sequencer's available RAM**. A well-configured sequencer will begin **rejecting new transactions** once memory usage reaches safe operational limits to maintain stability.", + "key": "when-the-sequencer-receives-more-than-2-000-transactions-per-second-do-those-transactions-accumulate" + }, + { + "question": "Is the Sequencer Fee Pool Model currently applied to the Orbit chain? How can one find the address of the Sequencer Fee Pool?", + "answer": "Yes, it applies to orbit chains.\n\n`infraFeeAccount` :`ArbOwnerPublic.getInfraFeeAccount()` \n`networkFeeAccount` : `ArbOwnerPublic.getNetworkFeeAccount()` `FeeCollectors` : `ArbAggregator.getPreferredAggregator(batchPosterAddress)` \n`L1RewardRecipient` :`ArbGasInfo.getL1RewardRecipient()`\n\nThose precompiles addresses can be found [here](https://docs.arbitrum.io/build-decentralized-apps/reference/contract-addresses#precompiles) .", + "key": "is-the-sequencer-fee-pool-model-currently-applied-to-the-orbit-chain-how-can-one-find-the-address-of" + }, + { + "question": "Can I ignore the warning below? It won't keep coming up.\n\nWARN [06-24|21:31:39.004] error finding requested sequence number in backlog: sending the entire backlog instead err=\"error finding backlog segment containing message with SequenceNumber 40\"", + "answer": "Yes", + "key": "can-i-ignore-the-warning-below-it-won-t-keep-coming-up-warn-06-24-21-31-39-004-error-finding-request" + }, + { + "question": "How many batches must be submitted to generate an assertion? Even if only one batch is submitted, will an assertion be generated after a certain amount of time? (What is the relevant configuration?)", + "answer": "The assertion creation doesn't have a strong relationship to batch amount, as your batchposter's message number higher than the latest one recorded on parent chain, then the batch poster can post the batch. Related setting is `--node.bold.assertion-posting-interval` (bold) or `--node.staker.make-assertion-interval` (legacy)", + "key": "how-many-batches-must-be-submitted-to-generate-an-assertion-even-if-only-one-batch-is-submitted-will" + }, + { + "question": "How many blocks can a batch poster contain at minimum and maximum, and how many transactions must be included to create a batch?", + "answer": "It depends on the tx size, we don't usually say how many tx or blocks here, but how much sizes those tx are, the flag is ``--node.batch-poster.max-size``", + "key": "how-many-blocks-can-a-batch-poster-contain-at-minimum-and-maximum-and-how-many-transactions-must-be-" + }, + { + "question": "What are the current hardware specifications of the nodes that make up Arbitrum one, which is currently being operated by offchain labs?(sequencer, validator, full node, relay, etc.)", + "answer": "Most of our instances run on a cloud provider and we use Kubernetes to orchestrate the deployment and management of services. As a reminder, Arbitrum One is unique: it was the first L2 blockchain to launch and has been in production for over 3 years. The types of applications and what users do on Arbitrum One is likely to be very different from any other chain and so I'd ask that you keep this in mind while comparing your chain's hardware configurations and performance.\n\n• Our sequencer runs a minimum of: 10 CPU cores, 90GB of RAM, and a fairly large local NVMe drive, specifically ~6.6TB in size. On AWS, we use `i7ie.3xlarge`.\n• The archive node runs on: 2 CPU cores, 40GB RAM, and a large 16TB `gp3` high iops volume\n• Validators run on a minimum of 3 CPU cores, 32GB RAM, and a 4TB `gp3` high iops volume\n• Regular RPC nodes we run are roughly 4 CPU cores and 32GB RAM.\n\n Note that most professional node operators for RPC nodes (e.g. Alchemy, Infura, Quicknode, etc) run way larger machines to serve RPC calls because those companies sell RPC-as-a-service for their business and so they have higher requirements for uptime and performance. We do not do that since we do not serve high volume, production calls on our RPC nodes - our RPC nodes are public and free and therefore have a lower requirement for all those things i mention above (latency, perf, uptime, etc)\n\nFor setting up own chain, we do recommend HA set ups. [This repository of helm charts might be valuable to your team](https://github.com/OffchainLabs/community-helm-charts). Again, we want to emphasize that these specifications are for Arbitrum One and its demand/load profile. A new chain or a different chain will have a different demand/load profile and set of users and apps that may mean your chain will use more or less than what Arbitrum One uses. Generally, I believe that better hardware and better configurations/setups in your DevOps environment lead to better outcomes: being able to handle more throughput, transactions, and offering better latency.We're continuously and currently doing optimization work to both increase performance for the same hardware, as well as doing benchmarking to see what performance and throughput look like at higher hardware tiers.", + "key": "what-are-the-current-hardware-specifications-of-the-nodes-that-make-up-arbitrum-one-which-is-current" + }, + { + "question": "Is there a way to prevent the base fee from increasing during congestion, and how long does it take to return to normal after congestion clears?", + "answer": "C Currently there is no way to lock the base fee, however the chain owner is able to increase the speed limit of their chain along with some other configurations which will mitigate the increase during congestion\n\nArbitrum is also **exploring mechanisms to smooth out fee volatility** and better isolate Orbit chains from **L1 gas price fluctuations**.", + "key": "is-there-a-way-to-prevent-the-base-fee-from-increasing-during-congestion-and-how-long-does-it-take-t" + }, + { + "question": "The default value below is 1024. Does this mean that 1024 transactions can be queued at once? If the remaining 1024 is exceeded, will the user receive a network busy error?How is the time for processing and sending a single transaction from the queue adjusted, and how long is it?--execution.sequencer.queue-size int", + "answer": "No, the queue-size here means the tx number reach to sequencer but haven't been queued yet, if 1024 exceed and the tx can't be added in 12 s, user will get error like `context deadline exceeded`", + "key": "the-default-value-below-is-1024-does-this-mean-that-1024-transactions-can-be-queued-at-once-if-the-r" + }, + { + "question": "INFO [06-24|21:31:59.632] validated execution                      messageCount=40 globalstate=\"BlockHash: 0x0a3e00344c3951143eb0f21020d3188ee175ae0de2401b81a799b05dc3a138a8, SendRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, Batch: 12, PosInBatch: 0\" WasmRoots=[0x184884e1eb9fefdc158f6c8ac912bb183bf3cf83f0090317e0bc4ac5860baa39]\n\n\nDoes the messageCount mentioned above refer to the number of the last posted L2 blocks? Does the Batch 12 mentioned above mean that the 12th batch submitted by the batch poster is brought to the validator and verified? Does the PosInBatch: 0 mentioned above mean that there is only one batch? Or what does it mean?", + "answer": "Although messages here can be used to produce block, but I don't suggest you understand it as block. Yes, batch 12 here means this validator verified to batch 12 and PosInBatch means the position in batch, (because batch can divided into different segments) not means batch number.", + "key": "info-06-24-21-31-59-632-validated-execution-messagecount-40-globalstate-blockhash-0x0a3e00344c395114" + }, + { + "question": "What determines when batches are generated and posted from a child chain to its parent chain? It appears that a batch is not created for every block. What are the specific criteria for batch generation?", + "answer": "Batch generation and posting are governed by both **time-based** and **size-based** criteria. The **batch poster** submits a batch to the parent chain when **either** of the following conditions is met:\n1. **Time limit reached:**\n ◦ Controlled by the parameter `--node.batch-poster.max-delay`, which defines the **maximum duration** allowed between batch postings (assuming there is activity and the poster is properly funded).\n2. **Size limit reached:**\n ◦ For **calldata batches**, controlled by `--node.batch-poster.max-size`.\n ◦ For **EIP-4844 (blob) batches** (applicable to L2s), controlled by `--node.batch-poster.max-4844-batch-size`.\n\nIn practice, this means a batch is posted **either after a set time interval** or **once enough transaction data has accumulated** to reach the configured maximum batch size. As a result, batches do not correspond one-to-one with blocks on the child chain — multiple blocks may be included in a single batch.\n\n**Default values:\n**`--node.batch-poster.max-delay` : default 1h0m0s\n`--node.batch-poster.max-size` : default 100000", + "key": "what-determines-when-batches-are-generated-and-posted-from-a-child-chain-to-its-parent-chain-it-appe" + }, + { + "question": "What is the config that adjusts the block creation cycle and the number or amount of transactions that can be contained in a single block? If there are no transactions, will an empty block be created after 72 hours like the config below? What is the related config?--node.batch-poster.max-empty-batch-delay duration (default: 72h0m0s)", + "answer": "The flag which can adjust the block creation cycle is `--execution.sequencer.max-block-speed` , I would suggest you to go through this [code](https://github.com/OffchainLabs/nitro/blob/master/execution/gethexec/sequencer.go#L1451-L1458), the sequencer will try to create the block every `MaxBlockSpeed` , and if no tx, the return of `createBlock` will be false. \nAs for **--node.batch-poster.max-empty-batch-delay**, yes, this will make batchposter sends an empty batch to l1, and this will results in a new delayed message `batchpostingReport` created, and this will cause a new block on l2.", + "key": "what-is-the-config-that-adjusts-the-block-creation-cycle-and-the-number-or-amount-of-transactions-th" + }, + { + "question": "Does Arbitrum One also manually bridging the ETH required for batchposter?", + "answer": "This can be done by an automatic script and the logic is relatively easy.", + "key": "does-arbitrum-one-also-manually-bridging-the-eth-required-for-batchposter" + }, + { + "question": "When a log occurs because the batch poster has no balance, the batch poster's balance is increased, but the batch posting occurs after some time after the balance is charged. How long after the balance is charged is posting possible? And what are the related confirmation logic intervals and configs?", + "answer": "The minimum check time period is 10 s. however, there is no logs [here](https://github.com/OffchainLabs/nitro/blob/master/arbnode/dataposter/data_poster.go#L1117), I will forward this to our team and maybe add a new log there.\n\n(Data entry note, as of right now it does not seem there is a log at this function)", + "key": "when-a-log-occurs-because-the-batch-poster-has-no-balance-the-batch-poster-s-balance-is-increased-bu" + }, + { + "question": "Please check if the log interpretation below is correct.\n\nINFO [06-24|21:31:12.131] BatchPoster: batch sent sequenceNumber=11 from=38 to=40 prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0\n\nThe batch sequence number is 11th and includes L2 Block 38 to 40. (Is this interpretation correct?) / But what does prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0 mean here ?", + "answer": "Yes, you are right, `preDelayed` means before this batch, how many delayed tx from parent chain are accepted, and `currentDelayed` means after this batch, how many delayed tx are accepted. The totalSegments means how many seg messages are in this batch, it can be user tx batch or also time update message (tell the network to advance timestamp) and so on, all seg message types are [here](https://github.com/OffchainLabs/nitro/blob/master/arbstate/inbox.go#L187-L191). numBlobs=0 which means this batch doesn't post eip4844 blobs.", + "key": "please-check-if-the-log-interpretation-below-is-correct-info-06-24-21-31-12-131-batchposter-batch-se" + }, + { + "question": "While testing an Orbit L3 node, an issue occurred when using the eth_getLogs query. The problem was traced to a block range exceeding 10,000 blocks. Chainstack, the node provider, mentioned that Arbitrum recommends keeping the block range per eth_getLogs query under 10,000 blocks to avoid errors and performance issues. How can the block range for eth_getLogs be adjusted on the Orbit L3 chain? For context and logs refer here - https://offchainlabs.slack.com/archives/C08373EP1QQ/p1761783628215019?thread_ts=1761726622.755719&cid=C08373EP1QQ", + "answer": "This issue originates from the node responding to an `invalid block range` parameter in the client's `eth_getLogs` query, not from the parent chain or the node provider. The error indicates that the **client is requesting logs with a block range larger than what the node supports**. To resolve this, you'll need to adjust the query parameters on the **client side**, ensuring that each request spans **no more than 10,000 blocks**.\n\nAdditionally, if you encounter the error `wrong msgIdx got 167230 expected 167228`, this points to **database inconsistency** between components of your node setup. Resetting only one database can create further synchronization issues.\n\nIf the chain is running in **Rollup mode**, the recommended fix is to **delete the entire database** (typically located at `/home/user/.arbitrum/`) and **resync the node** from the parent chain. This ensures full consistency across databases and resolves the indexing mismatch.", + "key": "while-testing-an-orbit-l3-node-an-issue-occurred-when-using-the-eth-getlogs-query-the-problem-was-tr" + }, + { + "question": "Regarding the configuration below, the default value is 100000. If the compression rate is 11, how many transactions can be included on average?", + "answer": "Sorry, different tx has different size, there is no correct way to estimate it, but you can check our mainnet as an example: [https://arbiscan.io/batches](https://arbiscan.io/batches).", + "key": "regarding-the-configuration-below-the-default-value-is-100000-if-the-compression-rate-is-11-how-many" + }, + { + "question": "what a customized relayer cache is and how transactions are processed by adding a customized relayer cache to the High-availability sequencer diagram to make it easier to understand?", + "answer": "This is an example scenario to explain the solution when sening more transactions than the sequencer's pending transaction queue can handle.\n\nThe general idea is to deploy a relayer that holds the transactions and sends them to the sequencer once the sequencer is able to process them.\n\nIt can also be configured to increase your sequencer's pending transaction queue capacity:\n• `--execution.sequencer.queue-size` (default: 1024)\n• `--execution.sequencer.queue-timeout` (default: 12s) by setting \n\nThese parameters to higher values, you can increase the sequencer's pending transaction queue size.", + "key": "what-a-customized-relayer-cache-is-and-how-transactions-are-processed-by-adding-a-customized-relayer" + }, + { + "question": "Batch posters seem to bridge the fees received from L2 to L1 fees at regular intervals. What is the frequency?", + "answer": "Those funds (network revenue) will be paid to child chain `feeCollector` and will not bridge to L1 automatically.Those funds will be paid after each time batch posting.", + "key": "batch-posters-seem-to-bridge-the-fees-received-from-l2-to-l1-fees-at-regular-intervals-what-is-the-f" + }, + { + "question": "How is the compression rate of 11 calculated?", + "answer": "Brotli:11 is best ratio level of compression, you can find it at google's [paper](https://github.com/google/brotli/blob/master/docs/brotli-comparison-study-2015-09-22.pdf).", + "key": "how-is-the-compression-rate-of-11-calculated" + }, + { + "question": "What is the posting interval for batch posters? (What is the related configuration?)", + "answer": "When the batch poster has at least 1 useful tx, it will wait until whether `--node.batch-poster.max-delay` reaches or `--node.batch-poster.max-size` (calldate posting) / `--node.batch-poster.max-4844-batch-size` (blob posting) reaches, default values for those 2 is 1h0m0s and 100000 bytes(calldata posting) or 0 (blob posting based on parent chain config). Or if there is no tx recorded, batch poster will post an empty batch after `--node.batch-poster.max-empty-batch-delay` .", + "key": "what-is-the-posting-interval-for-batch-posters-what-is-the-related-configuration" + }, + { + "question": "How does gas price fluctuation on Arbitrum compare to Ethereum, where it increases or decreases within a 12.5% range depending on network congestion?", + "answer": "Arbitrum's gas pricing mechanism works differently from Ethereum's.\n\nOn **Ethereum**, the base fee adjusts by up to **±12.5% per block** based on how full the previous block was.\nOn **Arbitrum**, the gas price remains fixed at the **MinimumL2BaseFee** until **real-time gas usage exceeds the network's gas speed limit**. Once that threshold is crossed, the base fee increases dynamically according to network backlog using the following formula:\n**`F = exp(-a(B - b))`**\nWhere:\n• **F** = current base fee\n• **B** = gas backlog\n• **a** = parameter controlling how fast the fee rises with congestion\n• **b** = threshold backlog before the escalation begins\n\nThis model allows Arbitrum to respond smoothly to congestion, scaling gas prices based on actual network pressure rather than per-block fullness.\n\nMore information can be found in [this documentation](https://docs.arbitrum.io/how-arbitrum-works/state-transition-function/arbos#child-chain-gas-fees).", + "key": "how-does-gas-price-fluctuation-on-arbitrum-compare-to-ethereum-where-it-increases-or-decreases-withi" + }, + { + "question": "The poster fee for an Orbit L3 test chain has increased by about tenfold since yesterday. Could this be caused by the network status of Arbitrum Sepolia, or is there another reason?", + "answer": "On Orbit chains, the **batch poster fee** is directly influenced by the **L1 gas price** on the parent chain. If the chain is using **Arbitrum Sepolia** as its parent, any spike in **Sepolia's L1 gas price** will cause the batch posting cost to rise — sometimes by a factor of ten or more. This behavior is expected, as the posting fee scales with the parent chain's gas price.", + "key": "the-poster-fee-for-an-orbit-l3-test-chain-has-increased-by-about-tenfold-since-yesterday-could-this-" + }, + { + "question": "If traffic continues to come in at over 100,000 bytes per Tx(s), how fast can batches be done?", + "answer": "It will check if batch can be posted every 10s, so answer to this is around 10s. (And you also need to wait the tx confirm time on l1, which is not fixed, some time it will be very fast but some time it may need you to wait several mins or even more)", + "key": "if-traffic-continues-to-come-in-at-over-100-000-bytes-per-tx-s-how-fast-can-batches-be-done" + }, + { + "question": "Can the withdrawal time from L3 to Arbitrum One (L2) be reduced compared to the withdrawal time from Arbitrum One (L2) to Ethereum (L1)?", + "answer": "Yes, anytrust can enable fast withdrawal which can be reduced to **15 mins **for L2s**, **and** 15 seconds** for L3s**. **AnyTrust chains are already placing a trust assumption on their Data Availability Committee (DAC) to provide the data needed for fraud proofs and recreating the chain.It is possible for an Arbitrum chain Rollup to adopt fast withdrawals. However, it would technically no longer be a Rollup as the minimum trust assumption will shift to the trust placed in the Fast Confirmations committee. related [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/fast-withdrawals)", + "key": "can-the-withdrawal-time-from-l3-to-arbitrum-one-l2-be-reduced-compared-to-the-withdrawal-time-from-a" + }, + { + "question": "In this case, I am curious about why weth and multi call use the existing contracts together and what their roles are.", + "answer": "weth and multi call are usually specific to the chain and be a constant contract, like on ethereum sepolia, because lof of users will use those 2 contracts, there is no need to deploy a new one when a new user uses it, so when deploy a new chain, the parent chain's weth and multi call contracts we will use the universal one.", + "key": "in-this-case-i-am-curious-about-why-weth-and-multi-call-use-the-existing-contracts-together-and-what" + }, + { + "question": "What does \"resolve any unconfirmed assertions\" mean in resolve node explanation? (What does resolve mean here?) This is a question from another team member. Is \"resolve any unconfirmed assertions\" performed by the rollup contract rather than the validator?", + "answer": "The assertion life cycle is: `assertion created` -> `assertion waiting for challenge` -> `assertion confirmed` in happy case. The resolve mean confirm an assertion, arbitrum is optimistic rollup, the l1 will not do any execution when there is no challenge, so needs to be resolved on rollup contract by validator after it created, I would highly recommend you go through those docs (**[Validation and Proving Mechanisms](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving)**, [rollup protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/rollup-protocol) and [challenge protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/proving-and-challenges)) for a better understanding.", + "key": "what-does-resolve-any-unconfirmed-assertions-mean-in-resolve-node-explanation-what-does-resolve-mean" + }, + { + "question": "How can I call smart contract functions and listen to events emitted by said contracts (Original question asked specifically about changing transaction fee receiver and how to call/read smart contract functions/events)", + "answer": "This is the [example](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/setup-fee-distributor-contract/index.ts) has code to call arbOwner contract, it is about how to call `arbOwner.setInfraFeeAccount`The contract interface is [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbOwner.sol#L111).\nyou can use ethers.js to filter those events, here is the [docs](https://docs.ethers.org/v5/concepts/events/).Those events belongs to Rollup and challengeManager.", + "key": "how-can-i-call-smart-contract-functions-and-listen-to-events-emitted-by-said-contracts-original-ques" + }, + { + "question": "Is there a difference in network fees when executing the same kind of transaction on Orbit L2 and Orbit L3?", + "answer": "There is no difference of network fee between L2 and L3 chains, but due to parent chain's gas prices changes, the child chain gas will be different in different time.", + "key": "is-there-a-difference-in-network-fees-when-executing-the-same-kind-of-transaction-on-orbit-l2-and-or" + }, + { + "question": "I want to estimate how much transaction fee a batch poster, sequencer, or validator submits to L1 per month, which config should I check and at what cycle should I multiply * tx average?", + "answer": "While using math is possible, the easiest and preferred way to do this is to just monitor the batch poster and validator directly to keep track of their funds and how much they used", + "key": "i-want-to-estimate-how-much-transaction-fee-a-batch-poster-sequencer-or-validator-submits-to-l1-per-" + }, + { + "question": "Where is the RPC code located", + "answer": "For rpc each specific methods implementation, you can check code here. http/ws processing here", + "key": "where-is-the-rpc-code-located" + }, + { + "question": "what are the roles of the nativeToken contract and adminProxy here, and why is validatorWalletCreator needed?", + "answer": "native token here is 0x0 means you use ethers as gas token, if it is other value, then means this chain will use that as gas token. About proxyAdmin, you can check oz docs. validatorWalletCreator can be used to create wallet for validator to ensure the funds safety.", + "key": "what-are-the-roles-of-the-nativetoken-contract-and-adminproxy-here-and-why-is-validatorwalletcreator" + }, + { + "question": "if i use the same validator address as a Makenode address at first and then change it to defensive mode, does it re-stacking every time i change the mode?For example, as i can see below, the money is spent twice.https://sepolia.etherscan.io/address/0x65fF9E2256CBaE32f8Ae18776cF1e66A2BEa436d (Mode : MakeNode->defensive) (twice out)https://sepolia.etherscan.io/address/0x9699040F6e8A10F6831884966ceBfaa2E50fe59B (Mode change is not sure but twice out)In this case, how can I withdraw the stake I made in the previous mode? Could you please guide me on the specific method?", + "answer": "No, it will just **need** stake once, the stake token of your chain is weth (wrapped ethers, which is an erc20 type of ethers). You can click [here](https://sepolia.etherscan.io/address/0x65ff9e2256cbae32f8ae18776cf1e66a2bea436d#tokentxns) to see your weth transfer history, then you will see there is only 1 time that your address transfer the weth token to your rollup contract, although you deposited twice (2 ethrs), only 1 weth is spent and your address still has 1 weth left, you can check it [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#readContract)  by call `balanceOf` and input is your address, if you want to withdraw weth back to eth, then use your address to connect to etherscan and call withdraw [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#writeContract).", + "key": "if-i-use-the-same-validator-address-as-a-makenode-address-at-first-and-then-change-it-to-defensive-m" + }, + { + "question": "is it possible to set up SSL or TLS in the application layer", + "answer": "There is no application-level ssl setting for nitro, you need to use a Reverse Proxy or cloud hosting solutions.", + "key": "is-it-possible-to-set-up-ssl-or-tls-in-the-application-layer" + }, + { + "question": "The Arbitrum developer documentation states that fast withdrawal is only recommended on the Anytrust chain. What would the reason be?", + "answer": "The reason fast withdrawals is only recommended for AnyTrust chains relates to the trust assumptions involved.For AnyTrust chains: The optimal setup is to have all Data Availability Committee (DAC) members also run validators as part of the fast withdrawals committee. This approach leverages the existing trust assumption placed on the DAC operators such that enabling fast withdrawals does not add any new trusted parties.For Rollup chains: While it is possible for an Arbitrum Rollup chain to adopt fast withdrawals, it would technically no longer be a Rollup as the minimum trust assumption will shift to additional trust assumptions. Because rollup mode is designed as trustless, whether to add additional trust assumptions or not needs further thinking.", + "key": "the-arbitrum-developer-documentation-states-that-fast-withdrawal-is-only-recommended-on-the-anytrust" + }, + { + "question": "How can I change the batchPoster", + "answer": "[In development guide to how to change your batch poster](https://github.com/OffchainLabs/arbitrum-docs/pull/2382/files)", + "key": "how-can-i-change-the-batchposter" + }, + { + "question": "Would there be any suggestion to reduce the transaction network fee, which currently costs 31,749 gas, to $0.00001?", + "answer": "1. Adjust gas price setting: Configure node parameters and contract settings to set a lower base fee ceiling.\n2. Batch Operations: Set a higher max batch size which can provide some very slightly support here.\n3. Configure Soft Gas Limit: Adjust the gas limit settings to maintain lower base fees during normal operation\n4. Note: If you are trying to lower down the gas price and increase the tps, you need to make sure your hardware can handle it or it may cause network nodes down.", + "key": "would-there-be-any-suggestion-to-reduce-the-transaction-network-fee-which-currently-costs-31-749-gas" + }, + { + "question": "Why is the L1 contract not responsible for checking the validity of an assertions instead of the validators", + "answer": "You can check our docs [here](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving). Arbitrum is optimistic rollup, optimistic means l1 will optimistically think every assertion is correct rather than rollup will auto verify it. So during a time if no challenge happens, validator will call l1 contract to resolve it. So you are also right, L1 contract is the one that resolves it, but needs validator to call it.", + "key": "why-is-the-l1-contract-not-responsible-for-checking-the-validity-of-an-assertions-instead-of-the-val" + }, + { + "question": "Is it possible to make the block creation cycle 4 times a second with a certain configurations", + "answer": "this config will set the fastest block time to 250 ms, which means the sequencer will try to create block every 250ms, but if last block creation time too long (too many tx) or there is no new tx, the block time gap won't exactly equal to 250ms, but longer than this, so there is no fixed block time on l2.", + "key": "is-it-possible-to-make-the-block-creation-cycle-4-times-a-second-with-a-certain-configurations" + }, + { + "question": "What is the mempool (L1)", + "answer": "The mempool is a place where pending L1 transactions wait to be picked up and executed on by an eth node", + "key": "what-is-the-mempool-l1" + }, + { + "question": "How can I adjust batch and asseration cycles? Which flags should I set?", + "answer": "You can adjust the timing and behavior of the **Batch Poster** and **Assertion** cycles using the following flags:\n**\n1. Batch Poster Flags**\n`--node.batch-poster.max-delay` **Maximum batch processing delay.\n**`--node.batch-poster.poll-interval` **Polling interval** - The time to wait between checking if a batch is ready to be posted.\n`--node.batch-poster.error-delay` **Error delay** - The time to wait after an error posting a batch.\n`--node.batch-poster.wait-for-max-delay` Wait for the maximum delay even if the batch is full.\n`--node.batch-poster.max-empty-batch-delay` Maximum delay before an empty batch can be posted.\n**\n2. Assertion Flags (BOLD)**\n\nThese flags are specific to the **BOLD** assertion strategy.\n`--node.bold.assertion-posting-interval`**Assertion posting interval.\n**`--node.bold.assertion-scanning-interval`**Assertion scanning interval** - The time to wait between scanning for newly created on-chain assertions.\n`--node.bold.assertion-confirming-interval`**Assertion confirming interval** - The time to wait between attempts to confirm assertions.\n`--node.bold.minimum-gap-to-parent-assertion` minimum duration to wait since the parent assertion was created to post a new assertion\n**\n3. Assertion Flags (Legacy)**\n\n`# Staker Interval - The frequency to check L1 rollup state and potentially take action.\n--node.staker.staker-interval\n\n# Make Assertion Interval - The frequency to create a new assertion when using the MakeNodes strategy.\n--node.staker.make-assertion-interval`", + "key": "how-can-i-adjust-batch-and-asseration-cycles-which-flags-should-i-set" + }, + { + "question": "what are the min and max TX sizes that Batcher submits to L1 in the case where there is no user TX and only system TX, and when user TX is full during batching? And in this case, can it be converted to gas only rather than datasize?", + "answer": "When tx total size (both user tx and system tx) equal or higher than `--node.batch-poster.max-size`, then it will post batch. The units of this is byte, default 100000 means 100000 bytes.", + "key": "what-are-the-min-and-max-tx-sizes-that-batcher-submits-to-l1-in-the-case-where-there-is-no-user-tx-a" + }, + { + "question": "even if there is only a single small transaction in a batch, will it still be posted in an hour", + "answer": "Small tx is also useful tx, any user's tx accepted by sequencer will be set as useful tx. So the batch will still be posted after 1 hour.", + "key": "even-if-there-is-only-a-single-small-transaction-in-a-batch-will-it-still-be-posted-in-an-hour" + }, + { + "question": "Among the MakeNode, Validator, and Resolve nodes, is MakeNode the only required element (mandatory)?", + "answer": "Technically, yes, you only need MakeNode is enough, but to increase the safety, it would be better to have more validators.", + "key": "among-the-makenode-validator-and-resolve-nodes-is-makenode-the-only-required-element-mandatory" + }, + { + "question": "Ethereum increases or decreases the Base Fee within a range of 12.5% depending on whether 50% of the block is filled. What is the basis for Arbitrum's Base Fee fluctuations?", + "answer": "There is a soft gas limit on Arbitrum chains. The default setting is 7m/s. If the gas spent rate is higher than this limit, the network fee will be increased. \nFormula: See Arbitrum Gas Fees Documentation ([https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees))\nThe soft limit is configurable in node configuration.", + "key": "ethereum-increases-or-decreases-the-base-fee-within-a-range-of-12-5-depending-on-whether-50-of-the-b" + }, + { + "question": "WARN [06-09|12:11:15.821] Getting file info dir=/home/ellena/nitro_build_2025_06/nitro/machines error=\"stat /home/ellena/nitro_build_2025_06/nitro/machines: no such file or directory\"", + "answer": "When you run the binary and get this error, this means you don't download the replay binary, you can download it by run `scripts/download-machine.sh` in nitro and copy it to the related machines dir.\nOr if you are doing some customization to STF, you need to build it your self by `make build-replay-env` and make sure you set the new wasm module root to your on chain contract too.", + "key": "warn-06-09-12-11-15-821-getting-file-info-dir-home-ellena-nitro-build-2025-06-nitro-machines-error-s" + }, + { + "question": "What is --node.batch-poster.poll-interval duration for", + "answer": "This sets the interval for checking and sending batches", + "key": "what-is-node-batch-poster-poll-interval-duration-for" + }, + { + "question": "In this case, can you tell me why the weth address is called when staking and how it moves from there to the rollup contract?", + "answer": "Your rollup contract uses weth as stake token, and the node needs to call weth contract to convert ethers to weth. Because weth is erc20 token, the erc20 token can be transfered by its method `transferFrom` on contract, [here](https://www.linkedin.com/pulse/erc20-decoded-understanding-approvals-allowances-frederick-van-staden) is an article talks about how erc20 token works.", + "key": "in-this-case-can-you-tell-me-why-the-weth-address-is-called-when-staking-and-how-it-moves-from-there" + }, + { + "question": "So, does that mean that a validator in makenode mode can make assertions even if there is no new batch? I thought that makenode meant submitting a new assertion to a new batch that is different from the existing one.", + "answer": "No, no relationships I mean is no need to have any specific amount of batch to post the assertion, if your batch number higher than last assertion's, then you are good to post the new one. related logic [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/RollupCore.sol#L471).", + "key": "so-does-that-mean-that-a-validator-in-makenode-mode-can-make-assertions-even-if-there-is-no-new-batc" + }, + { + "question": "-> --node.bold.assertion-posting-interval (bold) or --node.staker.make-assertion-interval (legacy) What are the differences between these two?", + "answer": "The first one is used for validators using the BoLD protocol, the second one is used for validators running the legacy protocol.", + "key": "node-bold-assertion-posting-interval-bold-or-node-staker-make-assertion-interval-legacy-what-are-the" + }, + { + "question": "How much ETH should I fund when running a Sequencer that also participates as a Validator?", + "answer": "**Sequencer and Validator typically should NOT run on the same node.** However, if asking about funding requirements for the address/wallet: the ETH needed equals the Validator's requirements, plus BatchPoster requirements if you're also running that component. The exact amount varies significantly based on chain activity.", + "key": "how-much-eth-should-i-fund-when-running-a-sequencer-that-also-participates-as-a-validator" + }, + { + "question": "Do all L1→L2 message go through the inbox contract?", + "answer": "Yes, even for bridge contract, it will finally call inbox's `createRetryableTicket` , for more about l1->l2 message, please refer to [this](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging) docs.", + "key": "do-all-l1-l2-message-go-through-the-inbox-contract" + }, + { + "question": "When I try to build nitro binary, I get the following error: make: wat2wasm: No such file or directory", + "answer": "You need to make sure you installed all **prerequisites **mentioned in this page: [https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally](https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally)", + "key": "when-i-try-to-build-nitro-binary-i-get-the-following-error-make-wat2wasm-no-such-file-or-directory" + }, + { + "question": "What are all configurations to improve TPS, and what hardware requirements are there to do so", + "answer": "This is a frequently asked question, and we usually don't say TPS on arbitrum, but gas used per second, currently the gas used per second soft limit on arb1 is 7m, if the ratio higher than this number, then gas price will increase, but if you want to adjust the soft limit, you can call ``ArbOwner.SetSpeedLimit``. So if you want to have a higher gas efficiency, I would recommend you to use stylus for contract deployment, for what is stylus, you can check the docs. So why increase the tps harder in decentralized netwrok? Because there will be a lot of fullnodes might join the network, it's easy to increase your own node's performance, but if only your node's performance increased, the other node can't catch up which might cause many users can't follow up the chain and might cause some potential issues.", + "key": "what-are-all-configurations-to-improve-tps-and-what-hardware-requirements-are-there-to-do-so" + }, + { + "question": "And what exactly is the role of the rollup event box?", + "answer": "You can take a look at rollupEventBox [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/AbsRollupEventInbox.sol), it has a function `rollupInitialized` which can be used to report init message.", + "key": "and-what-exactly-is-the-role-of-the-rollup-event-box" + }, + { + "question": "What are the differences between fullnode, validator, archive node, and sequencer? How do these node types relate to each other in the Nitro stack?", + "answer": "**Fullnode:** Syncs chain state and serves RPC requests\n**Validator:** Validates based on posted batches and posts assertions to parent chain, will also challenge current assertions if they deem it malicious or incorrect\n**Archive Node:** Fullnode that retains all historical state\n**Sequencer:** Orders transactions and produces blocks (not a fullnode)\n**Batchposter: **Posts queued tx by sequencer to partent chain.", + "key": "what-are-the-differences-between-fullnode-validator-archive-node-and-sequencer-how-do-these-node-typ" + }, + { + "question": "What is the minimum network fee (in USD) we can set for our blockchain, and what technical limitations prevent setting it lower?", + "answer": "The minimum `minL2BaseFee` is currently **0.0001**. Setting it lower than this threshold may cause overflow issues in the system.", + "key": "what-is-the-minimum-network-fee-in-usd-we-can-set-for-our-blockchain-and-what-technical-limitations-" + }, + { + "question": "The code below may not be perfect, but it is a temporary test result. As you can see from the results, only 91 were successful when 500 were sent per second. What configuration should I change to increase TPS?", + "answer": "I don't know how your script looks like so I have no idea if that failed due to which reason, your tx also might failed because the nonce reason or others when send a batch of txes. But to increase your chain's soft gas limit per second, call ``ArbOwner.SetSpeedLimit``` and use stylus contract to increase the gas efficiency.", + "key": "the-code-below-may-not-be-perfect-but-it-is-a-temporary-test-result-as-you-can-see-from-the-results-" + }, + { + "question": "How can I get all my core contracts address of my orbit chain?", + "answer": "There is a method named `getCoreContracts()` in chain-sdk, you can get it from your rollup deployment tx receipt.", + "key": "how-can-i-get-all-my-core-contracts-address-of-my-orbit-chain" + }, + { + "question": "When using a custom gas token in Orbit L3, Batchposter exchanges it for ETH and pays the transaction fee to the parent chain. Can a custom gas token be used even if it is not a listed token or there is no standard for measuring its value? If you could share details regarding using relayer option as you mentioned during the call, that would be appreciated as well.", + "answer": "Yes, a custom gas token can be used even if it's not a listed token, but it must meet specific requirements:\n**Requirements:\n**Must be a standard ERC-20 tokenTransfers and approvals \nmust occur directly via the token contract, not via proxies or hooks\nMust not be rebasing or include transfer fees\nMust not use transfer callbacks or any onchain behavior that reverts if the sender and recipient are the same\n**Fee Token Pricer Contract**: You need to deploy a fee token pricer. Here are 3 types of this pricer contract: Understanding the Fee Token Pricer ([https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer))Fee token pricer is a contract to tell your network the exchange rate between your custom token and ethers.", + "key": "when-using-a-custom-gas-token-in-orbit-l3-batchposter-exchanges-it-for-eth-and-pays-the-transaction-" + }, + { + "question": "WARN [07-01|18:57:19.915] Could not succeed function after retries retryCount=15 err=\"could not get assertion creation block for assertion hash 0x34de67082eeaddc3977bcc5a7d4a1e2b4649925b6e18300879c446717dba675c: execution reverted: ASSERTION_NOT_EXIST\"", + "answer": "Your staker tries to read an assertion but it is not exsited.\nThe most possible reason is because your rpc node has some issues or it hasn't synced to the latest block. Try change to another parent chain endpoint and see if it gets resolved.", + "key": "warn-07-01-18-57-19-915-could-not-succeed-function-after-retries-retrycount-15-err-could-not-get-ass" + }, + { + "question": "Regarding the Base Fee, L2 (Arbitrum Sepolia) is approximately 100 times more expensive than L1 (Ethereum Sepolia) on the Testnet. However, on the Mainnet side, L2 is approximately 20 times cheaper. Would there be certain reason for that?", + "answer": "This is because many devs choose the Arbitrum Sepolia as the testnet and they sent a lot of testing tx on Arb Sepolia, which causes this gas price to continue to be high.", + "key": "regarding-the-base-fee-l2-arbitrum-sepolia-is-approximately-100-times-more-expensive-than-l1-ethereu" + }, + { + "question": "What is the difference between the batchPoster and the batchPosterManager", + "answer": "batchPosterManager has the permission to add or remove batch poster by `setIsBatchPoster` , source code [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/bridge/SequencerInbox.sol#L814). While the batch poster posts batches", + "key": "what-is-the-difference-between-the-batchposter-and-the-batchpostermanager" + }, + { + "question": "Up until now, in order to pay the L2 tx fee, I used the deposit function call from L1 to L2 to transfer money, but is it not possible to randomly create money in the network itself without transferring money from L1 to L2 to a specific account in and without transfering from other account in L2 itself?", + "answer": "Do you mean if it's possible to \"create\" or \"mint\" ethers on Layer 2 directly? The answer to this question is no, because l2 can withdraw funds back to l1 and if you create new ethers on l2, which means you can create ethers on l1 too, that is not allowed", + "key": "up-until-now-in-order-to-pay-the-l2-tx-fee-i-used-the-deposit-function-call-from-l1-to-l2-to-transfe" + }, + { + "question": "do eth_get functions (read only) charge a transaction fee?", + "answer": "No", + "key": "do-eth-get-functions-read-only-charge-a-transaction-fee" + }, + { + "question": "Is there a config that affects the RPS of the newly built node, not the TPS? Is it true that the RPS is only affected by the CPU performance, memory, and network performance of the node rather than the config?In the newly built Nitro node, where is the part of the code that handles the function (Get by Blocknumber or) (eth_raw_sendTransaction) and what are the factors that affect each RPS and TPS performance (how are they different)?", + "answer": "There is no flag to set that.The code that handles those rpc requests is [here](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/eth/backend.go) ([https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go)). The serve time depends on your machines, and there is some flag to set the max-timeout:\n\n`--execution.rpc.evm-timeout duration timeout used for eth_call (0=infinite) (default 5s)\n --execution.rpc.filter-timeout duration log filter system maximum time filters stay active (default 5m0s)\n --execution.rpc.gas-cap uint cap on computation gas that can be used in eth_call/estimateGas (0=infinite) (default 50000000)`", + "key": "is-there-a-config-that-affects-the-rps-of-the-newly-built-node-not-the-tps-is-it-true-that-the-rps-i" + }, + { + "question": "Is moving from a L3 to an L2 possible and if so is it easy", + "answer": "technically it is possible, but it's not easy as you need to re-deploy all contracts and migrate some states also you need to continue to run the l3 node to provide historical state querying", + "key": "is-moving-from-a-l3-to-an-l2-possible-and-if-so-is-it-easy" + }, + { + "question": "What are the default cycle values for the resolve mode validator, make node validator, and defense mode validator", + "answer": "The config values for the nodes are the same \n--node.bold.assertion-confirming-interval duration confirm assertion interval (default 1m0s)\n--node.bold.assertion-posting-interval duration assertion posting interval (default 15m0s)\n--node.bold.assertion-scanning-interval duration scan assertion interval (default 1m0s)", + "key": "what-are-the-default-cycle-values-for-the-resolve-mode-validator-make-node-validator-and-defense-mod" + }, + { + "question": "Is an L2 Ether Faucet possible", + "answer": "There is no way to mint new ethers, so if you build a faucet, you can only top up it by yourself.", + "key": "is-an-l2-ether-faucet-possible" + }, + { + "question": "What is the role of WASM module root?", + "answer": "**WASM Module Root** is a **cryptographic hash (commitment)** that uniquely identifies a specific version of the **Arbitrum State Transition Function (STF)** compiled to WebAssembly. \nThis is needed for fraud proof.", + "key": "what-is-the-role-of-wasm-module-root" + }, + { + "question": "ERROR[...] Disabling batch posting due to batch being within reorg resistance margin from layer 1 minimum block or timestamp bounds\nreorgResistanceMargin=10m\nfirstMsgTimeStamp=X\nl1BoundMinTimestamp=Y\nfirstMsgBlockNumber=Z\nl1BoundMinBlockNumber=W", + "answer": "The batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation__). \nYou can set `--node.batch-poster.reorg-resistance-margin=0 `and `—-node.batch-poster.l1-block-bound=ignore` to bypass but **very import note** this might cause chain reorg.", + "key": "error-disabling-batch-posting-due-to-batch-being-within-reorg-resistance-margin-from-layer-1-minimum" + }, + { + "question": "How should I run the node using the JSON config? (nodeConfig.json)", + "answer": "Apply `--conf.file` to your node when starting, and remember if you are running with docker, you should mount your config file to the container first and point this flag to that mount point", + "key": "how-should-i-run-the-node-using-the-json-config-nodeconfig-json" + }, + { + "question": "Does that mean that even if there is no tx after 72 hours, an empty batch posting will occur and a new assertion will be submitted in the new batch,right? Or does it mean that if there is no tx, the block is not generated, but empty batch posting is performed for assertion? Didn't you say above that at least one block must be generated before batch posting?", + "answer": "Empty batch can be posted after 72 hours this is true, empty batch means there is no user tx within the batch, so no need to have user's tx for a batch posting, **but there will be system tx like** `batchPostingReport` **to create a new block,**  And this block won't contain any **user tx**.", + "key": "does-that-mean-that-even-if-there-is-no-tx-after-72-hours-an-empty-batch-posting-will-occur-and-a-ne" + }, + { + "question": "WARN [06-11|09:12:22.830] error getting max time variation on L1 bound block; falling back on latest block err=\"429 Too Many Requests: {\\\"code\\\":-32007,\\\"message\\\":\\\"50/second request limit reached - reduce calls per second or upgrade your account at quicknode.com\\\"}\"", + "answer": "This 429 error returned from your parent chain rpc endpoint, you need to check the status of your parent chain rpc endpoint.", + "key": "warn-06-11-09-12-22-830-error-getting-max-time-variation-on-l1-bound-block-falling-back-on-latest-bl" + }, + { + "question": "1. What does validation_* mean here? /Why do I need to copy the jwt file when upgrading SW? Doesn't the validator, not just spli-validtor, also have jwt and perform certain functions?", + "answer": "The `validation_` is part of auth api by default. If you want to access the auth api, you need to use this jwt secret. Usually we only set `validation_` to auth api endpoint. And `validation_` can be used to query the validation info, this is usually used by validator, normally there is no need to call this endpoint.", + "key": "1-what-does-validation-mean-here-why-do-i-need-to-copy-the-jwt-file-when-upgrading-sw-doesn-t-the-va" + }, + { + "question": "On the Testnet, withdrawal from L3 to L1 takes approximately 3 hours. Is the L1 block time set shorter because it's a Testnet? On the Mainnet, without any special configuration changes, would the withdrawal from L3 to L2 and L2 to L1 take 7 days each (45,818 L1 blocks)? If so, how can we shorten the withdrawal from L3 to L2 and L2 to L1 when using Roll-up, and by what would the shortest as possible time be?", + "answer": "For testnet's shorter time, this is because we don't need to give testnet such a long time to ensure the security as the funds are all for testing use cases and it's not real funds.\nFor mainnet implementation, to reduce the withdraw time, there are some potential options:\n1. Fast Withdrawals (Recommended for AnyTrust)\n2. Configure Shorter Challenge Period (Reduces security margin for fraud detection, must carefully evaluate before configuring this)\n3. Third-Party Bridge/Liquidity Solutions. (Powered by 3rd party oracles)", + "key": "on-the-testnet-withdrawal-from-l3-to-l1-takes-approximately-3-hours-is-the-l1-block-time-set-shorter" + }, + { + "question": "Where is the code that handles batch posting", + "answer": "[https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go](https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go) is the repo, MaybePostSequencerBatch is the function", + "key": "where-is-the-code-that-handles-batch-posting" + }, + { + "question": "How do I deploy the Rollup Creator (factory) contract to a custom parent chain that isn't Ethereum Sepolia or Arbitrum Sepolia? What additional configuration is needed beyond .env and config.ts?", + "answer": "**We do not recommend deploying your own Rollup Creator contract.** Instead, use the existing official Rollup Creator contracts that are already deployed. If you absolutely must deploy your own, refer to the deployment scripts in the nitro-contracts repository: [https://github.com/OffchainLabs/nitro-contracts](https://github.com/OffchainLabs/nitro-contracts)", + "key": "how-do-i-deploy-the-rollup-creator-factory-contract-to-a-custom-parent-chain-that-isn-t-ethereum-sep" + }, + { + "question": "How are assertions resolved", + "answer": "To resolve an assertion, your validator will call `confirmAssertion` , just use the default cycle is fine.If you run more than 2 resolves node or makenodes node, they will compete to call this method.", + "key": "how-are-assertions-resolved" + }, + { + "question": "WARN [07-01|18:13:26.929] Could not submit latest assertion err=\"could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1\" validatorName=default-validator", + "answer": "This is **normal behavior** and will usually resolve automatically. Your validator has an unconfirmed transaction in the mempool of parent chain and is waiting for it to be confirmed before submitting the next assertion. This warning does not impact node operation.**\nRoot Cause**\n• **Current situation:** Validator has already sent a transaction (nonce 30) that is still pending in the mempool\n• **Mempool limit:** Configured to allow only 1 unconfirmed transaction at a time (default setting)\n• **Blocked transaction:** Next transaction (nonce 31) cannot be sent until the previous one confirms**\nResolution**\n**Option 1: Wait (Recommended)**\n• The pending transaction will confirm automatically\n• Once confirmed, the validator will submit the next assertion\n• **No action needed** - this is expected behavior\n**Option 2: Increase Mempool Size**\nIf you want to allow multiple unconfirmed transactions simultaneously, increase the mempool limit:\n**For BOLD validators:**\n\n`--node.bold.data-poster.max-mempool-transactions `\n**For legacy validators:**\n\n`--node.staker.data-poster.max-mempool-transactions ` \n\n**Log Level Logic:**\n• **< 10 minutes:** WARN - considered a temporary issue\n• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level", + "key": "warn-07-01-18-13-26-929-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-thi" + }, + { + "question": "But if TPS increases, for example, if 100 sequences are sent per second, will the response speed after each transmission be uniform, or will the overall response speed slow down?", + "answer": "(didnt see an answer but seems like a useful question)", + "key": "but-if-tps-increases-for-example-if-100-sequences-are-sent-per-second-will-the-response-speed-after-" + }, + { + "question": "Is the Resolve node responsible for staking at existing assertions, right?", + "answer": "Resolve node will not only create assertions, and yes it will only make actions on those existing assertions, also it can resolve the assertions.", + "key": "is-the-resolve-node-responsible-for-staking-at-existing-assertions-right" + }, + { + "question": "How can we handle transaction overflow when the Sequencer's pending queue reaches capacity, especially when transactions must be processed in order and retries are not possible?", + "answer": "The Sequencer has a configurable pending transaction queue with adjustable size and timeout parameters. You can tune these settings to handle higher transaction volumes, but there are architectural considerations for scenarios where retries are not possible.**\nConfiguration Options**\nThe Sequencer's pending transaction queue can be configured using these flags:\n**Queue Size:**\n\n`--execution.sequencer.queue-size int`\n• **Default:** 1024 transactions\n• **Purpose:** Sets the maximum number of transactions that can wait in the pending queue\n• **Recommendation:** Increase this value based on your expected transaction volume\n**Queue Timeout:**\n\n`--execution.sequencer.queue-timeout duration`\n• **Default:** 12 seconds\n• **Purpose:** Maximum time a transaction can remain in the queue before being dropped\n• **Recommendation:** Consider increasing if your transaction processing has predictable but longer latency requirements**\nSolutions for High-Volume Scenarios**\n**1. Increase Queue Capacity**\n• Scale `queue-size` to accommodate peak transaction loads\n• Monitor queue utilization metrics to determine appropriate sizing\n• Consider your RAM constraints when setting large queue sizes\n**2. Pre-Submission Rate Limiting**\n• Implement rate limiting on the client side \n• Match submission rate to your Sequencer's processing capacity\n• Prevents queue overflow before it happens**\nCaveats & Important Notes**\n⚠️ **No Built-in Overflow Protection:** Once the queue is full, new transactions are rejected. There's no automatic spillover mechanism.\n⚠️ **Memory Constraints:** Very large queue sizes consume significant RAM. Ensure your infrastructure can support the configured queue size.\n\nThis might solve your problems here, but if you will accept a large number of tx at the same time, having a **customized relayer** cache will be better.", + "key": "how-can-we-handle-transaction-overflow-when-the-sequencer-s-pending-queue-reaches-capacity-especiall" + }, + { + "question": "Is there a config to monitor transaction fees", + "answer": "No there is no but it is possible to write a simple script to do it for you", + "key": "is-there-a-config-to-monitor-transaction-fees" + }, + { + "question": "ERROR[06-10|15:33:12.823] disabling L1 bound as batch posting message is close to the maximum delay\nblockNumber=8,479,298\nl1BoundMinBlockNumberWithBypass=8,490,627\ntimestamp=1,749,090,792\nl1BoundMinTimestampWithBypass=1,749,227,592\nl1BlockBoundBypass=1h0m0s", + "answer": "This ERROR indicates the batch contains very old messages approaching the maximum delay limit. The system automatically disables L1 bound checking as a protection mechanism to allow these old messages to be posted, preventing them from being stuck indefinitely.\nHowever, even if this batch gets posted successfully, you may encounter another related error: `Disabling batch posting due to batch being within reorg resistance margin\nfrom layer 1 minimum block or timestamp bounds` and the batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation)", + "key": "error-06-10-15-33-12-823-disabling-l1-bound-as-batch-posting-message-is-close-to-the-maximum-delay-b" + }, + { + "question": "Can I assume that chain sdk deploys not only the rollup creator contract(=factory contract) but also all related rollup contracts?", + "answer": "chain-sdk is used to deploy the rollup based on current rollup creator, it doesn't deploy rollup creator.", + "key": "can-i-assume-that-chain-sdk-deploys-not-only-the-rollup-creator-contract-factory-contract-but-also-a" + }, + { + "question": "ERROR[07-01|18:24:06.947] Could not submit latest assertion\nerr=\"could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1\"\nvalidatorName=default-validator", + "answer": "This ERROR indicates a transaction (nonce 30) has been pending for **over 10 minutes** without confirmation. This is a serious issue requiring immediate investigation - the transaction is likely stuck due to low gas price, L1 congestion, or RPC issues.**\nWhy This Escalated from WARN to ERROR**\n**Log Level Logic:**\n• **< 10 minutes:** WARN - considered a temporary issue\n• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level\n**Situation:**\nThe escalation to ERROR means nonce 30 has been unconfirmed for over 10 minutes, blocking all subsequent assertions. This is **not normal** temporary waiting.**\nImmediate Diagnostic Steps**\n**1. Check L1 Pending Transaction**\nView the validator address on L1 to inspect the stuck transaction:bash\n\n*`# Using Etherscan or similar block explorer# Or query via RPC:`*`\neth_getTransactionByHash `\n**2. Identify Root Cause**\n**a. Gas Price Too Low (Most Common)**\n• Transaction gas price is too low for current L1 network conditions\n• L1 miners/validators won't prioritize it\n• **Solution:** Increase gas price configuration\n**b. Severe L1 Network Congestion**\n• L1 network is extremely congested\n• Even reasonable gas prices are stuck\n• **Solution:** Significantly increase gas price or wait for congestion to clear\nc**. RPC Node Problem**\n• L1 RPC node may not be properly broadcasting the transaction\n• Transaction might not actually be in mempool\n• **Solution:** Verify RPC endpoint health, consider switching providers**\nSolution Options\nOption 1: Increase Mempool Size (Allow System to Continue)**\nThis lets the validator submit new assertions even while nonce 30 is stuck:\n**For legacy validators:**bash\n\n`--node.staker.data-poster.max-mempool-transactions=10`\n**For BOLD validators:**bash\n\n`--node.bold.data-poster.max-mempool-transactions=10`\n**Trade-off:** More capital locked in pending transactions, but assertions continue**\nOption 2: Increase Gas Price Configuration**\nMake transactions more competitive on L1:\n\n*`# Increase base gas price`*`\n--node.staker.data-poster.target-price-gwei\n\n`*`# Increase urgency multiplier`*`\n--node.staker.data-poster.urgency-gwei\n\n`*`# Increase max tip`*`\n--node.staker.data-poster.max-tip-cap-gwei`**\nOption 3: Manually Accelerate Stuck Transaction**\nIf nonce 30 is genuinely stuck, use Replace-By-Fee (RBF):\n**Steps:**\n1. Get transaction details for nonce 30\n2. Send replacement transaction with:\n\n ◦ **Same nonce:** 30\n ◦ **Higher gas price:** At least 10% increase\n ◦ **Same transaction data**\n**Note:** DataPoster should handle this automatically, but if `replacement-times` is configured too conservatively, manual intervention may be needed.\n**Check replacement configuration:**\n\n*`# Default: 5m, 10m, 20m, 30m, 1h, ...# For faster replacement:`*`\n--node.staker.data-poster.replacement-times=\"2m,5m,10m,20m\"`**\nOption 4: Check DataPoster Status**\nMonitor DataPoster internal state:bash\n\n*`# If metrics are enabled:`*`\ncurl http://localhost:6070/debug/metrics/prometheus | grep dataposter\n\n`*`# Key metrics to watch:# - arb_dataposter_latest_unconfirmed_nonce# - arb_dataposter_balance# - arb_dataposter_pending_transactions`***\nRecommended Complete Configuration**\nFor validators experiencing persistent stuck transactions:\n\n*`# Allow multiple pending transactions`*`\n--node.staker.data-poster.max-mempool-transactions=10\n\n`*`# More aggressive gas pricing`*`\n--node.staker.data-poster.target-price-gwei\n--node.staker.data-poster.urgency-gwei\n--node.staker.data-poster.max-tip-cap-gwei\n\n`*`# Faster replacement cycle`*`\n--node.staker.data-poster.replacement-times=\"3m,6m,12m,20m,30m\"\n\n`*`# Wait for L1 finality (recommended for security)`*`\n--node.staker.data-poster.wait-for-l1-finality=true`\n**For BOLD validators:** Usually replace `--node.staker` with `--node.bold` in all flags above.", + "key": "error-07-01-18-24-06-947-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-th" + }, + { + "question": "What does --node.batch-poster.data-poster.max-mempool-transactions do", + "answer": "It limits the amount of batch poster transactions in the mempool to the flags amount", + "key": "what-does-node-batch-poster-data-poster-max-mempool-transactions-do" + }, + { + "question": "WARN [07-01|16:52:07.009] Served eth_sendRawTransaction conn=13.125.242.225:51648 reqid=1688 duration=1.01158792s err=\"nonce too high: address 0xE8b9a6b2A9404E8AF1F7676916C19C7397c94498, tx: 261 state: 107\"", + "answer": "This is a **client-side error**, not a node issue. The user is submitting a transaction with higher, but the account's current nonce on-chain is not matching that one.", + "key": "warn-07-01-16-52-07-009-served-eth-sendrawtransaction-conn-13-125-242-225-51648-reqid-1688-duration-" + }, + { + "question": "When deploying a chain with chain-sdk, how do I configure it as a Rollup vs AnyTrust chain?", + "answer": "Use the `DataAvailabilityCommittee` parameter in `prepareChainConfig()`:\n• **`DataAvailabilityCommittee: true`** → AnyTrust chain\n• **`DataAvailabilityCommittee: false`** → Rollup chain\n**Implementation**\nWhen calling `createRollupPrepareDeploymentParamsConfig`, configure the `DataAvailabilityCommittee`", + "key": "when-deploying-a-chain-with-chain-sdk-how-do-i-configure-it-as-a-rollup-vs-anytrust-chain" + }, + { + "question": "Could you please suggest a test node env that I want to test against lower user tx cost and higher tps?", + "answer": "**Infrastructure & Node Configuration:**\n1. **Deploy nodes in a nearby location (Optional)**- This reduces latency for their testers. (Note: if you don't need low latency, this is not needed)\n2. **Deploy 2-3 full nodes alongside the sequencer** - Full nodes can serve read requests to reduce sequencer load. We can also implement a pre-checker mechanism on these nodes to further reduce sequencer pressure. Provide them with all node endpoints so they distribute transactions across multiple nodes rather than sending everything to one.\n3. **Deploy a High Availability sequencer setup** - If they're doing stress testing, this prevents downtime from sequencer failures.\n4. **Use only 1 validator** - Sufficient for this testing scenario.\n5. **Increase speed limit** (and adjust related speed limit parameters accordingly) - Allows for higher throughput at lower gas prices.\n6. **Set `minL2BaseFee` to 0.0001.**\n7. **Increase batch size - **This can slightly reduces the per-transaction cost by amortizing L1 posting costs across more transactions.\n8. **Deploy on a private chain with low gas - **If deploying the L3 on a private L2, we can set low gas prices to this private chain. However, there's a tradeoff: testing costs will be lower than production costs once migrated to mainnet, which could lead to inaccurate cost projections.\n9. Can deploy chain as Anytrust.\n**Smart Contract Deployment Recommendations:**Beyond node configuration, we should recommend they deploy their core business contracts as:\n1. **Stylus contracts** - This can dramatically reduce gas costs & increase TPS and works well for business logic contracts.\n2. **Precompile contracts** - Precompiles allow custom gas cost settings, enabling further cost reduction. The tradeoff is that contract upgrades require ArbOS upgrades, so this should only be used for stateless, mission-critical contracts.", + "key": "could-you-please-suggest-a-test-node-env-that-i-want-to-test-against-lower-user-tx-cost-and-higher-t" + }, + { + "question": "And if i look at the contents of the resolve mode validator, there is the following content:\n\nGas used every time a new assertion is created and to resolve unconfirmed assertionsAnd \ndoes the above mean that only the further gas fee is used for each new assertion, and the existing staked money is used as is? Or is the additional staking money added again to the new assertion?", + "answer": "Yes, your staker will only need to staker once, no more staked token needed.", + "key": "and-if-i-look-at-the-contents-of-the-resolve-mode-validator-there-is-the-following-content-gas-used-" + }, + { + "question": "as long as the parent chain's contract is functioning normally, can the data in the child chain's (all data) be restored at any time even if it is deleted ?", + "answer": "yes, all data can be restored from parent chain if you are on rollup mode. But if your parent chain is ethereum and you enable blob posting, you need to connect to a client which supports historical blobs storage. That is because ethereum will prune the blob data after 2 weeks automatically. \n\nNote: only data that is posted on the parent chain can be easily restored, if data was never posted then restoration will be difficult or potentially not possible", + "key": "as-long-as-the-parent-chain-s-contract-is-functioning-normally-can-the-data-in-the-child-chain-s-all" + }, + { + "question": "I was wondering if it would be okay to run two networks on the same PC with different input config files for testing purposes from the same Nitro code folder?", + "answer": "Yes, you can do that, but please to make sure the db stored in different path. (by set different `persistent.global-config`), also, the netwrok port needs to be set on different ports.", + "key": "i-was-wondering-if-it-would-be-okay-to-run-two-networks-on-the-same-pc-with-different-input-config-f" + }, + { + "question": "What is a split validator?", + "answer": "Split validators separate the validation work to a stateless worker, which provides several key benefits:\n• **Resource management**: Easier to scale and manage compute resources independently\n• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• **Flexibility**: Allows running multiple validation workers for horizontal scalability.\nSo if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process.", + "key": "what-is-a-split-validator" + }, + { + "question": "What are contract calls and where are the nitro contracts", + "answer": "You can find almost all our nitro contract in nitro-contracts [repo](https://github.com/OffchainLabs/nitro-contracts),", + "key": "what-are-contract-calls-and-where-are-the-nitro-contracts" + }, + { + "question": "WARN [08-21|16:07:41.536] Served eth_getBalance                    conn=43.203.177.23:34134 reqid=0 duration=\"115.587µs\" err=\"header not found\"", + "answer": "Might be some reasons;\n1. Your node haven't synced to the latest state. If it is this reason, you can wait some time.\n2. (Very low likelihood) You are running a block explorer which uses your another chain's db however connect to your current chain, this one you need to re-run the block explorer and delete its db.\n3. Might be your node db crashed. If it is this reason, might need to resync.", + "key": "warn-08-21-16-07-41-536-served-eth-getbalance-conn-43-203-177-23-34134-reqid-0-duration-115-587-s-er" + }, + { + "question": "And what is the meaning of delayBlocks and futureBlocks in the site below and the meaning below, and what is the meaning and difference of delaySeconds and futureSeconds?", + "answer": "The sequencer's max time variation is configurable via the `setMaxTimeVariation` method of the Sequencer Inbox Contract, which will also be set to prevent chain reorganization when there are no batches for an extended period.\n`MaxTimeVariation` struct:\n\n`struct MaxTimeVariation { \nuint256 delayBlocks; \nuint256 futureBlocks; \nuint256 delaySeconds; \nuint256 futureSeconds;\n}`\nThe `MaxTimeVariation` struct defines time boundaries that determine whether your chain remains safe or triggers a reorganization (reorg) when posting batches. It uses both block-based and time-based limits to create acceptable windows for message processing between L1 and L2.", + "key": "and-what-is-the-meaning-of-delayblocks-and-futureblocks-in-the-site-below-and-the-meaning-below-and-" + }, + { + "question": "What is the difference between the chain SDK and the Orbit setup script (Orbit now Arbitrum chain)", + "answer": "The orbit SDK is for preparing and deploying an orbit chain, while the orbit setup script should never be used for live production.", + "key": "what-is-the-difference-between-the-chain-sdk-and-the-orbit-setup-script-orbit-now-arbitrum-chain" + }, + { + "question": "And what is the dispute window size config, and what is the compression ratio config of the batch?", + "answer": "The dispute window is configured in the **rollup contract settings**, not in the node configuration. These are set when deploying the rollup:`confirmPeriodBlocks: 45818, `*`// ~6.4 days (for Arbitrum One)`*` `\nYou can also call rollup contract `setConfirmPeriodBlocks` to reset this.\nCompressionLevel is default to be 11, but you can reset it by `--node.batch-poster.compression-level`", + "key": "and-what-is-the-dispute-window-size-config-and-what-is-the-compression-ratio-config-of-the-batch" + }, + { + "question": "And currently, forwarding from the full node to the sequencer is happening on all of one, nove, and sepolia, right?", + "answer": "This is the general architecture of all arbitrum chains where nodes pick up data and send them to the sequencer", + "key": "and-currently-forwarding-from-the-full-node-to-the-sequencer-is-happening-on-all-of-one-nove-and-sep" + }, + { + "question": "ERROR[08-21|13:48:40.883] shut down due to fatal error             err=\"error starting node: error initializing block validator: cannot validate WasmModuleRoot 0xdb698a2576298f25448bc092e52cf13b1e24141c997135d70f217d674bbeb69a\"", + "answer": "Have you downloaded consensus 40 replay bin?\n\n`.`\n1. Check your Dockerfile in `Nitro` for a download to the current consensus version (V50 at time of writing `RUN ./download-machine.sh consensus-v50 0x2c54f6e9e378ba320ed9c713a1d9f067a572b1437e4f1c40b1a915d3066c04f2`)\n2. If yes, then can ask them cd to ./scripts dir and run ./download-machine.sh with the related arbos info.\n3. If not, they need to re-build the replay bin theirselves.", + "key": "error-08-21-13-48-40-883-shut-down-due-to-fatal-error-err-error-starting-node-error-initializing-blo" + }, + { + "question": "What's the difference between WARN and ERROR log levels? Do WARN logs affect node operation?", + "answer": "**Usually WARN logs do NOT affect node operation.** The node continues to function normally. Only ERROR logs indicate issues that may disrupt node functionality or cause shutdown.", + "key": "what-s-the-difference-between-warn-and-error-log-levels-do-warn-logs-affect-node-operation" + }, + { + "question": "After creating the nitro-node image, how do I run the Docker image with the previously created nodeconfig.json as input? (Is there a command guide?)And how do I make the nitro instance accessible from outside? Do I need to set up ports and such to connect from outside? Port connections, etc…", + "answer": "Let's assume you want to use `/data/arbitrum` dir as the main file to keep your chain data, then:\n1. copy nodeConfig.json to `/data/arbitrum` .\n2. run `docker run --rm -it -v /data/arbitrum:/home/user/.arbitrum --conf.file /home/user/.arbitrum/nodeConfig.json` \n\n\nYes, you need to mount too, you can check the port settings in nodeConfig.json and export those ports too.", + "key": "after-creating-the-nitro-node-image-how-do-i-run-the-docker-image-with-the-previously-created-nodeco" + }, + { + "question": "Can I change the gas token of my arbitrum chain after it has been deployed", + "answer": "No the custom gas token must be set during deployment and cannot be changed afterwards", + "key": "can-i-change-the-gas-token-of-my-arbitrum-chain-after-it-has-been-deployed" + }, + { + "question": "WARN [09-11|15:15:36.645] Served eth_sendRawTransaction            conn=27.122.242.98:11105 reqid=3174655275929179 duration=4.691427ms err=\"wrong msgIdx got 257 expected 256\"", + "answer": "This logs indicates your sequencer queued the tx 257, however, your node db just keeps 256. Which means your node db fall behind the sequencer.", + "key": "warn-09-11-15-15-36-645-served-eth-sendrawtransaction-conn-27-122-242-98-11105-reqid-317465527592917" + }, + { + "question": "What is the auth-rpc?", + "answer": "AUTH-RPC is a **separate, JWT-authenticated RPC interface** in Arbitrum Nitro designed for **secure communication** between trusted components or entities. \nBy default, it will register `validation_` api, but you can also register some regular api like `eth_` , `net_`", + "key": "what-is-the-auth-rpc" + }, + { + "question": "If I update my nitro node version will that mean my ArbOS will be upgraded too", + "answer": "If you upgrade your nitro version, it doesn't mean your ArbOS version will be upgraded too, so your ArbOS version will keep the same, those are 2 separate version system, ArbOS version can only be upgraded by calling  `arbOwner.scheduleArbOSUpgrade`", + "key": "if-i-update-my-nitro-node-version-will-that-mean-my-arbos-will-be-upgraded-too" + }, + { + "question": "Does L2 submit batches when there are no user transactions?", + "answer": "**Generally, empty batches are NOT sent.** However, there's a specific exception:\n**Normal Operation:**\n• BatchPoster only sends batches when there are \"useful messages\"\n• **Useful messages** include:\n\n ◦ User transactions\n ◦ Delayed messages from users\n**Batch Posting Report Message:**\n• Every batch will generate a `batch_posting_report` message\n• This message is NOT initially marked as \"useful\"\n• Remains non-useful for duration of `--node.batch-poster.max-empty-batch-delay`\n**Exception - Empty Batch Submission:**\nAfter `max-empty-batch-delay` expires:\n• The `batch_posting_report` message becomes marked as \"useful\"\n• BatchPoster will send a batch containing only this message\n• This is technically an \"empty batch\" (no user transactions, only the report)", + "key": "does-l2-submit-batches-when-there-are-no-user-transactions" + }, + { + "question": "ERROR[06-13|11:01:25.473] Could not submit latest assertion err=\"could not auto-deposit funds for assertion creation: test execution of tx errored before sending payable tx: insufficient funds for transfer\" validatorName=default-validator", + "answer": "Your staker address doesn't have enough funds to deposit, please transfer some funds to it.", + "key": "error-06-13-11-01-25-473-could-not-submit-latest-assertion-err-could-not-auto-deposit-funds-for-asse" + }, + { + "question": "What are the assertion submission frequency and finalization cycle, and what are the configurations?", + "answer": "Default is 15 mins, to reset it: `--node.bold.assertion-posting-interval` .Finalized cycle, default in test env is 150 blocks, on mainnet is 7 days, you need call rollup contract `setConfirmPeriodBlocks` to reset this.", + "key": "what-are-the-assertion-submission-frequency-and-finalization-cycle-and-what-are-the-configurations" + }, + { + "question": "When I run the arbitrum tutorial, I got the following error: `ArbSdkError: Unrecognized network xxx.`", + "answer": "This is because you are running the tutorial against a custom chain.\nPlease follow this tutorial ([https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network](https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network)) to add your custom network first.", + "key": "when-i-run-the-arbitrum-tutorial-i-got-the-following-error-arbsdkerror-unrecognized-network-xxx" + }, + { + "question": "If I delete the db of the child chain and restart it, can I restore all the TXs of the child chain?", + "answer": "You can restore all TXes that your batchposter already posted, like for now, your sequencer are at msg 257, and your batchposter already posted message 250 to parent chain, then your node can restore to 250.", + "key": "if-i-delete-the-db-of-the-child-chain-and-restart-it-can-i-restore-all-the-txs-of-the-child-chain" + }, + { + "question": "And If i look at the page below, there is a resolve mode among the validators. Does the validator in resolve mode do both cases: staking for correct assertions and challenging for incorrect assertions? How should the resolve cycle be configured in nodeconfig.json?", + "answer": "Yes, **Resolve Mode does BOTH** - it stakes for correct assertions AND challenges incorrect assertions. \nFor how to configure it:\n--node.staker.strategy=resolveNodes (legacy)\nor\n--node.bold.strategy=resolvenodes (bold)", + "key": "and-if-i-look-at-the-page-below-there-is-a-resolve-mode-among-the-validators-does-the-validator-in-r" + }, + { + "question": "Does the \"error getting latest agreed: no assertion creation logs found\" mean the latest new assertion?", + "answer": "It means your nodes try to find a specific assertion, however, it doesn't find it, this means you need wait some time for your node to sync up.", + "key": "does-the-error-getting-latest-agreed-no-assertion-creation-logs-found-mean-the-latest-new-assertion" + }, + { + "question": "If i want to run the container in the background instead of running it once and then deleting it, i can do something like below, right?Is there anything missing here?", + "answer": "You can reuse those commands we provide in our docs, which is:\n\n`docker run --rm -it -v /Your_mount_point:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/nitro-node:v3.6.8-d6c96a5 --conf.file=xxxx`", + "key": "if-i-want-to-run-the-container-in-the-background-instead-of-running-it-once-and-then-deleting-it-i-c" + }, + { + "question": "How to run a DAS node", + "answer": "You can walk through [this](https://docs.arbitrum.io/run-arbitrum-node/data-availability-committees/get-started) guide. It provides you the content how to run a das node.", + "key": "how-to-run-a-das-node" + }, + { + "question": "error getting latest agreed: no assertion creation logs found", + "answer": "For this logs, what I guess is because you just start your node, and it needs some time for makenodes to produce assertion and also other validator needs some time to wait the assertion tx is finalized. So it is expected.", + "key": "error-getting-latest-agreed-no-assertion-creation-logs-found" + }, + { + "question": "In a high-availability sequencer setup, what data does the sequencer pass to Redis, and how does Redis determine the active sequencer and handle load balancing?", + "answer": "For sequencer coordinator system (redis can also be used on other system), Redis is used for **sequencer coordination**, not load balancing. It stores leadership information, message synchronization data, and configuration to ensure only one active sequencer at a time.\n\n**Data in Redis**\n**1. Leadership Keys**\n• `coordinator.chosen` - URL of currently active sequencer (e.g., \"[http://sequencer1:8547](http://sequencer1:8547/)\")\n• `coordinator.liveliness.` - Each sequencer's heartbeat signal\n**2. Message Synchronization**\n• `coordinator.msgCount` - Current message count (signed)\n• `coordinator.finalizedMsgCount` - Finalized message count (signed)\n• `coordinator.msg.` - Individual messages (JSON encoded)\n• Other sync-related keys\n**3. Configuration**\n• `coordinator.priorities` - Comma-separated priority list of sequencer URLs\n\n**The election process:**\n1. The system reads coordinator.priorities to get the ordered list of sequencer URLs\n2. It checks each URL in priority order to see if that sequencer has set coordinator.liveliness. = \"OK\"\n3. The first sequencer in the priority list that has its liveliness key set becomes the recommended leader\n4. That sequencer attempts to acquire the coordinator.chosen lock **Conditions for a sequencer to become active:**\n• Must be synced with the network\n• Must have processed all messages up to the current count\n• Must successfully acquire the coordinator.chosen lock before it expires\n• The lock uses Redis transactions (optimistic locking) to prevent race conditions\n\nRedis and sequencer coordinator doesn't do traditional load balancing here - it's more of a **failover mechanism, Only ONE sequencer is active at a time (holding the coordinator.chosen lock)**", + "key": "in-a-high-availability-sequencer-setup-what-data-does-the-sequencer-pass-to-redis-and-how-does-redis" + }, + { + "question": "what is the difference between validatior and validation_node", + "answer": "Validator can be run on one node, but it can also be split to 2 nodes which are validator (staker) and validation node, [here](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node#running-split-validators-for-arbitrum-chains) is the related docs.Here is the benefits:\n• Resource management: Easier to scale and manage compute resources independently\n• Fault isolation: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• Flexibility: Allows running multiple validation workers for horizontal security", + "key": "what-is-the-difference-between-validatior-and-validation-node" + }, + { + "question": "And if i look at the Docker-compose.yaml file of the nitro testnode code,(https://github.com/OffchainLabs/nitro-testnode/blob/release/docker-compose.yamlThere are separate validators and validatotion_nodes. What is the difference between these two?", + "answer": "Split validators separate the validation work to a stateless worker, which provides several key benefits:\n• **Resource management**: Easier to scale and manage compute resources independently\n• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• **Flexibility**: Allows running multiple validation workers (validation node) for horizontal security.\nSo if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process.", + "key": "and-if-i-look-at-the-docker-compose-yaml-file-of-the-nitro-testnode-code-https-github-com-offchainla" + }, + { + "question": "How do you call Arb precompiles and what is the address of such", + "answer": "Precompile is live on your network, and the address is on top of the file [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbSys.sol#L10), so for ArbSys, it is 0x0000000000000000000000000000000000000064.Then you can use your rpc or other tool like foundry cast to call this address' method `arbOSVersion`", + "key": "how-do-you-call-arb-precompiles-and-what-is-the-address-of-such" + }, + { + "question": "Is it possible to set up custom gas tokens for any L2 or L3 configuration (rollup and anytrust)", + "answer": "a custom gas token is possible in any of those configs though in rollup mode it's more complex. There's documentation on what's required here [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup)", + "key": "is-it-possible-to-set-up-custom-gas-tokens-for-any-l2-or-l3-configuration-rollup-and-anytrust" + }, + { + "question": "what role does the relay service play", + "answer": "It will connect to sequencer feed, and relay those feed messages to other full nodes, here is [related docs](https://docs.arbitrum.io/run-arbitrum-node/run-feed-relay). Basically it is used to reduce the network pressure of sequencer.", + "key": "what-role-does-the-relay-service-play" + }, + { + "question": "can I omit running the download-machine.sh script (after make, make build, make build-replay-env)?", + "answer": "(We recommend you to run the node with docker instead then you don't need to run so many steps.)You can just run `make build` then `download-machine.sh` , other 2 no need to run anymore.", + "key": "can-i-omit-running-the-download-machine-sh-script-after-make-make-build-make-build-replay-env" + }, + { + "question": "-node.batch-poster.data-poster.dangerous.clear-dbstorage Is there a value for the above config? If I do the above config, will the entire network be initialized? (Will it be reset and create a new block from scratch?)", + "answer": "No, this will only remove batchposter's `QueuedTx` db, will not clear other db. So the network won't be initialized. But it may caused some queued tx lost.", + "key": "node-batch-poster-data-poster-dangerous-clear-dbstorage-is-there-a-value-for-the-above-config-if-i-d" + }, + { + "question": "Large gap between last seen and current block number, skipping check for reverts last", + "answer": "The Batch Poster runs a background monitoring process (pollForReverts) that continuously checks L1 blocks to see if any transactions it submitted have been reverted. However, it find last seen blocks has a large gap to the current block, might be a lot of reasons, network issues might be one of them, you can try change to other parent rpc to see if it can be resolved or not. Also, most warn logs won't affect your node's syncing and behavior as it is not error logs, so you can ignore them.", + "key": "large-gap-between-last-seen-and-current-block-number-skipping-check-for-reverts-last" + }, + { + "question": "Where is Timeboost supporteed", + "answer": "They are currently on arb one, nova, and sepolia", + "key": "where-is-timeboost-supporteed" + }, + { + "question": "How do I migrate an existing local Nitro node database to a new Docker-based deployment? Which folders and files need to be transferred?", + "answer": "Copy the **entire Nitro data folder** to a directory that you will mount to your Docker container.", + "key": "how-do-i-migrate-an-existing-local-nitro-node-database-to-a-new-docker-based-deployment-which-folder" + }, + { + "question": "if I create an L2 or L3 using the Nitro stack and a validator wants to recover the amount staked on the parent chain, how can I do so?", + "answer": "To withdraw your staked token from rollup contract:   \n- Wait for your old validator's latest bond assertion to be confirmed   \n- Call `reduceDeposit()` on the `Rollup` Contract   \n- Call `withdrawStakerFunds()` to get your bond back", + "key": "if-i-create-an-l2-or-l3-using-the-nitro-stack-and-a-validator-wants-to-recover-the-amount-staked-on-" + }, + { + "question": "What configurations should I set when deploying an L3 instead of an L2", + "answer": "For L3s as of right now they must be ran in anytrust mode (I believe I saw this im not sure if its still true), other than that all of the configs can be set to your liking", + "key": "what-configurations-should-i-set-when-deploying-an-l3-instead-of-an-l2" + }, + { + "question": "Do I need to move files around to upgrade a node?", + "answer": "Every time you upgrade the node, there is no need to move any files but just change the image tag unless there is some special changes (we will put note at the release docs if happens).", + "key": "do-i-need-to-move-files-around-to-upgrade-a-node" + } +] From 46733e7b023f9202397670bde264a5a008bba50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 18:34:38 -0800 Subject: [PATCH 04/13] chore: update generated FAQ files Updated by running yarn notion:update with the latest Notion content --- ...troubleshooting-arbitrum-chain-partial.mdx | 62 +++++++--------- .../_troubleshooting-bridging-partial.mdx | 8 --- .../_troubleshooting-building-partial.mdx | 14 +--- .../_troubleshooting-nodes-partial.mdx | 14 +--- .../_troubleshooting-stylus-partial.mdx | 8 --- .../_troubleshooting-users-partial.mdx | 14 +--- static/building-faqs.json | 4 +- static/building-orbit-faqs.json | 72 +++++++++---------- static/get-started-faqs.json | 7 +- static/node-running-faqs.json | 6 +- 10 files changed, 76 insertions(+), 133 deletions(-) diff --git a/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx b/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx index b67ef7407b..7b61754aa8 100644 --- a/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx +++ b/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx @@ -1,67 +1,59 @@ ---- -partial_type: troubleshooting -title: 'Arbitrum Chain Troubleshooting Guide' -description: 'Common issues and solutions for Arbitrum chain operations' -author: anegg0 -last_reviewed: 2025-11-06 ---- +### Can I use the Chain SDK to deploy a mainnet chain? -### Can I use Orbit to deploy a mainnet chain? +Yes! The Arbitrum Chain SDK's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it in our [preview expectations notice](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first). -Yes! Arbitrum Orbit's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it [in our public preview annoucement](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first). +### Do I need permission/license to launch an Arbitrum chain? -### Do I need permission/license to launch an Orbit chain? - -You can launch any Arbitrum Orbit chain permissionlessly. +You can launch any Arbitrum chain permissionlessly. Nitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova. -However, Arbitrum Orbit chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf). +However, Arbitrum chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf). ### Does Arbitrum officially deploy and/or maintain L3s for external teams? -No. Teams are required to deploy and maintain their Arbitrum Orbit chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum Orbit chain on your behalf. +No. Teams are required to deploy and maintain their Arbitrum chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum chain on your behalf. -### Can I modify Orbit's underlying technology to customize my chain? +### Can I modify the underlying technology to customize my Arbitrum chain? Yes, you can make any changes you require to the underlying Nitro code base. -### What Data Availability (DA) solutions are currently available for Orbit chains? +### What Data Availability (DA) solutions are currently available for Arbitrum chains? -Arbitrum Orbit currently supports three different DA solutions: +Arbitrum chains currently support three different DA solutions: - Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum. - AnyTrust, posting data to a Data Availability Committee, selected by the chain owner. - Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/). Note that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees. -### What token is used to pay gas fees on Orbit chains? +### What token is used to pay gas fees on Arbitrum chains? -By default, Arbitrum Orbit chains pay gas in `ETH`. However, Arbitrum Orbit chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain. +By default, Arbitrum chains pay gas in `ETH`. However, Arbitrum chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain. -### Can I use Ethereum toolkits to develop on my Orbit chain? +### Can I use Ethereum toolkits to develop on my Arbitrum chain? -Arbitrum Orbit chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum Orbit chain. There are, however, specific differences that developers need to consider when building on an Orbit chain. You can find them [in our Arbitrum vs. Ethereum overview](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview). +Arbitrum chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum chain. There are, however, specific differences that developers need to consider when building on an Arbitrum chain. You can find them in our [overview of the differences between Arbitrum and Ethereum](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview). -### Do Orbit chains have any built-in AA solution? +### Do Arbitrum chains have any built-in AA solution? Not by default, but they can be customized to have native AA. -### Is there any cross-chain bridging solution between two Orbit chains? +### Is there any cross-chain bridging solution between two Arbitrum chains? -There is currently no native Orbit-to-Orbit chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum Orbit chains. +There is currently no native Arbitrum-to-Arbitrum chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum chains. -### Is there an official block explorer for Orbit chains? +### Is there an official block explorer for Arbitrum chains? -Arbitrum Orbit 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 Arbitrum Orbit chains. +Arbitrum 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 Arbitrum chains. -### Is there any indexing solution that supports Orbit chains? +### Is there any indexing solution that supports Arbitrum chains? -Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum Orbit chains. +Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum chains. -### Can I increase the maximum contract size for my Orbit chain? +### Can I increase the maximum contract size for my Arbitrum chain? -Yes, Arbitrum Orbit chains support an increased smart contract size limit of up to 96kB. You can use our [Orbit SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade. +Yes, Arbitrum chains support an increased smart contract size limit of up to 96kB. You can use our [Chain SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade. ### How can I modify Nitro to force posting an invalid assertion and test the fraud proof mechanism? @@ -74,9 +66,9 @@ go test ./system_tests/ -tags=challengetest -run=TestChallenge ### What fee collectors can be configured on my chain? -Four fee types are configurable on an Orbit chain: +Four fee types are configurable on an Arbitrum chain: -- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into the infraFeeAccount, which can be set by calling `ArbOwner.setInfraFeeAccount().` +- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into the `infraFeeAccount`, which can be set by calling `ArbOwner.setInfraFeeAccount().` - **L2 surplus fee**: L2 execution fees above the minimum base price (in the case of congestion). This fee goes to the `networkFeeAccount`, which can be set by calling `ArbOwner.setNetworkFeeAccount().` - **L1 base fee**: Relative fees for posting a transaction on the parent chain. This fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating a different fee collector for that batch poster can be specified by calling `ArbAggregator.setFeeCollector()`. - **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()`. @@ -86,7 +78,7 @@ To learn more about precompiles, refer to the [Precompiles reference page](https ### What is the lowest you can set the base fee to? -You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Orbit base fee is `0`, users are then only paying for the cost of DA. +You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Arbitrum chain base fee is `0`, users are then only paying for the cost of DA. ### How does fee collection work in Nitro? @@ -134,7 +126,7 @@ Test this thoroughly on a testnet first. ### What is the max theoretical TPS for an Arbitrum Chain? -Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default orbit chain parameters. +Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default Arbitrum chain parameters. The actual maximum throughput depends on the configurable execution parameters: @@ -152,7 +144,7 @@ The actual maximum throughput depends on the configurable execution parameters: ### Why is the WETH Gateway not necessary for custom gas token chains? -The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum (Orbit) chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway). +The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway). If you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case. diff --git a/docs/partials/_troubleshooting-bridging-partial.mdx b/docs/partials/_troubleshooting-bridging-partial.mdx index 43cc06fbfc..7172a50dd8 100644 --- a/docs/partials/_troubleshooting-bridging-partial.mdx +++ b/docs/partials/_troubleshooting-bridging-partial.mdx @@ -1,11 +1,3 @@ ---- -partial_type: troubleshooting -title: 'Bridging Troubleshooting Guide' -description: 'Common issues and solutions for bridging assets to/from Arbitrum' -author: anegg0 -last_reviewed: 2025-11-06 ---- - ### How do I move assets between One and Nova? Both Arbitrum One and Arbitrum Nova run as layers on top of Ethereum. Thus, you can always move assets between the two chains in two steps by going "through" Ethereum. In other words: withdraw your assets from Arbitrum One to Ethereum and then deposit them onto Nova, or conversely, withdraw your assets from Nova to Ethereum and then deposit them to Arbitrum One. You can complete these steps using the [Arbitrum Bridge](https://bridge.arbitrum.io/). diff --git a/docs/partials/_troubleshooting-building-partial.mdx b/docs/partials/_troubleshooting-building-partial.mdx index f1496f7d10..c6dc5e4687 100644 --- a/docs/partials/_troubleshooting-building-partial.mdx +++ b/docs/partials/_troubleshooting-building-partial.mdx @@ -1,11 +1,3 @@ ---- -partial_type: troubleshooting -title: 'Building Troubleshooting Guide' -description: 'Common issues and solutions for building on Arbitrum' -author: anegg0 -last_reviewed: 2025-11-06 ---- - ### How does gas work on Arbitrum? Fees on Arbitrum chains are collected on L2 in the chains' native currency (ETH on both Arbitrum One and Nova). @@ -62,9 +54,9 @@ There are two differences between `createRetryableTicket` and `unsafeCreateRe ### Why do I get "custom tx type" errors when I use hardhat? -In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. See [here](https://developer.arbitrum.io/arbos/geth#transaction-types) for the full list and the rationale. +In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. Feel free to consult the [full list of transaction types](https://developer.arbitrum.io/arbos/geth#transaction-types) and the rationale. -Note that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [here](https://github.com/NomicFoundation/hardhat/issues/2995)). +Note that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [in this HardHat GitHub issue](https://github.com/NomicFoundation/hardhat/issues/2995)). ### Why does it look like two identical transactions consume a different amount of gas? @@ -156,7 +148,7 @@ The WASM module root is a 32-byte hash, which is a Merkelization of the Go repla The 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. -You can find more information in [How to Customize your Orbit chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs). +You can find more information in [How to Customize your Arbitrum chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs). ### Why do I get a "gas required exceeds allowance" when trying to estimate the gas costs of a request? diff --git a/docs/partials/_troubleshooting-nodes-partial.mdx b/docs/partials/_troubleshooting-nodes-partial.mdx index 767479be47..f9b857ea34 100644 --- a/docs/partials/_troubleshooting-nodes-partial.mdx +++ b/docs/partials/_troubleshooting-nodes-partial.mdx @@ -1,14 +1,6 @@ ---- -partial_type: troubleshooting -title: 'Node Running Troubleshooting Guide' -description: 'Common issues and solutions for running Arbitrum nodes' -author: anegg0 -last_reviewed: 2025-11-06 ---- - ### How do I run a node? -See instructions in the tutorial explaining how to [run a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! +See instructions [in our guide about running a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! ### How to verify the integrity of the Nitro database I currently have? @@ -36,7 +28,7 @@ Running an Arbitrum relay locally as a [Feed Relay](https://docs.arbitrum.io/nod ### How do I run a node locally for development? -See instructions on [how to set up a local dev node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node). +See instructions in our  [our guide about running a local devnet node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node). We recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally). @@ -44,7 +36,7 @@ We recommend running Nitro nodes via Docker; to compile directly / run without D The pre-Nitro stack is also called the "classic" stack. Full Nitro nodes start with a database that contains the information from the "classic" era. -However, a Nitro node can't query archive information contained in "classic" blocks right away. To do that, you also need to run a classic node. You can find detailed instructions [in this detailed How To](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`. +However, a Nitro node can't query archive information contained in "classic" blocks right away. To do that, you also need to run a classic node ([instructions in our guide about running a classic node](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`. Please note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have "classic" data. diff --git a/docs/partials/_troubleshooting-stylus-partial.mdx b/docs/partials/_troubleshooting-stylus-partial.mdx index 28cdc3f141..58b313374a 100644 --- a/docs/partials/_troubleshooting-stylus-partial.mdx +++ b/docs/partials/_troubleshooting-stylus-partial.mdx @@ -1,11 +1,3 @@ ---- -partial_type: troubleshooting -title: 'Stylus Troubleshooting Guide' -description: 'Common issues and solutions for Stylus smart contract development' -author: anegg0 -last_reviewed: 2025-11-06 ---- - ### How does Stylus manage security issues in smart contracts when interacting with so many different languages? All languages are compiled to WASM for them to be able to work with Stylus. So it just needs to verify that the produced WASM programs behave as they should inside the new virtual machine. diff --git a/docs/partials/_troubleshooting-users-partial.mdx b/docs/partials/_troubleshooting-users-partial.mdx index 6b23b50681..b571e8f493 100644 --- a/docs/partials/_troubleshooting-users-partial.mdx +++ b/docs/partials/_troubleshooting-users-partial.mdx @@ -1,11 +1,3 @@ ---- -partial_type: troubleshooting -title: 'User Troubleshooting Guide' -description: 'Common issues and solutions for Arbitrum users' -author: anegg0 -last_reviewed: 2025-11-06 ---- - ### Why do I need ETH to use the Arbitrum network? `ETH` is the currency used to pay gas fees on Arbitrum, and it powers all transactions on Arbitrum. You can bridge `ETH` (and other tokens) from Ethereum to Arbitrum through [Arbitrum's bridge](https://bridge.arbitrum.io/). @@ -105,13 +97,9 @@ Although we currently don't maintain any stats dashboard for Arbitrum, you can f There is no notion of a mempool on Arbitrum; transactions are processed on a first-come, first-served basis by the Sequencer. Thus, the gas price bid parameter does not affect the order in which transactions get processed. -### Where can I find a list of the current validators of the Arbitrum chains? - -Validation on both Arbitrum One and Arbitrum Nova is currently allow-listed to a committee of public entities. You can see the list of validators **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators)**. Governance currently has the power to change this status. - ### Where can I find the current Data Availability Committee members? -The Arbitrum Nova chain has a 7-party DAC, whose members can be seen **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members)**. Governance has the ability to remove or add members to the committee. +The Arbitrum Nova chain has a 7-party DAC, whose members can be seen in the [Arbitrum Foundation's state of progressive decentralization status document](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members). Governance has the ability to remove or add members to the committee. ### Can I withdraw my funds from Arbitrum back to Ethereum without going through the Sequencer? What about funds that are in a contract? diff --git a/static/building-faqs.json b/static/building-faqs.json index 9c38dd6373..ceef1f7ac5 100644 --- a/static/building-faqs.json +++ b/static/building-faqs.json @@ -26,7 +26,7 @@ }, { "question": "Why do I get \"custom tx type\" errors when I use hardhat?", - "answer": "In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. See [here](https://developer.arbitrum.io/arbos/geth#transaction-types) for the full list and the rationale.\n\nNote that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [here](https://github.com/NomicFoundation/hardhat/issues/2995)).\n\n\n\n", + "answer": "In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. Feel free to consult the [full list of transaction types](https://developer.arbitrum.io/arbos/geth#transaction-types) and the rationale.\n\nNote that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [in this HardHat GitHub issue](https://github.com/NomicFoundation/hardhat/issues/2995)).\n\n\n\n", "key": "why-do-i-get-custom-tx-type-errors-when-i-use-hardhat" }, { @@ -96,7 +96,7 @@ }, { "question": "What is the WASM module root?", - "answer": "The WASM module root is a 32-byte hash, which is a Merkelization of the Go replay binary and its dependencies.\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\nYou can find more information in [How to Customize your Orbit chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs).\n\n\n\n", + "answer": "The WASM module root is a 32-byte hash, which is a Merkelization of the Go replay binary and its dependencies.\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\nYou can find more information in [How to Customize your Arbitrum chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs).\n\n\n\n", "key": "what-is-the-wasm-module-root" }, { diff --git a/static/building-orbit-faqs.json b/static/building-orbit-faqs.json index e096404e32..2aa9374480 100644 --- a/static/building-orbit-faqs.json +++ b/static/building-orbit-faqs.json @@ -1,63 +1,63 @@ [ { - "question": "Can I use Orbit to deploy a mainnet chain?", - "answer": "Yes! Arbitrum Orbit's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it [here](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first).\n\n\n\n", - "key": "can-i-use-orbit-to-deploy-a-mainnet-chain" + "question": "Can I use the Chain SDK to deploy a mainnet chain?", + "answer": "Yes! The Arbitrum Chain SDK's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it in our [preview expectations notice](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first).\n\n\n\n", + "key": "can-i-use-the-chain-sdk-to-deploy-a-mainnet-chain" }, { - "question": "Do I need permission/license to launch an Orbit chain?", - "answer": "You can launch any Arbitrum Orbit chain permissionlessly.\n\nNitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova.\n\nHowever, Arbitrum Orbit chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf).\n\n", - "key": "do-i-need-permissionlicense-to-launch-an-orbit-chain" + "question": "Do I need permission/license to launch an Arbitrum chain?", + "answer": "You can launch any Arbitrum chain permissionlessly.\n\nNitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova.\n\nHowever, Arbitrum chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf).\n\n", + "key": "do-i-need-permissionlicense-to-launch-an-arbitrum-chain" }, { "question": "Does Arbitrum officially deploy and/or maintain L3s for external teams?", - "answer": "No. Teams are required to deploy and maintain their Arbitrum Orbit chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum Orbit chain on your behalf.\n\n\n\n", + "answer": "No. Teams are required to deploy and maintain their Arbitrum chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum chain on your behalf.\n\n\n\n", "key": "does-arbitrum-officially-deploy-andor-maintain-l3s-for-external-teams" }, { - "question": "Can I modify Orbit's underlying technology to customize my chain?", + "question": "Can I modify the underlying technology to customize my Arbitrum chain?", "answer": "Yes, you can make any changes you require to the underlying Nitro code base.\n\n\n\n", - "key": "can-i-modify-orbits-underlying-technology-to-customize-my-chain" + "key": "can-i-modify-the-underlying-technology-to-customize-my-arbitrum-chain" }, { - "question": "What Data Availability (DA) solutions are currently available for Orbit chains?", - "answer": "Arbitrum Orbit currently supports three different DA solutions:\n\n- Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum.\n- AnyTrust, posting data to a Data Availability Committee, selected by the chain owner.\n- Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/).\nNote that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees.\n\n", - "key": "what-data-availability-da-solutions-are-currently-available-for-orbit-chains" + "question": "What Data Availability (DA) solutions are currently available for Arbitrum chains?", + "answer": "Arbitrum chains currently support three different DA solutions:\n\n- Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum.\n- AnyTrust, posting data to a Data Availability Committee, selected by the chain owner.\n- Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/).\nNote that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees.\n\n", + "key": "what-data-availability-da-solutions-are-currently-available-for-arbitrum-chains" }, { - "question": "What token is used to pay gas fees on Orbit chains?", - "answer": "By default, Arbitrum Orbit chains pay gas in `ETH`. However, Arbitrum Orbit chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain.\n\n\n\n", - "key": "what-token-is-used-to-pay-gas-fees-on-orbit-chains" + "question": "What token is used to pay gas fees on Arbitrum chains?", + "answer": "By default, Arbitrum chains pay gas in `ETH`. However, Arbitrum chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain.\n\n\n\n", + "key": "what-token-is-used-to-pay-gas-fees-on-arbitrum-chains" }, { - "question": "Can I use Ethereum toolkits to develop on my Orbit chain?", - "answer": "Arbitrum Orbit chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum Orbit chain. There are, however, specific differences that developers need to consider when building on an Orbit chain. You can find them [here](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview).\n\n\n\n", - "key": "can-i-use-ethereum-toolkits-to-develop-on-my-orbit-chain" + "question": "Can I use Ethereum toolkits to develop on my Arbitrum chain?", + "answer": "Arbitrum chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum chain. There are, however, specific differences that developers need to consider when building on an Arbitrum chain. You can find them in our [overview of the differences between Arbitrum and Ethereum](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview).\n\n\n\n", + "key": "can-i-use-ethereum-toolkits-to-develop-on-my-arbitrum-chain" }, { - "question": "Do Orbit chains have any built-in AA solution?", + "question": "Do Arbitrum chains have any built-in AA solution?", "answer": "Not by default, but they can be customized to have native AA.\n\n", - "key": "do-orbit-chains-have-any-builtin-aa-solution" + "key": "do-arbitrum-chains-have-any-builtin-aa-solution" }, { - "question": "Is there any cross-chain bridging solution between two Orbit chains?", - "answer": "There is currently no native Orbit-to-Orbit chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum Orbit chains.\n\n\n\n", - "key": "is-there-any-crosschain-bridging-solution-between-two-orbit-chains" + "question": "Is there any cross-chain bridging solution between two Arbitrum chains?", + "answer": "There is currently no native Arbitrum-to-Arbitrum chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum chains.\n\n\n\n", + "key": "is-there-any-crosschain-bridging-solution-between-two-arbitrum-chains" }, { - "question": "Is there an official block explorer for Orbit chains?", - "answer": "Arbitrum Orbit 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 Arbitrum Orbit chains.\n\n\n\n", - "key": "is-there-an-official-block-explorer-for-orbit-chains" + "question": "Is there an official block explorer for Arbitrum chains?", + "answer": "Arbitrum 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 Arbitrum chains.\n\n\n\n", + "key": "is-there-an-official-block-explorer-for-arbitrum-chains" }, { - "question": "Is there any indexing solution that supports Orbit chains?", - "answer": "Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum Orbit chains.\n\n\n\n", - "key": "is-there-any-indexing-solution-that-supports-orbit-chains" + "question": "Is there any indexing solution that supports Arbitrum chains?", + "answer": "Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum chains.\n\n\n\n", + "key": "is-there-any-indexing-solution-that-supports-arbitrum-chains" }, { - "question": "Can I increase the maximum contract size for my Orbit chain?", - "answer": "Yes, Arbitrum Orbit chains support an increased smart contract size limit of up to 96kB. You can use our [Orbit SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade.\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 Arbitrum chain?", + "answer": "Yes, Arbitrum chains support an increased smart contract size limit of up to 96kB. You can use our [Chain SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade.\n\n\n\n", + "key": "can-i-increase-the-maximum-contract-size-for-my-arbitrum-chain" }, { "question": "How can I modify Nitro to force posting an invalid assertion and test the fraud proof mechanism?", @@ -66,12 +66,12 @@ }, { "question": "What fee collectors can be configured on my chain?", - "answer": "Four fee types are configurable on an Orbit chain:\n\n- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into 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 fee goes 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 fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating 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()`.\nFor more detailed information about fees, please refer to the [L1 Fees](https://docs.arbitrum.io/arbos/l1-pricing) and [L2 Fees](https://docs.arbitrum.io/arbos/gas) pages.\n\nTo learn more about precompiles, refer to the [Precompiles reference page](https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference).\n\n", + "answer": "Four fee types are configurable on an Arbitrum chain:\n\n- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into 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 fee goes 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 fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating 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()`.\nFor more detailed information about fees, please refer to the [L1 Fees](https://docs.arbitrum.io/arbos/l1-pricing) and [L2 Fees](https://docs.arbitrum.io/arbos/gas) pages.\n\nTo learn more about precompiles, refer to the [Precompiles reference page](https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference).\n\n", "key": "what-fee-collectors-can-be-configured-on-my-chain" }, { "question": "What is the lowest you can set the base fee to?", - "answer": "You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Orbit base fee is `0`, users are then only paying for the cost of DA.\n\n", + "answer": "You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Arbitrum chain base fee is `0`, users are then only paying for the cost of DA.\n\n", "key": "what-is-the-lowest-you-can-set-the-base-fee-to" }, { @@ -101,12 +101,12 @@ }, { "question": "What is the max theoretical TPS for an Arbitrum Chain?", - "answer": "Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default orbit chain parameters.\n\nThe actual maximum throughput depends on the configurable execution parameters:\n\n**Using standard Arbitrum chain defaults**\n\n- Block time: 250ms\n- Block gas limit: 32M L2 gas\n- Max L2 gas per second: 128M gas/sec\n- These parameters are entirely configurable, for example, by dropping the block time to 100ms or by increasing the block gas limit (which comes at the cost of faster state bloat).\n- Dropping to 100ms and doubling the block gas limit to 64m L2 gas would achieve 640m L2 gas per second.\n**The actual TPS varies depending on the gas cost per transaction:**\n\n- A simple transfer (~21,000 gas) could approximately achieve around 6,000 TPS.\n- A more complex transaction (~200,000 gas) would enable approximately 640 TPS.\n", + "answer": "Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default Arbitrum chain parameters.\n\nThe actual maximum throughput depends on the configurable execution parameters:\n\n**Using standard Arbitrum chain defaults**\n\n- Block time: 250ms\n- Block gas limit: 32M L2 gas\n- Max L2 gas per second: 128M gas/sec\n- These parameters are entirely configurable, for example, by dropping the block time to 100ms or by increasing the block gas limit (which comes at the cost of faster state bloat).\n- Dropping to 100ms and doubling the block gas limit to 64m L2 gas would achieve 640m L2 gas per second.\n**The actual TPS varies depending on the gas cost per transaction:**\n\n- A simple transfer (~21,000 gas) could approximately achieve around 6,000 TPS.\n- A more complex transaction (~200,000 gas) would enable approximately 640 TPS.\n", "key": "what-is-the-max-theoretical-tps-for-an-arbitrum-chain" }, { "question": "Why is the WETH Gateway not necessary for custom gas token chains?", - "answer": "The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum (Orbit) chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway).\n\nIf you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case.\n\n", + "answer": "The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway).\n\nIf you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case.\n\n", "key": "why-is-the-weth-gateway-not-necessary-for-custom-gas-token-chains" }, { diff --git a/static/get-started-faqs.json b/static/get-started-faqs.json index b3229e30ec..4f095c33dd 100644 --- a/static/get-started-faqs.json +++ b/static/get-started-faqs.json @@ -79,14 +79,9 @@ "answer": "There is no notion of a mempool on Arbitrum; transactions are processed on a first-come, first-served basis by the Sequencer. Thus, the gas price bid parameter does not affect the order in which transactions get processed.\n\n\n\n", "key": "will-transactions-with-a-higher-gas-price-bid-be-confirmed-first" }, - { - "question": "Where can I find a list of the current validators of the Arbitrum chains?", - "answer": "Validation on both Arbitrum One and Arbitrum Nova is currently allow-listed to a committee of public entities. You can see the list of validators **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators)**. Governance currently has the power to change this status.\n\n\n\n", - "key": "where-can-i-find-a-list-of-the-current-validators-of-the-arbitrum-chains" - }, { "question": "Where can I find the current Data Availability Committee members?", - "answer": "The Arbitrum Nova chain has a 7-party DAC, whose members can be seen **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members)**. Governance has the ability to remove or add members to the committee.\n\n\n\n", + "answer": "The Arbitrum Nova chain has a 7-party DAC, whose members can be seen in the [Arbitrum Foundation's state of progressive decentralization status document](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members). Governance has the ability to remove or add members to the committee.\n\n\n\n", "key": "where-can-i-find-the-current-data-availability-committee-members" }, { diff --git a/static/node-running-faqs.json b/static/node-running-faqs.json index 2daefd9a41..f359da16ac 100644 --- a/static/node-running-faqs.json +++ b/static/node-running-faqs.json @@ -1,7 +1,7 @@ [ { "question": "How do I run a node?", - "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! \n\n\n\n", + "answer": "See instructions [in our guide about running a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)!\n\n\n\n", "key": "how-do-i-run-a-node" }, { @@ -31,12 +31,12 @@ }, { "question": "How do I run a node locally for development?", - "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", + "answer": "See instructions in our  [our guide about running a local devnet node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", "key": "how-do-i-run-a-node-locally-for-development" }, { "question": "Is there any way to retrieve pre-Nitro archive data from a Nitro node?", - "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions here](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n", + "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions in our guide about running a classic node](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n\n\n", "key": "is-there-any-way-to-retrieve-prenitro-archive-data-from-a-nitro-node" }, { From 3bd33e6f15dec38793fa9d0e963024acac34fd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 18:35:17 -0800 Subject: [PATCH 05/13] chore: apply prettier formatting to generated files Auto-formatted by pre-commit hooks From 1cefb7f85d2d13d5a1b5b210b76b13a9a5be2fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 19:32:49 -0800 Subject: [PATCH 06/13] add generated content from Jason's QA content From bece5f01ebc684dcbf24b51e0323c90f1c858438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 19:36:45 -0800 Subject: [PATCH 07/13] Revert "chore: update generated FAQ files" This reverts commit 46733e7b023f9202397670bde264a5a008bba50c. --- ...troubleshooting-arbitrum-chain-partial.mdx | 62 +++++++++------- .../_troubleshooting-bridging-partial.mdx | 8 +++ .../_troubleshooting-building-partial.mdx | 14 +++- .../_troubleshooting-nodes-partial.mdx | 14 +++- .../_troubleshooting-stylus-partial.mdx | 8 +++ .../_troubleshooting-users-partial.mdx | 14 +++- static/building-faqs.json | 4 +- static/building-orbit-faqs.json | 72 +++++++++---------- static/get-started-faqs.json | 7 +- static/node-running-faqs.json | 6 +- 10 files changed, 133 insertions(+), 76 deletions(-) diff --git a/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx b/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx index 7b61754aa8..b67ef7407b 100644 --- a/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx +++ b/docs/partials/_troubleshooting-arbitrum-chain-partial.mdx @@ -1,59 +1,67 @@ -### Can I use the Chain SDK to deploy a mainnet chain? +--- +partial_type: troubleshooting +title: 'Arbitrum Chain Troubleshooting Guide' +description: 'Common issues and solutions for Arbitrum chain operations' +author: anegg0 +last_reviewed: 2025-11-06 +--- -Yes! The Arbitrum Chain SDK's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it in our [preview expectations notice](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first). +### Can I use Orbit to deploy a mainnet chain? -### Do I need permission/license to launch an Arbitrum chain? +Yes! Arbitrum Orbit's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it [in our public preview annoucement](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first). -You can launch any Arbitrum chain permissionlessly. +### Do I need permission/license to launch an Orbit chain? + +You can launch any Arbitrum Orbit chain permissionlessly. Nitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova. -However, Arbitrum chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf). +However, Arbitrum Orbit chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf). ### Does Arbitrum officially deploy and/or maintain L3s for external teams? -No. Teams are required to deploy and maintain their Arbitrum chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum chain on your behalf. +No. Teams are required to deploy and maintain their Arbitrum Orbit chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum Orbit chain on your behalf. -### Can I modify the underlying technology to customize my Arbitrum chain? +### Can I modify Orbit's underlying technology to customize my chain? Yes, you can make any changes you require to the underlying Nitro code base. -### What Data Availability (DA) solutions are currently available for Arbitrum chains? +### What Data Availability (DA) solutions are currently available for Orbit chains? -Arbitrum chains currently support three different DA solutions: +Arbitrum Orbit currently supports three different DA solutions: - Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum. - AnyTrust, posting data to a Data Availability Committee, selected by the chain owner. - Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/). Note that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees. -### What token is used to pay gas fees on Arbitrum chains? +### What token is used to pay gas fees on Orbit chains? -By default, Arbitrum chains pay gas in `ETH`. However, Arbitrum chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain. +By default, Arbitrum Orbit chains pay gas in `ETH`. However, Arbitrum Orbit chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain. -### Can I use Ethereum toolkits to develop on my Arbitrum chain? +### Can I use Ethereum toolkits to develop on my Orbit chain? -Arbitrum chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum chain. There are, however, specific differences that developers need to consider when building on an Arbitrum chain. You can find them in our [overview of the differences between Arbitrum and Ethereum](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview). +Arbitrum Orbit chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum Orbit chain. There are, however, specific differences that developers need to consider when building on an Orbit chain. You can find them [in our Arbitrum vs. Ethereum overview](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview). -### Do Arbitrum chains have any built-in AA solution? +### Do Orbit chains have any built-in AA solution? Not by default, but they can be customized to have native AA. -### Is there any cross-chain bridging solution between two Arbitrum chains? +### Is there any cross-chain bridging solution between two Orbit chains? -There is currently no native Arbitrum-to-Arbitrum chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum chains. +There is currently no native Orbit-to-Orbit chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum Orbit chains. -### Is there an official block explorer for Arbitrum chains? +### Is there an official block explorer for Orbit chains? -Arbitrum 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 Arbitrum chains. +Arbitrum Orbit 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 Arbitrum Orbit chains. -### Is there any indexing solution that supports Arbitrum chains? +### Is there any indexing solution that supports Orbit chains? -Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum chains. +Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum Orbit chains. -### Can I increase the maximum contract size for my Arbitrum chain? +### Can I increase the maximum contract size for my Orbit chain? -Yes, Arbitrum chains support an increased smart contract size limit of up to 96kB. You can use our [Chain SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade. +Yes, Arbitrum Orbit chains support an increased smart contract size limit of up to 96kB. You can use our [Orbit SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade. ### How can I modify Nitro to force posting an invalid assertion and test the fraud proof mechanism? @@ -66,9 +74,9 @@ go test ./system_tests/ -tags=challengetest -run=TestChallenge ### What fee collectors can be configured on my chain? -Four fee types are configurable on an Arbitrum chain: +Four fee types are configurable on an Orbit chain: -- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into the `infraFeeAccount`, which can be set by calling `ArbOwner.setInfraFeeAccount().` +- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into the infraFeeAccount, which can be set by calling `ArbOwner.setInfraFeeAccount().` - **L2 surplus fee**: L2 execution fees above the minimum base price (in the case of congestion). This fee goes to the `networkFeeAccount`, which can be set by calling `ArbOwner.setNetworkFeeAccount().` - **L1 base fee**: Relative fees for posting a transaction on the parent chain. This fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating a different fee collector for that batch poster can be specified by calling `ArbAggregator.setFeeCollector()`. - **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()`. @@ -78,7 +86,7 @@ To learn more about precompiles, refer to the [Precompiles reference page](https ### What is the lowest you can set the base fee to? -You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Arbitrum chain base fee is `0`, users are then only paying for the cost of DA. +You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Orbit base fee is `0`, users are then only paying for the cost of DA. ### How does fee collection work in Nitro? @@ -126,7 +134,7 @@ Test this thoroughly on a testnet first. ### What is the max theoretical TPS for an Arbitrum Chain? -Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default Arbitrum chain parameters. +Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default orbit chain parameters. The actual maximum throughput depends on the configurable execution parameters: @@ -144,7 +152,7 @@ The actual maximum throughput depends on the configurable execution parameters: ### Why is the WETH Gateway not necessary for custom gas token chains? -The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway). +The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum (Orbit) chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway). If you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case. diff --git a/docs/partials/_troubleshooting-bridging-partial.mdx b/docs/partials/_troubleshooting-bridging-partial.mdx index 7172a50dd8..43cc06fbfc 100644 --- a/docs/partials/_troubleshooting-bridging-partial.mdx +++ b/docs/partials/_troubleshooting-bridging-partial.mdx @@ -1,3 +1,11 @@ +--- +partial_type: troubleshooting +title: 'Bridging Troubleshooting Guide' +description: 'Common issues and solutions for bridging assets to/from Arbitrum' +author: anegg0 +last_reviewed: 2025-11-06 +--- + ### How do I move assets between One and Nova? Both Arbitrum One and Arbitrum Nova run as layers on top of Ethereum. Thus, you can always move assets between the two chains in two steps by going "through" Ethereum. In other words: withdraw your assets from Arbitrum One to Ethereum and then deposit them onto Nova, or conversely, withdraw your assets from Nova to Ethereum and then deposit them to Arbitrum One. You can complete these steps using the [Arbitrum Bridge](https://bridge.arbitrum.io/). diff --git a/docs/partials/_troubleshooting-building-partial.mdx b/docs/partials/_troubleshooting-building-partial.mdx index c6dc5e4687..f1496f7d10 100644 --- a/docs/partials/_troubleshooting-building-partial.mdx +++ b/docs/partials/_troubleshooting-building-partial.mdx @@ -1,3 +1,11 @@ +--- +partial_type: troubleshooting +title: 'Building Troubleshooting Guide' +description: 'Common issues and solutions for building on Arbitrum' +author: anegg0 +last_reviewed: 2025-11-06 +--- + ### How does gas work on Arbitrum? Fees on Arbitrum chains are collected on L2 in the chains' native currency (ETH on both Arbitrum One and Nova). @@ -54,9 +62,9 @@ There are two differences between `createRetryableTicket` and `unsafeCreateRe ### Why do I get "custom tx type" errors when I use hardhat? -In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. Feel free to consult the [full list of transaction types](https://developer.arbitrum.io/arbos/geth#transaction-types) and the rationale. +In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. See [here](https://developer.arbitrum.io/arbos/geth#transaction-types) for the full list and the rationale. -Note that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [in this HardHat GitHub issue](https://github.com/NomicFoundation/hardhat/issues/2995)). +Note that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [here](https://github.com/NomicFoundation/hardhat/issues/2995)). ### Why does it look like two identical transactions consume a different amount of gas? @@ -148,7 +156,7 @@ The WASM module root is a 32-byte hash, which is a Merkelization of the Go repla The 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. -You can find more information in [How to Customize your Arbitrum chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs). +You can find more information in [How to Customize your Orbit chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs). ### Why do I get a "gas required exceeds allowance" when trying to estimate the gas costs of a request? diff --git a/docs/partials/_troubleshooting-nodes-partial.mdx b/docs/partials/_troubleshooting-nodes-partial.mdx index f9b857ea34..767479be47 100644 --- a/docs/partials/_troubleshooting-nodes-partial.mdx +++ b/docs/partials/_troubleshooting-nodes-partial.mdx @@ -1,6 +1,14 @@ +--- +partial_type: troubleshooting +title: 'Node Running Troubleshooting Guide' +description: 'Common issues and solutions for running Arbitrum nodes' +author: anegg0 +last_reviewed: 2025-11-06 +--- + ### How do I run a node? -See instructions [in our guide about running a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! +See instructions in the tutorial explaining how to [run a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! ### How to verify the integrity of the Nitro database I currently have? @@ -28,7 +36,7 @@ Running an Arbitrum relay locally as a [Feed Relay](https://docs.arbitrum.io/nod ### How do I run a node locally for development? -See instructions in our  [our guide about running a local devnet node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node). +See instructions on [how to set up a local dev node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node). We recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally). @@ -36,7 +44,7 @@ We recommend running Nitro nodes via Docker; to compile directly / run without D The pre-Nitro stack is also called the "classic" stack. Full Nitro nodes start with a database that contains the information from the "classic" era. -However, a Nitro node can't query archive information contained in "classic" blocks right away. To do that, you also need to run a classic node ([instructions in our guide about running a classic node](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`. +However, a Nitro node can't query archive information contained in "classic" blocks right away. To do that, you also need to run a classic node. You can find detailed instructions [in this detailed How To](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`. Please note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have "classic" data. diff --git a/docs/partials/_troubleshooting-stylus-partial.mdx b/docs/partials/_troubleshooting-stylus-partial.mdx index 58b313374a..28cdc3f141 100644 --- a/docs/partials/_troubleshooting-stylus-partial.mdx +++ b/docs/partials/_troubleshooting-stylus-partial.mdx @@ -1,3 +1,11 @@ +--- +partial_type: troubleshooting +title: 'Stylus Troubleshooting Guide' +description: 'Common issues and solutions for Stylus smart contract development' +author: anegg0 +last_reviewed: 2025-11-06 +--- + ### How does Stylus manage security issues in smart contracts when interacting with so many different languages? All languages are compiled to WASM for them to be able to work with Stylus. So it just needs to verify that the produced WASM programs behave as they should inside the new virtual machine. diff --git a/docs/partials/_troubleshooting-users-partial.mdx b/docs/partials/_troubleshooting-users-partial.mdx index b571e8f493..6b23b50681 100644 --- a/docs/partials/_troubleshooting-users-partial.mdx +++ b/docs/partials/_troubleshooting-users-partial.mdx @@ -1,3 +1,11 @@ +--- +partial_type: troubleshooting +title: 'User Troubleshooting Guide' +description: 'Common issues and solutions for Arbitrum users' +author: anegg0 +last_reviewed: 2025-11-06 +--- + ### Why do I need ETH to use the Arbitrum network? `ETH` is the currency used to pay gas fees on Arbitrum, and it powers all transactions on Arbitrum. You can bridge `ETH` (and other tokens) from Ethereum to Arbitrum through [Arbitrum's bridge](https://bridge.arbitrum.io/). @@ -97,9 +105,13 @@ Although we currently don't maintain any stats dashboard for Arbitrum, you can f There is no notion of a mempool on Arbitrum; transactions are processed on a first-come, first-served basis by the Sequencer. Thus, the gas price bid parameter does not affect the order in which transactions get processed. +### Where can I find a list of the current validators of the Arbitrum chains? + +Validation on both Arbitrum One and Arbitrum Nova is currently allow-listed to a committee of public entities. You can see the list of validators **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators)**. Governance currently has the power to change this status. + ### Where can I find the current Data Availability Committee members? -The Arbitrum Nova chain has a 7-party DAC, whose members can be seen in the [Arbitrum Foundation's state of progressive decentralization status document](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members). Governance has the ability to remove or add members to the committee. +The Arbitrum Nova chain has a 7-party DAC, whose members can be seen **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members)**. Governance has the ability to remove or add members to the committee. ### Can I withdraw my funds from Arbitrum back to Ethereum without going through the Sequencer? What about funds that are in a contract? diff --git a/static/building-faqs.json b/static/building-faqs.json index ceef1f7ac5..9c38dd6373 100644 --- a/static/building-faqs.json +++ b/static/building-faqs.json @@ -26,7 +26,7 @@ }, { "question": "Why do I get \"custom tx type\" errors when I use hardhat?", - "answer": "In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. Feel free to consult the [full list of transaction types](https://developer.arbitrum.io/arbos/geth#transaction-types) and the rationale.\n\nNote that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [in this HardHat GitHub issue](https://github.com/NomicFoundation/hardhat/issues/2995)).\n\n\n\n", + "answer": "In Arbitrum, we use a number of non-standard [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) typed transactions. See [here](https://developer.arbitrum.io/arbos/geth#transaction-types) for the full list and the rationale.\n\nNote that if you're using Hardhat, [v2.12.2](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.12.2) added support for forking networks like Arbitrum with custom transaction types (find more information [here](https://github.com/NomicFoundation/hardhat/issues/2995)).\n\n\n\n", "key": "why-do-i-get-custom-tx-type-errors-when-i-use-hardhat" }, { @@ -96,7 +96,7 @@ }, { "question": "What is the WASM module root?", - "answer": "The WASM module root is a 32-byte hash, which is a Merkelization of the Go replay binary and its dependencies.\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\nYou can find more information in [How to Customize your Arbitrum chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs).\n\n\n\n", + "answer": "The WASM module root is a 32-byte hash, which is a Merkelization of the Go replay binary and its dependencies.\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\nYou can find more information in [How to Customize your Orbit chain's behavior](https://docs.arbitrum.io/launch-orbit-chain/how-tos/customize-stf#step-4-enable-fraud-proofs).\n\n\n\n", "key": "what-is-the-wasm-module-root" }, { diff --git a/static/building-orbit-faqs.json b/static/building-orbit-faqs.json index 2aa9374480..e096404e32 100644 --- a/static/building-orbit-faqs.json +++ b/static/building-orbit-faqs.json @@ -1,63 +1,63 @@ [ { - "question": "Can I use the Chain SDK to deploy a mainnet chain?", - "answer": "Yes! The Arbitrum Chain SDK's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it in our [preview expectations notice](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first).\n\n\n\n", - "key": "can-i-use-the-chain-sdk-to-deploy-a-mainnet-chain" + "question": "Can I use Orbit to deploy a mainnet chain?", + "answer": "Yes! Arbitrum Orbit's core technology has undergone a comprehensive audit and is now capable of supporting deployments to mainnet. You can read more about it [here](https://docs.arbitrum.io/launch-orbit-chain/concepts/public-preview-expectations#arbitrum-orbit-is-mainnet-ready-but-deploy-to-testnet-first).\n\n\n\n", + "key": "can-i-use-orbit-to-deploy-a-mainnet-chain" }, { - "question": "Do I need permission/license to launch an Arbitrum chain?", - "answer": "You can launch any Arbitrum chain permissionlessly.\n\nNitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova.\n\nHowever, Arbitrum chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf).\n\n", - "key": "do-i-need-permissionlicense-to-launch-an-arbitrum-chain" + "question": "Do I need permission/license to launch an Orbit chain?", + "answer": "You can launch any Arbitrum Orbit chain permissionlessly.\n\nNitro's license is under a [Business Source license](https://github.com/OffchainLabs/nitro?tab=License-1-ov-file), similar to DeFi protocols like Uniswap and Aave, among others. This license contains an Additional Use Grant that permits the permissionless deployment of Nitro software on blockchains that settle to Arbitrum One or Nova.\n\nHowever, Arbitrum Orbit chains that settle to a parent chain other than Arbitrum One or Nova are subject to additional licensing guidelines under the [AEP](https://docs.arbitrum.foundation/aep/ArbitrumExpansionProgramTerms.pdf).\n\n", + "key": "do-i-need-permissionlicense-to-launch-an-orbit-chain" }, { "question": "Does Arbitrum officially deploy and/or maintain L3s for external teams?", - "answer": "No. Teams are required to deploy and maintain their Arbitrum chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum chain on your behalf.\n\n\n\n", + "answer": "No. Teams are required to deploy and maintain their Arbitrum Orbit chains. There are, however, several RaaS (Rollup as a Service) providers that can deploy and maintain your Arbitrum Orbit chain on your behalf.\n\n\n\n", "key": "does-arbitrum-officially-deploy-andor-maintain-l3s-for-external-teams" }, { - "question": "Can I modify the underlying technology to customize my Arbitrum chain?", + "question": "Can I modify Orbit's underlying technology to customize my chain?", "answer": "Yes, you can make any changes you require to the underlying Nitro code base.\n\n\n\n", - "key": "can-i-modify-the-underlying-technology-to-customize-my-arbitrum-chain" + "key": "can-i-modify-orbits-underlying-technology-to-customize-my-chain" }, { - "question": "What Data Availability (DA) solutions are currently available for Arbitrum chains?", - "answer": "Arbitrum chains currently support three different DA solutions:\n\n- Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum.\n- AnyTrust, posting data to a Data Availability Committee, selected by the chain owner.\n- Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/).\nNote that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees.\n\n", - "key": "what-data-availability-da-solutions-are-currently-available-for-arbitrum-chains" + "question": "What Data Availability (DA) solutions are currently available for Orbit chains?", + "answer": "Arbitrum Orbit currently supports three different DA solutions:\n\n- Rollup, posting data to the parent chain, which ultimately posts the data to Ethereum.\n- AnyTrust, posting data to a Data Availability Committee, selected by the chain owner.\n- Celestia, posting data to the [Celestia network](https://blog.celestia.org/celestia-is-first-modular-data-availability-network-to-integrate-with-arbitrum-orbit/).\nNote that using AnyTrust provides the chain owner with the most flexibility and the most cost-effective fees.\n\n", + "key": "what-data-availability-da-solutions-are-currently-available-for-orbit-chains" }, { - "question": "What token is used to pay gas fees on Arbitrum chains?", - "answer": "By default, Arbitrum chains pay gas in `ETH`. However, Arbitrum chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain.\n\n\n\n", - "key": "what-token-is-used-to-pay-gas-fees-on-arbitrum-chains" + "question": "What token is used to pay gas fees on Orbit chains?", + "answer": "By default, Arbitrum Orbit chains pay gas in `ETH`. However, Arbitrum Orbit chains that use AnyTrust are configurable to use any `ERC-20` token for the gas fee token of the chain.\n\n\n\n", + "key": "what-token-is-used-to-pay-gas-fees-on-orbit-chains" }, { - "question": "Can I use Ethereum toolkits to develop on my Arbitrum chain?", - "answer": "Arbitrum chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum chain. There are, however, specific differences that developers need to consider when building on an Arbitrum chain. You can find them in our [overview of the differences between Arbitrum and Ethereum](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview).\n\n\n\n", - "key": "can-i-use-ethereum-toolkits-to-develop-on-my-arbitrum-chain" + "question": "Can I use Ethereum toolkits to develop on my Orbit chain?", + "answer": "Arbitrum Orbit chains are fully EVM-compatible. Most tools that support Ethereum should be able to support an Arbitrum Orbit chain. There are, however, specific differences that developers need to consider when building on an Orbit chain. You can find them [here](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/overview).\n\n\n\n", + "key": "can-i-use-ethereum-toolkits-to-develop-on-my-orbit-chain" }, { - "question": "Do Arbitrum chains have any built-in AA solution?", + "question": "Do Orbit chains have any built-in AA solution?", "answer": "Not by default, but they can be customized to have native AA.\n\n", - "key": "do-arbitrum-chains-have-any-builtin-aa-solution" + "key": "do-orbit-chains-have-any-builtin-aa-solution" }, { - "question": "Is there any cross-chain bridging solution between two Arbitrum chains?", - "answer": "There is currently no native Arbitrum-to-Arbitrum chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum chains.\n\n\n\n", - "key": "is-there-any-crosschain-bridging-solution-between-two-arbitrum-chains" + "question": "Is there any cross-chain bridging solution between two Orbit chains?", + "answer": "There is currently no native Orbit-to-Orbit chain bridging solution, except for going through the parent chain (even if they share the same parent chain). However, many third-party bridges have expressed interest in supporting Arbitrum Orbit chains.\n\n\n\n", + "key": "is-there-any-crosschain-bridging-solution-between-two-orbit-chains" }, { - "question": "Is there an official block explorer for Arbitrum chains?", - "answer": "Arbitrum 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 Arbitrum chains.\n\n\n\n", - "key": "is-there-an-official-block-explorer-for-arbitrum-chains" + "question": "Is there an official block explorer for Orbit chains?", + "answer": "Arbitrum Orbit 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 Arbitrum Orbit chains.\n\n\n\n", + "key": "is-there-an-official-block-explorer-for-orbit-chains" }, { - "question": "Is there any indexing solution that supports Arbitrum chains?", - "answer": "Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum chains.\n\n\n\n", - "key": "is-there-any-indexing-solution-that-supports-arbitrum-chains" + "question": "Is there any indexing solution that supports Orbit chains?", + "answer": "Similar to bridges and block explorers, there are many third-party indexing solutions that have expressed interest in supporting Arbitrum Orbit chains.\n\n\n\n", + "key": "is-there-any-indexing-solution-that-supports-orbit-chains" }, { - "question": "Can I increase the maximum contract size for my Arbitrum chain?", - "answer": "Yes, Arbitrum chains support an increased smart contract size limit of up to 96kB. You can use our [Chain SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade.\n\n\n\n", - "key": "can-i-increase-the-maximum-contract-size-for-my-arbitrum-chain" + "question": "Can I increase the maximum contract size for my Orbit chain?", + "answer": "Yes, Arbitrum Orbit chains support an increased smart contract size limit of up to 96kB. You can use our [Orbit SDK](https://github.com/OffchainLabs/arbitrum-orbit-sdk) and configure the parameters `[MaxCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[ and ](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)`[MaxInitCodeSize](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/src/prepareChainConfig.ts#L29)` when calling `[prepareNodeConfig](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/prepare-node-config/index.ts#L43)`. Once deployed, you cannot change the parameters for the smart contract size limit through an upgrade.\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?", @@ -66,12 +66,12 @@ }, { "question": "What fee collectors can be configured on my chain?", - "answer": "Four fee types are configurable on an Arbitrum chain:\n\n- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into 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 fee goes 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 fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating 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()`.\nFor more detailed information about fees, please refer to the [L1 Fees](https://docs.arbitrum.io/arbos/l1-pricing) and [L2 Fees](https://docs.arbitrum.io/arbos/gas) pages.\n\nTo learn more about precompiles, refer to the [Precompiles reference page](https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference).\n\n", + "answer": "Four fee types are configurable on an Orbit chain:\n\n- **L2 base fee**: L2 execution fees corresponding to the minimum base price of the chain. This fee is deposited into 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 fee goes 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 fee is paid ultimately to the fee collector of the active batch poster. A call to `SequencerInbox.setIsBatchPoster()` on the parent chain will set the batch poster. Delegating 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()`.\nFor more detailed information about fees, please refer to the [L1 Fees](https://docs.arbitrum.io/arbos/l1-pricing) and [L2 Fees](https://docs.arbitrum.io/arbos/gas) pages.\n\nTo learn more about precompiles, refer to the [Precompiles reference page](https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference).\n\n", "key": "what-fee-collectors-can-be-configured-on-my-chain" }, { "question": "What is the lowest you can set the base fee to?", - "answer": "You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Arbitrum chain base fee is `0`, users are then only paying for the cost of DA.\n\n", + "answer": "You can set the base fee to any amount to charge users less. You can even set it to `0` (however, this would open the chain to DOS attacks). If the Orbit base fee is `0`, users are then only paying for the cost of DA.\n\n", "key": "what-is-the-lowest-you-can-set-the-base-fee-to" }, { @@ -101,12 +101,12 @@ }, { "question": "What is the max theoretical TPS for an Arbitrum Chain?", - "answer": "Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default Arbitrum chain parameters.\n\nThe actual maximum throughput depends on the configurable execution parameters:\n\n**Using standard Arbitrum chain defaults**\n\n- Block time: 250ms\n- Block gas limit: 32M L2 gas\n- Max L2 gas per second: 128M gas/sec\n- These parameters are entirely configurable, for example, by dropping the block time to 100ms or by increasing the block gas limit (which comes at the cost of faster state bloat).\n- Dropping to 100ms and doubling the block gas limit to 64m L2 gas would achieve 640m L2 gas per second.\n**The actual TPS varies depending on the gas cost per transaction:**\n\n- A simple transfer (~21,000 gas) could approximately achieve around 6,000 TPS.\n- A more complex transaction (~200,000 gas) would enable approximately 640 TPS.\n", + "answer": "Max TPS is a challenging metric to measure, as it relies on network activity and the type of submitted transactions. We can, however, calculate the max throughput using default orbit chain parameters.\n\nThe actual maximum throughput depends on the configurable execution parameters:\n\n**Using standard Arbitrum chain defaults**\n\n- Block time: 250ms\n- Block gas limit: 32M L2 gas\n- Max L2 gas per second: 128M gas/sec\n- These parameters are entirely configurable, for example, by dropping the block time to 100ms or by increasing the block gas limit (which comes at the cost of faster state bloat).\n- Dropping to 100ms and doubling the block gas limit to 64m L2 gas would achieve 640m L2 gas per second.\n**The actual TPS varies depending on the gas cost per transaction:**\n\n- A simple transfer (~21,000 gas) could approximately achieve around 6,000 TPS.\n- A more complex transaction (~200,000 gas) would enable approximately 640 TPS.\n", "key": "what-is-the-max-theoretical-tps-for-an-arbitrum-chain" }, { "question": "Why is the WETH Gateway not necessary for custom gas token chains?", - "answer": "The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway).\n\nIf you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case.\n\n", + "answer": "The `WETH` gateway used in the token bridge is a special, custom gateway that unwraps the `WETH` deposits and sends them to the Arbitrum chain, then wraps them again on the Arbitrum chain. Since `ETH` is the gas token in the Arbitrum (Orbit) chain, there's no need to perform this operation, so you can use a standard `ERC-20` for `WETH` (this is the default case of the token bridge so that you wouldn't need a special `WETH` gateway).\n\nIf you want to enable extra custom operations with `WETH`, you can create a custom token and a custom gateway to handle this case.\n\n", "key": "why-is-the-weth-gateway-not-necessary-for-custom-gas-token-chains" }, { diff --git a/static/get-started-faqs.json b/static/get-started-faqs.json index 4f095c33dd..b3229e30ec 100644 --- a/static/get-started-faqs.json +++ b/static/get-started-faqs.json @@ -79,9 +79,14 @@ "answer": "There is no notion of a mempool on Arbitrum; transactions are processed on a first-come, first-served basis by the Sequencer. Thus, the gas price bid parameter does not affect the order in which transactions get processed.\n\n\n\n", "key": "will-transactions-with-a-higher-gas-price-bid-be-confirmed-first" }, + { + "question": "Where can I find a list of the current validators of the Arbitrum chains?", + "answer": "Validation on both Arbitrum One and Arbitrum Nova is currently allow-listed to a committee of public entities. You can see the list of validators **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#allowlisted-validators)**. Governance currently has the power to change this status.\n\n\n\n", + "key": "where-can-i-find-a-list-of-the-current-validators-of-the-arbitrum-chains" + }, { "question": "Where can I find the current Data Availability Committee members?", - "answer": "The Arbitrum Nova chain has a 7-party DAC, whose members can be seen in the [Arbitrum Foundation's state of progressive decentralization status document](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members). Governance has the ability to remove or add members to the committee.\n\n\n\n", + "answer": "The Arbitrum Nova chain has a 7-party DAC, whose members can be seen **[here](https://docs.arbitrum.foundation/state-of-progressive-decentralization#data-availability-committee-members)**. Governance has the ability to remove or add members to the committee.\n\n\n\n", "key": "where-can-i-find-the-current-data-availability-committee-members" }, { diff --git a/static/node-running-faqs.json b/static/node-running-faqs.json index f359da16ac..2daefd9a41 100644 --- a/static/node-running-faqs.json +++ b/static/node-running-faqs.json @@ -1,7 +1,7 @@ [ { "question": "How do I run a node?", - "answer": "See instructions [in our guide about running a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)!\n\n\n\n", + "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! \n\n\n\n", "key": "how-do-i-run-a-node" }, { @@ -31,12 +31,12 @@ }, { "question": "How do I run a node locally for development?", - "answer": "See instructions in our  [our guide about running a local devnet node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", + "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", "key": "how-do-i-run-a-node-locally-for-development" }, { "question": "Is there any way to retrieve pre-Nitro archive data from a Nitro node?", - "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions in our guide about running a classic node](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n\n\n", + "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions here](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n", "key": "is-there-any-way-to-retrieve-prenitro-archive-data-from-a-nitro-node" }, { From d39e9bdb66edf6f3a16fcebafda811b8385cbc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 19:51:48 -0800 Subject: [PATCH 08/13] point package.json to https://github.com/OffchainLabs/notion-docs-generator --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de7f6e1dba..fd2a961949 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", "@docusaurus/module-type-aliases": "^3.3.2", - "@offchainlabs/notion-docs-generator": "github:OffchainLabs/notion-docs-generator#add-question-integration", + "@offchainlabs/notion-docs-generator": "github:OffchainLabs/notion-docs-generator", "@offchainlabs/prettier-config": "0.2.1", "@tsconfig/docusaurus": "^2.0.3", "@types/node": "^22.10.10", From 331050893f6aed6324ef61b82cf5339d846c6d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 19:53:07 -0800 Subject: [PATCH 09/13] point package.json to https://github.com/OffchainLabs/notion-docs-generator --- yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index fa07b0ce43..ae78e062e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4189,9 +4189,9 @@ dependencies: "@octokit/openapi-types" "^24.2.0" -"@offchainlabs/notion-docs-generator@github:OffchainLabs/notion-docs-generator#add-question-integration": +"@offchainlabs/notion-docs-generator@github:OffchainLabs/notion-docs-generator": version "0.1.0" - resolved "https://codeload.github.com/OffchainLabs/notion-docs-generator/tar.gz/9b6e0d52ef26e182b92edb277024adfa34303b46" + resolved "https://codeload.github.com/OffchainLabs/notion-docs-generator/tar.gz/660d51ac1cb5ff6c19691ecaa629c7b8827c11bd" dependencies: "@notionhq/client" "^2.2.3" "@types/node" "^18.11.18" From 7f69840d310996f93c7254e0c3f6c7251e45b0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 19:57:07 -0800 Subject: [PATCH 10/13] fix: escape angle brackets in MDX output to prevent JSX parsing errors - Update escapeForMDX to escape < and > characters - Prevents MDX from interpreting text like as JSX tags - Fixes build errors when questions contain angle brackets --- scripts/notion-update.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/notion-update.ts b/scripts/notion-update.ts index 7e883140ca..ddac262f73 100644 --- a/scripts/notion-update.ts +++ b/scripts/notion-update.ts @@ -30,6 +30,11 @@ function escapeForJSON(str: string): string { .replace(/\t/g, '\\t'); } +// Escape special characters for MDX (curly braces and angle brackets are JSX expressions in MDX) +function escapeForMDX(str: string): string { + return str.replace(/{/g, '\\{').replace(/}/g, '\\}').replace(//g, '\\>'); +} + // Helper to convert question text to URL-safe key function generateQuestionKey(question: string): string { return question @@ -306,7 +311,10 @@ const renderFAQs = (faqs: RenderedKnowledgeItem[]) => { // Renderer for Questions in MDX format const renderQuestions = (questions: RenderedQuestion[]): string => { const printItem = (q: RenderedQuestion) => { - return `### ${q.question}\n\n${q.answer}`; + // Escape MDX special characters (curly braces) that would be interpreted as JSX + const escapedQuestion = escapeForMDX(q.question); + const escapedAnswer = escapeForMDX(q.answer); + return `### ${escapedQuestion}\n\n${escapedAnswer}`; }; return questions.map(printItem).join('\n\n'); From 8d6525df91770fc465d506da62ea4926c1ca4883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Blanchemain?= Date: Tue, 25 Nov 2025 20:00:09 -0800 Subject: [PATCH 11/13] add properly formatted Q&A from Notion DB --- docs/partials/_miscellaneous-QA.mdx | 32 ++++++++++++++--------------- static/node-running-faqs.json | 6 +++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/partials/_miscellaneous-QA.mdx b/docs/partials/_miscellaneous-QA.mdx index 322feb7f6d..a47ed1f1c6 100644 --- a/docs/partials/_miscellaneous-QA.mdx +++ b/docs/partials/_miscellaneous-QA.mdx @@ -403,7 +403,7 @@ This issue originates from the node responding to an `invalid block range` param Additionally, if you encounter the error `wrong msgIdx got 167230 expected 167228`, this points to **database inconsistency** between components of your node setup. Resetting only one database can create further synchronization issues. -If the chain is running in **Rollup mode**, the recommended fix is to **delete the entire database** (typically located at `/home/user/.arbitrum/`) and **resync the node** from the parent chain. This ensures full consistency across databases and resolves the indexing mismatch. +If the chain is running in **Rollup mode**, the recommended fix is to **delete the entire database** (typically located at `/home/user/.arbitrum/\`) and **resync the node** from the parent chain. This ensures full consistency across databases and resolves the indexing mismatch. ### Regarding the configuration below, the default value is 100000. If the compression rate is 11, how many transactions can be included on average? @@ -468,7 +468,7 @@ weth and multi call are usually specific to the chain and be a constant contract ### What does "resolve any unconfirmed assertions" mean in resolve node explanation? (What does resolve mean here?) This is a question from another team member. Is "resolve any unconfirmed assertions" performed by the rollup contract rather than the validator? -The assertion life cycle is: `assertion created` -> `assertion waiting for challenge` -> `assertion confirmed` in happy case. The resolve mean confirm an assertion, arbitrum is optimistic rollup, the l1 will not do any execution when there is no challenge, so needs to be resolved on rollup contract by validator after it created, I would highly recommend you go through those docs (**[Validation and Proving Mechanisms](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving)**, [rollup protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/rollup-protocol) and [challenge protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/proving-and-challenges)) for a better understanding. +The assertion life cycle is: `assertion created` -\> `assertion waiting for challenge` -\> `assertion confirmed` in happy case. The resolve mean confirm an assertion, arbitrum is optimistic rollup, the l1 will not do any execution when there is no challenge, so needs to be resolved on rollup contract by validator after it created, I would highly recommend you go through those docs (**[Validation and Proving Mechanisms](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving)**, [rollup protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/rollup-protocol) and [challenge protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/proving-and-challenges)) for a better understanding. ### How can I call smart contract functions and listen to events emitted by said contracts (Original question asked specifically about changing transaction fee receiver and how to call/read smart contract functions/events) @@ -491,7 +491,7 @@ For rpc each specific methods implementation, you can check code here. http/ws p native token here is 0x0 means you use ethers as gas token, if it is other value, then means this chain will use that as gas token. About proxyAdmin, you can check oz docs. validatorWalletCreator can be used to create wallet for validator to ensure the funds safety. -### if i use the same validator address as a Makenode address at first and then change it to defensive mode, does it re-stacking every time i change the mode?For example, as i can see below, the money is spent twice.https://sepolia.etherscan.io/address/0x65fF9E2256CBaE32f8Ae18776cF1e66A2BEa436d (Mode : MakeNode->defensive) (twice out)https://sepolia.etherscan.io/address/0x9699040F6e8A10F6831884966ceBfaa2E50fe59B (Mode change is not sure but twice out)In this case, how can I withdraw the stake I made in the previous mode? Could you please guide me on the specific method? +### if i use the same validator address as a Makenode address at first and then change it to defensive mode, does it re-stacking every time i change the mode?For example, as i can see below, the money is spent twice.https://sepolia.etherscan.io/address/0x65fF9E2256CBaE32f8Ae18776cF1e66A2BEa436d (Mode : MakeNode-\>defensive) (twice out)https://sepolia.etherscan.io/address/0x9699040F6e8A10F6831884966ceBfaa2E50fe59B (Mode change is not sure but twice out)In this case, how can I withdraw the stake I made in the previous mode? Could you please guide me on the specific method? No, it will just **need** stake once, the stake token of your chain is weth (wrapped ethers, which is an erc20 type of ethers). You can click [here](https://sepolia.etherscan.io/address/0x65ff9e2256cbae32f8ae18776cf1e66a2bea436d#tokentxns) to see your weth transfer history, then you will see there is only 1 time that your address transfer the weth token to your rollup contract, although you deposited twice (2 ethrs), only 1 weth is spent and your address still has 1 weth left, you can check it [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#readContract)  by call `balanceOf` and input is your address, if you want to withdraw weth back to eth, then use your address to connect to etherscan and call withdraw [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#writeContract). @@ -589,7 +589,7 @@ Your rollup contract uses weth as stake token, and the node needs to call weth c No, no relationships I mean is no need to have any specific amount of batch to post the assertion, if your batch number higher than last assertion's, then you are good to post the new one. related logic [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/RollupCore.sol#L471). -### -> --node.bold.assertion-posting-interval (bold) or --node.staker.make-assertion-interval (legacy) What are the differences between these two? +### -\> --node.bold.assertion-posting-interval (bold) or --node.staker.make-assertion-interval (legacy) What are the differences between these two? The first one is used for validators using the BoLD protocol, the second one is used for validators running the legacy protocol. @@ -599,7 +599,7 @@ The first one is used for validators using the BoLD protocol, the second one is ### Do all L1→L2 message go through the inbox contract? -Yes, even for bridge contract, it will finally call inbox's `createRetryableTicket` , for more about l1->l2 message, please refer to [this](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging) docs. +Yes, even for bridge contract, it will finally call inbox's `createRetryableTicket` , for more about l1-\>l2 message, please refer to [this](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging) docs. ### When I try to build nitro binary, I get the following error: make: wat2wasm: No such file or directory @@ -711,7 +711,7 @@ Apply `--conf.file` to your node when starting, and remember if you are running Empty batch can be posted after 72 hours this is true, empty batch means there is no user tx within the batch, so no need to have user's tx for a batch posting, **but there will be system tx like** `batchPostingReport` **to create a new block,**  And this block won't contain any **user tx**. -### WARN [06-11|09:12:22.830] error getting max time variation on L1 bound block; falling back on latest block err="429 Too Many Requests: {\"code\":-32007,\"message\":\"50/second request limit reached - reduce calls per second or upgrade your account at quicknode.com\"}" +### WARN [06-11|09:12:22.830] error getting max time variation on L1 bound block; falling back on latest block err="429 Too Many Requests: \{\"code\":-32007,\"message\":\"50/second request limit reached - reduce calls per second or upgrade your account at quicknode.com\"\}" This 429 error returned from your parent chain rpc endpoint, you need to check the status of your parent chain rpc endpoint. @@ -756,13 +756,13 @@ Resolution** If you want to allow multiple unconfirmed transactions simultaneously, increase the mempool limit: **For BOLD validators:** -`--node.bold.data-poster.max-mempool-transactions ` +`--node.bold.data-poster.max-mempool-transactions \` **For legacy validators:** -`--node.staker.data-poster.max-mempool-transactions ` +`--node.staker.data-poster.max-mempool-transactions \` **Log Level Logic:** -• **< 10 minutes:** WARN - considered a temporary issue +• **\< 10 minutes:** WARN - considered a temporary issue • **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level ### But if TPS increases, for example, if 100 sequences are sent per second, will the response speed after each transmission be uniform, or will the overall response speed slow down? @@ -833,7 +833,7 @@ validatorName=default-validator This ERROR indicates a transaction (nonce 30) has been pending for **over 10 minutes** without confirmation. This is a serious issue requiring immediate investigation - the transaction is likely stuck due to low gas price, L1 congestion, or RPC issues.** Why This Escalated from WARN to ERROR** **Log Level Logic:** -• **< 10 minutes:** WARN - considered a temporary issue +• **\< 10 minutes:** WARN - considered a temporary issue • **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level **Situation:** The escalation to ERROR means nonce 30 has been unconfirmed for over 10 minutes, blocking all subsequent assertions. This is **not normal** temporary waiting.** @@ -842,7 +842,7 @@ Immediate Diagnostic Steps** View the validator address on L1 to inspect the stuck transaction:bash _`# Using Etherscan or similar block explorer# Or query via RPC:`_` -eth_getTransactionByHash ` +eth_getTransactionByHash \` **2. Identify Root Cause** **a. Gas Price Too Low (Most Common)** • Transaction gas price is too low for current L1 network conditions @@ -992,12 +992,12 @@ Might be some reasons; The sequencer's max time variation is configurable via the `setMaxTimeVariation` method of the Sequencer Inbox Contract, which will also be set to prevent chain reorganization when there are no batches for an extended period. `MaxTimeVariation` struct: -`struct MaxTimeVariation { +`struct MaxTimeVariation \{ uint256 delayBlocks; uint256 futureBlocks; uint256 delaySeconds; uint256 futureSeconds; -}` +\}` The `MaxTimeVariation` struct defines time boundaries that determine whether your chain remains safe or triggers a reorganization (reorg) when posting batches. It uses both block-based and time-based limits to create acceptable windows for message processing between L1 and L2. ### What is the difference between the chain SDK and the Orbit setup script (Orbit now Arbitrum chain) @@ -1124,11 +1124,11 @@ For sequencer coordinator system (redis can also be used on other system), Redis **Data in Redis** **1. Leadership Keys** • `coordinator.chosen` - URL of currently active sequencer (e.g., "[http://sequencer1:8547](http://sequencer1:8547/)") -• `coordinator.liveliness.` - Each sequencer's heartbeat signal +• `coordinator.liveliness.\` - Each sequencer's heartbeat signal **2. Message Synchronization** • `coordinator.msgCount` - Current message count (signed) • `coordinator.finalizedMsgCount` - Finalized message count (signed) -• `coordinator.msg.` - Individual messages (JSON encoded) +• `coordinator.msg.\` - Individual messages (JSON encoded) • Other sync-related keys **3. Configuration** • `coordinator.priorities` - Comma-separated priority list of sequencer URLs @@ -1136,7 +1136,7 @@ For sequencer coordinator system (redis can also be used on other system), Redis **The election process:** 1. The system reads coordinator.priorities to get the ordered list of sequencer URLs -2. It checks each URL in priority order to see if that sequencer has set coordinator.liveliness. = "OK" +2. It checks each URL in priority order to see if that sequencer has set coordinator.liveliness.\ = "OK" 3. The first sequencer in the priority list that has its liveliness key set becomes the recommended leader 4. That sequencer attempts to acquire the coordinator.chosen lock **Conditions for a sequencer to become active:** • Must be synced with the network diff --git a/static/node-running-faqs.json b/static/node-running-faqs.json index 2daefd9a41..f359da16ac 100644 --- a/static/node-running-faqs.json +++ b/static/node-running-faqs.json @@ -1,7 +1,7 @@ [ { "question": "How do I run a node?", - "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)! \n\n\n\n", + "answer": "See instructions [in our guide about running a full node](https://developer.arbitrum.io/node-running/how-tos/running-a-full-node)!\n\n\n\n", "key": "how-do-i-run-a-node" }, { @@ -31,12 +31,12 @@ }, { "question": "How do I run a node locally for development?", - "answer": "See instructions [here](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", + "answer": "See instructions in our  [our guide about running a local devnet node](https://developer.arbitrum.io/node-running/how-tos/local-dev-node).\n\nWe recommend running Nitro nodes via Docker; to compile directly / run without Docker, you can follow the steps in [How to build Nitro locally](https://docs.arbitrum.io/node-running/how-tos/build-nitro-locally).\n\n\n\n\n\n\n\n", "key": "how-do-i-run-a-node-locally-for-development" }, { "question": "Is there any way to retrieve pre-Nitro archive data from a Nitro node?", - "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions here](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n", + "answer": "The pre-Nitro stack is also called the \"classic\" stack. Full Nitro nodes start with a database that contains the information from the \"classic\" era.\n\nHowever, a Nitro node can't query archive information contained in \"classic\" blocks right away. To do that, you also need to run a classic node ([instructions in our guide about running a classic node](https://developer.arbitrum.io/node-running/how-tos/running-a-classic-node)) and set the parameter `—node.rpc.classic-redirect=your-classic-node-RPC`.\n\nPlease note that this information only applies to Arbitrum One nodes. Arbitrum Nova and Sepolia nodes started with a Nitro stack, so they don't have \"classic\" data.\n\n\n\n", "key": "is-there-any-way-to-retrieve-prenitro-archive-data-from-a-nitro-node" }, { From 62aca021f2dd0ad5e9265b587a5c511535fd002e Mon Sep 17 00:00:00 2001 From: Jason-Wanxt Date: Wed, 26 Nov 2025 19:06:55 +0800 Subject: [PATCH 12/13] add categories --- docs/partials/_miscellaneous-QA.mdx | 4 +- scripts/notion-update.ts | 7 +- static/miscellaneous-qa.json | 490 ++++++++++++++++++---------- 3 files changed, 333 insertions(+), 168 deletions(-) diff --git a/docs/partials/_miscellaneous-QA.mdx b/docs/partials/_miscellaneous-QA.mdx index a47ed1f1c6..a3a37e05aa 100644 --- a/docs/partials/_miscellaneous-QA.mdx +++ b/docs/partials/_miscellaneous-QA.mdx @@ -53,7 +53,7 @@ The correct flow is: 1. A user submits a transaction to an **RPC Node**. 2. The RPC Node **forwards** the transaction to the **Sequencer**. 3. The Sequencer **queues and orders** the transaction. -4. The Sequencer then sends the ordered transaction to the **Validator** via the **Sequencer Feed** for verification. +4. The Sequencer then sends the ordered transactions to the Validator through the Sequencer Feed. While the Validator can synchronize these transactions directly from the feed, it must still verify their correctness by referencing the corresponding data on the parent chain. This ensures that the final validation process is secured by the parent chain's canonical state. **Even when a Validator endpoint acts as an RPC Provider, the transaction is immediately forwarded to the Sequencer for ordering, as the Validator's core function is verification.** @@ -138,7 +138,7 @@ Any claims of **billion-scale daily on-chain throughput** should therefore be vi For any Nitro chain is **execution plus data availability (DA)** . The main difference between Orbit L2 and L3 lies in the **settlement layer** (the parent chain), since both use the same **Nitro stack**. The assumption that L3 is cheaper is mostly outdated as both L2 and L3 **can** use **AnyTrust mode**, which allows for similarly low gas fees. However with rollup mode, the dominant cost is L1 data posting. **Gas Fees:** -Transaction costs depend primarily on **data availability (DA)** rather than on whether a chain is L2 or L3. Since both can adopt AnyTrust DA, their fees are generally comparable. L3 is therefore not inherently cheaper than L2. Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1. +Transaction costs depend primarily on **data availability (DA),** not on whether a chain is built as an L2 or an L3. Since both can use AnyTrust DA, their fees are generally similar. Moreover, an L3 is not inherently cheaper because it must still post its data to the L2, which in turn posts data to L1. As a result, the L3 ultimately pays DA fees that settle on L1 as well. This means that the effective DA cost for L2s and L3s remains nearly the same, even when operating in full rollup mode.Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1. Even in rollup mode, the pricing difference between L2 and L3 for gas fees are very similar, since when data is posted to the L2 from the L3, the L2 still needs to post that data to the L1 for DA. meaning even on L3 you will still be paying L2 and L1 DA fees. diff --git a/scripts/notion-update.ts b/scripts/notion-update.ts index ddac262f73..30a886c30e 100644 --- a/scripts/notion-update.ts +++ b/scripts/notion-update.ts @@ -49,11 +49,12 @@ function renderQuestion(question: Question, linkableTerms: LinkableTerms): Rende const questionText = renderRichTexts(question.question, linkableTerms, RenderMode.Plain).trim(); const answerText = renderRichTexts(question.answer, linkableTerms, RenderMode.Markdown).trim(); - + const type = question.questionType; return { question: questionText, answer: answerText, key: generateQuestionKey(questionText), + category: type, }; } @@ -62,6 +63,7 @@ type RenderedQuestion = { question: string; // Plain text question answer: string; // Markdown formatted answer key: string; // URL-safe key + category: string[]; // Type of question (e.g. 'FAQ', 'Question', 'Answer') }; // Types @@ -326,7 +328,8 @@ const renderJSONQuestionStructuredData = (questions: RenderedQuestion[]): string const questionText = escapeForJSON(q.question); const answerText = escapeForJSON(q.answer); const questionKey = escapeForJSON(q.key); - return `{"question": "${questionText}","answer": "${answerText}","key": "${questionKey}"}`; + const category = escapeForJSON(q.category.join(', ')); + return `{"question": "${questionText}","answer": "${answerText}","key": "${questionKey}","category": "[${category}]"}`; }; return '[\n' + questions.map(printItem).join(',\n') + '\n]'; diff --git a/static/miscellaneous-qa.json b/static/miscellaneous-qa.json index 18b2a6a20f..608a460f61 100644 --- a/static/miscellaneous-qa.json +++ b/static/miscellaneous-qa.json @@ -2,811 +2,973 @@ { "question": "When building Orbit L2 and Orbit L3 on the mainnet, the advantages of L3 over L2 appear limited to lower gas fees, no Arbitrum DAO approval, and no license fee. Given perceived disadvantages like longer finality and increased bridge processing, what specific features highlight the advantages of Orbit L3? Data or experienced-based insights are needed regarding: 1) Customization, 2) Performance/Operational factors, and 3) Other aspects.", "answer": "The choice between Orbit L2 and L3 mainly depends on customization needs and settlement preferences. \n\nSome common points of confusion first:\n• **Arbitrum DAO approval:** Not required for Orbit L2 or L3.\n• **AEP license fee:** Applies only if the chain settles directly to Ethereum or any other parent chain. Avoided when settling to Arbitrum One or Nova.\n• **Finality & gas fees:** Comparable for L2 and L3 when using the same parent chain; AnyTrust mode provides low fees for both.\n\n**Key advantages of Orbit L3:**\n1. **Cost optimization:** Avoids AEP license fees by settling to Arbitrum One/Nova instead of Ethereum (**USP of L3**)\n2. **Customization:** Greater flexibility in settlement and configuration options, especially when leveraging a parent chain's AnyTrust setup.\n3. **Performance:** Faster, cheaper bridging to its parent chain.\n4. **Ecosystem alignment:** Stronger integration with the Arbitrum ecosystem, benefiting from shared tooling and potential ecosystem support.", - "key": "when-building-orbit-l2-and-orbit-l3-on-the-mainnet-the-advantages-of-l3-over-l2-appear-limited-to-lo" + "key": "when-building-orbit-l2-and-orbit-l3-on-the-mainnet-the-advantages-of-l3-over-l2-appear-limited-to-lo", + "category": "[]" }, { "question": "Regarding AnyTrust technology, assuming 500 GB of data is stored per month:\n1. What are the costs for DAS storage + server operations?\n2. What are the costs when using Celestia DAS?\n3. Are there any alternative methods recommended?\nAdditionally:\n• When using the DAS method, is the DACert generation cycle adjustable? How is it set up for Nova?\n• For Celestia DA, is the price per 1 MB sufficient, or are there other considerations?", "answer": "With AnyTrust, the **same set of entities act as both validators and committee members**, so no additional trust assumptions are needed.\n\n• **DACert Generation:** There is no fixed generation cycle. DACerts are created **immediately** upon each data store request from the batch poster.\n• **Data Posting Parameters:** DACert/data posting is triggered when either:\n ◦ `--node.batch-poster.max-size` (maximum estimated compressed batch size) is reached, or\n ◦ `--node.batch-poster.max-delay` (maximum batch posting delay) is reached.\n\n**Costs:**\nCelestia currently costs ~$0.08 USD / MB\nAn AnyTrust node will cost ~$200/node/month", - "key": "regarding-anytrust-technology-assuming-500-gb-of-data-is-stored-per-month-1-what-are-the-costs-for-d" + "key": "regarding-anytrust-technology-assuming-500-gb-of-data-is-stored-per-month-1-what-are-the-costs-for-d", + "category": "[]" }, { "question": "What is the optimal number of validators required to operate a mainnet at the scale of Arbitrum One or Arbitrum Nova? Additionally, how many validators currently participate as stakers in these networks?", "answer": "On **Arbitrum One**, validation is **permissionless** under the **[BoLD](https://docs.arbitrum.io/how-arbitrum-works/bold/gentle-introduction)** protocol. Any participant running a BoLD-capable Nitro validator can take part in validation, meaning the number of active validators (or stakers) is **not fixed** and fluctuates over time based on participation.\n\nIn contrast, **Arbitrum Nova** currently uses a **permissioned validation model**. Validation is handled by a set of **approximately 10 whitelisted validators**, with at least **five independent external challengers** apart from the operator to maintain security and integrity.\n\nFor up-to-date information on validator participation and network details, refer to:\n• [Arbitrum One – L2BEAT](https://l2beat.com/scaling/projects/arbitrum)\n• [Arbitrum Nova – L2BEAT](https://l2beat.com/scaling/projects/nova)", - "key": "what-is-the-optimal-number-of-validators-required-to-operate-a-mainnet-at-the-scale-of-arbitrum-one-" + "key": "what-is-the-optimal-number-of-validators-required-to-operate-a-mainnet-at-the-scale-of-arbitrum-one-", + "category": "[]" }, { "question": "Does the Validator receive and process user transactions directly from the RPC Node? It is understood that the RPC Provider represents an RPC Node, and that Validators and the Sequencer are independently connected. Is this understanding of the transaction flow correct?", - "answer": "**The understanding of the direct transaction flow is incorrect.**\nThe **Validator cannot queue transactions**. For a transaction to be valid, it must be queued by the **Sequencer**.\nThe correct flow is:\n1. A user submits a transaction to an **RPC Node**.\n2. The RPC Node **forwards** the transaction to the **Sequencer**.\n3. The Sequencer **queues and orders** the transaction.\n4. The Sequencer then sends the ordered transaction to the **Validator** via the **Sequencer Feed** for verification.\n\n**Even when a Validator endpoint acts as an RPC Provider, the transaction is immediately forwarded to the Sequencer for ordering, as the Validator's core function is verification.**", - "key": "does-the-validator-receive-and-process-user-transactions-directly-from-the-rpc-node-it-is-understood" + "answer": "**The understanding of the direct transaction flow is incorrect.**\nThe **Validator cannot queue transactions**. For a transaction to be valid, it must be queued by the **Sequencer**.\nThe correct flow is:\n1. A user submits a transaction to an **RPC Node**.\n2. The RPC Node **forwards** the transaction to the **Sequencer**.\n3. The Sequencer **queues and orders** the transaction.\n4. The Sequencer then sends the ordered transactions to the Validator through the Sequencer Feed. While the Validator can synchronize these transactions directly from the feed, it must still verify their correctness by referencing the corresponding data on the parent chain. This ensures that the final validation process is secured by the parent chain's canonical state.\n\n**Even when a Validator endpoint acts as an RPC Provider, the transaction is immediately forwarded to the Sequencer for ordering, as the Validator's core function is verification.**", + "key": "does-the-validator-receive-and-process-user-transactions-directly-from-the-rpc-node-it-is-understood", + "category": "[]" }, { "question": "Arbitrum Sepolia uses a Rollup method. Is there a separate Arbitrum Nova testnet available?", "answer": "**No.** Since the **UX** for Arbitrum Rollup and AnyTrust (Nova's underlying technology) is the same, **a separate AnyTrust testnet is not needed.**", - "key": "arbitrum-sepolia-uses-a-rollup-method-is-there-a-separate-arbitrum-nova-testnet-available" + "key": "arbitrum-sepolia-uses-a-rollup-method-is-there-a-separate-arbitrum-nova-testnet-available", + "category": "[]" }, { "question": "What is the theoretical maximum tps officially announced by Arbitrum and the prerequisites for it, and What is the realistic maximum tps possible in Arbitrum One and the prerequisites for it?", "answer": "In general we prefer to use throughput (gas /s) over TPS, as TPS is dependent on the transaction type. So for any throughput value you can just divide by the gas of your transaction to get TPS (standard is to use `eth_call` which is 22K gas)\n\n**OFFICIAL TPS:**the maximum official TPS for an orbit chain is, ~14,500 TPS:\n• 32M block gas limit\n• 100ms block times\n• eth_call transactions (22,000 gas/tx)\n• Standard hardwareThis value is useful for PEAK load that can be sustained. In practice, prices start to rise and demand slows down\n\n**REALISTIC TPS:**Taking historical data, during Arbitrum One's highest period of sustained peak usage, Arbitrum One operated at 50M gas/s for several hours. With modifications, several Orbit chains have sustained 100Mgas/s over multiple days with peaks of 400Mgas/s. These chains are built on AnyTrust DA which is our lowest cost configuration for an Orbit chainThe limitation in realistic cases is that higher gas prices caused users to delay their transactions, the hardware/chain operated completely normally.\n\nIt's worth noting, two major focuses on our roadmap:\n**1. Scalability**: We have several projects that will improve scalability to ensure Orbit chains can reach 100Megagas/s throughput (10^8 gas units, ~14.2x higher than the current sustainable limit).\n a. Dynamic Pricing: [https://blog.arbitrum.io/dynamic-pricing-explainer/](https://blog.arbitrum.io/dynamic-pricing-explainer/)\n b. Alt Client Developments: [https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/](https://blog.arbitrum.io/erigon-and-nethermind-join-arbitrum/)\n c. Nitro Max: we are internally benchmarking our node to allow Orbit chains to operate on higher hardware requirements\n\n**2. Fee Stabilization**\n a. We're exploring several levers / set ups that we can implement to allow partners to deploy a chain that has smoother or near-constant fees on the chain", - "key": "what-is-the-theoretical-maximum-tps-officially-announced-by-arbitrum-and-the-prerequisites-for-it-an" + "key": "what-is-the-theoretical-maximum-tps-officially-announced-by-arbitrum-and-the-prerequisites-for-it-an", + "category": "[]" }, { "question": "Are there any projects currently operating an L3 AnyTrust chain that settles on an L2 AnyTrust chain such as Arbitrum Nova? Additionally, when comparing Rollup and AnyTrust configurations—specifically L2 Rollup + L3 Rollup versus L2 Rollup + L3 AnyTrust—how do transaction fees differ on the L3?", "answer": "The only project that is an L3 AnyTrust chain settling on top of an L2 AnyTrust is Playblock. However, we don't encourage this setup.\n\nIn Arbitrum's design, transaction fees are determined by a **two-dimensional gas model**, consisting of:\n1. **Execution cost:** The fee paid on the child chain for computation, storage, and execution resources.\n2. **Data availability (DA) cost:** The fee paid on the parent chain for posting transaction data to ensure it is recorded and verifiable.\nWhen execution costs are comparable, the total transaction fee difference primarily depends on the **data availability layer** used. \n\n**AnyTrust mode** provides significantly lower DA costs than **Rollup mode**, so an **L3 AnyTrust chain** will generally have lower fees than an **L3 Rollup chain**, regardless of whether the parent L2 uses Rollup or AnyTrust.\n\nRefer explanation doc [here](https://medium.com/offchainlabs/understanding-arbitrum-2-dimensional-fees-fd1d582596c9).", - "key": "are-there-any-projects-currently-operating-an-l3-anytrust-chain-that-settles-on-an-l2-anytrust-chain" + "key": "are-there-any-projects-currently-operating-an-l3-anytrust-chain-that-settles-on-an-l2-anytrust-chain", + "category": "[]" }, { "question": "When connecting to an Orbit L3 node via an AWS Load Balancer (ELB) for HTTPS, issues are seen with Chain ID retrieval, token transfers, and Blockscout layout. The RPC (8449) and Blockscout (4000) ports are forwarded. Are more ports needed, or is the load balancer setup recommended?", "answer": "The current configuration, only exposing **ports 8449 and 4000**, should be sufficient if only those two services are needed.\n\nIt is recommended to **configure WS endpoint** as well. The issues described may be due to a **network problem**.\n\n• **Testing:** Test the connection **without the load balancer** to determine if the issues are caused by the load balancer itself.\n\nYes, it is better to have a load balancer.", - "key": "when-connecting-to-an-orbit-l3-node-via-an-aws-load-balancer-elb-for-https-issues-are-seen-with-chai" + "key": "when-connecting-to-an-orbit-l3-node-via-an-aws-load-balancer-elb-for-https-issues-are-seen-with-chai", + "category": "[]" }, { "question": "If a chain is built using Orbit L3, is it possible to issue USDC directly on the L3 through Circle?", "answer": "A **native deployment of USDC** on an Orbit L3 chain is technically possible; however, only **Circle** can authorize and perform such a deployment. In practice, obtaining a native USDC issuance on an L3 would require coordination and approval from Circle and would likely involve **significant cost and operational complexity**.", - "key": "if-a-chain-is-built-using-orbit-l3-is-it-possible-to-issue-usdc-directly-on-the-l3-through-circle" + "key": "if-a-chain-is-built-using-orbit-l3-is-it-possible-to-issue-usdc-directly-on-the-l3-through-circle", + "category": "[Others]" }, { "question": "If a custom gas token is used on the L3, does the batch poster need to hold ETH or ARB on the parent chain?", "answer": "It only needs to hold the **native gas token of the parent chain**, since it submits transactions there. For example, if the parent chain is **Arbitrum One or Arbitrum Nova**, the poster must hold **ETH**. The **ARB token is not used** as a gas token on any Arbitrum chain. [This document here](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer) may help understand more about Custom Gas Token on a rollup chain.", - "key": "if-a-custom-gas-token-is-used-on-the-l3-does-the-batch-poster-need-to-hold-eth-or-arb-on-the-parent-" + "key": "if-a-custom-gas-token-is-used-on-the-l3-does-the-batch-poster-need-to-hold-eth-or-arb-on-the-parent-", + "category": "[]" }, { "question": "Is it possible for an Orbit chain to process 1 billion transactions per day (over 10,000 TPS) by adjusting parameters such as block time, gas limit per block, or gas limit per second?", "answer": "Simply increasing configuration parameters like block time or gas limits provides only **limited performance improvement (And this can onlu higher upper limit)**, as the main bottleneck lies in **EVM execution speed** and **node performance (determines lower limit)**. Additionally, the **minimum gas cost per on-chain transaction (21,000 gas)** is fixed by the EVM and cannot be reduced.\n\nTo achieve higher throughput, it is recommended to:\n• **Aggregate transactions** before submitting them on-chain.\n• **Move computation off-chain** and store only the resulting state on-chain.\n• Utilize **Stylus (EVM+)**, which significantly improves execution efficiency and can help achieve higher TPS.\n\nFrom a technical standpoint, an Orbit chain with **default parameters** achieves a **maximum theoretical throughput of around 6,095 TPS**, but this can be configured up to **approximately 15,238 TPS** (benchmarked against `eth_call` transactions). \n\nMaximum TPS is primarily governed by two parameters:\n• **Block time:** Default is 250 ms, configurable down to 100 ms (a 2.5× increase in TPS).\n• **Gas limit per block:** Default is 32,000,000 gas, and increasing this further boosts TPS but also accelerates **state growth**.\n\nHowever, it's important to distinguish between **theoretical and practical performance**. In real-world conditions, considering hardware, network latency, and system overhead, an Orbit chain typically achieves **400–700 TPS**, or roughly **33–60 million transactions per day**.\n\nAny claims of **billion-scale daily on-chain throughput** should therefore be viewed skeptically, as such performance is not technically achievable within realistic system and EVM constraints.", - "key": "is-it-possible-for-an-orbit-chain-to-process-1-billion-transactions-per-day-over-10-000-tps-by-adjus" + "key": "is-it-possible-for-an-orbit-chain-to-process-1-billion-transactions-per-day-over-10-000-tps-by-adjus", + "category": "[]" }, { "question": "Isn't L3 generally understood to be cheaper than L2? What are the technical advantages of choosing L3 regarding customizability, performance, operational differences, and service operation based on platform experience?", - "answer": "For any Nitro chain is **execution plus data availability (DA)** . The main difference between Orbit L2 and L3 lies in the **settlement layer** (the parent chain), since both use the same **Nitro stack**. The assumption that L3 is cheaper is mostly outdated as both L2 and L3 **can** use **AnyTrust mode**, which allows for similarly low gas fees. However with rollup mode, the dominant cost is L1 data posting.\n\n**Gas Fees:**\nTransaction costs depend primarily on **data availability (DA)** rather than on whether a chain is L2 or L3. Since both can adopt AnyTrust DA, their fees are generally comparable. L3 is therefore not inherently cheaper than L2. Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1.\n\nEven in rollup mode, the pricing difference between L2 and L3 for gas fees are very similar, since when data is posted to the L2 from the L3, the L2 still needs to post that data to the L1 for DA. meaning even on L3 you will still be paying L2 and L1 DA fees.\n\n**One small point to note:**\n• If it's an L3 chain, the data will be posted to L2 first, afterwards it will be posted to L1 by the L2 chain.\n• If it's an L2 chain, then the data will be posted directly to L1. \n\n**Technical and Operational Advantages of L3:**\n• **Settlement Flexibility:** L3 can settle on an L2 such as Arbitrum One or Nova\n• **No AEP License Fee:** Chains settling on Arbitrum One or Nova avoid the AEP license fee that applies to L2s settling directly to Ethereum.", - "key": "isn-t-l3-generally-understood-to-be-cheaper-than-l2-what-are-the-technical-advantages-of-choosing-l3" + "answer": "For any Nitro chain is **execution plus data availability (DA)** . The main difference between Orbit L2 and L3 lies in the **settlement layer** (the parent chain), since both use the same **Nitro stack**. The assumption that L3 is cheaper is mostly outdated as both L2 and L3 **can** use **AnyTrust mode**, which allows for similarly low gas fees. However with rollup mode, the dominant cost is L1 data posting.\n\n**Gas Fees:**\nTransaction costs depend primarily on **data availability (DA),** not on whether a chain is built as an L2 or an L3. Since both can use AnyTrust DA, their fees are generally similar. Moreover, an L3 is not inherently cheaper because it must still post its data to the L2, which in turn posts data to L1. As a result, the L3 ultimately pays DA fees that settle on L1 as well. This means that the effective DA cost for L2s and L3s remains nearly the same, even when operating in full rollup mode.Since the DAcert from an L3 will be posted on the L2 which will then be posted to the L1.\n\nEven in rollup mode, the pricing difference between L2 and L3 for gas fees are very similar, since when data is posted to the L2 from the L3, the L2 still needs to post that data to the L1 for DA. meaning even on L3 you will still be paying L2 and L1 DA fees.\n\n**One small point to note:**\n• If it's an L3 chain, the data will be posted to L2 first, afterwards it will be posted to L1 by the L2 chain.\n• If it's an L2 chain, then the data will be posted directly to L1. \n\n**Technical and Operational Advantages of L3:**\n• **Settlement Flexibility:** L3 can settle on an L2 such as Arbitrum One or Nova\n• **No AEP License Fee:** Chains settling on Arbitrum One or Nova avoid the AEP license fee that applies to L2s settling directly to Ethereum.", + "key": "isn-t-l3-generally-understood-to-be-cheaper-than-l2-what-are-the-technical-advantages-of-choosing-l3", + "category": "[]" }, { "question": "If building an Orbit L3 chain designed to handle around 1 billion transactions per day (approximately 12,000 TPS assuming even distribution), how many feed relays, full nodes, sequencer relays, sequencers, and validators would be required? The assumption is 80% write activity, 10% execution, and 10% read activity. Can the High-Availability Sequencer Architecture support this throughput?", "answer": "The High-Availability Sequencer Architecture is designed to he more reliable than a normal sequencer in that its cannot fail to a single fault point. Before estimating node counts, it is important to understand how **full nodes** and **sequencers** share responsibilities:\n• **Read operations (calls):**\n\nRead-only queries are handled directly by full nodes without involving the sequencer. Read capacity scales horizontally—adding more full nodes increases read throughput. On average, a full node can handle around **1,000–1,500 read requests per second**. To support **10,000 RPS**, roughly **8–10 full nodes** would be needed, with additional nodes recommended for redundancy and traffic spikes.\n• **Write operations (transactions):**\n\nAll transactions are sent from full nodes to the sequencer, which orders and executes them. Only the sequencer determines transaction ordering, while full nodes follow and execute in that sequence. Write throughput does **not** scale with the number of full nodes; it is constrained by the **sequencer's single-threaded performance** and the ability of full nodes to keep up.\n\nThe current Arbitrum network sustains around **7–12 million gas per second**, translating to roughly **500–600 simple ETH transfers per second.** Actual performance will vary depending on hardware, configuration, and transaction complexity.\n\n**Key Takeaway:**\n• **Read capacity** can be increased by running additional full nodes.\n• **Write capacity** depends on the sequencer's processing power rather than the number of nodes. Along with the power of the full nodes, since they need to be able to keep up with the sequencers transactions.\n• The **High-Availability Sequencer Architecture** can be modified for more reliability within the network.", - "key": "if-building-an-orbit-l3-chain-designed-to-handle-around-1-billion-transactions-per-day-approximately" + "key": "if-building-an-orbit-l3-chain-designed-to-handle-around-1-billion-transactions-per-day-approximately", + "category": "[]" }, { "question": "Are there any validator nodes directly operated by Arbitrum?", "answer": "Yes, we (Offchain Labs) run some validators.", - "key": "are-there-any-validator-nodes-directly-operated-by-arbitrum" + "key": "are-there-any-validator-nodes-directly-operated-by-arbitrum", + "category": "[]" }, { "question": "How does the sequencer handle transaction surges? For instance, if 100,000 transactions are submitted simultaneously, will all be processed eventually, or will some fail? Additionally, in such cases, is it necessary to use Retryable Tickets to ensure reliable processing?", "answer": "The sequencer maintains an internal **transaction queue** to handle incoming transactions. When multiple valid and properly priced transactions arrive simultaneously, they are placed in this queue and processed sequentially over subsequent blocks until the backlog clears. The queue can hold approximately **1,000 transactions by default**, and any remaining transactions will get rejected if they cannot get in the queue within 12 seconds.\n\nSince the **EVM executes transactions sequentially**, the sequencer can process only one transaction at a time. Transactions can fail in the sequencer or during execution. They will fail in the sequencer if a transaction has an incorrect nonce, incorrect signature, insufficient funds, anything that can be checked before execution which will lead to the transaction never being executed. Transactions can also fail mid execution do to reverting which can happen for many many reasons. In cases of sustained congestion, underpriced transactions may be dropped, requiring resubmission with a higher fee.\n\nThe **queue timeout** is roughly **12 seconds **by default, after which unprocessed transactions may be removed if not yet included in a block.\n\n**Retryable Tickets** are *not* used for standard user transactions within an Orbit chain. They are designed for **cross-chain communication** (e.g., L1 → L2 or L2 → L3) to provide a censorship-resistant fallback path, not for managing local transaction load or congestion.\n\nFor setups requiring guaranteed service continuity, refer to the [High-Availability Sequencer documentation](https://docs.arbitrum.io/run-arbitrum-node/sequencer/high-availability-sequencer-docs).", - "key": "how-does-the-sequencer-handle-transaction-surges-for-instance-if-100-000-transactions-are-submitted-" + "key": "how-does-the-sequencer-handle-transaction-surges-for-instance-if-100-000-transactions-are-submitted-", + "category": "[]" }, { "question": "In the case of Arbitrum one, the soft limit is 7M gas/s, and if the soft limit is exceeded, a congestion fee is paid, but transaction processing can increase?", "answer": "Yes", - "key": "in-the-case-of-arbitrum-one-the-soft-limit-is-7m-gas-s-and-if-the-soft-limit-is-exceeded-a-congestio" + "key": "in-the-case-of-arbitrum-one-the-soft-limit-is-7m-gas-s-and-if-the-soft-limit-is-exceeded-a-congestio", + "category": "[]" }, { "question": "Arbitrum One's gas per second limit is reportedly 7 M Gas/s. However, ChainSpect shows a max TPS of 1,358 tx/s. Mathematically, 7 M Gas/s seems to correspond to ~333 TPS. How does the 1,358 TPS figure arise?\n\nAdditionally, under what conditions could the theoretical maximum of 40,000 TPS be achieved?", "answer": "The **7 M Gas/s** is a **soft limit**, not a hard cap. It represents the sustainable throughput target. If the network gas usage exceeds this value, the gas price increases to moderate demand, but transactions can still exceed the soft limit.\n\n• The observed **1,358 TPS** reflects real-world transactions where blocks may temporarily exceed the soft limit, and transactions vary in gas cost, allowing higher throughput than a simple calculation .\n• The **theoretical maximum TPS of 40,000** assumes idealized conditions with **unlimited hardware performance**, minimal transaction gas, and optimal block settings.\n• **Hard limits** are defined by node parameters, e.g., minimum block time of 0.25 s and max gas per block of 32 M, which would theoretically allow up to 128 M gas/s.\n\nSoft limits regulate network congestion, while hard limits define absolute technical boundaries.", - "key": "arbitrum-one-s-gas-per-second-limit-is-reportedly-7-m-gas-s-however-chainspect-shows-a-max-tps-of-1-" + "key": "arbitrum-one-s-gas-per-second-limit-is-reportedly-7-m-gas-s-however-chainspect-shows-a-max-tps-of-1-", + "category": "[]" }, { "question": "INFO [06-24|21:31:27.118] InboxTracker sequencerBatchCount=12 messageCount=40 l1Block=8,618,759 l1Timestamp=2025-06-24T15:22:39+0900\n\nWhat does sequencerBatchCount=12 mean and what does messageCount mean here? Does sequencerBatchCount mean that the next batch posting order is 12? And is messageCount the number of L2 blocks so far or is it another messageCount? What does message mean here?", "answer": "sequencerBatchCount=12 means your node's inbox tracker already tracked 12 batches from inbox. messageCount=40 means the messages number your node tracked and stored. `sequencerBatchCount` doesn't mean the batchposter will post this count batch next, but it might just indicate your node is still syncing, and next will sync this batch number, the batchposter might already posted a much higher batch number.", - "key": "info-06-24-21-31-27-118-inboxtracker-sequencerbatchcount-12-messagecount-40-l1block-8-618-759-l1time" + "key": "info-06-24-21-31-27-118-inboxtracker-sequencerbatchcount-12-messagecount-40-l1block-8-618-759-l1time", + "category": "[Node Operations]" }, { "question": "INFO [06-24|21:46:38.382] Waiting for more batches to post next assertion latestStakedAssertionBatchCount=12 latestStakedAssertionBlockHash=0xa34898fd\n\nI have a question related to the above, and looking at the log above, is it true that assertions are not processed if the number of batches submitted is small, regardless of the assertion interval? And what is the assertion interval?", "answer": "No, this just because your node is still syncing and catching up, I will contact team to modify this log to make it more clear.", - "key": "info-06-24-21-46-38-382-waiting-for-more-batches-to-post-next-assertion-lateststakedassertionbatchco" + "key": "info-06-24-21-46-38-382-waiting-for-more-batches-to-post-next-assertion-lateststakedassertionbatchco", + "category": "[Node Operations]" }, { "question": "But could you explain a little more about the role and function of the jwt file here?", "answer": "The jwt there will be used when nitro serves `validation_*`, this is used for validator validation communication, you can explore more about this when you test [split validator](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node).", - "key": "but-could-you-explain-a-little-more-about-the-role-and-function-of-the-jwt-file-here" + "key": "but-could-you-explain-a-little-more-about-the-role-and-function-of-the-jwt-file-here", + "category": "[Node Operations]" }, { "question": "When withdrawing ETH from an Orbit L3 to Ethereum L1, does it take 7 days for L3 → L2 finalization and another 7 days for L2 → L1 finalization? Since L2 blocks are generated faster, shouldn't the L3 → L2 withdrawal take less time? What are the minimum and maximum withdrawal times for L3 → L2 and L2 → L1?", "answer": "The **7-day withdrawal period** is not determined by block time but by the **fraud-proof (challenge) window** used for **censorship resistance** and **security guarantees**.\n\n• On **L2 → L1**, the 7-day window is fixed on Arbitrum Rollup chains to allow participants to challenge potentially invalid state transitions.\n• On **L3 → L2**, the withdrawal period depends on the **L3's configuration**. An L3 can set a **shorter challenge window** or implement **fast withdrawal mechanisms** to accelerate the process.\n\nIn summary:\n• **L3 → L2:** Duration is configurable; can be shorter or near-instant if fast withdrawals are enabled.\n• **L2 → L1(Arbitrum 1 → Ethereum Main-net ):** Typically **~7 days**, as defined by Arbitrum's fraud-proof protocol. This 7 day protocol can be configured fewer or more days at the risk of potential malicient but \nThus, total withdrawal time from **L3 → L1** can range from **near-instant (with fast withdrawals)** to **around 14 days** under default Rollup challenge windows.", - "key": "when-withdrawing-eth-from-an-orbit-l3-to-ethereum-l1-does-it-take-7-days-for-l3-l2-finalization-and-" + "key": "when-withdrawing-eth-from-an-orbit-l3-to-ethereum-l1-does-it-take-7-days-for-l3-l2-finalization-and-", + "category": "[]" }, { "question": "The default value below is 95000. Does this refer to a single transaction?--execution.sequencer.max-tx-data-size int", "answer": "Yes", - "key": "the-default-value-below-is-95000-does-this-refer-to-a-single-transaction-execution-sequencer-max-tx-" + "key": "the-default-value-below-is-95000-does-this-refer-to-a-single-transaction-execution-sequencer-max-tx-", + "category": "[]" }, { "question": "INFO [06-24|21:31:41.878] DelayedSequencer: Sequenced              msgnum=1 startpos=24\nINFO [06-24|21:31:42.699] Reading message result remotely.         msgIdx=40\n\n\nWhat messages does the msgIdx above mean (is it L2 block order number?) and what do the startpos and msgnum above mean here ?", "answer": "Yes, you can roughly think the message here is block number, blocks was produced from message, as you asked a lot of questions regarding batch, segments and blocks, I would suggest you to take a look at [go-batchHandler](https://github.com/OffchainLabs/go-batchhandler), it can help you understand what the relationships among them.", - "key": "info-06-24-21-31-41-878-delayedsequencer-sequenced-msgnum-1-startpos-24-info-06-24-21-31-42-699-read" + "key": "info-06-24-21-31-41-878-delayedsequencer-sequenced-msgnum-1-startpos-24-info-06-24-21-31-42-699-read", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "https://explorer.anime.xyz/tx/0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4 For the transaction record above, Gas used for L1 is listed as 0. Please explain why.", "answer": "Gas estimation is based on previous data, so if the previous tx over paid the L1 gas cost, then next one will cost less, so sometimes it comes out some tx pays `0` L1 gas.", - "key": "https-explorer-anime-xyz-tx-0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4-for-t" + "key": "https-explorer-anime-xyz-tx-0x46e9e376fd80dc9a67e7607880c9aaedc5cf56ad29238bddf53237db14a03ba4-for-t", + "category": "[]" }, { "question": "Does the rollback above mean that the amount sent from A to B is returned from B to A and the fee is also refunded? If so, is it usually displayed as revert in explore in this case? Please answer. Thank you.", "answer": "The re-org in Blockchain means: Let's assume there is a block A (at timestamp T1) with state root S1, and after 3 mins, the blockchain goes to Block B (at timestamp T2, T2=T1+3mins) with state root S2, then the reorg happens, the chain has to reorg to Block A, so at this time, the whole blockchain's state will rollback to S1 too, so no matter what happens after S1, all state will come back to what it was at S1, including your account's balance (So instead of refund, I would say it as fallback). And all those tx after S1 will discard, the explore will even don't show those tx.", - "key": "does-the-rollback-above-mean-that-the-amount-sent-from-a-to-b-is-returned-from-b-to-a-and-the-fee-is" + "key": "does-the-rollback-above-mean-that-the-amount-sent-from-a-to-b-is-returned-from-b-to-a-and-the-fee-is", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "While testing the sequencer stability on an Orbit L3 chain, sending over 2,000 transactions per second, the base gas fee increased sharply and consumed excessive SepoliaETH. Why did this happen, and how can the base fee be fixed?", "answer": "When sending a large amount of TPS (2000 achieves this) It will cause Arbitrum one to go over its 7 million gas a second speed limit. Once gas per second goes over this [speed limit](https://docs.arbitrum.io/launch-arbitrum-chain/maintain-your-chain/guidance/state-size-limit#what-is-the-speed-limit-on-an-arbitrum-chain), gas prices will increase.", - "key": "while-testing-the-sequencer-stability-on-an-orbit-l3-chain-sending-over-2-000-transactions-per-secon" + "key": "while-testing-the-sequencer-stability-on-an-orbit-l3-chain-sending-over-2-000-transactions-per-secon", + "category": "[]" }, { "question": "Is the Gas Used For L1 displayed in blockscout the actual cost of batch posting or an estimated cost? Is this fee deposited into the Sequencer Fee Pool?", "answer": "It (Gas Used For L1) is an estimated cost based on previous data. \n\nYes, the fee will deposit to `L1PricerFundsPoolAddress` first and send to `feeCollector` later.", - "key": "is-the-gas-used-for-l1-displayed-in-blockscout-the-actual-cost-of-batch-posting-or-an-estimated-cost" + "key": "is-the-gas-used-for-l1-displayed-in-blockscout-the-actual-cost-of-batch-posting-or-an-estimated-cost", + "category": "[]" }, { "question": "What portion of the transaction fee serves as sequencer revenue (e.g., L1/L2 gas, base, and congestion fees)?In an Orbit L3 chain, the batch poster posts to its parent chain (L2). It appears that part of the L3 transaction fee is deposited to the batch poster's L2 address. How exactly is the user-paid transaction fee routed to the batch poster's address?", "answer": "Refer [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/aep-fee-router/calculate-aep-fees#sequencing-revenue) for sequencer revenue\n\nThe sequencer's revenue and fee flow are determined by how the Orbit chain's fee components are configured. There are four main fee types on an Orbit chain:\n\n1. **L2 Base Fee:**\nThis represents the minimum execution fee for processing transactions on the chain. It is deposited into the **infraFeeAccount**, which can be configured via `ArbOwner.setInfraFeeAccount()`.\n\n2. **L2 Surplus Fee:**\nWhen the network experiences congestion and users pay above the base fee, the surplus portion is directed to the **networkFeeAccount**, set through `ArbOwner.setNetworkFeeAccount()`.\n\n3. **L1 Base Fee:**\nThis covers the cost of posting transaction batches to the parent chain. These funds are ultimately paid to the **fee collector** of the **active batch poster**. The batch poster is designated using `SequencerInbox.setIsBatchPoster()` on the parent chain, and its fee collector can be set via `ArbAggregator.setFeeCollector()`.Note: These payments occur **on the child chain**, even though the costs correspond to activity on the parent chain.\n\n4. **L1 Surplus Fee:**\nAny additional rewards associated with batch posting are paid to a specific **L1RewardRecipient**, which can be configured via `ArbOwner.setL1PricingRewardRecipient()`.\n\nIn summary, part of the transaction fee that users pay on the child chain is allocated to cover the posting cost. Then tge fee is directed to the those configured **address** on child chain(or its configured fee collector) as reimbursement for posting batches to the parent chain.\n\nFor more details on fee distribution, please refer to [this documentation](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#parent-chain-costs).", - "key": "what-portion-of-the-transaction-fee-serves-as-sequencer-revenue-e-g-l1-l2-gas-base-and-congestion-fe" + "key": "what-portion-of-the-transaction-fee-serves-as-sequencer-revenue-e-g-l1-l2-gas-base-and-congestion-fe", + "category": "[]" }, { "question": "Could you explain the three config differences in more detail?", "answer": "(config 1)`--node.bold.minimum-gap-to-parent-assertion duration` : If validator creates assertion A, and this validator wants to create assertion B which connect to assertion A, the minimum time gap between assertion A and B(config 2)`--node.staker.make-assertion-interval duration` Your node's minimum time gap during making assertions. (config 3) `--node.bold.assertion-posting-interval duration`(for bold) Your node's minimum time gap during making assertions. (for legacy)If you are deploying your node using the latest version, your node are at bold version. (edited) [https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node)", - "key": "could-you-explain-the-three-config-differences-in-more-detail" + "key": "could-you-explain-the-three-config-differences-in-more-detail", + "category": "[]" }, { "question": "If L2 ETH for batch posting is deposited in the L2 feeCollector, payment must be made in L1 ETH when the Batch Poster delivers the batch to L1. How does bridging L2 ETH to L1 ETH work?", "answer": "You can just use the token bridge to withdraw your token to parent chain.\n\nHere is an example UI for Arbitrum One: [https://portal.arbitrum.io/bridge](https://portal.arbitrum.io/bridge). \n\nYou can also interact with bridge contract to withdraw back, [here](https://docs.arbitrum.io/arbitrum-bridge/quickstart) is the related document.", - "key": "if-l2-eth-for-batch-posting-is-deposited-in-the-l2-feecollector-payment-must-be-made-in-l1-eth-when-" + "key": "if-l2-eth-for-batch-posting-is-deposited-in-the-l2-feecollector-payment-must-be-made-in-l1-eth-when-", + "category": "[]" }, { "question": "WARN [06-30|12:21:15.071] Could not confirm assertion err=\"posting this transaction will exceed max mempool size: transaction nonce: 25, unconfirmed nonce: 24, max mempool size: 1\" assertionHash=6ee7ff..925542", "answer": "This happens because your staker just sent a tx to l1 and it hasn't been confirmed, did you restart the node not long ago? If not, you can wait some time to see if it can be resolved, usually when the tx 24 confirmed, this warn will be disappeared. You can also check if there is something preventing your validator's tx hasn't been confirmed for a long time (like balance, rpc endpoint and gas).", - "key": "warn-06-30-12-21-15-071-could-not-confirm-assertion-err-posting-this-transaction-will-exceed-max-mem" + "key": "warn-06-30-12-21-15-071-could-not-confirm-assertion-err-posting-this-transaction-will-exceed-max-mem", + "category": "[Node Operations]" }, { "question": "When the sequencer receives more than 2,000 transactions per second, do those transactions accumulate in a queue and get processed in the order they arrive? If the sequencer queue has a fixed size, what happens to transactions that exceed the queue limit, and how many can wait?", "answer": "Arbitrum's sequencer does **not use a traditional mempool**. Unlike Ethereum, there is no mechanism for reordering transactions by tip or fee priority.\nWhen a large number of transactions arrive simultaneously:\n• Transactions that fit into the **sequencer queue** (default size: **1,024**) are processed in **FIFO (first-in, first-out)** order.\n• Transactions arriving while the queue is full are handled in **non-deterministic (random)** order once space becomes available.\n• If a transaction is not added to the sequencer queue within the **queue timeout** (default: **12 seconds**), it will **fail** and return an error to the sender.\n\nThe number of transactions that can wait outside the sequencer queue is limited by the **sequencer's available RAM**. A well-configured sequencer will begin **rejecting new transactions** once memory usage reaches safe operational limits to maintain stability.", - "key": "when-the-sequencer-receives-more-than-2-000-transactions-per-second-do-those-transactions-accumulate" + "key": "when-the-sequencer-receives-more-than-2-000-transactions-per-second-do-those-transactions-accumulate", + "category": "[]" }, { "question": "Is the Sequencer Fee Pool Model currently applied to the Orbit chain? How can one find the address of the Sequencer Fee Pool?", "answer": "Yes, it applies to orbit chains.\n\n`infraFeeAccount` :`ArbOwnerPublic.getInfraFeeAccount()` \n`networkFeeAccount` : `ArbOwnerPublic.getNetworkFeeAccount()` `FeeCollectors` : `ArbAggregator.getPreferredAggregator(batchPosterAddress)` \n`L1RewardRecipient` :`ArbGasInfo.getL1RewardRecipient()`\n\nThose precompiles addresses can be found [here](https://docs.arbitrum.io/build-decentralized-apps/reference/contract-addresses#precompiles) .", - "key": "is-the-sequencer-fee-pool-model-currently-applied-to-the-orbit-chain-how-can-one-find-the-address-of" + "key": "is-the-sequencer-fee-pool-model-currently-applied-to-the-orbit-chain-how-can-one-find-the-address-of", + "category": "[]" }, { "question": "Can I ignore the warning below? It won't keep coming up.\n\nWARN [06-24|21:31:39.004] error finding requested sequence number in backlog: sending the entire backlog instead err=\"error finding backlog segment containing message with SequenceNumber 40\"", "answer": "Yes", - "key": "can-i-ignore-the-warning-below-it-won-t-keep-coming-up-warn-06-24-21-31-39-004-error-finding-request" + "key": "can-i-ignore-the-warning-below-it-won-t-keep-coming-up-warn-06-24-21-31-39-004-error-finding-request", + "category": "[Node Operations]" }, { "question": "How many batches must be submitted to generate an assertion? Even if only one batch is submitted, will an assertion be generated after a certain amount of time? (What is the relevant configuration?)", "answer": "The assertion creation doesn't have a strong relationship to batch amount, as your batchposter's message number higher than the latest one recorded on parent chain, then the batch poster can post the batch. Related setting is `--node.bold.assertion-posting-interval` (bold) or `--node.staker.make-assertion-interval` (legacy)", - "key": "how-many-batches-must-be-submitted-to-generate-an-assertion-even-if-only-one-batch-is-submitted-will" + "key": "how-many-batches-must-be-submitted-to-generate-an-assertion-even-if-only-one-batch-is-submitted-will", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "How many blocks can a batch poster contain at minimum and maximum, and how many transactions must be included to create a batch?", "answer": "It depends on the tx size, we don't usually say how many tx or blocks here, but how much sizes those tx are, the flag is ``--node.batch-poster.max-size``", - "key": "how-many-blocks-can-a-batch-poster-contain-at-minimum-and-maximum-and-how-many-transactions-must-be-" + "key": "how-many-blocks-can-a-batch-poster-contain-at-minimum-and-maximum-and-how-many-transactions-must-be-", + "category": "[Performance & Scalability]" }, { "question": "What are the current hardware specifications of the nodes that make up Arbitrum one, which is currently being operated by offchain labs?(sequencer, validator, full node, relay, etc.)", "answer": "Most of our instances run on a cloud provider and we use Kubernetes to orchestrate the deployment and management of services. As a reminder, Arbitrum One is unique: it was the first L2 blockchain to launch and has been in production for over 3 years. The types of applications and what users do on Arbitrum One is likely to be very different from any other chain and so I'd ask that you keep this in mind while comparing your chain's hardware configurations and performance.\n\n• Our sequencer runs a minimum of: 10 CPU cores, 90GB of RAM, and a fairly large local NVMe drive, specifically ~6.6TB in size. On AWS, we use `i7ie.3xlarge`.\n• The archive node runs on: 2 CPU cores, 40GB RAM, and a large 16TB `gp3` high iops volume\n• Validators run on a minimum of 3 CPU cores, 32GB RAM, and a 4TB `gp3` high iops volume\n• Regular RPC nodes we run are roughly 4 CPU cores and 32GB RAM.\n\n Note that most professional node operators for RPC nodes (e.g. Alchemy, Infura, Quicknode, etc) run way larger machines to serve RPC calls because those companies sell RPC-as-a-service for their business and so they have higher requirements for uptime and performance. We do not do that since we do not serve high volume, production calls on our RPC nodes - our RPC nodes are public and free and therefore have a lower requirement for all those things i mention above (latency, perf, uptime, etc)\n\nFor setting up own chain, we do recommend HA set ups. [This repository of helm charts might be valuable to your team](https://github.com/OffchainLabs/community-helm-charts). Again, we want to emphasize that these specifications are for Arbitrum One and its demand/load profile. A new chain or a different chain will have a different demand/load profile and set of users and apps that may mean your chain will use more or less than what Arbitrum One uses. Generally, I believe that better hardware and better configurations/setups in your DevOps environment lead to better outcomes: being able to handle more throughput, transactions, and offering better latency.We're continuously and currently doing optimization work to both increase performance for the same hardware, as well as doing benchmarking to see what performance and throughput look like at higher hardware tiers.", - "key": "what-are-the-current-hardware-specifications-of-the-nodes-that-make-up-arbitrum-one-which-is-current" + "key": "what-are-the-current-hardware-specifications-of-the-nodes-that-make-up-arbitrum-one-which-is-current", + "category": "[]" }, { "question": "Is there a way to prevent the base fee from increasing during congestion, and how long does it take to return to normal after congestion clears?", "answer": "C Currently there is no way to lock the base fee, however the chain owner is able to increase the speed limit of their chain along with some other configurations which will mitigate the increase during congestion\n\nArbitrum is also **exploring mechanisms to smooth out fee volatility** and better isolate Orbit chains from **L1 gas price fluctuations**.", - "key": "is-there-a-way-to-prevent-the-base-fee-from-increasing-during-congestion-and-how-long-does-it-take-t" + "key": "is-there-a-way-to-prevent-the-base-fee-from-increasing-during-congestion-and-how-long-does-it-take-t", + "category": "[]" }, { "question": "The default value below is 1024. Does this mean that 1024 transactions can be queued at once? If the remaining 1024 is exceeded, will the user receive a network busy error?How is the time for processing and sending a single transaction from the queue adjusted, and how long is it?--execution.sequencer.queue-size int", "answer": "No, the queue-size here means the tx number reach to sequencer but haven't been queued yet, if 1024 exceed and the tx can't be added in 12 s, user will get error like `context deadline exceeded`", - "key": "the-default-value-below-is-1024-does-this-mean-that-1024-transactions-can-be-queued-at-once-if-the-r" + "key": "the-default-value-below-is-1024-does-this-mean-that-1024-transactions-can-be-queued-at-once-if-the-r", + "category": "[User Economics & Chain Maintenance]" }, { "question": "INFO [06-24|21:31:59.632] validated execution                      messageCount=40 globalstate=\"BlockHash: 0x0a3e00344c3951143eb0f21020d3188ee175ae0de2401b81a799b05dc3a138a8, SendRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, Batch: 12, PosInBatch: 0\" WasmRoots=[0x184884e1eb9fefdc158f6c8ac912bb183bf3cf83f0090317e0bc4ac5860baa39]\n\n\nDoes the messageCount mentioned above refer to the number of the last posted L2 blocks? Does the Batch 12 mentioned above mean that the 12th batch submitted by the batch poster is brought to the validator and verified? Does the PosInBatch: 0 mentioned above mean that there is only one batch? Or what does it mean?", "answer": "Although messages here can be used to produce block, but I don't suggest you understand it as block. Yes, batch 12 here means this validator verified to batch 12 and PosInBatch means the position in batch, (because batch can divided into different segments) not means batch number.", - "key": "info-06-24-21-31-59-632-validated-execution-messagecount-40-globalstate-blockhash-0x0a3e00344c395114" + "key": "info-06-24-21-31-59-632-validated-execution-messagecount-40-globalstate-blockhash-0x0a3e00344c395114", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "What determines when batches are generated and posted from a child chain to its parent chain? It appears that a batch is not created for every block. What are the specific criteria for batch generation?", "answer": "Batch generation and posting are governed by both **time-based** and **size-based** criteria. The **batch poster** submits a batch to the parent chain when **either** of the following conditions is met:\n1. **Time limit reached:**\n ◦ Controlled by the parameter `--node.batch-poster.max-delay`, which defines the **maximum duration** allowed between batch postings (assuming there is activity and the poster is properly funded).\n2. **Size limit reached:**\n ◦ For **calldata batches**, controlled by `--node.batch-poster.max-size`.\n ◦ For **EIP-4844 (blob) batches** (applicable to L2s), controlled by `--node.batch-poster.max-4844-batch-size`.\n\nIn practice, this means a batch is posted **either after a set time interval** or **once enough transaction data has accumulated** to reach the configured maximum batch size. As a result, batches do not correspond one-to-one with blocks on the child chain — multiple blocks may be included in a single batch.\n\n**Default values:\n**`--node.batch-poster.max-delay` : default 1h0m0s\n`--node.batch-poster.max-size` : default 100000", - "key": "what-determines-when-batches-are-generated-and-posted-from-a-child-chain-to-its-parent-chain-it-appe" + "key": "what-determines-when-batches-are-generated-and-posted-from-a-child-chain-to-its-parent-chain-it-appe", + "category": "[]" }, { "question": "What is the config that adjusts the block creation cycle and the number or amount of transactions that can be contained in a single block? If there are no transactions, will an empty block be created after 72 hours like the config below? What is the related config?--node.batch-poster.max-empty-batch-delay duration (default: 72h0m0s)", "answer": "The flag which can adjust the block creation cycle is `--execution.sequencer.max-block-speed` , I would suggest you to go through this [code](https://github.com/OffchainLabs/nitro/blob/master/execution/gethexec/sequencer.go#L1451-L1458), the sequencer will try to create the block every `MaxBlockSpeed` , and if no tx, the return of `createBlock` will be false. \nAs for **--node.batch-poster.max-empty-batch-delay**, yes, this will make batchposter sends an empty batch to l1, and this will results in a new delayed message `batchpostingReport` created, and this will cause a new block on l2.", - "key": "what-is-the-config-that-adjusts-the-block-creation-cycle-and-the-number-or-amount-of-transactions-th" + "key": "what-is-the-config-that-adjusts-the-block-creation-cycle-and-the-number-or-amount-of-transactions-th", + "category": "[Node Operations]" }, { "question": "Does Arbitrum One also manually bridging the ETH required for batchposter?", "answer": "This can be done by an automatic script and the logic is relatively easy.", - "key": "does-arbitrum-one-also-manually-bridging-the-eth-required-for-batchposter" + "key": "does-arbitrum-one-also-manually-bridging-the-eth-required-for-batchposter", + "category": "[]" }, { "question": "When a log occurs because the batch poster has no balance, the batch poster's balance is increased, but the batch posting occurs after some time after the balance is charged. How long after the balance is charged is posting possible? And what are the related confirmation logic intervals and configs?", "answer": "The minimum check time period is 10 s. however, there is no logs [here](https://github.com/OffchainLabs/nitro/blob/master/arbnode/dataposter/data_poster.go#L1117), I will forward this to our team and maybe add a new log there.\n\n(Data entry note, as of right now it does not seem there is a log at this function)", - "key": "when-a-log-occurs-because-the-batch-poster-has-no-balance-the-batch-poster-s-balance-is-increased-bu" + "key": "when-a-log-occurs-because-the-batch-poster-has-no-balance-the-batch-poster-s-balance-is-increased-bu", + "category": "[Node Operations]" }, { "question": "Please check if the log interpretation below is correct.\n\nINFO [06-24|21:31:12.131] BatchPoster: batch sent sequenceNumber=11 from=38 to=40 prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0\n\nThe batch sequence number is 11th and includes L2 Block 38 to 40. (Is this interpretation correct?) / But what does prevDelayed=23 currentDelayed=24 totalSegments=4 numBlobs=0 mean here ?", "answer": "Yes, you are right, `preDelayed` means before this batch, how many delayed tx from parent chain are accepted, and `currentDelayed` means after this batch, how many delayed tx are accepted. The totalSegments means how many seg messages are in this batch, it can be user tx batch or also time update message (tell the network to advance timestamp) and so on, all seg message types are [here](https://github.com/OffchainLabs/nitro/blob/master/arbstate/inbox.go#L187-L191). numBlobs=0 which means this batch doesn't post eip4844 blobs.", - "key": "please-check-if-the-log-interpretation-below-is-correct-info-06-24-21-31-12-131-batchposter-batch-se" + "key": "please-check-if-the-log-interpretation-below-is-correct-info-06-24-21-31-12-131-batchposter-batch-se", + "category": "[Others]" }, { "question": "While testing an Orbit L3 node, an issue occurred when using the eth_getLogs query. The problem was traced to a block range exceeding 10,000 blocks. Chainstack, the node provider, mentioned that Arbitrum recommends keeping the block range per eth_getLogs query under 10,000 blocks to avoid errors and performance issues. How can the block range for eth_getLogs be adjusted on the Orbit L3 chain? For context and logs refer here - https://offchainlabs.slack.com/archives/C08373EP1QQ/p1761783628215019?thread_ts=1761726622.755719&cid=C08373EP1QQ", "answer": "This issue originates from the node responding to an `invalid block range` parameter in the client's `eth_getLogs` query, not from the parent chain or the node provider. The error indicates that the **client is requesting logs with a block range larger than what the node supports**. To resolve this, you'll need to adjust the query parameters on the **client side**, ensuring that each request spans **no more than 10,000 blocks**.\n\nAdditionally, if you encounter the error `wrong msgIdx got 167230 expected 167228`, this points to **database inconsistency** between components of your node setup. Resetting only one database can create further synchronization issues.\n\nIf the chain is running in **Rollup mode**, the recommended fix is to **delete the entire database** (typically located at `/home/user/.arbitrum/`) and **resync the node** from the parent chain. This ensures full consistency across databases and resolves the indexing mismatch.", - "key": "while-testing-an-orbit-l3-node-an-issue-occurred-when-using-the-eth-getlogs-query-the-problem-was-tr" + "key": "while-testing-an-orbit-l3-node-an-issue-occurred-when-using-the-eth-getlogs-query-the-problem-was-tr", + "category": "[]" }, { "question": "Regarding the configuration below, the default value is 100000. If the compression rate is 11, how many transactions can be included on average?", "answer": "Sorry, different tx has different size, there is no correct way to estimate it, but you can check our mainnet as an example: [https://arbiscan.io/batches](https://arbiscan.io/batches).", - "key": "regarding-the-configuration-below-the-default-value-is-100000-if-the-compression-rate-is-11-how-many" + "key": "regarding-the-configuration-below-the-default-value-is-100000-if-the-compression-rate-is-11-how-many", + "category": "[Performance & Scalability]" }, { "question": "what a customized relayer cache is and how transactions are processed by adding a customized relayer cache to the High-availability sequencer diagram to make it easier to understand?", "answer": "This is an example scenario to explain the solution when sening more transactions than the sequencer's pending transaction queue can handle.\n\nThe general idea is to deploy a relayer that holds the transactions and sends them to the sequencer once the sequencer is able to process them.\n\nIt can also be configured to increase your sequencer's pending transaction queue capacity:\n• `--execution.sequencer.queue-size` (default: 1024)\n• `--execution.sequencer.queue-timeout` (default: 12s) by setting \n\nThese parameters to higher values, you can increase the sequencer's pending transaction queue size.", - "key": "what-a-customized-relayer-cache-is-and-how-transactions-are-processed-by-adding-a-customized-relayer" + "key": "what-a-customized-relayer-cache-is-and-how-transactions-are-processed-by-adding-a-customized-relayer", + "category": "[]" }, { "question": "Batch posters seem to bridge the fees received from L2 to L1 fees at regular intervals. What is the frequency?", "answer": "Those funds (network revenue) will be paid to child chain `feeCollector` and will not bridge to L1 automatically.Those funds will be paid after each time batch posting.", - "key": "batch-posters-seem-to-bridge-the-fees-received-from-l2-to-l1-fees-at-regular-intervals-what-is-the-f" + "key": "batch-posters-seem-to-bridge-the-fees-received-from-l2-to-l1-fees-at-regular-intervals-what-is-the-f", + "category": "[]" }, { "question": "How is the compression rate of 11 calculated?", "answer": "Brotli:11 is best ratio level of compression, you can find it at google's [paper](https://github.com/google/brotli/blob/master/docs/brotli-comparison-study-2015-09-22.pdf).", - "key": "how-is-the-compression-rate-of-11-calculated" + "key": "how-is-the-compression-rate-of-11-calculated", + "category": "[Performance & Scalability]" }, { "question": "What is the posting interval for batch posters? (What is the related configuration?)", "answer": "When the batch poster has at least 1 useful tx, it will wait until whether `--node.batch-poster.max-delay` reaches or `--node.batch-poster.max-size` (calldate posting) / `--node.batch-poster.max-4844-batch-size` (blob posting) reaches, default values for those 2 is 1h0m0s and 100000 bytes(calldata posting) or 0 (blob posting based on parent chain config). Or if there is no tx recorded, batch poster will post an empty batch after `--node.batch-poster.max-empty-batch-delay` .", - "key": "what-is-the-posting-interval-for-batch-posters-what-is-the-related-configuration" + "key": "what-is-the-posting-interval-for-batch-posters-what-is-the-related-configuration", + "category": "[Node Operations]" }, { "question": "How does gas price fluctuation on Arbitrum compare to Ethereum, where it increases or decreases within a 12.5% range depending on network congestion?", "answer": "Arbitrum's gas pricing mechanism works differently from Ethereum's.\n\nOn **Ethereum**, the base fee adjusts by up to **±12.5% per block** based on how full the previous block was.\nOn **Arbitrum**, the gas price remains fixed at the **MinimumL2BaseFee** until **real-time gas usage exceeds the network's gas speed limit**. Once that threshold is crossed, the base fee increases dynamically according to network backlog using the following formula:\n**`F = exp(-a(B - b))`**\nWhere:\n• **F** = current base fee\n• **B** = gas backlog\n• **a** = parameter controlling how fast the fee rises with congestion\n• **b** = threshold backlog before the escalation begins\n\nThis model allows Arbitrum to respond smoothly to congestion, scaling gas prices based on actual network pressure rather than per-block fullness.\n\nMore information can be found in [this documentation](https://docs.arbitrum.io/how-arbitrum-works/state-transition-function/arbos#child-chain-gas-fees).", - "key": "how-does-gas-price-fluctuation-on-arbitrum-compare-to-ethereum-where-it-increases-or-decreases-withi" + "key": "how-does-gas-price-fluctuation-on-arbitrum-compare-to-ethereum-where-it-increases-or-decreases-withi", + "category": "[]" }, { "question": "The poster fee for an Orbit L3 test chain has increased by about tenfold since yesterday. Could this be caused by the network status of Arbitrum Sepolia, or is there another reason?", "answer": "On Orbit chains, the **batch poster fee** is directly influenced by the **L1 gas price** on the parent chain. If the chain is using **Arbitrum Sepolia** as its parent, any spike in **Sepolia's L1 gas price** will cause the batch posting cost to rise — sometimes by a factor of ten or more. This behavior is expected, as the posting fee scales with the parent chain's gas price.", - "key": "the-poster-fee-for-an-orbit-l3-test-chain-has-increased-by-about-tenfold-since-yesterday-could-this-" + "key": "the-poster-fee-for-an-orbit-l3-test-chain-has-increased-by-about-tenfold-since-yesterday-could-this-", + "category": "[]" }, { "question": "If traffic continues to come in at over 100,000 bytes per Tx(s), how fast can batches be done?", "answer": "It will check if batch can be posted every 10s, so answer to this is around 10s. (And you also need to wait the tx confirm time on l1, which is not fixed, some time it will be very fast but some time it may need you to wait several mins or even more)", - "key": "if-traffic-continues-to-come-in-at-over-100-000-bytes-per-tx-s-how-fast-can-batches-be-done" + "key": "if-traffic-continues-to-come-in-at-over-100-000-bytes-per-tx-s-how-fast-can-batches-be-done", + "category": "[Performance & Scalability]" }, { "question": "Can the withdrawal time from L3 to Arbitrum One (L2) be reduced compared to the withdrawal time from Arbitrum One (L2) to Ethereum (L1)?", "answer": "Yes, anytrust can enable fast withdrawal which can be reduced to **15 mins **for L2s**, **and** 15 seconds** for L3s**. **AnyTrust chains are already placing a trust assumption on their Data Availability Committee (DAC) to provide the data needed for fraud proofs and recreating the chain.It is possible for an Arbitrum chain Rollup to adopt fast withdrawals. However, it would technically no longer be a Rollup as the minimum trust assumption will shift to the trust placed in the Fast Confirmations committee. related [docs](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced-configurations/fast-withdrawals)", - "key": "can-the-withdrawal-time-from-l3-to-arbitrum-one-l2-be-reduced-compared-to-the-withdrawal-time-from-a" + "key": "can-the-withdrawal-time-from-l3-to-arbitrum-one-l2-be-reduced-compared-to-the-withdrawal-time-from-a", + "category": "[Performance & Scalability, User Economics & Chain Maintenance]" }, { "question": "In this case, I am curious about why weth and multi call use the existing contracts together and what their roles are.", "answer": "weth and multi call are usually specific to the chain and be a constant contract, like on ethereum sepolia, because lof of users will use those 2 contracts, there is no need to deploy a new one when a new user uses it, so when deploy a new chain, the parent chain's weth and multi call contracts we will use the universal one.", - "key": "in-this-case-i-am-curious-about-why-weth-and-multi-call-use-the-existing-contracts-together-and-what" + "key": "in-this-case-i-am-curious-about-why-weth-and-multi-call-use-the-existing-contracts-together-and-what", + "category": "[]" }, { "question": "What does \"resolve any unconfirmed assertions\" mean in resolve node explanation? (What does resolve mean here?) This is a question from another team member. Is \"resolve any unconfirmed assertions\" performed by the rollup contract rather than the validator?", "answer": "The assertion life cycle is: `assertion created` -> `assertion waiting for challenge` -> `assertion confirmed` in happy case. The resolve mean confirm an assertion, arbitrum is optimistic rollup, the l1 will not do any execution when there is no challenge, so needs to be resolved on rollup contract by validator after it created, I would highly recommend you go through those docs (**[Validation and Proving Mechanisms](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving)**, [rollup protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/rollup-protocol) and [challenge protocol](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/proving-and-challenges)) for a better understanding.", - "key": "what-does-resolve-any-unconfirmed-assertions-mean-in-resolve-node-explanation-what-does-resolve-mean" + "key": "what-does-resolve-any-unconfirmed-assertions-mean-in-resolve-node-explanation-what-does-resolve-mean", + "category": "[]" }, { "question": "How can I call smart contract functions and listen to events emitted by said contracts (Original question asked specifically about changing transaction fee receiver and how to call/read smart contract functions/events)", "answer": "This is the [example](https://github.com/OffchainLabs/arbitrum-orbit-sdk/blob/main/examples/setup-fee-distributor-contract/index.ts) has code to call arbOwner contract, it is about how to call `arbOwner.setInfraFeeAccount`The contract interface is [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbOwner.sol#L111).\nyou can use ethers.js to filter those events, here is the [docs](https://docs.ethers.org/v5/concepts/events/).Those events belongs to Rollup and challengeManager.", - "key": "how-can-i-call-smart-contract-functions-and-listen-to-events-emitted-by-said-contracts-original-ques" + "key": "how-can-i-call-smart-contract-functions-and-listen-to-events-emitted-by-said-contracts-original-ques", + "category": "[]" }, { "question": "Is there a difference in network fees when executing the same kind of transaction on Orbit L2 and Orbit L3?", "answer": "There is no difference of network fee between L2 and L3 chains, but due to parent chain's gas prices changes, the child chain gas will be different in different time.", - "key": "is-there-a-difference-in-network-fees-when-executing-the-same-kind-of-transaction-on-orbit-l2-and-or" + "key": "is-there-a-difference-in-network-fees-when-executing-the-same-kind-of-transaction-on-orbit-l2-and-or", + "category": "[Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "I want to estimate how much transaction fee a batch poster, sequencer, or validator submits to L1 per month, which config should I check and at what cycle should I multiply * tx average?", "answer": "While using math is possible, the easiest and preferred way to do this is to just monitor the batch poster and validator directly to keep track of their funds and how much they used", - "key": "i-want-to-estimate-how-much-transaction-fee-a-batch-poster-sequencer-or-validator-submits-to-l1-per-" + "key": "i-want-to-estimate-how-much-transaction-fee-a-batch-poster-sequencer-or-validator-submits-to-l1-per-", + "category": "[]" }, { "question": "Where is the RPC code located", "answer": "For rpc each specific methods implementation, you can check code here. http/ws processing here", - "key": "where-is-the-rpc-code-located" + "key": "where-is-the-rpc-code-located", + "category": "[Integration & Development]" }, { "question": "what are the roles of the nativeToken contract and adminProxy here, and why is validatorWalletCreator needed?", "answer": "native token here is 0x0 means you use ethers as gas token, if it is other value, then means this chain will use that as gas token. About proxyAdmin, you can check oz docs. validatorWalletCreator can be used to create wallet for validator to ensure the funds safety.", - "key": "what-are-the-roles-of-the-nativetoken-contract-and-adminproxy-here-and-why-is-validatorwalletcreator" + "key": "what-are-the-roles-of-the-nativetoken-contract-and-adminproxy-here-and-why-is-validatorwalletcreator", + "category": "[]" }, { "question": "if i use the same validator address as a Makenode address at first and then change it to defensive mode, does it re-stacking every time i change the mode?For example, as i can see below, the money is spent twice.https://sepolia.etherscan.io/address/0x65fF9E2256CBaE32f8Ae18776cF1e66A2BEa436d (Mode : MakeNode->defensive) (twice out)https://sepolia.etherscan.io/address/0x9699040F6e8A10F6831884966ceBfaa2E50fe59B (Mode change is not sure but twice out)In this case, how can I withdraw the stake I made in the previous mode? Could you please guide me on the specific method?", "answer": "No, it will just **need** stake once, the stake token of your chain is weth (wrapped ethers, which is an erc20 type of ethers). You can click [here](https://sepolia.etherscan.io/address/0x65ff9e2256cbae32f8ae18776cf1e66a2bea436d#tokentxns) to see your weth transfer history, then you will see there is only 1 time that your address transfer the weth token to your rollup contract, although you deposited twice (2 ethrs), only 1 weth is spent and your address still has 1 weth left, you can check it [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#readContract)  by call `balanceOf` and input is your address, if you want to withdraw weth back to eth, then use your address to connect to etherscan and call withdraw [here](https://sepolia.etherscan.io/address/0x7b79995e5f793a07bc00c21412e50ecae098e7f9#writeContract).", - "key": "if-i-use-the-same-validator-address-as-a-makenode-address-at-first-and-then-change-it-to-defensive-m" + "key": "if-i-use-the-same-validator-address-as-a-makenode-address-at-first-and-then-change-it-to-defensive-m", + "category": "[]" }, { "question": "is it possible to set up SSL or TLS in the application layer", "answer": "There is no application-level ssl setting for nitro, you need to use a Reverse Proxy or cloud hosting solutions.", - "key": "is-it-possible-to-set-up-ssl-or-tls-in-the-application-layer" + "key": "is-it-possible-to-set-up-ssl-or-tls-in-the-application-layer", + "category": "[Integration & Development]" }, { "question": "The Arbitrum developer documentation states that fast withdrawal is only recommended on the Anytrust chain. What would the reason be?", "answer": "The reason fast withdrawals is only recommended for AnyTrust chains relates to the trust assumptions involved.For AnyTrust chains: The optimal setup is to have all Data Availability Committee (DAC) members also run validators as part of the fast withdrawals committee. This approach leverages the existing trust assumption placed on the DAC operators such that enabling fast withdrawals does not add any new trusted parties.For Rollup chains: While it is possible for an Arbitrum Rollup chain to adopt fast withdrawals, it would technically no longer be a Rollup as the minimum trust assumption will shift to additional trust assumptions. Because rollup mode is designed as trustless, whether to add additional trust assumptions or not needs further thinking.", - "key": "the-arbitrum-developer-documentation-states-that-fast-withdrawal-is-only-recommended-on-the-anytrust" + "key": "the-arbitrum-developer-documentation-states-that-fast-withdrawal-is-only-recommended-on-the-anytrust", + "category": "[Performance & Scalability]" }, { "question": "How can I change the batchPoster", "answer": "[In development guide to how to change your batch poster](https://github.com/OffchainLabs/arbitrum-docs/pull/2382/files)", - "key": "how-can-i-change-the-batchposter" + "key": "how-can-i-change-the-batchposter", + "category": "[]" }, { "question": "Would there be any suggestion to reduce the transaction network fee, which currently costs 31,749 gas, to $0.00001?", "answer": "1. Adjust gas price setting: Configure node parameters and contract settings to set a lower base fee ceiling.\n2. Batch Operations: Set a higher max batch size which can provide some very slightly support here.\n3. Configure Soft Gas Limit: Adjust the gas limit settings to maintain lower base fees during normal operation\n4. Note: If you are trying to lower down the gas price and increase the tps, you need to make sure your hardware can handle it or it may cause network nodes down.", - "key": "would-there-be-any-suggestion-to-reduce-the-transaction-network-fee-which-currently-costs-31-749-gas" + "key": "would-there-be-any-suggestion-to-reduce-the-transaction-network-fee-which-currently-costs-31-749-gas", + "category": "[User Economics & Chain Maintenance]" }, { "question": "Why is the L1 contract not responsible for checking the validity of an assertions instead of the validators", "answer": "You can check our docs [here](https://docs.arbitrum.io/how-arbitrum-works/validation-and-proving/validation-and-proving). Arbitrum is optimistic rollup, optimistic means l1 will optimistically think every assertion is correct rather than rollup will auto verify it. So during a time if no challenge happens, validator will call l1 contract to resolve it. So you are also right, L1 contract is the one that resolves it, but needs validator to call it.", - "key": "why-is-the-l1-contract-not-responsible-for-checking-the-validity-of-an-assertions-instead-of-the-val" + "key": "why-is-the-l1-contract-not-responsible-for-checking-the-validity-of-an-assertions-instead-of-the-val", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "Is it possible to make the block creation cycle 4 times a second with a certain configurations", "answer": "this config will set the fastest block time to 250 ms, which means the sequencer will try to create block every 250ms, but if last block creation time too long (too many tx) or there is no new tx, the block time gap won't exactly equal to 250ms, but longer than this, so there is no fixed block time on l2.", - "key": "is-it-possible-to-make-the-block-creation-cycle-4-times-a-second-with-a-certain-configurations" + "key": "is-it-possible-to-make-the-block-creation-cycle-4-times-a-second-with-a-certain-configurations", + "category": "[Node Operations, Performance & Scalability]" }, { "question": "What is the mempool (L1)", "answer": "The mempool is a place where pending L1 transactions wait to be picked up and executed on by an eth node", - "key": "what-is-the-mempool-l1" + "key": "what-is-the-mempool-l1", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "How can I adjust batch and asseration cycles? Which flags should I set?", "answer": "You can adjust the timing and behavior of the **Batch Poster** and **Assertion** cycles using the following flags:\n**\n1. Batch Poster Flags**\n`--node.batch-poster.max-delay` **Maximum batch processing delay.\n**`--node.batch-poster.poll-interval` **Polling interval** - The time to wait between checking if a batch is ready to be posted.\n`--node.batch-poster.error-delay` **Error delay** - The time to wait after an error posting a batch.\n`--node.batch-poster.wait-for-max-delay` Wait for the maximum delay even if the batch is full.\n`--node.batch-poster.max-empty-batch-delay` Maximum delay before an empty batch can be posted.\n**\n2. Assertion Flags (BOLD)**\n\nThese flags are specific to the **BOLD** assertion strategy.\n`--node.bold.assertion-posting-interval`**Assertion posting interval.\n**`--node.bold.assertion-scanning-interval`**Assertion scanning interval** - The time to wait between scanning for newly created on-chain assertions.\n`--node.bold.assertion-confirming-interval`**Assertion confirming interval** - The time to wait between attempts to confirm assertions.\n`--node.bold.minimum-gap-to-parent-assertion` minimum duration to wait since the parent assertion was created to post a new assertion\n**\n3. Assertion Flags (Legacy)**\n\n`# Staker Interval - The frequency to check L1 rollup state and potentially take action.\n--node.staker.staker-interval\n\n# Make Assertion Interval - The frequency to create a new assertion when using the MakeNodes strategy.\n--node.staker.make-assertion-interval`", - "key": "how-can-i-adjust-batch-and-asseration-cycles-which-flags-should-i-set" + "key": "how-can-i-adjust-batch-and-asseration-cycles-which-flags-should-i-set", + "category": "[Node Operations]" }, { "question": "what are the min and max TX sizes that Batcher submits to L1 in the case where there is no user TX and only system TX, and when user TX is full during batching? And in this case, can it be converted to gas only rather than datasize?", "answer": "When tx total size (both user tx and system tx) equal or higher than `--node.batch-poster.max-size`, then it will post batch. The units of this is byte, default 100000 means 100000 bytes.", - "key": "what-are-the-min-and-max-tx-sizes-that-batcher-submits-to-l1-in-the-case-where-there-is-no-user-tx-a" + "key": "what-are-the-min-and-max-tx-sizes-that-batcher-submits-to-l1-in-the-case-where-there-is-no-user-tx-a", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "even if there is only a single small transaction in a batch, will it still be posted in an hour", "answer": "Small tx is also useful tx, any user's tx accepted by sequencer will be set as useful tx. So the batch will still be posted after 1 hour.", - "key": "even-if-there-is-only-a-single-small-transaction-in-a-batch-will-it-still-be-posted-in-an-hour" + "key": "even-if-there-is-only-a-single-small-transaction-in-a-batch-will-it-still-be-posted-in-an-hour", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "Among the MakeNode, Validator, and Resolve nodes, is MakeNode the only required element (mandatory)?", "answer": "Technically, yes, you only need MakeNode is enough, but to increase the safety, it would be better to have more validators.", - "key": "among-the-makenode-validator-and-resolve-nodes-is-makenode-the-only-required-element-mandatory" + "key": "among-the-makenode-validator-and-resolve-nodes-is-makenode-the-only-required-element-mandatory", + "category": "[]" }, { "question": "Ethereum increases or decreases the Base Fee within a range of 12.5% depending on whether 50% of the block is filled. What is the basis for Arbitrum's Base Fee fluctuations?", "answer": "There is a soft gas limit on Arbitrum chains. The default setting is 7m/s. If the gas spent rate is higher than this limit, the network fee will be increased. \nFormula: See Arbitrum Gas Fees Documentation ([https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-fees))\nThe soft limit is configurable in node configuration.", - "key": "ethereum-increases-or-decreases-the-base-fee-within-a-range-of-12-5-depending-on-whether-50-of-the-b" + "key": "ethereum-increases-or-decreases-the-base-fee-within-a-range-of-12-5-depending-on-whether-50-of-the-b", + "category": "[User Economics & Chain Maintenance, Performance & Scalability, Node Operations]" }, { "question": "WARN [06-09|12:11:15.821] Getting file info dir=/home/ellena/nitro_build_2025_06/nitro/machines error=\"stat /home/ellena/nitro_build_2025_06/nitro/machines: no such file or directory\"", "answer": "When you run the binary and get this error, this means you don't download the replay binary, you can download it by run `scripts/download-machine.sh` in nitro and copy it to the related machines dir.\nOr if you are doing some customization to STF, you need to build it your self by `make build-replay-env` and make sure you set the new wasm module root to your on chain contract too.", - "key": "warn-06-09-12-11-15-821-getting-file-info-dir-home-ellena-nitro-build-2025-06-nitro-machines-error-s" + "key": "warn-06-09-12-11-15-821-getting-file-info-dir-home-ellena-nitro-build-2025-06-nitro-machines-error-s", + "category": "[Node Operations, Integration & Development]" }, { "question": "What is --node.batch-poster.poll-interval duration for", "answer": "This sets the interval for checking and sending batches", - "key": "what-is-node-batch-poster-poll-interval-duration-for" + "key": "what-is-node-batch-poster-poll-interval-duration-for", + "category": "[Node Operations]" }, { "question": "In this case, can you tell me why the weth address is called when staking and how it moves from there to the rollup contract?", "answer": "Your rollup contract uses weth as stake token, and the node needs to call weth contract to convert ethers to weth. Because weth is erc20 token, the erc20 token can be transfered by its method `transferFrom` on contract, [here](https://www.linkedin.com/pulse/erc20-decoded-understanding-approvals-allowances-frederick-van-staden) is an article talks about how erc20 token works.", - "key": "in-this-case-can-you-tell-me-why-the-weth-address-is-called-when-staking-and-how-it-moves-from-there" + "key": "in-this-case-can-you-tell-me-why-the-weth-address-is-called-when-staking-and-how-it-moves-from-there", + "category": "[]" }, { "question": "So, does that mean that a validator in makenode mode can make assertions even if there is no new batch? I thought that makenode meant submitting a new assertion to a new batch that is different from the existing one.", "answer": "No, no relationships I mean is no need to have any specific amount of batch to post the assertion, if your batch number higher than last assertion's, then you are good to post the new one. related logic [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/RollupCore.sol#L471).", - "key": "so-does-that-mean-that-a-validator-in-makenode-mode-can-make-assertions-even-if-there-is-no-new-batc" + "key": "so-does-that-mean-that-a-validator-in-makenode-mode-can-make-assertions-even-if-there-is-no-new-batc", + "category": "[]" }, { "question": "-> --node.bold.assertion-posting-interval (bold) or --node.staker.make-assertion-interval (legacy) What are the differences between these two?", "answer": "The first one is used for validators using the BoLD protocol, the second one is used for validators running the legacy protocol.", - "key": "node-bold-assertion-posting-interval-bold-or-node-staker-make-assertion-interval-legacy-what-are-the" + "key": "node-bold-assertion-posting-interval-bold-or-node-staker-make-assertion-interval-legacy-what-are-the", + "category": "[]" }, { "question": "How much ETH should I fund when running a Sequencer that also participates as a Validator?", "answer": "**Sequencer and Validator typically should NOT run on the same node.** However, if asking about funding requirements for the address/wallet: the ETH needed equals the Validator's requirements, plus BatchPoster requirements if you're also running that component. The exact amount varies significantly based on chain activity.", - "key": "how-much-eth-should-i-fund-when-running-a-sequencer-that-also-participates-as-a-validator" + "key": "how-much-eth-should-i-fund-when-running-a-sequencer-that-also-participates-as-a-validator", + "category": "[Blockchain/Architecture Fundamentals, Node Operations]" }, { "question": "Do all L1→L2 message go through the inbox contract?", "answer": "Yes, even for bridge contract, it will finally call inbox's `createRetryableTicket` , for more about l1->l2 message, please refer to [this](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging) docs.", - "key": "do-all-l1-l2-message-go-through-the-inbox-contract" + "key": "do-all-l1-l2-message-go-through-the-inbox-contract", + "category": "[]" }, { "question": "When I try to build nitro binary, I get the following error: make: wat2wasm: No such file or directory", "answer": "You need to make sure you installed all **prerequisites **mentioned in this page: [https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally](https://docs.arbitrum.io/run-arbitrum-node/nitro/build-nitro-locally)", - "key": "when-i-try-to-build-nitro-binary-i-get-the-following-error-make-wat2wasm-no-such-file-or-directory" + "key": "when-i-try-to-build-nitro-binary-i-get-the-following-error-make-wat2wasm-no-such-file-or-directory", + "category": "[Node Operations, Integration & Development]" }, { "question": "What are all configurations to improve TPS, and what hardware requirements are there to do so", "answer": "This is a frequently asked question, and we usually don't say TPS on arbitrum, but gas used per second, currently the gas used per second soft limit on arb1 is 7m, if the ratio higher than this number, then gas price will increase, but if you want to adjust the soft limit, you can call ``ArbOwner.SetSpeedLimit``. So if you want to have a higher gas efficiency, I would recommend you to use stylus for contract deployment, for what is stylus, you can check the docs. So why increase the tps harder in decentralized netwrok? Because there will be a lot of fullnodes might join the network, it's easy to increase your own node's performance, but if only your node's performance increased, the other node can't catch up which might cause many users can't follow up the chain and might cause some potential issues.", - "key": "what-are-all-configurations-to-improve-tps-and-what-hardware-requirements-are-there-to-do-so" + "key": "what-are-all-configurations-to-improve-tps-and-what-hardware-requirements-are-there-to-do-so", + "category": "[]" }, { "question": "And what exactly is the role of the rollup event box?", "answer": "You can take a look at rollupEventBox [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/rollup/AbsRollupEventInbox.sol), it has a function `rollupInitialized` which can be used to report init message.", - "key": "and-what-exactly-is-the-role-of-the-rollup-event-box" + "key": "and-what-exactly-is-the-role-of-the-rollup-event-box", + "category": "[]" }, { "question": "What are the differences between fullnode, validator, archive node, and sequencer? How do these node types relate to each other in the Nitro stack?", "answer": "**Fullnode:** Syncs chain state and serves RPC requests\n**Validator:** Validates based on posted batches and posts assertions to parent chain, will also challenge current assertions if they deem it malicious or incorrect\n**Archive Node:** Fullnode that retains all historical state\n**Sequencer:** Orders transactions and produces blocks (not a fullnode)\n**Batchposter: **Posts queued tx by sequencer to partent chain.", - "key": "what-are-the-differences-between-fullnode-validator-archive-node-and-sequencer-how-do-these-node-typ" + "key": "what-are-the-differences-between-fullnode-validator-archive-node-and-sequencer-how-do-these-node-typ", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "What is the minimum network fee (in USD) we can set for our blockchain, and what technical limitations prevent setting it lower?", "answer": "The minimum `minL2BaseFee` is currently **0.0001**. Setting it lower than this threshold may cause overflow issues in the system.", - "key": "what-is-the-minimum-network-fee-in-usd-we-can-set-for-our-blockchain-and-what-technical-limitations-" + "key": "what-is-the-minimum-network-fee-in-usd-we-can-set-for-our-blockchain-and-what-technical-limitations-", + "category": "[User Economics & Chain Maintenance, Performance & Scalability]" }, { "question": "The code below may not be perfect, but it is a temporary test result. As you can see from the results, only 91 were successful when 500 were sent per second. What configuration should I change to increase TPS?", "answer": "I don't know how your script looks like so I have no idea if that failed due to which reason, your tx also might failed because the nonce reason or others when send a batch of txes. But to increase your chain's soft gas limit per second, call ``ArbOwner.SetSpeedLimit``` and use stylus contract to increase the gas efficiency.", - "key": "the-code-below-may-not-be-perfect-but-it-is-a-temporary-test-result-as-you-can-see-from-the-results-" + "key": "the-code-below-may-not-be-perfect-but-it-is-a-temporary-test-result-as-you-can-see-from-the-results-", + "category": "[]" }, { "question": "How can I get all my core contracts address of my orbit chain?", "answer": "There is a method named `getCoreContracts()` in chain-sdk, you can get it from your rollup deployment tx receipt.", - "key": "how-can-i-get-all-my-core-contracts-address-of-my-orbit-chain" + "key": "how-can-i-get-all-my-core-contracts-address-of-my-orbit-chain", + "category": "[Integration & Development]" }, { "question": "When using a custom gas token in Orbit L3, Batchposter exchanges it for ETH and pays the transaction fee to the parent chain. Can a custom gas token be used even if it is not a listed token or there is no standard for measuring its value? If you could share details regarding using relayer option as you mentioned during the call, that would be appreciated as well.", "answer": "Yes, a custom gas token can be used even if it's not a listed token, but it must meet specific requirements:\n**Requirements:\n**Must be a standard ERC-20 tokenTransfers and approvals \nmust occur directly via the token contract, not via proxies or hooks\nMust not be rebasing or include transfer fees\nMust not use transfer callbacks or any onchain behavior that reverts if the sender and recipient are the same\n**Fee Token Pricer Contract**: You need to deploy a fee token pricer. Here are 3 types of this pricer contract: Understanding the Fee Token Pricer ([https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup#understanding-the-fee-token-pricer))Fee token pricer is a contract to tell your network the exchange rate between your custom token and ethers.", - "key": "when-using-a-custom-gas-token-in-orbit-l3-batchposter-exchanges-it-for-eth-and-pays-the-transaction-" + "key": "when-using-a-custom-gas-token-in-orbit-l3-batchposter-exchanges-it-for-eth-and-pays-the-transaction-", + "category": "[Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "WARN [07-01|18:57:19.915] Could not succeed function after retries retryCount=15 err=\"could not get assertion creation block for assertion hash 0x34de67082eeaddc3977bcc5a7d4a1e2b4649925b6e18300879c446717dba675c: execution reverted: ASSERTION_NOT_EXIST\"", "answer": "Your staker tries to read an assertion but it is not exsited.\nThe most possible reason is because your rpc node has some issues or it hasn't synced to the latest block. Try change to another parent chain endpoint and see if it gets resolved.", - "key": "warn-07-01-18-57-19-915-could-not-succeed-function-after-retries-retrycount-15-err-could-not-get-ass" + "key": "warn-07-01-18-57-19-915-could-not-succeed-function-after-retries-retrycount-15-err-could-not-get-ass", + "category": "[]" }, { "question": "Regarding the Base Fee, L2 (Arbitrum Sepolia) is approximately 100 times more expensive than L1 (Ethereum Sepolia) on the Testnet. However, on the Mainnet side, L2 is approximately 20 times cheaper. Would there be certain reason for that?", "answer": "This is because many devs choose the Arbitrum Sepolia as the testnet and they sent a lot of testing tx on Arb Sepolia, which causes this gas price to continue to be high.", - "key": "regarding-the-base-fee-l2-arbitrum-sepolia-is-approximately-100-times-more-expensive-than-l1-ethereu" + "key": "regarding-the-base-fee-l2-arbitrum-sepolia-is-approximately-100-times-more-expensive-than-l1-ethereu", + "category": "[Performance & Scalability, Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "What is the difference between the batchPoster and the batchPosterManager", "answer": "batchPosterManager has the permission to add or remove batch poster by `setIsBatchPoster` , source code [here](https://github.com/OffchainLabs/nitro-contracts/blob/main/src/bridge/SequencerInbox.sol#L814). While the batch poster posts batches", - "key": "what-is-the-difference-between-the-batchposter-and-the-batchpostermanager" + "key": "what-is-the-difference-between-the-batchposter-and-the-batchpostermanager", + "category": "[]" }, { "question": "Up until now, in order to pay the L2 tx fee, I used the deposit function call from L1 to L2 to transfer money, but is it not possible to randomly create money in the network itself without transferring money from L1 to L2 to a specific account in and without transfering from other account in L2 itself?", "answer": "Do you mean if it's possible to \"create\" or \"mint\" ethers on Layer 2 directly? The answer to this question is no, because l2 can withdraw funds back to l1 and if you create new ethers on l2, which means you can create ethers on l1 too, that is not allowed", - "key": "up-until-now-in-order-to-pay-the-l2-tx-fee-i-used-the-deposit-function-call-from-l1-to-l2-to-transfe" + "key": "up-until-now-in-order-to-pay-the-l2-tx-fee-i-used-the-deposit-function-call-from-l1-to-l2-to-transfe", + "category": "[]" }, { "question": "do eth_get functions (read only) charge a transaction fee?", "answer": "No", - "key": "do-eth-get-functions-read-only-charge-a-transaction-fee" + "key": "do-eth-get-functions-read-only-charge-a-transaction-fee", + "category": "[]" }, { "question": "Is there a config that affects the RPS of the newly built node, not the TPS? Is it true that the RPS is only affected by the CPU performance, memory, and network performance of the node rather than the config?In the newly built Nitro node, where is the part of the code that handles the function (Get by Blocknumber or) (eth_raw_sendTransaction) and what are the factors that affect each RPS and TPS performance (how are they different)?", "answer": "There is no flag to set that.The code that handles those rpc requests is [here](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/eth/backend.go) ([https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go](https://github.com/OffchainLabs/go-ethereum/blob/711e36f828bf2e8d7e9f617b941c47948db0704b/internal/ethapi/api.go)). The serve time depends on your machines, and there is some flag to set the max-timeout:\n\n`--execution.rpc.evm-timeout duration timeout used for eth_call (0=infinite) (default 5s)\n --execution.rpc.filter-timeout duration log filter system maximum time filters stay active (default 5m0s)\n --execution.rpc.gas-cap uint cap on computation gas that can be used in eth_call/estimateGas (0=infinite) (default 50000000)`", - "key": "is-there-a-config-that-affects-the-rps-of-the-newly-built-node-not-the-tps-is-it-true-that-the-rps-i" + "key": "is-there-a-config-that-affects-the-rps-of-the-newly-built-node-not-the-tps-is-it-true-that-the-rps-i", + "category": "[Performance & Scalability, Node Operations]" }, { "question": "Is moving from a L3 to an L2 possible and if so is it easy", "answer": "technically it is possible, but it's not easy as you need to re-deploy all contracts and migrate some states also you need to continue to run the l3 node to provide historical state querying", - "key": "is-moving-from-a-l3-to-an-l2-possible-and-if-so-is-it-easy" + "key": "is-moving-from-a-l3-to-an-l2-possible-and-if-so-is-it-easy", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "What are the default cycle values for the resolve mode validator, make node validator, and defense mode validator", "answer": "The config values for the nodes are the same \n--node.bold.assertion-confirming-interval duration confirm assertion interval (default 1m0s)\n--node.bold.assertion-posting-interval duration assertion posting interval (default 15m0s)\n--node.bold.assertion-scanning-interval duration scan assertion interval (default 1m0s)", - "key": "what-are-the-default-cycle-values-for-the-resolve-mode-validator-make-node-validator-and-defense-mod" + "key": "what-are-the-default-cycle-values-for-the-resolve-mode-validator-make-node-validator-and-defense-mod", + "category": "[]" }, { "question": "Is an L2 Ether Faucet possible", "answer": "There is no way to mint new ethers, so if you build a faucet, you can only top up it by yourself.", - "key": "is-an-l2-ether-faucet-possible" + "key": "is-an-l2-ether-faucet-possible", + "category": "[]" }, { "question": "What is the role of WASM module root?", "answer": "**WASM Module Root** is a **cryptographic hash (commitment)** that uniquely identifies a specific version of the **Arbitrum State Transition Function (STF)** compiled to WebAssembly. \nThis is needed for fraud proof.", - "key": "what-is-the-role-of-wasm-module-root" + "key": "what-is-the-role-of-wasm-module-root", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "ERROR[...] Disabling batch posting due to batch being within reorg resistance margin from layer 1 minimum block or timestamp bounds\nreorgResistanceMargin=10m\nfirstMsgTimeStamp=X\nl1BoundMinTimestamp=Y\nfirstMsgBlockNumber=Z\nl1BoundMinBlockNumber=W", "answer": "The batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation__). \nYou can set `--node.batch-poster.reorg-resistance-margin=0 `and `—-node.batch-poster.l1-block-bound=ignore` to bypass but **very import note** this might cause chain reorg.", - "key": "error-disabling-batch-posting-due-to-batch-being-within-reorg-resistance-margin-from-layer-1-minimum" + "key": "error-disabling-batch-posting-due-to-batch-being-within-reorg-resistance-margin-from-layer-1-minimum", + "category": "[Node Running Logs, Node Operations]" }, { "question": "How should I run the node using the JSON config? (nodeConfig.json)", "answer": "Apply `--conf.file` to your node when starting, and remember if you are running with docker, you should mount your config file to the container first and point this flag to that mount point", - "key": "how-should-i-run-the-node-using-the-json-config-nodeconfig-json" + "key": "how-should-i-run-the-node-using-the-json-config-nodeconfig-json", + "category": "[Integration & Development, Node Operations]" }, { "question": "Does that mean that even if there is no tx after 72 hours, an empty batch posting will occur and a new assertion will be submitted in the new batch,right? Or does it mean that if there is no tx, the block is not generated, but empty batch posting is performed for assertion? Didn't you say above that at least one block must be generated before batch posting?", "answer": "Empty batch can be posted after 72 hours this is true, empty batch means there is no user tx within the batch, so no need to have user's tx for a batch posting, **but there will be system tx like** `batchPostingReport` **to create a new block,**  And this block won't contain any **user tx**.", - "key": "does-that-mean-that-even-if-there-is-no-tx-after-72-hours-an-empty-batch-posting-will-occur-and-a-ne" + "key": "does-that-mean-that-even-if-there-is-no-tx-after-72-hours-an-empty-batch-posting-will-occur-and-a-ne", + "category": "[]" }, { "question": "WARN [06-11|09:12:22.830] error getting max time variation on L1 bound block; falling back on latest block err=\"429 Too Many Requests: {\\\"code\\\":-32007,\\\"message\\\":\\\"50/second request limit reached - reduce calls per second or upgrade your account at quicknode.com\\\"}\"", "answer": "This 429 error returned from your parent chain rpc endpoint, you need to check the status of your parent chain rpc endpoint.", - "key": "warn-06-11-09-12-22-830-error-getting-max-time-variation-on-l1-bound-block-falling-back-on-latest-bl" + "key": "warn-06-11-09-12-22-830-error-getting-max-time-variation-on-l1-bound-block-falling-back-on-latest-bl", + "category": "[Node Operations, Node Running Logs]" }, { "question": "1. What does validation_* mean here? /Why do I need to copy the jwt file when upgrading SW? Doesn't the validator, not just spli-validtor, also have jwt and perform certain functions?", "answer": "The `validation_` is part of auth api by default. If you want to access the auth api, you need to use this jwt secret. Usually we only set `validation_` to auth api endpoint. And `validation_` can be used to query the validation info, this is usually used by validator, normally there is no need to call this endpoint.", - "key": "1-what-does-validation-mean-here-why-do-i-need-to-copy-the-jwt-file-when-upgrading-sw-doesn-t-the-va" + "key": "1-what-does-validation-mean-here-why-do-i-need-to-copy-the-jwt-file-when-upgrading-sw-doesn-t-the-va", + "category": "[]" }, { "question": "On the Testnet, withdrawal from L3 to L1 takes approximately 3 hours. Is the L1 block time set shorter because it's a Testnet? On the Mainnet, without any special configuration changes, would the withdrawal from L3 to L2 and L2 to L1 take 7 days each (45,818 L1 blocks)? If so, how can we shorten the withdrawal from L3 to L2 and L2 to L1 when using Roll-up, and by what would the shortest as possible time be?", "answer": "For testnet's shorter time, this is because we don't need to give testnet such a long time to ensure the security as the funds are all for testing use cases and it's not real funds.\nFor mainnet implementation, to reduce the withdraw time, there are some potential options:\n1. Fast Withdrawals (Recommended for AnyTrust)\n2. Configure Shorter Challenge Period (Reduces security margin for fraud detection, must carefully evaluate before configuring this)\n3. Third-Party Bridge/Liquidity Solutions. (Powered by 3rd party oracles)", - "key": "on-the-testnet-withdrawal-from-l3-to-l1-takes-approximately-3-hours-is-the-l1-block-time-set-shorter" + "key": "on-the-testnet-withdrawal-from-l3-to-l1-takes-approximately-3-hours-is-the-l1-block-time-set-shorter", + "category": "[Performance & Scalability]" }, { "question": "Where is the code that handles batch posting", "answer": "[https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go](https://github.com/OffchainLabs/nitro/blob/master/arbnode/batch_poster.go) is the repo, MaybePostSequencerBatch is the function", - "key": "where-is-the-code-that-handles-batch-posting" + "key": "where-is-the-code-that-handles-batch-posting", + "category": "[Integration & Development]" }, { "question": "How do I deploy the Rollup Creator (factory) contract to a custom parent chain that isn't Ethereum Sepolia or Arbitrum Sepolia? What additional configuration is needed beyond .env and config.ts?", "answer": "**We do not recommend deploying your own Rollup Creator contract.** Instead, use the existing official Rollup Creator contracts that are already deployed. If you absolutely must deploy your own, refer to the deployment scripts in the nitro-contracts repository: [https://github.com/OffchainLabs/nitro-contracts](https://github.com/OffchainLabs/nitro-contracts)", - "key": "how-do-i-deploy-the-rollup-creator-factory-contract-to-a-custom-parent-chain-that-isn-t-ethereum-sep" + "key": "how-do-i-deploy-the-rollup-creator-factory-contract-to-a-custom-parent-chain-that-isn-t-ethereum-sep", + "category": "[Integration & Development, Node Operations]" }, { "question": "How are assertions resolved", "answer": "To resolve an assertion, your validator will call `confirmAssertion` , just use the default cycle is fine.If you run more than 2 resolves node or makenodes node, they will compete to call this method.", - "key": "how-are-assertions-resolved" + "key": "how-are-assertions-resolved", + "category": "[]" }, { "question": "WARN [07-01|18:13:26.929] Could not submit latest assertion err=\"could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1\" validatorName=default-validator", "answer": "This is **normal behavior** and will usually resolve automatically. Your validator has an unconfirmed transaction in the mempool of parent chain and is waiting for it to be confirmed before submitting the next assertion. This warning does not impact node operation.**\nRoot Cause**\n• **Current situation:** Validator has already sent a transaction (nonce 30) that is still pending in the mempool\n• **Mempool limit:** Configured to allow only 1 unconfirmed transaction at a time (default setting)\n• **Blocked transaction:** Next transaction (nonce 31) cannot be sent until the previous one confirms**\nResolution**\n**Option 1: Wait (Recommended)**\n• The pending transaction will confirm automatically\n• Once confirmed, the validator will submit the next assertion\n• **No action needed** - this is expected behavior\n**Option 2: Increase Mempool Size**\nIf you want to allow multiple unconfirmed transactions simultaneously, increase the mempool limit:\n**For BOLD validators:**\n\n`--node.bold.data-poster.max-mempool-transactions `\n**For legacy validators:**\n\n`--node.staker.data-poster.max-mempool-transactions ` \n\n**Log Level Logic:**\n• **< 10 minutes:** WARN - considered a temporary issue\n• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level", - "key": "warn-07-01-18-13-26-929-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-thi" + "key": "warn-07-01-18-13-26-929-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-thi", + "category": "[Node Running Logs, Node Operations]" }, { "question": "But if TPS increases, for example, if 100 sequences are sent per second, will the response speed after each transmission be uniform, or will the overall response speed slow down?", "answer": "(didnt see an answer but seems like a useful question)", - "key": "but-if-tps-increases-for-example-if-100-sequences-are-sent-per-second-will-the-response-speed-after-" + "key": "but-if-tps-increases-for-example-if-100-sequences-are-sent-per-second-will-the-response-speed-after-", + "category": "[]" }, { "question": "Is the Resolve node responsible for staking at existing assertions, right?", "answer": "Resolve node will not only create assertions, and yes it will only make actions on those existing assertions, also it can resolve the assertions.", - "key": "is-the-resolve-node-responsible-for-staking-at-existing-assertions-right" + "key": "is-the-resolve-node-responsible-for-staking-at-existing-assertions-right", + "category": "[]" }, { "question": "How can we handle transaction overflow when the Sequencer's pending queue reaches capacity, especially when transactions must be processed in order and retries are not possible?", "answer": "The Sequencer has a configurable pending transaction queue with adjustable size and timeout parameters. You can tune these settings to handle higher transaction volumes, but there are architectural considerations for scenarios where retries are not possible.**\nConfiguration Options**\nThe Sequencer's pending transaction queue can be configured using these flags:\n**Queue Size:**\n\n`--execution.sequencer.queue-size int`\n• **Default:** 1024 transactions\n• **Purpose:** Sets the maximum number of transactions that can wait in the pending queue\n• **Recommendation:** Increase this value based on your expected transaction volume\n**Queue Timeout:**\n\n`--execution.sequencer.queue-timeout duration`\n• **Default:** 12 seconds\n• **Purpose:** Maximum time a transaction can remain in the queue before being dropped\n• **Recommendation:** Consider increasing if your transaction processing has predictable but longer latency requirements**\nSolutions for High-Volume Scenarios**\n**1. Increase Queue Capacity**\n• Scale `queue-size` to accommodate peak transaction loads\n• Monitor queue utilization metrics to determine appropriate sizing\n• Consider your RAM constraints when setting large queue sizes\n**2. Pre-Submission Rate Limiting**\n• Implement rate limiting on the client side \n• Match submission rate to your Sequencer's processing capacity\n• Prevents queue overflow before it happens**\nCaveats & Important Notes**\n⚠️ **No Built-in Overflow Protection:** Once the queue is full, new transactions are rejected. There's no automatic spillover mechanism.\n⚠️ **Memory Constraints:** Very large queue sizes consume significant RAM. Ensure your infrastructure can support the configured queue size.\n\nThis might solve your problems here, but if you will accept a large number of tx at the same time, having a **customized relayer** cache will be better.", - "key": "how-can-we-handle-transaction-overflow-when-the-sequencer-s-pending-queue-reaches-capacity-especiall" + "key": "how-can-we-handle-transaction-overflow-when-the-sequencer-s-pending-queue-reaches-capacity-especiall", + "category": "[Node Operations, Integration & Development, Performance & Scalability]" }, { "question": "Is there a config to monitor transaction fees", "answer": "No there is no but it is possible to write a simple script to do it for you", - "key": "is-there-a-config-to-monitor-transaction-fees" + "key": "is-there-a-config-to-monitor-transaction-fees", + "category": "[]" }, { "question": "ERROR[06-10|15:33:12.823] disabling L1 bound as batch posting message is close to the maximum delay\nblockNumber=8,479,298\nl1BoundMinBlockNumberWithBypass=8,490,627\ntimestamp=1,749,090,792\nl1BoundMinTimestampWithBypass=1,749,227,592\nl1BlockBoundBypass=1h0m0s", "answer": "This ERROR indicates the batch contains very old messages approaching the maximum delay limit. The system automatically disables L1 bound checking as a protection mechanism to allow these old messages to be posted, preventing them from being stuck indefinitely.\nHowever, even if this batch gets posted successfully, you may encounter another related error: `Disabling batch posting due to batch being within reorg resistance margin\nfrom layer 1 minimum block or timestamp bounds` and the batch will not be posted on chain, this is because it breaks Reorg resistance margin. More details, please see: [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/batch-posting-assertion-control#sequencer-max-time-variation)", - "key": "error-06-10-15-33-12-823-disabling-l1-bound-as-batch-posting-message-is-close-to-the-maximum-delay-b" + "key": "error-06-10-15-33-12-823-disabling-l1-bound-as-batch-posting-message-is-close-to-the-maximum-delay-b", + "category": "[Node Operations, Node Running Logs]" }, { "question": "Can I assume that chain sdk deploys not only the rollup creator contract(=factory contract) but also all related rollup contracts?", "answer": "chain-sdk is used to deploy the rollup based on current rollup creator, it doesn't deploy rollup creator.", - "key": "can-i-assume-that-chain-sdk-deploys-not-only-the-rollup-creator-contract-factory-contract-but-also-a" + "key": "can-i-assume-that-chain-sdk-deploys-not-only-the-rollup-creator-contract-factory-contract-but-also-a", + "category": "[Integration & Development]" }, { "question": "ERROR[07-01|18:24:06.947] Could not submit latest assertion\nerr=\"could not create assertion: posting this transaction will exceed max mempool size: transaction nonce: 31, unconfirmed nonce: 30, max mempool size: 1\"\nvalidatorName=default-validator", "answer": "This ERROR indicates a transaction (nonce 30) has been pending for **over 10 minutes** without confirmation. This is a serious issue requiring immediate investigation - the transaction is likely stuck due to low gas price, L1 congestion, or RPC issues.**\nWhy This Escalated from WARN to ERROR**\n**Log Level Logic:**\n• **< 10 minutes:** WARN - considered a temporary issue\n• **≥ 10 minutes:** ERROR - problem persisted too long, escalated to error level\n**Situation:**\nThe escalation to ERROR means nonce 30 has been unconfirmed for over 10 minutes, blocking all subsequent assertions. This is **not normal** temporary waiting.**\nImmediate Diagnostic Steps**\n**1. Check L1 Pending Transaction**\nView the validator address on L1 to inspect the stuck transaction:bash\n\n*`# Using Etherscan or similar block explorer# Or query via RPC:`*`\neth_getTransactionByHash `\n**2. Identify Root Cause**\n**a. Gas Price Too Low (Most Common)**\n• Transaction gas price is too low for current L1 network conditions\n• L1 miners/validators won't prioritize it\n• **Solution:** Increase gas price configuration\n**b. Severe L1 Network Congestion**\n• L1 network is extremely congested\n• Even reasonable gas prices are stuck\n• **Solution:** Significantly increase gas price or wait for congestion to clear\nc**. RPC Node Problem**\n• L1 RPC node may not be properly broadcasting the transaction\n• Transaction might not actually be in mempool\n• **Solution:** Verify RPC endpoint health, consider switching providers**\nSolution Options\nOption 1: Increase Mempool Size (Allow System to Continue)**\nThis lets the validator submit new assertions even while nonce 30 is stuck:\n**For legacy validators:**bash\n\n`--node.staker.data-poster.max-mempool-transactions=10`\n**For BOLD validators:**bash\n\n`--node.bold.data-poster.max-mempool-transactions=10`\n**Trade-off:** More capital locked in pending transactions, but assertions continue**\nOption 2: Increase Gas Price Configuration**\nMake transactions more competitive on L1:\n\n*`# Increase base gas price`*`\n--node.staker.data-poster.target-price-gwei\n\n`*`# Increase urgency multiplier`*`\n--node.staker.data-poster.urgency-gwei\n\n`*`# Increase max tip`*`\n--node.staker.data-poster.max-tip-cap-gwei`**\nOption 3: Manually Accelerate Stuck Transaction**\nIf nonce 30 is genuinely stuck, use Replace-By-Fee (RBF):\n**Steps:**\n1. Get transaction details for nonce 30\n2. Send replacement transaction with:\n\n ◦ **Same nonce:** 30\n ◦ **Higher gas price:** At least 10% increase\n ◦ **Same transaction data**\n**Note:** DataPoster should handle this automatically, but if `replacement-times` is configured too conservatively, manual intervention may be needed.\n**Check replacement configuration:**\n\n*`# Default: 5m, 10m, 20m, 30m, 1h, ...# For faster replacement:`*`\n--node.staker.data-poster.replacement-times=\"2m,5m,10m,20m\"`**\nOption 4: Check DataPoster Status**\nMonitor DataPoster internal state:bash\n\n*`# If metrics are enabled:`*`\ncurl http://localhost:6070/debug/metrics/prometheus | grep dataposter\n\n`*`# Key metrics to watch:# - arb_dataposter_latest_unconfirmed_nonce# - arb_dataposter_balance# - arb_dataposter_pending_transactions`***\nRecommended Complete Configuration**\nFor validators experiencing persistent stuck transactions:\n\n*`# Allow multiple pending transactions`*`\n--node.staker.data-poster.max-mempool-transactions=10\n\n`*`# More aggressive gas pricing`*`\n--node.staker.data-poster.target-price-gwei\n--node.staker.data-poster.urgency-gwei\n--node.staker.data-poster.max-tip-cap-gwei\n\n`*`# Faster replacement cycle`*`\n--node.staker.data-poster.replacement-times=\"3m,6m,12m,20m,30m\"\n\n`*`# Wait for L1 finality (recommended for security)`*`\n--node.staker.data-poster.wait-for-l1-finality=true`\n**For BOLD validators:** Usually replace `--node.staker` with `--node.bold` in all flags above.", - "key": "error-07-01-18-24-06-947-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-th" + "key": "error-07-01-18-24-06-947-could-not-submit-latest-assertion-err-could-not-create-assertion-posting-th", + "category": "[Node Operations, Node Running Logs]" }, { "question": "What does --node.batch-poster.data-poster.max-mempool-transactions do", "answer": "It limits the amount of batch poster transactions in the mempool to the flags amount", - "key": "what-does-node-batch-poster-data-poster-max-mempool-transactions-do" + "key": "what-does-node-batch-poster-data-poster-max-mempool-transactions-do", + "category": "[Node Operations]" }, { "question": "WARN [07-01|16:52:07.009] Served eth_sendRawTransaction conn=13.125.242.225:51648 reqid=1688 duration=1.01158792s err=\"nonce too high: address 0xE8b9a6b2A9404E8AF1F7676916C19C7397c94498, tx: 261 state: 107\"", "answer": "This is a **client-side error**, not a node issue. The user is submitting a transaction with higher, but the account's current nonce on-chain is not matching that one.", - "key": "warn-07-01-16-52-07-009-served-eth-sendrawtransaction-conn-13-125-242-225-51648-reqid-1688-duration-" + "key": "warn-07-01-16-52-07-009-served-eth-sendrawtransaction-conn-13-125-242-225-51648-reqid-1688-duration-", + "category": "[Node Running Logs]" }, { "question": "When deploying a chain with chain-sdk, how do I configure it as a Rollup vs AnyTrust chain?", "answer": "Use the `DataAvailabilityCommittee` parameter in `prepareChainConfig()`:\n• **`DataAvailabilityCommittee: true`** → AnyTrust chain\n• **`DataAvailabilityCommittee: false`** → Rollup chain\n**Implementation**\nWhen calling `createRollupPrepareDeploymentParamsConfig`, configure the `DataAvailabilityCommittee`", - "key": "when-deploying-a-chain-with-chain-sdk-how-do-i-configure-it-as-a-rollup-vs-anytrust-chain" + "key": "when-deploying-a-chain-with-chain-sdk-how-do-i-configure-it-as-a-rollup-vs-anytrust-chain", + "category": "[Integration & Development]" }, { "question": "Could you please suggest a test node env that I want to test against lower user tx cost and higher tps?", "answer": "**Infrastructure & Node Configuration:**\n1. **Deploy nodes in a nearby location (Optional)**- This reduces latency for their testers. (Note: if you don't need low latency, this is not needed)\n2. **Deploy 2-3 full nodes alongside the sequencer** - Full nodes can serve read requests to reduce sequencer load. We can also implement a pre-checker mechanism on these nodes to further reduce sequencer pressure. Provide them with all node endpoints so they distribute transactions across multiple nodes rather than sending everything to one.\n3. **Deploy a High Availability sequencer setup** - If they're doing stress testing, this prevents downtime from sequencer failures.\n4. **Use only 1 validator** - Sufficient for this testing scenario.\n5. **Increase speed limit** (and adjust related speed limit parameters accordingly) - Allows for higher throughput at lower gas prices.\n6. **Set `minL2BaseFee` to 0.0001.**\n7. **Increase batch size - **This can slightly reduces the per-transaction cost by amortizing L1 posting costs across more transactions.\n8. **Deploy on a private chain with low gas - **If deploying the L3 on a private L2, we can set low gas prices to this private chain. However, there's a tradeoff: testing costs will be lower than production costs once migrated to mainnet, which could lead to inaccurate cost projections.\n9. Can deploy chain as Anytrust.\n**Smart Contract Deployment Recommendations:**Beyond node configuration, we should recommend they deploy their core business contracts as:\n1. **Stylus contracts** - This can dramatically reduce gas costs & increase TPS and works well for business logic contracts.\n2. **Precompile contracts** - Precompiles allow custom gas cost settings, enabling further cost reduction. The tradeoff is that contract upgrades require ArbOS upgrades, so this should only be used for stateless, mission-critical contracts.", - "key": "could-you-please-suggest-a-test-node-env-that-i-want-to-test-against-lower-user-tx-cost-and-higher-t" + "key": "could-you-please-suggest-a-test-node-env-that-i-want-to-test-against-lower-user-tx-cost-and-higher-t", + "category": "[User Economics & Chain Maintenance, Node Operations]" }, { "question": "And if i look at the contents of the resolve mode validator, there is the following content:\n\nGas used every time a new assertion is created and to resolve unconfirmed assertionsAnd \ndoes the above mean that only the further gas fee is used for each new assertion, and the existing staked money is used as is? Or is the additional staking money added again to the new assertion?", "answer": "Yes, your staker will only need to staker once, no more staked token needed.", - "key": "and-if-i-look-at-the-contents-of-the-resolve-mode-validator-there-is-the-following-content-gas-used-" + "key": "and-if-i-look-at-the-contents-of-the-resolve-mode-validator-there-is-the-following-content-gas-used-", + "category": "[Node Operations]" }, { "question": "as long as the parent chain's contract is functioning normally, can the data in the child chain's (all data) be restored at any time even if it is deleted ?", "answer": "yes, all data can be restored from parent chain if you are on rollup mode. But if your parent chain is ethereum and you enable blob posting, you need to connect to a client which supports historical blobs storage. That is because ethereum will prune the blob data after 2 weeks automatically. \n\nNote: only data that is posted on the parent chain can be easily restored, if data was never posted then restoration will be difficult or potentially not possible", - "key": "as-long-as-the-parent-chain-s-contract-is-functioning-normally-can-the-data-in-the-child-chain-s-all" + "key": "as-long-as-the-parent-chain-s-contract-is-functioning-normally-can-the-data-in-the-child-chain-s-all", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "I was wondering if it would be okay to run two networks on the same PC with different input config files for testing purposes from the same Nitro code folder?", "answer": "Yes, you can do that, but please to make sure the db stored in different path. (by set different `persistent.global-config`), also, the netwrok port needs to be set on different ports.", - "key": "i-was-wondering-if-it-would-be-okay-to-run-two-networks-on-the-same-pc-with-different-input-config-f" + "key": "i-was-wondering-if-it-would-be-okay-to-run-two-networks-on-the-same-pc-with-different-input-config-f", + "category": "[Node Operations]" }, { "question": "What is a split validator?", "answer": "Split validators separate the validation work to a stateless worker, which provides several key benefits:\n• **Resource management**: Easier to scale and manage compute resources independently\n• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• **Flexibility**: Allows running multiple validation workers for horizontal scalability.\nSo if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process.", - "key": "what-is-a-split-validator" + "key": "what-is-a-split-validator", + "category": "[Blockchain/Architecture Fundamentals, Node Operations]" }, { "question": "What are contract calls and where are the nitro contracts", "answer": "You can find almost all our nitro contract in nitro-contracts [repo](https://github.com/OffchainLabs/nitro-contracts),", - "key": "what-are-contract-calls-and-where-are-the-nitro-contracts" + "key": "what-are-contract-calls-and-where-are-the-nitro-contracts", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "WARN [08-21|16:07:41.536] Served eth_getBalance                    conn=43.203.177.23:34134 reqid=0 duration=\"115.587µs\" err=\"header not found\"", "answer": "Might be some reasons;\n1. Your node haven't synced to the latest state. If it is this reason, you can wait some time.\n2. (Very low likelihood) You are running a block explorer which uses your another chain's db however connect to your current chain, this one you need to re-run the block explorer and delete its db.\n3. Might be your node db crashed. If it is this reason, might need to resync.", - "key": "warn-08-21-16-07-41-536-served-eth-getbalance-conn-43-203-177-23-34134-reqid-0-duration-115-587-s-er" + "key": "warn-08-21-16-07-41-536-served-eth-getbalance-conn-43-203-177-23-34134-reqid-0-duration-115-587-s-er", + "category": "[Node Running Logs]" }, { "question": "And what is the meaning of delayBlocks and futureBlocks in the site below and the meaning below, and what is the meaning and difference of delaySeconds and futureSeconds?", "answer": "The sequencer's max time variation is configurable via the `setMaxTimeVariation` method of the Sequencer Inbox Contract, which will also be set to prevent chain reorganization when there are no batches for an extended period.\n`MaxTimeVariation` struct:\n\n`struct MaxTimeVariation { \nuint256 delayBlocks; \nuint256 futureBlocks; \nuint256 delaySeconds; \nuint256 futureSeconds;\n}`\nThe `MaxTimeVariation` struct defines time boundaries that determine whether your chain remains safe or triggers a reorganization (reorg) when posting batches. It uses both block-based and time-based limits to create acceptable windows for message processing between L1 and L2.", - "key": "and-what-is-the-meaning-of-delayblocks-and-futureblocks-in-the-site-below-and-the-meaning-below-and-" + "key": "and-what-is-the-meaning-of-delayblocks-and-futureblocks-in-the-site-below-and-the-meaning-below-and-", + "category": "[Node Operations, Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "What is the difference between the chain SDK and the Orbit setup script (Orbit now Arbitrum chain)", "answer": "The orbit SDK is for preparing and deploying an orbit chain, while the orbit setup script should never be used for live production.", - "key": "what-is-the-difference-between-the-chain-sdk-and-the-orbit-setup-script-orbit-now-arbitrum-chain" + "key": "what-is-the-difference-between-the-chain-sdk-and-the-orbit-setup-script-orbit-now-arbitrum-chain", + "category": "[Integration & Development]" }, { "question": "And what is the dispute window size config, and what is the compression ratio config of the batch?", "answer": "The dispute window is configured in the **rollup contract settings**, not in the node configuration. These are set when deploying the rollup:`confirmPeriodBlocks: 45818, `*`// ~6.4 days (for Arbitrum One)`*` `\nYou can also call rollup contract `setConfirmPeriodBlocks` to reset this.\nCompressionLevel is default to be 11, but you can reset it by `--node.batch-poster.compression-level`", - "key": "and-what-is-the-dispute-window-size-config-and-what-is-the-compression-ratio-config-of-the-batch" + "key": "and-what-is-the-dispute-window-size-config-and-what-is-the-compression-ratio-config-of-the-batch", + "category": "[User Economics & Chain Maintenance]" }, { "question": "And currently, forwarding from the full node to the sequencer is happening on all of one, nove, and sepolia, right?", "answer": "This is the general architecture of all arbitrum chains where nodes pick up data and send them to the sequencer", - "key": "and-currently-forwarding-from-the-full-node-to-the-sequencer-is-happening-on-all-of-one-nove-and-sep" + "key": "and-currently-forwarding-from-the-full-node-to-the-sequencer-is-happening-on-all-of-one-nove-and-sep", + "category": "[]" }, { "question": "ERROR[08-21|13:48:40.883] shut down due to fatal error             err=\"error starting node: error initializing block validator: cannot validate WasmModuleRoot 0xdb698a2576298f25448bc092e52cf13b1e24141c997135d70f217d674bbeb69a\"", "answer": "Have you downloaded consensus 40 replay bin?\n\n`.`\n1. Check your Dockerfile in `Nitro` for a download to the current consensus version (V50 at time of writing `RUN ./download-machine.sh consensus-v50 0x2c54f6e9e378ba320ed9c713a1d9f067a572b1437e4f1c40b1a915d3066c04f2`)\n2. If yes, then can ask them cd to ./scripts dir and run ./download-machine.sh with the related arbos info.\n3. If not, they need to re-build the replay bin theirselves.", - "key": "error-08-21-13-48-40-883-shut-down-due-to-fatal-error-err-error-starting-node-error-initializing-blo" + "key": "error-08-21-13-48-40-883-shut-down-due-to-fatal-error-err-error-starting-node-error-initializing-blo", + "category": "[Node Running Logs]" }, { "question": "What's the difference between WARN and ERROR log levels? Do WARN logs affect node operation?", "answer": "**Usually WARN logs do NOT affect node operation.** The node continues to function normally. Only ERROR logs indicate issues that may disrupt node functionality or cause shutdown.", - "key": "what-s-the-difference-between-warn-and-error-log-levels-do-warn-logs-affect-node-operation" + "key": "what-s-the-difference-between-warn-and-error-log-levels-do-warn-logs-affect-node-operation", + "category": "[Node Operations]" }, { "question": "After creating the nitro-node image, how do I run the Docker image with the previously created nodeconfig.json as input? (Is there a command guide?)And how do I make the nitro instance accessible from outside? Do I need to set up ports and such to connect from outside? Port connections, etc…", "answer": "Let's assume you want to use `/data/arbitrum` dir as the main file to keep your chain data, then:\n1. copy nodeConfig.json to `/data/arbitrum` .\n2. run `docker run --rm -it -v /data/arbitrum:/home/user/.arbitrum --conf.file /home/user/.arbitrum/nodeConfig.json` \n\n\nYes, you need to mount too, you can check the port settings in nodeConfig.json and export those ports too.", - "key": "after-creating-the-nitro-node-image-how-do-i-run-the-docker-image-with-the-previously-created-nodeco" + "key": "after-creating-the-nitro-node-image-how-do-i-run-the-docker-image-with-the-previously-created-nodeco", + "category": "[Integration & Development, Node Operations]" }, { "question": "Can I change the gas token of my arbitrum chain after it has been deployed", "answer": "No the custom gas token must be set during deployment and cannot be changed afterwards", - "key": "can-i-change-the-gas-token-of-my-arbitrum-chain-after-it-has-been-deployed" + "key": "can-i-change-the-gas-token-of-my-arbitrum-chain-after-it-has-been-deployed", + "category": "[Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "WARN [09-11|15:15:36.645] Served eth_sendRawTransaction            conn=27.122.242.98:11105 reqid=3174655275929179 duration=4.691427ms err=\"wrong msgIdx got 257 expected 256\"", "answer": "This logs indicates your sequencer queued the tx 257, however, your node db just keeps 256. Which means your node db fall behind the sequencer.", - "key": "warn-09-11-15-15-36-645-served-eth-sendrawtransaction-conn-27-122-242-98-11105-reqid-317465527592917" + "key": "warn-09-11-15-15-36-645-served-eth-sendrawtransaction-conn-27-122-242-98-11105-reqid-317465527592917", + "category": "[Node Running Logs]" }, { "question": "What is the auth-rpc?", "answer": "AUTH-RPC is a **separate, JWT-authenticated RPC interface** in Arbitrum Nitro designed for **secure communication** between trusted components or entities. \nBy default, it will register `validation_` api, but you can also register some regular api like `eth_` , `net_`", - "key": "what-is-the-auth-rpc" + "key": "what-is-the-auth-rpc", + "category": "[Node Operations]" }, { "question": "If I update my nitro node version will that mean my ArbOS will be upgraded too", "answer": "If you upgrade your nitro version, it doesn't mean your ArbOS version will be upgraded too, so your ArbOS version will keep the same, those are 2 separate version system, ArbOS version can only be upgraded by calling  `arbOwner.scheduleArbOSUpgrade`", - "key": "if-i-update-my-nitro-node-version-will-that-mean-my-arbos-will-be-upgraded-too" + "key": "if-i-update-my-nitro-node-version-will-that-mean-my-arbos-will-be-upgraded-too", + "category": "[Node Operations, Integration & Development]" }, { "question": "Does L2 submit batches when there are no user transactions?", "answer": "**Generally, empty batches are NOT sent.** However, there's a specific exception:\n**Normal Operation:**\n• BatchPoster only sends batches when there are \"useful messages\"\n• **Useful messages** include:\n\n ◦ User transactions\n ◦ Delayed messages from users\n**Batch Posting Report Message:**\n• Every batch will generate a `batch_posting_report` message\n• This message is NOT initially marked as \"useful\"\n• Remains non-useful for duration of `--node.batch-poster.max-empty-batch-delay`\n**Exception - Empty Batch Submission:**\nAfter `max-empty-batch-delay` expires:\n• The `batch_posting_report` message becomes marked as \"useful\"\n• BatchPoster will send a batch containing only this message\n• This is technically an \"empty batch\" (no user transactions, only the report)", - "key": "does-l2-submit-batches-when-there-are-no-user-transactions" + "key": "does-l2-submit-batches-when-there-are-no-user-transactions", + "category": "[Node Operations, Blockchain/Architecture Fundamentals]" }, { "question": "ERROR[06-13|11:01:25.473] Could not submit latest assertion err=\"could not auto-deposit funds for assertion creation: test execution of tx errored before sending payable tx: insufficient funds for transfer\" validatorName=default-validator", "answer": "Your staker address doesn't have enough funds to deposit, please transfer some funds to it.", - "key": "error-06-13-11-01-25-473-could-not-submit-latest-assertion-err-could-not-auto-deposit-funds-for-asse" + "key": "error-06-13-11-01-25-473-could-not-submit-latest-assertion-err-could-not-auto-deposit-funds-for-asse", + "category": "[Node Operations, Node Running Logs]" }, { "question": "What are the assertion submission frequency and finalization cycle, and what are the configurations?", "answer": "Default is 15 mins, to reset it: `--node.bold.assertion-posting-interval` .Finalized cycle, default in test env is 150 blocks, on mainnet is 7 days, you need call rollup contract `setConfirmPeriodBlocks` to reset this.", - "key": "what-are-the-assertion-submission-frequency-and-finalization-cycle-and-what-are-the-configurations" + "key": "what-are-the-assertion-submission-frequency-and-finalization-cycle-and-what-are-the-configurations", + "category": "[Node Operations]" }, { "question": "When I run the arbitrum tutorial, I got the following error: `ArbSdkError: Unrecognized network xxx.`", "answer": "This is because you are running the tutorial against a custom chain.\nPlease follow this tutorial ([https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network](https://github.com/OffchainLabs/arbitrum-tutorials?tab=readme-ov-file#how-to-run-the-tutorials-against-a-custom-network)) to add your custom network first.", - "key": "when-i-run-the-arbitrum-tutorial-i-got-the-following-error-arbsdkerror-unrecognized-network-xxx" + "key": "when-i-run-the-arbitrum-tutorial-i-got-the-following-error-arbsdkerror-unrecognized-network-xxx", + "category": "[Integration & Development]" }, { "question": "If I delete the db of the child chain and restart it, can I restore all the TXs of the child chain?", "answer": "You can restore all TXes that your batchposter already posted, like for now, your sequencer are at msg 257, and your batchposter already posted message 250 to parent chain, then your node can restore to 250.", - "key": "if-i-delete-the-db-of-the-child-chain-and-restart-it-can-i-restore-all-the-txs-of-the-child-chain" + "key": "if-i-delete-the-db-of-the-child-chain-and-restart-it-can-i-restore-all-the-txs-of-the-child-chain", + "category": "[Node Operations, Blockchain/Architecture Fundamentals]" }, { "question": "And If i look at the page below, there is a resolve mode among the validators. Does the validator in resolve mode do both cases: staking for correct assertions and challenging for incorrect assertions? How should the resolve cycle be configured in nodeconfig.json?", "answer": "Yes, **Resolve Mode does BOTH** - it stakes for correct assertions AND challenges incorrect assertions. \nFor how to configure it:\n--node.staker.strategy=resolveNodes (legacy)\nor\n--node.bold.strategy=resolvenodes (bold)", - "key": "and-if-i-look-at-the-page-below-there-is-a-resolve-mode-among-the-validators-does-the-validator-in-r" + "key": "and-if-i-look-at-the-page-below-there-is-a-resolve-mode-among-the-validators-does-the-validator-in-r", + "category": "[Node Operations]" }, { "question": "Does the \"error getting latest agreed: no assertion creation logs found\" mean the latest new assertion?", "answer": "It means your nodes try to find a specific assertion, however, it doesn't find it, this means you need wait some time for your node to sync up.", - "key": "does-the-error-getting-latest-agreed-no-assertion-creation-logs-found-mean-the-latest-new-assertion" + "key": "does-the-error-getting-latest-agreed-no-assertion-creation-logs-found-mean-the-latest-new-assertion", + "category": "[Node Running Logs]" }, { "question": "If i want to run the container in the background instead of running it once and then deleting it, i can do something like below, right?Is there anything missing here?", "answer": "You can reuse those commands we provide in our docs, which is:\n\n`docker run --rm -it -v /Your_mount_point:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/nitro-node:v3.6.8-d6c96a5 --conf.file=xxxx`", - "key": "if-i-want-to-run-the-container-in-the-background-instead-of-running-it-once-and-then-deleting-it-i-c" + "key": "if-i-want-to-run-the-container-in-the-background-instead-of-running-it-once-and-then-deleting-it-i-c", + "category": "[Integration & Development]" }, { "question": "How to run a DAS node", "answer": "You can walk through [this](https://docs.arbitrum.io/run-arbitrum-node/data-availability-committees/get-started) guide. It provides you the content how to run a das node.", - "key": "how-to-run-a-das-node" + "key": "how-to-run-a-das-node", + "category": "[Node Operations, Integration & Development, User Economics & Chain Maintenance]" }, { "question": "error getting latest agreed: no assertion creation logs found", "answer": "For this logs, what I guess is because you just start your node, and it needs some time for makenodes to produce assertion and also other validator needs some time to wait the assertion tx is finalized. So it is expected.", - "key": "error-getting-latest-agreed-no-assertion-creation-logs-found" + "key": "error-getting-latest-agreed-no-assertion-creation-logs-found", + "category": "[Node Running Logs]" }, { "question": "In a high-availability sequencer setup, what data does the sequencer pass to Redis, and how does Redis determine the active sequencer and handle load balancing?", "answer": "For sequencer coordinator system (redis can also be used on other system), Redis is used for **sequencer coordination**, not load balancing. It stores leadership information, message synchronization data, and configuration to ensure only one active sequencer at a time.\n\n**Data in Redis**\n**1. Leadership Keys**\n• `coordinator.chosen` - URL of currently active sequencer (e.g., \"[http://sequencer1:8547](http://sequencer1:8547/)\")\n• `coordinator.liveliness.` - Each sequencer's heartbeat signal\n**2. Message Synchronization**\n• `coordinator.msgCount` - Current message count (signed)\n• `coordinator.finalizedMsgCount` - Finalized message count (signed)\n• `coordinator.msg.` - Individual messages (JSON encoded)\n• Other sync-related keys\n**3. Configuration**\n• `coordinator.priorities` - Comma-separated priority list of sequencer URLs\n\n**The election process:**\n1. The system reads coordinator.priorities to get the ordered list of sequencer URLs\n2. It checks each URL in priority order to see if that sequencer has set coordinator.liveliness. = \"OK\"\n3. The first sequencer in the priority list that has its liveliness key set becomes the recommended leader\n4. That sequencer attempts to acquire the coordinator.chosen lock **Conditions for a sequencer to become active:**\n• Must be synced with the network\n• Must have processed all messages up to the current count\n• Must successfully acquire the coordinator.chosen lock before it expires\n• The lock uses Redis transactions (optimistic locking) to prevent race conditions\n\nRedis and sequencer coordinator doesn't do traditional load balancing here - it's more of a **failover mechanism, Only ONE sequencer is active at a time (holding the coordinator.chosen lock)**", - "key": "in-a-high-availability-sequencer-setup-what-data-does-the-sequencer-pass-to-redis-and-how-does-redis" + "key": "in-a-high-availability-sequencer-setup-what-data-does-the-sequencer-pass-to-redis-and-how-does-redis", + "category": "[Node Operations, Blockchain/Architecture Fundamentals, Performance & Scalability]" }, { "question": "what is the difference between validatior and validation_node", "answer": "Validator can be run on one node, but it can also be split to 2 nodes which are validator (staker) and validation node, [here](https://docs.arbitrum.io/run-arbitrum-node/more-types/run-split-validator-node#running-split-validators-for-arbitrum-chains) is the related docs.Here is the benefits:\n• Resource management: Easier to scale and manage compute resources independently\n• Fault isolation: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• Flexibility: Allows running multiple validation workers for horizontal security", - "key": "what-is-the-difference-between-validatior-and-validation-node" + "key": "what-is-the-difference-between-validatior-and-validation-node", + "category": "[Node Operations]" }, { "question": "And if i look at the Docker-compose.yaml file of the nitro testnode code,(https://github.com/OffchainLabs/nitro-testnode/blob/release/docker-compose.yamlThere are separate validators and validatotion_nodes. What is the difference between these two?", "answer": "Split validators separate the validation work to a stateless worker, which provides several key benefits:\n• **Resource management**: Easier to scale and manage compute resources independently\n• **Fault isolation**: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)\n• **Flexibility**: Allows running multiple validation workers (validation node) for horizontal security.\nSo if you are running a split validator, which means you will run a regular nitro staker node, and a validation node, the staker will call validation node to do validation process.", - "key": "and-if-i-look-at-the-docker-compose-yaml-file-of-the-nitro-testnode-code-https-github-com-offchainla" + "key": "and-if-i-look-at-the-docker-compose-yaml-file-of-the-nitro-testnode-code-https-github-com-offchainla", + "category": "[Node Operations]" }, { "question": "How do you call Arb precompiles and what is the address of such", "answer": "Precompile is live on your network, and the address is on top of the file [here](https://github.com/OffchainLabs/nitro-precompile-interfaces/blob/main/ArbSys.sol#L10), so for ArbSys, it is 0x0000000000000000000000000000000000000064.Then you can use your rpc or other tool like foundry cast to call this address' method `arbOSVersion`", - "key": "how-do-you-call-arb-precompiles-and-what-is-the-address-of-such" + "key": "how-do-you-call-arb-precompiles-and-what-is-the-address-of-such", + "category": "[Blockchain/Architecture Fundamentals]" }, { "question": "Is it possible to set up custom gas tokens for any L2 or L3 configuration (rollup and anytrust)", "answer": "a custom gas token is possible in any of those configs though in rollup mode it's more complex. There's documentation on what's required here [https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/common-configurations/use-a-custom-gas-token-rollup)", - "key": "is-it-possible-to-set-up-custom-gas-tokens-for-any-l2-or-l3-configuration-rollup-and-anytrust" + "key": "is-it-possible-to-set-up-custom-gas-tokens-for-any-l2-or-l3-configuration-rollup-and-anytrust", + "category": "[Blockchain/Architecture Fundamentals, Integration & Development]" }, { "question": "what role does the relay service play", "answer": "It will connect to sequencer feed, and relay those feed messages to other full nodes, here is [related docs](https://docs.arbitrum.io/run-arbitrum-node/run-feed-relay). Basically it is used to reduce the network pressure of sequencer.", - "key": "what-role-does-the-relay-service-play" + "key": "what-role-does-the-relay-service-play", + "category": "[Node Operations, Blockchain/Architecture Fundamentals]" }, { "question": "can I omit running the download-machine.sh script (after make, make build, make build-replay-env)?", "answer": "(We recommend you to run the node with docker instead then you don't need to run so many steps.)You can just run `make build` then `download-machine.sh` , other 2 no need to run anymore.", - "key": "can-i-omit-running-the-download-machine-sh-script-after-make-make-build-make-build-replay-env" + "key": "can-i-omit-running-the-download-machine-sh-script-after-make-make-build-make-build-replay-env", + "category": "[Integration & Development]" }, { "question": "-node.batch-poster.data-poster.dangerous.clear-dbstorage Is there a value for the above config? If I do the above config, will the entire network be initialized? (Will it be reset and create a new block from scratch?)", "answer": "No, this will only remove batchposter's `QueuedTx` db, will not clear other db. So the network won't be initialized. But it may caused some queued tx lost.", - "key": "node-batch-poster-data-poster-dangerous-clear-dbstorage-is-there-a-value-for-the-above-config-if-i-d" + "key": "node-batch-poster-data-poster-dangerous-clear-dbstorage-is-there-a-value-for-the-above-config-if-i-d", + "category": "[Node Operations]" }, { "question": "Large gap between last seen and current block number, skipping check for reverts last", "answer": "The Batch Poster runs a background monitoring process (pollForReverts) that continuously checks L1 blocks to see if any transactions it submitted have been reverted. However, it find last seen blocks has a large gap to the current block, might be a lot of reasons, network issues might be one of them, you can try change to other parent rpc to see if it can be resolved or not. Also, most warn logs won't affect your node's syncing and behavior as it is not error logs, so you can ignore them.", - "key": "large-gap-between-last-seen-and-current-block-number-skipping-check-for-reverts-last" + "key": "large-gap-between-last-seen-and-current-block-number-skipping-check-for-reverts-last", + "category": "[Node Running Logs]" }, { "question": "Where is Timeboost supporteed", "answer": "They are currently on arb one, nova, and sepolia", - "key": "where-is-timeboost-supporteed" + "key": "where-is-timeboost-supporteed", + "category": "[Blockchain/Architecture Fundamentals, User Economics & Chain Maintenance]" }, { "question": "How do I migrate an existing local Nitro node database to a new Docker-based deployment? Which folders and files need to be transferred?", "answer": "Copy the **entire Nitro data folder** to a directory that you will mount to your Docker container.", - "key": "how-do-i-migrate-an-existing-local-nitro-node-database-to-a-new-docker-based-deployment-which-folder" + "key": "how-do-i-migrate-an-existing-local-nitro-node-database-to-a-new-docker-based-deployment-which-folder", + "category": "[Node Operations]" }, { "question": "if I create an L2 or L3 using the Nitro stack and a validator wants to recover the amount staked on the parent chain, how can I do so?", "answer": "To withdraw your staked token from rollup contract:   \n- Wait for your old validator's latest bond assertion to be confirmed   \n- Call `reduceDeposit()` on the `Rollup` Contract   \n- Call `withdrawStakerFunds()` to get your bond back", - "key": "if-i-create-an-l2-or-l3-using-the-nitro-stack-and-a-validator-wants-to-recover-the-amount-staked-on-" + "key": "if-i-create-an-l2-or-l3-using-the-nitro-stack-and-a-validator-wants-to-recover-the-amount-staked-on-", + "category": "[]" }, { "question": "What configurations should I set when deploying an L3 instead of an L2", "answer": "For L3s as of right now they must be ran in anytrust mode (I believe I saw this im not sure if its still true), other than that all of the configs can be set to your liking", - "key": "what-configurations-should-i-set-when-deploying-an-l3-instead-of-an-l2" + "key": "what-configurations-should-i-set-when-deploying-an-l3-instead-of-an-l2", + "category": "[Integration & Development]" }, { "question": "Do I need to move files around to upgrade a node?", "answer": "Every time you upgrade the node, there is no need to move any files but just change the image tag unless there is some special changes (we will put note at the release docs if happens).", - "key": "do-i-need-to-move-files-around-to-upgrade-a-node" + "key": "do-i-need-to-move-files-around-to-upgrade-a-node", + "category": "[Node Operations]" } ] From 2d8fcb5a0d8fc79f0e9701dbe22f946222c27877 Mon Sep 17 00:00:00 2001 From: Jason-Wanxt Date: Thu, 27 Nov 2025 19:40:56 +0800 Subject: [PATCH 13/13] bump notion tool version --- package.json | 2 +- yarn.lock | 38 +++++++------------------------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index fd2a961949..77869450e0 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", "@docusaurus/module-type-aliases": "^3.3.2", - "@offchainlabs/notion-docs-generator": "github:OffchainLabs/notion-docs-generator", + "@offchainlabs/notion-docs-generator": "^0.1.1", "@offchainlabs/prettier-config": "0.2.1", "@tsconfig/docusaurus": "^2.0.3", "@types/node": "^22.10.10", diff --git a/yarn.lock b/yarn.lock index ae78e062e9..035dee3a2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4189,9 +4189,10 @@ dependencies: "@octokit/openapi-types" "^24.2.0" -"@offchainlabs/notion-docs-generator@github:OffchainLabs/notion-docs-generator": - version "0.1.0" - resolved "https://codeload.github.com/OffchainLabs/notion-docs-generator/tar.gz/660d51ac1cb5ff6c19691ecaa629c7b8827c11bd" +"@offchainlabs/notion-docs-generator@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@offchainlabs/notion-docs-generator/-/notion-docs-generator-0.1.1.tgz#9f2fd507578cd0fe2d8e47475a30c952a4adaee1" + integrity sha512-ZnMNIWV55yuxyjddCf4uaLLD1bWQbxJRZWvQRFcYFfaw2bUk2iP1nmU7uV7K9uSlL1y0NBGNzV2cl2o/umdPzQ== dependencies: "@notionhq/client" "^2.2.3" "@types/node" "^18.11.18" @@ -14261,16 +14262,7 @@ std-env@^3.8.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14319,14 +14311,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15399,16 +15384,7 @@ wildcard@^2.0.0, wildcard@^2.0.1: resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==