From a772caa2c72339aaaa60c0d9714d6cdb71dbdf6e Mon Sep 17 00:00:00 2001 From: rootulp Date: Tue, 10 Sep 2024 18:14:58 +0000 Subject: [PATCH] =?UTF-8?q?Deploy=20preview=20for=20PR=201699=20?= =?UTF-8?q?=F0=9F=9B=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pr-1699/404.html | 2 +- pr-1699/README.html | 6 +- ...E.md.44659d85.js => README.md.ebe4136d.js} | 2 +- ...d85.lean.js => README.md.ebe4136d.lean.js} | 2 +- ...4.js => community_calendar.md.f70856a8.js} | 2 +- ...=> community_calendar.md.f70856a8.lean.js} | 2 +- ...13614f.js => community_coc.md.de9fdd2a.js} | 2 +- ...n.js => community_coc.md.de9fdd2a.lean.js} | 2 +- ...ndation-delegation-program.md.ff7a7f05.js} | 2 +- ...on-delegation-program.md.ff7a7f05.lean.js} | 2 +- ...8e.js => community_itn-tos.md.6454438f.js} | 2 +- ... => community_itn-tos.md.6454438f.lean.js} | 2 +- ...unity_modular-meetup-guide.md.6b50cb94.js} | 2 +- ..._modular-meetup-guide.md.6b50cb94.lean.js} | 2 +- ...unity_modular-meetup-intro.md.b7a491a8.js} | 2 +- ..._modular-meetup-intro.md.b7a491a8.lean.js} | 2 +- ...ity_modular-meetup-toolkit.md.0a2e761b.js} | 2 +- ...odular-meetup-toolkit.md.0a2e761b.lean.js} | 2 +- ...4.js => community_overview.md.fb9fd608.js} | 2 +- ...=> community_overview.md.fb9fd608.lean.js} | 2 +- ... => community_speaker-list.md.872a3b69.js} | 2 +- ...ommunity_speaker-list.md.872a3b69.lean.js} | 2 +- ...developers_arbitrum-bridge.md.8c851802.js} | 2 +- ...opers_arbitrum-bridge.md.8c851802.lean.js} | 2 +- ...opers_arbitrum-dapp-deploy.md.4b34cdb2.js} | 2 +- ..._arbitrum-dapp-deploy.md.4b34cdb2.lean.js} | 2 +- ...developers_arbitrum-deploy.md.26acb828.js} | 2 +- ...opers_arbitrum-deploy.md.26acb828.lean.js} | 2 +- ...elopers_arbitrum-full-node.md.319badbc.js} | 2 +- ...rs_arbitrum-full-node.md.319badbc.lean.js} | 2 +- ...opers_arbitrum-integration.md.fd5df284.js} | 2 +- ..._arbitrum-integration.md.fd5df284.lean.js} | 2 +- ...rs_arbitrum-smart-contract.md.8b7aa3c4.js} | 2 +- ...bitrum-smart-contract.md.8b7aa3c4.lean.js} | 2 +- ...opers_blobstream-contracts.md.06e023da.js} | 2 +- ..._blobstream-contracts.md.06e023da.lean.js} | 2 +- ...lopers_blobstream-offchain.md.fbd363f2.js} | 2 +- ...s_blobstream-offchain.md.fbd363f2.lean.js} | 2 +- ...s_blobstream-proof-queries.md.19225b90.js} | 12 ++-- ...bstream-proof-queries.md.19225b90.lean.js} | 2 +- ...elopers_blobstream-rollups.md.9c8cb137.js} | 2 +- ...rs_blobstream-rollups.md.9c8cb137.lean.js} | 2 +- ...lopers_blobstream-x-deploy.md.6ed5e09e.js} | 2 +- ...s_blobstream-x-deploy.md.6ed5e09e.lean.js} | 2 +- ...ing-data-commitment-ranges.md.adbc6c7c.js} | 2 +- ...ata-commitment-ranges.md.adbc6c7c.lean.js} | 2 +- ...s => developers_blobstream.md.4afef8bd.js} | 2 +- ...developers_blobstream.md.4afef8bd.lean.js} | 2 +- ... => developers_blobstreamx.md.7838cfd1.js} | 2 +- ...evelopers_blobstreamx.md.7838cfd1.lean.js} | 2 +- ...=> developers_bubs-testnet.md.ddf17ba1.js} | 2 +- ...velopers_bubs-testnet.md.ddf17ba1.lean.js} | 2 +- ... developers_build-whatever.md.5677fdce.js} | 2 +- ...lopers_build-whatever.md.5677fdce.lean.js} | 2 +- ...velopers_celestia-node-key.md.fe2dab0d.js} | 8 +-- ...ers_celestia-node-key.md.fe2dab0d.lean.js} | 2 +- ... developers_deploy-on-bubs.md.f7abcbb6.js} | 2 +- ...lopers_deploy-on-bubs.md.f7abcbb6.lean.js} | 2 +- ...velopers_ethereum-fallback.md.764773da.js} | 2 +- ...ers_ethereum-fallback.md.764773da.lean.js} | 2 +- ...elopers_feegrant-for-blobs.md.84d98514.js} | 2 +- ...rs_feegrant-for-blobs.md.84d98514.lean.js} | 2 +- ...-modular-development-guide.md.766923fe.js} | 2 +- ...lar-development-guide.md.766923fe.lean.js} | 2 +- ... developers_gm-portal-bubs.md.cd727490.js} | 2 +- ...lopers_gm-portal-bubs.md.cd727490.lean.js} | 2 +- ...ers_golang-client-tutorial.md.727ea5e8.js} | 2 +- ...olang-client-tutorial.md.727ea5e8.lean.js} | 2 +- ...elopers_integrate-celestia.md.cabcfa45.js} | 2 +- ...rs_integrate-celestia.md.cabcfa45.lean.js} | 2 +- ...velopers_intro-to-op-stack.md.2deb5540.js} | 2 +- ...ers_intro-to-op-stack.md.2deb5540.lean.js} | 2 +- ...> developers_multiaccounts.md.6ee7c0ad.js} | 2 +- ...elopers_multiaccounts.md.6ee7c0ad.lean.js} | 2 +- ....js => developers_node-api.md.6709e8d4.js} | 2 +- ...> developers_node-api.md.6709e8d4.lean.js} | 2 +- ...> developers_node-tutorial.md.79e6f899.js} | 6 +- ...elopers_node-tutorial.md.79e6f899.lean.js} | 2 +- ...developers_optimism-devnet.md.3b3f49a3.js} | 2 +- ...opers_optimism-devnet.md.3b3f49a3.lean.js} | 2 +- ....js => developers_optimism.md.d6e1e2ee.js} | 4 +- ...> developers_optimism.md.d6e1e2ee.lean.js} | 2 +- ...evelopers_prompt-scavenger.md.ae717331.js} | 2 +- ...pers_prompt-scavenger.md.ae717331.lean.js} | 2 +- ...opers_rust-client-tutorial.md.168637c4.js} | 2 +- ..._rust-client-tutorial.md.168637c4.lean.js} | 2 +- ...pers_sp1-blobstream-deploy.md.e4975a52.js} | 2 +- ...sp1-blobstream-deploy.md.e4975a52.lean.js} | 2 +- ... => developers_submit-data.md.7f90d09f.js} | 2 +- ...evelopers_submit-data.md.7f90d09f.lean.js} | 2 +- ...s_transaction-resubmission.md.ebf49e01.js} | 2 +- ...nsaction-resubmission.md.ebf49e01.lean.js} | 2 +- ...1.js => developers_wallets.md.b2bd7cc6.js} | 42 ++++++------ ...=> developers_wallets.md.b2bd7cc6.lean.js} | 40 +++++------ ...ex.md.d57eea6f.js => index.md.7de6d8b3.js} | 2 +- ...ea6f.lean.js => index.md.7de6d8b3.lean.js} | 2 +- ...orks_data-availability-faq.md.b4d6ab8b.js} | 2 +- ...data-availability-faq.md.b4d6ab8b.lean.js} | 2 +- ...ks_data-availability-layer.md.4a9aff1a.js} | 2 +- ...ta-availability-layer.md.4a9aff1a.lean.js} | 2 +- ...orks_monolithic-vs-modular.md.63b4aa3e.js} | 2 +- ...monolithic-vs-modular.md.63b4aa3e.lean.js} | 2 +- ...ow-celestia-works_overview.md.42a4dc74.js} | 2 +- ...lestia-works_overview.md.42a4dc74.lean.js} | 2 +- ...orks_transaction-lifecycle.md.def776d7.js} | 2 +- ...transaction-lifecycle.md.def776d7.lean.js} | 2 +- ... => learn_how-to-stake-tia.md.68dbd46b.js} | 2 +- ...earn_how-to-stake-tia.md.68dbd46b.lean.js} | 2 +- ...learn_paying-for-blobspace.md.06ae9c17.js} | 2 +- ..._paying-for-blobspace.md.06ae9c17.lean.js} | 2 +- ...js => learn_retrievability.md.d1e1d36b.js} | 2 +- ... learn_retrievability.md.d1e1d36b.lean.js} | 2 +- ..._staking-governance-supply.md.0d21fda6.js} | 2 +- ...ing-governance-supply.md.0d21fda6.lean.js} | 2 +- ...13419c.js => learn_staking.md.f13c2e81.js} | 2 +- ...n.js => learn_staking.md.f13c2e81.lean.js} | 2 +- ...d.6fd97b1e.js => learn_tia.md.9065ce93.js} | 2 +- ....lean.js => learn_tia.md.9065ce93.lean.js} | 2 +- ...js => nodes_arabica-devnet.md.5fbea086.js} | 2 +- ... nodes_arabica-devnet.md.5fbea086.lean.js} | 2 +- ...87.js => nodes_bridge-node.md.40517142.js} | 4 +- ... => nodes_bridge-node.md.40517142.lean.js} | 2 +- ...odes_celestia-app-commands.md.16f0c3b5.js} | 2 +- ...celestia-app-commands.md.16f0c3b5.lean.js} | 2 +- ...nodes_celestia-app-metrics.md.0b6cb333.js} | 2 +- ..._celestia-app-metrics.md.0b6cb333.lean.js} | 2 +- ...odes_celestia-app-multisig.md.4833031c.js} | 2 +- ...celestia-app-multisig.md.4833031c.lean.js} | 2 +- ...odes_celestia-app-slashing.md.5b9f9df0.js} | 2 +- ...celestia-app-slashing.md.5b9f9df0.lean.js} | 2 +- ...lestia-app-upgrade-monitor.md.0555c2d4.js} | 2 +- ...a-app-upgrade-monitor.md.0555c2d4.lean.js} | 2 +- ...nodes_celestia-app-vesting.md.e829dc7e.js} | 2 +- ..._celestia-app-vesting.md.e829dc7e.lean.js} | 2 +- ... nodes_celestia-app-wallet.md.70b5fba3.js} | 2 +- ...s_celestia-app-wallet.md.70b5fba3.lean.js} | 2 +- ...6.js => nodes_celestia-app.md.e09a3b72.js} | 2 +- ...=> nodes_celestia-app.md.e09a3b72.lean.js} | 2 +- ...estia-node-custom-networks.md.aac3b114.js} | 2 +- ...-node-custom-networks.md.aac3b114.lean.js} | 2 +- ...odes_celestia-node-metrics.md.e49bb967.js} | 2 +- ...celestia-node-metrics.md.e49bb967.lean.js} | 2 +- ...estia-node-troubleshooting.md.d5102d28.js} | 2 +- ...-node-troubleshooting.md.d5102d28.lean.js} | 2 +- ...celestia-node-trusted-hash.md.941c6f87.js} | 2 +- ...tia-node-trusted-hash.md.941c6f87.lean.js} | 2 +- ....js => nodes_celestia-node.md.b506c65d.js} | 2 +- ...> nodes_celestia-node.md.b506c65d.lean.js} | 2 +- ...01.js => nodes_config-toml.md.ea91864b.js} | 2 +- ... => nodes_config-toml.md.ea91864b.lean.js} | 2 +- ...js => nodes_consensus-node.md.99f6268d.js} | 44 ++++++------- ... nodes_consensus-node.md.99f6268d.lean.js} | 40 +++++------ ...82.js => nodes_decide-node.md.12527b86.js} | 2 +- ... => nodes_decide-node.md.12527b86.lean.js} | 2 +- ....js => nodes_docker-images.md.01970048.js} | 62 +++++++++--------- ...> nodes_docker-images.md.01970048.lean.js} | 56 ++++++++-------- ...68.js => nodes_environment.md.502fd51d.js} | 8 +-- ... => nodes_environment.md.502fd51d.lean.js} | 2 +- ...=> nodes_full-storage-node.md.27554da6.js} | 2 +- ...des_full-storage-node.md.27554da6.lean.js} | 2 +- ... => nodes_hardfork-process.md.b85c06e7.js} | 2 +- ...odes_hardfork-process.md.b85c06e7.lean.js} | 2 +- ...49.js => nodes_ibc-relayer.md.450545b1.js} | 2 +- ... => nodes_ibc-relayer.md.450545b1.lean.js} | 2 +- ... nodes_instantiate-testnet.md.4b062bf6.js} | 2 +- ...s_instantiate-testnet.md.4b062bf6.lean.js} | 2 +- ...172.js => nodes_light-node.md.f1dd6ad1.js} | 8 +-- ...s => nodes_light-node.md.f1dd6ad1.lean.js} | 2 +- ...30b2ce.js => nodes_mainnet.md.0bba5c8e.js} | 2 +- ...n.js => nodes_mainnet.md.0bba5c8e.lean.js} | 2 +- ....js => nodes_mocha-testnet.md.0e4cf674.js} | 2 +- ...> nodes_mocha-testnet.md.0e4cf674.lean.js} | 2 +- ...8c5aa.js => nodes_overview.md.4223caea.js} | 2 +- ....js => nodes_overview.md.4223caea.lean.js} | 2 +- ...78.js => nodes_participate.md.704b27c3.js} | 2 +- ... => nodes_participate.md.704b27c3.lean.js} | 2 +- ...b8.js => nodes_quick-start.md.9a9eabfc.js} | 2 +- ... => nodes_quick-start.md.9a9eabfc.lean.js} | 2 +- ...4b3b4f.js => nodes_systemd.md.66ed5d05.js} | 2 +- ...n.js => nodes_systemd.md.66ed5d05.lean.js} | 2 +- ...js => nodes_validator-node.md.084b1069.js} | 10 +-- ... nodes_validator-node.md.084b1069.lean.js} | 8 +-- pr-1699/community/calendar.html | 6 +- pr-1699/community/coc.html | 6 +- .../foundation-delegation-program.html | 6 +- pr-1699/community/itn-tos.html | 4 +- pr-1699/community/modular-meetup-guide.html | 6 +- pr-1699/community/modular-meetup-intro.html | 6 +- pr-1699/community/modular-meetup-toolkit.html | 6 +- pr-1699/community/overview.html | 6 +- pr-1699/community/speaker-list.html | 6 +- pr-1699/developers/arbitrum-bridge.html | 6 +- pr-1699/developers/arbitrum-dapp-deploy.html | 6 +- pr-1699/developers/arbitrum-deploy.html | 6 +- pr-1699/developers/arbitrum-full-node.html | 6 +- pr-1699/developers/arbitrum-integration.html | 6 +- .../developers/arbitrum-smart-contract.html | 6 +- pr-1699/developers/blobstream-contracts.html | 6 +- pr-1699/developers/blobstream-offchain.html | 6 +- .../developers/blobstream-proof-queries.html | 16 ++--- pr-1699/developers/blobstream-rollups.html | 6 +- pr-1699/developers/blobstream-x-deploy.html | 6 +- ...m-x-requesting-data-commitment-ranges.html | 6 +- pr-1699/developers/blobstream.html | 6 +- pr-1699/developers/blobstreamx.html | 6 +- pr-1699/developers/bubs-testnet.html | 6 +- pr-1699/developers/build-whatever.html | 6 +- pr-1699/developers/celestia-node-key.html | 12 ++-- pr-1699/developers/deploy-on-bubs.html | 6 +- pr-1699/developers/ethereum-fallback.html | 6 +- pr-1699/developers/feegrant-for-blobs.html | 6 +- .../full-stack-modular-development-guide.html | 6 +- pr-1699/developers/gm-portal-bubs.html | 6 +- .../developers/golang-client-tutorial.html | 6 +- pr-1699/developers/integrate-celestia.html | 6 +- pr-1699/developers/intro-to-op-stack.html | 6 +- pr-1699/developers/multiaccounts.html | 6 +- pr-1699/developers/node-api.html | 6 +- pr-1699/developers/node-tutorial.html | 10 +-- pr-1699/developers/optimism-devnet.html | 6 +- pr-1699/developers/optimism.html | 8 +-- pr-1699/developers/prompt-scavenger.html | 6 +- pr-1699/developers/rust-client-tutorial.html | 6 +- pr-1699/developers/sp1-blobstream-deploy.html | 6 +- pr-1699/developers/submit-data.html | 6 +- .../developers/transaction-resubmission.html | 6 +- pr-1699/developers/wallets.html | 10 +-- pr-1699/hashmap.json | 2 +- .../Celestia_TIA_Allocation_at_Genesis.png | Bin 456336 -> 472556 bytes pr-1699/index.html | 4 +- .../data-availability-faq.html | 6 +- .../data-availability-layer.html | 6 +- .../monolithic-vs-modular.html | 6 +- .../learn/how-celestia-works/overview.html | 6 +- .../transaction-lifecycle.html | 6 +- pr-1699/learn/how-to-stake-tia.html | 6 +- pr-1699/learn/paying-for-blobspace.html | 6 +- pr-1699/learn/retrievability.html | 6 +- pr-1699/learn/staking-governance-supply.html | 6 +- pr-1699/learn/staking.html | 6 +- pr-1699/learn/tia.html | 6 +- pr-1699/nodes/arabica-devnet.html | 6 +- pr-1699/nodes/bridge-node.html | 10 +-- pr-1699/nodes/celestia-app-commands.html | 6 +- pr-1699/nodes/celestia-app-metrics.html | 6 +- pr-1699/nodes/celestia-app-multisig.html | 6 +- pr-1699/nodes/celestia-app-slashing.html | 6 +- .../nodes/celestia-app-upgrade-monitor.html | 6 +- pr-1699/nodes/celestia-app-vesting.html | 6 +- pr-1699/nodes/celestia-app-wallet.html | 6 +- pr-1699/nodes/celestia-app.html | 6 +- .../nodes/celestia-node-custom-networks.html | 6 +- pr-1699/nodes/celestia-node-metrics.html | 6 +- .../nodes/celestia-node-troubleshooting.html | 6 +- pr-1699/nodes/celestia-node-trusted-hash.html | 6 +- pr-1699/nodes/celestia-node.html | 6 +- pr-1699/nodes/config-toml.html | 6 +- pr-1699/nodes/consensus-node.html | 14 ++-- pr-1699/nodes/decide-node.html | 6 +- pr-1699/nodes/docker-images.html | 14 ++-- pr-1699/nodes/environment.html | 12 ++-- pr-1699/nodes/full-storage-node.html | 8 +-- pr-1699/nodes/hardfork-process.html | 6 +- pr-1699/nodes/ibc-relayer.html | 6 +- pr-1699/nodes/instantiate-testnet.html | 6 +- pr-1699/nodes/light-node.html | 12 ++-- pr-1699/nodes/mainnet.html | 6 +- pr-1699/nodes/mocha-testnet.html | 6 +- pr-1699/nodes/overview.html | 6 +- pr-1699/nodes/participate.html | 6 +- pr-1699/nodes/quick-start.html | 6 +- pr-1699/nodes/systemd.html | 6 +- pr-1699/nodes/validator-node.html | 8 +-- pr-1699/sitemap.xml | 2 +- 274 files changed, 643 insertions(+), 643 deletions(-) rename pr-1699/assets/{README.md.44659d85.js => README.md.ebe4136d.js} (96%) rename pr-1699/assets/{README.md.44659d85.lean.js => README.md.ebe4136d.lean.js} (76%) rename pr-1699/assets/{community_calendar.md.5a6b1214.js => community_calendar.md.f70856a8.js} (95%) rename pr-1699/assets/{community_calendar.md.5a6b1214.lean.js => community_calendar.md.f70856a8.lean.js} (95%) rename pr-1699/assets/{community_coc.md.db13614f.js => community_coc.md.de9fdd2a.js} (98%) rename pr-1699/assets/{community_coc.md.db13614f.lean.js => community_coc.md.de9fdd2a.lean.js} (82%) rename pr-1699/assets/{community_foundation-delegation-program.md.abd31332.js => community_foundation-delegation-program.md.ff7a7f05.js} (99%) rename pr-1699/assets/{community_foundation-delegation-program.md.abd31332.lean.js => community_foundation-delegation-program.md.ff7a7f05.lean.js} (91%) rename pr-1699/assets/{community_itn-tos.md.23529d8e.js => community_itn-tos.md.6454438f.js} (99%) rename pr-1699/assets/{community_itn-tos.md.23529d8e.lean.js => community_itn-tos.md.6454438f.lean.js} (92%) rename pr-1699/assets/{community_modular-meetup-guide.md.3d71d8e8.js => community_modular-meetup-guide.md.6b50cb94.js} (99%) rename pr-1699/assets/{community_modular-meetup-guide.md.3d71d8e8.lean.js => community_modular-meetup-guide.md.6b50cb94.lean.js} (91%) rename pr-1699/assets/{community_modular-meetup-intro.md.1b04ad48.js => community_modular-meetup-intro.md.b7a491a8.js} (98%) rename pr-1699/assets/{community_modular-meetup-intro.md.1b04ad48.lean.js => community_modular-meetup-intro.md.b7a491a8.lean.js} (91%) rename pr-1699/assets/{community_modular-meetup-toolkit.md.f6184c46.js => community_modular-meetup-toolkit.md.0a2e761b.js} (98%) rename pr-1699/assets/{community_modular-meetup-toolkit.md.f6184c46.lean.js => community_modular-meetup-toolkit.md.0a2e761b.lean.js} (90%) rename pr-1699/assets/{community_overview.md.aec66ec4.js => community_overview.md.fb9fd608.js} (94%) rename pr-1699/assets/{community_overview.md.aec66ec4.lean.js => community_overview.md.fb9fd608.lean.js} (94%) rename pr-1699/assets/{community_speaker-list.md.716e09e6.js => community_speaker-list.md.872a3b69.js} (97%) rename pr-1699/assets/{community_speaker-list.md.716e09e6.lean.js => community_speaker-list.md.872a3b69.lean.js} (97%) rename pr-1699/assets/{developers_arbitrum-bridge.md.d7cda10d.js => developers_arbitrum-bridge.md.8c851802.js} (99%) rename pr-1699/assets/{developers_arbitrum-bridge.md.d7cda10d.lean.js => developers_arbitrum-bridge.md.8c851802.lean.js} (96%) rename pr-1699/assets/{developers_arbitrum-dapp-deploy.md.26b815d3.js => developers_arbitrum-dapp-deploy.md.4b34cdb2.js} (99%) rename pr-1699/assets/{developers_arbitrum-dapp-deploy.md.26b815d3.lean.js => developers_arbitrum-dapp-deploy.md.4b34cdb2.lean.js} (92%) rename pr-1699/assets/{developers_arbitrum-deploy.md.c142d06c.js => developers_arbitrum-deploy.md.26acb828.js} (99%) rename pr-1699/assets/{developers_arbitrum-deploy.md.c142d06c.lean.js => developers_arbitrum-deploy.md.26acb828.lean.js} (94%) rename pr-1699/assets/{developers_arbitrum-full-node.md.09e489d4.js => developers_arbitrum-full-node.md.319badbc.js} (98%) rename pr-1699/assets/{developers_arbitrum-full-node.md.09e489d4.lean.js => developers_arbitrum-full-node.md.319badbc.lean.js} (92%) rename pr-1699/assets/{developers_arbitrum-integration.md.2b72ec21.js => developers_arbitrum-integration.md.fd5df284.js} (99%) rename pr-1699/assets/{developers_arbitrum-integration.md.2b72ec21.lean.js => developers_arbitrum-integration.md.fd5df284.lean.js} (93%) rename pr-1699/assets/{developers_arbitrum-smart-contract.md.5de83013.js => developers_arbitrum-smart-contract.md.8b7aa3c4.js} (99%) rename pr-1699/assets/{developers_arbitrum-smart-contract.md.5de83013.lean.js => developers_arbitrum-smart-contract.md.8b7aa3c4.lean.js} (94%) rename pr-1699/assets/{developers_blobstream-contracts.md.25c4c416.js => developers_blobstream-contracts.md.06e023da.js} (99%) rename pr-1699/assets/{developers_blobstream-contracts.md.25c4c416.lean.js => developers_blobstream-contracts.md.06e023da.lean.js} (93%) rename pr-1699/assets/{developers_blobstream-offchain.md.3b490822.js => developers_blobstream-offchain.md.fbd363f2.js} (99%) rename pr-1699/assets/{developers_blobstream-offchain.md.3b490822.lean.js => developers_blobstream-offchain.md.fbd363f2.lean.js} (91%) rename pr-1699/assets/{developers_blobstream-proof-queries.md.21c99b59.js => developers_blobstream-proof-queries.md.19225b90.js} (99%) rename pr-1699/assets/{developers_blobstream-proof-queries.md.21c99b59.lean.js => developers_blobstream-proof-queries.md.19225b90.lean.js} (93%) rename pr-1699/assets/{developers_blobstream-rollups.md.580268e1.js => developers_blobstream-rollups.md.9c8cb137.js} (99%) rename pr-1699/assets/{developers_blobstream-rollups.md.580268e1.lean.js => developers_blobstream-rollups.md.9c8cb137.lean.js} (92%) rename pr-1699/assets/{developers_blobstream-x-deploy.md.e0b78833.js => developers_blobstream-x-deploy.md.6ed5e09e.js} (99%) rename pr-1699/assets/{developers_blobstream-x-deploy.md.e0b78833.lean.js => developers_blobstream-x-deploy.md.6ed5e09e.lean.js} (90%) rename pr-1699/assets/{developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.js => developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.js} (98%) rename pr-1699/assets/{developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.lean.js => developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.lean.js} (92%) rename pr-1699/assets/{developers_blobstream.md.c9e61c23.js => developers_blobstream.md.4afef8bd.js} (99%) rename pr-1699/assets/{developers_blobstream.md.c9e61c23.lean.js => developers_blobstream.md.4afef8bd.lean.js} (91%) rename pr-1699/assets/{developers_blobstreamx.md.67c7a6c7.js => developers_blobstreamx.md.7838cfd1.js} (98%) rename pr-1699/assets/{developers_blobstreamx.md.67c7a6c7.lean.js => developers_blobstreamx.md.7838cfd1.lean.js} (92%) rename pr-1699/assets/{developers_bubs-testnet.md.c168048a.js => developers_bubs-testnet.md.ddf17ba1.js} (98%) rename pr-1699/assets/{developers_bubs-testnet.md.c168048a.lean.js => developers_bubs-testnet.md.ddf17ba1.lean.js} (92%) rename pr-1699/assets/{developers_build-whatever.md.4b64aa7d.js => developers_build-whatever.md.5677fdce.js} (99%) rename pr-1699/assets/{developers_build-whatever.md.4b64aa7d.lean.js => developers_build-whatever.md.5677fdce.lean.js} (98%) rename pr-1699/assets/{developers_celestia-node-key.md.93827487.js => developers_celestia-node-key.md.fe2dab0d.js} (98%) rename pr-1699/assets/{developers_celestia-node-key.md.93827487.lean.js => developers_celestia-node-key.md.fe2dab0d.lean.js} (96%) rename pr-1699/assets/{developers_deploy-on-bubs.md.97e444d7.js => developers_deploy-on-bubs.md.f7abcbb6.js} (99%) rename pr-1699/assets/{developers_deploy-on-bubs.md.97e444d7.lean.js => developers_deploy-on-bubs.md.f7abcbb6.lean.js} (81%) rename pr-1699/assets/{developers_ethereum-fallback.md.00e7ac0b.js => developers_ethereum-fallback.md.764773da.js} (97%) rename pr-1699/assets/{developers_ethereum-fallback.md.00e7ac0b.lean.js => developers_ethereum-fallback.md.764773da.lean.js} (97%) rename pr-1699/assets/{developers_feegrant-for-blobs.md.7c93aaff.js => developers_feegrant-for-blobs.md.84d98514.js} (99%) rename pr-1699/assets/{developers_feegrant-for-blobs.md.7c93aaff.lean.js => developers_feegrant-for-blobs.md.84d98514.lean.js} (79%) rename pr-1699/assets/{developers_full-stack-modular-development-guide.md.3910bdad.js => developers_full-stack-modular-development-guide.md.766923fe.js} (99%) rename pr-1699/assets/{developers_full-stack-modular-development-guide.md.3910bdad.lean.js => developers_full-stack-modular-development-guide.md.766923fe.lean.js} (92%) rename pr-1699/assets/{developers_gm-portal-bubs.md.2e8017d7.js => developers_gm-portal-bubs.md.cd727490.js} (99%) rename pr-1699/assets/{developers_gm-portal-bubs.md.2e8017d7.lean.js => developers_gm-portal-bubs.md.cd727490.lean.js} (92%) rename pr-1699/assets/{developers_golang-client-tutorial.md.0dce1977.js => developers_golang-client-tutorial.md.727ea5e8.js} (99%) rename pr-1699/assets/{developers_golang-client-tutorial.md.0dce1977.lean.js => developers_golang-client-tutorial.md.727ea5e8.lean.js} (89%) rename pr-1699/assets/{developers_integrate-celestia.md.871c3298.js => developers_integrate-celestia.md.cabcfa45.js} (98%) rename pr-1699/assets/{developers_integrate-celestia.md.871c3298.lean.js => developers_integrate-celestia.md.cabcfa45.lean.js} (92%) rename pr-1699/assets/{developers_intro-to-op-stack.md.c09be10b.js => developers_intro-to-op-stack.md.2deb5540.js} (98%) rename pr-1699/assets/{developers_intro-to-op-stack.md.c09be10b.lean.js => developers_intro-to-op-stack.md.2deb5540.lean.js} (92%) rename pr-1699/assets/{developers_multiaccounts.md.5fe51e02.js => developers_multiaccounts.md.6ee7c0ad.js} (99%) rename pr-1699/assets/{developers_multiaccounts.md.5fe51e02.lean.js => developers_multiaccounts.md.6ee7c0ad.lean.js} (89%) rename pr-1699/assets/{developers_node-api.md.8d88dab0.js => developers_node-api.md.6709e8d4.js} (98%) rename pr-1699/assets/{developers_node-api.md.8d88dab0.lean.js => developers_node-api.md.6709e8d4.lean.js} (90%) rename pr-1699/assets/{developers_node-tutorial.md.358f7307.js => developers_node-tutorial.md.79e6f899.js} (99%) rename pr-1699/assets/{developers_node-tutorial.md.358f7307.lean.js => developers_node-tutorial.md.79e6f899.lean.js} (90%) rename pr-1699/assets/{developers_optimism-devnet.md.6da256da.js => developers_optimism-devnet.md.3b3f49a3.js} (99%) rename pr-1699/assets/{developers_optimism-devnet.md.6da256da.lean.js => developers_optimism-devnet.md.3b3f49a3.lean.js} (89%) rename pr-1699/assets/{developers_optimism.md.363527ac.js => developers_optimism.md.d6e1e2ee.js} (93%) rename pr-1699/assets/{developers_optimism.md.363527ac.lean.js => developers_optimism.md.d6e1e2ee.lean.js} (60%) rename pr-1699/assets/{developers_prompt-scavenger.md.fea07a57.js => developers_prompt-scavenger.md.ae717331.js} (99%) rename pr-1699/assets/{developers_prompt-scavenger.md.fea07a57.lean.js => developers_prompt-scavenger.md.ae717331.lean.js} (84%) rename pr-1699/assets/{developers_rust-client-tutorial.md.df611bd3.js => developers_rust-client-tutorial.md.168637c4.js} (99%) rename pr-1699/assets/{developers_rust-client-tutorial.md.df611bd3.lean.js => developers_rust-client-tutorial.md.168637c4.lean.js} (90%) rename pr-1699/assets/{developers_sp1-blobstream-deploy.md.b0ce75b2.js => developers_sp1-blobstream-deploy.md.e4975a52.js} (98%) rename pr-1699/assets/{developers_sp1-blobstream-deploy.md.b0ce75b2.lean.js => developers_sp1-blobstream-deploy.md.e4975a52.lean.js} (91%) rename pr-1699/assets/{developers_submit-data.md.506ef31e.js => developers_submit-data.md.7f90d09f.js} (99%) rename pr-1699/assets/{developers_submit-data.md.506ef31e.lean.js => developers_submit-data.md.7f90d09f.lean.js} (99%) rename pr-1699/assets/{developers_transaction-resubmission.md.2c716084.js => developers_transaction-resubmission.md.ebf49e01.js} (97%) rename pr-1699/assets/{developers_transaction-resubmission.md.2c716084.lean.js => developers_transaction-resubmission.md.ebf49e01.lean.js} (91%) rename pr-1699/assets/{developers_wallets.md.c5fba5d1.js => developers_wallets.md.b2bd7cc6.js} (93%) rename pr-1699/assets/{developers_wallets.md.c5fba5d1.lean.js => developers_wallets.md.b2bd7cc6.lean.js} (76%) rename pr-1699/assets/{index.md.d57eea6f.js => index.md.7de6d8b3.js} (96%) rename pr-1699/assets/{index.md.d57eea6f.lean.js => index.md.7de6d8b3.lean.js} (96%) rename pr-1699/assets/{learn_how-celestia-works_data-availability-faq.md.506e0c10.js => learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.js} (99%) rename pr-1699/assets/{learn_how-celestia-works_data-availability-faq.md.506e0c10.lean.js => learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.lean.js} (93%) rename pr-1699/assets/{learn_how-celestia-works_data-availability-layer.md.d71fa908.js => learn_how-celestia-works_data-availability-layer.md.4a9aff1a.js} (99%) rename pr-1699/assets/{learn_how-celestia-works_data-availability-layer.md.d71fa908.lean.js => learn_how-celestia-works_data-availability-layer.md.4a9aff1a.lean.js} (99%) rename pr-1699/assets/{learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.js => learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.js} (98%) rename pr-1699/assets/{learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.lean.js => learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.lean.js} (92%) rename pr-1699/assets/{learn_how-celestia-works_overview.md.e560d4a4.js => learn_how-celestia-works_overview.md.42a4dc74.js} (97%) rename pr-1699/assets/{learn_how-celestia-works_overview.md.e560d4a4.lean.js => learn_how-celestia-works_overview.md.42a4dc74.lean.js} (89%) rename pr-1699/assets/{learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.js => learn_how-celestia-works_transaction-lifecycle.md.def776d7.js} (99%) rename pr-1699/assets/{learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.lean.js => learn_how-celestia-works_transaction-lifecycle.md.def776d7.lean.js} (99%) rename pr-1699/assets/{learn_how-to-stake-tia.md.f5076e81.js => learn_how-to-stake-tia.md.68dbd46b.js} (99%) rename pr-1699/assets/{learn_how-to-stake-tia.md.f5076e81.lean.js => learn_how-to-stake-tia.md.68dbd46b.lean.js} (95%) rename pr-1699/assets/{learn_paying-for-blobspace.md.61719f03.js => learn_paying-for-blobspace.md.06ae9c17.js} (97%) rename pr-1699/assets/{learn_paying-for-blobspace.md.61719f03.lean.js => learn_paying-for-blobspace.md.06ae9c17.lean.js} (90%) rename pr-1699/assets/{learn_retrievability.md.8931b632.js => learn_retrievability.md.d1e1d36b.js} (98%) rename pr-1699/assets/{learn_retrievability.md.8931b632.lean.js => learn_retrievability.md.d1e1d36b.lean.js} (92%) rename pr-1699/assets/{learn_staking-governance-supply.md.2093ea4e.js => learn_staking-governance-supply.md.0d21fda6.js} (99%) rename pr-1699/assets/{learn_staking-governance-supply.md.2093ea4e.lean.js => learn_staking-governance-supply.md.0d21fda6.lean.js} (93%) rename pr-1699/assets/{learn_staking.md.9713419c.js => learn_staking.md.f13c2e81.js} (97%) rename pr-1699/assets/{learn_staking.md.9713419c.lean.js => learn_staking.md.f13c2e81.lean.js} (90%) rename pr-1699/assets/{learn_tia.md.6fd97b1e.js => learn_tia.md.9065ce93.js} (99%) rename pr-1699/assets/{learn_tia.md.6fd97b1e.lean.js => learn_tia.md.9065ce93.lean.js} (97%) rename pr-1699/assets/{nodes_arabica-devnet.md.960dc284.js => nodes_arabica-devnet.md.5fbea086.js} (99%) rename pr-1699/assets/{nodes_arabica-devnet.md.960dc284.lean.js => nodes_arabica-devnet.md.5fbea086.lean.js} (97%) rename pr-1699/assets/{nodes_bridge-node.md.71e96d87.js => nodes_bridge-node.md.40517142.js} (97%) rename pr-1699/assets/{nodes_bridge-node.md.71e96d87.lean.js => nodes_bridge-node.md.40517142.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-app-commands.md.0be51395.js => nodes_celestia-app-commands.md.16f0c3b5.js} (99%) rename pr-1699/assets/{nodes_celestia-app-commands.md.0be51395.lean.js => nodes_celestia-app-commands.md.16f0c3b5.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-app-metrics.md.ba859d9d.js => nodes_celestia-app-metrics.md.0b6cb333.js} (99%) rename pr-1699/assets/{nodes_celestia-app-metrics.md.ba859d9d.lean.js => nodes_celestia-app-metrics.md.0b6cb333.lean.js} (92%) rename pr-1699/assets/{nodes_celestia-app-multisig.md.cf17caf2.js => nodes_celestia-app-multisig.md.4833031c.js} (99%) rename pr-1699/assets/{nodes_celestia-app-multisig.md.cf17caf2.lean.js => nodes_celestia-app-multisig.md.4833031c.lean.js} (88%) rename pr-1699/assets/{nodes_celestia-app-slashing.md.c061c14c.js => nodes_celestia-app-slashing.md.5b9f9df0.js} (97%) rename pr-1699/assets/{nodes_celestia-app-slashing.md.c061c14c.lean.js => nodes_celestia-app-slashing.md.5b9f9df0.lean.js} (92%) rename pr-1699/assets/{nodes_celestia-app-upgrade-monitor.md.c2b31db9.js => nodes_celestia-app-upgrade-monitor.md.0555c2d4.js} (89%) rename pr-1699/assets/{nodes_celestia-app-upgrade-monitor.md.c2b31db9.lean.js => nodes_celestia-app-upgrade-monitor.md.0555c2d4.lean.js} (89%) rename pr-1699/assets/{nodes_celestia-app-vesting.md.e8ca90cc.js => nodes_celestia-app-vesting.md.e829dc7e.js} (99%) rename pr-1699/assets/{nodes_celestia-app-vesting.md.e8ca90cc.lean.js => nodes_celestia-app-vesting.md.e829dc7e.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-app-wallet.md.47e26967.js => nodes_celestia-app-wallet.md.70b5fba3.js} (99%) rename pr-1699/assets/{nodes_celestia-app-wallet.md.47e26967.lean.js => nodes_celestia-app-wallet.md.70b5fba3.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-app.md.6fd2fd36.js => nodes_celestia-app.md.e09a3b72.js} (82%) rename pr-1699/assets/{nodes_celestia-app.md.6fd2fd36.lean.js => nodes_celestia-app.md.e09a3b72.lean.js} (56%) rename pr-1699/assets/{nodes_celestia-node-custom-networks.md.759a61e7.js => nodes_celestia-node-custom-networks.md.aac3b114.js} (99%) rename pr-1699/assets/{nodes_celestia-node-custom-networks.md.759a61e7.lean.js => nodes_celestia-node-custom-networks.md.aac3b114.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-node-metrics.md.6d2f305e.js => nodes_celestia-node-metrics.md.e49bb967.js} (99%) rename pr-1699/assets/{nodes_celestia-node-metrics.md.6d2f305e.lean.js => nodes_celestia-node-metrics.md.e49bb967.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-node-troubleshooting.md.6134a7ab.js => nodes_celestia-node-troubleshooting.md.d5102d28.js} (99%) rename pr-1699/assets/{nodes_celestia-node-troubleshooting.md.6134a7ab.lean.js => nodes_celestia-node-troubleshooting.md.d5102d28.lean.js} (96%) rename pr-1699/assets/{nodes_celestia-node-trusted-hash.md.4094be4e.js => nodes_celestia-node-trusted-hash.md.941c6f87.js} (99%) rename pr-1699/assets/{nodes_celestia-node-trusted-hash.md.4094be4e.lean.js => nodes_celestia-node-trusted-hash.md.941c6f87.lean.js} (91%) rename pr-1699/assets/{nodes_celestia-node.md.2de1eba4.js => nodes_celestia-node.md.b506c65d.js} (83%) rename pr-1699/assets/{nodes_celestia-node.md.2de1eba4.lean.js => nodes_celestia-node.md.b506c65d.lean.js} (50%) rename pr-1699/assets/{nodes_config-toml.md.cfad1001.js => nodes_config-toml.md.ea91864b.js} (98%) rename pr-1699/assets/{nodes_config-toml.md.cfad1001.lean.js => nodes_config-toml.md.ea91864b.lean.js} (90%) rename pr-1699/assets/{nodes_consensus-node.md.c0f03057.js => nodes_consensus-node.md.99f6268d.js} (89%) rename pr-1699/assets/{nodes_consensus-node.md.c0f03057.lean.js => nodes_consensus-node.md.99f6268d.lean.js} (65%) rename pr-1699/assets/{nodes_decide-node.md.ce340382.js => nodes_decide-node.md.12527b86.js} (96%) rename pr-1699/assets/{nodes_decide-node.md.ce340382.lean.js => nodes_decide-node.md.12527b86.lean.js} (90%) rename pr-1699/assets/{nodes_docker-images.md.c689a2da.js => nodes_docker-images.md.01970048.js} (85%) rename pr-1699/assets/{nodes_docker-images.md.c689a2da.lean.js => nodes_docker-images.md.01970048.lean.js} (60%) rename pr-1699/assets/{nodes_environment.md.d3b85368.js => nodes_environment.md.502fd51d.js} (92%) rename pr-1699/assets/{nodes_environment.md.d3b85368.lean.js => nodes_environment.md.502fd51d.lean.js} (67%) rename pr-1699/assets/{nodes_full-storage-node.md.3d825d2f.js => nodes_full-storage-node.md.27554da6.js} (96%) rename pr-1699/assets/{nodes_full-storage-node.md.3d825d2f.lean.js => nodes_full-storage-node.md.27554da6.lean.js} (91%) rename pr-1699/assets/{nodes_hardfork-process.md.d852b283.js => nodes_hardfork-process.md.b85c06e7.js} (97%) rename pr-1699/assets/{nodes_hardfork-process.md.d852b283.lean.js => nodes_hardfork-process.md.b85c06e7.lean.js} (81%) rename pr-1699/assets/{nodes_ibc-relayer.md.3c1ba349.js => nodes_ibc-relayer.md.450545b1.js} (99%) rename pr-1699/assets/{nodes_ibc-relayer.md.3c1ba349.lean.js => nodes_ibc-relayer.md.450545b1.lean.js} (91%) rename pr-1699/assets/{nodes_instantiate-testnet.md.46c96647.js => nodes_instantiate-testnet.md.4b062bf6.js} (99%) rename pr-1699/assets/{nodes_instantiate-testnet.md.46c96647.lean.js => nodes_instantiate-testnet.md.4b062bf6.lean.js} (91%) rename pr-1699/assets/{nodes_light-node.md.c1fa0172.js => nodes_light-node.md.f1dd6ad1.js} (95%) rename pr-1699/assets/{nodes_light-node.md.c1fa0172.lean.js => nodes_light-node.md.f1dd6ad1.lean.js} (67%) rename pr-1699/assets/{nodes_mainnet.md.0230b2ce.js => nodes_mainnet.md.0bba5c8e.js} (99%) rename pr-1699/assets/{nodes_mainnet.md.0230b2ce.lean.js => nodes_mainnet.md.0bba5c8e.lean.js} (99%) rename pr-1699/assets/{nodes_mocha-testnet.md.58edd1a9.js => nodes_mocha-testnet.md.0e4cf674.js} (99%) rename pr-1699/assets/{nodes_mocha-testnet.md.58edd1a9.lean.js => nodes_mocha-testnet.md.0e4cf674.lean.js} (97%) rename pr-1699/assets/{nodes_overview.md.8cf8c5aa.js => nodes_overview.md.4223caea.js} (98%) rename pr-1699/assets/{nodes_overview.md.8cf8c5aa.lean.js => nodes_overview.md.4223caea.lean.js} (91%) rename pr-1699/assets/{nodes_participate.md.cd0dcc78.js => nodes_participate.md.704b27c3.js} (98%) rename pr-1699/assets/{nodes_participate.md.cd0dcc78.lean.js => nodes_participate.md.704b27c3.lean.js} (93%) rename pr-1699/assets/{nodes_quick-start.md.7f0ce7b8.js => nodes_quick-start.md.9a9eabfc.js} (97%) rename pr-1699/assets/{nodes_quick-start.md.7f0ce7b8.lean.js => nodes_quick-start.md.9a9eabfc.lean.js} (90%) rename pr-1699/assets/{nodes_systemd.md.794b3b4f.js => nodes_systemd.md.66ed5d05.js} (99%) rename pr-1699/assets/{nodes_systemd.md.794b3b4f.lean.js => nodes_systemd.md.66ed5d05.lean.js} (91%) rename pr-1699/assets/{nodes_validator-node.md.2b9abf8d.js => nodes_validator-node.md.084b1069.js} (97%) rename pr-1699/assets/{nodes_validator-node.md.2b9abf8d.lean.js => nodes_validator-node.md.084b1069.lean.js} (90%) diff --git a/pr-1699/404.html b/pr-1699/404.html index 275f35ba4d..baaebac9eb 100644 --- a/pr-1699/404.html +++ b/pr-1699/404.html @@ -35,7 +35,7 @@

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/pr-1699/README.html b/pr-1699/README.html index e8cc0bf556..a2e3332084 100644 --- a/pr-1699/README.html +++ b/pr-1699/README.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Celestia Documentation Site

Welcome to the official documentation repository for Celestia.

Here you'll find comprehensive guides, tutorials, and reference materials to help you make the most out of Celestia.

Building the site

To get started, clone the repository and run the following:

bash
yarn && yarn dev
yarn && yarn dev

This documentation site is built with VitePress

Contribution Guidelines

We love contributions from the community! Whether you're fixing typos, improving content clarity, or adding new topics, every contribution helps.

  • Fork & Clone: Fork this repository and clone it to your local machine.
  • Branch: Always create a new branch for your changes. Naming it relevantly.
  • Commit Changes: Make your changes and commit them with a clear and concise commit message.
  • Push & Create PR: Push your changes to your fork and create a pull request to the main branch of this repository.

Please ensure to review the detailed Contribution Guidelines above before making a pull request.

Directory Structure

  • /learn: A category for learning about Celestia.
  • /developers: A category with tutorials and guides for deploying rollups and interacting with Celestia nodes.
  • /nodes: Technical reference materials for all node types.
  • /community: A category for the Celestia community.
  • /public: Images, diagrams, and other media files used in the documentation.

Feedback & Suggestions

We value feedback from the community. If you have suggestions for improvements or find any discrepancies in the documentation, please raise an issue in this repository.

- +

Celestia Documentation Site

Welcome to the official documentation repository for Celestia.

Here you'll find comprehensive guides, tutorials, and reference materials to help you make the most out of Celestia.

Building the site

To get started, clone the repository and run the following:

bash
yarn && yarn dev
yarn && yarn dev

This documentation site is built with VitePress

Contribution Guidelines

We love contributions from the community! Whether you're fixing typos, improving content clarity, or adding new topics, every contribution helps.

  • Fork & Clone: Fork this repository and clone it to your local machine.
  • Branch: Always create a new branch for your changes. Naming it relevantly.
  • Commit Changes: Make your changes and commit them with a clear and concise commit message.
  • Push & Create PR: Push your changes to your fork and create a pull request to the main branch of this repository.

Please ensure to review the detailed Contribution Guidelines above before making a pull request.

Directory Structure

  • /learn: A category for learning about Celestia.
  • /developers: A category with tutorials and guides for deploying rollups and interacting with Celestia nodes.
  • /nodes: Technical reference materials for all node types.
  • /community: A category for the Celestia community.
  • /public: Images, diagrams, and other media files used in the documentation.

Feedback & Suggestions

We value feedback from the community. If you have suggestions for improvements or find any discrepancies in the documentation, please raise an issue in this repository.

+ \ No newline at end of file diff --git a/pr-1699/assets/README.md.44659d85.js b/pr-1699/assets/README.md.ebe4136d.js similarity index 96% rename from pr-1699/assets/README.md.44659d85.js rename to pr-1699/assets/README.md.ebe4136d.js index 75c92a611e..9498a67469 100644 --- a/pr-1699/assets/README.md.44659d85.js +++ b/pr-1699/assets/README.md.ebe4136d.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia Documentation Site","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia Documentation Site | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1725971357000}'),o={name:"README.md"},n=i('

Celestia Documentation Site

Welcome to the official documentation repository for Celestia.

Here you'll find comprehensive guides, tutorials, and reference materials to help you make the most out of Celestia.

Building the site

To get started, clone the repository and run the following:

bash
yarn && yarn dev
yarn && yarn dev

This documentation site is built with VitePress

Contribution Guidelines

We love contributions from the community! Whether you're fixing typos, improving content clarity, or adding new topics, every contribution helps.

Please ensure to review the detailed Contribution Guidelines above before making a pull request.

Directory Structure

Feedback & Suggestions

We value feedback from the community. If you have suggestions for improvements or find any discrepancies in the documentation, please raise an issue in this repository.

',16),s=[n];function r(l,c,u,d,p,h){return t(),a("div",null,s)}const y=e(o,[["render",r]]);export{g as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia Documentation Site","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia Documentation Site | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1725992025000}'),o={name:"README.md"},n=i('

Celestia Documentation Site

Welcome to the official documentation repository for Celestia.

Here you'll find comprehensive guides, tutorials, and reference materials to help you make the most out of Celestia.

Building the site

To get started, clone the repository and run the following:

bash
yarn && yarn dev
yarn && yarn dev

This documentation site is built with VitePress

Contribution Guidelines

We love contributions from the community! Whether you're fixing typos, improving content clarity, or adding new topics, every contribution helps.

Please ensure to review the detailed Contribution Guidelines above before making a pull request.

Directory Structure

Feedback & Suggestions

We value feedback from the community. If you have suggestions for improvements or find any discrepancies in the documentation, please raise an issue in this repository.

',16),s=[n];function r(l,c,u,d,p,h){return t(),a("div",null,s)}const y=e(o,[["render",r]]);export{g as __pageData,y as default}; diff --git a/pr-1699/assets/README.md.44659d85.lean.js b/pr-1699/assets/README.md.ebe4136d.lean.js similarity index 76% rename from pr-1699/assets/README.md.44659d85.lean.js rename to pr-1699/assets/README.md.ebe4136d.lean.js index 8589025f51..35a2a79da5 100644 --- a/pr-1699/assets/README.md.44659d85.lean.js +++ b/pr-1699/assets/README.md.ebe4136d.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia Documentation Site","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia Documentation Site | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1725971357000}'),o={name:"README.md"},n=i("",16),s=[n];function r(l,c,u,d,p,h){return t(),a("div",null,s)}const y=e(o,[["render",r]]);export{g as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia Documentation Site","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia Documentation Site | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1725992025000}'),o={name:"README.md"},n=i("",16),s=[n];function r(l,c,u,d,p,h){return t(),a("div",null,s)}const y=e(o,[["render",r]]);export{g as __pageData,y as default}; diff --git a/pr-1699/assets/community_calendar.md.5a6b1214.js b/pr-1699/assets/community_calendar.md.f70856a8.js similarity index 95% rename from pr-1699/assets/community_calendar.md.5a6b1214.js rename to pr-1699/assets/community_calendar.md.f70856a8.js index e35f3c5b42..12873454d8 100644 --- a/pr-1699/assets/community_calendar.md.5a6b1214.js +++ b/pr-1699/assets/community_calendar.md.f70856a8.js @@ -1 +1 @@ -import{_ as t,o as n,c as o,k as e,a}from"./chunks/framework.b47e54aa.js";const b=JSON.parse(`{"title":"Community calendar","description":"Find all the different community call events happening in Celestia's community.","frontmatter":{"description":"Find all the different community call events happening in Celestia's community.","head":[["meta",{"name":"og:title","content":"Community calendar | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/calendar.md","filePath":"community/calendar.md","lastUpdated":1725971357000}`),l={name:"community/calendar.md"},c=e("h1",{id:"community-calendar",tabindex:"-1"},[a("Community calendar "),e("a",{class:"header-anchor",href:"#community-calendar","aria-label":'Permalink to "Community calendar"'},"​")],-1),i=e("p",null,"The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.",-1),r=e("p",null,[e("a",{href:"https://calendar.google.com/calendar/u/0?cid=Y19za2JzbjIzNWszYmlzdHNoZ3RvNmw5ODYyNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t",target:"_blank",rel:"noreferrer"},"Add the community calendar to your personal calendar"),a(" to stay updated with all the events.")],-1),s=e("p",null,[a("Explore "),e("a",{href:"https://github.com/celestiaorg/community-calls/blob/main/README.md",target:"_blank",rel:"noreferrer"},"past community call agendas, notes, and recordings"),a(" for more insights.")],-1),m=[c,i,r,s];function d(u,h,p,f,_,y){return n(),o("div",null,m)}const C=t(l,[["render",d]]);export{b as __pageData,C as default}; +import{_ as t,o as n,c as o,k as e,a}from"./chunks/framework.b47e54aa.js";const b=JSON.parse(`{"title":"Community calendar","description":"Find all the different community call events happening in Celestia's community.","frontmatter":{"description":"Find all the different community call events happening in Celestia's community.","head":[["meta",{"name":"og:title","content":"Community calendar | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/calendar.md","filePath":"community/calendar.md","lastUpdated":1725992025000}`),l={name:"community/calendar.md"},c=e("h1",{id:"community-calendar",tabindex:"-1"},[a("Community calendar "),e("a",{class:"header-anchor",href:"#community-calendar","aria-label":'Permalink to "Community calendar"'},"​")],-1),i=e("p",null,"The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.",-1),r=e("p",null,[e("a",{href:"https://calendar.google.com/calendar/u/0?cid=Y19za2JzbjIzNWszYmlzdHNoZ3RvNmw5ODYyNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t",target:"_blank",rel:"noreferrer"},"Add the community calendar to your personal calendar"),a(" to stay updated with all the events.")],-1),s=e("p",null,[a("Explore "),e("a",{href:"https://github.com/celestiaorg/community-calls/blob/main/README.md",target:"_blank",rel:"noreferrer"},"past community call agendas, notes, and recordings"),a(" for more insights.")],-1),m=[c,i,r,s];function d(u,h,p,f,_,y){return n(),o("div",null,m)}const C=t(l,[["render",d]]);export{b as __pageData,C as default}; diff --git a/pr-1699/assets/community_calendar.md.5a6b1214.lean.js b/pr-1699/assets/community_calendar.md.f70856a8.lean.js similarity index 95% rename from pr-1699/assets/community_calendar.md.5a6b1214.lean.js rename to pr-1699/assets/community_calendar.md.f70856a8.lean.js index e35f3c5b42..12873454d8 100644 --- a/pr-1699/assets/community_calendar.md.5a6b1214.lean.js +++ b/pr-1699/assets/community_calendar.md.f70856a8.lean.js @@ -1 +1 @@ -import{_ as t,o as n,c as o,k as e,a}from"./chunks/framework.b47e54aa.js";const b=JSON.parse(`{"title":"Community calendar","description":"Find all the different community call events happening in Celestia's community.","frontmatter":{"description":"Find all the different community call events happening in Celestia's community.","head":[["meta",{"name":"og:title","content":"Community calendar | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/calendar.md","filePath":"community/calendar.md","lastUpdated":1725971357000}`),l={name:"community/calendar.md"},c=e("h1",{id:"community-calendar",tabindex:"-1"},[a("Community calendar "),e("a",{class:"header-anchor",href:"#community-calendar","aria-label":'Permalink to "Community calendar"'},"​")],-1),i=e("p",null,"The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.",-1),r=e("p",null,[e("a",{href:"https://calendar.google.com/calendar/u/0?cid=Y19za2JzbjIzNWszYmlzdHNoZ3RvNmw5ODYyNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t",target:"_blank",rel:"noreferrer"},"Add the community calendar to your personal calendar"),a(" to stay updated with all the events.")],-1),s=e("p",null,[a("Explore "),e("a",{href:"https://github.com/celestiaorg/community-calls/blob/main/README.md",target:"_blank",rel:"noreferrer"},"past community call agendas, notes, and recordings"),a(" for more insights.")],-1),m=[c,i,r,s];function d(u,h,p,f,_,y){return n(),o("div",null,m)}const C=t(l,[["render",d]]);export{b as __pageData,C as default}; +import{_ as t,o as n,c as o,k as e,a}from"./chunks/framework.b47e54aa.js";const b=JSON.parse(`{"title":"Community calendar","description":"Find all the different community call events happening in Celestia's community.","frontmatter":{"description":"Find all the different community call events happening in Celestia's community.","head":[["meta",{"name":"og:title","content":"Community calendar | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/calendar.md","filePath":"community/calendar.md","lastUpdated":1725992025000}`),l={name:"community/calendar.md"},c=e("h1",{id:"community-calendar",tabindex:"-1"},[a("Community calendar "),e("a",{class:"header-anchor",href:"#community-calendar","aria-label":'Permalink to "Community calendar"'},"​")],-1),i=e("p",null,"The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.",-1),r=e("p",null,[e("a",{href:"https://calendar.google.com/calendar/u/0?cid=Y19za2JzbjIzNWszYmlzdHNoZ3RvNmw5ODYyNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t",target:"_blank",rel:"noreferrer"},"Add the community calendar to your personal calendar"),a(" to stay updated with all the events.")],-1),s=e("p",null,[a("Explore "),e("a",{href:"https://github.com/celestiaorg/community-calls/blob/main/README.md",target:"_blank",rel:"noreferrer"},"past community call agendas, notes, and recordings"),a(" for more insights.")],-1),m=[c,i,r,s];function d(u,h,p,f,_,y){return n(),o("div",null,m)}const C=t(l,[["render",d]]);export{b as __pageData,C as default}; diff --git a/pr-1699/assets/community_coc.md.db13614f.js b/pr-1699/assets/community_coc.md.de9fdd2a.js similarity index 98% rename from pr-1699/assets/community_coc.md.db13614f.js rename to pr-1699/assets/community_coc.md.de9fdd2a.js index c8fdf73327..b045dde83b 100644 --- a/pr-1699/assets/community_coc.md.db13614f.js +++ b/pr-1699/assets/community_coc.md.de9fdd2a.js @@ -1 +1 @@ -import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse(`{"title":"Celestia.org Code of Conduct","description":"Fundamental shared values and special norms that distinguish Celestia's community.","frontmatter":{"description":"Fundamental shared values and special norms that distinguish Celestia's community.","head":[["meta",{"name":"og:title","content":"Celestia.org Code of Conduct | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/coc.md","filePath":"community/coc.md","lastUpdated":1725971357000}`),n={name:"community/coc.md"},i=t('

Celestia.org Code of Conduct

Our Pledge

We as Celestia.org members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards

Examples of behavior that contributes to a positive environment for our community include:

Examples of unacceptable behavior include:

Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Celestia.org Discord. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

',35),r=[i];function s(c,l,d,p,u,h){return o(),a("div",null,r)}const g=e(n,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse(`{"title":"Celestia.org Code of Conduct","description":"Fundamental shared values and special norms that distinguish Celestia's community.","frontmatter":{"description":"Fundamental shared values and special norms that distinguish Celestia's community.","head":[["meta",{"name":"og:title","content":"Celestia.org Code of Conduct | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/coc.md","filePath":"community/coc.md","lastUpdated":1725992025000}`),n={name:"community/coc.md"},i=t('

Celestia.org Code of Conduct

Our Pledge

We as Celestia.org members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards

Examples of behavior that contributes to a positive environment for our community include:

Examples of unacceptable behavior include:

Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Celestia.org Discord. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

',35),r=[i];function s(c,l,d,p,u,h){return o(),a("div",null,r)}const g=e(n,[["render",s]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/community_coc.md.db13614f.lean.js b/pr-1699/assets/community_coc.md.de9fdd2a.lean.js similarity index 82% rename from pr-1699/assets/community_coc.md.db13614f.lean.js rename to pr-1699/assets/community_coc.md.de9fdd2a.lean.js index d99f8d7830..65087f7b28 100644 --- a/pr-1699/assets/community_coc.md.db13614f.lean.js +++ b/pr-1699/assets/community_coc.md.de9fdd2a.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse(`{"title":"Celestia.org Code of Conduct","description":"Fundamental shared values and special norms that distinguish Celestia's community.","frontmatter":{"description":"Fundamental shared values and special norms that distinguish Celestia's community.","head":[["meta",{"name":"og:title","content":"Celestia.org Code of Conduct | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/coc.md","filePath":"community/coc.md","lastUpdated":1725971357000}`),n={name:"community/coc.md"},i=t("",35),r=[i];function s(c,l,d,p,u,h){return o(),a("div",null,r)}const g=e(n,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse(`{"title":"Celestia.org Code of Conduct","description":"Fundamental shared values and special norms that distinguish Celestia's community.","frontmatter":{"description":"Fundamental shared values and special norms that distinguish Celestia's community.","head":[["meta",{"name":"og:title","content":"Celestia.org Code of Conduct | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/coc.md","filePath":"community/coc.md","lastUpdated":1725992025000}`),n={name:"community/coc.md"},i=t("",35),r=[i];function s(c,l,d,p,u,h){return o(),a("div",null,r)}const g=e(n,[["render",s]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/community_foundation-delegation-program.md.abd31332.js b/pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.js similarity index 99% rename from pr-1699/assets/community_foundation-delegation-program.md.abd31332.js rename to pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.js index 9495c771b2..7a9bda1272 100644 --- a/pr-1699/assets/community_foundation-delegation-program.md.abd31332.js +++ b/pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/foundation-delegation-program.jpg",r="/docs-preview/pr-1699/img/cohort-timeline.jpg",b=JSON.parse('{"title":"The Celestia Foundation Delegation Program","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"The Celestia Foundation Delegation Program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/foundation-delegation-program.md","filePath":"community/foundation-delegation-program.md","lastUpdated":1725971357000}'),n={name:"community/foundation-delegation-program.md"},l=i('

The Celestia Foundation Delegation Program

Delegation program banner

Objectives of the program

The primary objectives of the Celestia Foundation Delegation Program are:

Foundation delegation process

Program launch

Prospective validators are welcome to apply to the program starting February 6, 2024. The application is designed to assess a validator’s uptime performance and contributions to the Celestia ecosystem. Of the 100 total slots in Celestia’s active validator set, up to 50 will receive delegations within the program.

Application submissions will be reviewed by the Celestia Foundation. More details about the application and eligibility criteria are described below.

Cohort process

cohort timeline

Every 4 months, the Celestia Foundation will distribute a portion of the Foundation’s total available stake to a cohort of validators who meet certain criteria, detailed below. Here is an overview of how the cohort process will work for Cohort 1 and what that means for future cohorts.

Key Points

TierPlacementDelegation DurationRenewal By Cohort
First PlaceApplicants 1-2012 monthsCohort 4
Second PlaceApplicants 21-358 monthsCohort 3
Third PlaceApplicants 36-504 monthsCohort 2

During this period, so long as the validator maintains high uptime and does not violate the rules of the program, the validator will receive the delegation for the duration of the cohort they are currently in.

Eligibility criteria

The minimum requirements for participation in the program are as follows:

Not adhering to any of the criteria above will automatically disqualify your application, and violating any of the criteria after you have received delegation will result in withdrawal of the delegation. A participant who loses stake due to being jailed by the protocol may reapply to the program after 2 cohort periods.

Applicants are also expected to have reviewed Celestia docs and recommended guides on devops and monitoring setups.

Other optional but important criteria:

Undelegation criteria

Application

The program will be divided into cohorts with applications open for new applicants and renewal of existing applicants every 4 months. Validators will be delegated for up to a year. For each cohort, the deadline to apply/be evaluated (if you are reapplying) is exactly 1 month prior to the date of being delegated to.

Application details

Before applying, be ready to share the following:

Please note, the objective of the program is to contribute to Celestia’s resilience and uptime. If you contribute a lot to the Celestia ecosystem, but your validator uptime is low, this will negatively impact your chance at selection for the program. Furthermore, merely receiving delegation from the Foundation under the program does not guarantee your placement in the active validator set.

Get Started with the Application Form

Cohort information

The Foundation will report each cohort’s composition and the duration of their respective delegations.

IMPORTANT: Each validator selected for the program has to maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha.

Feedback process

Validators in the program will receive a feedback form every quarter, so the program can be continually improved.

',39),s=[l];function d(c,h,p,u,m,g){return t(),a("div",null,s)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/foundation-delegation-program.jpg",r="/docs-preview/pr-1699/img/cohort-timeline.jpg",b=JSON.parse('{"title":"The Celestia Foundation Delegation Program","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"The Celestia Foundation Delegation Program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/foundation-delegation-program.md","filePath":"community/foundation-delegation-program.md","lastUpdated":1725992025000}'),n={name:"community/foundation-delegation-program.md"},l=i('

The Celestia Foundation Delegation Program

Delegation program banner

Objectives of the program

The primary objectives of the Celestia Foundation Delegation Program are:

Foundation delegation process

Program launch

Prospective validators are welcome to apply to the program starting February 6, 2024. The application is designed to assess a validator’s uptime performance and contributions to the Celestia ecosystem. Of the 100 total slots in Celestia’s active validator set, up to 50 will receive delegations within the program.

Application submissions will be reviewed by the Celestia Foundation. More details about the application and eligibility criteria are described below.

Cohort process

cohort timeline

Every 4 months, the Celestia Foundation will distribute a portion of the Foundation’s total available stake to a cohort of validators who meet certain criteria, detailed below. Here is an overview of how the cohort process will work for Cohort 1 and what that means for future cohorts.

Key Points

TierPlacementDelegation DurationRenewal By Cohort
First PlaceApplicants 1-2012 monthsCohort 4
Second PlaceApplicants 21-358 monthsCohort 3
Third PlaceApplicants 36-504 monthsCohort 2

During this period, so long as the validator maintains high uptime and does not violate the rules of the program, the validator will receive the delegation for the duration of the cohort they are currently in.

Eligibility criteria

The minimum requirements for participation in the program are as follows:

Not adhering to any of the criteria above will automatically disqualify your application, and violating any of the criteria after you have received delegation will result in withdrawal of the delegation. A participant who loses stake due to being jailed by the protocol may reapply to the program after 2 cohort periods.

Applicants are also expected to have reviewed Celestia docs and recommended guides on devops and monitoring setups.

Other optional but important criteria:

Undelegation criteria

Application

The program will be divided into cohorts with applications open for new applicants and renewal of existing applicants every 4 months. Validators will be delegated for up to a year. For each cohort, the deadline to apply/be evaluated (if you are reapplying) is exactly 1 month prior to the date of being delegated to.

Application details

Before applying, be ready to share the following:

Please note, the objective of the program is to contribute to Celestia’s resilience and uptime. If you contribute a lot to the Celestia ecosystem, but your validator uptime is low, this will negatively impact your chance at selection for the program. Furthermore, merely receiving delegation from the Foundation under the program does not guarantee your placement in the active validator set.

Get Started with the Application Form

Cohort information

The Foundation will report each cohort’s composition and the duration of their respective delegations.

IMPORTANT: Each validator selected for the program has to maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha.

Feedback process

Validators in the program will receive a feedback form every quarter, so the program can be continually improved.

',39),s=[l];function d(c,h,p,u,m,g){return t(),a("div",null,s)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; diff --git a/pr-1699/assets/community_foundation-delegation-program.md.abd31332.lean.js b/pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.lean.js similarity index 91% rename from pr-1699/assets/community_foundation-delegation-program.md.abd31332.lean.js rename to pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.lean.js index ee53d1015c..d7d20fb5d4 100644 --- a/pr-1699/assets/community_foundation-delegation-program.md.abd31332.lean.js +++ b/pr-1699/assets/community_foundation-delegation-program.md.ff7a7f05.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/foundation-delegation-program.jpg",r="/docs-preview/pr-1699/img/cohort-timeline.jpg",b=JSON.parse('{"title":"The Celestia Foundation Delegation Program","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"The Celestia Foundation Delegation Program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/foundation-delegation-program.md","filePath":"community/foundation-delegation-program.md","lastUpdated":1725971357000}'),n={name:"community/foundation-delegation-program.md"},l=i("",39),s=[l];function d(c,h,p,u,m,g){return t(),a("div",null,s)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/foundation-delegation-program.jpg",r="/docs-preview/pr-1699/img/cohort-timeline.jpg",b=JSON.parse('{"title":"The Celestia Foundation Delegation Program","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"The Celestia Foundation Delegation Program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/foundation-delegation-program.md","filePath":"community/foundation-delegation-program.md","lastUpdated":1725992025000}'),n={name:"community/foundation-delegation-program.md"},l=i("",39),s=[l];function d(c,h,p,u,m,g){return t(),a("div",null,s)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; diff --git a/pr-1699/assets/community_itn-tos.md.23529d8e.js b/pr-1699/assets/community_itn-tos.md.6454438f.js similarity index 99% rename from pr-1699/assets/community_itn-tos.md.23529d8e.js rename to pr-1699/assets/community_itn-tos.md.6454438f.js index 55f36bfa45..285a6686f2 100644 --- a/pr-1699/assets/community_itn-tos.md.23529d8e.js +++ b/pr-1699/assets/community_itn-tos.md.6454438f.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS","description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","frontmatter":{"description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","lastUpdated":false,"editLink":false,"head":[["meta",{"name":"og:title","content":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/itn-tos.md","filePath":"community/itn-tos.md","lastUpdated":1725971357000}'),r={name:"community/itn-tos.md"},n=a('

SUPPLEMENTAL INCENTIVIZED TESTNET TERMS

Last Revised on 1/16/2023

Welcome to the Supplemental Terms (these "ITN Award Program Terms" or "Terms") for the Incentivized Testnet Award Program (the "ITN Award Program" or the "Program") as operated on behalf of Strange Loop Labs AG ("Company", "we" or "us"). The ITN Award Program provides eligible users of a Testnet designated by the Company the opportunity to earn rewards, which may include Celestia tokens. These Terms are supplemental to, and incorporate by reference, the broader Celestia Terms of Service ("Services Terms") available at Celestia Terms of Service.

Defined terms used but not defined herein have the meaning set forth in the Services Terms. The Program and your participation in it is a Service as defined under the Services Terms.

These Terms govern your ability to participate in the Program and any awards you receive from that participation, which may include Celestia tokens ("ITN Rewards").

Please read these Terms carefully, as they include important information about your legal rights. By participating in the Program or claiming ITN Rewards, you are agreeing to these Terms. If you do not understand or agree to these Terms, please do not participate in the Program or claim ITN Rewards.

In order to participate in the Program you must provide certain information about you. Our collection of such information, your rights with respect to such collection, and other relevant information is described in the Celestia Privacy Policy available at Celestia Privacy Policy, and is supplemented by Section 3 of these Terms.

The Program is a discretionary Service provided by the Company, pursuant to which the Company may, in its sole discretion, provide you ITN Rewards for your successful completion of certain tasks on a Testnet designated by the Company. Please note that any such Testnet itself (as well as any other Testnets or any mainnet deployment of the Celestia Protocol) is not a Service and does not constitute an element of the Services. We do not control the Celestia Protocol and accept no liability for its operation or its deployment in any testnet or mainnet environment.

1. General Terms

1.1 You must be eighteen (18) years of age or older and capable of forming a binding contract with the Company in order to participate in the Program or receive ITN Rewards.

1.2 You agree and acknowledge that you (a) may receive ITN Rewards for free (other than applicable taxes, if any) from your participation in the Program, (b) were not previously promised ITN Rewards, unless pursuant to a separate written agreement, and (c) took no action in anticipation of or in reliance on receiving any ITN Rewards, unless pursuant to a separate written agreement.

1.3 Your eligibility to participate in or receive ITN Rewards from the Program is subject to our sole discretion. The complete list of actions you must complete to earn ITN Rewards may not have been described in the documentation released by us from time to time, you may not receive ITN Rewards even if you successfully complete such actions, and no documentation related to the Program entitles you to any ITN Rewards or to participate in the Program.

1.4 You agree and acknowledge that (a) you are not a Prohibited Person, (b) you are not a U.S. Person as defined in Rule 902(k) of Regulation S under the U.S. Securities Act of 1933, as amended (the "1933 Act" or "Act"), (c) you will not use a VPN or other tool to circumvent any geoblock or other restrictions that we may have implemented for participants in the Program, and (d) you are not participating in, and have not become eligible to participate in, the Program by receiving credentials from any other person or entity. Any circumvention or violation of the above will permanently disqualify you from participation in the Program.

1.5 You agree and acknowledge that if you are unable to claim ITN Rewards due to technical bugs, gas fees, loss of access to a Wallet or the keys thereto, or for any other reason, you will have no recourse or claim against us or any other Company Entity and that neither we nor any other Company Entity will bear any liability.

1.6 You agree and acknowledge that claiming an ITN Reward may require reliance on or an integration with third party products (e.g., a Wallet or an unaffiliated network or blockchain) that we do not control. In the event that you are unable to access such products or integrations, or if they fail for any reason, and you are unable to participate in the Program or claim ITN Rewards, you will have no recourse or claim against us or any other Company Entity and neither we nor any other Company Entity will bear any liability.

1.7 The Company may share identifying information and documentation with certain vendors or third-party providers who provide such identity verification and sanctions and watchlist screening services (the "Third-Party Services"). You agree that your access and use of such Third-Party Services is governed solely by the terms and conditions of such Third-Party Services, and the Company is not responsible or liable for, and make no representations as to any aspect of such Third-Party Services, including, without limitation, their content or the manner in which they handle, protect, manage or process data or any interaction between you and the provider of such Third-Party Services. You irrevocably waive any claim against the Company with respect to such Third-Party Services. We are not liable for any damage or loss caused or alleged to be caused by or in connection with your enablement, access or use of any such Third-Party Services, or your reliance on the privacy practices, data security processes or other policies of such Third-Party Services.

2. Taxes

2.1 You are responsible for the payment of all taxes associated with your participation in the Program and your receipt of ITN Rewards. You agree to provide the Company with any additional information and complete any required tax or other forms relating to your receipt of ITN Rewards. You may suffer adverse tax consequences as a result of your participation in the Program or your receipt of ITN Rewards. You hereby represent that (a) you have consulted with a tax adviser that you deem advisable in connection with your participation, or that you have had the opportunity to obtain tax advice but have chosen not to do so, (b) the Company has not provided you with any tax advice with respect to your participation, and (c) you are not relying on the Company for any tax advice.

3. Supplemental Privacy Information

We may collect information to help us determine the reliability or uptime of your activities within the Program, including through the use of telemetry or metrics endpoints to collect and analyse such information, and link this information to a unique identifier to represent your activities within the Program. We may display all of the foregoing information on a public dashboard.

Additionally, we may collect certain information about you from Third-Party Services and may combine information we receive from you with information we obtain from Third-Party Services, including but not limited to:

We collect this information to confirm your eligibility to participate in the Program and receive ITN Rewards, comply with our legal obligations, detect and prevent fraud, and to provide you with the Program.

Any information we receive from third-party sources will be treated in accordance with the Celestia Privacy Policy, available at Celestia Privacy Policy. We are not responsible or liable for the accuracy of the information provided to us by third parties and are not responsible for any third party’s policies or practices. See Section 9 of the Celestia Privacy Policy for more information.

4. Certain Additional Representations

4.1 Receipt of Rewards Entirely for Own Account. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that any ITN Rewards you receive will be for your own account, not as a nominee or agent, and not with a view to the resale or distribution of any part thereof, and that you have no present intention of selling, granting any participation in, or otherwise distributing the same. By agreeing to these Terms, you further represent that you do not presently have any contract, undertaking, agreement or arrangement with any person to sell, transfer or grant participations to such person or to any third person, with respect to any ITN Rewards. If you are agreeing to these terms on behalf of an entity, that entity has not been formed for the specific purpose of obtaining the ITN Rewards.

4.2 Disclosure of Information. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that you have sufficient knowledge of and experience in business and financial matters to be able to evaluate the risks and merits of your participation in the Program and of any ITN Rewards and are able to bear the risks thereof. You hereby affirm that you have not relied on any representations or warranties made by the Company related to the Program, including, but not limited to, conversations of any kind, whether through oral or electronic communication, or any white paper.

4.3 Compliance with United States Securities Laws. You understand that the ITN Rewards have not been, and will not be, registered under the 1933 Act or any applicable state securities laws. You acknowledge that the availability of an exemption from the registration provisions of the Securities Act and other applicable state securities laws depends upon, among other things, the bona fide nature of your intent as described in Section 4.1 above and with respect to the accuracy of your representations as expressed throughout these Terms. You understand that the ITN Rewards may be deemed "restricted securities" under applicable United States federal and state securities laws and that, pursuant to these laws, you may be restricted from transferring any ITN Rewards unless they are registered with the Securities and Exchange Commission and qualified by state authorities, or an exemption from such registration and qualification requirements is available. You acknowledge that the Company does not undertake any obligation to register or qualify the ITN Rewards for resale, and exemptions from registration and qualification may not be available or may not permit you to transfer all or any of the ITN Rewards in the amounts or at the times proposed by you. You further acknowledge that if an exemption from registration or qualification is available, such exemption may be conditioned on various requirements including, but not limited to, the time and manner of sale, the holding period for the ITN Rewards, and on other factors outside of your control, for which the Company makes no assurances and may not be able to satisfy.

4.4 Compliance with Liechtenstein Security Law. You understand that nothing in these Terms will be deemed to constitute a prospectus of any sort in Liechtenstein or in any jurisdiction in the EU; nor does it in any way pertain to a public offering or a solicitation of an offer to buy any securities in Liechtenstein or in any jurisdiction in the EU.

4.5 No Public Market. You understand that no public market now exists for the ITN Rewards, and that the Company has not made any assurances that a public market will ever exist for the ITN Rewards.

4.6 No Solicitation. At no time were you presented with or solicited by any publicly issued or circulated newspaper, mail, radio, television or other form of general advertising or solicitation in connection with any invitation to participate in the Program or offer of the ITN Rewards.

4.7 Other Applicable Laws. You hereby represent that you have satisfied yourself as to the full observance of the laws of your jurisdiction in connection with any invitation to participate in the Program, receipt of ITN Awards, and other use of these Terms, including (a) the legal requirements within your jurisdiction for participating in the Program and receiving ITN Rewards, (b) any foreign exchange restrictions applicable to such participation or receipt, (c) any governmental or other consents that may need to be obtained, and (d) the income tax and other tax consequences, if any, that may be relevant to the receipt, holding, sale, or transfer of the ITN Rewards. Your participation in the Program and continued beneficial ownership of ITN Rewards will not violate any applicable securities or other laws of your jurisdiction.

4.8 Non-US Transaction. You are not a U.S. Person as defined in Rule 902(k) of Regulation S under the 1933 Act. The offer of the ITN Rewards to you was made in an offshore transaction (as defined in Rule 902(h) of Regulation S), no directed selling efforts (as defined in Rule 902(c) of Regulation S) were made in the United States, and you are not obtaining the ITN Rewards for the account or benefit of any U.S. Person.

4.9 Transfer Restrictions. You will not, during the Restricted Period (as defined below) offer or sell any of the ITN Rewards (or create or maintain any derivative position equivalent thereto) in the United States, to or for the account or benefit of a U.S. Person or other than in accordance with Regulation S. The Company reserves the right to impose additional transfer restrictions with respect to the ITN Rewards in its sole discretion.

4.10 Subsequent Sales. You will, after the expiration of the applicable Restricted Period, only offer, sell, pledge or otherwise transfer the ITN Rewards (or create or maintain any derivative position equivalent thereto) pursuant to registration under the 1933 Act or any available exemption therefrom and, in any case, in accordance with applicable state securities laws.

4.11 Legends. You acknowledge and agree that the ITN Rewards will be deemed to bear the following legends: (a) any legend required by the securities laws of any state or country to the extent such laws are applicable to the ITN Rewards represented by the certificate so legended, and (b): the following legend (and even without such legend the following restrictions apply):

THE ITN REWARDS HAVE NOT BEEN REGISTERED UNDER THE ACT WITH THE UNITED STATES SECURITIES AND EXCHANGE COMMISSION, AND THE COMPANY DOES NOT INTEND TO REGISTER THEM. THE ITN REWARDS HAVE BEEN OBTAINED TO HOLD FOR THE LONG TERM AND NOT WITH A VIEW TO, OR IN CONNECTION WITH, THE SALE OR DISTRIBUTION THEREFOR. PRIOR TO THE ONE YEAR ANNIVERSARY FROM THE TERMINATION OF THE ITN REWARD PROGRAM (THE "PROGRAM COMPLETION DATE" AND SUCH ONE YEAR PERIOD, THE "RESTRICTED PERIOD"), THE ITN REWARDS MAY NOT BE OFFERED OR SOLD (INCLUDING OPENING A SHORT POSITION IN SUCH ITN REWARDS) IN THE UNITED STATES OR TO U.S. PERSONS AS DEFINED BY RULE 902(k) ADOPTED UNDER THE ACT, OTHER THAN TO DISTRIBUTORS, UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT, OR AN EXEMPTION FROM THE REGISTRATION REQUIREMENTS OF THE ACT IS AVAILABLE. RECIPIENTS OF ITN REWARDS PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE MAY SELL SUCH ITN REWARDS ONLY PURSUANT TO AN EXEMPTION FROM REGISTRATION UNDER THE ACT OR OTHERWISE IN ACCORDANCE WITH THE PROVISIONS OF REGULATION S OF THE ACT, OR IN TRANSACTIONS EFFECTED OUTSIDE OF THE UNITED STATES PROVIDED THEY DO NOT SOLICIT (AND NO ONE ACTING ON THEIR BEHALF SOLICITS) PURCHASERS IN THE UNITED STATES OR OTHERWISE ENGAGE(S) IN SELLING EFFORTS IN THE UNITED STATES AND PROVIDED THAT HEDGING TRANSACTIONS INVOLVING THESE ITN REWARDS MAY NOT BE CONDUCTED UNLESS IN COMPLIANCE WITH THE ACT. A HOLDER OF THE ITN REWARDS WHO IS A DISTRIBUTOR, DEALER, SUB-UNDERWRITER OR OTHER SECURITIES PROFESSIONAL, IN ADDITION, CANNOT PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE SELL THE ITN REWARDS TO A U.S. PERSON AS DEFINED BY RULE 902(k) OF REGULATION S UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT OR AN EXEMPTION FROM REGISTRATION UNDER THE ACT IS AVAILABLE.

',37),i=[n];function s(c,l,d,h,u,p){return t(),o("div",null,i)}const T=e(r,[["render",s]]);export{m as __pageData,T as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS","description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","frontmatter":{"description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","lastUpdated":false,"editLink":false,"head":[["meta",{"name":"og:title","content":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/itn-tos.md","filePath":"community/itn-tos.md","lastUpdated":1725992025000}'),r={name:"community/itn-tos.md"},n=a('

SUPPLEMENTAL INCENTIVIZED TESTNET TERMS

Last Revised on 1/16/2023

Welcome to the Supplemental Terms (these "ITN Award Program Terms" or "Terms") for the Incentivized Testnet Award Program (the "ITN Award Program" or the "Program") as operated on behalf of Strange Loop Labs AG ("Company", "we" or "us"). The ITN Award Program provides eligible users of a Testnet designated by the Company the opportunity to earn rewards, which may include Celestia tokens. These Terms are supplemental to, and incorporate by reference, the broader Celestia Terms of Service ("Services Terms") available at Celestia Terms of Service.

Defined terms used but not defined herein have the meaning set forth in the Services Terms. The Program and your participation in it is a Service as defined under the Services Terms.

These Terms govern your ability to participate in the Program and any awards you receive from that participation, which may include Celestia tokens ("ITN Rewards").

Please read these Terms carefully, as they include important information about your legal rights. By participating in the Program or claiming ITN Rewards, you are agreeing to these Terms. If you do not understand or agree to these Terms, please do not participate in the Program or claim ITN Rewards.

In order to participate in the Program you must provide certain information about you. Our collection of such information, your rights with respect to such collection, and other relevant information is described in the Celestia Privacy Policy available at Celestia Privacy Policy, and is supplemented by Section 3 of these Terms.

The Program is a discretionary Service provided by the Company, pursuant to which the Company may, in its sole discretion, provide you ITN Rewards for your successful completion of certain tasks on a Testnet designated by the Company. Please note that any such Testnet itself (as well as any other Testnets or any mainnet deployment of the Celestia Protocol) is not a Service and does not constitute an element of the Services. We do not control the Celestia Protocol and accept no liability for its operation or its deployment in any testnet or mainnet environment.

1. General Terms

1.1 You must be eighteen (18) years of age or older and capable of forming a binding contract with the Company in order to participate in the Program or receive ITN Rewards.

1.2 You agree and acknowledge that you (a) may receive ITN Rewards for free (other than applicable taxes, if any) from your participation in the Program, (b) were not previously promised ITN Rewards, unless pursuant to a separate written agreement, and (c) took no action in anticipation of or in reliance on receiving any ITN Rewards, unless pursuant to a separate written agreement.

1.3 Your eligibility to participate in or receive ITN Rewards from the Program is subject to our sole discretion. The complete list of actions you must complete to earn ITN Rewards may not have been described in the documentation released by us from time to time, you may not receive ITN Rewards even if you successfully complete such actions, and no documentation related to the Program entitles you to any ITN Rewards or to participate in the Program.

1.4 You agree and acknowledge that (a) you are not a Prohibited Person, (b) you are not a U.S. Person as defined in Rule 902(k) of Regulation S under the U.S. Securities Act of 1933, as amended (the "1933 Act" or "Act"), (c) you will not use a VPN or other tool to circumvent any geoblock or other restrictions that we may have implemented for participants in the Program, and (d) you are not participating in, and have not become eligible to participate in, the Program by receiving credentials from any other person or entity. Any circumvention or violation of the above will permanently disqualify you from participation in the Program.

1.5 You agree and acknowledge that if you are unable to claim ITN Rewards due to technical bugs, gas fees, loss of access to a Wallet or the keys thereto, or for any other reason, you will have no recourse or claim against us or any other Company Entity and that neither we nor any other Company Entity will bear any liability.

1.6 You agree and acknowledge that claiming an ITN Reward may require reliance on or an integration with third party products (e.g., a Wallet or an unaffiliated network or blockchain) that we do not control. In the event that you are unable to access such products or integrations, or if they fail for any reason, and you are unable to participate in the Program or claim ITN Rewards, you will have no recourse or claim against us or any other Company Entity and neither we nor any other Company Entity will bear any liability.

1.7 The Company may share identifying information and documentation with certain vendors or third-party providers who provide such identity verification and sanctions and watchlist screening services (the "Third-Party Services"). You agree that your access and use of such Third-Party Services is governed solely by the terms and conditions of such Third-Party Services, and the Company is not responsible or liable for, and make no representations as to any aspect of such Third-Party Services, including, without limitation, their content or the manner in which they handle, protect, manage or process data or any interaction between you and the provider of such Third-Party Services. You irrevocably waive any claim against the Company with respect to such Third-Party Services. We are not liable for any damage or loss caused or alleged to be caused by or in connection with your enablement, access or use of any such Third-Party Services, or your reliance on the privacy practices, data security processes or other policies of such Third-Party Services.

2. Taxes

2.1 You are responsible for the payment of all taxes associated with your participation in the Program and your receipt of ITN Rewards. You agree to provide the Company with any additional information and complete any required tax or other forms relating to your receipt of ITN Rewards. You may suffer adverse tax consequences as a result of your participation in the Program or your receipt of ITN Rewards. You hereby represent that (a) you have consulted with a tax adviser that you deem advisable in connection with your participation, or that you have had the opportunity to obtain tax advice but have chosen not to do so, (b) the Company has not provided you with any tax advice with respect to your participation, and (c) you are not relying on the Company for any tax advice.

3. Supplemental Privacy Information

We may collect information to help us determine the reliability or uptime of your activities within the Program, including through the use of telemetry or metrics endpoints to collect and analyse such information, and link this information to a unique identifier to represent your activities within the Program. We may display all of the foregoing information on a public dashboard.

Additionally, we may collect certain information about you from Third-Party Services and may combine information we receive from you with information we obtain from Third-Party Services, including but not limited to:

We collect this information to confirm your eligibility to participate in the Program and receive ITN Rewards, comply with our legal obligations, detect and prevent fraud, and to provide you with the Program.

Any information we receive from third-party sources will be treated in accordance with the Celestia Privacy Policy, available at Celestia Privacy Policy. We are not responsible or liable for the accuracy of the information provided to us by third parties and are not responsible for any third party’s policies or practices. See Section 9 of the Celestia Privacy Policy for more information.

4. Certain Additional Representations

4.1 Receipt of Rewards Entirely for Own Account. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that any ITN Rewards you receive will be for your own account, not as a nominee or agent, and not with a view to the resale or distribution of any part thereof, and that you have no present intention of selling, granting any participation in, or otherwise distributing the same. By agreeing to these Terms, you further represent that you do not presently have any contract, undertaking, agreement or arrangement with any person to sell, transfer or grant participations to such person or to any third person, with respect to any ITN Rewards. If you are agreeing to these terms on behalf of an entity, that entity has not been formed for the specific purpose of obtaining the ITN Rewards.

4.2 Disclosure of Information. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that you have sufficient knowledge of and experience in business and financial matters to be able to evaluate the risks and merits of your participation in the Program and of any ITN Rewards and are able to bear the risks thereof. You hereby affirm that you have not relied on any representations or warranties made by the Company related to the Program, including, but not limited to, conversations of any kind, whether through oral or electronic communication, or any white paper.

4.3 Compliance with United States Securities Laws. You understand that the ITN Rewards have not been, and will not be, registered under the 1933 Act or any applicable state securities laws. You acknowledge that the availability of an exemption from the registration provisions of the Securities Act and other applicable state securities laws depends upon, among other things, the bona fide nature of your intent as described in Section 4.1 above and with respect to the accuracy of your representations as expressed throughout these Terms. You understand that the ITN Rewards may be deemed "restricted securities" under applicable United States federal and state securities laws and that, pursuant to these laws, you may be restricted from transferring any ITN Rewards unless they are registered with the Securities and Exchange Commission and qualified by state authorities, or an exemption from such registration and qualification requirements is available. You acknowledge that the Company does not undertake any obligation to register or qualify the ITN Rewards for resale, and exemptions from registration and qualification may not be available or may not permit you to transfer all or any of the ITN Rewards in the amounts or at the times proposed by you. You further acknowledge that if an exemption from registration or qualification is available, such exemption may be conditioned on various requirements including, but not limited to, the time and manner of sale, the holding period for the ITN Rewards, and on other factors outside of your control, for which the Company makes no assurances and may not be able to satisfy.

4.4 Compliance with Liechtenstein Security Law. You understand that nothing in these Terms will be deemed to constitute a prospectus of any sort in Liechtenstein or in any jurisdiction in the EU; nor does it in any way pertain to a public offering or a solicitation of an offer to buy any securities in Liechtenstein or in any jurisdiction in the EU.

4.5 No Public Market. You understand that no public market now exists for the ITN Rewards, and that the Company has not made any assurances that a public market will ever exist for the ITN Rewards.

4.6 No Solicitation. At no time were you presented with or solicited by any publicly issued or circulated newspaper, mail, radio, television or other form of general advertising or solicitation in connection with any invitation to participate in the Program or offer of the ITN Rewards.

4.7 Other Applicable Laws. You hereby represent that you have satisfied yourself as to the full observance of the laws of your jurisdiction in connection with any invitation to participate in the Program, receipt of ITN Awards, and other use of these Terms, including (a) the legal requirements within your jurisdiction for participating in the Program and receiving ITN Rewards, (b) any foreign exchange restrictions applicable to such participation or receipt, (c) any governmental or other consents that may need to be obtained, and (d) the income tax and other tax consequences, if any, that may be relevant to the receipt, holding, sale, or transfer of the ITN Rewards. Your participation in the Program and continued beneficial ownership of ITN Rewards will not violate any applicable securities or other laws of your jurisdiction.

4.8 Non-US Transaction. You are not a U.S. Person as defined in Rule 902(k) of Regulation S under the 1933 Act. The offer of the ITN Rewards to you was made in an offshore transaction (as defined in Rule 902(h) of Regulation S), no directed selling efforts (as defined in Rule 902(c) of Regulation S) were made in the United States, and you are not obtaining the ITN Rewards for the account or benefit of any U.S. Person.

4.9 Transfer Restrictions. You will not, during the Restricted Period (as defined below) offer or sell any of the ITN Rewards (or create or maintain any derivative position equivalent thereto) in the United States, to or for the account or benefit of a U.S. Person or other than in accordance with Regulation S. The Company reserves the right to impose additional transfer restrictions with respect to the ITN Rewards in its sole discretion.

4.10 Subsequent Sales. You will, after the expiration of the applicable Restricted Period, only offer, sell, pledge or otherwise transfer the ITN Rewards (or create or maintain any derivative position equivalent thereto) pursuant to registration under the 1933 Act or any available exemption therefrom and, in any case, in accordance with applicable state securities laws.

4.11 Legends. You acknowledge and agree that the ITN Rewards will be deemed to bear the following legends: (a) any legend required by the securities laws of any state or country to the extent such laws are applicable to the ITN Rewards represented by the certificate so legended, and (b): the following legend (and even without such legend the following restrictions apply):

THE ITN REWARDS HAVE NOT BEEN REGISTERED UNDER THE ACT WITH THE UNITED STATES SECURITIES AND EXCHANGE COMMISSION, AND THE COMPANY DOES NOT INTEND TO REGISTER THEM. THE ITN REWARDS HAVE BEEN OBTAINED TO HOLD FOR THE LONG TERM AND NOT WITH A VIEW TO, OR IN CONNECTION WITH, THE SALE OR DISTRIBUTION THEREFOR. PRIOR TO THE ONE YEAR ANNIVERSARY FROM THE TERMINATION OF THE ITN REWARD PROGRAM (THE "PROGRAM COMPLETION DATE" AND SUCH ONE YEAR PERIOD, THE "RESTRICTED PERIOD"), THE ITN REWARDS MAY NOT BE OFFERED OR SOLD (INCLUDING OPENING A SHORT POSITION IN SUCH ITN REWARDS) IN THE UNITED STATES OR TO U.S. PERSONS AS DEFINED BY RULE 902(k) ADOPTED UNDER THE ACT, OTHER THAN TO DISTRIBUTORS, UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT, OR AN EXEMPTION FROM THE REGISTRATION REQUIREMENTS OF THE ACT IS AVAILABLE. RECIPIENTS OF ITN REWARDS PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE MAY SELL SUCH ITN REWARDS ONLY PURSUANT TO AN EXEMPTION FROM REGISTRATION UNDER THE ACT OR OTHERWISE IN ACCORDANCE WITH THE PROVISIONS OF REGULATION S OF THE ACT, OR IN TRANSACTIONS EFFECTED OUTSIDE OF THE UNITED STATES PROVIDED THEY DO NOT SOLICIT (AND NO ONE ACTING ON THEIR BEHALF SOLICITS) PURCHASERS IN THE UNITED STATES OR OTHERWISE ENGAGE(S) IN SELLING EFFORTS IN THE UNITED STATES AND PROVIDED THAT HEDGING TRANSACTIONS INVOLVING THESE ITN REWARDS MAY NOT BE CONDUCTED UNLESS IN COMPLIANCE WITH THE ACT. A HOLDER OF THE ITN REWARDS WHO IS A DISTRIBUTOR, DEALER, SUB-UNDERWRITER OR OTHER SECURITIES PROFESSIONAL, IN ADDITION, CANNOT PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE SELL THE ITN REWARDS TO A U.S. PERSON AS DEFINED BY RULE 902(k) OF REGULATION S UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT OR AN EXEMPTION FROM REGISTRATION UNDER THE ACT IS AVAILABLE.

',37),i=[n];function s(c,l,d,h,u,p){return t(),o("div",null,i)}const T=e(r,[["render",s]]);export{m as __pageData,T as default}; diff --git a/pr-1699/assets/community_itn-tos.md.23529d8e.lean.js b/pr-1699/assets/community_itn-tos.md.6454438f.lean.js similarity index 92% rename from pr-1699/assets/community_itn-tos.md.23529d8e.lean.js rename to pr-1699/assets/community_itn-tos.md.6454438f.lean.js index 8b587ee2a2..b5a0776f20 100644 --- a/pr-1699/assets/community_itn-tos.md.23529d8e.lean.js +++ b/pr-1699/assets/community_itn-tos.md.6454438f.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS","description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","frontmatter":{"description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","lastUpdated":false,"editLink":false,"head":[["meta",{"name":"og:title","content":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/itn-tos.md","filePath":"community/itn-tos.md","lastUpdated":1725971357000}'),r={name:"community/itn-tos.md"},n=a("",37),i=[n];function s(c,l,d,h,u,p){return t(),o("div",null,i)}const T=e(r,[["render",s]]);export{m as __pageData,T as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS","description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","frontmatter":{"description":"These Terms govern your ability to participate in the Incentivized Testnet Award Program.","lastUpdated":false,"editLink":false,"head":[["meta",{"name":"og:title","content":"SUPPLEMENTAL INCENTIVIZED TESTNET TERMS | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/itn-tos.md","filePath":"community/itn-tos.md","lastUpdated":1725992025000}'),r={name:"community/itn-tos.md"},n=a("",37),i=[n];function s(c,l,d,h,u,p){return t(),o("div",null,i)}const T=e(r,[["render",s]]);export{m as __pageData,T as default}; diff --git a/pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.js b/pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.js similarity index 99% rename from pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.js rename to pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.js index d614ca4552..86143fd40e 100644 --- a/pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.js +++ b/pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.js @@ -1 +1 @@ -import{_ as e,o as t,c as i,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup guide","description":"A guide that helps in organizing a successful Modular Meetup.","frontmatter":{"description":"A guide that helps in organizing a successful Modular Meetup.","head":[["meta",{"name":"og:title","content":"Modular Meetup guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-guide.md","filePath":"community/modular-meetup-guide.md","lastUpdated":1725971357000}'),a={name:"community/modular-meetup-guide.md"},n=o('

Modular Meetup guide

These are recommended steps you can follow that can help you organize a successful Modular Meetup. You aren’t required to follow the entire checklist but it is available to help aid you in your journey to organize a Modular Meetup.

Before the Meetup

  1. Determine the meetup topic and objectives.
  2. Select a suitable date and time for the event.
  3. Secure a convenient and accessible venue that can accommodate the expected number of attendees.
  4. Finalize a schedule or agenda for the event, including speakers, presentations, and activities.
  5. Prepare and send out invitations to potential attendees using various channels (email, social media, community platforms, etc.).
  6. Create and share promotional materials (graphics, blog posts, etc.) to raise awareness about the meetup.
  7. Confirm speakers, including their availability, presentation topics, and technical requirements. If you are working from a Speaker List, please reach out to Nat for any support needed on coordination with speakers.
  8. Arrange any necessary equipment, such as microphones, projectors, and whiteboards.
  9. Plan and arrange refreshments, if applicable.
  10. Prepare and print any required materials, like agendas, name tags, and feedback forms.
  11. Coordinate with volunteers or team members to help manage the event.
  12. Set up a registration system or RSVP process to track attendance.
  13. Send out reminder messages to registered attendees prior to the event.
  14. Conduct a final review of the event logistics, including venue setup, equipment functionality, and volunteer roles.

During the Meetup

  1. Set up the venue, including arranging seating, preparing equipment, and displaying any promotional materials.
  2. Designate a registration area and ensure that someone is available to greet and check-in attendees.
  3. Welcome the attendees and provide an overview of the event schedule.
  4. Introduce speakers and facilitate any presentations or discussions.
  5. Encourage networking and interaction among attendees during breaks or dedicated activities.
  6. Capture the event with photos or videos for future promotions and documentation.
  7. Collect feedback from attendees using forms, online surveys, or informal conversations if needed.

After the Meetup

  1. Send follow-up messages to attendees, thanking them for their participation and soliciting additional feedback.
  2. Evaluate the success of the event by reviewing feedback and assessing key performance indicators (e.g., attendance, engagement, etc.).
  3. Analyze and document lessons learned, identifying areas for improvement in future meetups.
  4. Share event highlights, photos, and key takeaways with the community through social media, blog posts, or newsletters.
  5. Connect with speakers, attendees, and volunteers to maintain and strengthen relationships.
  6. Begin planning for the next meetup, applying insights gained from the previous event to enhance the experience for future attendees.

Logistics and guidance

These are provided guidelines for different components of kickstarting a Modular Meetup to help you get started on the logistics of organizing a meetup. A lot of those guidelines are thanks to the wonderful write ups in Ethereum Meetup Support Program and Elastic Community Organizer Guides.

Venue

Selecting the perfect venue for your Modular Meetup is essential in creating a welcoming atmosphere for the Celestia community.

  1. Startup Incubators
    • Often they would have spaces for meetups.
  2. Libraries
    • Libraries can normally have spaces for meetups at little to no costs
  3. Co-working spaces:
    • Co-working spaces might be able to offer necessary equipment like microphones, projectors, and whiteboards.
  4. Restaurants:
    • Restaurants might have private rooms for larger groups of people that you can book, depending on the restaurant.
  5. Universities and Blockchain Clubs:
    • Partnering with universities and their local university clubs can offer you a lot of spaces for meetups, as well as necessary equipments if needed for giving a talk.
  6. Other options:
    • If you're having difficulty finding a venue, don't hesitate to ask for help within the Celestia community. Your fellow organizers and attendees may have valuable suggestions or connections.

An ideal venue should offer:

Consider recording the event, even with a smartphone, to share with the community later. If the speaker uses a microphone, their voice will be more audible in the video. We might be able to post those recordings of the meetup talks on a meetup youtube channel after.

Remember to negotiate on costs and seek discounts, emphasizing that your meetup benefits the community.

Collaborate with your venue provider to explore options like borrowing recording equipment, tripods, or even having them record the event for you. Some providers may offer these services for free or at a reduced cost.

Catering and refreshments

Providing refreshments or catering for your Modular Meetup enhances the overall experience and encourages networking among attendees.

  1. Determine your budget
    • Identify the amount you can allocate for food and drinks at your event which will help you determine how much you can bring in refreshments. You can also contact the Celestia Devrel team for ideas and support. Costs for refreshments and drinks can vary depending on your location, so be mindful to be flexible on your plans according to your specific location and budget.
  2. Offer a variety of refreshments
    • If you're ordering in, pizza and finger foods work well, but you can also have more budget-friendly options for food.
    • Offering drinks like beer, soda, or lemonade are great, but water also works. Keep in mind that not everyone drinks alcohol so it’s not a requirement. But having at least water and plastic cups works well.
  3. Plan ahead
    • Order refreshments 1 or 2 days in advance and schedule delivery to avoid last-minute stress during the event.

By following these recommendations, you'll be able to provide enjoyable refreshments for your Celestia Modular Meetup attendees while fostering a friendly and engaging atmosphere.

Audience

Understanding your audience and estimating attendance are crucial for organizing successful Modular Meetups for Celestia.

  1. Research the local tech scene:
    • Investigate the types of meetups and events popular in your area. Attend other technology-focused events to get a sense of the audience size and interests. This information will help you tailor your meetup to attract a larger audience.
  2. Assess the availability of speakers:
    • Before organizing a meetup, ensure that you have access to a pool of knowledgeable speakers. If you anticipate difficulty in securing speakers, consider joining forces with an existing meetup group or speaking at other events before launching a new group. This approach will help spread the word about your planned Modular Meetup and gauge interest. Speakers are covered in the following section with a reference to Speaker List offered by the Modular Meetup program.
  3. Establish connections with other user groups:
    • Forge relationships with other tech-focused meetup groups to mutually promote each other's events, potentially increasing attendance.
  4. Set a regular routine for your meetup:
    • Communicate how often you plan to hold meetups, whether it's monthly or quarterly, to help attendees manage their expectations and maintain their interest.
  5. Organize casual meetups:
    • If there's a gap between more formal events, arrange casual meetups at pubs or cafes to keep people engaged and connect with potential speakers for future events.
  6. Estimate the number of attendees:
    • Consider factors such as the size of your city, the popularity of the topic, and the appeal of the event description when estimating attendance.

Speakers

Securing engaging and knowledgeable speakers is key to hosting an exceptional Celestia Modular Meetup.

  1. Define your event topic
    • Determine the theme of your event, focusing on areas such as DeFi, Gaming, NFTs, coding workshops, protocol changes, rollups, data availability, or other topics relevant to the Modular ecosystem. This will help you find speakers with expertise in the chosen subject.
  2. Utilize the Speaker List provided by the Modular Meetup program
    • As a meetup organizer, you have access to a curated list of talented speakers from Celestia Labs and the broader Modular ecosystem. This valuable resource can connect you with experts who can share their knowledge with your meetup attendees.
  3. Aim for multiple speakers
    • Ideally, invite 2-3 speakers to your event, allotting 20-40 minutes per talk. Schedule short breaks between presentations to maintain audience engagement.
  4. Organize the speaker lineup
    • Discuss the topics and slides with your speakers before the event to ensure a smooth flow. Arrange the talks in a logical order, saving the most impactful presentation for last.
  5. Invite local speakers
    • For your first meetup, consider presenting an introduction to the Celestia ecosystem or a specific area of interest. Encourage local experts or enthusiasts to speak at future meetups. This approach fosters community involvement and helps build a network of potential speakers.
  6. Seek speaker referrals
    • Ask your current speakers, attendees, or other meetup organizers for referrals. Personal connections often lead to discovering new speakers with valuable insights.
  7. Leverage your meetup discussion board
    • Post a call for speakers on your meetup discussion board to reach out to potential presenters within your community. Be clear about the event theme and requirements to attract relevant speakers.
  8. Offer incentives and appreciation
    • Reward speakers with tokens of gratitude, such as T-shirts, gifts, or public recognition, to show your appreciation for their contribution to the meetup. The Celestia Labs Devrel team can help with swag logistics if needed.

Sponsors

Finding sponsors for your meetup can be challenging, but securing financial support is crucial for covering costs related to venue and refreshments.

  1. Leverage Celestia Labs' support
    • Celestia Labs may offer co-sponsorship for your meetup. However, they also encourage organizers to find local co-sponsors to help cover costs and create a more sustainable event.
  2. Offer value to your sponsors:
    • Show potential sponsors how partnering with your event will benefit them. Include their logo on event banners, mention them in the event description, and give them a shoutout at the beginning of the event. If they desire, allow them to place a rollup banner at the venue.
  3. Reach out to your network
    • Ask friends and acquaintances if they know of coworking spaces, schools, universities, or companies interested in sponsorship. A personal connection can significantly increase the chances of securing support.
  4. Approach speakers for sponsorship
    • Request speakers or their affiliated projects to contribute towards the event's expenses, such as catering costs. This can be an effective way to obtain additional funding.
  5. Create a sponsorship deck
    • Develop a compelling sponsorship deck to pitch your event to tech companies in your city or potential online sponsors. This presentation should highlight the benefits of supporting your event and showcase past successful meetups.
  6. Research local companies
    • Investigate businesses in your area that may be interested in sponsoring your event. Tailor your pitch to align with their industry and demonstrate how the meetup can benefit their company.
  7. Engage sponsors during the event
    • Allow sponsors to briefly address the audience, participate in Q&A sessions, or mention their hiring needs. Remember to avoid sales pitches, as they can negatively impact the meetup experience.
  8. Thank your sponsors
    • Express gratitude to your sponsors at the beginning and end of the meetup. Acknowledging their support encourages continued collaboration and enhances the credibility of your event.

Communications and marketing

Effectively marketing and announcing your Modular Meetup is essential for attracting attendees and ensuring a successful event.

  1. Plan your announcement
    • Announce your meetup at least two weeks prior. This gives your audience ample time to prepare and increases the likelihood of their attendance.
  2. Utilize Celestia Labs' resources
    • Celestia Labs can help co-promote your meetup on social media and Discord. They can also add your event to their online calendar, email local contacts, and share the event via their Developer Relations Team on Twitter. Don't hesitate to reach out to them for assistance.
  3. Share on social media
    • Promote your event on Twitter and any other popular social media platforms in your area. Tag speakers, sponsors, and use relevant hashtags to increase visibility.
  4. Leverage local community groups
    • Post your event in local Telegram, Discord, or other community groups relevant to your city. These groups often have many members who may be interested in attending your event.
  5. Engage speakers and the venue
    • Maintain communication with speakers and the venue to ensure any changes can be announced in advance. Trust is critical, so avoid canceling planned meetups whenever possible.
  6. Send reminders via meetup.com (optional)
    • After announcing your event, send a warm invite to your meetup group members through meetup.com. Additionally, send a reminder email one day before the event to encourage attendance.
  7. Share with friends and family
    • Invite your friends, family, and acquaintances to the meetup, as they may help spread the word or know someone interested in the event.
  8. Utilize conference groups
    • If you've attended conferences, share your meetup in the associated Telegram or social media groups, as there may be members nearby who would be interested in attending.

Recording

Recording and live-streaming your Modular Meetup can greatly benefit those who cannot attend in person and expand the reach of your event.

  1. Plan for recording
    • Consider recording your meetup to create additional learning resources and share the knowledge with a broader audience.
  2. Consider live-streaming
    • Live-streaming your event on platforms like Twitch, YouTube, or Twitter allows remote participants to watch and engage in the meetup. This can also boost your event's reach and create a sense of inclusion for those who couldn't attend in person.
  3. Coordinate with Celestia Labs
    • Celestia Labs can potentially help cover recording costs and promote recorded meetups. Reach out to them at meetups@celestia.org to discuss available options and support. They can also assist with finding local contacts for recording if you don't have one already.
  4. Utilize available resources
    • If you have a small budget, consider allocating some funds for recording and live-streaming your event. Look for local professionals or affordable equipment rentals to ensure high-quality recordings.
  5. Share recordings on Celestia Labs' channels
    • Celestia Labs can help promote recorded meetups by sharing videos in their meetups playlist on YouTube and hosting them on their website. Ensure you coordinate with Celestia Labs to provide them with the recorded video.
  6. Promote recorded content
    • Share the recordings on your social media channels and meetup group after the event. This helps attendees revisit the content and allows those who couldn't attend to learn from the talks.

Utilizing Meetup.com platform

Celestia Labs is committed to supporting your meetup efforts by helping you with meetup.com, from setting up the group to covering organizer dues. Below is a detailed overview of how Celestia Labs can assist you.

  1. Meetup.com organizer dues
    • Celestia Labs is happy to cover organizer dues for meetup.com. To get started, send an email to meetups@celestia.org and let them help you with the process.
  2. Co-organizing existing groups
    • If you already have a meetup.com group but need Celestia Labs' assistance with organizing or covering dues, email meetups@celestia.org to add one of their employees as the Organizer.
  3. Setting up groups on Meetup.com
    • Celestia Labs will help you set up your meetup group, including logos, naming, custom URLs, group description, and other essential details. They provide a unique logo for Celestia Modular Meetups, which you can use for your group.
  4. User group naming
    • Celestia Labs recommends naming your group "Celestia Modular Meetup" to encompass various aspects of the Celestia community and create a consistent brand.
  5. Custom URL for the group
    • Meetup.com allows you to create a custom URL for your user group. Celestia Labs encourages consistent URLs across regions, making it easy for people to find your meetup group.
  6. Group description
    • Celestia Labs has a standard group description to ensure consistency across all meetups. However, if you'd like to customize it, let them know.
  7. New member intake questions
    • To improve the quality of your meetups, Celestia Labs suggests a set of intake questions for new members. The answers can help you better understand their needs and interests, allowing you to plan engaging meetups.
  8. Welcome message
    • Celestia Labs provides a welcome message for new members joining your group. If you'd like to customize this message, let them know.

Onboarding questions for community members joining a Modular Meetup

  1. Q1: How did you hear about this Modular Meetup?
    • Why: This information helps us understand the most effective channels for recruiting new participants to the meetup.
  2. Q2: What do you hope to gain by participating in this meetup? (e.g., networking, learning about Celestia, learning about Modularity, finding a job, etc.)
    • Why: This information helps us cater to the needs of the user group members. If most attendees are looking for networking opportunities, we can schedule casual meetups alongside informative talks.
  3. Q3: Are you currently using or planning to use Celestia, Rollkit, Celestia’s Node API or any of the rollups deployed on Celestia? Tell us all about it. We will use your response to help us better understand what talks would be most beneficial to the group.
    • Why: Responses to this question help us determine the most relevant talks for the group members. If we discover that most participants are interested in a specific area, we can tailor the talks accordingly.
  4. Q4: We love Celestia and the modular ecosystem, but we also appreciate other Web3 technologies. What other topics would you like to hear about? (e.g., Infrastructure, Data Storage, DID, MEV)
    • Why: Knowing our group participants' interests in other technical areas helps us understand what related topics would be useful and valuable to the group, which in turn helps when recruiting speakers.
  5. Q5: Would you be interested in speaking at a future meetup? We welcome 2-minute lightning talks to 1-hour deep dives. Would you be interested in hosting a meetup? If you answer yes to this question, the group organizers will contact you to follow up.
    • Why: One of the challenges in hosting regular meetups is finding speakers. We hope this question will identify people eager to share their stories and expertise with the group, making the lives of organizers easier.
',42),r=[n];function s(l,u,c,d,h,p){return t(),i("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; +import{_ as e,o as t,c as i,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup guide","description":"A guide that helps in organizing a successful Modular Meetup.","frontmatter":{"description":"A guide that helps in organizing a successful Modular Meetup.","head":[["meta",{"name":"og:title","content":"Modular Meetup guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-guide.md","filePath":"community/modular-meetup-guide.md","lastUpdated":1725992025000}'),a={name:"community/modular-meetup-guide.md"},n=o('

Modular Meetup guide

These are recommended steps you can follow that can help you organize a successful Modular Meetup. You aren’t required to follow the entire checklist but it is available to help aid you in your journey to organize a Modular Meetup.

Before the Meetup

  1. Determine the meetup topic and objectives.
  2. Select a suitable date and time for the event.
  3. Secure a convenient and accessible venue that can accommodate the expected number of attendees.
  4. Finalize a schedule or agenda for the event, including speakers, presentations, and activities.
  5. Prepare and send out invitations to potential attendees using various channels (email, social media, community platforms, etc.).
  6. Create and share promotional materials (graphics, blog posts, etc.) to raise awareness about the meetup.
  7. Confirm speakers, including their availability, presentation topics, and technical requirements. If you are working from a Speaker List, please reach out to Nat for any support needed on coordination with speakers.
  8. Arrange any necessary equipment, such as microphones, projectors, and whiteboards.
  9. Plan and arrange refreshments, if applicable.
  10. Prepare and print any required materials, like agendas, name tags, and feedback forms.
  11. Coordinate with volunteers or team members to help manage the event.
  12. Set up a registration system or RSVP process to track attendance.
  13. Send out reminder messages to registered attendees prior to the event.
  14. Conduct a final review of the event logistics, including venue setup, equipment functionality, and volunteer roles.

During the Meetup

  1. Set up the venue, including arranging seating, preparing equipment, and displaying any promotional materials.
  2. Designate a registration area and ensure that someone is available to greet and check-in attendees.
  3. Welcome the attendees and provide an overview of the event schedule.
  4. Introduce speakers and facilitate any presentations or discussions.
  5. Encourage networking and interaction among attendees during breaks or dedicated activities.
  6. Capture the event with photos or videos for future promotions and documentation.
  7. Collect feedback from attendees using forms, online surveys, or informal conversations if needed.

After the Meetup

  1. Send follow-up messages to attendees, thanking them for their participation and soliciting additional feedback.
  2. Evaluate the success of the event by reviewing feedback and assessing key performance indicators (e.g., attendance, engagement, etc.).
  3. Analyze and document lessons learned, identifying areas for improvement in future meetups.
  4. Share event highlights, photos, and key takeaways with the community through social media, blog posts, or newsletters.
  5. Connect with speakers, attendees, and volunteers to maintain and strengthen relationships.
  6. Begin planning for the next meetup, applying insights gained from the previous event to enhance the experience for future attendees.

Logistics and guidance

These are provided guidelines for different components of kickstarting a Modular Meetup to help you get started on the logistics of organizing a meetup. A lot of those guidelines are thanks to the wonderful write ups in Ethereum Meetup Support Program and Elastic Community Organizer Guides.

Venue

Selecting the perfect venue for your Modular Meetup is essential in creating a welcoming atmosphere for the Celestia community.

  1. Startup Incubators
    • Often they would have spaces for meetups.
  2. Libraries
    • Libraries can normally have spaces for meetups at little to no costs
  3. Co-working spaces:
    • Co-working spaces might be able to offer necessary equipment like microphones, projectors, and whiteboards.
  4. Restaurants:
    • Restaurants might have private rooms for larger groups of people that you can book, depending on the restaurant.
  5. Universities and Blockchain Clubs:
    • Partnering with universities and their local university clubs can offer you a lot of spaces for meetups, as well as necessary equipments if needed for giving a talk.
  6. Other options:
    • If you're having difficulty finding a venue, don't hesitate to ask for help within the Celestia community. Your fellow organizers and attendees may have valuable suggestions or connections.

An ideal venue should offer:

Consider recording the event, even with a smartphone, to share with the community later. If the speaker uses a microphone, their voice will be more audible in the video. We might be able to post those recordings of the meetup talks on a meetup youtube channel after.

Remember to negotiate on costs and seek discounts, emphasizing that your meetup benefits the community.

Collaborate with your venue provider to explore options like borrowing recording equipment, tripods, or even having them record the event for you. Some providers may offer these services for free or at a reduced cost.

Catering and refreshments

Providing refreshments or catering for your Modular Meetup enhances the overall experience and encourages networking among attendees.

  1. Determine your budget
    • Identify the amount you can allocate for food and drinks at your event which will help you determine how much you can bring in refreshments. You can also contact the Celestia Devrel team for ideas and support. Costs for refreshments and drinks can vary depending on your location, so be mindful to be flexible on your plans according to your specific location and budget.
  2. Offer a variety of refreshments
    • If you're ordering in, pizza and finger foods work well, but you can also have more budget-friendly options for food.
    • Offering drinks like beer, soda, or lemonade are great, but water also works. Keep in mind that not everyone drinks alcohol so it’s not a requirement. But having at least water and plastic cups works well.
  3. Plan ahead
    • Order refreshments 1 or 2 days in advance and schedule delivery to avoid last-minute stress during the event.

By following these recommendations, you'll be able to provide enjoyable refreshments for your Celestia Modular Meetup attendees while fostering a friendly and engaging atmosphere.

Audience

Understanding your audience and estimating attendance are crucial for organizing successful Modular Meetups for Celestia.

  1. Research the local tech scene:
    • Investigate the types of meetups and events popular in your area. Attend other technology-focused events to get a sense of the audience size and interests. This information will help you tailor your meetup to attract a larger audience.
  2. Assess the availability of speakers:
    • Before organizing a meetup, ensure that you have access to a pool of knowledgeable speakers. If you anticipate difficulty in securing speakers, consider joining forces with an existing meetup group or speaking at other events before launching a new group. This approach will help spread the word about your planned Modular Meetup and gauge interest. Speakers are covered in the following section with a reference to Speaker List offered by the Modular Meetup program.
  3. Establish connections with other user groups:
    • Forge relationships with other tech-focused meetup groups to mutually promote each other's events, potentially increasing attendance.
  4. Set a regular routine for your meetup:
    • Communicate how often you plan to hold meetups, whether it's monthly or quarterly, to help attendees manage their expectations and maintain their interest.
  5. Organize casual meetups:
    • If there's a gap between more formal events, arrange casual meetups at pubs or cafes to keep people engaged and connect with potential speakers for future events.
  6. Estimate the number of attendees:
    • Consider factors such as the size of your city, the popularity of the topic, and the appeal of the event description when estimating attendance.

Speakers

Securing engaging and knowledgeable speakers is key to hosting an exceptional Celestia Modular Meetup.

  1. Define your event topic
    • Determine the theme of your event, focusing on areas such as DeFi, Gaming, NFTs, coding workshops, protocol changes, rollups, data availability, or other topics relevant to the Modular ecosystem. This will help you find speakers with expertise in the chosen subject.
  2. Utilize the Speaker List provided by the Modular Meetup program
    • As a meetup organizer, you have access to a curated list of talented speakers from Celestia Labs and the broader Modular ecosystem. This valuable resource can connect you with experts who can share their knowledge with your meetup attendees.
  3. Aim for multiple speakers
    • Ideally, invite 2-3 speakers to your event, allotting 20-40 minutes per talk. Schedule short breaks between presentations to maintain audience engagement.
  4. Organize the speaker lineup
    • Discuss the topics and slides with your speakers before the event to ensure a smooth flow. Arrange the talks in a logical order, saving the most impactful presentation for last.
  5. Invite local speakers
    • For your first meetup, consider presenting an introduction to the Celestia ecosystem or a specific area of interest. Encourage local experts or enthusiasts to speak at future meetups. This approach fosters community involvement and helps build a network of potential speakers.
  6. Seek speaker referrals
    • Ask your current speakers, attendees, or other meetup organizers for referrals. Personal connections often lead to discovering new speakers with valuable insights.
  7. Leverage your meetup discussion board
    • Post a call for speakers on your meetup discussion board to reach out to potential presenters within your community. Be clear about the event theme and requirements to attract relevant speakers.
  8. Offer incentives and appreciation
    • Reward speakers with tokens of gratitude, such as T-shirts, gifts, or public recognition, to show your appreciation for their contribution to the meetup. The Celestia Labs Devrel team can help with swag logistics if needed.

Sponsors

Finding sponsors for your meetup can be challenging, but securing financial support is crucial for covering costs related to venue and refreshments.

  1. Leverage Celestia Labs' support
    • Celestia Labs may offer co-sponsorship for your meetup. However, they also encourage organizers to find local co-sponsors to help cover costs and create a more sustainable event.
  2. Offer value to your sponsors:
    • Show potential sponsors how partnering with your event will benefit them. Include their logo on event banners, mention them in the event description, and give them a shoutout at the beginning of the event. If they desire, allow them to place a rollup banner at the venue.
  3. Reach out to your network
    • Ask friends and acquaintances if they know of coworking spaces, schools, universities, or companies interested in sponsorship. A personal connection can significantly increase the chances of securing support.
  4. Approach speakers for sponsorship
    • Request speakers or their affiliated projects to contribute towards the event's expenses, such as catering costs. This can be an effective way to obtain additional funding.
  5. Create a sponsorship deck
    • Develop a compelling sponsorship deck to pitch your event to tech companies in your city or potential online sponsors. This presentation should highlight the benefits of supporting your event and showcase past successful meetups.
  6. Research local companies
    • Investigate businesses in your area that may be interested in sponsoring your event. Tailor your pitch to align with their industry and demonstrate how the meetup can benefit their company.
  7. Engage sponsors during the event
    • Allow sponsors to briefly address the audience, participate in Q&A sessions, or mention their hiring needs. Remember to avoid sales pitches, as they can negatively impact the meetup experience.
  8. Thank your sponsors
    • Express gratitude to your sponsors at the beginning and end of the meetup. Acknowledging their support encourages continued collaboration and enhances the credibility of your event.

Communications and marketing

Effectively marketing and announcing your Modular Meetup is essential for attracting attendees and ensuring a successful event.

  1. Plan your announcement
    • Announce your meetup at least two weeks prior. This gives your audience ample time to prepare and increases the likelihood of their attendance.
  2. Utilize Celestia Labs' resources
    • Celestia Labs can help co-promote your meetup on social media and Discord. They can also add your event to their online calendar, email local contacts, and share the event via their Developer Relations Team on Twitter. Don't hesitate to reach out to them for assistance.
  3. Share on social media
    • Promote your event on Twitter and any other popular social media platforms in your area. Tag speakers, sponsors, and use relevant hashtags to increase visibility.
  4. Leverage local community groups
    • Post your event in local Telegram, Discord, or other community groups relevant to your city. These groups often have many members who may be interested in attending your event.
  5. Engage speakers and the venue
    • Maintain communication with speakers and the venue to ensure any changes can be announced in advance. Trust is critical, so avoid canceling planned meetups whenever possible.
  6. Send reminders via meetup.com (optional)
    • After announcing your event, send a warm invite to your meetup group members through meetup.com. Additionally, send a reminder email one day before the event to encourage attendance.
  7. Share with friends and family
    • Invite your friends, family, and acquaintances to the meetup, as they may help spread the word or know someone interested in the event.
  8. Utilize conference groups
    • If you've attended conferences, share your meetup in the associated Telegram or social media groups, as there may be members nearby who would be interested in attending.

Recording

Recording and live-streaming your Modular Meetup can greatly benefit those who cannot attend in person and expand the reach of your event.

  1. Plan for recording
    • Consider recording your meetup to create additional learning resources and share the knowledge with a broader audience.
  2. Consider live-streaming
    • Live-streaming your event on platforms like Twitch, YouTube, or Twitter allows remote participants to watch and engage in the meetup. This can also boost your event's reach and create a sense of inclusion for those who couldn't attend in person.
  3. Coordinate with Celestia Labs
    • Celestia Labs can potentially help cover recording costs and promote recorded meetups. Reach out to them at meetups@celestia.org to discuss available options and support. They can also assist with finding local contacts for recording if you don't have one already.
  4. Utilize available resources
    • If you have a small budget, consider allocating some funds for recording and live-streaming your event. Look for local professionals or affordable equipment rentals to ensure high-quality recordings.
  5. Share recordings on Celestia Labs' channels
    • Celestia Labs can help promote recorded meetups by sharing videos in their meetups playlist on YouTube and hosting them on their website. Ensure you coordinate with Celestia Labs to provide them with the recorded video.
  6. Promote recorded content
    • Share the recordings on your social media channels and meetup group after the event. This helps attendees revisit the content and allows those who couldn't attend to learn from the talks.

Utilizing Meetup.com platform

Celestia Labs is committed to supporting your meetup efforts by helping you with meetup.com, from setting up the group to covering organizer dues. Below is a detailed overview of how Celestia Labs can assist you.

  1. Meetup.com organizer dues
    • Celestia Labs is happy to cover organizer dues for meetup.com. To get started, send an email to meetups@celestia.org and let them help you with the process.
  2. Co-organizing existing groups
    • If you already have a meetup.com group but need Celestia Labs' assistance with organizing or covering dues, email meetups@celestia.org to add one of their employees as the Organizer.
  3. Setting up groups on Meetup.com
    • Celestia Labs will help you set up your meetup group, including logos, naming, custom URLs, group description, and other essential details. They provide a unique logo for Celestia Modular Meetups, which you can use for your group.
  4. User group naming
    • Celestia Labs recommends naming your group "Celestia Modular Meetup" to encompass various aspects of the Celestia community and create a consistent brand.
  5. Custom URL for the group
    • Meetup.com allows you to create a custom URL for your user group. Celestia Labs encourages consistent URLs across regions, making it easy for people to find your meetup group.
  6. Group description
    • Celestia Labs has a standard group description to ensure consistency across all meetups. However, if you'd like to customize it, let them know.
  7. New member intake questions
    • To improve the quality of your meetups, Celestia Labs suggests a set of intake questions for new members. The answers can help you better understand their needs and interests, allowing you to plan engaging meetups.
  8. Welcome message
    • Celestia Labs provides a welcome message for new members joining your group. If you'd like to customize this message, let them know.

Onboarding questions for community members joining a Modular Meetup

  1. Q1: How did you hear about this Modular Meetup?
    • Why: This information helps us understand the most effective channels for recruiting new participants to the meetup.
  2. Q2: What do you hope to gain by participating in this meetup? (e.g., networking, learning about Celestia, learning about Modularity, finding a job, etc.)
    • Why: This information helps us cater to the needs of the user group members. If most attendees are looking for networking opportunities, we can schedule casual meetups alongside informative talks.
  3. Q3: Are you currently using or planning to use Celestia, Rollkit, Celestia’s Node API or any of the rollups deployed on Celestia? Tell us all about it. We will use your response to help us better understand what talks would be most beneficial to the group.
    • Why: Responses to this question help us determine the most relevant talks for the group members. If we discover that most participants are interested in a specific area, we can tailor the talks accordingly.
  4. Q4: We love Celestia and the modular ecosystem, but we also appreciate other Web3 technologies. What other topics would you like to hear about? (e.g., Infrastructure, Data Storage, DID, MEV)
    • Why: Knowing our group participants' interests in other technical areas helps us understand what related topics would be useful and valuable to the group, which in turn helps when recruiting speakers.
  5. Q5: Would you be interested in speaking at a future meetup? We welcome 2-minute lightning talks to 1-hour deep dives. Would you be interested in hosting a meetup? If you answer yes to this question, the group organizers will contact you to follow up.
    • Why: One of the challenges in hosting regular meetups is finding speakers. We hope this question will identify people eager to share their stories and expertise with the group, making the lives of organizers easier.
',42),r=[n];function s(l,u,c,d,h,p){return t(),i("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.lean.js b/pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.lean.js similarity index 91% rename from pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.lean.js rename to pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.lean.js index dfab948967..b4794c340b 100644 --- a/pr-1699/assets/community_modular-meetup-guide.md.3d71d8e8.lean.js +++ b/pr-1699/assets/community_modular-meetup-guide.md.6b50cb94.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as i,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup guide","description":"A guide that helps in organizing a successful Modular Meetup.","frontmatter":{"description":"A guide that helps in organizing a successful Modular Meetup.","head":[["meta",{"name":"og:title","content":"Modular Meetup guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-guide.md","filePath":"community/modular-meetup-guide.md","lastUpdated":1725971357000}'),a={name:"community/modular-meetup-guide.md"},n=o("",42),r=[n];function s(l,u,c,d,h,p){return t(),i("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; +import{_ as e,o as t,c as i,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup guide","description":"A guide that helps in organizing a successful Modular Meetup.","frontmatter":{"description":"A guide that helps in organizing a successful Modular Meetup.","head":[["meta",{"name":"og:title","content":"Modular Meetup guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-guide.md","filePath":"community/modular-meetup-guide.md","lastUpdated":1725992025000}'),a={name:"community/modular-meetup-guide.md"},n=o("",42),r=[n];function s(l,u,c,d,h,p){return t(),i("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.js b/pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.js similarity index 98% rename from pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.js rename to pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.js index 67c2f53e23..e2eeb1a611 100644 --- a/pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.js +++ b/pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.js @@ -1 +1 @@ -import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Modular_meetup2.jpg",f=JSON.parse('{"title":"Celestia Modular Meetup program","description":"The ultimate guide for Modular Meetup organizers!","frontmatter":{"description":"The ultimate guide for Modular Meetup organizers!","head":[["meta",{"name":"og:title","content":"Celestia Modular Meetup program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-intro.md","filePath":"community/modular-meetup-intro.md","lastUpdated":1725971357000}'),i={name:"community/modular-meetup-intro.md"},n=t('

Celestia Modular Meetup program

Modular Meetup Banner

Welcome to the ultimate guide for Modular Meetup organizers! This collection of resources is designed for those enthusiastic about fostering grassroots Modular Meetups with support from Celestia around the world.

Program description

The Celestia Modular Meetup Program aims to empower meetup organizers, providing education and support, and encouraging collaboration within the Web3 ecosystem. This rapidly growing community has already achieved incredible success with the first Modular Meetup in Lisbon, and will grow from there.

Join fellow enthusiasts, engage in enlightening discussions, and make the most of the insightful resources provided. These resources are designed to serve as a go-to playbook for meetup organizers, especially when starting your journey.

Important info

Celestia.org Community Code of Conduct

The purpose of our Community Code of Conduct is to foster an inclusive, welcoming, and supportive environment for everyone participating in Celestia community events. We're all here to learn from each other, expand our skillsets, and enjoy a positive experience together.

All meetup attendees, speakers, sponsors, and volunteers, including the event organizing team, are kindly asked to adhere to the following Code of Conduct. Organizers will respectfully enforce this code throughout the event. We genuinely appreciate the cooperation of all participants in maintaining a safe and empowering space for everyone.

Signup form

To become part of the program, please complete the registration form.

Following the review and approval of your submission, you will receive an email confirmation and an invitation to participate in the upcoming Modular Meetup call. Furthermore, you will be granted access to the exclusive Discord channel labeled "#modular-meetup" on our Discord server. Please take note that joining our Discord is a prerequisite for channel access. It's essential to recognize that this program is tailored for dedicated organizers with a genuine interest in nurturing their local modular ecosystem community.

Emails

As a participant in the Celestia Modular Meetup Program, you can expect to receive the following emails:

  1. Welcome email with links to calendar events and Discord channel
  2. Monthly Catch-up call invites
  3. Recap emails with notes from calls

Discord

Your active participation is key to unlocking the full potential of this vibrant community. Our primary communication tool is Discord, providing an engaging platform to connect with fellow organizers:

Materials

As a meetup organizer, you'll gain access to the Celestia Modular Meetup Program's list of resources. This collection should become your trusted companion in organizing events. Drawing upon the wisdom of seasoned event organizers, this resource is available for you and your co-organizers to explore and learn.

',23),s=[n];function l(u,c,d,p,m,h){return o(),a("div",null,s)}const y=e(i,[["render",l]]);export{f as __pageData,y as default}; +import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Modular_meetup2.jpg",f=JSON.parse('{"title":"Celestia Modular Meetup program","description":"The ultimate guide for Modular Meetup organizers!","frontmatter":{"description":"The ultimate guide for Modular Meetup organizers!","head":[["meta",{"name":"og:title","content":"Celestia Modular Meetup program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-intro.md","filePath":"community/modular-meetup-intro.md","lastUpdated":1725992025000}'),i={name:"community/modular-meetup-intro.md"},n=t('

Celestia Modular Meetup program

Modular Meetup Banner

Welcome to the ultimate guide for Modular Meetup organizers! This collection of resources is designed for those enthusiastic about fostering grassroots Modular Meetups with support from Celestia around the world.

Program description

The Celestia Modular Meetup Program aims to empower meetup organizers, providing education and support, and encouraging collaboration within the Web3 ecosystem. This rapidly growing community has already achieved incredible success with the first Modular Meetup in Lisbon, and will grow from there.

Join fellow enthusiasts, engage in enlightening discussions, and make the most of the insightful resources provided. These resources are designed to serve as a go-to playbook for meetup organizers, especially when starting your journey.

Important info

Celestia.org Community Code of Conduct

The purpose of our Community Code of Conduct is to foster an inclusive, welcoming, and supportive environment for everyone participating in Celestia community events. We're all here to learn from each other, expand our skillsets, and enjoy a positive experience together.

All meetup attendees, speakers, sponsors, and volunteers, including the event organizing team, are kindly asked to adhere to the following Code of Conduct. Organizers will respectfully enforce this code throughout the event. We genuinely appreciate the cooperation of all participants in maintaining a safe and empowering space for everyone.

Signup form

To become part of the program, please complete the registration form.

Following the review and approval of your submission, you will receive an email confirmation and an invitation to participate in the upcoming Modular Meetup call. Furthermore, you will be granted access to the exclusive Discord channel labeled "#modular-meetup" on our Discord server. Please take note that joining our Discord is a prerequisite for channel access. It's essential to recognize that this program is tailored for dedicated organizers with a genuine interest in nurturing their local modular ecosystem community.

Emails

As a participant in the Celestia Modular Meetup Program, you can expect to receive the following emails:

  1. Welcome email with links to calendar events and Discord channel
  2. Monthly Catch-up call invites
  3. Recap emails with notes from calls

Discord

Your active participation is key to unlocking the full potential of this vibrant community. Our primary communication tool is Discord, providing an engaging platform to connect with fellow organizers:

Materials

As a meetup organizer, you'll gain access to the Celestia Modular Meetup Program's list of resources. This collection should become your trusted companion in organizing events. Drawing upon the wisdom of seasoned event organizers, this resource is available for you and your co-organizers to explore and learn.

',23),s=[n];function l(u,c,d,p,m,h){return o(),a("div",null,s)}const y=e(i,[["render",l]]);export{f as __pageData,y as default}; diff --git a/pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.lean.js b/pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.lean.js similarity index 91% rename from pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.lean.js rename to pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.lean.js index b11e972388..4703144cda 100644 --- a/pr-1699/assets/community_modular-meetup-intro.md.1b04ad48.lean.js +++ b/pr-1699/assets/community_modular-meetup-intro.md.b7a491a8.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Modular_meetup2.jpg",f=JSON.parse('{"title":"Celestia Modular Meetup program","description":"The ultimate guide for Modular Meetup organizers!","frontmatter":{"description":"The ultimate guide for Modular Meetup organizers!","head":[["meta",{"name":"og:title","content":"Celestia Modular Meetup program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-intro.md","filePath":"community/modular-meetup-intro.md","lastUpdated":1725971357000}'),i={name:"community/modular-meetup-intro.md"},n=t("",23),s=[n];function l(u,c,d,p,m,h){return o(),a("div",null,s)}const y=e(i,[["render",l]]);export{f as __pageData,y as default}; +import{_ as e,o,c as a,Q as t}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Modular_meetup2.jpg",f=JSON.parse('{"title":"Celestia Modular Meetup program","description":"The ultimate guide for Modular Meetup organizers!","frontmatter":{"description":"The ultimate guide for Modular Meetup organizers!","head":[["meta",{"name":"og:title","content":"Celestia Modular Meetup program | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-intro.md","filePath":"community/modular-meetup-intro.md","lastUpdated":1725992025000}'),i={name:"community/modular-meetup-intro.md"},n=t("",23),s=[n];function l(u,c,d,p,m,h){return o(),a("div",null,s)}const y=e(i,[["render",l]]);export{f as __pageData,y as default}; diff --git a/pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.js b/pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.js similarity index 98% rename from pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.js rename to pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.js index 441b2af4d2..a9ea711a1d 100644 --- a/pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.js +++ b/pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.js @@ -1 +1 @@ -import{_ as e,o,c as i,Q as t}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup Toolkit","description":"A toolkit for Modular Meetups.","frontmatter":{"description":"A toolkit for Modular Meetups.","head":[["meta",{"name":"og:title","content":"Modular Meetup Toolkit | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-toolkit.md","filePath":"community/modular-meetup-toolkit.md","lastUpdated":1725971357000}'),l={name:"community/modular-meetup-toolkit.md"},a=t('

Modular Meetup Toolkit

Welcome to the Modular Meetups Toolkit! This kit is designed to help you run successful meetups for the Celestia community. As the first modular blockchain, Celestia offers a lot to discuss and explore. This kit includes useful resources and materials to help you plan and execute your meetups effectively.

Celestia branding guidelines

Sample “Introduction to Modularity” workshop presentation

Sample “Run a Celestia light node” workshop presentation

Sample “Deploy a Sovereign Rollup” workshop presentation

Sample “Modular Meetup Introduction” workshop presentation

Swag logistics

With this Modular Meetups Organizer Kit, you’ll have everything you need to plan and execute engaging, informative, and successful meetups for the Celestia community. Happy organizing!

',15),r=[a];function n(s,p,u,d,h,c){return o(),i("div",null,r)}const f=e(l,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o,c as i,Q as t}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup Toolkit","description":"A toolkit for Modular Meetups.","frontmatter":{"description":"A toolkit for Modular Meetups.","head":[["meta",{"name":"og:title","content":"Modular Meetup Toolkit | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-toolkit.md","filePath":"community/modular-meetup-toolkit.md","lastUpdated":1725992025000}'),l={name:"community/modular-meetup-toolkit.md"},a=t('

Modular Meetup Toolkit

Welcome to the Modular Meetups Toolkit! This kit is designed to help you run successful meetups for the Celestia community. As the first modular blockchain, Celestia offers a lot to discuss and explore. This kit includes useful resources and materials to help you plan and execute your meetups effectively.

Celestia branding guidelines

Sample “Introduction to Modularity” workshop presentation

Sample “Run a Celestia light node” workshop presentation

Sample “Deploy a Sovereign Rollup” workshop presentation

Sample “Modular Meetup Introduction” workshop presentation

Swag logistics

With this Modular Meetups Organizer Kit, you’ll have everything you need to plan and execute engaging, informative, and successful meetups for the Celestia community. Happy organizing!

',15),r=[a];function n(s,p,u,d,h,c){return o(),i("div",null,r)}const f=e(l,[["render",n]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.lean.js b/pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.lean.js similarity index 90% rename from pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.lean.js rename to pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.lean.js index 9597a91257..d8bb639ced 100644 --- a/pr-1699/assets/community_modular-meetup-toolkit.md.f6184c46.lean.js +++ b/pr-1699/assets/community_modular-meetup-toolkit.md.0a2e761b.lean.js @@ -1 +1 @@ -import{_ as e,o,c as i,Q as t}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup Toolkit","description":"A toolkit for Modular Meetups.","frontmatter":{"description":"A toolkit for Modular Meetups.","head":[["meta",{"name":"og:title","content":"Modular Meetup Toolkit | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-toolkit.md","filePath":"community/modular-meetup-toolkit.md","lastUpdated":1725971357000}'),l={name:"community/modular-meetup-toolkit.md"},a=t("",15),r=[a];function n(s,p,u,d,h,c){return o(),i("div",null,r)}const f=e(l,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o,c as i,Q as t}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Modular Meetup Toolkit","description":"A toolkit for Modular Meetups.","frontmatter":{"description":"A toolkit for Modular Meetups.","head":[["meta",{"name":"og:title","content":"Modular Meetup Toolkit | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/modular-meetup-toolkit.md","filePath":"community/modular-meetup-toolkit.md","lastUpdated":1725992025000}'),l={name:"community/modular-meetup-toolkit.md"},a=t("",15),r=[a];function n(s,p,u,d,h,c){return o(),i("div",null,r)}const f=e(l,[["render",n]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/community_overview.md.aec66ec4.js b/pr-1699/assets/community_overview.md.fb9fd608.js similarity index 94% rename from pr-1699/assets/community_overview.md.aec66ec4.js rename to pr-1699/assets/community_overview.md.fb9fd608.js index 76edb82189..236d03da46 100644 --- a/pr-1699/assets/community_overview.md.aec66ec4.js +++ b/pr-1699/assets/community_overview.md.fb9fd608.js @@ -1 +1 @@ -import{_ as o,o as i,c as a,k as e,a as t}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"Community overview","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Community overview | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/overview.md","filePath":"community/overview.md","lastUpdated":1725971357000}'),n={name:"community/overview.md"},r=e("h1",{id:"community-overview",tabindex:"-1"},[t("Community overview "),e("a",{class:"header-anchor",href:"#community-overview","aria-label":'Permalink to "Community overview"'},"​")],-1),c=e("p",null,"This section will highlight all the different resources and activities for the Celestia community.",-1),s=e("p",null,[t("Here you will find links to our "),e("a",{href:"./calendar"},"community calendar"),t(", "),e("a",{href:"./coc"},"Code of Conduct"),t(" and other community-related resources.")],-1),m=[r,c,s];function l(d,u,v,h,_,f){return i(),a("div",null,m)}const w=o(n,[["render",l]]);export{y as __pageData,w as default}; +import{_ as o,o as i,c as a,k as e,a as t}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"Community overview","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Community overview | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/overview.md","filePath":"community/overview.md","lastUpdated":1725992025000}'),n={name:"community/overview.md"},r=e("h1",{id:"community-overview",tabindex:"-1"},[t("Community overview "),e("a",{class:"header-anchor",href:"#community-overview","aria-label":'Permalink to "Community overview"'},"​")],-1),c=e("p",null,"This section will highlight all the different resources and activities for the Celestia community.",-1),s=e("p",null,[t("Here you will find links to our "),e("a",{href:"./calendar"},"community calendar"),t(", "),e("a",{href:"./coc"},"Code of Conduct"),t(" and other community-related resources.")],-1),m=[r,c,s];function l(d,u,v,h,_,f){return i(),a("div",null,m)}const w=o(n,[["render",l]]);export{y as __pageData,w as default}; diff --git a/pr-1699/assets/community_overview.md.aec66ec4.lean.js b/pr-1699/assets/community_overview.md.fb9fd608.lean.js similarity index 94% rename from pr-1699/assets/community_overview.md.aec66ec4.lean.js rename to pr-1699/assets/community_overview.md.fb9fd608.lean.js index 76edb82189..236d03da46 100644 --- a/pr-1699/assets/community_overview.md.aec66ec4.lean.js +++ b/pr-1699/assets/community_overview.md.fb9fd608.lean.js @@ -1 +1 @@ -import{_ as o,o as i,c as a,k as e,a as t}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"Community overview","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Community overview | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/overview.md","filePath":"community/overview.md","lastUpdated":1725971357000}'),n={name:"community/overview.md"},r=e("h1",{id:"community-overview",tabindex:"-1"},[t("Community overview "),e("a",{class:"header-anchor",href:"#community-overview","aria-label":'Permalink to "Community overview"'},"​")],-1),c=e("p",null,"This section will highlight all the different resources and activities for the Celestia community.",-1),s=e("p",null,[t("Here you will find links to our "),e("a",{href:"./calendar"},"community calendar"),t(", "),e("a",{href:"./coc"},"Code of Conduct"),t(" and other community-related resources.")],-1),m=[r,c,s];function l(d,u,v,h,_,f){return i(),a("div",null,m)}const w=o(n,[["render",l]]);export{y as __pageData,w as default}; +import{_ as o,o as i,c as a,k as e,a as t}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"Community overview","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Community overview | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/overview.md","filePath":"community/overview.md","lastUpdated":1725992025000}'),n={name:"community/overview.md"},r=e("h1",{id:"community-overview",tabindex:"-1"},[t("Community overview "),e("a",{class:"header-anchor",href:"#community-overview","aria-label":'Permalink to "Community overview"'},"​")],-1),c=e("p",null,"This section will highlight all the different resources and activities for the Celestia community.",-1),s=e("p",null,[t("Here you will find links to our "),e("a",{href:"./calendar"},"community calendar"),t(", "),e("a",{href:"./coc"},"Code of Conduct"),t(" and other community-related resources.")],-1),m=[r,c,s];function l(d,u,v,h,_,f){return i(),a("div",null,m)}const w=o(n,[["render",l]]);export{y as __pageData,w as default}; diff --git a/pr-1699/assets/community_speaker-list.md.716e09e6.js b/pr-1699/assets/community_speaker-list.md.872a3b69.js similarity index 97% rename from pr-1699/assets/community_speaker-list.md.716e09e6.js rename to pr-1699/assets/community_speaker-list.md.872a3b69.js index 7f4f1d8399..afb87ec372 100644 --- a/pr-1699/assets/community_speaker-list.md.716e09e6.js +++ b/pr-1699/assets/community_speaker-list.md.872a3b69.js @@ -1 +1 @@ -import{_ as t,o as a,c as s,k as e,a as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Speaker list","description":"Invite a speaker from the ecosystem to your Modular Meetup.","frontmatter":{"description":"Invite a speaker from the ecosystem to your Modular Meetup.","head":[["meta",{"name":"og:title","content":"Speaker list | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/speaker-list.md","filePath":"community/speaker-list.md","lastUpdated":1725971357000}'),o={name:"community/speaker-list.md"},r=e("h1",{id:"speaker-list",tabindex:"-1"},[i("Speaker list "),e("a",{class:"header-anchor",href:"#speaker-list","aria-label":'Permalink to "Speaker list"'},"​")],-1),n=e("p",null,"As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.",-1),l=e("p",null,"The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.",-1),c=e("p",null,"By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.",-1),p=e("p",null,"You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.",-1),d=[r,n,l,c,p];function u(h,m,f,g,y,k){return a(),s("div",null,d)}const v=t(o,[["render",u]]);export{b as __pageData,v as default}; +import{_ as t,o as a,c as s,k as e,a as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Speaker list","description":"Invite a speaker from the ecosystem to your Modular Meetup.","frontmatter":{"description":"Invite a speaker from the ecosystem to your Modular Meetup.","head":[["meta",{"name":"og:title","content":"Speaker list | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/speaker-list.md","filePath":"community/speaker-list.md","lastUpdated":1725992025000}'),o={name:"community/speaker-list.md"},r=e("h1",{id:"speaker-list",tabindex:"-1"},[i("Speaker list "),e("a",{class:"header-anchor",href:"#speaker-list","aria-label":'Permalink to "Speaker list"'},"​")],-1),n=e("p",null,"As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.",-1),l=e("p",null,"The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.",-1),c=e("p",null,"By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.",-1),p=e("p",null,"You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.",-1),d=[r,n,l,c,p];function u(h,m,f,g,y,k){return a(),s("div",null,d)}const v=t(o,[["render",u]]);export{b as __pageData,v as default}; diff --git a/pr-1699/assets/community_speaker-list.md.716e09e6.lean.js b/pr-1699/assets/community_speaker-list.md.872a3b69.lean.js similarity index 97% rename from pr-1699/assets/community_speaker-list.md.716e09e6.lean.js rename to pr-1699/assets/community_speaker-list.md.872a3b69.lean.js index 7f4f1d8399..afb87ec372 100644 --- a/pr-1699/assets/community_speaker-list.md.716e09e6.lean.js +++ b/pr-1699/assets/community_speaker-list.md.872a3b69.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as s,k as e,a as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Speaker list","description":"Invite a speaker from the ecosystem to your Modular Meetup.","frontmatter":{"description":"Invite a speaker from the ecosystem to your Modular Meetup.","head":[["meta",{"name":"og:title","content":"Speaker list | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/speaker-list.md","filePath":"community/speaker-list.md","lastUpdated":1725971357000}'),o={name:"community/speaker-list.md"},r=e("h1",{id:"speaker-list",tabindex:"-1"},[i("Speaker list "),e("a",{class:"header-anchor",href:"#speaker-list","aria-label":'Permalink to "Speaker list"'},"​")],-1),n=e("p",null,"As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.",-1),l=e("p",null,"The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.",-1),c=e("p",null,"By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.",-1),p=e("p",null,"You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.",-1),d=[r,n,l,c,p];function u(h,m,f,g,y,k){return a(),s("div",null,d)}const v=t(o,[["render",u]]);export{b as __pageData,v as default}; +import{_ as t,o as a,c as s,k as e,a as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Speaker list","description":"Invite a speaker from the ecosystem to your Modular Meetup.","frontmatter":{"description":"Invite a speaker from the ecosystem to your Modular Meetup.","head":[["meta",{"name":"og:title","content":"Speaker list | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"community/speaker-list.md","filePath":"community/speaker-list.md","lastUpdated":1725992025000}'),o={name:"community/speaker-list.md"},r=e("h1",{id:"speaker-list",tabindex:"-1"},[i("Speaker list "),e("a",{class:"header-anchor",href:"#speaker-list","aria-label":'Permalink to "Speaker list"'},"​")],-1),n=e("p",null,"As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.",-1),l=e("p",null,"The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.",-1),c=e("p",null,"By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.",-1),p=e("p",null,"You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.",-1),d=[r,n,l,c,p];function u(h,m,f,g,y,k){return a(),s("div",null,d)}const v=t(o,[["render",u]]);export{b as __pageData,v as default}; diff --git a/pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.js b/pr-1699/assets/developers_arbitrum-bridge.md.8c851802.js similarity index 99% rename from pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.js rename to pr-1699/assets/developers_arbitrum-bridge.md.8c851802.js index 06c06a180f..2f62953223 100644 --- a/pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.js +++ b/pr-1699/assets/developers_arbitrum-bridge.md.8c851802.js @@ -1 +1 @@ -import{_ as r,o,c as t,Q as e}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/arbitrum/bridge-overview-deposit-and-withdrawal-l3.png",a="/docs-preview/pr-1699/arbitrum/bridge-settings.png",n="/docs-preview/pr-1699/arbitrum/add-custom-chain-to-bridge.png",s="/docs-preview/pr-1699/arbitrum/live-orbit-chains.png",p="/docs-preview/pr-1699/arbitrum/bridge-in-start.png",l="/docs-preview/pr-1699/arbitrum/bridge-in-pending-txs.png",d="/docs-preview/pr-1699/arbitrum/bridge-in-settled-txs.png",g="/docs-preview/pr-1699/arbitrum/bridge-in-explorer-rollup-tx.png",u="/docs-preview/pr-1699/arbitrum/bridge-in-success.png",c="/docs-preview/pr-1699/arbitrum/bridge-in-sepolia-tx-explorer.png",b="/docs-preview/pr-1699/arbitrum/bridge-out-small-screenshot.png",h="/docs-preview/pr-1699/arbitrum/bridge-out-begin.png",m="/docs-preview/pr-1699/arbitrum/bridge-out-pending.png",w="/docs-preview/pr-1699/arbitrum/bridge-out-begin-overview.png",f="/docs-preview/pr-1699/arbitrum/bridge-out-rollup-tx-details.png",y="/docs-preview/pr-1699/arbitrum/bridge-out-logs-details-1.png",_="/docs-preview/pr-1699/arbitrum/bridge-out-logs-explorer-2.png",v="/docs-preview/pr-1699/arbitrum/bridge-out-claim-withdrawal.png",x="/docs-preview/pr-1699/arbitrum/bridge-out-claim-success-withdrawal.png",D=JSON.parse('{"title":"Bridging in and out of your Orbit rollup","description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","frontmatter":{"description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","head":[["meta",{"name":"og:title","content":"Bridging in and out of your Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-bridge.md","filePath":"developers/arbitrum-bridge.md","lastUpdated":1725971357000}'),A={name:"developers/arbitrum-bridge.md"},S=e('

Bridging in and out of your Orbit rollup

This guide covers how to bridge in (deposit) and bridge out (withdrawal) from your Arbitrum Orbit L3 rollup.

This guide will cover bridging in and out of your Orbit rollup.

Below are two example transactions, one of a deposit and one of a withdrawal:

bridge-overview-deposit-and-withdrawal-l3

Bridge in (deposit) to your rollup

Step 1: Add your custom chain config

(1a) In the Arbitrum Bridge UI, click the menu dropdown in the top right. Select Settings.

bridge-settings

(1b) Under Developer Mode, select Turn on testnet mode. Add your custom chain config from outputInfo.json in the root of your orbit-setup-script directory.

add-testnet-orbit-chain

(1c) You'll then see the chain under Live Orbit Chains:

live-orbit-chains

Step 2: Deposit to your Orbit rollup

(2a) Choose an amount of Arbitrum Sepolia ETH to bridge into your rollup. Click Move funds to <YOUR_ROLLUP_NAME>, in this case Move funds to Arbitrum L3 Rollup. Approve the transaction in your wallet.

bridge-in-start

(2b) You'll then see it load in the Pending transactions tab:

bridge-in-pending

(2c) Shortly after, in the Settled transactions tab you can see the transaction status. Click Success.

bridge-in-settled-txs

(2d) View the transaction on your local instance of Blockscout for your rollup:

bridge-in-explorer-rollup-tx

(2e) Optionally, click See Details for an overview of your deposit:

bridge-in-success

(2f) From the details page, you can also see the transaction for your deposit on Arbitrum Sepolia:

bridge-in-sepolia-tx-explorer

Bridge out (withdrawal) from your rollup

Step 1: Choose an amount to withdraw from your rollup

(1a) In the Arbitrum Bridge UI, choose your origin chain to your Arbitrum L3 Rollup and the destination chain as Arbitrum Sepolia.

bridge-out-small-screenshot

(1b) Click Move funds to Arbitrum Sepolia and read the disclaimer, check the boxes, and click Continue.

bridge-out-begin

(1c) Optionally, set a reminder on your calendar so you don't forget.

(1d) After approving the transaction in your wallet, you'll be able to see the transaction in the Pending transactions tab:

bridge-out-pending

After approximately two hours, you will be able to proceed to Step 2: Claim your withdrawal.

(1e) Click See details to see an overview of your withdrawal:

bridge-out-begin-overview

(1f) Optionally, view the transaction on your local explorer.

bridge-out-tx-details

(1g) To learn more about what is going on, click the Logs tab:

bridge-out-logs-details-1

bridge-out-logs-explorer-2

Step 2: Claim your withdrawal

After approximately 2 hours, you will be able to claim your withdrawal.

(2a) Head back to the bridge UI and you will have a notification to claim your withdrawal. Click Claim in the details of the transaction:

bridge-out-claim-withdrawal

(2b) Approve the transaction in your wallet.

(2c) After your transaction goes through, you can see the details in the bridge UI under Settled transactions:

bridge-out-claim-success-withdrawal

',50),k=[S];function C(O,B,q,P,T,I){return o(),t("div",null,k)}const L=r(A,[["render",C]]);export{D as __pageData,L as default}; +import{_ as r,o,c as t,Q as e}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/arbitrum/bridge-overview-deposit-and-withdrawal-l3.png",a="/docs-preview/pr-1699/arbitrum/bridge-settings.png",n="/docs-preview/pr-1699/arbitrum/add-custom-chain-to-bridge.png",s="/docs-preview/pr-1699/arbitrum/live-orbit-chains.png",p="/docs-preview/pr-1699/arbitrum/bridge-in-start.png",l="/docs-preview/pr-1699/arbitrum/bridge-in-pending-txs.png",d="/docs-preview/pr-1699/arbitrum/bridge-in-settled-txs.png",g="/docs-preview/pr-1699/arbitrum/bridge-in-explorer-rollup-tx.png",u="/docs-preview/pr-1699/arbitrum/bridge-in-success.png",c="/docs-preview/pr-1699/arbitrum/bridge-in-sepolia-tx-explorer.png",b="/docs-preview/pr-1699/arbitrum/bridge-out-small-screenshot.png",h="/docs-preview/pr-1699/arbitrum/bridge-out-begin.png",m="/docs-preview/pr-1699/arbitrum/bridge-out-pending.png",w="/docs-preview/pr-1699/arbitrum/bridge-out-begin-overview.png",f="/docs-preview/pr-1699/arbitrum/bridge-out-rollup-tx-details.png",y="/docs-preview/pr-1699/arbitrum/bridge-out-logs-details-1.png",_="/docs-preview/pr-1699/arbitrum/bridge-out-logs-explorer-2.png",v="/docs-preview/pr-1699/arbitrum/bridge-out-claim-withdrawal.png",x="/docs-preview/pr-1699/arbitrum/bridge-out-claim-success-withdrawal.png",D=JSON.parse('{"title":"Bridging in and out of your Orbit rollup","description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","frontmatter":{"description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","head":[["meta",{"name":"og:title","content":"Bridging in and out of your Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-bridge.md","filePath":"developers/arbitrum-bridge.md","lastUpdated":1725992025000}'),A={name:"developers/arbitrum-bridge.md"},S=e('

Bridging in and out of your Orbit rollup

This guide covers how to bridge in (deposit) and bridge out (withdrawal) from your Arbitrum Orbit L3 rollup.

This guide will cover bridging in and out of your Orbit rollup.

Below are two example transactions, one of a deposit and one of a withdrawal:

bridge-overview-deposit-and-withdrawal-l3

Bridge in (deposit) to your rollup

Step 1: Add your custom chain config

(1a) In the Arbitrum Bridge UI, click the menu dropdown in the top right. Select Settings.

bridge-settings

(1b) Under Developer Mode, select Turn on testnet mode. Add your custom chain config from outputInfo.json in the root of your orbit-setup-script directory.

add-testnet-orbit-chain

(1c) You'll then see the chain under Live Orbit Chains:

live-orbit-chains

Step 2: Deposit to your Orbit rollup

(2a) Choose an amount of Arbitrum Sepolia ETH to bridge into your rollup. Click Move funds to <YOUR_ROLLUP_NAME>, in this case Move funds to Arbitrum L3 Rollup. Approve the transaction in your wallet.

bridge-in-start

(2b) You'll then see it load in the Pending transactions tab:

bridge-in-pending

(2c) Shortly after, in the Settled transactions tab you can see the transaction status. Click Success.

bridge-in-settled-txs

(2d) View the transaction on your local instance of Blockscout for your rollup:

bridge-in-explorer-rollup-tx

(2e) Optionally, click See Details for an overview of your deposit:

bridge-in-success

(2f) From the details page, you can also see the transaction for your deposit on Arbitrum Sepolia:

bridge-in-sepolia-tx-explorer

Bridge out (withdrawal) from your rollup

Step 1: Choose an amount to withdraw from your rollup

(1a) In the Arbitrum Bridge UI, choose your origin chain to your Arbitrum L3 Rollup and the destination chain as Arbitrum Sepolia.

bridge-out-small-screenshot

(1b) Click Move funds to Arbitrum Sepolia and read the disclaimer, check the boxes, and click Continue.

bridge-out-begin

(1c) Optionally, set a reminder on your calendar so you don't forget.

(1d) After approving the transaction in your wallet, you'll be able to see the transaction in the Pending transactions tab:

bridge-out-pending

After approximately two hours, you will be able to proceed to Step 2: Claim your withdrawal.

(1e) Click See details to see an overview of your withdrawal:

bridge-out-begin-overview

(1f) Optionally, view the transaction on your local explorer.

bridge-out-tx-details

(1g) To learn more about what is going on, click the Logs tab:

bridge-out-logs-details-1

bridge-out-logs-explorer-2

Step 2: Claim your withdrawal

After approximately 2 hours, you will be able to claim your withdrawal.

(2a) Head back to the bridge UI and you will have a notification to claim your withdrawal. Click Claim in the details of the transaction:

bridge-out-claim-withdrawal

(2b) Approve the transaction in your wallet.

(2c) After your transaction goes through, you can see the details in the bridge UI under Settled transactions:

bridge-out-claim-success-withdrawal

',50),k=[S];function C(O,B,q,P,T,I){return o(),t("div",null,k)}const L=r(A,[["render",C]]);export{D as __pageData,L as default}; diff --git a/pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.lean.js b/pr-1699/assets/developers_arbitrum-bridge.md.8c851802.lean.js similarity index 96% rename from pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.lean.js rename to pr-1699/assets/developers_arbitrum-bridge.md.8c851802.lean.js index 1acd97e708..19bcbcda38 100644 --- a/pr-1699/assets/developers_arbitrum-bridge.md.d7cda10d.lean.js +++ b/pr-1699/assets/developers_arbitrum-bridge.md.8c851802.lean.js @@ -1 +1 @@ -import{_ as r,o,c as t,Q as e}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/arbitrum/bridge-overview-deposit-and-withdrawal-l3.png",a="/docs-preview/pr-1699/arbitrum/bridge-settings.png",n="/docs-preview/pr-1699/arbitrum/add-custom-chain-to-bridge.png",s="/docs-preview/pr-1699/arbitrum/live-orbit-chains.png",p="/docs-preview/pr-1699/arbitrum/bridge-in-start.png",l="/docs-preview/pr-1699/arbitrum/bridge-in-pending-txs.png",d="/docs-preview/pr-1699/arbitrum/bridge-in-settled-txs.png",g="/docs-preview/pr-1699/arbitrum/bridge-in-explorer-rollup-tx.png",u="/docs-preview/pr-1699/arbitrum/bridge-in-success.png",c="/docs-preview/pr-1699/arbitrum/bridge-in-sepolia-tx-explorer.png",b="/docs-preview/pr-1699/arbitrum/bridge-out-small-screenshot.png",h="/docs-preview/pr-1699/arbitrum/bridge-out-begin.png",m="/docs-preview/pr-1699/arbitrum/bridge-out-pending.png",w="/docs-preview/pr-1699/arbitrum/bridge-out-begin-overview.png",f="/docs-preview/pr-1699/arbitrum/bridge-out-rollup-tx-details.png",y="/docs-preview/pr-1699/arbitrum/bridge-out-logs-details-1.png",_="/docs-preview/pr-1699/arbitrum/bridge-out-logs-explorer-2.png",v="/docs-preview/pr-1699/arbitrum/bridge-out-claim-withdrawal.png",x="/docs-preview/pr-1699/arbitrum/bridge-out-claim-success-withdrawal.png",D=JSON.parse('{"title":"Bridging in and out of your Orbit rollup","description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","frontmatter":{"description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","head":[["meta",{"name":"og:title","content":"Bridging in and out of your Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-bridge.md","filePath":"developers/arbitrum-bridge.md","lastUpdated":1725971357000}'),A={name:"developers/arbitrum-bridge.md"},S=e("",50),k=[S];function C(O,B,q,P,T,I){return o(),t("div",null,k)}const L=r(A,[["render",C]]);export{D as __pageData,L as default}; +import{_ as r,o,c as t,Q as e}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/arbitrum/bridge-overview-deposit-and-withdrawal-l3.png",a="/docs-preview/pr-1699/arbitrum/bridge-settings.png",n="/docs-preview/pr-1699/arbitrum/add-custom-chain-to-bridge.png",s="/docs-preview/pr-1699/arbitrum/live-orbit-chains.png",p="/docs-preview/pr-1699/arbitrum/bridge-in-start.png",l="/docs-preview/pr-1699/arbitrum/bridge-in-pending-txs.png",d="/docs-preview/pr-1699/arbitrum/bridge-in-settled-txs.png",g="/docs-preview/pr-1699/arbitrum/bridge-in-explorer-rollup-tx.png",u="/docs-preview/pr-1699/arbitrum/bridge-in-success.png",c="/docs-preview/pr-1699/arbitrum/bridge-in-sepolia-tx-explorer.png",b="/docs-preview/pr-1699/arbitrum/bridge-out-small-screenshot.png",h="/docs-preview/pr-1699/arbitrum/bridge-out-begin.png",m="/docs-preview/pr-1699/arbitrum/bridge-out-pending.png",w="/docs-preview/pr-1699/arbitrum/bridge-out-begin-overview.png",f="/docs-preview/pr-1699/arbitrum/bridge-out-rollup-tx-details.png",y="/docs-preview/pr-1699/arbitrum/bridge-out-logs-details-1.png",_="/docs-preview/pr-1699/arbitrum/bridge-out-logs-explorer-2.png",v="/docs-preview/pr-1699/arbitrum/bridge-out-claim-withdrawal.png",x="/docs-preview/pr-1699/arbitrum/bridge-out-claim-success-withdrawal.png",D=JSON.parse('{"title":"Bridging in and out of your Orbit rollup","description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","frontmatter":{"description":"A guide on how to bridge in and out of your Arbitrum Orbit rollup.","head":[["meta",{"name":"og:title","content":"Bridging in and out of your Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-bridge.md","filePath":"developers/arbitrum-bridge.md","lastUpdated":1725992025000}'),A={name:"developers/arbitrum-bridge.md"},S=e("",50),k=[S];function C(O,B,q,P,T,I){return o(),t("div",null,k)}const L=r(A,[["render",C]]);export{D as __pageData,L as default}; diff --git a/pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.js b/pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.js similarity index 99% rename from pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.js rename to pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.js index 33a271421c..407f4c0493 100644 --- a/pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.js +++ b/pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/gm-arb.png",F=JSON.parse('{"title":"Deploy a dapp on your Arbitrum rollup devnet","description":"Make your own GM Portal dapp on your Arbitrum rollup.","frontmatter":{"description":"Make your own GM Portal dapp on your Arbitrum rollup.","next":{"text":"Intro to OP Stack integration","link":"/developers/intro-to-op-stack"},"head":[["meta",{"name":"og:title","content":"Deploy a dapp on your Arbitrum rollup devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-dapp-deploy.md","filePath":"developers/arbitrum-dapp-deploy.md","lastUpdated":1725971357000}'),p={name:"developers/arbitrum-dapp-deploy.md"},t=n(`

Deploy a dapp on your Arbitrum rollup devnet

First, review the Arbitrum integration, Quickstart: Deploy an Arbitrum Orbit rollup, and Deploy a smart contract to your Arbitrum rollup pages.

Dependencies

Setup and contract deployment

  1. Clone the gm-portal from GitHub and start the frontend:

    bash
    cd $HOME
    +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/gm-arb.png",F=JSON.parse('{"title":"Deploy a dapp on your Arbitrum rollup devnet","description":"Make your own GM Portal dapp on your Arbitrum rollup.","frontmatter":{"description":"Make your own GM Portal dapp on your Arbitrum rollup.","next":{"text":"Intro to OP Stack integration","link":"/developers/intro-to-op-stack"},"head":[["meta",{"name":"og:title","content":"Deploy a dapp on your Arbitrum rollup devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-dapp-deploy.md","filePath":"developers/arbitrum-dapp-deploy.md","lastUpdated":1725992025000}'),p={name:"developers/arbitrum-dapp-deploy.md"},t=n(`

    Deploy a dapp on your Arbitrum rollup devnet

    First, review the Arbitrum integration, Quickstart: Deploy an Arbitrum Orbit rollup, and Deploy a smart contract to your Arbitrum rollup pages.

    Dependencies

    Setup and contract deployment

    1. Clone the gm-portal from GitHub and start the frontend:

      bash
      cd $HOME
       git clone https://github.com/jcstein/gm-portal.git
       cd gm-portal && git checkout arbitrum
       cd frontend && yarn && yarn dev
      cd $HOME
      diff --git a/pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.lean.js b/pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.lean.js
      similarity index 92%
      rename from pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.lean.js
      rename to pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.lean.js
      index bfb905f493..a7a3fca98a 100644
      --- a/pr-1699/assets/developers_arbitrum-dapp-deploy.md.26b815d3.lean.js
      +++ b/pr-1699/assets/developers_arbitrum-dapp-deploy.md.4b34cdb2.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/gm-arb.png",F=JSON.parse('{"title":"Deploy a dapp on your Arbitrum rollup devnet","description":"Make your own GM Portal dapp on your Arbitrum rollup.","frontmatter":{"description":"Make your own GM Portal dapp on your Arbitrum rollup.","next":{"text":"Intro to OP Stack integration","link":"/developers/intro-to-op-stack"},"head":[["meta",{"name":"og:title","content":"Deploy a dapp on your Arbitrum rollup devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-dapp-deploy.md","filePath":"developers/arbitrum-dapp-deploy.md","lastUpdated":1725971357000}'),p={name:"developers/arbitrum-dapp-deploy.md"},t=n("",16),e=[t];function r(c,i,y,d,E,h){return a(),o("div",null,e)}const m=s(p,[["render",r]]);export{F as __pageData,m as default};
      +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/gm-arb.png",F=JSON.parse('{"title":"Deploy a dapp on your Arbitrum rollup devnet","description":"Make your own GM Portal dapp on your Arbitrum rollup.","frontmatter":{"description":"Make your own GM Portal dapp on your Arbitrum rollup.","next":{"text":"Intro to OP Stack integration","link":"/developers/intro-to-op-stack"},"head":[["meta",{"name":"og:title","content":"Deploy a dapp on your Arbitrum rollup devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-dapp-deploy.md","filePath":"developers/arbitrum-dapp-deploy.md","lastUpdated":1725992025000}'),p={name:"developers/arbitrum-dapp-deploy.md"},t=n("",16),e=[t];function r(c,i,y,d,E,h){return a(),o("div",null,e)}const m=s(p,[["render",r]]);export{F as __pageData,m as default};
      diff --git a/pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.js b/pr-1699/assets/developers_arbitrum-deploy.md.26acb828.js
      similarity index 99%
      rename from pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.js
      rename to pr-1699/assets/developers_arbitrum-deploy.md.26acb828.js
      index 98b7a65143..34ecd5e936 100644
      --- a/pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.js
      +++ b/pr-1699/assets/developers_arbitrum-deploy.md.26acb828.js
      @@ -1,4 +1,4 @@
      -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const e="/docs-preview/pr-1699/arbitrum/choose_da.png",t="/docs-preview/pr-1699/arbitrum/configuration.png",l="/docs-preview/pr-1699/arbitrum/download-config.png",p="/docs-preview/pr-1699/arbitrum/blockscout.png",r="/docs-preview/pr-1699/arbitrum/explorer-view.png",B=JSON.parse('{"title":"Quickstart: Deploy an Arbitrum Orbit rollup","description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","frontmatter":{"description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","head":[["meta",{"name":"og:title","content":"Quickstart: Deploy an Arbitrum Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-deploy.md","filePath":"developers/arbitrum-deploy.md","lastUpdated":1725971357000}'),c={name:"developers/arbitrum-deploy.md"},i=n('

      Quickstart: Deploy an Arbitrum Orbit rollup

      This guide covers deploying a rollup using the Celestia Orbit chain deployment portal.

      After completing this tutorial, you will have a local development network rollup capable of hosting EVM-compatible smart contracts. This rollup will process transactions locally, settle on the public Arbitrum Sepolia testnet, and post data to Celestia's Mocha testnet.

      If you're looking to learn more about the integration of Celestia and Orbit, read the Arbitrum Orbit integration overview. If you're looking to learn more about Orbit, read A gentle introduction: Orbit chains.

      Thank you, Offchain Labs!

      This guide was made possible with the support and information provided by the Offchain Labs team, the creators of Arbitrum. For more detailed information and support, visit Arbitrum documentation and the original deployment guide.

      Prerequisites

      Setup

      This section was adapted from Arbitrum's Orbit quickstart.

      Step 1: Acquire Arbitrum Sepolia ETH

      You'll need at least 1 testnet ETH for a regular Orbit rollup or 0.6 ETH plus 0.4 of your desired native token for Orbit rollups with a custom gas token. The funds will cover the cost of deploying the base contracts to the base chain, in this case, Arbitrum Sepolia.

      The simplest way to do this is to:

      1. Use an L1 testnet ETH faucet like sepoliafaucet.com to acquire some testnet ETH on Ethereum Sepolia testnet.
      2. Bridge your L1 testnet ETH to L2 Arbitrum Sepolia using the Arbitrum bridge.

      Step 2: Pick your deployment type

      Visit the Celestia Orbit chain deployment portal. This portal offers the following options:

      1. Celestia Rollup: Transaction data is posted to Celestia
      2. Rollup: Transaction data is posted to Ethereum
      3. AnyTrust: Transaction data is posted by a Data Availability Committee

      Connect your wallet to the deployment portal. You may be prompted to add the Arbitrum Sepolia network to your wallet and/or switch your wallet to this network; approve this.

      In this guide, we will select Celestia ✨ and deploy a rollup which posts data to Celestia (1 above).

      Choose Celestia for DA

      Click Next. In the next step, we will configure the deployment.

      Step 3: Configure your Orbit chain's deployment

      The deployment portal will then display a form that looks like this:

      configuration

      Parameter descriptions can be found in the table below (more in-depth descriptions can be found in the deployment UI). We recommend sticking to the defaults; to learn more about customizing your Orbit chain's deployment configuration, visit How to customize your Orbit chain's deployment configuration:

      ParameterDescription
      Chain IDThis is a unique integer identifier for your chain's network, primarily used on chain indexes like Chainlist.org. It's not crucial for development networks, but in production, you'll need to choose a unique ID.
      Chain NameThe name you assign to your Orbit chain, which helps users and developers distinguish it from other chains. It should be memorable and recognizable.
      Challenge Period BlocksDetermines the time frame within which validators can dispute the state of the chain posted to the base chain. It's measured in blocks on the underlying L1 chain. A longer period allows more time for disputes but also delays withdrawals.
      Stake TokenSpecifies the token that validators must stake to participate in the validation process, using the token's contract address on the base chain. This can be ETH or another token, defined by its address.
      Base StakeThe minimum amount of stake token required for validators to post state assertions. A lower base stake lowers the barrier to entry but increases vulnerability to attacks, whereas a higher stake encourages honest participation but raises the entry barrier.
      OwnerThe account address that has the authority to deploy, own, and update the base contracts of your Orbit chain on its base chain. In production, this is usually a high-stakes address controlled by a DAO or a multisig setup. For development chains, it's a lower-stakes administrative account.
      Gas TokenThe token used for gas payments on the network, which must be natively deployed on the parent chain. There are specific requirements for custom gas tokens, such as having 18 decimals and not being a rebasing or fee-on-transfer token. This feature is primarily for Orbit AnyTrust chains.
      ValidatorsThis is the number of validators for your chain, including their addresses. The first validator is auto-generated and immutable. Validators are crucial for maintaining the integrity of the chain and posting state assertions to the base chain.
      Batch PosterResponsible for posting transaction batches from your Orbit chain to the base chain. An address for this role is automatically generated, with the private key stored in a configuration file.

      In the Configure Validators section, specify the number of validators and their addresses for your chain. The initial validator's address is pre-generated and immutable, with its key stored in a JSON file. Validators ensure transaction integrity and state assertions on the base chain. They're added to an allow-list for validation and staking. Base contracts refer to your Orbit chain's L2 contracts, and base chain to the L2 chain they're deployed on.

      In the Configure Batch Poster section, a batch poster address is auto-generated for posting transaction batches to the base contracts on the base chain. The address and its private key are also stored in a JSON configuration file. After configuring, proceed to review and deploy your Orbit chain.

      After configuring your batch poster, proceed to the next step.

      Step 3: Review & Deploy your Orbit chain

      Now, deploy your chain's base contracts to Arbitrum Sepolia!

      Click the Deploy button on the Review & Deploy page. Your wallet should prompt you to submit a transaction to the Arbitrum testnet. You'll have to pay a little gas; your wallet may denominate this in ETH; as long as you see your chosen Arbitrum testnet in the transaction details, this gas fee will be paid in testnet ETH.

      Before proceeding, let's briefly review what just happened:

      1. You submitted a deployment transaction to an Orbit "factory" smart contract on the Arbitrum testnet, the public L2 chain that your local Orbit chain will settle transactions to.
      2. This Orbit smart contract then initialized your Orbit chain's base contracts with the values that you specified in the previous step, and deployed these base contracts to the Arbitrum testnet.

      Your Orbit chain's base contracts are responsible for facilitating the exchange of information between your chain's node(s) and its base chain's nodes. This includes the batch posting of transactions from your Orbit chain to its base chain, the staking of tokens by your Orbit chain's validators the challenge mechanism, bridging mechanisms, and more.

      Once your transaction is complete, continue to Step 4 to download your chain's configuration files and launch your chain.

      Step 4: Download your chain's configuration files and launch your chain

      After configuring your chain, you will need to download the necessary configuration files to launch your chain. Click the Download zip files button to download both the Rollup Config and L3 Config in a single ZIP file.

      • Rollup Config: This is the nodeConfig.json file, encapsulating your chain's node configuration. It is crucial as it contains the private keys for your validator and batch poster, essential for signing transactions for RBlocks and batch postings to your chain's base contracts on the L2 chain.

      • L3 Config: This is the orbitSetupScriptConfig.json file, which holds your chain's configuration, including configurations needed for your Token Bridge contracts.

      Ensure to securely store these downloaded files as they contain sensitive information crucial for your chain's operation.

      download config

      Step 5: Clone the setup script repository and add your configuration files

      1. Clone the orbit-setup-script repository:

        bash
        git clone https://github.com/celestiaorg/orbit-setup-script.git
        git clone https://github.com/celestiaorg/orbit-setup-script.git
      2. Move the nodeConfig.json and orbitSetupScriptConfig.json files that you downloaded into the config directory in the root of your cloned orbit-setup-script repository.

      3. Install dependencies by running yarn install from the root of the orbit-setup-script repository.

      Step 6: Pick an L2 RPC URL for the Batch Poster

      In order for the Batch Poster, which is responsible for posting batches of data, to subscribe to Blobstream's smart contract events, the node most use a WebSocket connection, since an HTTP one will not support subscriptions. This RPC URL is different from the parent-chain.connection.url object used in the node config, and is not necessary when running a full node. WebSocket (WSS) URLs which are essential for real-time data fetching and interaction with the Arbitrum Sepolia network.

      To establish a WebSocket connection for your rollup to Arbitrum Sepolia, it's recommended to find an RPC provider with WSS connections from Arbitrum's docs.

      For this example, we will make an account on Alchemy. Follow these steps to set up your account and obtain a WSS URL using Alchemy:

      1. Visit Alchemy's website and sign up for an account.
      2. Once logged in, create a new app by selecting the Arbitrum network, specifically targeting the Arbitrum Sepolia testnet.
      3. After creating your app, navigate to the "API key" section to find your WebSocket (WSS) URL.
      4. In the next step, use this WSS URL in your nodeConfig.json under the celestia-cfg.eth-rpc object to ensure your node can establish a WebSocket connection to the Arbitrum Sepolia network and successfully subscribe to Blobstream events.

      Without a WSS connection, the Batch Poster won't be able to subscribe to Blobstream events, and thus will fall back to posting data to parent chain.

      Step 7: Run your light node for Mocha testnet

      First, be sure that your light node is running, using a command similar to:

      TIP

      If you are on Linux (or are not using Docker desktop), you may need to add the extra flags: --rpc.addr 0.0.0.0 and --rpc.port 26658 to your start command for your light node.

      Additionally, you will need to add host.docker.internal as a host in your docker-compose.yml:

      yaml
      extra_hosts:
      +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const e="/docs-preview/pr-1699/arbitrum/choose_da.png",t="/docs-preview/pr-1699/arbitrum/configuration.png",l="/docs-preview/pr-1699/arbitrum/download-config.png",p="/docs-preview/pr-1699/arbitrum/blockscout.png",r="/docs-preview/pr-1699/arbitrum/explorer-view.png",B=JSON.parse('{"title":"Quickstart: Deploy an Arbitrum Orbit rollup","description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","frontmatter":{"description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","head":[["meta",{"name":"og:title","content":"Quickstart: Deploy an Arbitrum Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-deploy.md","filePath":"developers/arbitrum-deploy.md","lastUpdated":1725992025000}'),c={name:"developers/arbitrum-deploy.md"},i=n('

      Quickstart: Deploy an Arbitrum Orbit rollup

      This guide covers deploying a rollup using the Celestia Orbit chain deployment portal.

      After completing this tutorial, you will have a local development network rollup capable of hosting EVM-compatible smart contracts. This rollup will process transactions locally, settle on the public Arbitrum Sepolia testnet, and post data to Celestia's Mocha testnet.

      If you're looking to learn more about the integration of Celestia and Orbit, read the Arbitrum Orbit integration overview. If you're looking to learn more about Orbit, read A gentle introduction: Orbit chains.

      Thank you, Offchain Labs!

      This guide was made possible with the support and information provided by the Offchain Labs team, the creators of Arbitrum. For more detailed information and support, visit Arbitrum documentation and the original deployment guide.

      Prerequisites

      Setup

      This section was adapted from Arbitrum's Orbit quickstart.

      Step 1: Acquire Arbitrum Sepolia ETH

      You'll need at least 1 testnet ETH for a regular Orbit rollup or 0.6 ETH plus 0.4 of your desired native token for Orbit rollups with a custom gas token. The funds will cover the cost of deploying the base contracts to the base chain, in this case, Arbitrum Sepolia.

      The simplest way to do this is to:

      1. Use an L1 testnet ETH faucet like sepoliafaucet.com to acquire some testnet ETH on Ethereum Sepolia testnet.
      2. Bridge your L1 testnet ETH to L2 Arbitrum Sepolia using the Arbitrum bridge.

      Step 2: Pick your deployment type

      Visit the Celestia Orbit chain deployment portal. This portal offers the following options:

      1. Celestia Rollup: Transaction data is posted to Celestia
      2. Rollup: Transaction data is posted to Ethereum
      3. AnyTrust: Transaction data is posted by a Data Availability Committee

      Connect your wallet to the deployment portal. You may be prompted to add the Arbitrum Sepolia network to your wallet and/or switch your wallet to this network; approve this.

      In this guide, we will select Celestia ✨ and deploy a rollup which posts data to Celestia (1 above).

      Choose Celestia for DA

      Click Next. In the next step, we will configure the deployment.

      Step 3: Configure your Orbit chain's deployment

      The deployment portal will then display a form that looks like this:

      configuration

      Parameter descriptions can be found in the table below (more in-depth descriptions can be found in the deployment UI). We recommend sticking to the defaults; to learn more about customizing your Orbit chain's deployment configuration, visit How to customize your Orbit chain's deployment configuration:

      ParameterDescription
      Chain IDThis is a unique integer identifier for your chain's network, primarily used on chain indexes like Chainlist.org. It's not crucial for development networks, but in production, you'll need to choose a unique ID.
      Chain NameThe name you assign to your Orbit chain, which helps users and developers distinguish it from other chains. It should be memorable and recognizable.
      Challenge Period BlocksDetermines the time frame within which validators can dispute the state of the chain posted to the base chain. It's measured in blocks on the underlying L1 chain. A longer period allows more time for disputes but also delays withdrawals.
      Stake TokenSpecifies the token that validators must stake to participate in the validation process, using the token's contract address on the base chain. This can be ETH or another token, defined by its address.
      Base StakeThe minimum amount of stake token required for validators to post state assertions. A lower base stake lowers the barrier to entry but increases vulnerability to attacks, whereas a higher stake encourages honest participation but raises the entry barrier.
      OwnerThe account address that has the authority to deploy, own, and update the base contracts of your Orbit chain on its base chain. In production, this is usually a high-stakes address controlled by a DAO or a multisig setup. For development chains, it's a lower-stakes administrative account.
      Gas TokenThe token used for gas payments on the network, which must be natively deployed on the parent chain. There are specific requirements for custom gas tokens, such as having 18 decimals and not being a rebasing or fee-on-transfer token. This feature is primarily for Orbit AnyTrust chains.
      ValidatorsThis is the number of validators for your chain, including their addresses. The first validator is auto-generated and immutable. Validators are crucial for maintaining the integrity of the chain and posting state assertions to the base chain.
      Batch PosterResponsible for posting transaction batches from your Orbit chain to the base chain. An address for this role is automatically generated, with the private key stored in a configuration file.

      In the Configure Validators section, specify the number of validators and their addresses for your chain. The initial validator's address is pre-generated and immutable, with its key stored in a JSON file. Validators ensure transaction integrity and state assertions on the base chain. They're added to an allow-list for validation and staking. Base contracts refer to your Orbit chain's L2 contracts, and base chain to the L2 chain they're deployed on.

      In the Configure Batch Poster section, a batch poster address is auto-generated for posting transaction batches to the base contracts on the base chain. The address and its private key are also stored in a JSON configuration file. After configuring, proceed to review and deploy your Orbit chain.

      After configuring your batch poster, proceed to the next step.

      Step 3: Review & Deploy your Orbit chain

      Now, deploy your chain's base contracts to Arbitrum Sepolia!

      Click the Deploy button on the Review & Deploy page. Your wallet should prompt you to submit a transaction to the Arbitrum testnet. You'll have to pay a little gas; your wallet may denominate this in ETH; as long as you see your chosen Arbitrum testnet in the transaction details, this gas fee will be paid in testnet ETH.

      Before proceeding, let's briefly review what just happened:

      1. You submitted a deployment transaction to an Orbit "factory" smart contract on the Arbitrum testnet, the public L2 chain that your local Orbit chain will settle transactions to.
      2. This Orbit smart contract then initialized your Orbit chain's base contracts with the values that you specified in the previous step, and deployed these base contracts to the Arbitrum testnet.

      Your Orbit chain's base contracts are responsible for facilitating the exchange of information between your chain's node(s) and its base chain's nodes. This includes the batch posting of transactions from your Orbit chain to its base chain, the staking of tokens by your Orbit chain's validators the challenge mechanism, bridging mechanisms, and more.

      Once your transaction is complete, continue to Step 4 to download your chain's configuration files and launch your chain.

      Step 4: Download your chain's configuration files and launch your chain

      After configuring your chain, you will need to download the necessary configuration files to launch your chain. Click the Download zip files button to download both the Rollup Config and L3 Config in a single ZIP file.

      • Rollup Config: This is the nodeConfig.json file, encapsulating your chain's node configuration. It is crucial as it contains the private keys for your validator and batch poster, essential for signing transactions for RBlocks and batch postings to your chain's base contracts on the L2 chain.

      • L3 Config: This is the orbitSetupScriptConfig.json file, which holds your chain's configuration, including configurations needed for your Token Bridge contracts.

      Ensure to securely store these downloaded files as they contain sensitive information crucial for your chain's operation.

      download config

      Step 5: Clone the setup script repository and add your configuration files

      1. Clone the orbit-setup-script repository:

        bash
        git clone https://github.com/celestiaorg/orbit-setup-script.git
        git clone https://github.com/celestiaorg/orbit-setup-script.git
      2. Move the nodeConfig.json and orbitSetupScriptConfig.json files that you downloaded into the config directory in the root of your cloned orbit-setup-script repository.

      3. Install dependencies by running yarn install from the root of the orbit-setup-script repository.

      Step 6: Pick an L2 RPC URL for the Batch Poster

      In order for the Batch Poster, which is responsible for posting batches of data, to subscribe to Blobstream's smart contract events, the node most use a WebSocket connection, since an HTTP one will not support subscriptions. This RPC URL is different from the parent-chain.connection.url object used in the node config, and is not necessary when running a full node. WebSocket (WSS) URLs which are essential for real-time data fetching and interaction with the Arbitrum Sepolia network.

      To establish a WebSocket connection for your rollup to Arbitrum Sepolia, it's recommended to find an RPC provider with WSS connections from Arbitrum's docs.

      For this example, we will make an account on Alchemy. Follow these steps to set up your account and obtain a WSS URL using Alchemy:

      1. Visit Alchemy's website and sign up for an account.
      2. Once logged in, create a new app by selecting the Arbitrum network, specifically targeting the Arbitrum Sepolia testnet.
      3. After creating your app, navigate to the "API key" section to find your WebSocket (WSS) URL.
      4. In the next step, use this WSS URL in your nodeConfig.json under the celestia-cfg.eth-rpc object to ensure your node can establish a WebSocket connection to the Arbitrum Sepolia network and successfully subscribe to Blobstream events.

      Without a WSS connection, the Batch Poster won't be able to subscribe to Blobstream events, and thus will fall back to posting data to parent chain.

      Step 7: Run your light node for Mocha testnet

      First, be sure that your light node is running, using a command similar to:

      TIP

      If you are on Linux (or are not using Docker desktop), you may need to add the extra flags: --rpc.addr 0.0.0.0 and --rpc.port 26658 to your start command for your light node.

      Additionally, you will need to add host.docker.internal as a host in your docker-compose.yml:

      yaml
      extra_hosts:
             - "host.docker.internal:host-gateway"
      extra_hosts:
             - "host.docker.internal:host-gateway"
      bash
      celestia light start --p2p.network mocha --core.ip <RPC_URL>
      celestia light start --p2p.network mocha --core.ip <RPC_URL>

      To set your light node's auth token, you will use the auth token that returns when you run:

      bash
      celestia light auth admin --p2p.network mocha
      celestia light auth admin --p2p.network mocha

      Since the contracts deployed through the factories above are already configured to communicate with Blobstream, you now only have to configure your node accordingly. First understand the different variables that will be set in the config:

      • enable: set it to true if you are using Celestia DA 😁
      • rpc: RPC endpoint for celestia-node
      • tendermint-rpc: a celestia-core endpoint from a full node (NOTE: only needed for a batch poster node)
      • eth-rpc: Ethereum Client WSS RPC endpoint, only used when the node is a batch poster. The eth-rpc must be WSS. Otherwise, it won't be able to subscribe to events for Blobstream.
      • namespace-id: namespace being used to post data to Celestia
      • auth-token: auth token for your Celestia Node
      • is-poster: is the node with Celestia DA the batch poster, set to true if so.
      • gas-price: how much to pay for gas (in uTIA)
      • event-channel-size: size of the events channel used by the batch poster to wait for a range of headers that contains the header for the block in which it posted a blob, before posting the batch to the base layer for verification on Blobstream X.
      • blobstreamx-address: address of the Blobstream X contract on the base chain.
        • Note that the SequencerInbox contract for each chain has a constant address for the BlobstreamX contract, thus make sure that the Blobstream X address in the SequencerInbox being used for the templates in RollupCreator matches the one in your config.

      Now enable Celestia DA in your Arbitrum chain params in config/nodeConfig.json. If you'd like to use your own namespace, use a custom 10 byte value or random value using openssl rand -hex 10 for namespace-id:

      WARNING

      The Orbit contracts depend on the existing Blobstream X deployments. Before using these addresses, please verify the contract addresses on the official source below to avoid any issues due to incorrect addresses. This is crucial to protect against potential misuse by copy-paste errors.

      ts
      "celestia-cfg": {
         "enable": true,
      diff --git a/pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.lean.js b/pr-1699/assets/developers_arbitrum-deploy.md.26acb828.lean.js
      similarity index 94%
      rename from pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.lean.js
      rename to pr-1699/assets/developers_arbitrum-deploy.md.26acb828.lean.js
      index 2914086824..2761838c60 100644
      --- a/pr-1699/assets/developers_arbitrum-deploy.md.c142d06c.lean.js
      +++ b/pr-1699/assets/developers_arbitrum-deploy.md.26acb828.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const e="/docs-preview/pr-1699/arbitrum/choose_da.png",t="/docs-preview/pr-1699/arbitrum/configuration.png",l="/docs-preview/pr-1699/arbitrum/download-config.png",p="/docs-preview/pr-1699/arbitrum/blockscout.png",r="/docs-preview/pr-1699/arbitrum/explorer-view.png",B=JSON.parse('{"title":"Quickstart: Deploy an Arbitrum Orbit rollup","description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","frontmatter":{"description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","head":[["meta",{"name":"og:title","content":"Quickstart: Deploy an Arbitrum Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-deploy.md","filePath":"developers/arbitrum-deploy.md","lastUpdated":1725971357000}'),c={name:"developers/arbitrum-deploy.md"},i=n("",95),y=[i];function E(d,F,h,u,b,C){return a(),o("div",null,y)}const g=s(c,[["render",E]]);export{B as __pageData,g as default};
      +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const e="/docs-preview/pr-1699/arbitrum/choose_da.png",t="/docs-preview/pr-1699/arbitrum/configuration.png",l="/docs-preview/pr-1699/arbitrum/download-config.png",p="/docs-preview/pr-1699/arbitrum/blockscout.png",r="/docs-preview/pr-1699/arbitrum/explorer-view.png",B=JSON.parse('{"title":"Quickstart: Deploy an Arbitrum Orbit rollup","description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","frontmatter":{"description":"A guide on how to deploy an Arbitrum Orbit rollup using the Arbitrum Orbit deployment UI and deploying the rollup to Mocha testnet.","head":[["meta",{"name":"og:title","content":"Quickstart: Deploy an Arbitrum Orbit rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-deploy.md","filePath":"developers/arbitrum-deploy.md","lastUpdated":1725992025000}'),c={name:"developers/arbitrum-deploy.md"},i=n("",95),y=[i];function E(d,F,h,u,b,C){return a(),o("div",null,y)}const g=s(c,[["render",E]]);export{B as __pageData,g as default};
      diff --git a/pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.js b/pr-1699/assets/developers_arbitrum-full-node.md.319badbc.js
      similarity index 98%
      rename from pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.js
      rename to pr-1699/assets/developers_arbitrum-full-node.md.319badbc.js
      index d5ecd85972..e9ead3d65b 100644
      --- a/pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.js
      +++ b/pr-1699/assets/developers_arbitrum-full-node.md.319badbc.js
      @@ -1,3 +1,3 @@
      -import{_ as n,o as e,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Running a full node and/or validator","description":"A guide on how to run a full node or validating full node on your Orbit rollup.","frontmatter":{"description":"A guide on how to run a full node or validating full node on your Orbit rollup.","head":[["meta",{"name":"og:title","content":"Running a full node and/or validator | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-full-node.md","filePath":"developers/arbitrum-full-node.md","lastUpdated":1725971357000}'),t={name:"developers/arbitrum-full-node.md"},r=a(`

      Running a full node and/or validator

      Prerequisites

      Running a full node

      To run a full node, you can follow the steps outlined in the Arbitrum docs, with the difference being that you will use this image: dfcelestia/nitro-node-dev:latest instead of the one mentioned in the Arbitrum docs.

      Note that you can either use the flags in the nitro binary + the flags found in the celestia package, or you can just provide a node config.json file with the celestia-cfg for them to run it, which would look something like this:

      json
      docker run --rm -v "$HOME/Documents/configs/nodeConfig.json:/config.json:ro" \\
      +import{_ as n,o as e,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Running a full node and/or validator","description":"A guide on how to run a full node or validating full node on your Orbit rollup.","frontmatter":{"description":"A guide on how to run a full node or validating full node on your Orbit rollup.","head":[["meta",{"name":"og:title","content":"Running a full node and/or validator | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-full-node.md","filePath":"developers/arbitrum-full-node.md","lastUpdated":1725992025000}'),t={name:"developers/arbitrum-full-node.md"},r=a(`

      Running a full node and/or validator

      Prerequisites

      Running a full node

      To run a full node, you can follow the steps outlined in the Arbitrum docs, with the difference being that you will use this image: dfcelestia/nitro-node-dev:latest instead of the one mentioned in the Arbitrum docs.

      Note that you can either use the flags in the nitro binary + the flags found in the celestia package, or you can just provide a node config.json file with the celestia-cfg for them to run it, which would look something like this:

      json
      docker run --rm -v "$HOME/Documents/configs/nodeConfig.json:/config.json:ro" \\
         --network host celestia-nitro:v2.3.1-rc.1 --conf.file /config.json
      docker run --rm -v "$HOME/Documents/configs/nodeConfig.json:/config.json:ro" \\
         --network host celestia-nitro:v2.3.1-rc.1 --conf.file /config.json

      Running a full node with validation

      The information above applies to the steps outlined to run a validating full node (validator).

      Finally, note that this will require connection to a DA node, and we recommend running a Bridge node if you will be instantiating multiple rollups.

      `,10),i=[r];function l(s,d,u,c,p,h){return e(),o("div",null,i)}const m=n(t,[["render",l]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.lean.js b/pr-1699/assets/developers_arbitrum-full-node.md.319badbc.lean.js similarity index 92% rename from pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.lean.js rename to pr-1699/assets/developers_arbitrum-full-node.md.319badbc.lean.js index b0e772dd20..39ddbee454 100644 --- a/pr-1699/assets/developers_arbitrum-full-node.md.09e489d4.lean.js +++ b/pr-1699/assets/developers_arbitrum-full-node.md.319badbc.lean.js @@ -1 +1 @@ -import{_ as n,o as e,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Running a full node and/or validator","description":"A guide on how to run a full node or validating full node on your Orbit rollup.","frontmatter":{"description":"A guide on how to run a full node or validating full node on your Orbit rollup.","head":[["meta",{"name":"og:title","content":"Running a full node and/or validator | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-full-node.md","filePath":"developers/arbitrum-full-node.md","lastUpdated":1725971357000}'),t={name:"developers/arbitrum-full-node.md"},r=a("",10),i=[r];function l(s,d,u,c,p,h){return e(),o("div",null,i)}const m=n(t,[["render",l]]);export{g as __pageData,m as default}; +import{_ as n,o as e,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Running a full node and/or validator","description":"A guide on how to run a full node or validating full node on your Orbit rollup.","frontmatter":{"description":"A guide on how to run a full node or validating full node on your Orbit rollup.","head":[["meta",{"name":"og:title","content":"Running a full node and/or validator | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-full-node.md","filePath":"developers/arbitrum-full-node.md","lastUpdated":1725992025000}'),t={name:"developers/arbitrum-full-node.md"},r=a("",10),i=[r];function l(s,d,u,c,p,h){return e(),o("div",null,i)}const m=n(t,[["render",l]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.js b/pr-1699/assets/developers_arbitrum-integration.md.fd5df284.js similarity index 99% rename from pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.js rename to pr-1699/assets/developers_arbitrum-integration.md.fd5df284.js index d29c19ab35..96fd8db714 100644 --- a/pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.js +++ b/pr-1699/assets/developers_arbitrum-integration.md.fd5df284.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia-Arbitrum.png",f=JSON.parse('{"title":"Introduction to Arbitrum rollups with Celestia as DA","description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","frontmatter":{"description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","head":[["meta",{"name":"og:title","content":"Introduction to Arbitrum rollups with Celestia as DA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-integration.md","filePath":"developers/arbitrum-integration.md","lastUpdated":1725971357000}'),o={name:"developers/arbitrum-integration.md"},n=i('

      Introduction to Arbitrum rollups with Celestia as DA

      Celestia_Arbitrum

      Overview

      The integration of Celestia with Arbitrum Orbit and the Nitro tech stack marks the first external contribution to the Arbitrum Orbit protocol layer, offering developers an additional option for selecting a data availability layer alongside Arbitrum AnyTrust. The integration allows developers to deploy an Orbit Chain that uses Celestia for data availability and settles on Arbitrum One, Ethereum, or other EVM chains.

      Learn more about Orbit in Arbitrum's introduction.

      Key components

      The integration of Celestia with Arbitrum orbit is possible thanks to 3 key components:

      Additionally, the Ethereum fallback mechanism is a feature of the integration, which is native in Nitro.

      DA provider implementation

      The Arbitrum Nitro code has a DataAvailabilityProvider interface that is used across the codebase to store and retrieve data from a specific provider (eip4844 blobs, Anytrust, and now Celestia).

      This integration implements the DataAvailabilityProvider interface for Celestia DA

      Additionally, this integration comes with the necessary code for a Nitro chain node to post and retrieve data from Celestia.

      The core logic behind posting and retrieving data happens in celestia.go where data is stored on Celestia and serialized into a small batch of data that gets published once the necessary range of headers (data roots) has been relayed to the BlobstreamX contract. Then the Read logic takes care of taking the deserialized Blob Pointer struct and consuming it in order to fetch the data from Celestia and additionally inform the fetcher about the position of the data on Celestia (we'll get back to this in the next section).

      The following represents a non-exhaustive list of considerations when running a Batch Poster node for a chain with Celestia underneath:

      • You will need to use a consensus node RPC endpoint, you can find a list of them for Mocha
      • The Batch Poster will only post a Celestia batch to the underlying chain if the height for which it posted is in a recent range in BlobstreamX and if the verification succeeds, otherwise it will discard the batch. Since it will wait until a range is relayed, it can take several minutes for a batch to be posted, but one can always make an on-chain request for the BlobstreamX contract to relay a header promptly.

      The following represents a non-exhaustive list of considerations when running a Nitro node for a chain with Celestia underneath:

      • The TendermintRpc endpoint is only needed by the batch poster, every other node can operate without a connection to a full node.
      • The message header flag for Celestia batches is 0x0c.
      • You will need to know the namespace for the chain that you are trying to connect to, but don't worry if you don't find it, as the information in the BlobPointer can be used to identify where a batch of data is in the Celestia Data Square for a given height, and thus can be used to find out the namespace as well!

      Preimage Oracle Implementation

      In order to support fraud proofs, this integration has the necessary code for a Nitro validator to populate its preimage mapping with Celestia hashes that then get "unpealed" in order to reveal the full data for a Blob. You can read more about the "Hash Oracle Trick".

      The data structures and hashing functions for this can be found in the nitro/das/celestia/tree folder

      You can see where the preimage oracle gets used in the fraud proof replay binary here

      Something important to note is that the preimage oracle only keeps track of hashes for the rows in the Celestia data square in which a blob resides in, this way each Orbit chain with Celestia underneath does not need validators to recompute an entire Celestia Data Square, but instead, only have to compute the row roots for the rows in which it's data lives in, and the header data root, which is the binary merkle tree hash built using the row roots and column roots fetched from a Celestia node. Because only data roots that can be confirmed on Blobstream get accepted into the sequencer inbox, one can have a high degree of certainty that the canonical data root being unpealed as well as the row roots are in fact correct.

      Blobstream X implementation

      Finally, the integration only accepts batches with information that can be confirmed on BlobstreamX, which gives us a high certainty that data was made available on Celestia.

      You can see how BlobstreamX is integrated into the SequencerInbox.sol contract here, which allows us to discard batches with otherwise faulty data roots, thus giving us a high degree of confidence that the data root can be safely unpacked in case of a challenge.

      The Celestia and Arbitrum integration also includes Blobstream, which relays commitments to Celestia’s data root to an onchain light client on Ethereum. This allows L2 solutions that settle on Ethereum to benefit from the scalability Celestia’s data availability layer can provide.

      Ethereum fallback mechanism in Nitro

      By default in Arbitrum Nitro, the Ethereum fallback mechanism in the BatchPoster function is handling the process of storing data, with a fallback mechanism to store data onchain if the primary data availability storage fails.

      The @celestiaorg/nitro integration uses the same fallback mechanism.

      More information can be found on the Ethereum fallback mechanisms for Celestia, which enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta.

      The fallback logic for Celestia DA is configurable, providing an alternative to the previous default fallback mechanism. Additionally, an ability has been added to the Arbitrum node software which allows the sequencer to call VerifyAttestation to check if a data root has been posted on Blobstream or not, before it sends the sequencer message (data pointer) to the underlying chain.

      Next steps

      In the next page, learn how to deploy an Arbitrum rollup devnet using Celestia as DA.

      ',34),s=[n];function l(h,c,d,m,b,u){return t(),a("div",null,s)}const g=e(o,[["render",l]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia-Arbitrum.png",f=JSON.parse('{"title":"Introduction to Arbitrum rollups with Celestia as DA","description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","frontmatter":{"description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","head":[["meta",{"name":"og:title","content":"Introduction to Arbitrum rollups with Celestia as DA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-integration.md","filePath":"developers/arbitrum-integration.md","lastUpdated":1725992025000}'),o={name:"developers/arbitrum-integration.md"},n=i('

      Introduction to Arbitrum rollups with Celestia as DA

      Celestia_Arbitrum

      Overview

      The integration of Celestia with Arbitrum Orbit and the Nitro tech stack marks the first external contribution to the Arbitrum Orbit protocol layer, offering developers an additional option for selecting a data availability layer alongside Arbitrum AnyTrust. The integration allows developers to deploy an Orbit Chain that uses Celestia for data availability and settles on Arbitrum One, Ethereum, or other EVM chains.

      Learn more about Orbit in Arbitrum's introduction.

      Key components

      The integration of Celestia with Arbitrum orbit is possible thanks to 3 key components:

      Additionally, the Ethereum fallback mechanism is a feature of the integration, which is native in Nitro.

      DA provider implementation

      The Arbitrum Nitro code has a DataAvailabilityProvider interface that is used across the codebase to store and retrieve data from a specific provider (eip4844 blobs, Anytrust, and now Celestia).

      This integration implements the DataAvailabilityProvider interface for Celestia DA

      Additionally, this integration comes with the necessary code for a Nitro chain node to post and retrieve data from Celestia.

      The core logic behind posting and retrieving data happens in celestia.go where data is stored on Celestia and serialized into a small batch of data that gets published once the necessary range of headers (data roots) has been relayed to the BlobstreamX contract. Then the Read logic takes care of taking the deserialized Blob Pointer struct and consuming it in order to fetch the data from Celestia and additionally inform the fetcher about the position of the data on Celestia (we'll get back to this in the next section).

      The following represents a non-exhaustive list of considerations when running a Batch Poster node for a chain with Celestia underneath:

      • You will need to use a consensus node RPC endpoint, you can find a list of them for Mocha
      • The Batch Poster will only post a Celestia batch to the underlying chain if the height for which it posted is in a recent range in BlobstreamX and if the verification succeeds, otherwise it will discard the batch. Since it will wait until a range is relayed, it can take several minutes for a batch to be posted, but one can always make an on-chain request for the BlobstreamX contract to relay a header promptly.

      The following represents a non-exhaustive list of considerations when running a Nitro node for a chain with Celestia underneath:

      • The TendermintRpc endpoint is only needed by the batch poster, every other node can operate without a connection to a full node.
      • The message header flag for Celestia batches is 0x0c.
      • You will need to know the namespace for the chain that you are trying to connect to, but don't worry if you don't find it, as the information in the BlobPointer can be used to identify where a batch of data is in the Celestia Data Square for a given height, and thus can be used to find out the namespace as well!

      Preimage Oracle Implementation

      In order to support fraud proofs, this integration has the necessary code for a Nitro validator to populate its preimage mapping with Celestia hashes that then get "unpealed" in order to reveal the full data for a Blob. You can read more about the "Hash Oracle Trick".

      The data structures and hashing functions for this can be found in the nitro/das/celestia/tree folder

      You can see where the preimage oracle gets used in the fraud proof replay binary here

      Something important to note is that the preimage oracle only keeps track of hashes for the rows in the Celestia data square in which a blob resides in, this way each Orbit chain with Celestia underneath does not need validators to recompute an entire Celestia Data Square, but instead, only have to compute the row roots for the rows in which it's data lives in, and the header data root, which is the binary merkle tree hash built using the row roots and column roots fetched from a Celestia node. Because only data roots that can be confirmed on Blobstream get accepted into the sequencer inbox, one can have a high degree of certainty that the canonical data root being unpealed as well as the row roots are in fact correct.

      Blobstream X implementation

      Finally, the integration only accepts batches with information that can be confirmed on BlobstreamX, which gives us a high certainty that data was made available on Celestia.

      You can see how BlobstreamX is integrated into the SequencerInbox.sol contract here, which allows us to discard batches with otherwise faulty data roots, thus giving us a high degree of confidence that the data root can be safely unpacked in case of a challenge.

      The Celestia and Arbitrum integration also includes Blobstream, which relays commitments to Celestia’s data root to an onchain light client on Ethereum. This allows L2 solutions that settle on Ethereum to benefit from the scalability Celestia’s data availability layer can provide.

      Ethereum fallback mechanism in Nitro

      By default in Arbitrum Nitro, the Ethereum fallback mechanism in the BatchPoster function is handling the process of storing data, with a fallback mechanism to store data onchain if the primary data availability storage fails.

      The @celestiaorg/nitro integration uses the same fallback mechanism.

      More information can be found on the Ethereum fallback mechanisms for Celestia, which enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta.

      The fallback logic for Celestia DA is configurable, providing an alternative to the previous default fallback mechanism. Additionally, an ability has been added to the Arbitrum node software which allows the sequencer to call VerifyAttestation to check if a data root has been posted on Blobstream or not, before it sends the sequencer message (data pointer) to the underlying chain.

      Next steps

      In the next page, learn how to deploy an Arbitrum rollup devnet using Celestia as DA.

      ',34),s=[n];function l(h,c,d,m,b,u){return t(),a("div",null,s)}const g=e(o,[["render",l]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.lean.js b/pr-1699/assets/developers_arbitrum-integration.md.fd5df284.lean.js similarity index 93% rename from pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.lean.js rename to pr-1699/assets/developers_arbitrum-integration.md.fd5df284.lean.js index a64f5642d9..e28e178656 100644 --- a/pr-1699/assets/developers_arbitrum-integration.md.2b72ec21.lean.js +++ b/pr-1699/assets/developers_arbitrum-integration.md.fd5df284.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia-Arbitrum.png",f=JSON.parse('{"title":"Introduction to Arbitrum rollups with Celestia as DA","description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","frontmatter":{"description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","head":[["meta",{"name":"og:title","content":"Introduction to Arbitrum rollups with Celestia as DA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-integration.md","filePath":"developers/arbitrum-integration.md","lastUpdated":1725971357000}'),o={name:"developers/arbitrum-integration.md"},n=i("",34),s=[n];function l(h,c,d,m,b,u){return t(),a("div",null,s)}const g=e(o,[["render",l]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia-Arbitrum.png",f=JSON.parse('{"title":"Introduction to Arbitrum rollups with Celestia as DA","description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","frontmatter":{"description":"An overview of the integration of Arbitrum Nitro with Celestia, detailing the key features and benefits, including the Ethereum fallback mechanism.","head":[["meta",{"name":"og:title","content":"Introduction to Arbitrum rollups with Celestia as DA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-integration.md","filePath":"developers/arbitrum-integration.md","lastUpdated":1725992025000}'),o={name:"developers/arbitrum-integration.md"},n=i("",34),s=[n];function l(h,c,d,m,b,u){return t(),a("div",null,s)}const g=e(o,[["render",l]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.js b/pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.js similarity index 99% rename from pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.js rename to pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.js index 62951e2472..4f662138a9 100644 --- a/pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.js +++ b/pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract to your Arbitrum rollup","description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","frontmatter":{"description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","head":[["meta",{"name":"og:title","content":"Deploy a smart contract to your Arbitrum rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-smart-contract.md","filePath":"developers/arbitrum-smart-contract.md","lastUpdated":1725971357000}'),l={name:"developers/arbitrum-smart-contract.md"},p=o(`

      Deploy a smart contract to your Arbitrum rollup

      Overview

      Welcome to the guide on deploying a smart contract to your Arbitrum rollup. In this tutorial, you will learn how to deploy a smart contract using the L2 Nitro devnet and the provided public and private keys for testing purposes.

      Prerequisites

      Setup

      First, in your $HOME directory, set up a new project folder for this tutorial and init the project with npm:

      bash
      cd $HOME
      +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract to your Arbitrum rollup","description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","frontmatter":{"description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","head":[["meta",{"name":"og:title","content":"Deploy a smart contract to your Arbitrum rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-smart-contract.md","filePath":"developers/arbitrum-smart-contract.md","lastUpdated":1725992025000}'),l={name:"developers/arbitrum-smart-contract.md"},p=o(`

      Deploy a smart contract to your Arbitrum rollup

      Overview

      Welcome to the guide on deploying a smart contract to your Arbitrum rollup. In this tutorial, you will learn how to deploy a smart contract using the L2 Nitro devnet and the provided public and private keys for testing purposes.

      Prerequisites

      Setup

      First, in your $HOME directory, set up a new project folder for this tutorial and init the project with npm:

      bash
      cd $HOME
       mkdir counter-project && cd counter-project && npm init -y
      cd $HOME
       mkdir counter-project && cd counter-project && npm init -y

      Next, initialize a Foundry project with the following command:

      bash
      forge init counter_contract
      forge init counter_contract

      Create your smart contract

      Take a look at the Counter.sol file in your counter-project/counter_contract/src directory:

      solidity
      // SPDX-License-Identifier: UNLICENSED
       pragma solidity ^0.8.13;
      diff --git a/pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.lean.js b/pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.lean.js
      similarity index 94%
      rename from pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.lean.js
      rename to pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.lean.js
      index c1a7dffad6..a30757b580 100644
      --- a/pr-1699/assets/developers_arbitrum-smart-contract.md.5de83013.lean.js
      +++ b/pr-1699/assets/developers_arbitrum-smart-contract.md.8b7aa3c4.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract to your Arbitrum rollup","description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","frontmatter":{"description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","head":[["meta",{"name":"og:title","content":"Deploy a smart contract to your Arbitrum rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-smart-contract.md","filePath":"developers/arbitrum-smart-contract.md","lastUpdated":1725971357000}'),l={name:"developers/arbitrum-smart-contract.md"},p=o("",60),e=[p];function t(c,r,i,y,E,u){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{F as __pageData,h as default};
      +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract to your Arbitrum rollup","description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","frontmatter":{"description":"A tutorial that guides you through the process of deploying a smart contract to your Arbitrum rollup using a L2 Nitro devnet, including setting up the environment, creating and testing the smart contract, and interacting with the deployed contract.","head":[["meta",{"name":"og:title","content":"Deploy a smart contract to your Arbitrum rollup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/arbitrum-smart-contract.md","filePath":"developers/arbitrum-smart-contract.md","lastUpdated":1725992025000}'),l={name:"developers/arbitrum-smart-contract.md"},p=o("",60),e=[p];function t(c,r,i,y,E,u){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{F as __pageData,h as default};
      diff --git a/pr-1699/assets/developers_blobstream-contracts.md.25c4c416.js b/pr-1699/assets/developers_blobstream-contracts.md.06e023da.js
      similarity index 99%
      rename from pr-1699/assets/developers_blobstream-contracts.md.25c4c416.js
      rename to pr-1699/assets/developers_blobstream-contracts.md.06e023da.js
      index c15be70f04..8d7abc4808 100644
      --- a/pr-1699/assets/developers_blobstream-contracts.md.25c4c416.js
      +++ b/pr-1699/assets/developers_blobstream-contracts.md.06e023da.js
      @@ -1,4 +1,4 @@
      -import{_ as s,o as a,c as o,Q as e}from"./chunks/framework.b47e54aa.js";const d=JSON.parse(`{"title":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","frontmatter":{"sidebar_label":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","prev":{"text":"New SP1 Blobstream deployments","link":"/developers/sp1-blobstream-deploy"},"head":[["meta",{"name":"og:title","content":"Integrate with Blobstream contracts | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-contracts.md","filePath":"developers/blobstream-contracts.md","lastUpdated":1725971357000}`),n={name:"developers/blobstream-contracts.md"},l=e(`

      Integrate with Blobstream contracts

      Getting started

      Prerequisites

      Make sure to have the following installed:

      Installing Blobstream contracts

      We will be using the IDAOracle interface to verify inclusion. So, we will install the Blobstream contracts repo as a dependency:

      sh
      forge install celestiaorg/blobstream-contracts --no-commit
      forge install celestiaorg/blobstream-contracts --no-commit

      Make sure that the directory you're running this command from is an initialized git repository. If not, just initialize the repo using:

      sh
      git init
      git init

      Note that the minimum Solidity compiler version for using the Blobstream contracts is 0.8.19.

      Example usage

      Example minimal Solidity contract for a stub ZK rollup that leverages the BlobstreamX.sol contract to check that data has been posted to Celestia:

      solidity
      // SPDX-License-Identifier: Apache-2.0
      +import{_ as s,o as a,c as o,Q as e}from"./chunks/framework.b47e54aa.js";const d=JSON.parse(`{"title":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","frontmatter":{"sidebar_label":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","prev":{"text":"New SP1 Blobstream deployments","link":"/developers/sp1-blobstream-deploy"},"head":[["meta",{"name":"og:title","content":"Integrate with Blobstream contracts | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-contracts.md","filePath":"developers/blobstream-contracts.md","lastUpdated":1725992025000}`),n={name:"developers/blobstream-contracts.md"},l=e(`

      Integrate with Blobstream contracts

      Getting started

      Prerequisites

      Make sure to have the following installed:

      Installing Blobstream contracts

      We will be using the IDAOracle interface to verify inclusion. So, we will install the Blobstream contracts repo as a dependency:

      sh
      forge install celestiaorg/blobstream-contracts --no-commit
      forge install celestiaorg/blobstream-contracts --no-commit

      Make sure that the directory you're running this command from is an initialized git repository. If not, just initialize the repo using:

      sh
      git init
      git init

      Note that the minimum Solidity compiler version for using the Blobstream contracts is 0.8.19.

      Example usage

      Example minimal Solidity contract for a stub ZK rollup that leverages the BlobstreamX.sol contract to check that data has been posted to Celestia:

      solidity
      // SPDX-License-Identifier: Apache-2.0
       pragma solidity ^0.8.19;
       
       import "blobstream-contracts/IDAOracle.sol";
      diff --git a/pr-1699/assets/developers_blobstream-contracts.md.25c4c416.lean.js b/pr-1699/assets/developers_blobstream-contracts.md.06e023da.lean.js
      similarity index 93%
      rename from pr-1699/assets/developers_blobstream-contracts.md.25c4c416.lean.js
      rename to pr-1699/assets/developers_blobstream-contracts.md.06e023da.lean.js
      index 52b246dd5a..9b62309a06 100644
      --- a/pr-1699/assets/developers_blobstream-contracts.md.25c4c416.lean.js
      +++ b/pr-1699/assets/developers_blobstream-contracts.md.06e023da.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as a,c as o,Q as e}from"./chunks/framework.b47e54aa.js";const d=JSON.parse(`{"title":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","frontmatter":{"sidebar_label":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","prev":{"text":"New SP1 Blobstream deployments","link":"/developers/sp1-blobstream-deploy"},"head":[["meta",{"name":"og:title","content":"Integrate with Blobstream contracts | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-contracts.md","filePath":"developers/blobstream-contracts.md","lastUpdated":1725971357000}`),n={name:"developers/blobstream-contracts.md"},l=e("",27),t=[l];function r(p,c,i,y,E,h){return a(),o("div",null,t)}const u=s(n,[["render",r]]);export{d as __pageData,u as default};
      +import{_ as s,o as a,c as o,Q as e}from"./chunks/framework.b47e54aa.js";const d=JSON.parse(`{"title":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","frontmatter":{"sidebar_label":"Integrate with Blobstream contracts","description":"Learn how to integrate your L2's onchain logic with Blobstream","prev":{"text":"New SP1 Blobstream deployments","link":"/developers/sp1-blobstream-deploy"},"head":[["meta",{"name":"og:title","content":"Integrate with Blobstream contracts | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-contracts.md","filePath":"developers/blobstream-contracts.md","lastUpdated":1725992025000}`),n={name:"developers/blobstream-contracts.md"},l=e("",27),t=[l];function r(p,c,i,y,E,h){return a(),o("div",null,t)}const u=s(n,[["render",r]]);export{d as __pageData,u as default};
      diff --git a/pr-1699/assets/developers_blobstream-offchain.md.3b490822.js b/pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.js
      similarity index 99%
      rename from pr-1699/assets/developers_blobstream-offchain.md.3b490822.js
      rename to pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.js
      index be63273ceb..692ce497b2 100644
      --- a/pr-1699/assets/developers_blobstream-offchain.md.3b490822.js
      +++ b/pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.js
      @@ -1,4 +1,4 @@
      -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse(`{"title":"Integrate with Blobstream client","description":"Learn how to integrate your L2's offchain logic with Blobstream","frontmatter":{"description":"Learn how to integrate your L2's offchain logic with Blobstream","head":[["meta",{"name":"og:title","content":"Integrate with Blobstream client | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-offchain.md","filePath":"developers/blobstream-offchain.md","lastUpdated":1725971357000}`),e={name:"developers/blobstream-offchain.md"},o=l(`

      Integrate with Blobstream client

      Blobstream demo rollup

      Rollups can use Blobstream for DA by posting their data to Celestia and then proving that it was posted on Ethereum. This is done identically to how any rollup or user would post data to Celestia. Then, a zero-knowledge proof that Celestia validators have come to consensus on Celestia block headers is generated, and subsequently relayed to Ethereum to the Blobstream smart contract.

      This demo rollup will outline (the outline is not an implementation! Please do not expect to copy and paste this code 🙂) a very simple Blobstream rollup to illustrate at a high level what this could look like.

      Defining a chain

      The first step to starting a new chain is to define the structure of the commitments that each block consists of.

      go
      type Block struct {
      +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse(`{"title":"Integrate with Blobstream client","description":"Learn how to integrate your L2's offchain logic with Blobstream","frontmatter":{"description":"Learn how to integrate your L2's offchain logic with Blobstream","head":[["meta",{"name":"og:title","content":"Integrate with Blobstream client | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-offchain.md","filePath":"developers/blobstream-offchain.md","lastUpdated":1725992025000}`),e={name:"developers/blobstream-offchain.md"},o=l(`

      Integrate with Blobstream client

      Blobstream demo rollup

      Rollups can use Blobstream for DA by posting their data to Celestia and then proving that it was posted on Ethereum. This is done identically to how any rollup or user would post data to Celestia. Then, a zero-knowledge proof that Celestia validators have come to consensus on Celestia block headers is generated, and subsequently relayed to Ethereum to the Blobstream smart contract.

      This demo rollup will outline (the outline is not an implementation! Please do not expect to copy and paste this code 🙂) a very simple Blobstream rollup to illustrate at a high level what this could look like.

      Defining a chain

      The first step to starting a new chain is to define the structure of the commitments that each block consists of.

      go
      type Block struct {
           // Data is the data of a block that is submitted to Celestia.
           Data \`json:"Data"\`
           // Header is the set of commitments over a block that is submitted to
      diff --git a/pr-1699/assets/developers_blobstream-offchain.md.3b490822.lean.js b/pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.lean.js
      similarity index 91%
      rename from pr-1699/assets/developers_blobstream-offchain.md.3b490822.lean.js
      rename to pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.lean.js
      index 77cad7d9e2..60a399a397 100644
      --- a/pr-1699/assets/developers_blobstream-offchain.md.3b490822.lean.js
      +++ b/pr-1699/assets/developers_blobstream-offchain.md.fbd363f2.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse(`{"title":"Integrate with Blobstream client","description":"Learn how to integrate your L2's offchain logic with Blobstream","frontmatter":{"description":"Learn how to integrate your L2's offchain logic with Blobstream","head":[["meta",{"name":"og:title","content":"Integrate with Blobstream client | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-offchain.md","filePath":"developers/blobstream-offchain.md","lastUpdated":1725971357000}`),e={name:"developers/blobstream-offchain.md"},o=l("",42),p=[o];function t(r,c,i,E,y,h){return a(),n("div",null,p)}const b=s(e,[["render",t]]);export{u as __pageData,b as default};
      +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse(`{"title":"Integrate with Blobstream client","description":"Learn how to integrate your L2's offchain logic with Blobstream","frontmatter":{"description":"Learn how to integrate your L2's offchain logic with Blobstream","head":[["meta",{"name":"og:title","content":"Integrate with Blobstream client | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-offchain.md","filePath":"developers/blobstream-offchain.md","lastUpdated":1725992025000}`),e={name:"developers/blobstream-offchain.md"},o=l("",42),p=[o];function t(r,c,i,E,y,h){return a(),n("div",null,p)}const b=s(e,[["render",t]]);export{u as __pageData,b as default};
      diff --git a/pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.js b/pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.js
      similarity index 99%
      rename from pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.js
      rename to pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.js
      index d6021f6e67..50113a9ae3 100644
      --- a/pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.js
      +++ b/pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.js
      @@ -1,4 +1,4 @@
      -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream-square.png",p="/docs-preview/pr-1699/img/blobstream/blobstream-commitment-diagram.png",h=JSON.parse('{"title":"Blobstream proofs queries","description":"Learn how to query the inclusion proofs used in Blobstream","frontmatter":{"description":"Learn how to query the inclusion proofs used in Blobstream","next":{"text":"Requesting data commitment ranges","link":"/developers/blobstream-x-requesting-data-commitment-ranges"},"head":[["meta",{"name":"og:title","content":"Blobstream proofs queries | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-proof-queries.md","filePath":"developers/blobstream-proof-queries.md","lastUpdated":1725971357000}'),e={name:"developers/blobstream-proof-queries.md"},t=l(`

      Blobstream proofs queries

      Prerequisites

      • Access to a Celestia consensus node RPC endpoint (or full node). The node doesn't need to be a validating node in order for the proofs to be queried. A full node is enough.

      For golang snippets, the tendermint RPC client, referred to as trpc, will be used for the queries. It can be initialized using:

      go
          trpc, err := http.New("<rpc_endpoint>", "/websocket")
      +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream-square.png",p="/docs-preview/pr-1699/img/blobstream/blobstream-commitment-diagram.png",h=JSON.parse('{"title":"Blobstream proofs queries","description":"Learn how to query the inclusion proofs used in Blobstream","frontmatter":{"description":"Learn how to query the inclusion proofs used in Blobstream","next":{"text":"Requesting data commitment ranges","link":"/developers/blobstream-x-requesting-data-commitment-ranges"},"head":[["meta",{"name":"og:title","content":"Blobstream proofs queries | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-proof-queries.md","filePath":"developers/blobstream-proof-queries.md","lastUpdated":1725992025000}'),e={name:"developers/blobstream-proof-queries.md"},t=l(`

      Blobstream proofs queries

      Prerequisites

      • Access to a Celestia consensus node RPC endpoint (or full node). The node doesn't need to be a validating node in order for the proofs to be queried. A full node is enough.

      For golang snippets, the tendermint RPC client, referred to as trpc, will be used for the queries. It can be initialized using:

      go
          trpc, err := http.New("<rpc_endpoint>", "/websocket")
       	if err != nil {
       		...
       	}
      @@ -24,7 +24,7 @@ import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o=
       		if err != nil {
       			...
       		}
      -	}(trpc)

      The <rpc_endpoint> can be retrieved from mainnet for Celestia mainnet beta, and mocha for the Mocha testnet.

      In case the reader wants to interact with an on-chain contract that can be used to verify that data was posted to Celestia, the bindings of that contract are needed.

      For Blobstream, the golang bindings can be found in the following links:

      text
      https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
      https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
      text
      https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go
      https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go

      For other languages, the corresponding smart contract bindings should be generated. Refer to abigen for more information.

      Overview of the proof queries

      To prove the inclusion of PayForBlobs (PFB) transactions, blobs or shares, committed to in a Celestia block, we use the Celestia consensus node's RPC to query for proofs that can be verified in a rollup settlement contract via Blobstream. In fact, when a PFB transaction is included in a block, it gets separated into a PFB transaction (without the blob), and the actual data blob that it carries. These two are split into shares, which are the low level constructs of a Celestia block, and saved to the corresponding Celestia block. Learn more about shares in the shares specs.

      The two diagrams below summarize how a single share, which can contain a PFB transaction, or a part of the rollup data that was posted using a PFB, is committed to in Blobstream.

      The share is highlighted in green. R0, R1 etc, represent the respective row and column roots, the blue and pink gradients are erasure encoded data. More details on the square layout can be found in the data square layout and data structures portion of the specs.

      The Celestia square

      Square

      The commitment scheme

      Blobstream Commitment Diagram

      So to prove inclusion of a share to a Celestia block, we use Blobstream as a source of truth. In a nutshell, Blobstream attests to the data posted to Celestia in the zk-Blobstream contract via verifying a zk-proof of the headers of a batch of Celestia blocks. Then, it keeps reference of that batch of blocks using the merkleized commitment of their (dataRoot, height) resulting in a data root tuple root. Check the above diagram which shows:

      • 0: those are the shares, that when unified, contain the PFB or the rollup data blob.
      • 1: the row and column roots are the namespace merkle tree roots over the shares. More information on the NMT in the NMT specs. These commit to the rows and columns containing the above shares.
      • 2: the data roots: which are the binary merkle tree commitment over the row and column roots. This means that if you can prove that a share is part of a row, using a namespace merkle proof. Then prove that this row is committed to by the data root. Then you can be sure that that share was published to the corresponding block.
      • 3: in order to batch multiple blocks into the same commitment, we create a commitment over the (dataRoot, height) tuple for a batch of blocks, which results in a data root tuple root. It's this commitment that gets stored in the Blobstream smart contract.

      So, if we're able to prove:

      • That a share is part of a row, then that row is committed to by a data root.
      • Then, prove that that data root along with its height is committed to by the data root tuple root, which gets saved to the Blobstream contract.

      We can be sure that that share was committed to in the corresponding Celestia block.

      In this document, we will provide details on how to query the above proofs, and how to adapt them to be sent to a rollup contract for verification.

      Hands-on demonstration

      This part will provide the details of proof generation, and the way to make the results of the proofs queries ready to be consumed by the target rollup contract.

      NOTE

      For the go client snippets, make sure to have the following replaces in your go.mod:

      go
      // go.mod
      +	}(trpc)

      The <rpc_endpoint> can be retrieved from mainnet for Celestia mainnet beta, and mocha for the Mocha testnet.

      In case the reader wants to interact with an on-chain contract that can be used to verify that data was posted to Celestia, the bindings of that contract are needed.

      For Blobstream, the golang bindings can be found in the following links:

      text
      https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
      https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
      text
      https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go
      https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go

      For other languages, the corresponding smart contract bindings should be generated. Refer to abigen for more information.

      Overview of the proof queries

      To prove the inclusion of PayForBlobs (PFB) transactions, blobs or shares, committed to in a Celestia block, we use the Celestia consensus node's RPC to query for proofs that can be verified in a rollup settlement contract via Blobstream. In fact, when a PFB transaction is included in a block, it gets separated into a PFB transaction (without the blob), and the actual data blob that it carries. These two are split into shares, which are the low level constructs of a Celestia block, and saved to the corresponding Celestia block. Learn more about shares in the shares specs.

      The two diagrams below summarize how a single share, which can contain a PFB transaction, or a part of the rollup data that was posted using a PFB, is committed to in Blobstream.

      The share is highlighted in green. R0, R1 etc, represent the respective row and column roots, the blue and pink gradients are erasure encoded data. More details on the square layout can be found in the data square layout and data structures portion of the specs.

      The Celestia square

      Square

      The commitment scheme

      Blobstream Commitment Diagram

      So to prove inclusion of a share to a Celestia block, we use Blobstream as a source of truth. In a nutshell, Blobstream attests to the data posted to Celestia in the zk-Blobstream contract via verifying a zk-proof of the headers of a batch of Celestia blocks. Then, it keeps reference of that batch of blocks using the merkleized commitment of their (dataRoot, height) resulting in a data root tuple root. Check the above diagram which shows:

      • 0: those are the shares, that when unified, contain the PFB or the rollup data blob.
      • 1: the row and column roots are the namespace merkle tree roots over the shares. More information on the NMT in the NMT specs. These commit to the rows and columns containing the above shares.
      • 2: the data roots: which are the binary merkle tree commitment over the row and column roots. This means that if you can prove that a share is part of a row, using a namespace merkle proof. Then prove that this row is committed to by the data root. Then you can be sure that that share was published to the corresponding block.
      • 3: in order to batch multiple blocks into the same commitment, we create a commitment over the (dataRoot, height) tuple for a batch of blocks, which results in a data root tuple root. It's this commitment that gets stored in the Blobstream smart contract.

      So, if we're able to prove:

      • That a share is part of a row, then that row is committed to by a data root.
      • Then, prove that that data root along with its height is committed to by the data root tuple root, which gets saved to the Blobstream contract.

      We can be sure that that share was committed to in the corresponding Celestia block.

      In this document, we will provide details on how to query the above proofs, and how to adapt them to be sent to a rollup contract for verification.

      Hands-on demonstration

      This part will provide the details of proof generation, and the way to make the results of the proofs queries ready to be consumed by the target rollup contract.

      NOTE

      For the go client snippets, make sure to have the following replaces in your go.mod:

      go
      // go.mod
           github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.18.3-sdk-v0.46.14
           github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
           github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
      @@ -122,7 +122,7 @@ import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o=
       		os.Exit(1)
       	}
       	fmt.Println(dcProof.Proof.String())
      -}

      Full example of proving that a Celestia block was committed to by Blobstream contract

      go
      package main
      +}

      Full example of proving that a Celestia block was committed to by Blobstream contract

      go
      package main
       
       import (
       	"context"
      @@ -1122,7 +1122,7 @@ import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o=
       			NumLeaves: big.NewInt(dataRootInclusionProof.Total),
       		},
       	}
      -}

      With the nonce being the attestation nonce, which can be retrieved using Blobstream contract events. Check below for an example. And height being the Celestia Block height that contains the rollup data, along with the blockDataRoot being the data root of the block height. Finally, dataRootInclusionProof is the Celestia block data root inclusion proof to the data root tuple root that was queried at the beginning of this page.

      If the dataRoot or the tupleRootNonce is unknown during the verification:

      • dataRoot: can be queried using the /block?height=15 query (15 in this example endpoint), and taking the data_hash field from the response.
      • tupleRootNonce: can be retried via querying the data commitment stored events from the Blobstream contract and looking for the nonce attesting to the corresponding data.

      Querying the proof's tupleRootNonce

      go
      	// get the nonce corresponding to the block height that contains the PayForBlob transaction
      +}

      With the nonce being the attestation nonce, which can be retrieved using Blobstream contract events. Check below for an example. And height being the Celestia Block height that contains the rollup data, along with the blockDataRoot being the data root of the block height. Finally, dataRootInclusionProof is the Celestia block data root inclusion proof to the data root tuple root that was queried at the beginning of this page.

      If the dataRoot or the tupleRootNonce is unknown during the verification:

      • dataRoot: can be queried using the /block?height=15 query (15 in this example endpoint), and taking the data_hash field from the response.
      • tupleRootNonce: can be retried via querying the data commitment stored events from the Blobstream contract and looking for the nonce attesting to the corresponding data.

      Querying the proof's tupleRootNonce

      go
      	// get the nonce corresponding to the block height that contains the PayForBlob transaction
       	// since BlobstreamX emits events when new batches are submitted, we will query the events
       	// and look for the range committing to the blob
       	// first, connect to an EVM RPC endpoint
      @@ -1246,7 +1246,7 @@ import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o=
       import {
           sp1blobstreamwrapper "github.com/succinctlabs/sp1-blobstream/bindings"
       } 
      -// and use the \`BlobstreamDataCommitmentStored\` event instead.

      Listening for new data commitments

      For listening for new data commitment stored events, sequencers can use the WatchDataCommitmentStored as follows:

      go
          ethClient, err := ethclient.Dial("evm_rpc")
      +// and use the \`BlobstreamDataCommitmentStored\` event instead.

      Listening for new data commitments

      For listening for new data commitment stored events, sequencers can use the WatchDataCommitmentStored as follows:

      go
          ethClient, err := ethclient.Dial("evm_rpc")
           if err != nil {
       	    return err
           }
      @@ -1364,7 +1364,7 @@ import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o=
               // (4) verify invalid state transition
               // (5) effects
           }
      -}

      Then, you can submit the fraud proof using golang as follows:

      go
      package main
      +}

      Then, you can submit the fraud proof using golang as follows:

      go
      package main
       
       import (
       	"context"
      diff --git a/pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.lean.js b/pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.lean.js
      similarity index 93%
      rename from pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.lean.js
      rename to pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.lean.js
      index d1b644c78b..6906f60b0e 100644
      --- a/pr-1699/assets/developers_blobstream-proof-queries.md.21c99b59.lean.js
      +++ b/pr-1699/assets/developers_blobstream-proof-queries.md.19225b90.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream-square.png",p="/docs-preview/pr-1699/img/blobstream/blobstream-commitment-diagram.png",h=JSON.parse('{"title":"Blobstream proofs queries","description":"Learn how to query the inclusion proofs used in Blobstream","frontmatter":{"description":"Learn how to query the inclusion proofs used in Blobstream","next":{"text":"Requesting data commitment ranges","link":"/developers/blobstream-x-requesting-data-commitment-ranges"},"head":[["meta",{"name":"og:title","content":"Blobstream proofs queries | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-proof-queries.md","filePath":"developers/blobstream-proof-queries.md","lastUpdated":1725971357000}'),e={name:"developers/blobstream-proof-queries.md"},t=l("",158),c=[t];function r(E,y,i,A,F,d){return n(),a("div",null,c)}const m=s(e,[["render",r]]);export{h as __pageData,m as default};
      +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream-square.png",p="/docs-preview/pr-1699/img/blobstream/blobstream-commitment-diagram.png",h=JSON.parse('{"title":"Blobstream proofs queries","description":"Learn how to query the inclusion proofs used in Blobstream","frontmatter":{"description":"Learn how to query the inclusion proofs used in Blobstream","next":{"text":"Requesting data commitment ranges","link":"/developers/blobstream-x-requesting-data-commitment-ranges"},"head":[["meta",{"name":"og:title","content":"Blobstream proofs queries | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-proof-queries.md","filePath":"developers/blobstream-proof-queries.md","lastUpdated":1725992025000}'),e={name:"developers/blobstream-proof-queries.md"},t=l("",158),c=[t];function r(E,y,i,A,F,d){return n(),a("div",null,c)}const m=s(e,[["render",r]]);export{h as __pageData,m as default};
      diff --git a/pr-1699/assets/developers_blobstream-rollups.md.580268e1.js b/pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.js
      similarity index 99%
      rename from pr-1699/assets/developers_blobstream-rollups.md.580268e1.js
      rename to pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.js
      index ff483df0f8..6101f29f93 100644
      --- a/pr-1699/assets/developers_blobstream-rollups.md.580268e1.js
      +++ b/pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.js
      @@ -1,3 +1,3 @@
      -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction to Blobstream rollups","description":"Learn how to build rollups that use Blobstream.","frontmatter":{"description":"Learn how to build rollups that use Blobstream.","prev":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"next":{"text":"Submitting data blobs to Celestia","link":"/developers/submit-data"},"head":[["meta",{"name":"og:title","content":"Introduction to Blobstream rollups | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-rollups.md","filePath":"developers/blobstream-rollups.md","lastUpdated":1725971357000}'),s={name:"developers/blobstream-rollups.md"},r=a(`

      Introduction to Blobstream rollups

      Blobstream is the first data availability solution for EVM chains that securely scales with the number of users. It allows rollups to post their data on Celestia while proving their availability in the rollup settlement contract.

      This document will outline a few ways to build optimistic or zk-rollups that post their data to Celestia and use Blobstream to prove that data's availability.

      Concepts

      This section will go over two constructs that can be used in building Blobstream rollups. Each with its pros and cons and the rollup developer can choose which one suits their needs better.

      Note: Only the sequence of spans method can be used currently to build Blobstream rollups. The blob share commitment way still requires some tooling that will be built in the upcoming months.

      Blob share commitment

      The blob share commitment is a commitment over the data contained in the MsgPayForBlobs transaction. This commitment allows proving that the corresponding data exists on Celestia efficiently.

      Blob share commitment: Proof details

      To prove that the data corresponding to a blob share commitment was posted to Celestia using Blobstream, the following proofs need to be verified:

      1. share inclusion proof to the blob share commitment: meaning creating two merkle proofs:
        1. share merkle proof up to the subtree root corresponding to that share
        2. subtree root merkle proof to the blob share commitment
      2. blob share commitment inclusion proof to the data root tuple root: meaning four merkle proofs:
        1. subtree roots merkle proofs to the blob share commitment: to make sure the subtree roots are valid
        2. subtree roots merkle proofs up to the row roots: to prove that the subtree roots belong to a set of rows in the Celestia block
        3. row roots proofs to the data root: to prove that those rows belong to the Celestia Block
        4. data root tuple proof to the data root tuple: to prove that the Celestia block referenced by its height and data root, was committed to by Blobstream.

      More details on the blob share commitment inclusion proof can be found in the commitment scheme docs and also the data square layout.

      If all of these proofs are valid, then you successfully managed to prove that the data corresponding to that blob share commitment has been posted to Celestia.

      NOTE

      Generating/verifying blob share commitment proofs is still not supported. It still needs tooling to generate the proofs on the node side, and verifying them on the Solidity side which will be built in the upcoming months.

      Blob share commitment: Compact proofs

      There is a way to have compact proofs, when using blob share commitments, unlike the ones defined above; that allow less costly inclusion proofs. These require the ability to parse the protobuf encoded PFBs.

      In fact, if the rollup project has a way to parse the protobuf encoded PFB, either in a smart contract or a zk-circuit, they will be able to create compact proofs of the rollup data.

      These proofs will work as follows:

      • Parsing the PFB and taking out the blob share commitment
      • Comparing the PFB commitment to the one saved in the rollup contract
      • Proving inclusion of the PFB to the data root tuple root. This will be a compact proof since we will only be proving two shares regardless of the size of the rollup data.

      More details on compact proofs can be found in ADR-011.

      Blob share commitment: Pros

      The pros of referencing rollup data using a blob share commitment:

      • Using the same commitment that exists on the PFB, without having to find another way of referencing the rollup data.
      • If the team has access to protobuf parsing, it allows for compact proof, but the parsing costs need to be investigated.

      Blob share commitment: Cons

      • Large/expensive proofs in the case of having no way to parse the protobuf PFB encoding.
      • In the optimistic rollups construction, defined below, this requires waiting for the Celestia block to be committed to by Blobstream before saving updating the settlement contract. This might require waiting for a few hours, depending on the batches size on each chain, to finally submit the rollup update.

      Given these limitations, an alternative design will be discussed in the next section.

      Sequence of spans

      An alternative way of referencing rollup data in the rollup settlement contract is using a sequence of spans.

      A sequence of spans is a data pointer that allows pointing to the rollup data inside a Celestia square using its location inside the square. It can be defined using the following information:

      • height: The height of the Celestia block containing the rollup data.
      • startIndex: The index of the first share containing the rollup data.
      • dataLen: The number of shares containing the rollup data.

      The startIndex and the dataLen can be queried from Celestia after the corresponding transaction gets included in a block and committed to the chain. An example of how to query them can be found in the verify command. The TxShareRange returns the start and end share of the data referenced by a transaction hash.

      NOTE

      If the rollup data is submitted in multiple blocks, the above sequence of spans can be generalized to include multiple blocks. For simplicity, we will stick with the data only submitted to a single Celestia block.

      Sequence of spans: Proof details

      Using sequence of spans is different from using the blob share commitment because we're referencing a location in the square, and not actual data commitment. So, the proof types and their generation are different.

      Sequence of spans: Proving unavailable data

      By construction, if the sequence of spans refers to a certain location in the square, that location is the data. This location can be in the reserved namespaces, the parity bytes, etc. What matters is that it's part of the square. So to prove that the sequence of spans is invalid, i.e., refers to data that is not available on Celestia, it is necessary and sufficient to show that the sequence of spans doesn't belong to the Celestia block, i.e., the span is out of bounds.

      We could create this proof via generating a binary Merkle proof of any row/column to the Celestia data root. This proof will provide the total which is the number of rows/columns in the extended data square. This can be used to calculate the square size. The computeSquareSizeFromRowProof method in the DAVerifier library allows calculating the square size from a row proof or a share proof.

      Then, we will use that information to check if the provided share index, in the header, is out of the square size bounds. In order words, we will check if the startIndex and the startIndex + dataLen are included in the range [0, 4*square_size].

      NOTE

      The square size is the number of rows of the original square.

      For the data root, we will use a binary Merkle proof to prove its inclusion in a data root tuple root that was committed to by the Blobstream smart contract. More on this in the data root inclusion proofs section.

      Sequence of spans: Proving inclusion of some data

      The difference between using a blob share commitment and a sequence of spans is that when using a blob share commitment, an extra merkle proof is needed to prove inclusion of the share to the blob share commitment. However, in the case of a sequence of spans, only the usual inclusion proof of a share to the data root tuple root is needed. The inclusion of the share to the sequence of spans is gotten using the same proof.

      In fact, proving that a share is part of the sequence of spans, i.e., part of the rollup data is done as follows:

      1. Prove that the data root tuple is committed to by the Blobstream smart contract:

        To prove the data root is committed to by the Blobstream smart contract, we will need to provide a Merkle proof of the data root tuple to a data root tuple root. This can be created using the data_root_inclusion_proof query. More on this can be found in the data root inclusion proofs documentation.

      2. Verify inclusion proof of the data to Celestia data root:

        To prove that the data is part of the data root, we will need to provide two proofs: a namespace Merkle proof of the data to a row root. This could be done via proving the shares that contain the data to the row root using a namespace Merkle proof. And, a binary Merkle proof of the row root to the data root.

        These proofs can be generated using the ProveShares query.

        More details on these proofs can be found in the transaction inclusion proof documentation.

      3. Prove that the data is in the sequence spans:

        To prove that the data is part of the rollup sequence of spans, we take the authenticated share proofs in step (2) and use the shares begin/end key to define the shares' positions in the row.

        Then, we use the row proof to get the row index in the extended Celestia square and get the index of the share in row major order:

        solidity
        uint256 shareIndexInRow = shareProof.shareProofs[0].beginKey;
        +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction to Blobstream rollups","description":"Learn how to build rollups that use Blobstream.","frontmatter":{"description":"Learn how to build rollups that use Blobstream.","prev":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"next":{"text":"Submitting data blobs to Celestia","link":"/developers/submit-data"},"head":[["meta",{"name":"og:title","content":"Introduction to Blobstream rollups | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-rollups.md","filePath":"developers/blobstream-rollups.md","lastUpdated":1725992025000}'),s={name:"developers/blobstream-rollups.md"},r=a(`

        Introduction to Blobstream rollups

        Blobstream is the first data availability solution for EVM chains that securely scales with the number of users. It allows rollups to post their data on Celestia while proving their availability in the rollup settlement contract.

        This document will outline a few ways to build optimistic or zk-rollups that post their data to Celestia and use Blobstream to prove that data's availability.

        Concepts

        This section will go over two constructs that can be used in building Blobstream rollups. Each with its pros and cons and the rollup developer can choose which one suits their needs better.

        Note: Only the sequence of spans method can be used currently to build Blobstream rollups. The blob share commitment way still requires some tooling that will be built in the upcoming months.

        Blob share commitment

        The blob share commitment is a commitment over the data contained in the MsgPayForBlobs transaction. This commitment allows proving that the corresponding data exists on Celestia efficiently.

        Blob share commitment: Proof details

        To prove that the data corresponding to a blob share commitment was posted to Celestia using Blobstream, the following proofs need to be verified:

        1. share inclusion proof to the blob share commitment: meaning creating two merkle proofs:
          1. share merkle proof up to the subtree root corresponding to that share
          2. subtree root merkle proof to the blob share commitment
        2. blob share commitment inclusion proof to the data root tuple root: meaning four merkle proofs:
          1. subtree roots merkle proofs to the blob share commitment: to make sure the subtree roots are valid
          2. subtree roots merkle proofs up to the row roots: to prove that the subtree roots belong to a set of rows in the Celestia block
          3. row roots proofs to the data root: to prove that those rows belong to the Celestia Block
          4. data root tuple proof to the data root tuple: to prove that the Celestia block referenced by its height and data root, was committed to by Blobstream.

        More details on the blob share commitment inclusion proof can be found in the commitment scheme docs and also the data square layout.

        If all of these proofs are valid, then you successfully managed to prove that the data corresponding to that blob share commitment has been posted to Celestia.

        NOTE

        Generating/verifying blob share commitment proofs is still not supported. It still needs tooling to generate the proofs on the node side, and verifying them on the Solidity side which will be built in the upcoming months.

        Blob share commitment: Compact proofs

        There is a way to have compact proofs, when using blob share commitments, unlike the ones defined above; that allow less costly inclusion proofs. These require the ability to parse the protobuf encoded PFBs.

        In fact, if the rollup project has a way to parse the protobuf encoded PFB, either in a smart contract or a zk-circuit, they will be able to create compact proofs of the rollup data.

        These proofs will work as follows:

        • Parsing the PFB and taking out the blob share commitment
        • Comparing the PFB commitment to the one saved in the rollup contract
        • Proving inclusion of the PFB to the data root tuple root. This will be a compact proof since we will only be proving two shares regardless of the size of the rollup data.

        More details on compact proofs can be found in ADR-011.

        Blob share commitment: Pros

        The pros of referencing rollup data using a blob share commitment:

        • Using the same commitment that exists on the PFB, without having to find another way of referencing the rollup data.
        • If the team has access to protobuf parsing, it allows for compact proof, but the parsing costs need to be investigated.

        Blob share commitment: Cons

        • Large/expensive proofs in the case of having no way to parse the protobuf PFB encoding.
        • In the optimistic rollups construction, defined below, this requires waiting for the Celestia block to be committed to by Blobstream before saving updating the settlement contract. This might require waiting for a few hours, depending on the batches size on each chain, to finally submit the rollup update.

        Given these limitations, an alternative design will be discussed in the next section.

        Sequence of spans

        An alternative way of referencing rollup data in the rollup settlement contract is using a sequence of spans.

        A sequence of spans is a data pointer that allows pointing to the rollup data inside a Celestia square using its location inside the square. It can be defined using the following information:

        • height: The height of the Celestia block containing the rollup data.
        • startIndex: The index of the first share containing the rollup data.
        • dataLen: The number of shares containing the rollup data.

        The startIndex and the dataLen can be queried from Celestia after the corresponding transaction gets included in a block and committed to the chain. An example of how to query them can be found in the verify command. The TxShareRange returns the start and end share of the data referenced by a transaction hash.

        NOTE

        If the rollup data is submitted in multiple blocks, the above sequence of spans can be generalized to include multiple blocks. For simplicity, we will stick with the data only submitted to a single Celestia block.

        Sequence of spans: Proof details

        Using sequence of spans is different from using the blob share commitment because we're referencing a location in the square, and not actual data commitment. So, the proof types and their generation are different.

        Sequence of spans: Proving unavailable data

        By construction, if the sequence of spans refers to a certain location in the square, that location is the data. This location can be in the reserved namespaces, the parity bytes, etc. What matters is that it's part of the square. So to prove that the sequence of spans is invalid, i.e., refers to data that is not available on Celestia, it is necessary and sufficient to show that the sequence of spans doesn't belong to the Celestia block, i.e., the span is out of bounds.

        We could create this proof via generating a binary Merkle proof of any row/column to the Celestia data root. This proof will provide the total which is the number of rows/columns in the extended data square. This can be used to calculate the square size. The computeSquareSizeFromRowProof method in the DAVerifier library allows calculating the square size from a row proof or a share proof.

        Then, we will use that information to check if the provided share index, in the header, is out of the square size bounds. In order words, we will check if the startIndex and the startIndex + dataLen are included in the range [0, 4*square_size].

        NOTE

        The square size is the number of rows of the original square.

        For the data root, we will use a binary Merkle proof to prove its inclusion in a data root tuple root that was committed to by the Blobstream smart contract. More on this in the data root inclusion proofs section.

        Sequence of spans: Proving inclusion of some data

        The difference between using a blob share commitment and a sequence of spans is that when using a blob share commitment, an extra merkle proof is needed to prove inclusion of the share to the blob share commitment. However, in the case of a sequence of spans, only the usual inclusion proof of a share to the data root tuple root is needed. The inclusion of the share to the sequence of spans is gotten using the same proof.

        In fact, proving that a share is part of the sequence of spans, i.e., part of the rollup data is done as follows:

        1. Prove that the data root tuple is committed to by the Blobstream smart contract:

          To prove the data root is committed to by the Blobstream smart contract, we will need to provide a Merkle proof of the data root tuple to a data root tuple root. This can be created using the data_root_inclusion_proof query. More on this can be found in the data root inclusion proofs documentation.

        2. Verify inclusion proof of the data to Celestia data root:

          To prove that the data is part of the data root, we will need to provide two proofs: a namespace Merkle proof of the data to a row root. This could be done via proving the shares that contain the data to the row root using a namespace Merkle proof. And, a binary Merkle proof of the row root to the data root.

          These proofs can be generated using the ProveShares query.

          More details on these proofs can be found in the transaction inclusion proof documentation.

        3. Prove that the data is in the sequence spans:

          To prove that the data is part of the rollup sequence of spans, we take the authenticated share proofs in step (2) and use the shares begin/end key to define the shares' positions in the row.

          Then, we use the row proof to get the row index in the extended Celestia square and get the index of the share in row major order:

          solidity
          uint256 shareIndexInRow = shareProof.shareProofs[0].beginKey;
           uint256 shareIndexInRowMajorOrder = shareIndexInRow + shareProof.rowProofs[0].numLeaves * shareProof.rowProofs[0].key;
          uint256 shareIndexInRow = shareProof.shareProofs[0].beginKey;
           uint256 shareIndexInRowMajorOrder = shareIndexInRow + shareProof.rowProofs[0].numLeaves * shareProof.rowProofs[0].key;

        Finally, we can compare the computed index with the sequence of spans, and be sure that the data/shares is part of the rollup data.

        Sequence of spans: Pros

        • Using a sequence of spans instead of the blob share commitment allows for simpler proofs

        Sequence of spans: Cons

        None

        Optimistic rollups

        One type of rollups that can be built with Blobstream is optimistic rollups. An optimistic rollup is a rollup that commits optimistically to a set of blocks, and allows the other parties to verify that the blocks are valid, and if they're not, they can create fraud proofs to signal that.

        Celestia allows optimistic rollups to post their data on its DA layer, and to prove that the data is available using Blobstream.

        To build an optimistic rollup that uses Celestia as a DA layer, the following constructions can be inspired by.

        Optimistic rollups that use a sequence of spans

        Optimistic rollups can post their data in Celestia, then in the rollup settlement contract, they can reference optimistically that data using a sequence of spans. Then, rollup full nodes can verify if that data is valid. If not, they can trigger a fraud proof.

        When using a sequence of spans, triggering the data availability fraud proofs, which are different from the state transitions fraud proofs (left for the rollup to define), goes back to the following cases:

        Optimistic rollups that use a sequence of spans: Pros

        • Not needing to verify anything at the moment of submitting the commitments to the rollup settlement contracts
        • The fraud proofs are simple and can be reduced to a single share: if, for example, a single transaction in the rollup data that was posted to Celestia is faulty, only the shares containing that transaction, which can be as minimal as a single share, need to be proven on chain and verified.

        Optimistic rollups that use a sequence of spans: Cons

        None

        Optimistic rollups that use a sequence of spans: Example

        An example optimistic rollup that uses sequence of spans to reference its data can be found in the RollupInclusionProofs. It portrays the different possible data availability proofs, constructs them and shows how to verify them.

        Also, more details on querying these kinds of proofs can be found in the proof queries documentation.

        Optimistic rollups that use blob share commitments

        Another way to build a rollup is to replace the sequence of spans with a height and a blob share commitment. Then, users/rollup full nodes will be able to query that data and validate it. If the rollup data is not valid, they can create a fraud proof.

        The first difference between the sequence of spans construction and the share commitment construction is having to verify that the provided blob share commitment is part of the Celestia block, referenced by its height in the moment of submitting the rollup commitments to the settlement contract. This is necessary to make sure that the commitment is part of Celestia. Otherwise, rollup sequencers can commit to random blob share commitments and there won't be a way to prove they're invalid.

        The second difference is the proof types. In the case of a fraud proof, the proofs outlined in the proofs details of blob share commitment section would need to be verified to be sure that the share containing the invalid state transition is part of the rollup data. Alternatively, the rollup settlement contract would need to have a library to parse protobuf encoded PFBs, as explained in the compact proofs of blob share commitment section, to have less expensive proofs. The cost of parsing the protobuf is not included in this analysis and needs to be investigated separately.

        Optimistic rollups that use blob share commitments: Pros

        • Using the same blob share commitment as the one saved in Celestia which gives access to existing tooling

        Optimistic rollups that use blob share commitments: Cons

        • The proofs are expensive in the base case. And if the settlement contract is able to parse the PFBs, thorough investigations of the cost of that would need to be done.

        Zk-rollups

        Zk-rollups, aka validity rollups, can also use Celestia as a DA and Blobstream to verify that the data was posted. However, the submission process is different from the above constructions, since there are no fraud proofs, and everything should be verified when submitting the commitment to the settlement contract.

        Similar to the optimistic case, the rollup settlement contract can reference the rollup data using either the sequence of spans approach or the blob share commitments. We will discuss both in this section.

        Zk-rollups that use sequence of spans

        When submitting the commitments to the rollup settlement contract, this latter will need to verify the following:

        1. Zk-proof of the state transitions, which is left for the rollup to define.
        2. Verify that the sequence of spans is valid, i.e., is part of the Celestia block referenced by its height, as described in the proof details section.
        3. Zk-proof of the rollup data to the data root. The verification process of this should accept a commitment as input so that the settlement contract makes sure it's the correct value that's being saved. The commitment can be the data root and the sequence of spans. And, when the rollup data is proven inside the circuit to the data root, the used data root is asserted to be the input one. Similarly, the data's location is asserted to be the same as the input sequence of spans. These arguments are the ones used in the sequence of spans verification in (2).

        Once these are valid, the settlement contract can be sure that the rollup data was posted to Celestia, and the sequence of spans references it correctly.

        Zk-rollups that use sequence of spans: Pros

        • The inclusion proof inside the zk-circuit is a simple proof that uses traditional merkle tree. In the case of using blob share commitment, as will be explained below, additional libraries that can be expensive to prove are required.

        Zk-rollups that use sequence of spans: Cons

        None

        Zk-rollups that use blob share commitments

        To use blob share commitments to reference rollup data in the zk-rollup settlement contract, the zk-circuits need to be able to deserialize protobuf encoded messages. Alternatively, more involved merkle proofs will need to be verified.

        Protobuf deserialization inside a zk-circuit

        One way of using the blob share commitment to reference the rollup data in zk-rollups is via using a protobuf deserialization library inside the zk-circuit. And the verification would proceed as follows:

        1. Zk-proof of the state transitions, which is left to the rollup team to define.
        2. Verify that the blob share commitment is valid using the proofs laid out in the proof details of blob share commitment section.
        3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit, the protobuf encoded PFB transaction will be deserialized and then verify the following:
        • The deserialized blob share commitment is the same as the one provided as input
        • The circuit will prove the inclusion of the PFB to the data root, then assert that the data root is the same as the one provided as input.

        If the above conditions are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

        Zk-rollups that use blob share commitments: Pros

        None

        Zk-rollups that use blob share commitments: Cons

        • This approach requires having access to a protobuf decoder inside a zk-circuit which is not straightforward to have. Also, the relative costs will need to be investigated.

        Heavy merkle proofs usage

        Similar to Protobuf deserialization inside a zk-circuit, the zk-circuit will proceed to the verification of the availability of the data. The difference is that instead of parsing the encoded protobuf, the proofs defined under the blob share commitment proof details section will need to be verified inside the zk-circuit as follows:

        1. Zk-proof of the state transitions, which is left to the rollup team to define.
        2. Verify that the blob share commitment is valid using the proofs laid out in the blob share commitment proof details section.
        3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit:
        • It will verify that the input blob share commitment corresponds to the rollup data.
        • Verify that the input data root commits to that blob share commitment. Check the blob share commitment proof details for more details

        Once these proofs are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

        heavy merkle proofs usage: Pros

        None

        heavy merkle proofs usage: Cons

        • More heavy usage of merkle proofs inside and outside the zk-circuit.

        Conclusion

        Given the above details, using the sequence of spans is the better solution in the general case as explained in the optimistic rollups that uses a sequence of spans and zk-rollups that use sequence of spans sections. The proof sizes are small and allow for greater flexibility. However, if the rollup team has different requirements, then the other designs can be explored.

        FAQ

        Should I use the Celestia transaction hash to reference the rollup data?

        This is asked a lot since it's the most intuitive way of referencing data. However, in Celestia, referencing the data using the transaction hash is not recommended.

        A transaction proof in Celestia goes back to providing an inclusion proof of the shares containing the transaction. This means if the transaction hash is used to reference data in a Celestia block, the rollup verification mechanism should do the following:

        • Verify an inclusion proof of the shares comprising the transaction up to the data root tuple root
        • Decode those shares and parse the transaction, then hash its components to generate the transaction hash
        • Verify that the generated transaction hash matches the one used to reference the data

        At this level, the transaction hash is authenticated and the verification contract has the shares of the transaction. Then, the verification contract needs to take the share commitment from the parsed transaction and follow the steps outlined in the blob share commitment section.

        As observed, using the transaction hash is expensive and doesn't yield any advantages over using the blob share commitment, which in turn is more expensive than using the sequence of spans.

        So, unless there are more reasons to use the transaction hash to reference the rollup data, the sequence of spans approach remains better.

        `,113),i=[r];function n(l,h,c,p,u,d){return t(),o("div",null,i)}const b=e(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/pr-1699/assets/developers_blobstream-rollups.md.580268e1.lean.js b/pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.lean.js similarity index 92% rename from pr-1699/assets/developers_blobstream-rollups.md.580268e1.lean.js rename to pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.lean.js index c2b61d93a7..f7f0593f23 100644 --- a/pr-1699/assets/developers_blobstream-rollups.md.580268e1.lean.js +++ b/pr-1699/assets/developers_blobstream-rollups.md.9c8cb137.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction to Blobstream rollups","description":"Learn how to build rollups that use Blobstream.","frontmatter":{"description":"Learn how to build rollups that use Blobstream.","prev":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"next":{"text":"Submitting data blobs to Celestia","link":"/developers/submit-data"},"head":[["meta",{"name":"og:title","content":"Introduction to Blobstream rollups | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-rollups.md","filePath":"developers/blobstream-rollups.md","lastUpdated":1725971357000}'),s={name:"developers/blobstream-rollups.md"},r=a("",113),i=[r];function n(l,h,c,p,u,d){return t(),o("div",null,i)}const b=e(s,[["render",n]]);export{f as __pageData,b as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction to Blobstream rollups","description":"Learn how to build rollups that use Blobstream.","frontmatter":{"description":"Learn how to build rollups that use Blobstream.","prev":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"next":{"text":"Submitting data blobs to Celestia","link":"/developers/submit-data"},"head":[["meta",{"name":"og:title","content":"Introduction to Blobstream rollups | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-rollups.md","filePath":"developers/blobstream-rollups.md","lastUpdated":1725992025000}'),s={name:"developers/blobstream-rollups.md"},r=a("",113),i=[r];function n(l,h,c,p,u,d){return t(),o("div",null,i)}const b=e(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.js b/pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.js similarity index 99% rename from pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.js rename to pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.js index b5f8450a95..69c0b2979a 100644 --- a/pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.js +++ b/pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"New Blobstream X deployments","description":"","frontmatter":{"next":{"text":"Celestia-node key","link":"/developers/celestia-node-key"},"head":[["meta",{"name":"og:title","content":"New Blobstream X deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-deploy.md","filePath":"developers/blobstream-x-deploy.md","lastUpdated":1725971357000}'),o={name:"developers/blobstream-x-deploy.md"},l=e(`

        New Blobstream X deployments

        This document will go over the instructions to deploy BlobstreamX to a new chain.

        Deploying the contracts

        To deploy a Blobstream X to a new chain, where a Gateway contract does not exist yet, the following steps need to be followed.

        If any of the components already exist in the target chain, feel free to skip the corresponding step.

        Deploy a new SuccinctGateway

        The SuccinctGateway is a contract that acts as a registry for onchain circuit verifiers and manages their access control. It is the entrypoint for proof verification and does the following:

        1. Receive a PLONK proof from the prover
        2. Fetch the address of the target function verifier
        3. Verify if the prover is whitelisted, if whitelisting is enabled
        4. Forward the proof to the function verifier to be verified
        5. If the proof is valid, it calls back the BlobstreamX contract to update its state

        The BlobstreamX requires the update to be provided through the SuccinctGateway. Otherwise, the contract can't be updated.

        To deploy a SuccinctGateway contract, you need to have foundry installed. If not, refer to foundry documentation.

        Then, clone the succinctx repo:

        shell
        git clone https://github.com/succinctlabs/succinctx
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"New Blobstream X deployments","description":"","frontmatter":{"next":{"text":"Celestia-node key","link":"/developers/celestia-node-key"},"head":[["meta",{"name":"og:title","content":"New Blobstream X deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-deploy.md","filePath":"developers/blobstream-x-deploy.md","lastUpdated":1725992025000}'),o={name:"developers/blobstream-x-deploy.md"},l=e(`

        New Blobstream X deployments

        This document will go over the instructions to deploy BlobstreamX to a new chain.

        Deploying the contracts

        To deploy a Blobstream X to a new chain, where a Gateway contract does not exist yet, the following steps need to be followed.

        If any of the components already exist in the target chain, feel free to skip the corresponding step.

        Deploy a new SuccinctGateway

        The SuccinctGateway is a contract that acts as a registry for onchain circuit verifiers and manages their access control. It is the entrypoint for proof verification and does the following:

        1. Receive a PLONK proof from the prover
        2. Fetch the address of the target function verifier
        3. Verify if the prover is whitelisted, if whitelisting is enabled
        4. Forward the proof to the function verifier to be verified
        5. If the proof is valid, it calls back the BlobstreamX contract to update its state

        The BlobstreamX requires the update to be provided through the SuccinctGateway. Otherwise, the contract can't be updated.

        To deploy a SuccinctGateway contract, you need to have foundry installed. If not, refer to foundry documentation.

        Then, clone the succinctx repo:

        shell
        git clone https://github.com/succinctlabs/succinctx
         cd succinctx
        git clone https://github.com/succinctlabs/succinctx
         cd succinctx

        Next, build the contracts:

        shell
        cd contracts
         forge build
        cd contracts
        diff --git a/pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.lean.js b/pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.lean.js
        similarity index 90%
        rename from pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.lean.js
        rename to pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.lean.js
        index 784d4faeca..98c031944b 100644
        --- a/pr-1699/assets/developers_blobstream-x-deploy.md.e0b78833.lean.js
        +++ b/pr-1699/assets/developers_blobstream-x-deploy.md.6ed5e09e.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"New Blobstream X deployments","description":"","frontmatter":{"next":{"text":"Celestia-node key","link":"/developers/celestia-node-key"},"head":[["meta",{"name":"og:title","content":"New Blobstream X deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-deploy.md","filePath":"developers/blobstream-x-deploy.md","lastUpdated":1725971357000}'),o={name:"developers/blobstream-x-deploy.md"},l=e("",112),t=[l];function p(c,r,i,y,d,E){return a(),n("div",null,t)}const F=s(o,[["render",p]]);export{u as __pageData,F as default};
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"New Blobstream X deployments","description":"","frontmatter":{"next":{"text":"Celestia-node key","link":"/developers/celestia-node-key"},"head":[["meta",{"name":"og:title","content":"New Blobstream X deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-deploy.md","filePath":"developers/blobstream-x-deploy.md","lastUpdated":1725992025000}'),o={name:"developers/blobstream-x-deploy.md"},l=e("",112),t=[l];function p(c,r,i,y,d,E){return a(),n("div",null,t)}const F=s(o,[["render",p]]);export{u as __pageData,F as default};
        diff --git a/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.js b/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.js
        similarity index 98%
        rename from pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.js
        rename to pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.js
        index 3c0753e972..e79401eb40 100644
        --- a/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.js
        +++ b/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.js
        @@ -1 +1 @@
        -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Requesting data commitment ranges","description":"","frontmatter":{"prev":{"text":"Querying the Blobstream proofs","link":"/developers/blobstream-proof-queries"},"head":[["meta",{"name":"og:title","content":"Requesting data commitment ranges | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","filePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","lastUpdated":1725971357000}'),r={name:"developers/blobstream-x-requesting-data-commitment-ranges.md"},n=a('

        Requesting data commitment ranges

        By default, the Blobstream X deployments on Ethereum will be updated every 4 hours, and on Arbitrum One and Base, updating every 1 hour. If you wish for the Blobstream X contract to be updated at a different cadence, then you have several different options for how to update the smart contract.

        To request proofs to be submitted to the Blobstream X contract at a different cadence, you can do one of the following:

        NOTE: The requested proof ranges cannot include blocks that were already used in a previous batch. The ranges should start from the last proven block, aka, latest_block and they should end in a block already committed by Celestia. In other words, it's the end-inclusive range defined by [latest_block, target_block] with target_block <= Celestia tip.

        Local proving

        To run the Blobstream X operator with local proving, follow this guide.

        Local proving allows self-generating the proofs and submitting them to an existing BlobstreamX contract. Alternatively, if a team needs a very specific cadence that starts at very specific heights, they can deploy their own BlobstreamX contract and submit proofs to it. Deployment instructions can be found in the BlobstreamX deploy documentation.

        ::: Note Requires a large cloud machine to run in a reasonable amount of time. EC2 r6a.16xlarge, i.e., 64CPU 512GB RAM, takes ~30 minutes to generate a header range proof. :::

        Request proofs from the Succinct platform

        NOTE: Requesting a proof from the succinct platform requires having a Succinct API key. It can be requested using this form.

        Run the Blobstream X operator with hosted proving on the Succinct platform, by running an operator script that pings the platform with proof requests at a specified cadence.

        Follow these instructions to run the operator script.

        Here are example values for the .env file:

        1. TENDERMINT_RPC_URL from the public Celestia list.
        2. SUCCINCT_RPC_URL = https://alpha.succinct.xyz/api
        3. Request for SUCCINCT_API_KEY from the Succinct team.
        4. CHAIN_ID is the chain ID of the deployed Blobstream X contract.
        5. CONTRACT_ADDRESS: Blobstream X proxy contract address.
        6. NEXT_HEADER_FUNCTION_ID & HEADER_RANGE_FUNCTION_ID: Get the functionId's from the Blobstream X contract by using the nextHeaderFunctionId and headerRangeFunctionId respectively, which are public storage variables.

        Request proofs onchain

        Directly request a proof via the Blobstream X contract interface. Unlike the Blobstream X operator which handles requests off-chain, requesting on-chain requires gas, but the proof will be generated and relayed by the Succinct platform.

        1. Call requestHeaderRange(uint64 _targetBlock) with the end of the range you want a commitment for.

        2. A DataCommitmentStored(uint256, uint64, uint64, bytes32) will be emitted for the requested range when it is stored in the contract. Listen to this event to know that the proof has been generated successfully.

        ',17),s=[n];function c(i,l,d,h,p,m){return t(),o("div",null,s)}const b=e(r,[["render",c]]);export{f as __pageData,b as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Requesting data commitment ranges","description":"","frontmatter":{"prev":{"text":"Querying the Blobstream proofs","link":"/developers/blobstream-proof-queries"},"head":[["meta",{"name":"og:title","content":"Requesting data commitment ranges | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","filePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","lastUpdated":1725992025000}'),r={name:"developers/blobstream-x-requesting-data-commitment-ranges.md"},n=a('

        Requesting data commitment ranges

        By default, the Blobstream X deployments on Ethereum will be updated every 4 hours, and on Arbitrum One and Base, updating every 1 hour. If you wish for the Blobstream X contract to be updated at a different cadence, then you have several different options for how to update the smart contract.

        To request proofs to be submitted to the Blobstream X contract at a different cadence, you can do one of the following:

        NOTE: The requested proof ranges cannot include blocks that were already used in a previous batch. The ranges should start from the last proven block, aka, latest_block and they should end in a block already committed by Celestia. In other words, it's the end-inclusive range defined by [latest_block, target_block] with target_block <= Celestia tip.

        Local proving

        To run the Blobstream X operator with local proving, follow this guide.

        Local proving allows self-generating the proofs and submitting them to an existing BlobstreamX contract. Alternatively, if a team needs a very specific cadence that starts at very specific heights, they can deploy their own BlobstreamX contract and submit proofs to it. Deployment instructions can be found in the BlobstreamX deploy documentation.

        ::: Note Requires a large cloud machine to run in a reasonable amount of time. EC2 r6a.16xlarge, i.e., 64CPU 512GB RAM, takes ~30 minutes to generate a header range proof. :::

        Request proofs from the Succinct platform

        NOTE: Requesting a proof from the succinct platform requires having a Succinct API key. It can be requested using this form.

        Run the Blobstream X operator with hosted proving on the Succinct platform, by running an operator script that pings the platform with proof requests at a specified cadence.

        Follow these instructions to run the operator script.

        Here are example values for the .env file:

        1. TENDERMINT_RPC_URL from the public Celestia list.
        2. SUCCINCT_RPC_URL = https://alpha.succinct.xyz/api
        3. Request for SUCCINCT_API_KEY from the Succinct team.
        4. CHAIN_ID is the chain ID of the deployed Blobstream X contract.
        5. CONTRACT_ADDRESS: Blobstream X proxy contract address.
        6. NEXT_HEADER_FUNCTION_ID & HEADER_RANGE_FUNCTION_ID: Get the functionId's from the Blobstream X contract by using the nextHeaderFunctionId and headerRangeFunctionId respectively, which are public storage variables.

        Request proofs onchain

        Directly request a proof via the Blobstream X contract interface. Unlike the Blobstream X operator which handles requests off-chain, requesting on-chain requires gas, but the proof will be generated and relayed by the Succinct platform.

        1. Call requestHeaderRange(uint64 _targetBlock) with the end of the range you want a commitment for.

        2. A DataCommitmentStored(uint256, uint64, uint64, bytes32) will be emitted for the requested range when it is stored in the contract. Listen to this event to know that the proof has been generated successfully.

        ',17),s=[n];function c(i,l,d,h,p,m){return t(),o("div",null,s)}const b=e(r,[["render",c]]);export{f as __pageData,b as default}; diff --git a/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.lean.js b/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.lean.js similarity index 92% rename from pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.lean.js rename to pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.lean.js index b8c1abc9f5..8e39c335b9 100644 --- a/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.409fcb45.lean.js +++ b/pr-1699/assets/developers_blobstream-x-requesting-data-commitment-ranges.md.adbc6c7c.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Requesting data commitment ranges","description":"","frontmatter":{"prev":{"text":"Querying the Blobstream proofs","link":"/developers/blobstream-proof-queries"},"head":[["meta",{"name":"og:title","content":"Requesting data commitment ranges | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","filePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","lastUpdated":1725971357000}'),r={name:"developers/blobstream-x-requesting-data-commitment-ranges.md"},n=a("",17),s=[n];function c(i,l,d,h,p,m){return t(),o("div",null,s)}const b=e(r,[["render",c]]);export{f as __pageData,b as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Requesting data commitment ranges","description":"","frontmatter":{"prev":{"text":"Querying the Blobstream proofs","link":"/developers/blobstream-proof-queries"},"head":[["meta",{"name":"og:title","content":"Requesting data commitment ranges | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","filePath":"developers/blobstream-x-requesting-data-commitment-ranges.md","lastUpdated":1725992025000}'),r={name:"developers/blobstream-x-requesting-data-commitment-ranges.md"},n=a("",17),s=[n];function c(i,l,d,h,p,m){return t(),o("div",null,s)}const b=e(r,[["render",c]]);export{f as __pageData,b as default}; diff --git a/pr-1699/assets/developers_blobstream.md.c9e61c23.js b/pr-1699/assets/developers_blobstream.md.4afef8bd.js similarity index 99% rename from pr-1699/assets/developers_blobstream.md.c9e61c23.js rename to pr-1699/assets/developers_blobstream.md.4afef8bd.js index afc102cbb5..29d5426668 100644 --- a/pr-1699/assets/developers_blobstream.md.c9e61c23.js +++ b/pr-1699/assets/developers_blobstream.md.4afef8bd.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream_logo.png",f=JSON.parse('{"title":"Blobstream: Streaming modular DA to Ethereum","description":"Learn how to integrate your L2 with Blobstream","frontmatter":{"description":"Learn how to integrate your L2 with Blobstream","head":[["meta",{"name":"og:title","content":"Blobstream: Streaming modular DA to Ethereum | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream.md","filePath":"developers/blobstream.md","lastUpdated":1725971357000}'),s={name:"developers/blobstream.md"},l=r('

        Blobstream: Streaming modular DA to Ethereum

        Blobstream logo

        What is Blobstream?

        Blobstream is the first data availability solution for Ethereum that securely scales with the number of users. Formerly known as the Quantum Gravity Bridge (QGB), Blobstream relays commitments to Celestia's data root to an onchain light client on Ethereum, for integration by developers into L2 contracts. This enables Ethereum developers to build high-throughput L2s using Celestia's optimised DA layer, the first with Data Availability Sampling (DAS). Any ecosystem can deploy a Blobstream light client onchain to allow L2s and L3s to access DA from Celestia.

        An implementation of Blobstream, by Succinct, called Blobstream X, is out and will be used in the upcoming deployments. This implementation proves the validity of Celestia block headers on a target EVM chain using zero-knowledge (ZK) proofs, which allow inheriting all the security guarantees of Celestia.

        The latest implementation of Blobstream X is SP1 Blobstream, which is written in Rust for the SP1 zkVM. SP1 Blobstream offers improved performance and efficiency while maintaining the security guarantees of the original Blobstream X.

        Please note: Blobstream remains early-stage, experimental software and users should use Blobstream at their own risk.

        Implementations of Blobstream

        Blobstream vs. data availability committees (DACs)

        Decentralization and security

        Blobstream is built on Celestia, which uses a CometBFT-based proof-of-stake system. Blobstream shares the same security assumptions as Celestia. In contrast, data availability committees (DACs), are typically centralized or semi-centralized, relying on a specific set of entities or individuals to vouch for data availability.

        Mechanism of verification

        Blobstream uses data availability attestations, which are Merkle roots of the batched L2 data, to confirm that the necessary data is present on Celestia. The L2 contract on Ethereum can check directly with Blobstream if the data is published on Celestia. Similarly, a DAC would rely on attestations or confirmations from its permissioned members.

        Flexibility and scalability

        Blobstream is designed to offer high-throughput data availability for Ethereum L2s, aiming to strike a balance between scalability and security. It operates independently of Ethereum's gas costs, as Celestia's resource pricing is more byte-focused rather than computation-centric. On the other hand, the scalability and flexibility of a DAC would depend on its specific design and implementation.

        In summary, both Blobstream and DACs aim to ensure offchain data availability, but Blobstream offers a more decentralized, secure, and scalable solution compared to the potential centralized nature of DACs.

        What is SP1 Blobstream?

        SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

        SP1 Blobstream is the latest implementation of Blobstream with a ZK light client that bridges Celestia’s modular DA layer to Ethereum to allow high-throughput rollups to use Celestia’s DA while settling on Ethereum.

        Optimistic or ZK rollups that settle on Ethereum, but wish to use Celestia for DA, require a mechanism for bridging Celestia’s data root to Ethereum as part of the settlement process. This data root is used during inclusion proofs to prove that particular rollup transactions were included and made available in the Celestia network.

        Bridging Celestia’s data root to Ethereum requires running a Celestia light client as a smart contract on Ethereum, to make the latest state of the Celestia chain known on Ethereum and available to rollups. SP1 Blobstream uses the latest advances in ZK proofs to generate a succinct proof that enough Celestia validators have come to consensus (according to the CometBFT consensus protocol) on a block header, and verifies this proof in the SP1 Blobstream Ethereum smart contract to update it with the latest Celestia header.

        The SP1 Blobstream ZK proof not only verifies the consensus of Celestia validators, but it also merkelizes and hashes all the data roots in the block range from the previous update to the current update, making accessible all Celestia data roots (verifiable with a Merkle inclusion proof against the stored Merkle root) to rollups.

        If you're looking to deploy SP1 blobstream to a new chain, see new Sp1 Blobstream deployments.

        Learn more at the sp1-blobstream repo.

        NOTE

        The current Blobstream deployments all use SP1 Blobstream.

        Integrate with SP1 Blobstream

        The following docs go over how developers can integrate SP1 Blobstream.

        You can find the repository for SP1 Blobstream along with code for:

        The first deployments of SP1 Blobstream will be maintained on the following chains: Arbitrum One, Base and Ethereum Mainnet. Every 1 hour, the prover/relayer will post an update to the Blobstream contract that will include a new data commitment range that covers a 1-hour block range from the latestBlock in the contract. On Ethereum Mainnet, the contract will be updated every 4 hours.

        How to integrate with Blobstream

        Integrating your L2 with Blobstream requires two components: your onchain smart contract logic, and your offchain client logic for your rollup. The next three sections cover these topics:

        Blobstream rollups

        More on the different ways to build a blobstream rollup can be found in the blobstream rollups documentation.

        Deployed contracts

        You can interact with the SP1 Blobstream contracts today. The SP1 Blobstream Solidity smart contracts are currently deployed on the following chains:

        ContractEVM networkContract addressAttested data on CelestiaLink to Celenium
        SP1 BlobstreamEthereum Mainnet0x7Cf3876F681Dbb6EdA8f6FfC45D66B996Df08fAeMainnet BetaDeployment on Celenium
        SP1 BlobstreamArbitrum One0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
        SP1 BlobstreamBase0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
        SP1 BlobstreamSepolia0xf0c6429ebab2e7dc6e05dafb61128be21f13cb1eMocha testnetDeployment on Celenium
        SP1 BlobstreamArbitrum Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
        SP1 BlobstreamBase Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
        ',39),i=[l];function n(h,c,m,b,d,p){return t(),a("div",null,i)}const g=e(s,[["render",n]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream_logo.png",f=JSON.parse('{"title":"Blobstream: Streaming modular DA to Ethereum","description":"Learn how to integrate your L2 with Blobstream","frontmatter":{"description":"Learn how to integrate your L2 with Blobstream","head":[["meta",{"name":"og:title","content":"Blobstream: Streaming modular DA to Ethereum | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream.md","filePath":"developers/blobstream.md","lastUpdated":1725992025000}'),s={name:"developers/blobstream.md"},l=r('

        Blobstream: Streaming modular DA to Ethereum

        Blobstream logo

        What is Blobstream?

        Blobstream is the first data availability solution for Ethereum that securely scales with the number of users. Formerly known as the Quantum Gravity Bridge (QGB), Blobstream relays commitments to Celestia's data root to an onchain light client on Ethereum, for integration by developers into L2 contracts. This enables Ethereum developers to build high-throughput L2s using Celestia's optimised DA layer, the first with Data Availability Sampling (DAS). Any ecosystem can deploy a Blobstream light client onchain to allow L2s and L3s to access DA from Celestia.

        An implementation of Blobstream, by Succinct, called Blobstream X, is out and will be used in the upcoming deployments. This implementation proves the validity of Celestia block headers on a target EVM chain using zero-knowledge (ZK) proofs, which allow inheriting all the security guarantees of Celestia.

        The latest implementation of Blobstream X is SP1 Blobstream, which is written in Rust for the SP1 zkVM. SP1 Blobstream offers improved performance and efficiency while maintaining the security guarantees of the original Blobstream X.

        Please note: Blobstream remains early-stage, experimental software and users should use Blobstream at their own risk.

        Implementations of Blobstream

        Blobstream vs. data availability committees (DACs)

        Decentralization and security

        Blobstream is built on Celestia, which uses a CometBFT-based proof-of-stake system. Blobstream shares the same security assumptions as Celestia. In contrast, data availability committees (DACs), are typically centralized or semi-centralized, relying on a specific set of entities or individuals to vouch for data availability.

        Mechanism of verification

        Blobstream uses data availability attestations, which are Merkle roots of the batched L2 data, to confirm that the necessary data is present on Celestia. The L2 contract on Ethereum can check directly with Blobstream if the data is published on Celestia. Similarly, a DAC would rely on attestations or confirmations from its permissioned members.

        Flexibility and scalability

        Blobstream is designed to offer high-throughput data availability for Ethereum L2s, aiming to strike a balance between scalability and security. It operates independently of Ethereum's gas costs, as Celestia's resource pricing is more byte-focused rather than computation-centric. On the other hand, the scalability and flexibility of a DAC would depend on its specific design and implementation.

        In summary, both Blobstream and DACs aim to ensure offchain data availability, but Blobstream offers a more decentralized, secure, and scalable solution compared to the potential centralized nature of DACs.

        What is SP1 Blobstream?

        SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

        SP1 Blobstream is the latest implementation of Blobstream with a ZK light client that bridges Celestia’s modular DA layer to Ethereum to allow high-throughput rollups to use Celestia’s DA while settling on Ethereum.

        Optimistic or ZK rollups that settle on Ethereum, but wish to use Celestia for DA, require a mechanism for bridging Celestia’s data root to Ethereum as part of the settlement process. This data root is used during inclusion proofs to prove that particular rollup transactions were included and made available in the Celestia network.

        Bridging Celestia’s data root to Ethereum requires running a Celestia light client as a smart contract on Ethereum, to make the latest state of the Celestia chain known on Ethereum and available to rollups. SP1 Blobstream uses the latest advances in ZK proofs to generate a succinct proof that enough Celestia validators have come to consensus (according to the CometBFT consensus protocol) on a block header, and verifies this proof in the SP1 Blobstream Ethereum smart contract to update it with the latest Celestia header.

        The SP1 Blobstream ZK proof not only verifies the consensus of Celestia validators, but it also merkelizes and hashes all the data roots in the block range from the previous update to the current update, making accessible all Celestia data roots (verifiable with a Merkle inclusion proof against the stored Merkle root) to rollups.

        If you're looking to deploy SP1 blobstream to a new chain, see new Sp1 Blobstream deployments.

        Learn more at the sp1-blobstream repo.

        NOTE

        The current Blobstream deployments all use SP1 Blobstream.

        Integrate with SP1 Blobstream

        The following docs go over how developers can integrate SP1 Blobstream.

        You can find the repository for SP1 Blobstream along with code for:

        The first deployments of SP1 Blobstream will be maintained on the following chains: Arbitrum One, Base and Ethereum Mainnet. Every 1 hour, the prover/relayer will post an update to the Blobstream contract that will include a new data commitment range that covers a 1-hour block range from the latestBlock in the contract. On Ethereum Mainnet, the contract will be updated every 4 hours.

        How to integrate with Blobstream

        Integrating your L2 with Blobstream requires two components: your onchain smart contract logic, and your offchain client logic for your rollup. The next three sections cover these topics:

        Blobstream rollups

        More on the different ways to build a blobstream rollup can be found in the blobstream rollups documentation.

        Deployed contracts

        You can interact with the SP1 Blobstream contracts today. The SP1 Blobstream Solidity smart contracts are currently deployed on the following chains:

        ContractEVM networkContract addressAttested data on CelestiaLink to Celenium
        SP1 BlobstreamEthereum Mainnet0x7Cf3876F681Dbb6EdA8f6FfC45D66B996Df08fAeMainnet BetaDeployment on Celenium
        SP1 BlobstreamArbitrum One0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
        SP1 BlobstreamBase0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
        SP1 BlobstreamSepolia0xf0c6429ebab2e7dc6e05dafb61128be21f13cb1eMocha testnetDeployment on Celenium
        SP1 BlobstreamArbitrum Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
        SP1 BlobstreamBase Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
        ',39),i=[l];function n(h,c,m,b,d,p){return t(),a("div",null,i)}const g=e(s,[["render",n]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/developers_blobstream.md.c9e61c23.lean.js b/pr-1699/assets/developers_blobstream.md.4afef8bd.lean.js similarity index 91% rename from pr-1699/assets/developers_blobstream.md.c9e61c23.lean.js rename to pr-1699/assets/developers_blobstream.md.4afef8bd.lean.js index 1e3f4eaaa9..f14e16c015 100644 --- a/pr-1699/assets/developers_blobstream.md.c9e61c23.lean.js +++ b/pr-1699/assets/developers_blobstream.md.4afef8bd.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream_logo.png",f=JSON.parse('{"title":"Blobstream: Streaming modular DA to Ethereum","description":"Learn how to integrate your L2 with Blobstream","frontmatter":{"description":"Learn how to integrate your L2 with Blobstream","head":[["meta",{"name":"og:title","content":"Blobstream: Streaming modular DA to Ethereum | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream.md","filePath":"developers/blobstream.md","lastUpdated":1725971357000}'),s={name:"developers/blobstream.md"},l=r("",39),i=[l];function n(h,c,m,b,d,p){return t(),a("div",null,i)}const g=e(s,[["render",n]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/blobstream/blobstream_logo.png",f=JSON.parse('{"title":"Blobstream: Streaming modular DA to Ethereum","description":"Learn how to integrate your L2 with Blobstream","frontmatter":{"description":"Learn how to integrate your L2 with Blobstream","head":[["meta",{"name":"og:title","content":"Blobstream: Streaming modular DA to Ethereum | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstream.md","filePath":"developers/blobstream.md","lastUpdated":1725992025000}'),s={name:"developers/blobstream.md"},l=r("",39),i=[l];function n(h,c,m,b,d,p){return t(),a("div",null,i)}const g=e(s,[["render",n]]);export{f as __pageData,g as default}; diff --git a/pr-1699/assets/developers_blobstreamx.md.67c7a6c7.js b/pr-1699/assets/developers_blobstreamx.md.7838cfd1.js similarity index 98% rename from pr-1699/assets/developers_blobstreamx.md.67c7a6c7.js rename to pr-1699/assets/developers_blobstreamx.md.7838cfd1.js index fcfba8d630..a3826dd45c 100644 --- a/pr-1699/assets/developers_blobstreamx.md.67c7a6c7.js +++ b/pr-1699/assets/developers_blobstreamx.md.7838cfd1.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X1b.png",s="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X2b.png",g=JSON.parse('{"title":"BlobstreamX: the previous zk implementation of Blobstream","description":"What is BlobstreamX","frontmatter":{"description":"What is BlobstreamX","head":[["meta",{"name":"og:title","content":"BlobstreamX: the previous zk implementation of Blobstream | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstreamx.md","filePath":"developers/blobstreamx.md","lastUpdated":1725971357000}'),c={name:"developers/blobstreamx.md"},l=a('

        BlobstreamX: the previous zk implementation of Blobstream

        blobstream x draft diagram

        What is Blobstream X?

        Blobstream X is the previous implementation of Blobstream. It uses plonky2x to create circuits that verify the Celestia consensus and generate the corresponding proofs.

        Blobstream X is built and deployed with Succinct's protocol.

        NOTE

        The Blobstream deployments below don't use the BlobstreamX circuits.

        You can find the repository for Blobstream X along with code for:

        NOTE

        Custom ranges can be requested using the BlobstreamX contract to create proofs for specific Celestia block batches. These ranges can be constructed as [latestBlock, customTargetBlock), with latestBlock as the latest block height that was committed to by the BlobstreamX contract, and latestBlock > customTargetBlock, and customTargetBlock - latestBlock <= DATA_COMMITMENT_MAX.

        Block ranges that are before the contract's latestBlock can't be proven a second time in different batches.

        More information can be found in the requestHeaderRange(...) method.

        How Blobstream X works

        As shown in the diagram below, the entrypoint for updates to the Blobstream X contract is through the SuccinctGateway smart contract, which is a simple entrypoint contract that verifies proofs (against a deployed onchain verifier for the Blobstream X circuit) and then calls the BlobstreamX.sol contract to update it. Find more information about the SuccinctGateway.

        blobstream x overview diagram draft

        NOTE

        If the Blobstream X contract is not deployed on a desired chain, it needs to be deployed before it can be used by your rollup. See the deployment documentation for more details.

        Deploy Blobstream X

        It is possible to deploy and maintain a Blobstream x instance and have the same security guarantees.

        First, you will need to create a multisig that governs the Blobstream X contract and also the function identifiers. The function identifiers can be registered in the Succinct gateway.

        Then, check the deployment documentation for how to deploy the contract.

        Then, you will need to run a relayer, which will generate the proofs and relay them to your deployed Blobstream X contract. Check the local proving documentation for more information.

        ',18),n=[l];function i(b,m,d,h,p,u){return t(),o("div",null,n)}const B=e(c,[["render",i]]);export{g as __pageData,B as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X1b.png",s="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X2b.png",g=JSON.parse('{"title":"BlobstreamX: the previous zk implementation of Blobstream","description":"What is BlobstreamX","frontmatter":{"description":"What is BlobstreamX","head":[["meta",{"name":"og:title","content":"BlobstreamX: the previous zk implementation of Blobstream | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstreamx.md","filePath":"developers/blobstreamx.md","lastUpdated":1725992025000}'),c={name:"developers/blobstreamx.md"},l=a('

        BlobstreamX: the previous zk implementation of Blobstream

        blobstream x draft diagram

        What is Blobstream X?

        Blobstream X is the previous implementation of Blobstream. It uses plonky2x to create circuits that verify the Celestia consensus and generate the corresponding proofs.

        Blobstream X is built and deployed with Succinct's protocol.

        NOTE

        The Blobstream deployments below don't use the BlobstreamX circuits.

        You can find the repository for Blobstream X along with code for:

        NOTE

        Custom ranges can be requested using the BlobstreamX contract to create proofs for specific Celestia block batches. These ranges can be constructed as [latestBlock, customTargetBlock), with latestBlock as the latest block height that was committed to by the BlobstreamX contract, and latestBlock > customTargetBlock, and customTargetBlock - latestBlock <= DATA_COMMITMENT_MAX.

        Block ranges that are before the contract's latestBlock can't be proven a second time in different batches.

        More information can be found in the requestHeaderRange(...) method.

        How Blobstream X works

        As shown in the diagram below, the entrypoint for updates to the Blobstream X contract is through the SuccinctGateway smart contract, which is a simple entrypoint contract that verifies proofs (against a deployed onchain verifier for the Blobstream X circuit) and then calls the BlobstreamX.sol contract to update it. Find more information about the SuccinctGateway.

        blobstream x overview diagram draft

        NOTE

        If the Blobstream X contract is not deployed on a desired chain, it needs to be deployed before it can be used by your rollup. See the deployment documentation for more details.

        Deploy Blobstream X

        It is possible to deploy and maintain a Blobstream x instance and have the same security guarantees.

        First, you will need to create a multisig that governs the Blobstream X contract and also the function identifiers. The function identifiers can be registered in the Succinct gateway.

        Then, check the deployment documentation for how to deploy the contract.

        Then, you will need to run a relayer, which will generate the proofs and relay them to your deployed Blobstream X contract. Check the local proving documentation for more information.

        ',18),n=[l];function i(b,m,d,h,p,u){return t(),o("div",null,n)}const B=e(c,[["render",i]]);export{g as __pageData,B as default}; diff --git a/pr-1699/assets/developers_blobstreamx.md.67c7a6c7.lean.js b/pr-1699/assets/developers_blobstreamx.md.7838cfd1.lean.js similarity index 92% rename from pr-1699/assets/developers_blobstreamx.md.67c7a6c7.lean.js rename to pr-1699/assets/developers_blobstreamx.md.7838cfd1.lean.js index e9dbc5c8f4..800a161f69 100644 --- a/pr-1699/assets/developers_blobstreamx.md.67c7a6c7.lean.js +++ b/pr-1699/assets/developers_blobstreamx.md.7838cfd1.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X1b.png",s="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X2b.png",g=JSON.parse('{"title":"BlobstreamX: the previous zk implementation of Blobstream","description":"What is BlobstreamX","frontmatter":{"description":"What is BlobstreamX","head":[["meta",{"name":"og:title","content":"BlobstreamX: the previous zk implementation of Blobstream | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstreamx.md","filePath":"developers/blobstreamx.md","lastUpdated":1725971357000}'),c={name:"developers/blobstreamx.md"},l=a("",18),n=[l];function i(b,m,d,h,p,u){return t(),o("div",null,n)}const B=e(c,[["render",i]]);export{g as __pageData,B as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X1b.png",s="/docs-preview/pr-1699/img/blobstream/Celestia_Blobstream_X2b.png",g=JSON.parse('{"title":"BlobstreamX: the previous zk implementation of Blobstream","description":"What is BlobstreamX","frontmatter":{"description":"What is BlobstreamX","head":[["meta",{"name":"og:title","content":"BlobstreamX: the previous zk implementation of Blobstream | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/blobstreamx.md","filePath":"developers/blobstreamx.md","lastUpdated":1725992025000}'),c={name:"developers/blobstreamx.md"},l=a("",18),n=[l];function i(b,m,d,h,p,u){return t(),o("div",null,n)}const B=e(c,[["render",i]]);export{g as __pageData,B as default}; diff --git a/pr-1699/assets/developers_bubs-testnet.md.c168048a.js b/pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.js similarity index 98% rename from pr-1699/assets/developers_bubs-testnet.md.c168048a.js rename to pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.js index e7ef9b7155..7faeb9b5f7 100644 --- a/pr-1699/assets/developers_bubs-testnet.md.c168048a.js +++ b/pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as s}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Bubs_Testnet.jpg",m=JSON.parse('{"title":"Bubs testnet","description":"The first testnet built with OP Stack and Celestia.","frontmatter":{"description":"The first testnet built with OP Stack and Celestia.","next":{"text":"Deploy a smart contract on Bubs testnet","link":"/developers/deploy-on-bubs"},"head":[["meta",{"name":"og:title","content":"Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/bubs-testnet.md","filePath":"developers/bubs-testnet.md","lastUpdated":1725971357000}'),o={name:"developers/bubs-testnet.md"},i=s('

        Bubs testnet

        Bubs testnet

        Bubs Testnet is a the first OP Stack testnet with Celestia underneath hosted by Caldera with support from Celestia Labs. Bubs is dedicated to providing developers with an EVM-compatible execution layer to deploy their EVM applications on.

        Built with the OP Stack and Celestia

        The Bubs Testnet is a testnet rollup, a modified version of optimism-bedrock that uses Celestia as a data availability (DA) layer. This integration can be found in the @celestiaorg/optimism repository. The testnet is hosted by Caldera, who makes it easy to launch rollups with no code required. Bubs' data is posted to Celestia on the Mocha testnet. View the namespace for Bubs on Celestia's Mocha testnet.

        Learn more about the setup of the integration in the introduction.

        Building on Bubs

        Bubs Testnet provides a robust environment for developers to test their Ethereum Virtual Machine (EVM) applications. It offers an EVM-compatible execution layer, making it an ideal platform for developers looking to build and test applications in a setting that closely mirrors an OP Stack rollup on Celestia.

        Learn more at https://bubs-sepolia.hub.caldera.xyz/.

        RPC URLs

        Remote Procedure Call (RPC) URLs are endpoints that allow developers to interact with the blockchain. They are essential for sending transactions, querying blockchain data, and performing other interactions with the blockchain.

        For the Bubs Testnet, you can connect to the following RPC URLs:

        HTTPS

        • https://bubs-sepolia.rpc.caldera.xyz/http

        WSS

        • wss://bubs-sepolia.rpc.caldera.xyz/ws

        This URL serves as the entry point to the Bubs Testnet. You can use it in your applications to connect to the testnet and interact with the smart contracts you deploy there.

        Remember, Bubs Testnet is a testing environment!

        Bridge

        Bridging is a process that enables the transfer of assets between different blockchains.

        To bridge between Ethereum Sepolia and Bubs Testnet, visit the Bubs Testnet bridge.

        Faucet

        To visit the Bubs testnet faucet, go to https://bubs-sepolia.hub.caldera.xyz/ and click the "Faucet" tab.

        Explorer

        To visit the explorer, go to https://bubs-sepolia.explorer.caldera.xyz/.

        Status

        To see the status and uptime information for Bubs, visit the status page.

        Next steps

        Now that you have a better understanding of the Bubs Testnet and its integration of OP Stack and Celestia, you can start exploring its capabilities.

        ',29),n=[i];function l(h,c,p,d,u,b){return t(),a("div",null,n)}const g=e(o,[["render",l]]);export{m as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as s}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Bubs_Testnet.jpg",m=JSON.parse('{"title":"Bubs testnet","description":"The first testnet built with OP Stack and Celestia.","frontmatter":{"description":"The first testnet built with OP Stack and Celestia.","next":{"text":"Deploy a smart contract on Bubs testnet","link":"/developers/deploy-on-bubs"},"head":[["meta",{"name":"og:title","content":"Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/bubs-testnet.md","filePath":"developers/bubs-testnet.md","lastUpdated":1725992025000}'),o={name:"developers/bubs-testnet.md"},i=s('

        Bubs testnet

        Bubs testnet

        Bubs Testnet is a the first OP Stack testnet with Celestia underneath hosted by Caldera with support from Celestia Labs. Bubs is dedicated to providing developers with an EVM-compatible execution layer to deploy their EVM applications on.

        Built with the OP Stack and Celestia

        The Bubs Testnet is a testnet rollup, a modified version of optimism-bedrock that uses Celestia as a data availability (DA) layer. This integration can be found in the @celestiaorg/optimism repository. The testnet is hosted by Caldera, who makes it easy to launch rollups with no code required. Bubs' data is posted to Celestia on the Mocha testnet. View the namespace for Bubs on Celestia's Mocha testnet.

        Learn more about the setup of the integration in the introduction.

        Building on Bubs

        Bubs Testnet provides a robust environment for developers to test their Ethereum Virtual Machine (EVM) applications. It offers an EVM-compatible execution layer, making it an ideal platform for developers looking to build and test applications in a setting that closely mirrors an OP Stack rollup on Celestia.

        Learn more at https://bubs-sepolia.hub.caldera.xyz/.

        RPC URLs

        Remote Procedure Call (RPC) URLs are endpoints that allow developers to interact with the blockchain. They are essential for sending transactions, querying blockchain data, and performing other interactions with the blockchain.

        For the Bubs Testnet, you can connect to the following RPC URLs:

        HTTPS

        • https://bubs-sepolia.rpc.caldera.xyz/http

        WSS

        • wss://bubs-sepolia.rpc.caldera.xyz/ws

        This URL serves as the entry point to the Bubs Testnet. You can use it in your applications to connect to the testnet and interact with the smart contracts you deploy there.

        Remember, Bubs Testnet is a testing environment!

        Bridge

        Bridging is a process that enables the transfer of assets between different blockchains.

        To bridge between Ethereum Sepolia and Bubs Testnet, visit the Bubs Testnet bridge.

        Faucet

        To visit the Bubs testnet faucet, go to https://bubs-sepolia.hub.caldera.xyz/ and click the "Faucet" tab.

        Explorer

        To visit the explorer, go to https://bubs-sepolia.explorer.caldera.xyz/.

        Status

        To see the status and uptime information for Bubs, visit the status page.

        Next steps

        Now that you have a better understanding of the Bubs Testnet and its integration of OP Stack and Celestia, you can start exploring its capabilities.

        ',29),n=[i];function l(h,c,p,d,u,b){return t(),a("div",null,n)}const g=e(o,[["render",l]]);export{m as __pageData,g as default}; diff --git a/pr-1699/assets/developers_bubs-testnet.md.c168048a.lean.js b/pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.lean.js similarity index 92% rename from pr-1699/assets/developers_bubs-testnet.md.c168048a.lean.js rename to pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.lean.js index de21bc163e..e7a2ed51a7 100644 --- a/pr-1699/assets/developers_bubs-testnet.md.c168048a.lean.js +++ b/pr-1699/assets/developers_bubs-testnet.md.ddf17ba1.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as s}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Bubs_Testnet.jpg",m=JSON.parse('{"title":"Bubs testnet","description":"The first testnet built with OP Stack and Celestia.","frontmatter":{"description":"The first testnet built with OP Stack and Celestia.","next":{"text":"Deploy a smart contract on Bubs testnet","link":"/developers/deploy-on-bubs"},"head":[["meta",{"name":"og:title","content":"Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/bubs-testnet.md","filePath":"developers/bubs-testnet.md","lastUpdated":1725971357000}'),o={name:"developers/bubs-testnet.md"},i=s("",29),n=[i];function l(h,c,p,d,u,b){return t(),a("div",null,n)}const g=e(o,[["render",l]]);export{m as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as s}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/Celestia_Bubs_Testnet.jpg",m=JSON.parse('{"title":"Bubs testnet","description":"The first testnet built with OP Stack and Celestia.","frontmatter":{"description":"The first testnet built with OP Stack and Celestia.","next":{"text":"Deploy a smart contract on Bubs testnet","link":"/developers/deploy-on-bubs"},"head":[["meta",{"name":"og:title","content":"Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/bubs-testnet.md","filePath":"developers/bubs-testnet.md","lastUpdated":1725992025000}'),o={name:"developers/bubs-testnet.md"},i=s("",29),n=[i];function l(h,c,p,d,u,b){return t(),a("div",null,n)}const g=e(o,[["render",l]]);export{m as __pageData,g as default}; diff --git a/pr-1699/assets/developers_build-whatever.md.4b64aa7d.js b/pr-1699/assets/developers_build-whatever.md.5677fdce.js similarity index 99% rename from pr-1699/assets/developers_build-whatever.md.4b64aa7d.js rename to pr-1699/assets/developers_build-whatever.md.5677fdce.js index 5dd7d799c9..004dc49fe7 100644 --- a/pr-1699/assets/developers_build-whatever.md.4b64aa7d.js +++ b/pr-1699/assets/developers_build-whatever.md.5677fdce.js @@ -1 +1 @@ -import{_ as d,o as l,c as r,k as t,t as i,e as p,H as e,Q as s,a as n}from"./chunks/framework.b47e54aa.js";const h="/docs-preview/pr-1699/img/da-and-validity.png";const m={name:"UrlImageButton",props:{url:String,imageSrc:String,text:String,notes:{type:String,default:""}}},b=["href"],g={class:"url-image-button"},f=["src"],y={class:"button-text"},k={key:0,class:"notes-text"};function w(c,u,o,B,T,z){return l(),r("a",{href:o.url,target:"_blank",rel:"noopener noreferrer",class:"button-link"},[t("button",g,[t("img",{src:o.imageSrc,alt:"",class:"button-icon"},null,8,f),t("span",y,i(o.text),1),o.notes?(l(),r("span",k,i(o.notes),1)):p("",!0)])],8,b)}const a=d(m,[["render",w],["__scopeId","data-v-21baf7e3"]]),_=s('

        Build whatever

        If you're a developer and want to know what the benefits of modular blockchains are for you, you’ve come to the right place. This page will give you the rundown on modular blockchains and their benefits for developers like you.

        This section provides various guides and tutorials that cover different options for deploying rollups on Celestia.

        Quickstart - Building on Celestia

        Choose a framework

        So, you’re ready to start experimenting and building on Celestia? Here are a few options that are currently available for developers.

        ',6),v={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},x=t("h3",{id:"rollups-as-a-service",tabindex:"-1"},[n("Rollups as a Service "),t("a",{class:"header-anchor",href:"#rollups-as-a-service","aria-label":'Permalink to "Rollups as a Service"'},"​")],-1),S=t("p",null,"Deploy your rollup with a RaaS provider.",-1),C={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},P=t("h3",{id:"smart-contracts",tabindex:"-1"},[n("Smart contracts "),t("a",{class:"header-anchor",href:"#smart-contracts","aria-label":'Permalink to "Smart contracts"'},"​")],-1),q=t("p",null,"Deploy your smart contracts on dedicated EVM-compatible rollups.",-1),A={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},V=s('

        What is a rollup?

        A rollup is a type of blockchain that offloads some work to a layer 1, like Celestia. Rollups host applications and process user transactions. Once those transactions get processed, they are then published to layer 1. It’s layer 1s job to order those transactions and check that they are available, at minimum.

        What is a modular blockchain?

        With blockchains there are more or less four core functions that they do.

        • Execution: transaction execution and state update.
        • Settlement: finality and dispute resolution.
        • Consensus: agreement on transaction ordering.
        • Data availability: prove data was published to the network.

        Modular blockchains specialize in one or two of these functions rather than doing all of them like a monolithic blockchain. You probably know about layer 1s and layer 2s. That’s the general idea.

        A typical example of a modular blockchain you might’ve heard of is a rollup. Rollups host smart contracts and execute transactions, much like any monolithic chain. But, the data of those transactions get sent to a layer 1 blockchain to carry out the remaining functions.

        If you want to brush up on your understanding of modular blockchains, head over to learn modular.

        Benefits of modular blockchains

        Ease of deploying a chain

        One of the goals of modular blockchains is to make it as easy to deploy a blockchain as a smart contract. There are a few unique ways that modular blockchains can significantly reduce the cost of deploying a new blockchain.

        1. No validator set is required. Rollups can deploy without sourcing their own set of validators or sequencers.
        2. Inherit security from the start. Rollups don’t need to build all their security from scratch.
        3. Any part of the stack can be delegated. Development time can be reduced by outsourcing functions of the rollup to external providers.

        All in all, builders will be able to outsource as much of the stack as they need. Deploying a new blockchain will be as simple as clicking a few options to initialize a production-ready rollup.

        Scaling

        Of course, a much higher scale is necessary if we want to support many more users. And modular blockchains use some new innovative technologies that can help us get there.

        • Data availability sampling enables modular blockchains like Celestia to scale data availability with the number of light nodes - that means more capacity for rollups.
        • Fraud and validity proofs make rollups vastly more efficient to verify. Nodes only need to verify a small proof of transaction validity (validity proof) or assume transactions are valid by default (fraud proof). This means rollups don’t require every node in the network to re-execute every transaction.

        image

        • Decoupling execution from consensus lets developers define the VM that best fits the scaling needs of their application.
        • Separating applications across multiple rollups isolates congestion. If an application congests the execution capacity of one rollup, all other rollups remain unaffected in their execution capacity.

        All these scaling properties combined make new types of applications and features possible, like onchain gaming, dynamic metadata, and ephemeral rollups, to name a few.

        Customizability

        By design, modular blockchains don’t lock in any feature set. They promote experimentation and customization.

        Remember how decoupling execution from consensus enables VM customizability? Well, rollups are the execution component. Applications can run on their own rollup and adjust the VM to maximize their application's performance. Developers have that flexibility because Celestia's execution logic doesn't restrict rollups.

        Basically, rollups can be customized to integrate any new or existing VM stack.

        With existing rollup frameworks, developers can run rollup testnets using the EVM or Cosmos SDK. In the future, one can imagine a variety of VMs that rollup frameworks support, providing developers with more out-of-the-box options for their applications.

        Some customizations that could be made to a rollup's VM include custom precompiles, changing transaction processing from sequential to parallel, or adding support for private smart contracts.

        All of this only scratches the surface.

        ',26),R=JSON.parse('{"title":"Build whatever","description":"Advantages of building on modular blockchains like Celestia.","frontmatter":{"description":"Advantages of building on modular blockchains like Celestia.","head":[["meta",{"name":"og:title","content":"Build whatever | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/build-whatever.md","filePath":"developers/build-whatever.md","lastUpdated":1725971357000}'),O={name:"developers/build-whatever.md"},I=Object.assign(O,{setup(c){return(u,o)=>(l(),r("div",null,[_,t("div",v,[e(a,{url:"/developers/intro-to-op-stack",imageSrc:"/build/opstack.webp",text:"OP Stack",notes:"EVM",target:"_self",alt:"OP Stack logo","aria-label":"OP Stack"}),e(a,{url:"/developers/arbitrum-integration",imageSrc:"/build/arbitrum.webp",text:"Arbitrum Orbit",notes:"EVM",target:"_self",alt:"Arbitrum logo","aria-label":"Arbitrum"}),e(a,{url:"https://github.com/Sovereign-Labs/sovereign-sdk/tree/stable/examples/demo-rollup#demo-rollup",imageSrc:"/build/sovereign.webp",text:"Sovereign SDK",notes:"Sovereign",alt:"Sovereign logo","aria-label":"Sovereign"}),e(a,{url:"https://docs.dymension.xyz/build/overview/",imageSrc:"/build/dymension.webp",text:"Dymension",alt:"Dymension logo","aria-label":"Dymension"}),e(a,{url:"https://docs.stf.xyz",imageSrc:"/build/stackr.webp",text:"Stackr",alt:"Stackr logo","aria-label":"Stackr"}),e(a,{url:"https://rollkit.dev",imageSrc:"/build/rollkit.webp",text:"Rollkit",notes:"Sovereign",alt:"Rollkit logo","aria-label":"Rollkit"})]),x,S,t("div",C,[e(a,{url:"https://altlayer.io/raas/",imageSrc:"/build/altlayer.webp",text:"AltLayer",notes:"Orbit, OP Stack",alt:"AltLayer logo","aria-label":"AltLayer"}),e(a,{url:"https://www.astria.org/",imageSrc:"/build/astria.webp",text:"Astria",alt:"Astria logo","aria-label":"Astria"}),e(a,{url:"https://www.caldera.xyz/",imageSrc:"/build/caldera.webp",text:"Caldera",notes:"Orbit, OP Stack",alt:"Caldera logo","aria-label":"Caldera"}),e(a,{url:"https://conduit.xyz/",imageSrc:"/build/conduit.webp",text:"Conduit",notes:"Orbit, OP Stack",alt:"Conduit logo","aria-label":"Conduit"}),e(a,{url:"https://www.gelato.network/",imageSrc:"/build/gelato.webp",text:"Gelato",notes:"Orbit, OP Stack",alt:"Gelato logo","aria-label":"Gelato"}),e(a,{url:"https://www.karnot.xyz/",imageSrc:"/build/karnot.webp",text:"Karnot",notes:"Starknet",alt:"Karnot logo","aria-label":"Karnot"}),e(a,{url:"https://docs.vistara.dev/",imageSrc:"/build/vistara.webp",text:"Vistara",alt:"Vistara logo","aria-label":"Vistara"}),e(a,{url:"https://www.zeeve.io/",imageSrc:"/build/zeeve.webp",text:"Zeeve",notes:"Orbit, OP Stack",alt:"Zeeve logo","aria-label":"Zeeve"})]),P,q,t("div",A,[e(a,{url:"https://bubstestnet.com/",imageSrc:"/build/caldera.webp",text:"Bubs testnet",notes:"OP Stack",alt:"Caldera logo","aria-label":"Caldera Bubs testnet"}),e(a,{url:"https://raas.gelato.network/rollups/details/public/opcelestia-raspberry",imageSrc:"/build/gelato.webp",text:"Raspberry testnet",notes:"OP Stack",alt:"Gelato logo","aria-label":"Gelato Raspberry testnet"})]),V]))}});export{R as __pageData,I as default}; +import{_ as d,o as l,c as r,k as t,t as i,e as p,H as e,Q as s,a as n}from"./chunks/framework.b47e54aa.js";const h="/docs-preview/pr-1699/img/da-and-validity.png";const m={name:"UrlImageButton",props:{url:String,imageSrc:String,text:String,notes:{type:String,default:""}}},b=["href"],g={class:"url-image-button"},f=["src"],y={class:"button-text"},k={key:0,class:"notes-text"};function w(c,u,o,B,T,z){return l(),r("a",{href:o.url,target:"_blank",rel:"noopener noreferrer",class:"button-link"},[t("button",g,[t("img",{src:o.imageSrc,alt:"",class:"button-icon"},null,8,f),t("span",y,i(o.text),1),o.notes?(l(),r("span",k,i(o.notes),1)):p("",!0)])],8,b)}const a=d(m,[["render",w],["__scopeId","data-v-21baf7e3"]]),_=s('

        Build whatever

        If you're a developer and want to know what the benefits of modular blockchains are for you, you’ve come to the right place. This page will give you the rundown on modular blockchains and their benefits for developers like you.

        This section provides various guides and tutorials that cover different options for deploying rollups on Celestia.

        Quickstart - Building on Celestia

        Choose a framework

        So, you’re ready to start experimenting and building on Celestia? Here are a few options that are currently available for developers.

        ',6),v={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},x=t("h3",{id:"rollups-as-a-service",tabindex:"-1"},[n("Rollups as a Service "),t("a",{class:"header-anchor",href:"#rollups-as-a-service","aria-label":'Permalink to "Rollups as a Service"'},"​")],-1),S=t("p",null,"Deploy your rollup with a RaaS provider.",-1),C={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},P=t("h3",{id:"smart-contracts",tabindex:"-1"},[n("Smart contracts "),t("a",{class:"header-anchor",href:"#smart-contracts","aria-label":'Permalink to "Smart contracts"'},"​")],-1),q=t("p",null,"Deploy your smart contracts on dedicated EVM-compatible rollups.",-1),A={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},V=s('

        What is a rollup?

        A rollup is a type of blockchain that offloads some work to a layer 1, like Celestia. Rollups host applications and process user transactions. Once those transactions get processed, they are then published to layer 1. It’s layer 1s job to order those transactions and check that they are available, at minimum.

        What is a modular blockchain?

        With blockchains there are more or less four core functions that they do.

        • Execution: transaction execution and state update.
        • Settlement: finality and dispute resolution.
        • Consensus: agreement on transaction ordering.
        • Data availability: prove data was published to the network.

        Modular blockchains specialize in one or two of these functions rather than doing all of them like a monolithic blockchain. You probably know about layer 1s and layer 2s. That’s the general idea.

        A typical example of a modular blockchain you might’ve heard of is a rollup. Rollups host smart contracts and execute transactions, much like any monolithic chain. But, the data of those transactions get sent to a layer 1 blockchain to carry out the remaining functions.

        If you want to brush up on your understanding of modular blockchains, head over to learn modular.

        Benefits of modular blockchains

        Ease of deploying a chain

        One of the goals of modular blockchains is to make it as easy to deploy a blockchain as a smart contract. There are a few unique ways that modular blockchains can significantly reduce the cost of deploying a new blockchain.

        1. No validator set is required. Rollups can deploy without sourcing their own set of validators or sequencers.
        2. Inherit security from the start. Rollups don’t need to build all their security from scratch.
        3. Any part of the stack can be delegated. Development time can be reduced by outsourcing functions of the rollup to external providers.

        All in all, builders will be able to outsource as much of the stack as they need. Deploying a new blockchain will be as simple as clicking a few options to initialize a production-ready rollup.

        Scaling

        Of course, a much higher scale is necessary if we want to support many more users. And modular blockchains use some new innovative technologies that can help us get there.

        • Data availability sampling enables modular blockchains like Celestia to scale data availability with the number of light nodes - that means more capacity for rollups.
        • Fraud and validity proofs make rollups vastly more efficient to verify. Nodes only need to verify a small proof of transaction validity (validity proof) or assume transactions are valid by default (fraud proof). This means rollups don’t require every node in the network to re-execute every transaction.

        image

        • Decoupling execution from consensus lets developers define the VM that best fits the scaling needs of their application.
        • Separating applications across multiple rollups isolates congestion. If an application congests the execution capacity of one rollup, all other rollups remain unaffected in their execution capacity.

        All these scaling properties combined make new types of applications and features possible, like onchain gaming, dynamic metadata, and ephemeral rollups, to name a few.

        Customizability

        By design, modular blockchains don’t lock in any feature set. They promote experimentation and customization.

        Remember how decoupling execution from consensus enables VM customizability? Well, rollups are the execution component. Applications can run on their own rollup and adjust the VM to maximize their application's performance. Developers have that flexibility because Celestia's execution logic doesn't restrict rollups.

        Basically, rollups can be customized to integrate any new or existing VM stack.

        With existing rollup frameworks, developers can run rollup testnets using the EVM or Cosmos SDK. In the future, one can imagine a variety of VMs that rollup frameworks support, providing developers with more out-of-the-box options for their applications.

        Some customizations that could be made to a rollup's VM include custom precompiles, changing transaction processing from sequential to parallel, or adding support for private smart contracts.

        All of this only scratches the surface.

        ',26),R=JSON.parse('{"title":"Build whatever","description":"Advantages of building on modular blockchains like Celestia.","frontmatter":{"description":"Advantages of building on modular blockchains like Celestia.","head":[["meta",{"name":"og:title","content":"Build whatever | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/build-whatever.md","filePath":"developers/build-whatever.md","lastUpdated":1725992025000}'),O={name:"developers/build-whatever.md"},I=Object.assign(O,{setup(c){return(u,o)=>(l(),r("div",null,[_,t("div",v,[e(a,{url:"/developers/intro-to-op-stack",imageSrc:"/build/opstack.webp",text:"OP Stack",notes:"EVM",target:"_self",alt:"OP Stack logo","aria-label":"OP Stack"}),e(a,{url:"/developers/arbitrum-integration",imageSrc:"/build/arbitrum.webp",text:"Arbitrum Orbit",notes:"EVM",target:"_self",alt:"Arbitrum logo","aria-label":"Arbitrum"}),e(a,{url:"https://github.com/Sovereign-Labs/sovereign-sdk/tree/stable/examples/demo-rollup#demo-rollup",imageSrc:"/build/sovereign.webp",text:"Sovereign SDK",notes:"Sovereign",alt:"Sovereign logo","aria-label":"Sovereign"}),e(a,{url:"https://docs.dymension.xyz/build/overview/",imageSrc:"/build/dymension.webp",text:"Dymension",alt:"Dymension logo","aria-label":"Dymension"}),e(a,{url:"https://docs.stf.xyz",imageSrc:"/build/stackr.webp",text:"Stackr",alt:"Stackr logo","aria-label":"Stackr"}),e(a,{url:"https://rollkit.dev",imageSrc:"/build/rollkit.webp",text:"Rollkit",notes:"Sovereign",alt:"Rollkit logo","aria-label":"Rollkit"})]),x,S,t("div",C,[e(a,{url:"https://altlayer.io/raas/",imageSrc:"/build/altlayer.webp",text:"AltLayer",notes:"Orbit, OP Stack",alt:"AltLayer logo","aria-label":"AltLayer"}),e(a,{url:"https://www.astria.org/",imageSrc:"/build/astria.webp",text:"Astria",alt:"Astria logo","aria-label":"Astria"}),e(a,{url:"https://www.caldera.xyz/",imageSrc:"/build/caldera.webp",text:"Caldera",notes:"Orbit, OP Stack",alt:"Caldera logo","aria-label":"Caldera"}),e(a,{url:"https://conduit.xyz/",imageSrc:"/build/conduit.webp",text:"Conduit",notes:"Orbit, OP Stack",alt:"Conduit logo","aria-label":"Conduit"}),e(a,{url:"https://www.gelato.network/",imageSrc:"/build/gelato.webp",text:"Gelato",notes:"Orbit, OP Stack",alt:"Gelato logo","aria-label":"Gelato"}),e(a,{url:"https://www.karnot.xyz/",imageSrc:"/build/karnot.webp",text:"Karnot",notes:"Starknet",alt:"Karnot logo","aria-label":"Karnot"}),e(a,{url:"https://docs.vistara.dev/",imageSrc:"/build/vistara.webp",text:"Vistara",alt:"Vistara logo","aria-label":"Vistara"}),e(a,{url:"https://www.zeeve.io/",imageSrc:"/build/zeeve.webp",text:"Zeeve",notes:"Orbit, OP Stack",alt:"Zeeve logo","aria-label":"Zeeve"})]),P,q,t("div",A,[e(a,{url:"https://bubstestnet.com/",imageSrc:"/build/caldera.webp",text:"Bubs testnet",notes:"OP Stack",alt:"Caldera logo","aria-label":"Caldera Bubs testnet"}),e(a,{url:"https://raas.gelato.network/rollups/details/public/opcelestia-raspberry",imageSrc:"/build/gelato.webp",text:"Raspberry testnet",notes:"OP Stack",alt:"Gelato logo","aria-label":"Gelato Raspberry testnet"})]),V]))}});export{R as __pageData,I as default}; diff --git a/pr-1699/assets/developers_build-whatever.md.4b64aa7d.lean.js b/pr-1699/assets/developers_build-whatever.md.5677fdce.lean.js similarity index 98% rename from pr-1699/assets/developers_build-whatever.md.4b64aa7d.lean.js rename to pr-1699/assets/developers_build-whatever.md.5677fdce.lean.js index fa8c93b7a4..3d1b0aa4bf 100644 --- a/pr-1699/assets/developers_build-whatever.md.4b64aa7d.lean.js +++ b/pr-1699/assets/developers_build-whatever.md.5677fdce.lean.js @@ -1 +1 @@ -import{_ as d,o as l,c as r,k as t,t as i,e as p,H as e,Q as s,a as n}from"./chunks/framework.b47e54aa.js";const h="/docs-preview/pr-1699/img/da-and-validity.png";const m={name:"UrlImageButton",props:{url:String,imageSrc:String,text:String,notes:{type:String,default:""}}},b=["href"],g={class:"url-image-button"},f=["src"],y={class:"button-text"},k={key:0,class:"notes-text"};function w(c,u,o,B,T,z){return l(),r("a",{href:o.url,target:"_blank",rel:"noopener noreferrer",class:"button-link"},[t("button",g,[t("img",{src:o.imageSrc,alt:"",class:"button-icon"},null,8,f),t("span",y,i(o.text),1),o.notes?(l(),r("span",k,i(o.notes),1)):p("",!0)])],8,b)}const a=d(m,[["render",w],["__scopeId","data-v-21baf7e3"]]),_=s("",6),v={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},x=t("h3",{id:"rollups-as-a-service",tabindex:"-1"},[n("Rollups as a Service "),t("a",{class:"header-anchor",href:"#rollups-as-a-service","aria-label":'Permalink to "Rollups as a Service"'},"​")],-1),S=t("p",null,"Deploy your rollup with a RaaS provider.",-1),C={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},P=t("h3",{id:"smart-contracts",tabindex:"-1"},[n("Smart contracts "),t("a",{class:"header-anchor",href:"#smart-contracts","aria-label":'Permalink to "Smart contracts"'},"​")],-1),q=t("p",null,"Deploy your smart contracts on dedicated EVM-compatible rollups.",-1),A={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},V=s("",26),R=JSON.parse('{"title":"Build whatever","description":"Advantages of building on modular blockchains like Celestia.","frontmatter":{"description":"Advantages of building on modular blockchains like Celestia.","head":[["meta",{"name":"og:title","content":"Build whatever | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/build-whatever.md","filePath":"developers/build-whatever.md","lastUpdated":1725971357000}'),O={name:"developers/build-whatever.md"},I=Object.assign(O,{setup(c){return(u,o)=>(l(),r("div",null,[_,t("div",v,[e(a,{url:"/developers/intro-to-op-stack",imageSrc:"/build/opstack.webp",text:"OP Stack",notes:"EVM",target:"_self",alt:"OP Stack logo","aria-label":"OP Stack"}),e(a,{url:"/developers/arbitrum-integration",imageSrc:"/build/arbitrum.webp",text:"Arbitrum Orbit",notes:"EVM",target:"_self",alt:"Arbitrum logo","aria-label":"Arbitrum"}),e(a,{url:"https://github.com/Sovereign-Labs/sovereign-sdk/tree/stable/examples/demo-rollup#demo-rollup",imageSrc:"/build/sovereign.webp",text:"Sovereign SDK",notes:"Sovereign",alt:"Sovereign logo","aria-label":"Sovereign"}),e(a,{url:"https://docs.dymension.xyz/build/overview/",imageSrc:"/build/dymension.webp",text:"Dymension",alt:"Dymension logo","aria-label":"Dymension"}),e(a,{url:"https://docs.stf.xyz",imageSrc:"/build/stackr.webp",text:"Stackr",alt:"Stackr logo","aria-label":"Stackr"}),e(a,{url:"https://rollkit.dev",imageSrc:"/build/rollkit.webp",text:"Rollkit",notes:"Sovereign",alt:"Rollkit logo","aria-label":"Rollkit"})]),x,S,t("div",C,[e(a,{url:"https://altlayer.io/raas/",imageSrc:"/build/altlayer.webp",text:"AltLayer",notes:"Orbit, OP Stack",alt:"AltLayer logo","aria-label":"AltLayer"}),e(a,{url:"https://www.astria.org/",imageSrc:"/build/astria.webp",text:"Astria",alt:"Astria logo","aria-label":"Astria"}),e(a,{url:"https://www.caldera.xyz/",imageSrc:"/build/caldera.webp",text:"Caldera",notes:"Orbit, OP Stack",alt:"Caldera logo","aria-label":"Caldera"}),e(a,{url:"https://conduit.xyz/",imageSrc:"/build/conduit.webp",text:"Conduit",notes:"Orbit, OP Stack",alt:"Conduit logo","aria-label":"Conduit"}),e(a,{url:"https://www.gelato.network/",imageSrc:"/build/gelato.webp",text:"Gelato",notes:"Orbit, OP Stack",alt:"Gelato logo","aria-label":"Gelato"}),e(a,{url:"https://www.karnot.xyz/",imageSrc:"/build/karnot.webp",text:"Karnot",notes:"Starknet",alt:"Karnot logo","aria-label":"Karnot"}),e(a,{url:"https://docs.vistara.dev/",imageSrc:"/build/vistara.webp",text:"Vistara",alt:"Vistara logo","aria-label":"Vistara"}),e(a,{url:"https://www.zeeve.io/",imageSrc:"/build/zeeve.webp",text:"Zeeve",notes:"Orbit, OP Stack",alt:"Zeeve logo","aria-label":"Zeeve"})]),P,q,t("div",A,[e(a,{url:"https://bubstestnet.com/",imageSrc:"/build/caldera.webp",text:"Bubs testnet",notes:"OP Stack",alt:"Caldera logo","aria-label":"Caldera Bubs testnet"}),e(a,{url:"https://raas.gelato.network/rollups/details/public/opcelestia-raspberry",imageSrc:"/build/gelato.webp",text:"Raspberry testnet",notes:"OP Stack",alt:"Gelato logo","aria-label":"Gelato Raspberry testnet"})]),V]))}});export{R as __pageData,I as default}; +import{_ as d,o as l,c as r,k as t,t as i,e as p,H as e,Q as s,a as n}from"./chunks/framework.b47e54aa.js";const h="/docs-preview/pr-1699/img/da-and-validity.png";const m={name:"UrlImageButton",props:{url:String,imageSrc:String,text:String,notes:{type:String,default:""}}},b=["href"],g={class:"url-image-button"},f=["src"],y={class:"button-text"},k={key:0,class:"notes-text"};function w(c,u,o,B,T,z){return l(),r("a",{href:o.url,target:"_blank",rel:"noopener noreferrer",class:"button-link"},[t("button",g,[t("img",{src:o.imageSrc,alt:"",class:"button-icon"},null,8,f),t("span",y,i(o.text),1),o.notes?(l(),r("span",k,i(o.notes),1)):p("",!0)])],8,b)}const a=d(m,[["render",w],["__scopeId","data-v-21baf7e3"]]),_=s("",6),v={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},x=t("h3",{id:"rollups-as-a-service",tabindex:"-1"},[n("Rollups as a Service "),t("a",{class:"header-anchor",href:"#rollups-as-a-service","aria-label":'Permalink to "Rollups as a Service"'},"​")],-1),S=t("p",null,"Deploy your rollup with a RaaS provider.",-1),C={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},P=t("h3",{id:"smart-contracts",tabindex:"-1"},[n("Smart contracts "),t("a",{class:"header-anchor",href:"#smart-contracts","aria-label":'Permalink to "Smart contracts"'},"​")],-1),q=t("p",null,"Deploy your smart contracts on dedicated EVM-compatible rollups.",-1),A={style:{display:"flex","flex-wrap":"wrap","justify-content":"center","align-items":"center","grid-template-columns":"repeat(auto-fill, minmax(150px, 1fr))",gap:"20px"}},V=s("",26),R=JSON.parse('{"title":"Build whatever","description":"Advantages of building on modular blockchains like Celestia.","frontmatter":{"description":"Advantages of building on modular blockchains like Celestia.","head":[["meta",{"name":"og:title","content":"Build whatever | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/build-whatever.md","filePath":"developers/build-whatever.md","lastUpdated":1725992025000}'),O={name:"developers/build-whatever.md"},I=Object.assign(O,{setup(c){return(u,o)=>(l(),r("div",null,[_,t("div",v,[e(a,{url:"/developers/intro-to-op-stack",imageSrc:"/build/opstack.webp",text:"OP Stack",notes:"EVM",target:"_self",alt:"OP Stack logo","aria-label":"OP Stack"}),e(a,{url:"/developers/arbitrum-integration",imageSrc:"/build/arbitrum.webp",text:"Arbitrum Orbit",notes:"EVM",target:"_self",alt:"Arbitrum logo","aria-label":"Arbitrum"}),e(a,{url:"https://github.com/Sovereign-Labs/sovereign-sdk/tree/stable/examples/demo-rollup#demo-rollup",imageSrc:"/build/sovereign.webp",text:"Sovereign SDK",notes:"Sovereign",alt:"Sovereign logo","aria-label":"Sovereign"}),e(a,{url:"https://docs.dymension.xyz/build/overview/",imageSrc:"/build/dymension.webp",text:"Dymension",alt:"Dymension logo","aria-label":"Dymension"}),e(a,{url:"https://docs.stf.xyz",imageSrc:"/build/stackr.webp",text:"Stackr",alt:"Stackr logo","aria-label":"Stackr"}),e(a,{url:"https://rollkit.dev",imageSrc:"/build/rollkit.webp",text:"Rollkit",notes:"Sovereign",alt:"Rollkit logo","aria-label":"Rollkit"})]),x,S,t("div",C,[e(a,{url:"https://altlayer.io/raas/",imageSrc:"/build/altlayer.webp",text:"AltLayer",notes:"Orbit, OP Stack",alt:"AltLayer logo","aria-label":"AltLayer"}),e(a,{url:"https://www.astria.org/",imageSrc:"/build/astria.webp",text:"Astria",alt:"Astria logo","aria-label":"Astria"}),e(a,{url:"https://www.caldera.xyz/",imageSrc:"/build/caldera.webp",text:"Caldera",notes:"Orbit, OP Stack",alt:"Caldera logo","aria-label":"Caldera"}),e(a,{url:"https://conduit.xyz/",imageSrc:"/build/conduit.webp",text:"Conduit",notes:"Orbit, OP Stack",alt:"Conduit logo","aria-label":"Conduit"}),e(a,{url:"https://www.gelato.network/",imageSrc:"/build/gelato.webp",text:"Gelato",notes:"Orbit, OP Stack",alt:"Gelato logo","aria-label":"Gelato"}),e(a,{url:"https://www.karnot.xyz/",imageSrc:"/build/karnot.webp",text:"Karnot",notes:"Starknet",alt:"Karnot logo","aria-label":"Karnot"}),e(a,{url:"https://docs.vistara.dev/",imageSrc:"/build/vistara.webp",text:"Vistara",alt:"Vistara logo","aria-label":"Vistara"}),e(a,{url:"https://www.zeeve.io/",imageSrc:"/build/zeeve.webp",text:"Zeeve",notes:"Orbit, OP Stack",alt:"Zeeve logo","aria-label":"Zeeve"})]),P,q,t("div",A,[e(a,{url:"https://bubstestnet.com/",imageSrc:"/build/caldera.webp",text:"Bubs testnet",notes:"OP Stack",alt:"Caldera logo","aria-label":"Caldera Bubs testnet"}),e(a,{url:"https://raas.gelato.network/rollups/details/public/opcelestia-raspberry",imageSrc:"/build/gelato.webp",text:"Raspberry testnet",notes:"OP Stack",alt:"Gelato logo","aria-label":"Gelato Raspberry testnet"})]),V]))}});export{R as __pageData,I as default}; diff --git a/pr-1699/assets/developers_celestia-node-key.md.93827487.js b/pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.js similarity index 98% rename from pr-1699/assets/developers_celestia-node-key.md.93827487.js rename to pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.js index 1e70810293..4dbc796edf 100644 --- a/pr-1699/assets/developers_celestia-node-key.md.93827487.js +++ b/pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.js @@ -4,19 +4,19 @@ import{m as o}from"./chunks/mocha_versions.7704b055.js";import{o as p,c as t,k a make cel-key
        # dumps binary in current working directory, accessible via \`./cel-key\`
         make cel-key

        or

        sh
        # installs binary in GOBIN path, accessible via \`cel-key\`
         make install-key
        # installs binary in GOBIN path, accessible via \`cel-key\`
        -make install-key

        For the purpose of this guide, we will use the make cel-key command.

        Steps for generating node keys

        To generate a key for a Celestia node, select the tab for your node type:

        TIP

        You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

        bash
        ./cel-key add <key-name> --keyring-backend test --node.type bridge \\
        +make install-key

        For the purpose of this guide, we will use the make cel-key command.

        Steps for generating node keys

        To generate a key for a Celestia node, select the tab for your node type:

        TIP

        You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

        bash
        ./cel-key add <key-name> --keyring-backend test --node.type bridge \\
           --p2p.network <network>
        ./cel-key add <key-name> --keyring-backend test --node.type bridge \\
           --p2p.network <network>
        bash
        ./cel-key add <key-name> --keyring-backend test --node.type full \\
           --p2p.network <network>
        ./cel-key add <key-name> --keyring-backend test --node.type full \\
           --p2p.network <network>
        bash
        ./cel-key add <key-name> --keyring-backend test --node.type light \\
           --p2p.network <network>
        ./cel-key add <key-name> --keyring-backend test --node.type light \\
        -  --p2p.network <network>

        This will load the key <key-name> into the directory of the node.

        Further flags you can use to customize your key are the following:

        • --p2p.network: Specifies which network you want the key for. Values are arabica and mocha. Please note the default network will be mocha.

        Keep in mind that your celestia-node will only pick up keys that are inside the default directory under /keys so you should make sure to point cel-key utility to the correct directory via the p2p.network or home flags if you have specified a custom directory or network other than Arabica, Mocha, or Mainnet Beta.

        Also keep in mind that if you do not specify a network with --p2p.network, the default one will always be celestia (Mainnet Beta).

        Steps for exporting node keys

        You can export a private key from the local keyring in encrypted and ASCII-armored format.

        bash
        ./cel-key export <key-name> --keyring-backend test --node.type bridge \\
        +  --p2p.network <network>

        This will load the key <key-name> into the directory of the node.

        Further flags you can use to customize your key are the following:

        • --p2p.network: Specifies which network you want the key for. Values are arabica and mocha. Please note the default network will be mocha.

        Keep in mind that your celestia-node will only pick up keys that are inside the default directory under /keys so you should make sure to point cel-key utility to the correct directory via the p2p.network or home flags if you have specified a custom directory or network other than Arabica, Mocha, or Mainnet Beta.

        Also keep in mind that if you do not specify a network with --p2p.network, the default one will always be celestia (Mainnet Beta).

        Steps for exporting node keys

        You can export a private key from the local keyring in encrypted and ASCII-armored format.

        bash
        ./cel-key export <key-name> --keyring-backend test --node.type bridge \\
           --p2p.network <network>
        ./cel-key export <key-name> --keyring-backend test --node.type bridge \\
           --p2p.network <network>
        bash
        ./cel-key export <key-name> --keyring-backend test --node.type full \\
           --p2p.network <network>
        ./cel-key export <key-name> --keyring-backend test --node.type full \\
           --p2p.network <network>
        bash
        ./cel-key export <key-name> --keyring-backend test --node.type light \\
           --p2p.network <network>
        ./cel-key export <key-name> --keyring-backend test --node.type light \\
        -  --p2p.network <network>

        Steps for importing node keys

        To import from a mnemonic, use the following command, then enter your bip39 mnemonic:

        bash
        ./cel-key add <key-name> --recover --keyring-backend test \\
        +  --p2p.network <network>

        Steps for importing node keys

        To import from a mnemonic, use the following command, then enter your bip39 mnemonic:

        bash
        ./cel-key add <key-name> --recover --keyring-backend test \\
           --node.type bridge --p2p.network <network>
        ./cel-key add <key-name> --recover --keyring-backend test \\
           --node.type bridge --p2p.network <network>
        bash
        ./cel-key add <key-name> --recover --keyring-backend test \\
           --node.type full --p2p.network <network>
        ./cel-key add <key-name> --recover --keyring-backend test \\
        @@ -56,7 +56,7 @@ import{m as o}from"./chunks/mocha_versions.7704b055.js";import{o as p,c as t,k a
         - address: celestia1wkhyhr7ngf0ayqlpnsnxg4d72hfs5453dvunm9
           name: my_celes_key
           pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A1/NsoY0RGL7Hqt4VWLg441GQKJsZ2fBUnZXipgns8oV"}'
        -  type: local
        `,24),S=JSON.parse('{"title":"Create a wallet with celestia-node","description":"Use the cel-key utility to generate a wallet on celestia-node.","frontmatter":{"description":"Use the cel-key utility to generate a wallet on celestia-node.","prev":{"text":"New Blobstream X deployments","link":"/developers/blobstream-x-deploy"},"head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/celestia-node-key.md","filePath":"developers/celestia-node-key.md","lastUpdated":1725971357000}'),w={name:"developers/celestia-node-key.md"},P=Object.assign(w,{setup(A){return(f,D)=>(p(),t("div",null,[c,s("div",r,[y,i,s("pre",E,[s("code",null,[d,n(` + type: local
        `,24),S=JSON.parse('{"title":"Create a wallet with celestia-node","description":"Use the cel-key utility to generate a wallet on celestia-node.","frontmatter":{"description":"Use the cel-key utility to generate a wallet on celestia-node.","prev":{"text":"New Blobstream X deployments","link":"/developers/blobstream-x-deploy"},"head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/celestia-node-key.md","filePath":"developers/celestia-node-key.md","lastUpdated":1725992025000}'),w={name:"developers/celestia-node-key.md"},P=Object.assign(w,{setup(A){return(f,D)=>(p(),t("div",null,[c,s("div",r,[y,i,s("pre",E,[s("code",null,[d,n(` `),s("span",F,[s("span",h,"ghcr.io/celestiaorg/celestia-node:"+l(e(o)["node-latest-tag"])+" ",1),g]),n(` `),k])]),s("pre",u,[s("code",null,[C,n(` `),s("span",b,[s("span",v,"ghcr.io/celestiaorg/celestia-node:"+l(e(o)["node-latest-tag"])+" ",1),m]),n(` diff --git a/pr-1699/assets/developers_celestia-node-key.md.93827487.lean.js b/pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.lean.js similarity index 96% rename from pr-1699/assets/developers_celestia-node-key.md.93827487.lean.js rename to pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.lean.js index 4b3cbf0c40..bae0084f9f 100644 --- a/pr-1699/assets/developers_celestia-node-key.md.93827487.lean.js +++ b/pr-1699/assets/developers_celestia-node-key.md.fe2dab0d.lean.js @@ -1,4 +1,4 @@ -import{m as o}from"./chunks/mocha_versions.7704b055.js";import{o as p,c as t,k as s,a as n,t as l,l as e,Q as a}from"./chunks/framework.b47e54aa.js";const c=a("",37),r={class:"language-bash vp-adaptive-theme"},y=s("button",{title:"Copy Code",class:"copy"},null,-1),i=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},d=a("",1),F={class:"line"},h={style:{color:"#E1E4E8"}},g=a("",7),k=a("",1),u={class:"shiki github-light vp-code-light"},C=a("",1),b={class:"line"},v={style:{color:"#24292E"}},m=a("",7),B=a("",1),_=a("",24),S=JSON.parse('{"title":"Create a wallet with celestia-node","description":"Use the cel-key utility to generate a wallet on celestia-node.","frontmatter":{"description":"Use the cel-key utility to generate a wallet on celestia-node.","prev":{"text":"New Blobstream X deployments","link":"/developers/blobstream-x-deploy"},"head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/celestia-node-key.md","filePath":"developers/celestia-node-key.md","lastUpdated":1725971357000}'),w={name:"developers/celestia-node-key.md"},P=Object.assign(w,{setup(A){return(f,D)=>(p(),t("div",null,[c,s("div",r,[y,i,s("pre",E,[s("code",null,[d,n(` +import{m as o}from"./chunks/mocha_versions.7704b055.js";import{o as p,c as t,k as s,a as n,t as l,l as e,Q as a}from"./chunks/framework.b47e54aa.js";const c=a("",37),r={class:"language-bash vp-adaptive-theme"},y=s("button",{title:"Copy Code",class:"copy"},null,-1),i=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},d=a("",1),F={class:"line"},h={style:{color:"#E1E4E8"}},g=a("",7),k=a("",1),u={class:"shiki github-light vp-code-light"},C=a("",1),b={class:"line"},v={style:{color:"#24292E"}},m=a("",7),B=a("",1),_=a("",24),S=JSON.parse('{"title":"Create a wallet with celestia-node","description":"Use the cel-key utility to generate a wallet on celestia-node.","frontmatter":{"description":"Use the cel-key utility to generate a wallet on celestia-node.","prev":{"text":"New Blobstream X deployments","link":"/developers/blobstream-x-deploy"},"head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/celestia-node-key.md","filePath":"developers/celestia-node-key.md","lastUpdated":1725992025000}'),w={name:"developers/celestia-node-key.md"},P=Object.assign(w,{setup(A){return(f,D)=>(p(),t("div",null,[c,s("div",r,[y,i,s("pre",E,[s("code",null,[d,n(` `),s("span",F,[s("span",h,"ghcr.io/celestiaorg/celestia-node:"+l(e(o)["node-latest-tag"])+" ",1),g]),n(` `),k])]),s("pre",u,[s("code",null,[C,n(` `),s("span",b,[s("span",v,"ghcr.io/celestiaorg/celestia-node:"+l(e(o)["node-latest-tag"])+" ",1),m]),n(` diff --git a/pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.js b/pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.js similarity index 99% rename from pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.js rename to pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.js index fc350cb04a..411007bccb 100644 --- a/pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.js +++ b/pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract on Bubs testnet","description":"","frontmatter":{"prev":{"text":"Bubs testnet","link":"/developers/bubs-testnet"},"head":[["meta",{"name":"og:title","content":"Deploy a smart contract on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/deploy-on-bubs.md","filePath":"developers/deploy-on-bubs.md","lastUpdated":1725971357000}'),p={name:"developers/deploy-on-bubs.md"},o=l(`

        Deploy a smart contract on Bubs testnet

        In this tutorial, we will deploy a smart contract to the Bubs testnet.

        Dependencies

        Setup

        First, in your $HOME directory, set up a new project folder for this tutorial and init the project with npm:

        bash
        cd $HOME
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract on Bubs testnet","description":"","frontmatter":{"prev":{"text":"Bubs testnet","link":"/developers/bubs-testnet"},"head":[["meta",{"name":"og:title","content":"Deploy a smart contract on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/deploy-on-bubs.md","filePath":"developers/deploy-on-bubs.md","lastUpdated":1725992025000}'),p={name:"developers/deploy-on-bubs.md"},o=l(`

        Deploy a smart contract on Bubs testnet

        In this tutorial, we will deploy a smart contract to the Bubs testnet.

        Dependencies

        Setup

        First, in your $HOME directory, set up a new project folder for this tutorial and init the project with npm:

        bash
        cd $HOME
         mkdir counter-project && cd counter-project && npm init -y
        cd $HOME
         mkdir counter-project && cd counter-project && npm init -y

        Next, initialize a Foundry project with the following command:

        bash
        forge init counter_contract
        forge init counter_contract

        Create your smart contract

        Take a look at the Counter.sol file in your counter-project/counter_contract/src directory:

        solidity
        // SPDX-License-Identifier: UNLICENSED
         pragma solidity ^0.8.13;
        diff --git a/pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.lean.js b/pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.lean.js
        similarity index 81%
        rename from pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.lean.js
        rename to pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.lean.js
        index 556e122177..7bdc57b24b 100644
        --- a/pr-1699/assets/developers_deploy-on-bubs.md.97e444d7.lean.js
        +++ b/pr-1699/assets/developers_deploy-on-bubs.md.f7abcbb6.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract on Bubs testnet","description":"","frontmatter":{"prev":{"text":"Bubs testnet","link":"/developers/bubs-testnet"},"head":[["meta",{"name":"og:title","content":"Deploy a smart contract on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/deploy-on-bubs.md","filePath":"developers/deploy-on-bubs.md","lastUpdated":1725971357000}'),p={name:"developers/deploy-on-bubs.md"},o=l("",61),e=[o];function t(c,r,i,y,E,d){return a(),n("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default};
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Deploy a smart contract on Bubs testnet","description":"","frontmatter":{"prev":{"text":"Bubs testnet","link":"/developers/bubs-testnet"},"head":[["meta",{"name":"og:title","content":"Deploy a smart contract on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/deploy-on-bubs.md","filePath":"developers/deploy-on-bubs.md","lastUpdated":1725992025000}'),p={name:"developers/deploy-on-bubs.md"},o=l("",61),e=[o];function t(c,r,i,y,E,d){return a(),n("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default};
        diff --git a/pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.js b/pr-1699/assets/developers_ethereum-fallback.md.764773da.js
        similarity index 97%
        rename from pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.js
        rename to pr-1699/assets/developers_ethereum-fallback.md.764773da.js
        index 971d57bf75..3405930d63 100644
        --- a/pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.js
        +++ b/pr-1699/assets/developers_ethereum-fallback.md.764773da.js
        @@ -1 +1 @@
        -import{_ as a,o as l,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const s="/docs-preview/pr-1699/img/Celestia_ethereum-fallback.jpg",y=JSON.parse('{"title":"Ethereum fallback","description":"The DA fallback mechanism to Ethereum for rollups.","frontmatter":{"description":"The DA fallback mechanism to Ethereum for rollups.","next":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"prev":{"text":"Run an OP Stack devnet posting Celestia","link":"/developers/optimism"},"head":[["meta",{"name":"og:title","content":"Ethereum fallback | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/ethereum-fallback.md","filePath":"developers/ethereum-fallback.md","lastUpdated":1725971357000}'),n={name:"developers/ethereum-fallback.md"},o=e("h1",{id:"ethereum-fallback",tabindex:"-1"},[t("Ethereum fallback "),e("a",{class:"header-anchor",href:"#ethereum-fallback","aria-label":'Permalink to "Ethereum fallback"'},"​")],-1),i=e("p",null,"Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:",-1),c=e("ul",null,[e("li",null,[e("a",{href:"./arbitrum-integration#ethereum-fallback-mechanism-in-nitro"},"Arbitrum Nitro")])],-1),h=e("p",null,"In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.",-1),m=e("p",null,[t("Ethereum fallback is triggered whenever the sequencer has an error sending the "),e("code",null,"PayForBlobs"),t(" transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.")],-1),u=e("p",null,[e("img",{src:s,alt:"Ethereum fallback"})],-1),d=[o,i,c,h,m,u];function p(b,f,k,_,g,v){return l(),r("div",null,d)}const x=a(n,[["render",p]]);export{y as __pageData,x as default};
        +import{_ as a,o as l,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const s="/docs-preview/pr-1699/img/Celestia_ethereum-fallback.jpg",y=JSON.parse('{"title":"Ethereum fallback","description":"The DA fallback mechanism to Ethereum for rollups.","frontmatter":{"description":"The DA fallback mechanism to Ethereum for rollups.","next":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"prev":{"text":"Run an OP Stack devnet posting Celestia","link":"/developers/optimism"},"head":[["meta",{"name":"og:title","content":"Ethereum fallback | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/ethereum-fallback.md","filePath":"developers/ethereum-fallback.md","lastUpdated":1725992025000}'),n={name:"developers/ethereum-fallback.md"},o=e("h1",{id:"ethereum-fallback",tabindex:"-1"},[t("Ethereum fallback "),e("a",{class:"header-anchor",href:"#ethereum-fallback","aria-label":'Permalink to "Ethereum fallback"'},"​")],-1),i=e("p",null,"Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:",-1),c=e("ul",null,[e("li",null,[e("a",{href:"./arbitrum-integration#ethereum-fallback-mechanism-in-nitro"},"Arbitrum Nitro")])],-1),h=e("p",null,"In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.",-1),m=e("p",null,[t("Ethereum fallback is triggered whenever the sequencer has an error sending the "),e("code",null,"PayForBlobs"),t(" transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.")],-1),u=e("p",null,[e("img",{src:s,alt:"Ethereum fallback"})],-1),d=[o,i,c,h,m,u];function p(b,f,k,_,g,v){return l(),r("div",null,d)}const x=a(n,[["render",p]]);export{y as __pageData,x as default};
        diff --git a/pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.lean.js b/pr-1699/assets/developers_ethereum-fallback.md.764773da.lean.js
        similarity index 97%
        rename from pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.lean.js
        rename to pr-1699/assets/developers_ethereum-fallback.md.764773da.lean.js
        index 971d57bf75..3405930d63 100644
        --- a/pr-1699/assets/developers_ethereum-fallback.md.00e7ac0b.lean.js
        +++ b/pr-1699/assets/developers_ethereum-fallback.md.764773da.lean.js
        @@ -1 +1 @@
        -import{_ as a,o as l,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const s="/docs-preview/pr-1699/img/Celestia_ethereum-fallback.jpg",y=JSON.parse('{"title":"Ethereum fallback","description":"The DA fallback mechanism to Ethereum for rollups.","frontmatter":{"description":"The DA fallback mechanism to Ethereum for rollups.","next":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"prev":{"text":"Run an OP Stack devnet posting Celestia","link":"/developers/optimism"},"head":[["meta",{"name":"og:title","content":"Ethereum fallback | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/ethereum-fallback.md","filePath":"developers/ethereum-fallback.md","lastUpdated":1725971357000}'),n={name:"developers/ethereum-fallback.md"},o=e("h1",{id:"ethereum-fallback",tabindex:"-1"},[t("Ethereum fallback "),e("a",{class:"header-anchor",href:"#ethereum-fallback","aria-label":'Permalink to "Ethereum fallback"'},"​")],-1),i=e("p",null,"Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:",-1),c=e("ul",null,[e("li",null,[e("a",{href:"./arbitrum-integration#ethereum-fallback-mechanism-in-nitro"},"Arbitrum Nitro")])],-1),h=e("p",null,"In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.",-1),m=e("p",null,[t("Ethereum fallback is triggered whenever the sequencer has an error sending the "),e("code",null,"PayForBlobs"),t(" transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.")],-1),u=e("p",null,[e("img",{src:s,alt:"Ethereum fallback"})],-1),d=[o,i,c,h,m,u];function p(b,f,k,_,g,v){return l(),r("div",null,d)}const x=a(n,[["render",p]]);export{y as __pageData,x as default};
        +import{_ as a,o as l,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const s="/docs-preview/pr-1699/img/Celestia_ethereum-fallback.jpg",y=JSON.parse('{"title":"Ethereum fallback","description":"The DA fallback mechanism to Ethereum for rollups.","frontmatter":{"description":"The DA fallback mechanism to Ethereum for rollups.","next":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"prev":{"text":"Run an OP Stack devnet posting Celestia","link":"/developers/optimism"},"head":[["meta",{"name":"og:title","content":"Ethereum fallback | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/ethereum-fallback.md","filePath":"developers/ethereum-fallback.md","lastUpdated":1725992025000}'),n={name:"developers/ethereum-fallback.md"},o=e("h1",{id:"ethereum-fallback",tabindex:"-1"},[t("Ethereum fallback "),e("a",{class:"header-anchor",href:"#ethereum-fallback","aria-label":'Permalink to "Ethereum fallback"'},"​")],-1),i=e("p",null,"Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:",-1),c=e("ul",null,[e("li",null,[e("a",{href:"./arbitrum-integration#ethereum-fallback-mechanism-in-nitro"},"Arbitrum Nitro")])],-1),h=e("p",null,"In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.",-1),m=e("p",null,[t("Ethereum fallback is triggered whenever the sequencer has an error sending the "),e("code",null,"PayForBlobs"),t(" transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.")],-1),u=e("p",null,[e("img",{src:s,alt:"Ethereum fallback"})],-1),d=[o,i,c,h,m,u];function p(b,f,k,_,g,v){return l(),r("div",null,d)}const x=a(n,[["render",p]]);export{y as __pageData,x as default};
        diff --git a/pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.js b/pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.js
        similarity index 99%
        rename from pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.js
        rename to pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.js
        index e13cba531c..f046b217f4 100644
        --- a/pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.js
        +++ b/pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"FeeGrant module for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"FeeGrant module for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/feegrant-for-blobs.md","filePath":"developers/feegrant-for-blobs.md","lastUpdated":1725971357000}'),o={name:"developers/feegrant-for-blobs.md"},l=e(`

        FeeGrant module for blobs submission

        Overview

        This guide provides developers with the knowledge to use the FeeGrant module on the Celestia's Mocha testnet chain for granting a data availability node's account to submit blobs without constantly funding it, enabling a third-party account to cover the transaction fees.

        Pre-requisites

        • celestia-node binary (celestia) installed
        • Access to a Mocha node (e.g., https://rpc.celestia-mocha.com:443)
        • Running DA Light node on Mocha testnet
        • One account with sufficient funds, the "granter"
        • One account with no funds, the "grantee"

        Introduction

        Each DA node contains a Celestia account that is used to pay for blobs submissions. To unify the fee payment process, the FeeGrant module allows a third-party account (granter) to pay for the fees incurred by a DA node's (grantee) account. You will need one account that will contain the funds, the granter, and another account that will be in the DA node you run to post blobs, the grantee. You will see the DA node's account once you initialize the node. Learn more about managing accounts with cel-key in create a wallet with celestia-node.

        Granting fee allowances using celestia-node

        To get started granting the fee allowance, you will need two separate keys to run the light node with. One to begin the FeeGrant as the granter and another to use the FeeGrant as the grantee.

        Set some variables for your accounts for the remainder of the guide:

        bash
        export GRANTER_ADDRESS=<your-granter-account-address>
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"FeeGrant module for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"FeeGrant module for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/feegrant-for-blobs.md","filePath":"developers/feegrant-for-blobs.md","lastUpdated":1725992025000}'),o={name:"developers/feegrant-for-blobs.md"},l=e(`

        FeeGrant module for blobs submission

        Overview

        This guide provides developers with the knowledge to use the FeeGrant module on the Celestia's Mocha testnet chain for granting a data availability node's account to submit blobs without constantly funding it, enabling a third-party account to cover the transaction fees.

        Pre-requisites

        • celestia-node binary (celestia) installed
        • Access to a Mocha node (e.g., https://rpc.celestia-mocha.com:443)
        • Running DA Light node on Mocha testnet
        • One account with sufficient funds, the "granter"
        • One account with no funds, the "grantee"

        Introduction

        Each DA node contains a Celestia account that is used to pay for blobs submissions. To unify the fee payment process, the FeeGrant module allows a third-party account (granter) to pay for the fees incurred by a DA node's (grantee) account. You will need one account that will contain the funds, the granter, and another account that will be in the DA node you run to post blobs, the grantee. You will see the DA node's account once you initialize the node. Learn more about managing accounts with cel-key in create a wallet with celestia-node.

        Granting fee allowances using celestia-node

        To get started granting the fee allowance, you will need two separate keys to run the light node with. One to begin the FeeGrant as the granter and another to use the FeeGrant as the grantee.

        Set some variables for your accounts for the remainder of the guide:

        bash
        export GRANTER_ADDRESS=<your-granter-account-address>
         export GRANTEE_ADDRESS=<your-grantee-account-address>
         export RPC_URL=rpc.celestia-mocha.com
        export GRANTER_ADDRESS=<your-granter-account-address>
         export GRANTEE_ADDRESS=<your-grantee-account-address>
        diff --git a/pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.lean.js b/pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.lean.js
        similarity index 79%
        rename from pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.lean.js
        rename to pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.lean.js
        index 620cca6590..1995f11909 100644
        --- a/pr-1699/assets/developers_feegrant-for-blobs.md.7c93aaff.lean.js
        +++ b/pr-1699/assets/developers_feegrant-for-blobs.md.84d98514.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"FeeGrant module for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"FeeGrant module for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/feegrant-for-blobs.md","filePath":"developers/feegrant-for-blobs.md","lastUpdated":1725971357000}'),o={name:"developers/feegrant-for-blobs.md"},l=e("",54),p=[l];function t(c,r,i,E,y,d){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{h as __pageData,g as default};
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"FeeGrant module for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"FeeGrant module for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/feegrant-for-blobs.md","filePath":"developers/feegrant-for-blobs.md","lastUpdated":1725992025000}'),o={name:"developers/feegrant-for-blobs.md"},l=e("",54),p=[l];function t(c,r,i,E,y,d){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{h as __pageData,g as default};
        diff --git a/pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.js b/pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.js
        similarity index 99%
        rename from pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.js
        rename to pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.js
        index b4e63f8268..c77ff1ffd1 100644
        --- a/pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.js
        +++ b/pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Full stack modular blockchain development guide","description":"Learn to build a full stack modular dapp.","frontmatter":{"description":"Learn to build a full stack modular dapp.","head":[["meta",{"name":"og:title","content":"Full stack modular blockchain development guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/full-stack-modular-development-guide.md","filePath":"developers/full-stack-modular-development-guide.md","lastUpdated":1725971357000}'),p={name:"developers/full-stack-modular-development-guide.md"},o=l(`

        Full stack modular blockchain development guide

        Note

        This tutorial needs to be updated

        This guide will introduce you to modular blockchains like Celestia, explain their benefits, and show you how to build a full stack modular dapp with React, Vite, RainbowKit, Celestia, and Foundry.

        Current blockchain architectures are not scalable and face challenges around accessibility. In order for blockchains and web3 to reach mass adoption, these challenges must be addressed.

        Blockchains have evolved over time from application-specific networks like Bitcoin to shared smart contract platforms like Ethereum. This guide will cover how to build dapps on these newer, shared platforms.

        If you're interested in learning more about modular blockchains, or are new to the Celestia ecosystem, we recommend you read the build whatever page first.

        Getting started

        Now that you’ve had an overview of what Celestia is, let’s start building!

        The execution environment that we’ll be leveraging today is Ethermint, an EVM-compatible testnet that you will run locally for this tutorial.

        Pre-requisites

        Project setup

        To get started, create a new Foundry project:

        bash
        forge init celestia-dapp
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Full stack modular blockchain development guide","description":"Learn to build a full stack modular dapp.","frontmatter":{"description":"Learn to build a full stack modular dapp.","head":[["meta",{"name":"og:title","content":"Full stack modular blockchain development guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/full-stack-modular-development-guide.md","filePath":"developers/full-stack-modular-development-guide.md","lastUpdated":1725992025000}'),p={name:"developers/full-stack-modular-development-guide.md"},o=l(`

        Full stack modular blockchain development guide

        Note

        This tutorial needs to be updated

        This guide will introduce you to modular blockchains like Celestia, explain their benefits, and show you how to build a full stack modular dapp with React, Vite, RainbowKit, Celestia, and Foundry.

        Current blockchain architectures are not scalable and face challenges around accessibility. In order for blockchains and web3 to reach mass adoption, these challenges must be addressed.

        Blockchains have evolved over time from application-specific networks like Bitcoin to shared smart contract platforms like Ethereum. This guide will cover how to build dapps on these newer, shared platforms.

        If you're interested in learning more about modular blockchains, or are new to the Celestia ecosystem, we recommend you read the build whatever page first.

        Getting started

        Now that you’ve had an overview of what Celestia is, let’s start building!

        The execution environment that we’ll be leveraging today is Ethermint, an EVM-compatible testnet that you will run locally for this tutorial.

        Pre-requisites

        Project setup

        To get started, create a new Foundry project:

        bash
        forge init celestia-dapp
         cd celestia-dapp
        forge init celestia-dapp
         cd celestia-dapp

        Foundry has created an example smart contract located at src/Contract.sol.

        Updating the contract and tests

        Let's update the contracts to include a basic blog example. Create a new file in the src directory named Contract.sol with the following code:

        solidity
        // SPDX-License-Identifier: MIT
         pragma solidity ^0.8.13;
        diff --git a/pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.lean.js b/pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.lean.js
        similarity index 92%
        rename from pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.lean.js
        rename to pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.lean.js
        index 63b5d9c177..66f59ebfa8 100644
        --- a/pr-1699/assets/developers_full-stack-modular-development-guide.md.3910bdad.lean.js
        +++ b/pr-1699/assets/developers_full-stack-modular-development-guide.md.766923fe.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Full stack modular blockchain development guide","description":"Learn to build a full stack modular dapp.","frontmatter":{"description":"Learn to build a full stack modular dapp.","head":[["meta",{"name":"og:title","content":"Full stack modular blockchain development guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/full-stack-modular-development-guide.md","filePath":"developers/full-stack-modular-development-guide.md","lastUpdated":1725971357000}'),p={name:"developers/full-stack-modular-development-guide.md"},o=l("",113),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const h=s(p,[["render",t]]);export{u as __pageData,h as default};
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Full stack modular blockchain development guide","description":"Learn to build a full stack modular dapp.","frontmatter":{"description":"Learn to build a full stack modular dapp.","head":[["meta",{"name":"og:title","content":"Full stack modular blockchain development guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/full-stack-modular-development-guide.md","filePath":"developers/full-stack-modular-development-guide.md","lastUpdated":1725992025000}'),p={name:"developers/full-stack-modular-development-guide.md"},o=l("",113),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const h=s(p,[["render",t]]);export{u as __pageData,h as default};
        diff --git a/pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.js b/pr-1699/assets/developers_gm-portal-bubs.md.cd727490.js
        similarity index 99%
        rename from pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.js
        rename to pr-1699/assets/developers_gm-portal-bubs.md.cd727490.js
        index adeb862e07..a7e6d67716 100644
        --- a/pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.js
        +++ b/pr-1699/assets/developers_gm-portal-bubs.md.cd727490.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const p="/docs-preview/pr-1699/img/gm_contract.png",t="/docs-preview/pr-1699/img/gm_bubs.png",F=JSON.parse('{"title":"Deploying a dapp on Bubs testnet","description":"Make your own GM Portal dapp on the OP Stack.","frontmatter":{"description":"Make your own GM Portal dapp on the OP Stack.","head":[["meta",{"name":"og:title","content":"Deploying a dapp on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/gm-portal-bubs.md","filePath":"developers/gm-portal-bubs.md","lastUpdated":1725971357000}'),e={name:"developers/gm-portal-bubs.md"},l=o(`

        Deploying a dapp on Bubs testnet

        First, review the Bubs testnet page and the Deploy a smart contract to Bubs testnet tutorial.

        You will need a funded account to deploy your smart contract.

        Next, clone the gm-portal from Github and start the frontend:

        bash
        cd $HOME
        +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const p="/docs-preview/pr-1699/img/gm_contract.png",t="/docs-preview/pr-1699/img/gm_bubs.png",F=JSON.parse('{"title":"Deploying a dapp on Bubs testnet","description":"Make your own GM Portal dapp on the OP Stack.","frontmatter":{"description":"Make your own GM Portal dapp on the OP Stack.","head":[["meta",{"name":"og:title","content":"Deploying a dapp on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/gm-portal-bubs.md","filePath":"developers/gm-portal-bubs.md","lastUpdated":1725992025000}'),e={name:"developers/gm-portal-bubs.md"},l=o(`

        Deploying a dapp on Bubs testnet

        First, review the Bubs testnet page and the Deploy a smart contract to Bubs testnet tutorial.

        You will need a funded account to deploy your smart contract.

        Next, clone the gm-portal from Github and start the frontend:

        bash
        cd $HOME
         git clone https://github.com/jcstein/gm-portal.git
         cd gm-portal/frontend
         yarn && yarn dev
        cd $HOME
        diff --git a/pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.lean.js b/pr-1699/assets/developers_gm-portal-bubs.md.cd727490.lean.js
        similarity index 92%
        rename from pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.lean.js
        rename to pr-1699/assets/developers_gm-portal-bubs.md.cd727490.lean.js
        index 862c66a069..efd815a2d1 100644
        --- a/pr-1699/assets/developers_gm-portal-bubs.md.2e8017d7.lean.js
        +++ b/pr-1699/assets/developers_gm-portal-bubs.md.cd727490.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const p="/docs-preview/pr-1699/img/gm_contract.png",t="/docs-preview/pr-1699/img/gm_bubs.png",F=JSON.parse('{"title":"Deploying a dapp on Bubs testnet","description":"Make your own GM Portal dapp on the OP Stack.","frontmatter":{"description":"Make your own GM Portal dapp on the OP Stack.","head":[["meta",{"name":"og:title","content":"Deploying a dapp on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/gm-portal-bubs.md","filePath":"developers/gm-portal-bubs.md","lastUpdated":1725971357000}'),e={name:"developers/gm-portal-bubs.md"},l=o("",32),c=[l];function r(i,y,d,E,h,u){return a(),n("div",null,c)}const b=s(e,[["render",r]]);export{F as __pageData,b as default};
        +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const p="/docs-preview/pr-1699/img/gm_contract.png",t="/docs-preview/pr-1699/img/gm_bubs.png",F=JSON.parse('{"title":"Deploying a dapp on Bubs testnet","description":"Make your own GM Portal dapp on the OP Stack.","frontmatter":{"description":"Make your own GM Portal dapp on the OP Stack.","head":[["meta",{"name":"og:title","content":"Deploying a dapp on Bubs testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/gm-portal-bubs.md","filePath":"developers/gm-portal-bubs.md","lastUpdated":1725992025000}'),e={name:"developers/gm-portal-bubs.md"},l=o("",32),c=[l];function r(i,y,d,E,h,u){return a(),n("div",null,c)}const b=s(e,[["render",r]]);export{F as __pageData,b as default};
        diff --git a/pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.js b/pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.js
        similarity index 99%
        rename from pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.js
        rename to pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.js
        index aff50fbb70..e8b785c66c 100644
        --- a/pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.js
        +++ b/pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Golang client library tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Golang client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/golang-client-tutorial.md","filePath":"developers/golang-client-tutorial.md","lastUpdated":1725971357000}'),p={name:"developers/golang-client-tutorial.md"},o=l(`

        Golang client library tutorial

        This section tutorial will guide you through using the most common RPC endpoints with the golang client library.

        Install dependencies and celestia-node if you have not already.

        Project setup

        To start, add celestia-openrpc as a dependency to your project:

        bash
        go get github.com/celestiaorg/celestia-openrpc
        go get github.com/celestiaorg/celestia-openrpc

        To use the following methods, you will need the node URL and your auth token. To get your auth token, see this guide. To run your node without an auth token, you can use the --rpc.skip-auth flag when starting your node. This allows you to pass an empty string as your auth token.

        The default URL is http://localhost:26658. If you would like to use subscription methods, such as SubscribeHeaders below, you must use the ws protocol in place of http: ws://localhost:26658.

        Submitting and retrieving blobs

        The blob.Submit method takes a slice of blobs and a gas price, returning the height the blob was successfully posted at.

        • The namespace can be generated with share.NewBlobNamespaceV0.
        • The blobs can be generated with blob.NewBlobV0.
        • You can use blob.NewSubmitOptions(), which has celestia-node automatically determine an appropriate gas price. To set your own gas price, use blob.NewSubmitOptions().WithGasPrice(X). The available options are WithGasPrice, WithGas, WithKeyName, WithSignerAddress, and WithFeeGranterAddress.

        The blob.GetAll method takes a height and slice of namespaces, returning the slice of blobs found in the given namespaces.

        go
        import (
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Golang client library tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Golang client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/golang-client-tutorial.md","filePath":"developers/golang-client-tutorial.md","lastUpdated":1725992025000}'),p={name:"developers/golang-client-tutorial.md"},o=l(`

        Golang client library tutorial

        This section tutorial will guide you through using the most common RPC endpoints with the golang client library.

        Install dependencies and celestia-node if you have not already.

        Project setup

        To start, add celestia-openrpc as a dependency to your project:

        bash
        go get github.com/celestiaorg/celestia-openrpc
        go get github.com/celestiaorg/celestia-openrpc

        To use the following methods, you will need the node URL and your auth token. To get your auth token, see this guide. To run your node without an auth token, you can use the --rpc.skip-auth flag when starting your node. This allows you to pass an empty string as your auth token.

        The default URL is http://localhost:26658. If you would like to use subscription methods, such as SubscribeHeaders below, you must use the ws protocol in place of http: ws://localhost:26658.

        Submitting and retrieving blobs

        The blob.Submit method takes a slice of blobs and a gas price, returning the height the blob was successfully posted at.

        • The namespace can be generated with share.NewBlobNamespaceV0.
        • The blobs can be generated with blob.NewBlobV0.
        • You can use blob.NewSubmitOptions(), which has celestia-node automatically determine an appropriate gas price. To set your own gas price, use blob.NewSubmitOptions().WithGasPrice(X). The available options are WithGasPrice, WithGas, WithKeyName, WithSignerAddress, and WithFeeGranterAddress.

        The blob.GetAll method takes a height and slice of namespaces, returning the slice of blobs found in the given namespaces.

        go
        import (
         	"bytes"
         	"context"
         	"fmt"
        diff --git a/pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.lean.js b/pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.lean.js
        similarity index 89%
        rename from pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.lean.js
        rename to pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.lean.js
        index 7d0e285bb6..d8386114f8 100644
        --- a/pr-1699/assets/developers_golang-client-tutorial.md.0dce1977.lean.js
        +++ b/pr-1699/assets/developers_golang-client-tutorial.md.727ea5e8.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Golang client library tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Golang client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/golang-client-tutorial.md","filePath":"developers/golang-client-tutorial.md","lastUpdated":1725971357000}'),p={name:"developers/golang-client-tutorial.md"},o=l("",24),e=[o];function t(r,c,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{b as __pageData,u as default};
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Golang client library tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Golang client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/golang-client-tutorial.md","filePath":"developers/golang-client-tutorial.md","lastUpdated":1725992025000}'),p={name:"developers/golang-client-tutorial.md"},o=l("",24),e=[o];function t(r,c,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{b as __pageData,u as default};
        diff --git a/pr-1699/assets/developers_integrate-celestia.md.871c3298.js b/pr-1699/assets/developers_integrate-celestia.md.cabcfa45.js
        similarity index 98%
        rename from pr-1699/assets/developers_integrate-celestia.md.871c3298.js
        rename to pr-1699/assets/developers_integrate-celestia.md.cabcfa45.js
        index b1e44f1f8c..383393fd5d 100644
        --- a/pr-1699/assets/developers_integrate-celestia.md.871c3298.js
        +++ b/pr-1699/assets/developers_integrate-celestia.md.cabcfa45.js
        @@ -1 +1 @@
        -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Integrate Celestia for service providers","description":"Learn how service providers can integrate with the Celestia network.","frontmatter":{"description":"Learn how service providers can integrate with the Celestia network.","prev":{"text":"Integrating Cosmostation for developers","link":"/developers/cosmostation"},"head":[["meta",{"name":"og:title","content":"Integrate Celestia for service providers | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/integrate-celestia.md","filePath":"developers/integrate-celestia.md","lastUpdated":1725971357000}'),r={name:"developers/integrate-celestia.md"},n=i('

        Integrate Celestia for service providers

        This document is for third-party service providers, such as custodians and explorers, integrating the Celestia network.

        Getting started

        When getting started Celestia, we recommend checking out these resources first:

        Celestia service provider notes

        Celestia is a fairly standard Cosmos-SDK based chain. We use the latest version of Tendermint and the Cosmos-SDK, with only minor modifications to each. This means that we are:

        • Using the default Cosmos-SDK modules: auth, bank, distribution, staking, slashing, mint, crisis, ibchost, genutil, evidence, ibctransfer, params, gov (limited in some TBD capacities), upgrade, vesting, feegrant, capability, and payment.
        • Use the standard digital keys schemes provided by the Cosmos-SDK and Tendermint, those being secp256k1 for user transactions, and tm-ed25519 for signing and verifying consensus messages.

        While exactly which modules used is subject to change, Celestia aims to be as minimal as possible.

        Custody and key management

        Celestia supports many already existing key management systems, as we rely on the Cosmos-SDK and Tendermint libraries for signing and verifying transactions. Learn more in the Cosmos-SDK documentation

        RPC and querying

        In celestia-app, only the standard RPC endpoints for Tendermint and the Cosmos-SDK are exposed. We do not currently add or subtract any core functionality, but this could change in the future. The same goes for querying data from the chain.

        In celestia-node, the Data Availability node client, there is a JSON-RPC API that allows you to interact directly with Celestia's Data Availability layer. Learn how to use the API in this tutorial.

        Compatibility

        Linux, particularly Ubuntu 20.04 LTS, is the most well tested. Potentially compatible with other OSs, but they are currently untested. Some of the cryptography libraries used for erasure data are not guaranteed to work on other platforms.

        Syncing

        Since we utilize Tendermint and the Cosmos-SDK, syncing the chain can be performed by any method that is supported by those libraries. This includes fast-sync, state sync, and quick sync.

        Notable exceptions relative to other blockchains

        Relative to other Tendermint based chains, Celestia will have significantly longer blocktimes of roughly 12* seconds. The reason behind this block time is to optimize the bandwidth used by light clients that are sampling the chain, and is not because we have modified Tendermint consensus in any meaningful way. Validators will likely download/upload relatively large blocks. It should be noted that while these blocks are large, very little typical blockchain state execution is actually occurring on Celestia. Meaning that the bandwidth requirements will likely be larger than that of a typical Cosmos-SDK based blockchain full node, the computing requirements should be similar in magnitude.

        *Subject to Change

        ',21),s=[n];function o(l,d,c,h,u,m){return t(),a("div",null,s)}const b=e(r,[["render",o]]);export{g as __pageData,b as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Integrate Celestia for service providers","description":"Learn how service providers can integrate with the Celestia network.","frontmatter":{"description":"Learn how service providers can integrate with the Celestia network.","prev":{"text":"Integrating Cosmostation for developers","link":"/developers/cosmostation"},"head":[["meta",{"name":"og:title","content":"Integrate Celestia for service providers | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/integrate-celestia.md","filePath":"developers/integrate-celestia.md","lastUpdated":1725992025000}'),r={name:"developers/integrate-celestia.md"},n=i('

        Integrate Celestia for service providers

        This document is for third-party service providers, such as custodians and explorers, integrating the Celestia network.

        Getting started

        When getting started Celestia, we recommend checking out these resources first:

        Celestia service provider notes

        Celestia is a fairly standard Cosmos-SDK based chain. We use the latest version of Tendermint and the Cosmos-SDK, with only minor modifications to each. This means that we are:

        • Using the default Cosmos-SDK modules: auth, bank, distribution, staking, slashing, mint, crisis, ibchost, genutil, evidence, ibctransfer, params, gov (limited in some TBD capacities), upgrade, vesting, feegrant, capability, and payment.
        • Use the standard digital keys schemes provided by the Cosmos-SDK and Tendermint, those being secp256k1 for user transactions, and tm-ed25519 for signing and verifying consensus messages.

        While exactly which modules used is subject to change, Celestia aims to be as minimal as possible.

        Custody and key management

        Celestia supports many already existing key management systems, as we rely on the Cosmos-SDK and Tendermint libraries for signing and verifying transactions. Learn more in the Cosmos-SDK documentation

        RPC and querying

        In celestia-app, only the standard RPC endpoints for Tendermint and the Cosmos-SDK are exposed. We do not currently add or subtract any core functionality, but this could change in the future. The same goes for querying data from the chain.

        In celestia-node, the Data Availability node client, there is a JSON-RPC API that allows you to interact directly with Celestia's Data Availability layer. Learn how to use the API in this tutorial.

        Compatibility

        Linux, particularly Ubuntu 20.04 LTS, is the most well tested. Potentially compatible with other OSs, but they are currently untested. Some of the cryptography libraries used for erasure data are not guaranteed to work on other platforms.

        Syncing

        Since we utilize Tendermint and the Cosmos-SDK, syncing the chain can be performed by any method that is supported by those libraries. This includes fast-sync, state sync, and quick sync.

        Notable exceptions relative to other blockchains

        Relative to other Tendermint based chains, Celestia will have significantly longer blocktimes of roughly 12* seconds. The reason behind this block time is to optimize the bandwidth used by light clients that are sampling the chain, and is not because we have modified Tendermint consensus in any meaningful way. Validators will likely download/upload relatively large blocks. It should be noted that while these blocks are large, very little typical blockchain state execution is actually occurring on Celestia. Meaning that the bandwidth requirements will likely be larger than that of a typical Cosmos-SDK based blockchain full node, the computing requirements should be similar in magnitude.

        *Subject to Change

        ',21),s=[n];function o(l,d,c,h,u,m){return t(),a("div",null,s)}const b=e(r,[["render",o]]);export{g as __pageData,b as default}; diff --git a/pr-1699/assets/developers_integrate-celestia.md.871c3298.lean.js b/pr-1699/assets/developers_integrate-celestia.md.cabcfa45.lean.js similarity index 92% rename from pr-1699/assets/developers_integrate-celestia.md.871c3298.lean.js rename to pr-1699/assets/developers_integrate-celestia.md.cabcfa45.lean.js index 7fc4574e8e..5ef3c7c3b0 100644 --- a/pr-1699/assets/developers_integrate-celestia.md.871c3298.lean.js +++ b/pr-1699/assets/developers_integrate-celestia.md.cabcfa45.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Integrate Celestia for service providers","description":"Learn how service providers can integrate with the Celestia network.","frontmatter":{"description":"Learn how service providers can integrate with the Celestia network.","prev":{"text":"Integrating Cosmostation for developers","link":"/developers/cosmostation"},"head":[["meta",{"name":"og:title","content":"Integrate Celestia for service providers | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/integrate-celestia.md","filePath":"developers/integrate-celestia.md","lastUpdated":1725971357000}'),r={name:"developers/integrate-celestia.md"},n=i("",21),s=[n];function o(l,d,c,h,u,m){return t(),a("div",null,s)}const b=e(r,[["render",o]]);export{g as __pageData,b as default}; +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Integrate Celestia for service providers","description":"Learn how service providers can integrate with the Celestia network.","frontmatter":{"description":"Learn how service providers can integrate with the Celestia network.","prev":{"text":"Integrating Cosmostation for developers","link":"/developers/cosmostation"},"head":[["meta",{"name":"og:title","content":"Integrate Celestia for service providers | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/integrate-celestia.md","filePath":"developers/integrate-celestia.md","lastUpdated":1725992025000}'),r={name:"developers/integrate-celestia.md"},n=i("",21),s=[n];function o(l,d,c,h,u,m){return t(),a("div",null,s)}const b=e(r,[["render",o]]);export{g as __pageData,b as default}; diff --git a/pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.js b/pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.js similarity index 98% rename from pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.js rename to pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.js index 2947a14e47..040ea1287f 100644 --- a/pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.js +++ b/pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.js @@ -1 +1 @@ -import{_ as t,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Introduction to OP Stack integration","description":"Learn about the integration of OP Stack with Celestia.","frontmatter":{"description":"Learn about the integration of OP Stack with Celestia.","prev":{"text":"Deploy a dapp on your Arbitrum rollup devnet","link":"/developers/arbitrum-dapp-deploy"},"head":[["meta",{"name":"og:title","content":"Introduction to OP Stack integration | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/intro-to-op-stack.md","filePath":"developers/intro-to-op-stack.md","lastUpdated":1725971357000}'),i={name:"developers/intro-to-op-stack.md"},r=o('

        Introduction to OP Stack integration

        Optimism is a low-cost and lightning-fast Ethereum L2 blockchain, built with the OP Stack.

        Celestia is a modular consensus and data availability (DA) network, built to enable anyone to easily deploy their own blockchain with minimal overhead.

        Together, they allow developers to create rollups that post data to Celestia and settle on Ethereum.

        About the integration

        Optimism uses Ethereum as a DA layer. Currently, settlement and DA for Optimism are on Ethereum, both onchain. op-batcher batches up rollup blocks and posts to Ethereum.

        The integration of OP Stack with Celestia underneath for DA allows rollup operators to reduce overhead that is associated with posting data as calldata on Ethereum. Instead, op-batcher batches up rollup blocks and posts them to Celestia's DA network.

        Data is managed in two ways. First, data is written to the data availability (DA) layer i.e. in this case Celestia, then the data commitment is written to the op-batcher. When reading op-node simply reads the data back from the DA layer by reading the data commitment from the op-batcher first, then reading the data from the DA layer using the data commitment. While previously op-node was reading from calldata on Ethereum, it now reads data from Celestia.

        There are a few tools involved in the data handling process. op-batcher batches up rollup blocks and posts them to Ethereum. op-geth handles execution, while op-proposer is responsible for state commitment submission.

        By using Celestia as a DA layer, existing L2s can switch from posting their data as calldata on Ethereum, to posting to Celestia. The commitment to the block is posted on Celestia, which is purpose-built for data availability. This is a more scalable than the traditional method of posting this data as calldata on monolithic chains.

        GitHub repository

        Find the repository for this integration at https://github.com/celestiaorg/optimism.

        WARNING

        This is a beta integration and we are working on resolving open issues.

        Category contents

        This category will guide you through interacting with existing OP Stack rollups with Celestia underneath, then how to start your own devnet with a modified version of optimism-bedrock that uses Celestia as a DA layer.

        Next steps

        Now that you understand the integration, you can start learning about the Bubs testnet, built with OP Stack and Celestia! This testnet is a great way to explore the possibilities of this integration and test your applications in a live environment.

        ',18),n=[r];function s(l,h,c,d,p,u){return e(),a("div",null,n)}const g=t(i,[["render",s]]);export{b as __pageData,g as default}; +import{_ as t,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Introduction to OP Stack integration","description":"Learn about the integration of OP Stack with Celestia.","frontmatter":{"description":"Learn about the integration of OP Stack with Celestia.","prev":{"text":"Deploy a dapp on your Arbitrum rollup devnet","link":"/developers/arbitrum-dapp-deploy"},"head":[["meta",{"name":"og:title","content":"Introduction to OP Stack integration | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/intro-to-op-stack.md","filePath":"developers/intro-to-op-stack.md","lastUpdated":1725992025000}'),i={name:"developers/intro-to-op-stack.md"},r=o('

        Introduction to OP Stack integration

        Optimism is a low-cost and lightning-fast Ethereum L2 blockchain, built with the OP Stack.

        Celestia is a modular consensus and data availability (DA) network, built to enable anyone to easily deploy their own blockchain with minimal overhead.

        Together, they allow developers to create rollups that post data to Celestia and settle on Ethereum.

        About the integration

        Optimism uses Ethereum as a DA layer. Currently, settlement and DA for Optimism are on Ethereum, both onchain. op-batcher batches up rollup blocks and posts to Ethereum.

        The integration of OP Stack with Celestia underneath for DA allows rollup operators to reduce overhead that is associated with posting data as calldata on Ethereum. Instead, op-batcher batches up rollup blocks and posts them to Celestia's DA network.

        Data is managed in two ways. First, data is written to the data availability (DA) layer i.e. in this case Celestia, then the data commitment is written to the op-batcher. When reading op-node simply reads the data back from the DA layer by reading the data commitment from the op-batcher first, then reading the data from the DA layer using the data commitment. While previously op-node was reading from calldata on Ethereum, it now reads data from Celestia.

        There are a few tools involved in the data handling process. op-batcher batches up rollup blocks and posts them to Ethereum. op-geth handles execution, while op-proposer is responsible for state commitment submission.

        By using Celestia as a DA layer, existing L2s can switch from posting their data as calldata on Ethereum, to posting to Celestia. The commitment to the block is posted on Celestia, which is purpose-built for data availability. This is a more scalable than the traditional method of posting this data as calldata on monolithic chains.

        GitHub repository

        Find the repository for this integration at https://github.com/celestiaorg/optimism.

        WARNING

        This is a beta integration and we are working on resolving open issues.

        Category contents

        This category will guide you through interacting with existing OP Stack rollups with Celestia underneath, then how to start your own devnet with a modified version of optimism-bedrock that uses Celestia as a DA layer.

        Next steps

        Now that you understand the integration, you can start learning about the Bubs testnet, built with OP Stack and Celestia! This testnet is a great way to explore the possibilities of this integration and test your applications in a live environment.

        ',18),n=[r];function s(l,h,c,d,p,u){return e(),a("div",null,n)}const g=t(i,[["render",s]]);export{b as __pageData,g as default}; diff --git a/pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.lean.js b/pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.lean.js similarity index 92% rename from pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.lean.js rename to pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.lean.js index 73813eaf39..86a31958b1 100644 --- a/pr-1699/assets/developers_intro-to-op-stack.md.c09be10b.lean.js +++ b/pr-1699/assets/developers_intro-to-op-stack.md.2deb5540.lean.js @@ -1 +1 @@ -import{_ as t,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Introduction to OP Stack integration","description":"Learn about the integration of OP Stack with Celestia.","frontmatter":{"description":"Learn about the integration of OP Stack with Celestia.","prev":{"text":"Deploy a dapp on your Arbitrum rollup devnet","link":"/developers/arbitrum-dapp-deploy"},"head":[["meta",{"name":"og:title","content":"Introduction to OP Stack integration | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/intro-to-op-stack.md","filePath":"developers/intro-to-op-stack.md","lastUpdated":1725971357000}'),i={name:"developers/intro-to-op-stack.md"},r=o("",18),n=[r];function s(l,h,c,d,p,u){return e(),a("div",null,n)}const g=t(i,[["render",s]]);export{b as __pageData,g as default}; +import{_ as t,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Introduction to OP Stack integration","description":"Learn about the integration of OP Stack with Celestia.","frontmatter":{"description":"Learn about the integration of OP Stack with Celestia.","prev":{"text":"Deploy a dapp on your Arbitrum rollup devnet","link":"/developers/arbitrum-dapp-deploy"},"head":[["meta",{"name":"og:title","content":"Introduction to OP Stack integration | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/intro-to-op-stack.md","filePath":"developers/intro-to-op-stack.md","lastUpdated":1725992025000}'),i={name:"developers/intro-to-op-stack.md"},r=o("",18),n=[r];function s(l,h,c,d,p,u){return e(),a("div",null,n)}const g=t(i,[["render",s]]);export{b as __pageData,g as default}; diff --git a/pr-1699/assets/developers_multiaccounts.md.5fe51e02.js b/pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.js similarity index 99% rename from pr-1699/assets/developers_multiaccounts.md.5fe51e02.js rename to pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.js index cca3aadaae..838e2ed6f2 100644 --- a/pr-1699/assets/developers_multiaccounts.md.5fe51e02.js +++ b/pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"MultiAccounts feature for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"MultiAccounts feature for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/multiaccounts.md","filePath":"developers/multiaccounts.md","lastUpdated":1725971357000}'),o={name:"developers/multiaccounts.md"},t=n(`

        MultiAccounts feature for blobs submission

        Overview

        By default, a celestia-node creates a key named my_celes_key during initialization. This document explains how to run a node with a different default key name and how to submit blobs using different signers.

        Running a node with a different default key name

        To start a Celestia node with a different default key name, use the following command:

        sh
        celestia light start --core.ip=consensus.celestia-arabica-11.com \\
        +import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"MultiAccounts feature for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"MultiAccounts feature for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/multiaccounts.md","filePath":"developers/multiaccounts.md","lastUpdated":1725992025000}'),o={name:"developers/multiaccounts.md"},t=n(`

        MultiAccounts feature for blobs submission

        Overview

        By default, a celestia-node creates a key named my_celes_key during initialization. This document explains how to run a node with a different default key name and how to submit blobs using different signers.

        Running a node with a different default key name

        To start a Celestia node with a different default key name, use the following command:

        sh
        celestia light start --core.ip=consensus.celestia-arabica-11.com \\
             --p2p.network=arabica --keyring.keyname testKey
        celestia light start --core.ip=consensus.celestia-arabica-11.com \\
             --p2p.network=arabica --keyring.keyname testKey

        In this example, testKey becomes the default node key, and the node's address will change accordingly.

        Submitting blobs with a different signer/key name

        Option 1: Submit passing key name

        You can submit a blob by specifying a different key name:

        sh
        celestia blob submit 0x42690c204d39600fddd3 'gm' --key.name testKey2
        celestia blob submit 0x42690c204d39600fddd3 'gm' --key.name testKey2

        This transaction will be signed by the address associated with testKey2.

        Option 2: Submit passing signer address

        Alternatively, you can submit a blob by specifying the signer's address:

        sh
        celestia blob submit 0x42690c204d39600fddd3 'gm' --signer $SIGNER_ADDRESS
        celestia blob submit 0x42690c204d39600fddd3 'gm' --signer $SIGNER_ADDRESS

        Both options achieve the same result but use different inputs. The testKey2 points to SIGNER_ADDRESS in the KeyStore.

        Key management

        All keys and addresses must be added to the KeyStore. To create a new key, use the cel-key library:

        Creating a new key

        sh
        ./cel-key add testKey --keyring-backend test \\
             --node.type light --p2p.network arabica
        ./cel-key add testKey --keyring-backend test \\
        diff --git a/pr-1699/assets/developers_multiaccounts.md.5fe51e02.lean.js b/pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.lean.js
        similarity index 89%
        rename from pr-1699/assets/developers_multiaccounts.md.5fe51e02.lean.js
        rename to pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.lean.js
        index 47fb70431f..6cd3e15b48 100644
        --- a/pr-1699/assets/developers_multiaccounts.md.5fe51e02.lean.js
        +++ b/pr-1699/assets/developers_multiaccounts.md.6ee7c0ad.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"MultiAccounts feature for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"MultiAccounts feature for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/multiaccounts.md","filePath":"developers/multiaccounts.md","lastUpdated":1725971357000}'),o={name:"developers/multiaccounts.md"},t=n("",28),l=[t];function p(r,i,c,d,y,h){return a(),e("div",null,l)}const E=s(o,[["render",p]]);export{b as __pageData,E as default};
        +import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"MultiAccounts feature for blobs submission","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"MultiAccounts feature for blobs submission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/multiaccounts.md","filePath":"developers/multiaccounts.md","lastUpdated":1725992025000}'),o={name:"developers/multiaccounts.md"},t=n("",28),l=[t];function p(r,i,c,d,y,h){return a(),e("div",null,l)}const E=s(o,[["render",p]]);export{b as __pageData,E as default};
        diff --git a/pr-1699/assets/developers_node-api.md.8d88dab0.js b/pr-1699/assets/developers_node-api.md.6709e8d4.js
        similarity index 98%
        rename from pr-1699/assets/developers_node-api.md.8d88dab0.js
        rename to pr-1699/assets/developers_node-api.md.6709e8d4.js
        index a7e9c0bf74..1c0ae82b23 100644
        --- a/pr-1699/assets/developers_node-api.md.8d88dab0.js
        +++ b/pr-1699/assets/developers_node-api.md.6709e8d4.js
        @@ -1 +1 @@
        -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const w=JSON.parse('{"title":"Node API","description":"An overview of the celestia-node API.","frontmatter":{"description":"An overview of the celestia-node API.","head":[["meta",{"name":"og:title","content":"Node API | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-api.md","filePath":"developers/node-api.md","lastUpdated":1725971357000}'),o={name:"developers/node-api.md"},i=r('

        Node API

        The celestia-node API is made for interacting with celestia-node. There are two ways in which a user and developer can interact with the API, the RPC API and the Gateway API. View the API's documentation.

        RPC API

        The RPC API primarily focuses on developers and projects building on top of Celestia, who are willing to run their own DA nodes. The RPC API provides a richer set of features and a superior user experience. Unlike the Gateway API, the RPC API allows access to the internal wallet and keyring of the DA node, as well as other sensitive and administrative capabilities.

        Library

        The node can be used as a Golang library and designed for programmatic API access.

        RPC

        The RPC API is also exposed to OpenRPC(JSON-RPC 2.0) for users wanting to run their DA node as a separate DA service. It provides the same set of features as the library with an additional authentication system with different permissions levels to protect the wallet and signing + providing RPC-level DOS protection.

        RPC API tutorial

        The node tutorial, which uses the RPC CLI, is the recommended way to get started interacting with your Celestia node.

        Gateway API

        WARNING

        The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

        The gateway API is a REST API which is meant to be deployed by infra providers to enable the public read-only gateway to the DA network for external users who don't want or can't run light nodes (like browsers currently) over HTTP. It has no wallet or signing functionality.

        Gateway API tutorial

        Check out the Prompt scavenger gateway API tutorial for more details.

        ',15),n=[i];function s(l,d,h,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",s]]);export{w as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const w=JSON.parse('{"title":"Node API","description":"An overview of the celestia-node API.","frontmatter":{"description":"An overview of the celestia-node API.","head":[["meta",{"name":"og:title","content":"Node API | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-api.md","filePath":"developers/node-api.md","lastUpdated":1725992025000}'),o={name:"developers/node-api.md"},i=r('

        Node API

        The celestia-node API is made for interacting with celestia-node. There are two ways in which a user and developer can interact with the API, the RPC API and the Gateway API. View the API's documentation.

        RPC API

        The RPC API primarily focuses on developers and projects building on top of Celestia, who are willing to run their own DA nodes. The RPC API provides a richer set of features and a superior user experience. Unlike the Gateway API, the RPC API allows access to the internal wallet and keyring of the DA node, as well as other sensitive and administrative capabilities.

        Library

        The node can be used as a Golang library and designed for programmatic API access.

        RPC

        The RPC API is also exposed to OpenRPC(JSON-RPC 2.0) for users wanting to run their DA node as a separate DA service. It provides the same set of features as the library with an additional authentication system with different permissions levels to protect the wallet and signing + providing RPC-level DOS protection.

        RPC API tutorial

        The node tutorial, which uses the RPC CLI, is the recommended way to get started interacting with your Celestia node.

        Gateway API

        WARNING

        The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

        The gateway API is a REST API which is meant to be deployed by infra providers to enable the public read-only gateway to the DA network for external users who don't want or can't run light nodes (like browsers currently) over HTTP. It has no wallet or signing functionality.

        Gateway API tutorial

        Check out the Prompt scavenger gateway API tutorial for more details.

        ',15),n=[i];function s(l,d,h,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",s]]);export{w as __pageData,f as default}; diff --git a/pr-1699/assets/developers_node-api.md.8d88dab0.lean.js b/pr-1699/assets/developers_node-api.md.6709e8d4.lean.js similarity index 90% rename from pr-1699/assets/developers_node-api.md.8d88dab0.lean.js rename to pr-1699/assets/developers_node-api.md.6709e8d4.lean.js index ccb124a180..a913a01e9e 100644 --- a/pr-1699/assets/developers_node-api.md.8d88dab0.lean.js +++ b/pr-1699/assets/developers_node-api.md.6709e8d4.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const w=JSON.parse('{"title":"Node API","description":"An overview of the celestia-node API.","frontmatter":{"description":"An overview of the celestia-node API.","head":[["meta",{"name":"og:title","content":"Node API | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-api.md","filePath":"developers/node-api.md","lastUpdated":1725971357000}'),o={name:"developers/node-api.md"},i=r("",15),n=[i];function s(l,d,h,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",s]]);export{w as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const w=JSON.parse('{"title":"Node API","description":"An overview of the celestia-node API.","frontmatter":{"description":"An overview of the celestia-node API.","head":[["meta",{"name":"og:title","content":"Node API | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-api.md","filePath":"developers/node-api.md","lastUpdated":1725992025000}'),o={name:"developers/node-api.md"},i=r("",15),n=[i];function s(l,d,h,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",s]]);export{w as __pageData,f as default}; diff --git a/pr-1699/assets/developers_node-tutorial.md.358f7307.js b/pr-1699/assets/developers_node-tutorial.md.79e6f899.js similarity index 99% rename from pr-1699/assets/developers_node-tutorial.md.358f7307.js rename to pr-1699/assets/developers_node-tutorial.md.79e6f899.js index c4ebb278b2..136fff07a0 100644 --- a/pr-1699/assets/developers_node-tutorial.md.358f7307.js +++ b/pr-1699/assets/developers_node-tutorial.md.79e6f899.js @@ -1,8 +1,8 @@ -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as e,c as t,k as s,t as n,l as o,a as p,Q as l}from"./chunks/framework.b47e54aa.js";const c=l(`

        Celestia-node RPC CLI tutorial

        In this tutorial, we will cover how to use the celestia-node RPC API to submit and retrieve data (blobs) from the data availability layer by their namespace.

        Introduction

        Blobs

        Data is posted to Celestia's DA layer by using MsgPayForBlobs transactions to the core network. Read more about MsgPayForBlobs.

        Namespaces

        Celestia partitions the block data into multiple namespaces, one for every application. This allows applications to only download their data, and not the data of other applications. Read more about Namespaced Merkle trees (NMTs).

        TIP

        If you already have a running and funded node, you can skip to the RPC CLI guide section.

        WARNING

        The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

        Hardware requirements

        The following minimum hardware requirements are recommended for running a light node:

        • Memory: 500 MB RAM (minimum)
        • CPU: Single Core
        • Disk: 50 GB SSD Storage
        • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

        Setting up dependencies

        Install dependencies and celestia-node if you have not already.

        Instantiate a Celestia light node

        Now, let's instantiate a Celestia Light node:

        TIP

        RPC endpoints are exposed in all celestia-node types such as light, bridge and full nodes.

        bash
        celestia light init
        celestia light init
        bash
        celestia light init --p2p.network mocha
        celestia light init --p2p.network mocha
        bash
        celestia light init --p2p.network arabica
        celestia light init --p2p.network arabica

        Instantiating (or initializing) the node means setting up a node store on your machine. This is where the data and your keys will be stored.

        Connect to a core endpoint

        Let's now run the Celestia Light node with a gRPC connection to an example core endpoint. Connecting to a core endpoint provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

        Note: You are also encouraged to find a community-run API endpoint and there are several in the Discord. This one is used for demonstration purposes. Check out the Mocha testnet page, or Arabica devnet page.

        bash
        celestia light start --core.ip <URI>
        celestia light start --core.ip <URI>
        bash
        celestia light start --core.ip <URI> --p2p.network mocha
        celestia light start --core.ip <URI> --p2p.network mocha
        bash
        celestia light start --core.ip <URI> --p2p.network arabica
        celestia light start --core.ip <URI> --p2p.network arabica

        TIP

        The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

        Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

        For example, your command along with an RPC endpoint might look like this:

        bash
        celestia light start --core.ip consensus.lunaroasis.net
        celestia light start --core.ip consensus.lunaroasis.net
        bash
        celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
        celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
        bash
        celestia light start --core.ip validator-1.celestia-arabica-11.com \\
        +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as e,c as t,k as s,t as n,l as o,a as p,Q as l}from"./chunks/framework.b47e54aa.js";const c=l(`

        Celestia-node RPC CLI tutorial

        In this tutorial, we will cover how to use the celestia-node RPC API to submit and retrieve data (blobs) from the data availability layer by their namespace.

        Introduction

        Blobs

        Data is posted to Celestia's DA layer by using MsgPayForBlobs transactions to the core network. Read more about MsgPayForBlobs.

        Namespaces

        Celestia partitions the block data into multiple namespaces, one for every application. This allows applications to only download their data, and not the data of other applications. Read more about Namespaced Merkle trees (NMTs).

        TIP

        If you already have a running and funded node, you can skip to the RPC CLI guide section.

        WARNING

        The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

        Hardware requirements

        The following minimum hardware requirements are recommended for running a light node:

        • Memory: 500 MB RAM (minimum)
        • CPU: Single Core
        • Disk: 50 GB SSD Storage
        • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

        Setting up dependencies

        Install dependencies and celestia-node if you have not already.

        Instantiate a Celestia light node

        Now, let's instantiate a Celestia Light node:

        TIP

        RPC endpoints are exposed in all celestia-node types such as light, bridge and full nodes.

        bash
        celestia light init
        celestia light init
        bash
        celestia light init --p2p.network mocha
        celestia light init --p2p.network mocha
        bash
        celestia light init --p2p.network arabica
        celestia light init --p2p.network arabica

        Instantiating (or initializing) the node means setting up a node store on your machine. This is where the data and your keys will be stored.

        Connect to a core endpoint

        Let's now run the Celestia Light node with a gRPC connection to an example core endpoint. Connecting to a core endpoint provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

        Note: You are also encouraged to find a community-run API endpoint and there are several in the Discord. This one is used for demonstration purposes. Check out the Mocha testnet page, or Arabica devnet page.

        bash
        celestia light start --core.ip <URI>
        celestia light start --core.ip <URI>
        bash
        celestia light start --core.ip <URI> --p2p.network mocha
        celestia light start --core.ip <URI> --p2p.network mocha
        bash
        celestia light start --core.ip <URI> --p2p.network arabica
        celestia light start --core.ip <URI> --p2p.network arabica

        TIP

        The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

        Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

        For example, your command along with an RPC endpoint might look like this:

        bash
        celestia light start --core.ip consensus.lunaroasis.net
        celestia light start --core.ip consensus.lunaroasis.net
        bash
        celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
        celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
        bash
        celestia light start --core.ip validator-1.celestia-arabica-11.com \\
           --p2p.network arabica
        celestia light start --core.ip validator-1.celestia-arabica-11.com \\
           --p2p.network arabica

        Keys and wallets

        You can create your key for your node by running the following command from the celestia-node directory:

        TIP

        You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

        bash
        ./cel-key add <key-name> --keyring-backend test --node.type light \\
           --p2p.network <network>
        ./cel-key add <key-name> --keyring-backend test --node.type light \\
        -  --p2p.network <network>

        You can start your light node with the key created by running the following command:

        bash
        celestia light start --core.ip <URI> --keyring.keyname <key-name>
        celestia light start --core.ip <URI> --keyring.keyname <key-name>
        bash
        celestia light start --core.ip <URI> --keyring.keyname <key-name> \\
        +  --p2p.network <network>

        You can start your light node with the key created by running the following command:

        bash
        celestia light start --core.ip <URI> --keyring.keyname <key-name>
        celestia light start --core.ip <URI> --keyring.keyname <key-name>
        bash
        celestia light start --core.ip <URI> --keyring.keyname <key-name> \\
           --p2p.network mocha
        celestia light start --core.ip <URI> --keyring.keyname <key-name> \\
           --p2p.network mocha
        bash
        celestia light start --core.ip <URI> --keyring.keyname <key-name> \\
           --p2p.network arabica
        celestia light start --core.ip <URI> --keyring.keyname <key-name> \\
        @@ -394,4 +394,4 @@ import{c as a}from"./chunks/constants.295fc0ab.js";import{o as e,c as t,k as s,t
             ],
             0.002
           ]
        -}' 127.0.0.1:26658
        1. Upon successful blob submission, the result will show the block height:
        bash
        {"jsonrpc":"2.0","result":362101,"id":1}
        {"jsonrpc":"2.0","result":362101,"id":1}

        The example transaction can be found on Celenium.

        Post an SVG as a PFB

        If you'd like to create your own SVG, post it to Celestia, and retrieve it, you can check out the Base64 SVG Tutorial.

        Troubleshooting

        If you encounter an error like:

        sh
        "rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"
        "rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"

        It is possible that the account you are trying to submit a PayForBlobs from doesn't have testnet tokens yet. Ensure the testnet faucet has funded your account with tokens and then try again.

        `,93),R=JSON.parse('{"title":"Celestia-node RPC CLI tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia-node RPC CLI tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-tutorial.md","filePath":"developers/node-tutorial.md","lastUpdated":1725971357000}'),D={name:"developers/node-tutorial.md"},U=Object.assign(D,{setup(_){return(x,T)=>(e(),t("div",null,[c,s("p",null,"To set a custom node store for a light node on "+n(o(a).mochaChainId)+", you can use the following command:",1),s("div",r,[y,i,s("pre",E,[s("code",null,[s("span",d,[u,F,h,C,s("span",g,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])]),s("pre",b,[s("code",null,[s("span",q,[B,m,v,k,s("span",A,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])])]),f,s("p",null,[p("Here is an example command to retrieve the data from above, on "),s("code",null,n(o(a).arabicaChainId),1),p(":")]),w]))}});export{R as __pageData,U as default}; +}' 127.0.0.1:26658
        1. Upon successful blob submission, the result will show the block height:
        bash
        {"jsonrpc":"2.0","result":362101,"id":1}
        {"jsonrpc":"2.0","result":362101,"id":1}

        The example transaction can be found on Celenium.

        Post an SVG as a PFB

        If you'd like to create your own SVG, post it to Celestia, and retrieve it, you can check out the Base64 SVG Tutorial.

        Troubleshooting

        If you encounter an error like:

        sh
        "rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"
        "rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"

        It is possible that the account you are trying to submit a PayForBlobs from doesn't have testnet tokens yet. Ensure the testnet faucet has funded your account with tokens and then try again.

        `,93),R=JSON.parse('{"title":"Celestia-node RPC CLI tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia-node RPC CLI tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-tutorial.md","filePath":"developers/node-tutorial.md","lastUpdated":1725992025000}'),D={name:"developers/node-tutorial.md"},S=Object.assign(D,{setup(_){return(x,T)=>(e(),t("div",null,[c,s("p",null,"To set a custom node store for a light node on "+n(o(a).mochaChainId)+", you can use the following command:",1),s("div",r,[y,i,s("pre",E,[s("code",null,[s("span",d,[u,F,h,C,s("span",g,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])]),s("pre",b,[s("code",null,[s("span",q,[B,m,v,k,s("span",A,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])])]),f,s("p",null,[p("Here is an example command to retrieve the data from above, on "),s("code",null,n(o(a).arabicaChainId),1),p(":")]),w]))}});export{R as __pageData,S as default}; diff --git a/pr-1699/assets/developers_node-tutorial.md.358f7307.lean.js b/pr-1699/assets/developers_node-tutorial.md.79e6f899.lean.js similarity index 90% rename from pr-1699/assets/developers_node-tutorial.md.358f7307.lean.js rename to pr-1699/assets/developers_node-tutorial.md.79e6f899.lean.js index 8811d8034c..f3f97006d9 100644 --- a/pr-1699/assets/developers_node-tutorial.md.358f7307.lean.js +++ b/pr-1699/assets/developers_node-tutorial.md.79e6f899.lean.js @@ -1 +1 @@ -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as e,c as t,k as s,t as n,l as o,a as p,Q as l}from"./chunks/framework.b47e54aa.js";const c=l("",71),r={class:"language-bash vp-adaptive-theme"},y=s("button",{title:"Copy Code",class:"copy"},null,-1),i=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},d={class:"line"},u=s("span",{style:{color:"#F97583"}},"export",-1),F=s("span",{style:{color:"#E1E4E8"}}," NODE_STORE",-1),h=s("span",{style:{color:"#F97583"}},"=",-1),C=s("span",{style:{color:"#E1E4E8"}},"$HOME",-1),g={style:{color:"#9ECBFF"}},b={class:"shiki github-light vp-code-light"},q={class:"line"},B=s("span",{style:{color:"#D73A49"}},"export",-1),m=s("span",{style:{color:"#24292E"}}," NODE_STORE",-1),v=s("span",{style:{color:"#D73A49"}},"=",-1),k=s("span",{style:{color:"#24292E"}},"$HOME",-1),A={style:{color:"#032F62"}},f=l("",36),w=l("",93),R=JSON.parse('{"title":"Celestia-node RPC CLI tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia-node RPC CLI tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-tutorial.md","filePath":"developers/node-tutorial.md","lastUpdated":1725971357000}'),D={name:"developers/node-tutorial.md"},U=Object.assign(D,{setup(_){return(x,T)=>(e(),t("div",null,[c,s("p",null,"To set a custom node store for a light node on "+n(o(a).mochaChainId)+", you can use the following command:",1),s("div",r,[y,i,s("pre",E,[s("code",null,[s("span",d,[u,F,h,C,s("span",g,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])]),s("pre",b,[s("code",null,[s("span",q,[B,m,v,k,s("span",A,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])])]),f,s("p",null,[p("Here is an example command to retrieve the data from above, on "),s("code",null,n(o(a).arabicaChainId),1),p(":")]),w]))}});export{R as __pageData,U as default}; +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as e,c as t,k as s,t as n,l as o,a as p,Q as l}from"./chunks/framework.b47e54aa.js";const c=l("",71),r={class:"language-bash vp-adaptive-theme"},y=s("button",{title:"Copy Code",class:"copy"},null,-1),i=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},d={class:"line"},u=s("span",{style:{color:"#F97583"}},"export",-1),F=s("span",{style:{color:"#E1E4E8"}}," NODE_STORE",-1),h=s("span",{style:{color:"#F97583"}},"=",-1),C=s("span",{style:{color:"#E1E4E8"}},"$HOME",-1),g={style:{color:"#9ECBFF"}},b={class:"shiki github-light vp-code-light"},q={class:"line"},B=s("span",{style:{color:"#D73A49"}},"export",-1),m=s("span",{style:{color:"#24292E"}}," NODE_STORE",-1),v=s("span",{style:{color:"#D73A49"}},"=",-1),k=s("span",{style:{color:"#24292E"}},"$HOME",-1),A={style:{color:"#032F62"}},f=l("",36),w=l("",93),R=JSON.parse('{"title":"Celestia-node RPC CLI tutorial","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Celestia-node RPC CLI tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/node-tutorial.md","filePath":"developers/node-tutorial.md","lastUpdated":1725992025000}'),D={name:"developers/node-tutorial.md"},S=Object.assign(D,{setup(_){return(x,T)=>(e(),t("div",null,[c,s("p",null,"To set a custom node store for a light node on "+n(o(a).mochaChainId)+", you can use the following command:",1),s("div",r,[y,i,s("pre",E,[s("code",null,[s("span",d,[u,F,h,C,s("span",g,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])]),s("pre",b,[s("code",null,[s("span",q,[B,m,v,k,s("span",A,"/your-custom-path/celestia-light-"+n(o(a).mochaChainId),1)])])])]),f,s("p",null,[p("Here is an example command to retrieve the data from above, on "),s("code",null,n(o(a).arabicaChainId),1),p(":")]),w]))}});export{R as __pageData,S as default}; diff --git a/pr-1699/assets/developers_optimism-devnet.md.6da256da.js b/pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.js similarity index 99% rename from pr-1699/assets/developers_optimism-devnet.md.6da256da.js rename to pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.js index 440eca1dc2..a549662e7a 100644 --- a/pr-1699/assets/developers_optimism-devnet.md.6da256da.js +++ b/pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Optimism devnet deep dive","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Optimism devnet deep dive | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism-devnet.md","filePath":"developers/optimism-devnet.md","lastUpdated":1725971357000}'),l={name:"developers/optimism-devnet.md"},o=e(`

        Optimism devnet deep dive

        This page is for those interested in doing a deep dive on their pre-op-plasma-celestia @celestiaorg/optimism rollups.

        Find a transaction

        Now, we'll check for a recent transaction on the L1 with:

        bash
        cast block latest --rpc-url localhost:8545
        cast block latest --rpc-url localhost:8545

        Output of a block that contains a transaction will look like this:

        console
        baseFeePerGas        7
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Optimism devnet deep dive","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Optimism devnet deep dive | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism-devnet.md","filePath":"developers/optimism-devnet.md","lastUpdated":1725992025000}'),l={name:"developers/optimism-devnet.md"},o=e(`

        Optimism devnet deep dive

        This page is for those interested in doing a deep dive on their pre-op-plasma-celestia @celestiaorg/optimism rollups.

        Find a transaction

        Now, we'll check for a recent transaction on the L1 with:

        bash
        cast block latest --rpc-url localhost:8545
        cast block latest --rpc-url localhost:8545

        Output of a block that contains a transaction will look like this:

        console
        baseFeePerGas        7
         difficulty           2
         extraData            0xd883010d04846765746888676f312e32312e33856c696e7578000000000000006b3afa42dce1f87f1f07a1ef569c4d43e41738ef93c865098bfa1458645f384e2e4498bcfe4ad9353ff1913a2e16162f496fafe5b0939a6c78fb5b503248d6da01
         gasLimit             30000000
        diff --git a/pr-1699/assets/developers_optimism-devnet.md.6da256da.lean.js b/pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.lean.js
        similarity index 89%
        rename from pr-1699/assets/developers_optimism-devnet.md.6da256da.lean.js
        rename to pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.lean.js
        index 5b7f6ec599..ab49c1d99d 100644
        --- a/pr-1699/assets/developers_optimism-devnet.md.6da256da.lean.js
        +++ b/pr-1699/assets/developers_optimism-devnet.md.3b3f49a3.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Optimism devnet deep dive","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Optimism devnet deep dive | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism-devnet.md","filePath":"developers/optimism-devnet.md","lastUpdated":1725971357000}'),l={name:"developers/optimism-devnet.md"},o=e("",26),p=[o];function c(t,r,d,i,y,b){return a(),n("div",null,p)}const h=s(l,[["render",c]]);export{f as __pageData,h as default};
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Optimism devnet deep dive","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Optimism devnet deep dive | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism-devnet.md","filePath":"developers/optimism-devnet.md","lastUpdated":1725992025000}'),l={name:"developers/optimism-devnet.md"},o=e("",26),p=[o];function c(t,r,d,i,y,b){return a(),n("div",null,p)}const h=s(l,[["render",c]]);export{f as __pageData,h as default};
        diff --git a/pr-1699/assets/developers_optimism.md.363527ac.js b/pr-1699/assets/developers_optimism.md.d6e1e2ee.js
        similarity index 93%
        rename from pr-1699/assets/developers_optimism.md.363527ac.js
        rename to pr-1699/assets/developers_optimism.md.d6e1e2ee.js
        index 613c8bda18..fabef7e090 100644
        --- a/pr-1699/assets/developers_optimism.md.363527ac.js
        +++ b/pr-1699/assets/developers_optimism.md.d6e1e2ee.js
        @@ -1,4 +1,4 @@
        -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as t,c as l,k as s,t as e,l as n,Q as o}from"./chunks/framework.b47e54aa.js";const p=o('

        Run an OP Stack rollup with Celestia underneath

        This guide will show you how to run your own OP Stack devnet and testnet that posts data to Celestia's Mocha testnet using roll-op and op-plasma-celestia.

        If you don't have devops experience and would like to use a Rollups as a Service (RaaS) provider, see the RaaS category in the menu.

        Dependency setup

        Setting up your light node

        Sync and fund a Celestia light node. The light node must be fully synced and funded for you to be able to submit and retrieve PayForBlobs to Mocha Testnet. This allows your rollup to post and retrieve data without any errors.

        In order to mount existing data, you must have a node store that is in the default directory:

        ',8),c={class:"vp-code-group vp-adaptive-theme"},r=o('
        ',1),i={class:"blocks"},d={class:"language-bash vp-adaptive-theme active"},u=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),y={class:"shiki github-dark vp-code-dark"},_={class:"line"},E={style:{color:"#E1E4E8"}},g={class:"shiki github-light vp-code-light"},b={class:"line"},m={style:{color:"#24292E"}},v=o('
        bash
        $HOME/.celestia-light
        $HOME/.celestia-light
        ',1),k={class:"language-bash vp-adaptive-theme"},C=s("button",{title:"Copy Code",class:"copy"},null,-1),q=s("span",{class:"lang"},"bash",-1),f={class:"shiki github-dark vp-code-dark"},F={class:"line"},S={style:{color:"#E1E4E8"}},T={class:"shiki github-light vp-code-light"},w={class:"line"},A={style:{color:"#24292E"}},D=o(`

        By default, the node will run with the account named my_celes_key on Mocha. This is the account that needs to be funded.

        TIP

        Unless you changed your configuration, you won't have to change anything. 😎

        Deploying a devnet to Mocha

        See the Alt-DA x Celestia README for instructions on how to deploy a Devnet.

        TIP for macOS users

        If you are on macOS, you will need to run a venv before starting roll-op.

        sh
        cd $HOME/roll-op
        +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as t,c as l,k as s,t as e,l as n,Q as o}from"./chunks/framework.b47e54aa.js";const p=o('

        Run an OP Stack rollup with Celestia underneath

        This guide will show you how to run your own OP Stack devnet and testnet that posts data to Celestia's Mocha testnet using roll-op and op-plasma-celestia.

        If you don't have devops experience and would like to use a Rollups as a Service (RaaS) provider, see the RaaS category in the menu.

        Dependency setup

        Setting up your light node

        Sync and fund a Celestia light node. The light node must be fully synced and funded for you to be able to submit and retrieve PayForBlobs to Mocha Testnet. This allows your rollup to post and retrieve data without any errors.

        In order to mount existing data, you must have a node store that is in the default directory:

        ',8),c={class:"vp-code-group vp-adaptive-theme"},r=o('
        ',1),i={class:"blocks"},d={class:"language-bash vp-adaptive-theme active"},u=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),y={class:"shiki github-dark vp-code-dark"},_={class:"line"},E={style:{color:"#E1E4E8"}},g={class:"shiki github-light vp-code-light"},m={class:"line"},b={style:{color:"#24292E"}},v=o('
        bash
        $HOME/.celestia-light
        $HOME/.celestia-light
        ',1),k={class:"language-bash vp-adaptive-theme"},C=s("button",{title:"Copy Code",class:"copy"},null,-1),f=s("span",{class:"lang"},"bash",-1),F={class:"shiki github-dark vp-code-dark"},q={class:"line"},A={style:{color:"#E1E4E8"}},S={class:"shiki github-light vp-code-light"},w={class:"line"},T={style:{color:"#24292E"}},D=o(`

        By default, the node will run with the account named my_celes_key on Mocha. This is the account that needs to be funded.

        TIP

        Unless you changed your configuration, you won't have to change anything. 😎

        Deploying a devnet to Mocha

        See the Alt-DA x Celestia README for instructions on how to deploy a Devnet.

        TIP for macOS users

        If you are on macOS, you will need to run a venv before starting roll-op.

        sh
        cd $HOME/roll-op
         python3 -m venv ./venv
         source ./venv/bin/activate
        cd $HOME/roll-op
         python3 -m venv ./venv
        @@ -42,4 +42,4 @@ import{c as a}from"./chunks/constants.295fc0ab.js";import{o as t,c as l,k as s,t
         admin_account = "0xaddress"
         admin_key = "privatekey"
         p2p_sequencer_account = "0xaddress"
        -p2p_sequencer_key = "privatekey"

        Your 0xaddress key must also be funded with testnet ETH. We recommend at least 10 SepoliaETH to get your chain started, but you will need more to keep it running longer.

        Congratulations

        Congrats! You now have an OP Stack rollup running with Celestia underneath.

        You can learn more about Alt-DA in Optimism docs.

        `,16),O=JSON.parse('{"title":"Run an OP Stack rollup with Celestia underneath","description":"Start your own rollup with op-plasma-celestia and roll-op.","frontmatter":{"description":"Start your own rollup with op-plasma-celestia and roll-op.","next":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"head":[["meta",{"name":"og:title","content":"Run an OP Stack rollup with Celestia underneath | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism.md","filePath":"developers/optimism.md","lastUpdated":1725971357000}'),P={name:"developers/optimism.md"},V=Object.assign(P,{setup(x){return(B,M)=>(t(),l("div",null,[p,s("div",c,[r,s("div",i,[s("div",d,[u,h,s("pre",y,[s("code",null,[s("span",_,[s("span",E,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])]),s("pre",g,[s("code",null,[s("span",b,[s("span",m,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])])]),v,s("div",k,[C,q,s("pre",f,[s("code",null,[s("span",F,[s("span",S,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])]),s("pre",T,[s("code",null,[s("span",w,[s("span",A,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])])])])]),D]))}});export{O as __pageData,V as default}; +p2p_sequencer_key = "privatekey"

        Your 0xaddress key must also be funded with testnet ETH. We recommend at least 10 SepoliaETH to get your chain started, but you will need more to keep it running longer.

        Congratulations

        Congrats! You now have an OP Stack rollup running with Celestia underneath.

        You can learn more about Alt-DA in Optimism docs.

        `,16),O=JSON.parse('{"title":"Run an OP Stack rollup with Celestia underneath","description":"Start your own rollup with op-plasma-celestia and roll-op.","frontmatter":{"description":"Start your own rollup with op-plasma-celestia and roll-op.","next":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"head":[["meta",{"name":"og:title","content":"Run an OP Stack rollup with Celestia underneath | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism.md","filePath":"developers/optimism.md","lastUpdated":1725992025000}'),P={name:"developers/optimism.md"},V=Object.assign(P,{setup(x){return(B,M)=>(t(),l("div",null,[p,s("div",c,[r,s("div",i,[s("div",d,[u,h,s("pre",y,[s("code",null,[s("span",_,[s("span",E,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])]),s("pre",g,[s("code",null,[s("span",m,[s("span",b,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])])]),v,s("div",k,[C,f,s("pre",F,[s("code",null,[s("span",q,[s("span",A,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])]),s("pre",S,[s("code",null,[s("span",w,[s("span",T,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])])])])]),D]))}});export{O as __pageData,V as default}; diff --git a/pr-1699/assets/developers_optimism.md.363527ac.lean.js b/pr-1699/assets/developers_optimism.md.d6e1e2ee.lean.js similarity index 60% rename from pr-1699/assets/developers_optimism.md.363527ac.lean.js rename to pr-1699/assets/developers_optimism.md.d6e1e2ee.lean.js index 87db6d243f..20d7f1eb2f 100644 --- a/pr-1699/assets/developers_optimism.md.363527ac.lean.js +++ b/pr-1699/assets/developers_optimism.md.d6e1e2ee.lean.js @@ -1 +1 @@ -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as t,c as l,k as s,t as e,l as n,Q as o}from"./chunks/framework.b47e54aa.js";const p=o("",8),c={class:"vp-code-group vp-adaptive-theme"},r=o("",1),i={class:"blocks"},d={class:"language-bash vp-adaptive-theme active"},u=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),y={class:"shiki github-dark vp-code-dark"},_={class:"line"},E={style:{color:"#E1E4E8"}},g={class:"shiki github-light vp-code-light"},b={class:"line"},m={style:{color:"#24292E"}},v=o("",1),k={class:"language-bash vp-adaptive-theme"},C=s("button",{title:"Copy Code",class:"copy"},null,-1),q=s("span",{class:"lang"},"bash",-1),f={class:"shiki github-dark vp-code-dark"},F={class:"line"},S={style:{color:"#E1E4E8"}},T={class:"shiki github-light vp-code-light"},w={class:"line"},A={style:{color:"#24292E"}},D=o("",16),O=JSON.parse('{"title":"Run an OP Stack rollup with Celestia underneath","description":"Start your own rollup with op-plasma-celestia and roll-op.","frontmatter":{"description":"Start your own rollup with op-plasma-celestia and roll-op.","next":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"head":[["meta",{"name":"og:title","content":"Run an OP Stack rollup with Celestia underneath | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism.md","filePath":"developers/optimism.md","lastUpdated":1725971357000}'),P={name:"developers/optimism.md"},V=Object.assign(P,{setup(x){return(B,M)=>(t(),l("div",null,[p,s("div",c,[r,s("div",i,[s("div",d,[u,h,s("pre",y,[s("code",null,[s("span",_,[s("span",E,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])]),s("pre",g,[s("code",null,[s("span",b,[s("span",m,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])])]),v,s("div",k,[C,q,s("pre",f,[s("code",null,[s("span",F,[s("span",S,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])]),s("pre",T,[s("code",null,[s("span",w,[s("span",A,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])])])])]),D]))}});export{O as __pageData,V as default}; +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as t,c as l,k as s,t as e,l as n,Q as o}from"./chunks/framework.b47e54aa.js";const p=o("",8),c={class:"vp-code-group vp-adaptive-theme"},r=o("",1),i={class:"blocks"},d={class:"language-bash vp-adaptive-theme active"},u=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),y={class:"shiki github-dark vp-code-dark"},_={class:"line"},E={style:{color:"#E1E4E8"}},g={class:"shiki github-light vp-code-light"},m={class:"line"},b={style:{color:"#24292E"}},v=o("",1),k={class:"language-bash vp-adaptive-theme"},C=s("button",{title:"Copy Code",class:"copy"},null,-1),f=s("span",{class:"lang"},"bash",-1),F={class:"shiki github-dark vp-code-dark"},q={class:"line"},A={style:{color:"#E1E4E8"}},S={class:"shiki github-light vp-code-light"},w={class:"line"},T={style:{color:"#24292E"}},D=o("",16),O=JSON.parse('{"title":"Run an OP Stack rollup with Celestia underneath","description":"Start your own rollup with op-plasma-celestia and roll-op.","frontmatter":{"description":"Start your own rollup with op-plasma-celestia and roll-op.","next":{"text":"Ethereum fallback mechanism","link":"/developers/ethereum-fallback"},"head":[["meta",{"name":"og:title","content":"Run an OP Stack rollup with Celestia underneath | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/optimism.md","filePath":"developers/optimism.md","lastUpdated":1725992025000}'),P={name:"developers/optimism.md"},V=Object.assign(P,{setup(x){return(B,M)=>(t(),l("div",null,[p,s("div",c,[r,s("div",i,[s("div",d,[u,h,s("pre",y,[s("code",null,[s("span",_,[s("span",E,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])]),s("pre",g,[s("code",null,[s("span",m,[s("span",b,"$HOME/.celestia-light-"+e(n(a).mochaChainId),1)])])])]),v,s("div",k,[C,f,s("pre",F,[s("code",null,[s("span",q,[s("span",A,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])]),s("pre",S,[s("code",null,[s("span",w,[s("span",T,"$HOME/.celestia-light-"+e(n(a).arabicaChainId),1)])])])])])]),D]))}});export{O as __pageData,V as default}; diff --git a/pr-1699/assets/developers_prompt-scavenger.md.fea07a57.js b/pr-1699/assets/developers_prompt-scavenger.md.ae717331.js similarity index 99% rename from pr-1699/assets/developers_prompt-scavenger.md.fea07a57.js rename to pr-1699/assets/developers_prompt-scavenger.md.ae717331.js index 8131a179c3..293fda62cd 100644 --- a/pr-1699/assets/developers_prompt-scavenger.md.fea07a57.js +++ b/pr-1699/assets/developers_prompt-scavenger.md.ae717331.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Prompt scavenger","description":"Learn how to interact with the Celestia Node API with this tutorial.","frontmatter":{"description":"Learn how to interact with the Celestia Node API with this tutorial.","prev":{"text":"Rust client tutorial","link":"/developers/rust-client-tutorial"},"head":[["meta",{"name":"og:title","content":"Prompt scavenger | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/prompt-scavenger.md","filePath":"developers/prompt-scavenger.md","lastUpdated":1725971357000}'),p={name:"developers/prompt-scavenger.md"},o=l(`

        Prompt scavenger

        Welcome to the world of Prompt Scavenger, a game where you’ll be using Celestia’s Node API and OpenAI’s GPT-3.5 to decode hidden messages scattered throughout Celestia’s blockchain. In this tutorial, we’ll be using Golang to write the code for the game.

        Through this tutorial, you’ll gain experience using Celestia’s Node API to fetch data from the blockchain, process it, and submit new transactions with that data. You’ll also learn how to integrate OpenAI’s GPT-3.5 API to generate fun responses based on the data you’ve found.

        So if you’re ready to embark on an adventure that combines blockchain technology with the power of AI, and learn some Golang along the way, let’s get started!

        Dependencies

        The following dependencies are needed to be installed or obtained:

        Install Celestia Node and run a light node

        First, install the celestia-node binary.

        Let's start by initializing our light node and funding our account with some tokens. We will be using the Arabica testnet for this tutorial.

        sh
        celestia light init --p2p.network arabica
        celestia light init --p2p.network arabica

        You will see an output ending with something looking like this:

        2024-05-22T14:15:49.554+0200	INFO	node	nodebuilder/init.go:211	NO KEY FOUND IN STORE, GENERATING NEW KEY...
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Prompt scavenger","description":"Learn how to interact with the Celestia Node API with this tutorial.","frontmatter":{"description":"Learn how to interact with the Celestia Node API with this tutorial.","prev":{"text":"Rust client tutorial","link":"/developers/rust-client-tutorial"},"head":[["meta",{"name":"og:title","content":"Prompt scavenger | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/prompt-scavenger.md","filePath":"developers/prompt-scavenger.md","lastUpdated":1725992025000}'),p={name:"developers/prompt-scavenger.md"},o=l(`

        Prompt scavenger

        Welcome to the world of Prompt Scavenger, a game where you’ll be using Celestia’s Node API and OpenAI’s GPT-3.5 to decode hidden messages scattered throughout Celestia’s blockchain. In this tutorial, we’ll be using Golang to write the code for the game.

        Through this tutorial, you’ll gain experience using Celestia’s Node API to fetch data from the blockchain, process it, and submit new transactions with that data. You’ll also learn how to integrate OpenAI’s GPT-3.5 API to generate fun responses based on the data you’ve found.

        So if you’re ready to embark on an adventure that combines blockchain technology with the power of AI, and learn some Golang along the way, let’s get started!

        Dependencies

        The following dependencies are needed to be installed or obtained:

        Install Celestia Node and run a light node

        First, install the celestia-node binary.

        Let's start by initializing our light node and funding our account with some tokens. We will be using the Arabica testnet for this tutorial.

        sh
        celestia light init --p2p.network arabica
        celestia light init --p2p.network arabica

        You will see an output ending with something looking like this:

        2024-05-22T14:15:49.554+0200	INFO	node	nodebuilder/init.go:211	NO KEY FOUND IN STORE, GENERATING NEW KEY...
         2024-05-22T14:15:49.564+0200	INFO	node	nodebuilder/init.go:216	NEW KEY GENERATED...
         
         NAME: my_celes_key
        diff --git a/pr-1699/assets/developers_prompt-scavenger.md.fea07a57.lean.js b/pr-1699/assets/developers_prompt-scavenger.md.ae717331.lean.js
        similarity index 84%
        rename from pr-1699/assets/developers_prompt-scavenger.md.fea07a57.lean.js
        rename to pr-1699/assets/developers_prompt-scavenger.md.ae717331.lean.js
        index 30b4a0dc25..95f2d7ec9a 100644
        --- a/pr-1699/assets/developers_prompt-scavenger.md.fea07a57.lean.js
        +++ b/pr-1699/assets/developers_prompt-scavenger.md.ae717331.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Prompt scavenger","description":"Learn how to interact with the Celestia Node API with this tutorial.","frontmatter":{"description":"Learn how to interact with the Celestia Node API with this tutorial.","prev":{"text":"Rust client tutorial","link":"/developers/rust-client-tutorial"},"head":[["meta",{"name":"og:title","content":"Prompt scavenger | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/prompt-scavenger.md","filePath":"developers/prompt-scavenger.md","lastUpdated":1725971357000}'),p={name:"developers/prompt-scavenger.md"},o=l("",64),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Prompt scavenger","description":"Learn how to interact with the Celestia Node API with this tutorial.","frontmatter":{"description":"Learn how to interact with the Celestia Node API with this tutorial.","prev":{"text":"Rust client tutorial","link":"/developers/rust-client-tutorial"},"head":[["meta",{"name":"og:title","content":"Prompt scavenger | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/prompt-scavenger.md","filePath":"developers/prompt-scavenger.md","lastUpdated":1725992025000}'),p={name:"developers/prompt-scavenger.md"},o=l("",64),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
        diff --git a/pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.js b/pr-1699/assets/developers_rust-client-tutorial.md.168637c4.js
        similarity index 99%
        rename from pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.js
        rename to pr-1699/assets/developers_rust-client-tutorial.md.168637c4.js
        index efff2b4037..9f0ac2f056 100644
        --- a/pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.js
        +++ b/pr-1699/assets/developers_rust-client-tutorial.md.168637c4.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Rust client library tutorial","description":"","frontmatter":{"next":{"text":"Prompt Scavenger","link":"/developers/prompt-scavenger"},"head":[["meta",{"name":"og:title","content":"Rust client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/rust-client-tutorial.md","filePath":"developers/rust-client-tutorial.md","lastUpdated":1725971357000}'),p={name:"developers/rust-client-tutorial.md"},o=l(`

        Rust client library tutorial

        This section tutorial will guide you through using the most common RPC endpoints with Lumina's rust client library.

        Install dependencies and celestia-node if you have not already.

        Project setup

        To start, add celestia_rpc and celestia_types as a dependency to your project:

        bash
        cargo add celestia_rpc celestia_types
        cargo add celestia_rpc celestia_types

        To use the following methods, you will need the node URL and your auth token. To get your auth token, see this guide. To run your node without an auth token, you can use the --rpc.skip-auth flag when starting your node. This allows you to pass an empty string as your auth token.

        The default URL is http://localhost:26658. If you would like to use subscription methods, such as SubscribeHeaders below, you must use the ws protocol in place of http: ws://localhost:26658.

        Submitting and retrieving blobs

        The blob.Submit method takes an array of blobs and a gas price, returning the height the blob was successfully posted at.

        • The namespace can be generated with Namespace::new_v0.
        • The blobs can be generated with Blob::new.
        • You can set GasPrice::default() as the gas price to have celestia-node automatically determine an appropriate gas price.

        The blob.GetAll method takes a height and array of namespaces, returning the array of blobs found in the given namespaces.

        rust
        use celestia_rpc::{BlobClient, Client, HeaderClient, ShareClient};
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Rust client library tutorial","description":"","frontmatter":{"next":{"text":"Prompt Scavenger","link":"/developers/prompt-scavenger"},"head":[["meta",{"name":"og:title","content":"Rust client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/rust-client-tutorial.md","filePath":"developers/rust-client-tutorial.md","lastUpdated":1725992025000}'),p={name:"developers/rust-client-tutorial.md"},o=l(`

        Rust client library tutorial

        This section tutorial will guide you through using the most common RPC endpoints with Lumina's rust client library.

        Install dependencies and celestia-node if you have not already.

        Project setup

        To start, add celestia_rpc and celestia_types as a dependency to your project:

        bash
        cargo add celestia_rpc celestia_types
        cargo add celestia_rpc celestia_types

        To use the following methods, you will need the node URL and your auth token. To get your auth token, see this guide. To run your node without an auth token, you can use the --rpc.skip-auth flag when starting your node. This allows you to pass an empty string as your auth token.

        The default URL is http://localhost:26658. If you would like to use subscription methods, such as SubscribeHeaders below, you must use the ws protocol in place of http: ws://localhost:26658.

        Submitting and retrieving blobs

        The blob.Submit method takes an array of blobs and a gas price, returning the height the blob was successfully posted at.

        • The namespace can be generated with Namespace::new_v0.
        • The blobs can be generated with Blob::new.
        • You can set GasPrice::default() as the gas price to have celestia-node automatically determine an appropriate gas price.

        The blob.GetAll method takes a height and array of namespaces, returning the array of blobs found in the given namespaces.

        rust
        use celestia_rpc::{BlobClient, Client, HeaderClient, ShareClient};
         use celestia_types::blob::GasPrice;
         use celestia_types::{nmt::Namespace, Blob, ExtendedDataSquare};
         
        diff --git a/pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.lean.js b/pr-1699/assets/developers_rust-client-tutorial.md.168637c4.lean.js
        similarity index 90%
        rename from pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.lean.js
        rename to pr-1699/assets/developers_rust-client-tutorial.md.168637c4.lean.js
        index 7dad95d7f0..fd5e61264b 100644
        --- a/pr-1699/assets/developers_rust-client-tutorial.md.df611bd3.lean.js
        +++ b/pr-1699/assets/developers_rust-client-tutorial.md.168637c4.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Rust client library tutorial","description":"","frontmatter":{"next":{"text":"Prompt Scavenger","link":"/developers/prompt-scavenger"},"head":[["meta",{"name":"og:title","content":"Rust client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/rust-client-tutorial.md","filePath":"developers/rust-client-tutorial.md","lastUpdated":1725971357000}'),p={name:"developers/rust-client-tutorial.md"},o=l("",21),e=[o];function t(c,r,E,y,i,F){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Rust client library tutorial","description":"","frontmatter":{"next":{"text":"Prompt Scavenger","link":"/developers/prompt-scavenger"},"head":[["meta",{"name":"og:title","content":"Rust client library tutorial | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/rust-client-tutorial.md","filePath":"developers/rust-client-tutorial.md","lastUpdated":1725992025000}'),p={name:"developers/rust-client-tutorial.md"},o=l("",21),e=[o];function t(c,r,E,y,i,F){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
        diff --git a/pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.js b/pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.js
        similarity index 98%
        rename from pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.js
        rename to pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.js
        index 0255dbbd90..f784428f99 100644
        --- a/pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.js
        +++ b/pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.js
        @@ -1,3 +1,3 @@
        -import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"New SP1 Blobstream deployments","description":"","frontmatter":{"next":{"text":"Integrate with Blobstream X contracts","link":"/developers/blobstream-contracts"},"head":[["meta",{"name":"og:title","content":"New SP1 Blobstream deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/sp1-blobstream-deploy.md","filePath":"developers/sp1-blobstream-deploy.md","lastUpdated":1725971357000}'),a={name:"developers/sp1-blobstream-deploy.md"},l=s(`

        New SP1 Blobstream deployments

        This document provides instructions for deploying SP1 Blobstream to a new chain.

        SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

        Deploying the contracts

        To deploy SP1 Blobstream to a new chain, follow these steps:

        1. Clone the sp1-blobstream repository:
        shell
        git clone https://github.com/succinctlabs/sp1-blobstream
        +import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"New SP1 Blobstream deployments","description":"","frontmatter":{"next":{"text":"Integrate with Blobstream X contracts","link":"/developers/blobstream-contracts"},"head":[["meta",{"name":"og:title","content":"New SP1 Blobstream deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/sp1-blobstream-deploy.md","filePath":"developers/sp1-blobstream-deploy.md","lastUpdated":1725992025000}'),a={name:"developers/sp1-blobstream-deploy.md"},l=s(`

        New SP1 Blobstream deployments

        This document provides instructions for deploying SP1 Blobstream to a new chain.

        SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

        Deploying the contracts

        To deploy SP1 Blobstream to a new chain, follow these steps:

        1. Clone the sp1-blobstream repository:
        shell
        git clone https://github.com/succinctlabs/sp1-blobstream
         cd sp1-blobstream
        git clone https://github.com/succinctlabs/sp1-blobstream
         cd sp1-blobstream
        1. Follow the deployment instructions in the sp1-blobstream README.

        2. If you're deploying on a chain where there isn't a canonical verifier listed in the SP1 contract addresses, you'll need to:

          a. Deploy your own SP1 Verifier from the sp1-contracts matching your sp1-sdk version. b. Set the SP1_VERIFIER_ADDRESS in your .env file to the address of your deployed verifier.

        3. To run the prover:

          • For local proving, set SP1_PROVER=local in your environment.
          • To use the Succinct Proving Network for remote proving, set SP1_PROVER=network.
          • We recommend an instance with 64 vCPU and 128GB of RAM for local proving.

        Note: Any whitelisting for custom provers would need to be implemented in the application's smart contracts (e.g., by using an approvedProvers mapping).

        `,9),n=[l];function r(p,c,i,d,h,b){return t(),o("div",null,n)}const u=e(a,[["render",r]]);export{y as __pageData,u as default}; diff --git a/pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.lean.js b/pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.lean.js similarity index 91% rename from pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.lean.js rename to pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.lean.js index 52aebc95a3..d3be89a062 100644 --- a/pr-1699/assets/developers_sp1-blobstream-deploy.md.b0ce75b2.lean.js +++ b/pr-1699/assets/developers_sp1-blobstream-deploy.md.e4975a52.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"New SP1 Blobstream deployments","description":"","frontmatter":{"next":{"text":"Integrate with Blobstream X contracts","link":"/developers/blobstream-contracts"},"head":[["meta",{"name":"og:title","content":"New SP1 Blobstream deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/sp1-blobstream-deploy.md","filePath":"developers/sp1-blobstream-deploy.md","lastUpdated":1725971357000}'),a={name:"developers/sp1-blobstream-deploy.md"},l=s("",9),n=[l];function r(p,c,i,d,h,b){return t(),o("div",null,n)}const u=e(a,[["render",r]]);export{y as __pageData,u as default}; +import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.b47e54aa.js";const y=JSON.parse('{"title":"New SP1 Blobstream deployments","description":"","frontmatter":{"next":{"text":"Integrate with Blobstream X contracts","link":"/developers/blobstream-contracts"},"head":[["meta",{"name":"og:title","content":"New SP1 Blobstream deployments | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/sp1-blobstream-deploy.md","filePath":"developers/sp1-blobstream-deploy.md","lastUpdated":1725992025000}'),a={name:"developers/sp1-blobstream-deploy.md"},l=s("",9),n=[l];function r(p,c,i,d,h,b){return t(),o("div",null,n)}const u=e(a,[["render",r]]);export{y as __pageData,u as default}; diff --git a/pr-1699/assets/developers_submit-data.md.506ef31e.js b/pr-1699/assets/developers_submit-data.md.7f90d09f.js similarity index 99% rename from pr-1699/assets/developers_submit-data.md.506ef31e.js rename to pr-1699/assets/developers_submit-data.md.7f90d09f.js index 624be8a9f6..38611f405a 100644 --- a/pr-1699/assets/developers_submit-data.md.506ef31e.js +++ b/pr-1699/assets/developers_submit-data.md.7f90d09f.js @@ -1,4 +1,4 @@ -import{_ as t,o as a,c as n,k as s,a as l,Q as e}from"./chunks/framework.b47e54aa.js";const ts=JSON.parse('{"title":"Submitting data blobs to Celestia","description":"","frontmatter":{"prev":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"head":[["meta",{"name":"og:title","content":"Submitting data blobs to Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/submit-data.md","filePath":"developers/submit-data.md","lastUpdated":1725971357000}'),o={name:"developers/submit-data.md"},p=e('

        Submitting data blobs to Celestia

        To submit data to Celestia, users submit blob transactions (BlobTx). Blob transactions contain two components, a standard Cosmos-SDK transaction called MsgPayForBlobs and one or more Blobs of data.

        Maximum blob size

        The maximum total blob size in a transaction is just under 2 MiB (1,973,786 bytes), based on a 64x64 share grid (4096 shares). With one share for the PFB transaction, 4095 shares remain: 1 at 478 bytes and 4094 at 482 bytes each.

        This is subject to change based on governance parameters. Learn more on the Mainnet Beta page under "Maximum bytes".

        It is advisable to submit transactions where the total blob size is significantly smaller than 1.8 MiB (e.g. 500 KiB) in order for your transaction to get included in a block quickly. If a tx contains blobs approaching 1.8 MiB then there will be no room for any other transactions. This means that your transaction will only be included in a block if it has a higher gas price than every other transaction in the mempool.

        Fee market and mempool

        Celestia makes use of a standard gas-priced prioritized mempool. By default, transactions with gas prices higher than that of other transactions in the mempool will be prioritized by validators.

        Fees and gas limits

        As of version v1.0.0 of the application (celestia-app), there is no protocol enforced minimum fee (similar to EIP-1559 in Ethereum). Instead, each consensus node running a mempool uses a locally configured gas price threshold that must be met in order for that node to accept a transaction, either directly from a user or gossiped from another node, into its mempool.

        As of version v1.0.0 of the application (celestia-app), gas is not refunded. Instead, transaction fees are deducted by a flat fee, originally specified by the user in their tx (where fees = gasLimit * gasPrice). This means that users should use an accurate gas limit value if they do not wish to overpay.

        Under the hood, fees are currently handled by specifying and deducting a flat fee. However gas price is often specified by users instead of calculating the flat fee from the gas used and the gas price. Since the state machine does not refund users for unused gas, gas price is calculated by dividing the total fee by the gas limit.

        Estimating PFB gas

        Generally, the gas used by a PFB transaction involves a static fixed cost and a dynamic cost based on the size of each blob in the transaction.

        NOTE

        For a general use case of a normal account submitting a PFB, the static costs can be treated as such. However, due to the description above of how gas works in the Cosmos-SDK this is not always the case. Notably, if a vesting account or the feegrant modules are used, then these static costs change.

        The fixed cost is an approximation of the gas consumed by operations outside the function GasToConsume (for example, signature verification, tx size, read access to accounts), which has a default value of 65,000 gas.

        NOTE

        The first transaction sent by an account (sequence number == 0) has an additional one time gas cost of 10,000 gas. If this is the case, this should be accounted for.

        Each blob in the PFB contributes to the total gas cost based on its size. The function GasToConsume calculates the total gas consumed by all the blobs involved in a PFB, where each blob's gas cost is computed by first determining how many shares are needed to store the blob size. Then, it computes the product of the number of shares, the number of bytes per share, and the gasPerByte parameter. Finally, it adds a static amount per blob.

        The blob.GasPerBlobByte and auth.TxSizeCostPerByte are parameters that could potentially be adjusted through the system's governance mechanisms. Hence, actual costs may vary depending on the current state of these parameters.

        Gas fee calculation

        The total fee for a transaction is calculated as the product of the gas limit for the transaction and the gas price set by the user:

        ',21),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.471ex",height:"1.781ex",role:"img",focusable:"false",viewBox:"0 -705 15236 787","aria-hidden":"true"},i=e('',1),Q=[i],T=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Total Fee"),s("mo",null,"="),s("mtext",null,"Gas Limit"),s("mo",null,"×"),s("mtext",null,"Gas Price")])],-1),y=s("p",null,"The gas limit for a transaction is the maximum amount of gas that a user is willing to spend on a transaction. It is determined by both a static fixed cost (FC) and a variable dynamic cost based on the size of each blob involved in the transaction:",-1),E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.774ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 22442.1 1132.9","aria-hidden":"true"},h=e('',1),m=[h],u=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Gas Limit"),s("mo",null,"="),s("mi",null,"F"),s("mi",null,"C"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")"),s("mo",null,"×"),s("mi",null,"S"),s("mi",null,"S"),s("mo",null,"×"),s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),g=s("p",null,"Where:",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.414ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1509 727","aria-hidden":"true"},f=e('',1),H=[f],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"F"),s("mi",null,"C")])],-1),x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.695ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 6495.3 1132.9","aria-hidden":"true"},k=e('',1),B=[k],D=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")")])],-1),V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},A=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),_=[A],v=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Z=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),P=[Z],S=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.919ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1290 727","aria-hidden":"true"},j=e('',1),G=[j],z=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"S"),s("mi",null,"S")])],-1),O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.631ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 3815 727","aria-hidden":"true"},W=e('',1),J=[W],K=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),U=e(`

        The gas fee is set by the user when they submit a transaction. The fee is often specified by users directly. The total cost for the transaction is then calculated as the product of the estimated gas limit and the gas price. Since the state machine does not refund users for unused gas, it's important for users to estimate the gas limit accurately to avoid overpaying.

        For more details on how gas is calculated per blob, refer to the PayForBlobs function that consumes gas based on the blob sizes. This function uses the GasToConsume function to calculate the extra gas charged to pay for a set of blobs in a MsgPayForBlobs transaction. This function calculates the total shares used by all blobs and multiplies it by the ShareSize and gasPerByte to get the total gas to consume.

        For estimating the total gas required for a set of blobs, refer to the EstimateGas function. This function estimates the gas based on a linear model that is dependent on the governance parameters: gasPerByte and txSizeCost. It assumes other variables are constant, including the assumption that the MsgPayForBlobs is the only message in the transaction. The DefaultEstimateGas function runs EstimateGas with the system defaults.

        Estimating gas programmatically

        Users can estimate an efficient gas limit by using this function:

        go
        import (
        +import{_ as t,o as a,c as n,k as s,a as l,Q as e}from"./chunks/framework.b47e54aa.js";const ts=JSON.parse('{"title":"Submitting data blobs to Celestia","description":"","frontmatter":{"prev":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"head":[["meta",{"name":"og:title","content":"Submitting data blobs to Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/submit-data.md","filePath":"developers/submit-data.md","lastUpdated":1725992025000}'),o={name:"developers/submit-data.md"},p=e('

        Submitting data blobs to Celestia

        To submit data to Celestia, users submit blob transactions (BlobTx). Blob transactions contain two components, a standard Cosmos-SDK transaction called MsgPayForBlobs and one or more Blobs of data.

        Maximum blob size

        The maximum total blob size in a transaction is just under 2 MiB (1,973,786 bytes), based on a 64x64 share grid (4096 shares). With one share for the PFB transaction, 4095 shares remain: 1 at 478 bytes and 4094 at 482 bytes each.

        This is subject to change based on governance parameters. Learn more on the Mainnet Beta page under "Maximum bytes".

        It is advisable to submit transactions where the total blob size is significantly smaller than 1.8 MiB (e.g. 500 KiB) in order for your transaction to get included in a block quickly. If a tx contains blobs approaching 1.8 MiB then there will be no room for any other transactions. This means that your transaction will only be included in a block if it has a higher gas price than every other transaction in the mempool.

        Fee market and mempool

        Celestia makes use of a standard gas-priced prioritized mempool. By default, transactions with gas prices higher than that of other transactions in the mempool will be prioritized by validators.

        Fees and gas limits

        As of version v1.0.0 of the application (celestia-app), there is no protocol enforced minimum fee (similar to EIP-1559 in Ethereum). Instead, each consensus node running a mempool uses a locally configured gas price threshold that must be met in order for that node to accept a transaction, either directly from a user or gossiped from another node, into its mempool.

        As of version v1.0.0 of the application (celestia-app), gas is not refunded. Instead, transaction fees are deducted by a flat fee, originally specified by the user in their tx (where fees = gasLimit * gasPrice). This means that users should use an accurate gas limit value if they do not wish to overpay.

        Under the hood, fees are currently handled by specifying and deducting a flat fee. However gas price is often specified by users instead of calculating the flat fee from the gas used and the gas price. Since the state machine does not refund users for unused gas, gas price is calculated by dividing the total fee by the gas limit.

        Estimating PFB gas

        Generally, the gas used by a PFB transaction involves a static fixed cost and a dynamic cost based on the size of each blob in the transaction.

        NOTE

        For a general use case of a normal account submitting a PFB, the static costs can be treated as such. However, due to the description above of how gas works in the Cosmos-SDK this is not always the case. Notably, if a vesting account or the feegrant modules are used, then these static costs change.

        The fixed cost is an approximation of the gas consumed by operations outside the function GasToConsume (for example, signature verification, tx size, read access to accounts), which has a default value of 65,000 gas.

        NOTE

        The first transaction sent by an account (sequence number == 0) has an additional one time gas cost of 10,000 gas. If this is the case, this should be accounted for.

        Each blob in the PFB contributes to the total gas cost based on its size. The function GasToConsume calculates the total gas consumed by all the blobs involved in a PFB, where each blob's gas cost is computed by first determining how many shares are needed to store the blob size. Then, it computes the product of the number of shares, the number of bytes per share, and the gasPerByte parameter. Finally, it adds a static amount per blob.

        The blob.GasPerBlobByte and auth.TxSizeCostPerByte are parameters that could potentially be adjusted through the system's governance mechanisms. Hence, actual costs may vary depending on the current state of these parameters.

        Gas fee calculation

        The total fee for a transaction is calculated as the product of the gas limit for the transaction and the gas price set by the user:

        ',21),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.471ex",height:"1.781ex",role:"img",focusable:"false",viewBox:"0 -705 15236 787","aria-hidden":"true"},i=e('',1),Q=[i],T=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Total Fee"),s("mo",null,"="),s("mtext",null,"Gas Limit"),s("mo",null,"×"),s("mtext",null,"Gas Price")])],-1),y=s("p",null,"The gas limit for a transaction is the maximum amount of gas that a user is willing to spend on a transaction. It is determined by both a static fixed cost (FC) and a variable dynamic cost based on the size of each blob involved in the transaction:",-1),E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.774ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 22442.1 1132.9","aria-hidden":"true"},h=e('',1),m=[h],u=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Gas Limit"),s("mo",null,"="),s("mi",null,"F"),s("mi",null,"C"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")"),s("mo",null,"×"),s("mi",null,"S"),s("mi",null,"S"),s("mo",null,"×"),s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),g=s("p",null,"Where:",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.414ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1509 727","aria-hidden":"true"},f=e('',1),H=[f],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"F"),s("mi",null,"C")])],-1),x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.695ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 6495.3 1132.9","aria-hidden":"true"},k=e('',1),B=[k],D=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")")])],-1),V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},A=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),_=[A],v=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Z=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),P=[Z],S=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.919ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1290 727","aria-hidden":"true"},j=e('',1),G=[j],z=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"S"),s("mi",null,"S")])],-1),O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.631ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 3815 727","aria-hidden":"true"},W=e('',1),J=[W],K=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),U=e(`

        The gas fee is set by the user when they submit a transaction. The fee is often specified by users directly. The total cost for the transaction is then calculated as the product of the estimated gas limit and the gas price. Since the state machine does not refund users for unused gas, it's important for users to estimate the gas limit accurately to avoid overpaying.

        For more details on how gas is calculated per blob, refer to the PayForBlobs function that consumes gas based on the blob sizes. This function uses the GasToConsume function to calculate the extra gas charged to pay for a set of blobs in a MsgPayForBlobs transaction. This function calculates the total shares used by all blobs and multiplies it by the ShareSize and gasPerByte to get the total gas to consume.

        For estimating the total gas required for a set of blobs, refer to the EstimateGas function. This function estimates the gas based on a linear model that is dependent on the governance parameters: gasPerByte and txSizeCost. It assumes other variables are constant, including the assumption that the MsgPayForBlobs is the only message in the transaction. The DefaultEstimateGas function runs EstimateGas with the system defaults.

        Estimating gas programmatically

        Users can estimate an efficient gas limit by using this function:

        go
        import (
             blobtypes "github.com/celestiaorg/celestia-app/x/blob/types"
         )
         gasLimit := blobtypes.DefaultEstimateGas([]uint32{uint32(sizeOfDataInBytes)})
        import (
        diff --git a/pr-1699/assets/developers_submit-data.md.506ef31e.lean.js b/pr-1699/assets/developers_submit-data.md.7f90d09f.lean.js
        similarity index 99%
        rename from pr-1699/assets/developers_submit-data.md.506ef31e.lean.js
        rename to pr-1699/assets/developers_submit-data.md.7f90d09f.lean.js
        index bd8bf349d7..6a62d568cc 100644
        --- a/pr-1699/assets/developers_submit-data.md.506ef31e.lean.js
        +++ b/pr-1699/assets/developers_submit-data.md.7f90d09f.lean.js
        @@ -1 +1 @@
        -import{_ as t,o as a,c as n,k as s,a as l,Q as e}from"./chunks/framework.b47e54aa.js";const ts=JSON.parse('{"title":"Submitting data blobs to Celestia","description":"","frontmatter":{"prev":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"head":[["meta",{"name":"og:title","content":"Submitting data blobs to Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/submit-data.md","filePath":"developers/submit-data.md","lastUpdated":1725971357000}'),o={name:"developers/submit-data.md"},p=e("",21),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.471ex",height:"1.781ex",role:"img",focusable:"false",viewBox:"0 -705 15236 787","aria-hidden":"true"},i=e("",1),Q=[i],T=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Total Fee"),s("mo",null,"="),s("mtext",null,"Gas Limit"),s("mo",null,"×"),s("mtext",null,"Gas Price")])],-1),y=s("p",null,"The gas limit for a transaction is the maximum amount of gas that a user is willing to spend on a transaction. It is determined by both a static fixed cost (FC) and a variable dynamic cost based on the size of each blob involved in the transaction:",-1),E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.774ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 22442.1 1132.9","aria-hidden":"true"},h=e("",1),m=[h],u=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Gas Limit"),s("mo",null,"="),s("mi",null,"F"),s("mi",null,"C"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")"),s("mo",null,"×"),s("mi",null,"S"),s("mi",null,"S"),s("mo",null,"×"),s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),g=s("p",null,"Where:",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.414ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1509 727","aria-hidden":"true"},f=e("",1),H=[f],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"F"),s("mi",null,"C")])],-1),x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.695ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 6495.3 1132.9","aria-hidden":"true"},k=e("",1),B=[k],D=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")")])],-1),V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},A=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),_=[A],v=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Z=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),P=[Z],S=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.919ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1290 727","aria-hidden":"true"},j=e("",1),G=[j],z=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"S"),s("mi",null,"S")])],-1),O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.631ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 3815 727","aria-hidden":"true"},W=e("",1),J=[W],K=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),U=e("",28);function X($,Y,ss,as,ns,es){return a(),n("div",null,[p,s("p",null,[s("mjx-container",r,[(a(),n("svg",c,Q)),T])]),y,s("p",null,[s("mjx-container",E,[(a(),n("svg",d,m)),u])]),g,s("ul",null,[s("li",null,[s("mjx-container",b,[(a(),n("svg",F,H)),C]),l(" = Fixed Cost, is a static value (65,000 gas)")]),s("li",null,[s("mjx-container",x,[(a(),n("svg",w,B)),D]),l(" = SparseSharesNeeded for the "),s("mjx-container",V,[(a(),n("svg",L,_)),v]),l("th Blob, is the number of shares needed for the "),s("mjx-container",M,[(a(),n("svg",q,P)),S]),l("th blob in the transaction")]),s("li",null,[s("mjx-container",I,[(a(),n("svg",N,G)),z]),l(" = Share Size, is the size of each share")]),s("li",null,[s("mjx-container",O,[(a(),n("svg",R,J)),K]),l(" = Gas Cost Per Blob Byte, is a parameter that could potentially be adjusted through the system's governance mechanisms.")])]),U])}const os=t(o,[["render",X]]);export{ts as __pageData,os as default};
        +import{_ as t,o as a,c as n,k as s,a as l,Q as e}from"./chunks/framework.b47e54aa.js";const ts=JSON.parse('{"title":"Submitting data blobs to Celestia","description":"","frontmatter":{"prev":{"text":"Blobstream rollups","link":"/developers/blobstream-rollups"},"head":[["meta",{"name":"og:title","content":"Submitting data blobs to Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/submit-data.md","filePath":"developers/submit-data.md","lastUpdated":1725992025000}'),o={name:"developers/submit-data.md"},p=e("",21),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.471ex",height:"1.781ex",role:"img",focusable:"false",viewBox:"0 -705 15236 787","aria-hidden":"true"},i=e("",1),Q=[i],T=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Total Fee"),s("mo",null,"="),s("mtext",null,"Gas Limit"),s("mo",null,"×"),s("mtext",null,"Gas Price")])],-1),y=s("p",null,"The gas limit for a transaction is the maximum amount of gas that a user is willing to spend on a transaction. It is determined by both a static fixed cost (FC) and a variable dynamic cost based on the size of each blob involved in the transaction:",-1),E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.774ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 22442.1 1132.9","aria-hidden":"true"},h=e("",1),m=[h],u=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mtext",null,"Gas Limit"),s("mo",null,"="),s("mi",null,"F"),s("mi",null,"C"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")"),s("mo",null,"×"),s("mi",null,"S"),s("mi",null,"S"),s("mo",null,"×"),s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),g=s("p",null,"Where:",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.414ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1509 727","aria-hidden":"true"},f=e("",1),H=[f],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"F"),s("mi",null,"C")])],-1),x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.695ex",height:"2.563ex",role:"img",focusable:"false",viewBox:"0 -789.6 6495.3 1132.9","aria-hidden":"true"},k=e("",1),B=[k],D=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n")])]),s("mi",null,"S"),s("mi",null,"S"),s("mi",null,"N"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"B"),s("mi",null,"i")]),s("mo",{stretchy:"false"},")")])],-1),V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},A=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),_=[A],v=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Z=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),P=[Z],S=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"i")])],-1),I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.919ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 1290 727","aria-hidden":"true"},j=e("",1),G=[j],z=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"S"),s("mi",null,"S")])],-1),O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.631ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 3815 727","aria-hidden":"true"},W=e("",1),J=[W],K=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"G"),s("mi",null,"C"),s("mi",null,"P"),s("mi",null,"B"),s("mi",null,"B")])],-1),U=e("",28);function X($,Y,ss,as,ns,es){return a(),n("div",null,[p,s("p",null,[s("mjx-container",r,[(a(),n("svg",c,Q)),T])]),y,s("p",null,[s("mjx-container",E,[(a(),n("svg",d,m)),u])]),g,s("ul",null,[s("li",null,[s("mjx-container",b,[(a(),n("svg",F,H)),C]),l(" = Fixed Cost, is a static value (65,000 gas)")]),s("li",null,[s("mjx-container",x,[(a(),n("svg",w,B)),D]),l(" = SparseSharesNeeded for the "),s("mjx-container",V,[(a(),n("svg",L,_)),v]),l("th Blob, is the number of shares needed for the "),s("mjx-container",M,[(a(),n("svg",q,P)),S]),l("th blob in the transaction")]),s("li",null,[s("mjx-container",I,[(a(),n("svg",N,G)),z]),l(" = Share Size, is the size of each share")]),s("li",null,[s("mjx-container",O,[(a(),n("svg",R,J)),K]),l(" = Gas Cost Per Blob Byte, is a parameter that could potentially be adjusted through the system's governance mechanisms.")])]),U])}const os=t(o,[["render",X]]);export{ts as __pageData,os as default};
        diff --git a/pr-1699/assets/developers_transaction-resubmission.md.2c716084.js b/pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.js
        similarity index 97%
        rename from pr-1699/assets/developers_transaction-resubmission.md.2c716084.js
        rename to pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.js
        index 7a31c94b24..c5828e1e11 100644
        --- a/pr-1699/assets/developers_transaction-resubmission.md.2c716084.js
        +++ b/pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.js
        @@ -1 +1 @@
        -import{_ as e,o as s,c as n,Q as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Transaction resubmission","description":"This is a guide on transaction resubmission on Celestia.","frontmatter":{"description":"This is a guide on transaction resubmission on Celestia.","head":[["meta",{"name":"og:title","content":"Transaction resubmission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/transaction-resubmission.md","filePath":"developers/transaction-resubmission.md","lastUpdated":1725971357000}'),t={name:"developers/transaction-resubmission.md"},a=i('

        Transaction resubmission

        In cases where transactions are not included within a 75-second window, resubmission is necessary. This is especially important during network congestion, as transactions with relatively low fees may not be processed even after the network clears up.

        Regardless of whether they originate from celestia-app or celestia-node, transactions will not be re-gossiped, except in the presence of a new peer.

        Monitoring and resubmission

        Monitor the status of your transactions. If a transaction is not included within a 75-second window, it should be resubmitted. This can be done manually or through automated processes.

        Changes introduced in celestiaorg/celestia-core#1089 may affect transaction gossiping and inclusion speed.

        Notes

        • All transactions, regardless of their origin, are subject to being sorted and pruned based on fees.
        • It is the user or developer's responsibility to monitor and possibly resubmit transactions if they are not included in a 75-second window.
        ',8),o=[a];function r(c,d,l,u,h,m){return s(),n("div",null,o)}const _=e(t,[["render",r]]);export{b as __pageData,_ as default}; +import{_ as e,o as s,c as n,Q as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Transaction resubmission","description":"This is a guide on transaction resubmission on Celestia.","frontmatter":{"description":"This is a guide on transaction resubmission on Celestia.","head":[["meta",{"name":"og:title","content":"Transaction resubmission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/transaction-resubmission.md","filePath":"developers/transaction-resubmission.md","lastUpdated":1725992025000}'),t={name:"developers/transaction-resubmission.md"},a=i('

        Transaction resubmission

        In cases where transactions are not included within a 75-second window, resubmission is necessary. This is especially important during network congestion, as transactions with relatively low fees may not be processed even after the network clears up.

        Regardless of whether they originate from celestia-app or celestia-node, transactions will not be re-gossiped, except in the presence of a new peer.

        Monitoring and resubmission

        Monitor the status of your transactions. If a transaction is not included within a 75-second window, it should be resubmitted. This can be done manually or through automated processes.

        Changes introduced in celestiaorg/celestia-core#1089 may affect transaction gossiping and inclusion speed.

        Notes

        • All transactions, regardless of their origin, are subject to being sorted and pruned based on fees.
        • It is the user or developer's responsibility to monitor and possibly resubmit transactions if they are not included in a 75-second window.
        ',8),o=[a];function r(c,d,l,u,h,m){return s(),n("div",null,o)}const _=e(t,[["render",r]]);export{b as __pageData,_ as default}; diff --git a/pr-1699/assets/developers_transaction-resubmission.md.2c716084.lean.js b/pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.lean.js similarity index 91% rename from pr-1699/assets/developers_transaction-resubmission.md.2c716084.lean.js rename to pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.lean.js index 2e1218a362..3e86d15b39 100644 --- a/pr-1699/assets/developers_transaction-resubmission.md.2c716084.lean.js +++ b/pr-1699/assets/developers_transaction-resubmission.md.ebf49e01.lean.js @@ -1 +1 @@ -import{_ as e,o as s,c as n,Q as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Transaction resubmission","description":"This is a guide on transaction resubmission on Celestia.","frontmatter":{"description":"This is a guide on transaction resubmission on Celestia.","head":[["meta",{"name":"og:title","content":"Transaction resubmission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/transaction-resubmission.md","filePath":"developers/transaction-resubmission.md","lastUpdated":1725971357000}'),t={name:"developers/transaction-resubmission.md"},a=i("",8),o=[a];function r(c,d,l,u,h,m){return s(),n("div",null,o)}const _=e(t,[["render",r]]);export{b as __pageData,_ as default}; +import{_ as e,o as s,c as n,Q as i}from"./chunks/framework.b47e54aa.js";const b=JSON.parse('{"title":"Transaction resubmission","description":"This is a guide on transaction resubmission on Celestia.","frontmatter":{"description":"This is a guide on transaction resubmission on Celestia.","head":[["meta",{"name":"og:title","content":"Transaction resubmission | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/transaction-resubmission.md","filePath":"developers/transaction-resubmission.md","lastUpdated":1725992025000}'),t={name:"developers/transaction-resubmission.md"},a=i("",8),o=[a];function r(c,d,l,u,h,m){return s(),n("div",null,o)}const _=e(t,[["render",r]]);export{b as __pageData,_ as default}; diff --git a/pr-1699/assets/developers_wallets.md.c5fba5d1.js b/pr-1699/assets/developers_wallets.md.b2bd7cc6.js similarity index 93% rename from pr-1699/assets/developers_wallets.md.c5fba5d1.js rename to pr-1699/assets/developers_wallets.md.b2bd7cc6.js index a15e124f32..52aae353c4 100644 --- a/pr-1699/assets/developers_wallets.md.c5fba5d1.js +++ b/pr-1699/assets/developers_wallets.md.b2bd7cc6.js @@ -1,4 +1,4 @@ -import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s,a as n,t as l,Q as o}from"./chunks/framework.b47e54aa.js";const r={data(){return{constants:p}}},hn=JSON.parse('{"title":"Wallet integrations with Celestia","description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","frontmatter":{"description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","head":[["meta",{"name":"og:title","content":"Wallet integrations with Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/wallets.md","filePath":"developers/wallets.md","lastUpdated":1725971357000}'),i=o(`

        Wallet integrations with Celestia

        This page covers how developers can use Keplr and React to add Celestia network parameters to wallets, and how to add custom networks to Leap and Cosmostation.

        Add Celestia network parameters to Keplr with React

        Before we demonstrate how to export the specific parameters for Celestia's testnets, we need to create a ReactJS component that allows us to connect directly to Keplr and pass it the network parameters.

        In the following code, we show how you can export a component that detects whether Keplr is installed and sets the network params for it:

        jsx
        // @site/src/components/AddNetworkKeplr.js
        +import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s,a as n,t as l,Q as o}from"./chunks/framework.b47e54aa.js";const r={data(){return{constants:p}}},hn=JSON.parse('{"title":"Wallet integrations with Celestia","description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","frontmatter":{"description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","head":[["meta",{"name":"og:title","content":"Wallet integrations with Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/wallets.md","filePath":"developers/wallets.md","lastUpdated":1725992025000}'),i=o(`

        Wallet integrations with Celestia

        This page covers how developers can use Keplr and React to add Celestia network parameters to wallets, and how to add custom networks to Leap and Cosmostation.

        Add Celestia network parameters to Keplr with React

        Before we demonstrate how to export the specific parameters for Celestia's testnets, we need to create a ReactJS component that allows us to connect directly to Keplr and pass it the network parameters.

        In the following code, we show how you can export a component that detects whether Keplr is installed and sets the network params for it:

        jsx
        // @site/src/components/AddNetworkKeplr.js
         import React from "react";
         import styles from "./Keplr.module.css";
         
        @@ -146,7 +146,7 @@ import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s
               </button>
             </div>
           );
        -}

        We still need to pass the Celestia network parameters to the AddNetworkKeplr function:

        `,7),E={class:"vp-code-group vp-adaptive-theme"},y=o('
        ',1),d={class:"blocks"},_={class:"language-js vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),u=s("span",{class:"lang"},"js",-1),F={class:"shiki github-dark vp-code-dark"},A=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),C=s("span",{class:"line"},null,-1),m=o('export const MAINNET_PARAMS = {`{',1),w={class:"line"},T={style:{color:"#9ECBFF"}},b=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Celestia',")],-1),q={class:"line"},g={style:{color:"#9ECBFF"}},k={class:"line"},D={style:{color:"#9ECBFF"}},B=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),I=s("span",{class:"line"},null,-1),S=o('{<AddNetworkKeplr params={MAINNET_PARAMS}/>}',1),P={class:"shiki github-light vp-code-light"},v=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),f=s("span",{class:"line"},null,-1),N=o('export const MAINNET_PARAMS = {`{',1),R={class:"line"},x={style:{color:"#032F62"}},V=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Celestia',")],-1),M={class:"line"},K={style:{color:"#032F62"}},U={class:"line"},L={style:{color:"#032F62"}},G=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),j=s("span",{class:"line"},null,-1),H=o('{<AddNetworkKeplr params={MAINNET_PARAMS}/>}',1),O={class:"language-js vp-adaptive-theme"},W=s("button",{title:"Copy Code",class:"copy"},null,-1),J=s("span",{class:"lang"},"js",-1),Y={class:"shiki github-dark vp-code-dark"},X=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Q=s("span",{class:"line"},null,-1),Z=o('export const MOCHA_PARAMS = {`{',1),z={class:"line"},$={style:{color:"#9ECBFF"}},ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Mocha testnet',")],-1),ns={class:"line"},as={style:{color:"#9ECBFF"}},ls={class:"line"},os={style:{color:"#9ECBFF"}},ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),es=s("span",{class:"line"},null,-1),ts=o('{<AddNetworkKeplr params={MOCHA_PARAMS}/>}',1),cs={class:"shiki github-light vp-code-light"},rs=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),is=s("span",{class:"line"},null,-1),Es=o('export const MOCHA_PARAMS = {`{',1),ys={class:"line"},ds={style:{color:"#032F62"}},_s=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Mocha testnet',")],-1),hs={class:"line"},us={style:{color:"#032F62"}},Fs={class:"line"},As={style:{color:"#032F62"}},Cs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),ms=s("span",{class:"line"},null,-1),ws=o('{<AddNetworkKeplr params={MOCHA_PARAMS}/>}',1),Ts={class:"language-js vp-adaptive-theme"},bs=s("button",{title:"Copy Code",class:"copy"},null,-1),qs=s("span",{class:"lang"},"js",-1),gs={class:"shiki github-dark vp-code-dark"},ks=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ds=s("span",{class:"line"},null,-1),Bs=o('export const ARABICA_PARAMS = {`{',1),Is={class:"line"},Ss={style:{color:"#9ECBFF"}},Ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Arabica devnet',")],-1),vs={class:"line"},fs={style:{color:"#9ECBFF"}},Ns={class:"line"},Rs={style:{color:"#9ECBFF"}},xs=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),Vs=s("span",{class:"line"},null,-1),Ms=o('{<AddNetworkKeplr params={ARABICA_PARAMS}/>}',1),Ks={class:"shiki github-light vp-code-light"},Us=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ls=s("span",{class:"line"},null,-1),Gs=o('export const ARABICA_PARAMS = {`{',1),js={class:"line"},Hs={style:{color:"#032F62"}},Os=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Arabica devnet',")],-1),Ws={class:"line"},Js={style:{color:"#032F62"}},Ys={class:"line"},Xs={style:{color:"#032F62"}},Qs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),Zs=s("span",{class:"line"},null,-1),zs=o('{<AddNetworkKeplr params={ARABICA_PARAMS}/>}',1),$s=s("p",null,"Now, we can connect to the network that you would like to use in Keplr wallet.",-1),sn=s("h2",{id:"adding-a-custom-chain-to-leap",tabindex:"-1"},[n("Adding a custom chain to Leap "),s("a",{class:"header-anchor",href:"#adding-a-custom-chain-to-leap","aria-label":'Permalink to "Adding a custom chain to Leap"'},"​")],-1),nn=s("p",null,"If you want to add a custom chain to Leap, you can do so by:",-1),an=s("ol",null,[s("li",null,"Clicking the Cosmos logo in the top corner of Leap wallet"),s("li",null,'Scrolling down and clicking "Add new chain"')],-1),ln=s("p",null,"You can then add the following parameters:",-1),on=o("
      4. Chain Name: Arabica devnet
      5. New RPC URL: https://rpc.celestia-arabica-11.com/
      6. New REST URL: https://api.celestia-arabica-11.com
      7. Address Prefix: celestia
      8. Native Denom: utia
      9. Coin Type: 118
      10. Decimals: 6
      11. Block explorer URL (optional): https://explorer.celestia-arabica-10.com
      12. ",8),pn=o('

        Now, click Add chain and you will be able to view your Arabica account balance and transactions in Leap wallet.

        You'll see that you're connected to Arabica Devnet.

        Adding a custom chain to Cosmostation

        Click the hamburger menu icon in the top corner of Cosmostation wallet. Scroll down and click "Add Custom Chain"

        You can then add the following parameters:

        • Custom Chain name: Mocha testnet
        • Rest URL: https://api-mocha.pops.one
        • New RPC URL: https://rpc-mocha.pops.one
        • Currency symbol: TIA
        • Address prefix: celestia
        • Denom: utia
        • Symbol image URL (optional): https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/celestiatestnet/images/celestia.svg
        • Explorer URL (optional): https://testnet.mintscan.io/celestia-testnet
        • Coin Type: 118
        • Decimals: 6
        • Gas rate Tiny: 0.1
        • Gas rate Low: 0.25
        • Gas rate Average: 0.5

        Now, click Add a custom chain and you will be able to view your Celestia account balance and transactions in Cosmostation wallet.

        Switch chains to "Mocha testnet" and you'll see that you're connected to Celestia's Mocha testnet!

        ',8);function en(tn,cn,rn,En,a,yn){return t(),c("div",null,[i,s("div",E,[y,s("div",d,[s("div",_,[h,u,s("pre",F,[s("code",null,[A,n(` +}

        We still need to pass the Celestia network parameters to the AddNetworkKeplr function:

        `,7),E={class:"vp-code-group vp-adaptive-theme"},y=o('
        ',1),d={class:"blocks"},_={class:"language-js vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),u=s("span",{class:"lang"},"js",-1),F={class:"shiki github-dark vp-code-dark"},A=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),C=s("span",{class:"line"},null,-1),m=o('export const MAINNET_PARAMS = {`{',1),w={class:"line"},T={style:{color:"#9ECBFF"}},b=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Celestia',")],-1),q={class:"line"},g={style:{color:"#9ECBFF"}},k={class:"line"},D={style:{color:"#9ECBFF"}},B=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),I=s("span",{class:"line"},null,-1),P=o('{<AddNetworkKeplr params={MAINNET_PARAMS}/>}',1),S={class:"shiki github-light vp-code-light"},v=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),N=s("span",{class:"line"},null,-1),f=o('export const MAINNET_PARAMS = {`{',1),R={class:"line"},x={style:{color:"#032F62"}},V=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Celestia',")],-1),K={class:"line"},M={style:{color:"#032F62"}},U={class:"line"},L={style:{color:"#032F62"}},j=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),G=s("span",{class:"line"},null,-1),O=o('{<AddNetworkKeplr params={MAINNET_PARAMS}/>}',1),H={class:"language-js vp-adaptive-theme"},W=s("button",{title:"Copy Code",class:"copy"},null,-1),z=s("span",{class:"lang"},"js",-1),Y={class:"shiki github-dark vp-code-dark"},J=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Q=s("span",{class:"line"},null,-1),X=o('export const MOCHA_PARAMS = {`{',1),Z={class:"line"},$={style:{color:"#9ECBFF"}},ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Mocha testnet',")],-1),ns={class:"line"},as={style:{color:"#9ECBFF"}},ls={class:"line"},os={style:{color:"#9ECBFF"}},ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),es=s("span",{class:"line"},null,-1),ts=o('{<AddNetworkKeplr params={MOCHA_PARAMS}/>}',1),cs={class:"shiki github-light vp-code-light"},rs=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),is=s("span",{class:"line"},null,-1),Es=o('export const MOCHA_PARAMS = {`{',1),ys={class:"line"},ds={style:{color:"#032F62"}},_s=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Mocha testnet',")],-1),hs={class:"line"},us={style:{color:"#032F62"}},Fs={class:"line"},As={style:{color:"#032F62"}},Cs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),ms=s("span",{class:"line"},null,-1),ws=o('{<AddNetworkKeplr params={MOCHA_PARAMS}/>}',1),Ts={class:"language-js vp-adaptive-theme"},bs=s("button",{title:"Copy Code",class:"copy"},null,-1),qs=s("span",{class:"lang"},"js",-1),gs={class:"shiki github-dark vp-code-dark"},ks=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ds=s("span",{class:"line"},null,-1),Bs=o('export const ARABICA_PARAMS = {`{',1),Is={class:"line"},Ps={style:{color:"#9ECBFF"}},Ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Arabica devnet',")],-1),vs={class:"line"},Ns={style:{color:"#9ECBFF"}},fs={class:"line"},Rs={style:{color:"#9ECBFF"}},xs=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),Vs=s("span",{class:"line"},null,-1),Ks=o('{<AddNetworkKeplr params={ARABICA_PARAMS}/>}',1),Ms={class:"shiki github-light vp-code-light"},Us=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ls=s("span",{class:"line"},null,-1),js=o('export const ARABICA_PARAMS = {`{',1),Gs={class:"line"},Os={style:{color:"#032F62"}},Hs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Arabica devnet',")],-1),Ws={class:"line"},zs={style:{color:"#032F62"}},Ys={class:"line"},Js={style:{color:"#032F62"}},Qs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),Xs=s("span",{class:"line"},null,-1),Zs=o('{<AddNetworkKeplr params={ARABICA_PARAMS}/>}',1),$s=s("p",null,"Now, we can connect to the network that you would like to use in Keplr wallet.",-1),sn=s("h2",{id:"adding-a-custom-chain-to-leap",tabindex:"-1"},[n("Adding a custom chain to Leap "),s("a",{class:"header-anchor",href:"#adding-a-custom-chain-to-leap","aria-label":'Permalink to "Adding a custom chain to Leap"'},"​")],-1),nn=s("p",null,"If you want to add a custom chain to Leap, you can do so by:",-1),an=s("ol",null,[s("li",null,"Clicking the Cosmos logo in the top corner of Leap wallet"),s("li",null,'Scrolling down and clicking "Add new chain"')],-1),ln=s("p",null,"You can then add the following parameters:",-1),on=o("
      13. Chain Name: Arabica devnet
      14. New RPC URL: https://rpc.celestia-arabica-11.com/
      15. New REST URL: https://api.celestia-arabica-11.com
      16. Address Prefix: celestia
      17. Native Denom: utia
      18. Coin Type: 118
      19. Decimals: 6
      20. Block explorer URL (optional): https://explorer.celestia-arabica-10.com
      21. ",8),pn=o('

        Now, click Add chain and you will be able to view your Arabica account balance and transactions in Leap wallet.

        You'll see that you're connected to Arabica Devnet.

        Adding a custom chain to Cosmostation

        Click the hamburger menu icon in the top corner of Cosmostation wallet. Scroll down and click "Add Custom Chain"

        You can then add the following parameters:

        • Custom Chain name: Mocha testnet
        • Rest URL: https://api-mocha.pops.one
        • New RPC URL: https://rpc-mocha.pops.one
        • Currency symbol: TIA
        • Address prefix: celestia
        • Denom: utia
        • Symbol image URL (optional): https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/celestiatestnet/images/celestia.svg
        • Explorer URL (optional): https://testnet.mintscan.io/celestia-testnet
        • Coin Type: 118
        • Decimals: 6
        • Gas rate Tiny: 0.1
        • Gas rate Low: 0.25
        • Gas rate Average: 0.5

        Now, click Add a custom chain and you will be able to view your Celestia account balance and transactions in Cosmostation wallet.

        Switch chains to "Mocha testnet" and you'll see that you're connected to Celestia's Mocha testnet!

        ',8);function en(tn,cn,rn,En,a,yn){return t(),c("div",null,[i,s("div",E,[y,s("div",d,[s("div",_,[h,u,s("pre",F,[s("code",null,[A,n(` `),C,n(` `),m,n(` `),s("span",w,[s("span",T," chainId: '"+l(a.constants.mainnetChainId)+"',",1)]),n(` @@ -155,19 +155,19 @@ import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s `),s("span",k,[s("span",D," rest: '"+l(a.constants.mainnetRestUrl)+"'",1)]),n(` `),B,n(` `),I,n(` -`),S])]),s("pre",P,[s("code",null,[v,n(` -`),f,n(` +`),P])]),s("pre",S,[s("code",null,[v,n(` `),N,n(` +`),f,n(` `),s("span",R,[s("span",x," chainId: '"+l(a.constants.mainnetChainId)+"',",1)]),n(` `),V,n(` -`),s("span",M,[s("span",K," rpc: '"+l(a.constants.mainnetRpcUrl)+"',",1)]),n(` +`),s("span",K,[s("span",M," rpc: '"+l(a.constants.mainnetRpcUrl)+"',",1)]),n(` `),s("span",U,[s("span",L," rest: '"+l(a.constants.mainnetRestUrl)+"'",1)]),n(` -`),G,n(` `),j,n(` -`),H])])]),s("div",O,[W,J,s("pre",Y,[s("code",null,[X,n(` +`),G,n(` +`),O])])]),s("div",H,[W,z,s("pre",Y,[s("code",null,[J,n(` `),Q,n(` -`),Z,n(` -`),s("span",z,[s("span",$," chainId: '"+l(a.constants.mochaChainId)+"',",1)]),n(` +`),X,n(` +`),s("span",Z,[s("span",$," chainId: '"+l(a.constants.mochaChainId)+"',",1)]),n(` `),ss,n(` `),s("span",ns,[s("span",as," rpc: '"+l(a.constants.mochaRpcUrl)+"',",1)]),n(` `),s("span",ls,[s("span",os," rest: '"+l(a.constants.mochaRestUrl)+"'",1)]),n(` @@ -185,19 +185,19 @@ import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s `),ws])])]),s("div",Ts,[bs,qs,s("pre",gs,[s("code",null,[ks,n(` `),Ds,n(` `),Bs,n(` -`),s("span",Is,[s("span",Ss," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` -`),Ps,n(` -`),s("span",vs,[s("span",fs," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` -`),s("span",Ns,[s("span",Rs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` +`),s("span",Is,[s("span",Ps," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` +`),Ss,n(` +`),s("span",vs,[s("span",Ns," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` +`),s("span",fs,[s("span",Rs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` `),xs,n(` `),Vs,n(` -`),Ms])]),s("pre",Ks,[s("code",null,[Us,n(` +`),Ks])]),s("pre",Ms,[s("code",null,[Us,n(` `),Ls,n(` -`),Gs,n(` -`),s("span",js,[s("span",Hs," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` -`),Os,n(` -`),s("span",Ws,[s("span",Js," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` -`),s("span",Ys,[s("span",Xs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` +`),js,n(` +`),s("span",Gs,[s("span",Os," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` +`),Hs,n(` +`),s("span",Ws,[s("span",zs," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` +`),s("span",Ys,[s("span",Js," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` `),Qs,n(` -`),Zs,n(` -`),zs])])])])]),$s,sn,nn,an,ln,s("ul",null,[s("li",null,[n("Chain Id: "),s("code",null,l(a.constants.arabicaChainId),1)]),on]),pn])}const un=e(r,[["render",en]]);export{hn as __pageData,un as default}; +`),Xs,n(` +`),Zs])])])])]),$s,sn,nn,an,ln,s("ul",null,[s("li",null,[n("Chain Id: "),s("code",null,l(a.constants.arabicaChainId),1)]),on]),pn])}const un=e(r,[["render",en]]);export{hn as __pageData,un as default}; diff --git a/pr-1699/assets/developers_wallets.md.c5fba5d1.lean.js b/pr-1699/assets/developers_wallets.md.b2bd7cc6.lean.js similarity index 76% rename from pr-1699/assets/developers_wallets.md.c5fba5d1.lean.js rename to pr-1699/assets/developers_wallets.md.b2bd7cc6.lean.js index bb96b0371c..e26ab6265c 100644 --- a/pr-1699/assets/developers_wallets.md.c5fba5d1.lean.js +++ b/pr-1699/assets/developers_wallets.md.b2bd7cc6.lean.js @@ -1,4 +1,4 @@ -import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s,a as n,t as l,Q as o}from"./chunks/framework.b47e54aa.js";const r={data(){return{constants:p}}},hn=JSON.parse('{"title":"Wallet integrations with Celestia","description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","frontmatter":{"description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","head":[["meta",{"name":"og:title","content":"Wallet integrations with Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/wallets.md","filePath":"developers/wallets.md","lastUpdated":1725971357000}'),i=o("",7),E={class:"vp-code-group vp-adaptive-theme"},y=o("",1),d={class:"blocks"},_={class:"language-js vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),u=s("span",{class:"lang"},"js",-1),F={class:"shiki github-dark vp-code-dark"},A=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),C=s("span",{class:"line"},null,-1),m=o("",1),w={class:"line"},T={style:{color:"#9ECBFF"}},b=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Celestia',")],-1),q={class:"line"},g={style:{color:"#9ECBFF"}},k={class:"line"},D={style:{color:"#9ECBFF"}},B=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),I=s("span",{class:"line"},null,-1),S=o("",1),P={class:"shiki github-light vp-code-light"},v=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),f=s("span",{class:"line"},null,-1),N=o("",1),R={class:"line"},x={style:{color:"#032F62"}},V=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Celestia',")],-1),M={class:"line"},K={style:{color:"#032F62"}},U={class:"line"},L={style:{color:"#032F62"}},G=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),j=s("span",{class:"line"},null,-1),H=o("",1),O={class:"language-js vp-adaptive-theme"},W=s("button",{title:"Copy Code",class:"copy"},null,-1),J=s("span",{class:"lang"},"js",-1),Y={class:"shiki github-dark vp-code-dark"},X=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Q=s("span",{class:"line"},null,-1),Z=o("",1),z={class:"line"},$={style:{color:"#9ECBFF"}},ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Mocha testnet',")],-1),ns={class:"line"},as={style:{color:"#9ECBFF"}},ls={class:"line"},os={style:{color:"#9ECBFF"}},ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),es=s("span",{class:"line"},null,-1),ts=o("",1),cs={class:"shiki github-light vp-code-light"},rs=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),is=s("span",{class:"line"},null,-1),Es=o("",1),ys={class:"line"},ds={style:{color:"#032F62"}},_s=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Mocha testnet',")],-1),hs={class:"line"},us={style:{color:"#032F62"}},Fs={class:"line"},As={style:{color:"#032F62"}},Cs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),ms=s("span",{class:"line"},null,-1),ws=o("",1),Ts={class:"language-js vp-adaptive-theme"},bs=s("button",{title:"Copy Code",class:"copy"},null,-1),qs=s("span",{class:"lang"},"js",-1),gs={class:"shiki github-dark vp-code-dark"},ks=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ds=s("span",{class:"line"},null,-1),Bs=o("",1),Is={class:"line"},Ss={style:{color:"#9ECBFF"}},Ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Arabica devnet',")],-1),vs={class:"line"},fs={style:{color:"#9ECBFF"}},Ns={class:"line"},Rs={style:{color:"#9ECBFF"}},xs=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),Vs=s("span",{class:"line"},null,-1),Ms=o("",1),Ks={class:"shiki github-light vp-code-light"},Us=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ls=s("span",{class:"line"},null,-1),Gs=o("",1),js={class:"line"},Hs={style:{color:"#032F62"}},Os=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Arabica devnet',")],-1),Ws={class:"line"},Js={style:{color:"#032F62"}},Ys={class:"line"},Xs={style:{color:"#032F62"}},Qs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),Zs=s("span",{class:"line"},null,-1),zs=o("",1),$s=s("p",null,"Now, we can connect to the network that you would like to use in Keplr wallet.",-1),sn=s("h2",{id:"adding-a-custom-chain-to-leap",tabindex:"-1"},[n("Adding a custom chain to Leap "),s("a",{class:"header-anchor",href:"#adding-a-custom-chain-to-leap","aria-label":'Permalink to "Adding a custom chain to Leap"'},"​")],-1),nn=s("p",null,"If you want to add a custom chain to Leap, you can do so by:",-1),an=s("ol",null,[s("li",null,"Clicking the Cosmos logo in the top corner of Leap wallet"),s("li",null,'Scrolling down and clicking "Add new chain"')],-1),ln=s("p",null,"You can then add the following parameters:",-1),on=o("",8),pn=o("",8);function en(tn,cn,rn,En,a,yn){return t(),c("div",null,[i,s("div",E,[y,s("div",d,[s("div",_,[h,u,s("pre",F,[s("code",null,[A,n(` +import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s,a as n,t as l,Q as o}from"./chunks/framework.b47e54aa.js";const r={data(){return{constants:p}}},hn=JSON.parse('{"title":"Wallet integrations with Celestia","description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","frontmatter":{"description":"How you can add Celestia network parameters to wallets such as Keplr, Leap, and Cosmostation.","head":[["meta",{"name":"og:title","content":"Wallet integrations with Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"developers/wallets.md","filePath":"developers/wallets.md","lastUpdated":1725992025000}'),i=o("",7),E={class:"vp-code-group vp-adaptive-theme"},y=o("",1),d={class:"blocks"},_={class:"language-js vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),u=s("span",{class:"lang"},"js",-1),F={class:"shiki github-dark vp-code-dark"},A=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),C=s("span",{class:"line"},null,-1),m=o("",1),w={class:"line"},T={style:{color:"#9ECBFF"}},b=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Celestia',")],-1),q={class:"line"},g={style:{color:"#9ECBFF"}},k={class:"line"},D={style:{color:"#9ECBFF"}},B=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),I=s("span",{class:"line"},null,-1),P=o("",1),S={class:"shiki github-light vp-code-light"},v=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),N=s("span",{class:"line"},null,-1),f=o("",1),R={class:"line"},x={style:{color:"#032F62"}},V=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Celestia',")],-1),K={class:"line"},M={style:{color:"#032F62"}},U={class:"line"},L={style:{color:"#032F62"}},j=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),G=s("span",{class:"line"},null,-1),O=o("",1),H={class:"language-js vp-adaptive-theme"},W=s("button",{title:"Copy Code",class:"copy"},null,-1),z=s("span",{class:"lang"},"js",-1),Y={class:"shiki github-dark vp-code-dark"},J=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Q=s("span",{class:"line"},null,-1),X=o("",1),Z={class:"line"},$={style:{color:"#9ECBFF"}},ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Mocha testnet',")],-1),ns={class:"line"},as={style:{color:"#9ECBFF"}},ls={class:"line"},os={style:{color:"#9ECBFF"}},ps=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),es=s("span",{class:"line"},null,-1),ts=o("",1),cs={class:"shiki github-light vp-code-light"},rs=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),is=s("span",{class:"line"},null,-1),Es=o("",1),ys={class:"line"},ds={style:{color:"#032F62"}},_s=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Mocha testnet',")],-1),hs={class:"line"},us={style:{color:"#032F62"}},Fs={class:"line"},As={style:{color:"#032F62"}},Cs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),ms=s("span",{class:"line"},null,-1),ws=o("",1),Ts={class:"language-js vp-adaptive-theme"},bs=s("button",{title:"Copy Code",class:"copy"},null,-1),qs=s("span",{class:"lang"},"js",-1),gs={class:"shiki github-dark vp-code-dark"},ks=s("span",{class:"line"},[s("span",{style:{color:"#F97583"}},"import"),s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#9ECBFF"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ds=s("span",{class:"line"},null,-1),Bs=o("",1),Is={class:"line"},Ps={style:{color:"#9ECBFF"}},Ss=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}}," chainName: 'Arabica devnet',")],-1),vs={class:"line"},Ns={style:{color:"#9ECBFF"}},fs={class:"line"},Rs={style:{color:"#9ECBFF"}},xs=s("span",{class:"line"},[s("span",{style:{color:"#9ECBFF"}},"}`"),s("span",{style:{color:"#E1E4E8"}},"}")],-1),Vs=s("span",{class:"line"},null,-1),Ks=o("",1),Ms={class:"shiki github-light vp-code-light"},Us=s("span",{class:"line"},[s("span",{style:{color:"#D73A49"}},"import"),s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#032F62"}},"'@site/src/components/AddNetworkKeplr'")],-1),Ls=s("span",{class:"line"},null,-1),js=o("",1),Gs={class:"line"},Os={style:{color:"#032F62"}},Hs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}}," chainName: 'Arabica devnet',")],-1),Ws={class:"line"},zs={style:{color:"#032F62"}},Ys={class:"line"},Js={style:{color:"#032F62"}},Qs=s("span",{class:"line"},[s("span",{style:{color:"#032F62"}},"}`"),s("span",{style:{color:"#24292E"}},"}")],-1),Xs=s("span",{class:"line"},null,-1),Zs=o("",1),$s=s("p",null,"Now, we can connect to the network that you would like to use in Keplr wallet.",-1),sn=s("h2",{id:"adding-a-custom-chain-to-leap",tabindex:"-1"},[n("Adding a custom chain to Leap "),s("a",{class:"header-anchor",href:"#adding-a-custom-chain-to-leap","aria-label":'Permalink to "Adding a custom chain to Leap"'},"​")],-1),nn=s("p",null,"If you want to add a custom chain to Leap, you can do so by:",-1),an=s("ol",null,[s("li",null,"Clicking the Cosmos logo in the top corner of Leap wallet"),s("li",null,'Scrolling down and clicking "Add new chain"')],-1),ln=s("p",null,"You can then add the following parameters:",-1),on=o("",8),pn=o("",8);function en(tn,cn,rn,En,a,yn){return t(),c("div",null,[i,s("div",E,[y,s("div",d,[s("div",_,[h,u,s("pre",F,[s("code",null,[A,n(` `),C,n(` `),m,n(` `),s("span",w,[s("span",T," chainId: '"+l(a.constants.mainnetChainId)+"',",1)]),n(` @@ -7,19 +7,19 @@ import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s `),s("span",k,[s("span",D," rest: '"+l(a.constants.mainnetRestUrl)+"'",1)]),n(` `),B,n(` `),I,n(` -`),S])]),s("pre",P,[s("code",null,[v,n(` -`),f,n(` +`),P])]),s("pre",S,[s("code",null,[v,n(` `),N,n(` +`),f,n(` `),s("span",R,[s("span",x," chainId: '"+l(a.constants.mainnetChainId)+"',",1)]),n(` `),V,n(` -`),s("span",M,[s("span",K," rpc: '"+l(a.constants.mainnetRpcUrl)+"',",1)]),n(` +`),s("span",K,[s("span",M," rpc: '"+l(a.constants.mainnetRpcUrl)+"',",1)]),n(` `),s("span",U,[s("span",L," rest: '"+l(a.constants.mainnetRestUrl)+"'",1)]),n(` -`),G,n(` `),j,n(` -`),H])])]),s("div",O,[W,J,s("pre",Y,[s("code",null,[X,n(` +`),G,n(` +`),O])])]),s("div",H,[W,z,s("pre",Y,[s("code",null,[J,n(` `),Q,n(` -`),Z,n(` -`),s("span",z,[s("span",$," chainId: '"+l(a.constants.mochaChainId)+"',",1)]),n(` +`),X,n(` +`),s("span",Z,[s("span",$," chainId: '"+l(a.constants.mochaChainId)+"',",1)]),n(` `),ss,n(` `),s("span",ns,[s("span",as," rpc: '"+l(a.constants.mochaRpcUrl)+"',",1)]),n(` `),s("span",ls,[s("span",os," rest: '"+l(a.constants.mochaRestUrl)+"'",1)]),n(` @@ -37,19 +37,19 @@ import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as e,o as t,c,k as s `),ws])])]),s("div",Ts,[bs,qs,s("pre",gs,[s("code",null,[ks,n(` `),Ds,n(` `),Bs,n(` -`),s("span",Is,[s("span",Ss," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` -`),Ps,n(` -`),s("span",vs,[s("span",fs," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` -`),s("span",Ns,[s("span",Rs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` +`),s("span",Is,[s("span",Ps," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` +`),Ss,n(` +`),s("span",vs,[s("span",Ns," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` +`),s("span",fs,[s("span",Rs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` `),xs,n(` `),Vs,n(` -`),Ms])]),s("pre",Ks,[s("code",null,[Us,n(` +`),Ks])]),s("pre",Ms,[s("code",null,[Us,n(` `),Ls,n(` -`),Gs,n(` -`),s("span",js,[s("span",Hs," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` -`),Os,n(` -`),s("span",Ws,[s("span",Js," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` -`),s("span",Ys,[s("span",Xs," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` +`),js,n(` +`),s("span",Gs,[s("span",Os," chainId: '"+l(a.constants.arabicaChainId)+"',",1)]),n(` +`),Hs,n(` +`),s("span",Ws,[s("span",zs," rpc: '"+l(a.constants.arabicaRpcUrl)+"',",1)]),n(` +`),s("span",Ys,[s("span",Js," rest: '"+l(a.constants.arabicaRestUrl)+"'",1)]),n(` `),Qs,n(` -`),Zs,n(` -`),zs])])])])]),$s,sn,nn,an,ln,s("ul",null,[s("li",null,[n("Chain Id: "),s("code",null,l(a.constants.arabicaChainId),1)]),on]),pn])}const un=e(r,[["render",en]]);export{hn as __pageData,un as default}; +`),Xs,n(` +`),Zs])])])])]),$s,sn,nn,an,ln,s("ul",null,[s("li",null,[n("Chain Id: "),s("code",null,l(a.constants.arabicaChainId),1)]),on]),pn])}const un=e(r,[["render",en]]);export{hn as __pageData,un as default}; diff --git a/pr-1699/assets/index.md.d57eea6f.js b/pr-1699/assets/index.md.7de6d8b3.js similarity index 96% rename from pr-1699/assets/index.md.d57eea6f.js rename to pr-1699/assets/index.md.7de6d8b3.js index 417b698148..7daf93bd13 100644 --- a/pr-1699/assets/index.md.d57eea6f.js +++ b/pr-1699/assets/index.md.7de6d8b3.js @@ -1 +1 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"","titleTemplate":":title","description":"","frontmatter":{"layout":"home","titleTemplate":":title","hero":{"name":"Celestia","text":"The first modular blockchain network","tagline":"Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.","image":{"src":"/modular.svg","alt":"Celestia"},"actions":[{"theme":"brand","text":"Build whatever","link":"/developers/build-whatever"},{"theme":"alt","text":"Introduction","link":"/learn/how-celestia-works/overview"}]},"features":[{"title":"Learn","details":"Celestia allows you to deploy your own blockchain in minutes, as easily as a smart contract.","link":"/learn/how-celestia-works/overview","icon":"🏗️"},{"title":"Run a node","details":"Access the dynamic scaling unlocked by data availability sampling, where scale increases with the number of users.","link":"/nodes/overview","icon":"📈"},{"title":"Developers","details":"Create applications using your favorite VM or define your own. Build sovereign rollups, a new type of self-governing blockchain with minimal platform risk.","link":"/developers/build-whatever","icon":"⚙️"},{"title":"Community","details":"Join the Celestia community to connect, collaborate, and contribute to the future of modular blockchains.","link":"/community/overview","icon":"🏰"}],"head":[["meta",{"name":"og:title","content":"Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1725971357000}'),i={name:"index.md"};function o(n,l,s,r,c,d){return t(),a("div")}const h=e(i,[["render",o]]);export{u as __pageData,h as default}; +import{_ as e,o as t,c as a}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"","titleTemplate":":title","description":"","frontmatter":{"layout":"home","titleTemplate":":title","hero":{"name":"Celestia","text":"The first modular blockchain network","tagline":"Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.","image":{"src":"/modular.svg","alt":"Celestia"},"actions":[{"theme":"brand","text":"Build whatever","link":"/developers/build-whatever"},{"theme":"alt","text":"Introduction","link":"/learn/how-celestia-works/overview"}]},"features":[{"title":"Learn","details":"Celestia allows you to deploy your own blockchain in minutes, as easily as a smart contract.","link":"/learn/how-celestia-works/overview","icon":"🏗️"},{"title":"Run a node","details":"Access the dynamic scaling unlocked by data availability sampling, where scale increases with the number of users.","link":"/nodes/overview","icon":"📈"},{"title":"Developers","details":"Create applications using your favorite VM or define your own. Build sovereign rollups, a new type of self-governing blockchain with minimal platform risk.","link":"/developers/build-whatever","icon":"⚙️"},{"title":"Community","details":"Join the Celestia community to connect, collaborate, and contribute to the future of modular blockchains.","link":"/community/overview","icon":"🏰"}],"head":[["meta",{"name":"og:title","content":"Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1725992025000}'),i={name:"index.md"};function o(n,l,s,r,c,d){return t(),a("div")}const h=e(i,[["render",o]]);export{u as __pageData,h as default}; diff --git a/pr-1699/assets/index.md.d57eea6f.lean.js b/pr-1699/assets/index.md.7de6d8b3.lean.js similarity index 96% rename from pr-1699/assets/index.md.d57eea6f.lean.js rename to pr-1699/assets/index.md.7de6d8b3.lean.js index 417b698148..7daf93bd13 100644 --- a/pr-1699/assets/index.md.d57eea6f.lean.js +++ b/pr-1699/assets/index.md.7de6d8b3.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"","titleTemplate":":title","description":"","frontmatter":{"layout":"home","titleTemplate":":title","hero":{"name":"Celestia","text":"The first modular blockchain network","tagline":"Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.","image":{"src":"/modular.svg","alt":"Celestia"},"actions":[{"theme":"brand","text":"Build whatever","link":"/developers/build-whatever"},{"theme":"alt","text":"Introduction","link":"/learn/how-celestia-works/overview"}]},"features":[{"title":"Learn","details":"Celestia allows you to deploy your own blockchain in minutes, as easily as a smart contract.","link":"/learn/how-celestia-works/overview","icon":"🏗️"},{"title":"Run a node","details":"Access the dynamic scaling unlocked by data availability sampling, where scale increases with the number of users.","link":"/nodes/overview","icon":"📈"},{"title":"Developers","details":"Create applications using your favorite VM or define your own. Build sovereign rollups, a new type of self-governing blockchain with minimal platform risk.","link":"/developers/build-whatever","icon":"⚙️"},{"title":"Community","details":"Join the Celestia community to connect, collaborate, and contribute to the future of modular blockchains.","link":"/community/overview","icon":"🏰"}],"head":[["meta",{"name":"og:title","content":"Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1725971357000}'),i={name:"index.md"};function o(n,l,s,r,c,d){return t(),a("div")}const h=e(i,[["render",o]]);export{u as __pageData,h as default}; +import{_ as e,o as t,c as a}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"","titleTemplate":":title","description":"","frontmatter":{"layout":"home","titleTemplate":":title","hero":{"name":"Celestia","text":"The first modular blockchain network","tagline":"Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.","image":{"src":"/modular.svg","alt":"Celestia"},"actions":[{"theme":"brand","text":"Build whatever","link":"/developers/build-whatever"},{"theme":"alt","text":"Introduction","link":"/learn/how-celestia-works/overview"}]},"features":[{"title":"Learn","details":"Celestia allows you to deploy your own blockchain in minutes, as easily as a smart contract.","link":"/learn/how-celestia-works/overview","icon":"🏗️"},{"title":"Run a node","details":"Access the dynamic scaling unlocked by data availability sampling, where scale increases with the number of users.","link":"/nodes/overview","icon":"📈"},{"title":"Developers","details":"Create applications using your favorite VM or define your own. Build sovereign rollups, a new type of self-governing blockchain with minimal platform risk.","link":"/developers/build-whatever","icon":"⚙️"},{"title":"Community","details":"Join the Celestia community to connect, collaborate, and contribute to the future of modular blockchains.","link":"/community/overview","icon":"🏰"}],"head":[["meta",{"name":"og:title","content":"Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1725992025000}'),i={name:"index.md"};function o(n,l,s,r,c,d){return t(),a("div")}const h=e(i,[["render",o]]);export{u as __pageData,h as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.js b/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.js similarity index 99% rename from pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.js rename to pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.js index 5a032be05e..35b7811cee 100644 --- a/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.js +++ b/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.js @@ -1 +1 @@ -import{_ as a,o as t,c as e,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-availability.png",s="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-storage.png",m=JSON.parse('{"title":"Data availability FAQ","description":"Frequently asked questions related to Data Availability.","frontmatter":{"description":"Frequently asked questions related to Data Availability.","next":{"text":"Overview of TIA","link":"/learn/tia"},"head":[["meta",{"name":"og:title","content":"Data availability FAQ | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-faq.md","filePath":"learn/how-celestia-works/data-availability-faq.md","lastUpdated":1725971357000}'),r={name:"learn/how-celestia-works/data-availability-faq.md"},l=i('

        Data availability FAQ

        What is data availability?

        Data availability answers the question, has this data been published? Specifically, a node will verify data availability when it receives a new block that is getting added to the chain. The node will attempt to download all the transaction data for the new block to verify availability. If the node can download all the transaction data, then it successfully verified data availability, proving that the block data was actually published to the network.

        Modular VS Monolithic

        As you’ll see, modular blockchains like Celestia employ other primitives that allow nodes to verify data availability more efficiently. Data availability is critical to the security of any blockchain because it ensures that anyone can inspect the ledger of transactions and verify it. Data availability becomes particularly problematic when scaling blockchains. As the blocks get bigger, it becomes impractical for normal users to download all the data, and therefore users can no longer verify the chain.

        What is the data availability problem?

        The problem with data availability occurs when the transaction data for a newly proposed block cannot be downloaded and verified. This type of attack by a block producer is called a data withholding attack, which sees the block producer withhold transaction data of a new block.

        Since transaction data is withheld, nodes cannot update to the latest state. Such an attack can have numerous consequences, from halting a chain to gaining the ability to steal funds. The severity of the consequences will depend on the type of blockchain (L1 or L2) and whether data availability is kept onchain or offchain. The data availability problem commonly arises around L2 scaling solutions like rollups and validiums.

        How do nodes verify data availability in Celestia?

        In most blockchains, nodes that verify data availability do so by downloading all transaction data for a block. If they are able to download all the data, they have verified its availability. In Celestia, light nodes have access to a new mechanism to verify data availability without needing to download all the data for a block. This new primitive for verifying data availability is called data availability sampling.

        What is data availability sampling?

        Data availability sampling is a mechanism for light nodes to verify data availability without having to download all data for a block. Data availability sampling (DAS) works by having light nodes conduct multiple rounds of random sampling for small portions of block data. As a light node completes more rounds of sampling for block data, it increases its confidence that data is available. Once the light node successfully reaches a predetermined confidence level (e.g. 99%) it will consider the block data as available.

        Want a simpler explanation? Check out this thread on how data availability sampling is like flipping a coin.

        What are some of the security assumptions that Celestia makes for data availability sampling?

        Celestia assumes that there is a minimum number of light nodes that are conducting data availability sampling for a given block size. This assumption is necessary so that a full node can reconstruct an entire block from the portions of data light nodes sampled and stored. The amount of light nodes that are needed will depend on the block size - for bigger blocks more light nodes are assumed to be running.

        A second notable assumption that is made by light nodes is that they are connected to at least one honest full node. This ensures that they can receive fraud proofs for incorrectly erasure coded blocks. If a light node is not connected to an honest full node, such as during an eclipse attack, it can’t verify that the block is improperly constructed.

        Why is block reconstruction necessary for security?

        In Celestia, blocks need to be erasure coded so that there is redundant data to aid the data availability sampling process. However, nodes tasked with erasure coding the data could do so incorrectly. Since Celestia uses fraud proofs to verify that erasure coding is incorrect, the full block data is needed to generate a bad encoding fraud proof.

        There could be a situation where validators only provide data to light nodes and not full nodes. If the full nodes don’t have the ability to reconstruct the full block from the portions of data stored by light nodes, they wouldn’t be able to generate a bad encoding fraud proof.

        What is data storage?

        Data storage is concerned with the ability to store and access past transaction data.

        Modular VS Monolithic

        Data storage and retrieval is needed for multiple purposes, such as:

        • Reading the information of a previous transaction
        • Syncing a node
        • Indexing and serving transaction data
        • Retrieving NFT information

        What is the problem around data storage?

        The issue with data storage is whether past transaction data can be stored and successfully retrieved at a later time. The inability to retrieve historical transaction data can cause problems, such as users being unable to access information about their past transactions or nodes that cannot sync from genesis. Luckily, the assumptions around storing and accessing past data are weak. Only a single copy of a blockchain’s history needs to be accessible for users to gain access to historical transaction data. In other words, data storage security is a 1 of N honesty assumption.

        What is the difference between data availability and data storage?

        Data availability is about verifying that transaction data for a new block is public and available. In contrast, data storage involves storing and accessing past transaction data from old blocks.

        Where does blockchain state fit into this?

        Up until now it’s been all about transaction data, but blockchain state is a related topic. The state is different from transaction data. Specifically, the state is like a current snapshot of the network, which includes information about account balances, smart contract balances, and validator set info. Problems that arise from the size of the state are different in nature than those around data availability and retrievability.

        Why doesn’t Celestia incentivize storage of historical data?

        Most blockchains don’t incentivize storage of data because it shouldn’t be the responsibility of a blockchain to guarantee past data will be retrievable forever. In addition, the data storage problem only requires a single party to store and provide the data for users, which is not a strong problem. As such, Celestia’s purpose is to provide a secure and scalable way to verify the availability of data. Once data has been verified as available, the job of storing and retrieving historical data is left up to other entities that require the data. Luckily, there are natural incentives for outside parties to store and serve historical data to users.

        Who may store historical data if there is no reward?

        There are multiple types of actors that may be likely to store historical data. Some of those include:

        • Block explorers that provide access to past transaction data.
        • Indexers that provide API queries for past data.
        • Applications or rollups that require historical data for certain processes.
        • Users that want to guarantee that they will have access to their transaction history.

        What are some things blockchains can do to provide stronger assurances of data retrievability?

        • Reward nodes based on the amount of transaction data they store and requests for data they serve (this is the case with some data storage blockchains, like Filecoin).
        • Publish transaction data onto a data storage blockchain that incentivizes storing and serving requests for historical data.
        ',37),n=[l];function d(h,c,b,u,f,p){return t(),e("div",null,n)}const v=a(r,[["render",d]]);export{m as __pageData,v as default}; +import{_ as a,o as t,c as e,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-availability.png",s="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-storage.png",m=JSON.parse('{"title":"Data availability FAQ","description":"Frequently asked questions related to Data Availability.","frontmatter":{"description":"Frequently asked questions related to Data Availability.","next":{"text":"Overview of TIA","link":"/learn/tia"},"head":[["meta",{"name":"og:title","content":"Data availability FAQ | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-faq.md","filePath":"learn/how-celestia-works/data-availability-faq.md","lastUpdated":1725992025000}'),r={name:"learn/how-celestia-works/data-availability-faq.md"},l=i('

        Data availability FAQ

        What is data availability?

        Data availability answers the question, has this data been published? Specifically, a node will verify data availability when it receives a new block that is getting added to the chain. The node will attempt to download all the transaction data for the new block to verify availability. If the node can download all the transaction data, then it successfully verified data availability, proving that the block data was actually published to the network.

        Modular VS Monolithic

        As you’ll see, modular blockchains like Celestia employ other primitives that allow nodes to verify data availability more efficiently. Data availability is critical to the security of any blockchain because it ensures that anyone can inspect the ledger of transactions and verify it. Data availability becomes particularly problematic when scaling blockchains. As the blocks get bigger, it becomes impractical for normal users to download all the data, and therefore users can no longer verify the chain.

        What is the data availability problem?

        The problem with data availability occurs when the transaction data for a newly proposed block cannot be downloaded and verified. This type of attack by a block producer is called a data withholding attack, which sees the block producer withhold transaction data of a new block.

        Since transaction data is withheld, nodes cannot update to the latest state. Such an attack can have numerous consequences, from halting a chain to gaining the ability to steal funds. The severity of the consequences will depend on the type of blockchain (L1 or L2) and whether data availability is kept onchain or offchain. The data availability problem commonly arises around L2 scaling solutions like rollups and validiums.

        How do nodes verify data availability in Celestia?

        In most blockchains, nodes that verify data availability do so by downloading all transaction data for a block. If they are able to download all the data, they have verified its availability. In Celestia, light nodes have access to a new mechanism to verify data availability without needing to download all the data for a block. This new primitive for verifying data availability is called data availability sampling.

        What is data availability sampling?

        Data availability sampling is a mechanism for light nodes to verify data availability without having to download all data for a block. Data availability sampling (DAS) works by having light nodes conduct multiple rounds of random sampling for small portions of block data. As a light node completes more rounds of sampling for block data, it increases its confidence that data is available. Once the light node successfully reaches a predetermined confidence level (e.g. 99%) it will consider the block data as available.

        Want a simpler explanation? Check out this thread on how data availability sampling is like flipping a coin.

        What are some of the security assumptions that Celestia makes for data availability sampling?

        Celestia assumes that there is a minimum number of light nodes that are conducting data availability sampling for a given block size. This assumption is necessary so that a full node can reconstruct an entire block from the portions of data light nodes sampled and stored. The amount of light nodes that are needed will depend on the block size - for bigger blocks more light nodes are assumed to be running.

        A second notable assumption that is made by light nodes is that they are connected to at least one honest full node. This ensures that they can receive fraud proofs for incorrectly erasure coded blocks. If a light node is not connected to an honest full node, such as during an eclipse attack, it can’t verify that the block is improperly constructed.

        Why is block reconstruction necessary for security?

        In Celestia, blocks need to be erasure coded so that there is redundant data to aid the data availability sampling process. However, nodes tasked with erasure coding the data could do so incorrectly. Since Celestia uses fraud proofs to verify that erasure coding is incorrect, the full block data is needed to generate a bad encoding fraud proof.

        There could be a situation where validators only provide data to light nodes and not full nodes. If the full nodes don’t have the ability to reconstruct the full block from the portions of data stored by light nodes, they wouldn’t be able to generate a bad encoding fraud proof.

        What is data storage?

        Data storage is concerned with the ability to store and access past transaction data.

        Modular VS Monolithic

        Data storage and retrieval is needed for multiple purposes, such as:

        • Reading the information of a previous transaction
        • Syncing a node
        • Indexing and serving transaction data
        • Retrieving NFT information

        What is the problem around data storage?

        The issue with data storage is whether past transaction data can be stored and successfully retrieved at a later time. The inability to retrieve historical transaction data can cause problems, such as users being unable to access information about their past transactions or nodes that cannot sync from genesis. Luckily, the assumptions around storing and accessing past data are weak. Only a single copy of a blockchain’s history needs to be accessible for users to gain access to historical transaction data. In other words, data storage security is a 1 of N honesty assumption.

        What is the difference between data availability and data storage?

        Data availability is about verifying that transaction data for a new block is public and available. In contrast, data storage involves storing and accessing past transaction data from old blocks.

        Where does blockchain state fit into this?

        Up until now it’s been all about transaction data, but blockchain state is a related topic. The state is different from transaction data. Specifically, the state is like a current snapshot of the network, which includes information about account balances, smart contract balances, and validator set info. Problems that arise from the size of the state are different in nature than those around data availability and retrievability.

        Why doesn’t Celestia incentivize storage of historical data?

        Most blockchains don’t incentivize storage of data because it shouldn’t be the responsibility of a blockchain to guarantee past data will be retrievable forever. In addition, the data storage problem only requires a single party to store and provide the data for users, which is not a strong problem. As such, Celestia’s purpose is to provide a secure and scalable way to verify the availability of data. Once data has been verified as available, the job of storing and retrieving historical data is left up to other entities that require the data. Luckily, there are natural incentives for outside parties to store and serve historical data to users.

        Who may store historical data if there is no reward?

        There are multiple types of actors that may be likely to store historical data. Some of those include:

        • Block explorers that provide access to past transaction data.
        • Indexers that provide API queries for past data.
        • Applications or rollups that require historical data for certain processes.
        • Users that want to guarantee that they will have access to their transaction history.

        What are some things blockchains can do to provide stronger assurances of data retrievability?

        • Reward nodes based on the amount of transaction data they store and requests for data they serve (this is the case with some data storage blockchains, like Filecoin).
        • Publish transaction data onto a data storage blockchain that incentivizes storing and serving requests for historical data.
        ',37),n=[l];function d(h,c,b,u,f,p){return t(),e("div",null,n)}const v=a(r,[["render",d]]);export{m as __pageData,v as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.lean.js b/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.lean.js similarity index 93% rename from pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.lean.js rename to pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.lean.js index c39b96008f..5307e8841b 100644 --- a/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.506e0c10.lean.js +++ b/pr-1699/assets/learn_how-celestia-works_data-availability-faq.md.b4d6ab8b.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as e,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-availability.png",s="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-storage.png",m=JSON.parse('{"title":"Data availability FAQ","description":"Frequently asked questions related to Data Availability.","frontmatter":{"description":"Frequently asked questions related to Data Availability.","next":{"text":"Overview of TIA","link":"/learn/tia"},"head":[["meta",{"name":"og:title","content":"Data availability FAQ | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-faq.md","filePath":"learn/how-celestia-works/data-availability-faq.md","lastUpdated":1725971357000}'),r={name:"learn/how-celestia-works/data-availability-faq.md"},l=i("",37),n=[l];function d(h,c,b,u,f,p){return t(),e("div",null,n)}const v=a(r,[["render",d]]);export{m as __pageData,v as default}; +import{_ as a,o as t,c as e,Q as i}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-availability.png",s="/docs-preview/pr-1699/img/learn/data-availability-faq/Data-storage.png",m=JSON.parse('{"title":"Data availability FAQ","description":"Frequently asked questions related to Data Availability.","frontmatter":{"description":"Frequently asked questions related to Data Availability.","next":{"text":"Overview of TIA","link":"/learn/tia"},"head":[["meta",{"name":"og:title","content":"Data availability FAQ | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-faq.md","filePath":"learn/how-celestia-works/data-availability-faq.md","lastUpdated":1725992025000}'),r={name:"learn/how-celestia-works/data-availability-faq.md"},l=i("",37),n=[l];function d(h,c,b,u,f,p){return t(),e("div",null,n)}const v=a(r,[["render",d]]);export{m as __pageData,v as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.js b/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.js similarity index 99% rename from pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.js rename to pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.js index 40355d8d68..b66c5995e4 100644 --- a/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.js +++ b/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.js @@ -1 +1 @@ -import{_ as l,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/img/learn/reed-solomon-encoding.png",n="/docs-preview/pr-1699/img/learn/nmt.png",r="/docs-preview/pr-1699/img/learn/celestia-app.png",g4=JSON.parse(`{"title":"Celestia's data availability layer","description":"Celestia's Data Availability layer and its key features.","frontmatter":{"description":"Celestia's Data Availability layer and its key features.","head":[["meta",{"name":"og:title","content":"Celestia's data availability layer | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-layer.md","filePath":"learn/how-celestia-works/data-availability-layer.md","lastUpdated":1725971357000}`),T={name:"learn/how-celestia-works/data-availability-layer.md"},d=s('

        Celestia's data availability layer

        Celestia is a data availability (DA) layer that provides a scalable solution to the data availability problem. Due to the permissionless nature of the blockchain networks, a DA layer must provide a mechanism for the execution and settlement layers to check in a trust-minimized way whether transaction data is indeed available.

        Two key features of Celestia's DA layer are data availability sampling (DAS) and Namespaced Merkle trees (NMTs). Both features are novel blockchain scaling solutions: DAS enables light nodes to verify data availability without needing to download an entire block; NMTs enable execution and settlement layers on Celestia to download transactions that are only relevant to them.

        Data availability sampling (DAS)

        In general, light nodes download only block headers that contain commitments (i.e., Merkle roots) of the block data (i.e., the list of transactions).

        ',5),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},c=s('',1),m=[c],p=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},u=s('',1),_=[u],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},k=s('',1),y=[k],v=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H=s('',1),V=[H],S=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),C=e("p",null,[e("img",{src:i,alt:"2D Reed-Soloman (RS) Encoding"})],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},j=s('',1),Z=[j],P=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),N=e("p",null,[t("Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a "),e("a",{href:"https://github.com/celestiaorg/celestia-node/issues/805#issuecomment-1150081075",target:"_blank",rel:"noreferrer"},"high probability guarantee"),t(" that the whole block's data is available.")],-1),I=e("em",null,"i.e.",-1),B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},q=s('',1),E=[q],z=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),G=e("p",null,[t("For more details on DAS, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(".")],-1),J=e("h3",{id:"scalability",tabindex:"-1"},[t("Scalability "),e("a",{class:"header-anchor",href:"#scalability","aria-label":'Permalink to "Scalability"'},"​")],-1),F=e("p",null,"DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.",-1),O=e("em",null,"i.e.",-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},K=s('',1),U=[K],X=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},t1=s('',1),a1=[t1],o1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},i1=s('',1),n1=[i1],r1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),T1=e("h3",{id:"fraud-proofs-of-incorrectly-extended-data",tabindex:"-1"},[t("Fraud proofs of incorrectly extended data "),e("a",{class:"header-anchor",href:"#fraud-proofs-of-incorrectly-extended-data","aria-label":'Permalink to "Fraud proofs of incorrectly extended data"'},"​")],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},h1=s('',1),c1=[h1],m1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),p1=e("em",null,"i.e.",-1),g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},u1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),_1=[u1],w1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},k1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),y1=[k1],v1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H1=s('',1),V1=[H1],S1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k")])],-1),C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},A1=s('',1),j1=[A1],Z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),P1=e("p",null,"The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.",-1),N1=e("strong",null,[t("Celestia does not require a majority of the consensus ("),e("em",null,"i.e."),t(", block producers) to be honest to guarantee data availability.")],-1),I1=e("em",null,"i.e.",-1),B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},q1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),E1=[q1],z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},F1=s('',1),O1=[F1],$1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),W1=e("em",null,"Fraud Proofs of Incorrectly Generated Extended Data",-1),K1=e("em",null,"i.e.",-1),U1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},Y1=s('',1),e4=[Y1],t4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),a4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},s4=s('',1),l4=[s4],i4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),n4=s('

        Namespaced Merkle trees (NMTs)

        Celestia partitions the block data into multiple namespaces, one for every application (e.g., rollup) using the DA layer. As a result, every application needs to download only its own data and can ignore the data of other applications.

        For this to work, the DA layer must be able to prove that the provided data is complete, i.e., all the data for a given namespace is returned. To this end, Celestia is using Namespaced Merkle trees (NMTs).

        An NMT is a Merkle tree with the leafs ordered by the namespace identifiers and the hash function modified so that every node in the tree includes the range of namespaces of all its descendants. The following figure shows an example of an NMT with height three (i.e., eight data shares). The data is partitioned into three namespaces.

        Namespaced Merkle Tree

        When an application requests the data for namespace 2, the DA layer must provide the data shares D3, D4, D5, and D6 and the nodes N2, N8 and N7 as proof (note that the application already has the root N14 from the block header).

        As a result, the application is able to check that the provided data is part of the block data. Furthermore, the application can verify that all the data for namespace 2 was provided. If the DA layer provides for example only the data shares D4 and D5, it must also provide nodes N12 and N11 as proofs. However, the application can identify that the data is incomplete by checking the namespace range of the two nodes, i.e., both N12 and N11 have descendants part of namespace 2.

        For more details on NMTs, refer to the original paper.

        Building a PoS blockchain for DA

        Providing data availability

        The Celestia DA layer consists of a PoS blockchain. Celestia is dubbing this blockchain as the celestia-app, an application that provides transactions to facilitate the DA layer and is built using Cosmos SDK. The following figure shows the main components of celestia-app.

        Main components of celestia-app

        celestia-app is built on top of celestia-core, a modified version of the Tendermint consensus algorithm. Among the more important changes to vanilla Tendermint, celestia-core:

        • Enables the erasure coding of block data (using the 2-dimensional Reed-Solomon encoding scheme).
        • Replaces the regular Merkle tree used by Tendermint to store block data with a Namespaced Merkle tree that enables the above layers (i.e., execution and settlement) to only download the needed data (for more details, see the section below describing use cases).

        For more details on the changes to Tendermint, take a look at the ADRs. Notice that celestia-core nodes are still using the Tendermint p2p network.

        Similarly to Tendermint, celestia-core is connected to the application layer (i.e., the state machine) by ABCI++, a major evolution of ABCI (Application Blockchain Interface).

        The celestia-app state machine is necessary to execute the PoS logic and to enable the governance of the DA layer.

        However, the celestia-app is data-agnostic -- the state machine neither validates nor stores the data that is made available by the celestia-app.

        ',18);function r4(T4,d4,Q4,h4,c4,m4){return a(),o("div",null,[d,e("p",null,[t("To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into "),e("mjx-container",Q,[(a(),o("svg",h,m)),p]),t(" shares, arranged in a "),e("mjx-container",g,[(a(),o("svg",x,_)),w]),t(" matrix, and extended with parity data into a "),e("mjx-container",f,[(a(),o("svg",b,y)),v]),t(" extended matrix by applying multiple times Reed-Solomon encoding.")]),e("p",null,[t("Then, "),e("mjx-container",L,[(a(),o("svg",M,V)),S]),t(" separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.")]),C,e("p",null,[t("To verify that the data is available, Celestia light nodes are sampling the "),e("mjx-container",D,[(a(),o("svg",A,Z)),P]),t(" data shares.")]),N,e("p",null,[t("Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares ("),I,t(", at least "),e("mjx-container",B,[(a(),o("svg",R,E)),z]),t(" unique shares), the full block can be recovered by honest full nodes.")]),G,J,F,e("p",null,[t("This means that increasing the number of light nodes performing DAS allows for larger blocks ("),O,t(", with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the "),e("mjx-container",$,[(a(),o("svg",W,U)),X]),t(" intermediate Merkle roots.")]),e("p",null,[t("For a block data size of "),e("mjx-container",Y,[(a(),o("svg",e1,a1)),o1]),t(" bytes, this means that every light node must download "),e("mjx-container",s1,[(a(),o("svg",l1,n1)),r1]),t(" bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.")]),T1,e("p",null,[t("The requirement of downloading the "),e("mjx-container",d1,[(a(),o("svg",Q1,c1)),m1]),t(" intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard ("),p1,t(", 1-dimensional) Reed-Solomon encoding, where the original data is split into "),e("mjx-container",g1,[(a(),o("svg",x1,_1)),w1]),t(" shares and extended with "),e("mjx-container",f1,[(a(),o("svg",b1,y1)),v1]),t(" additional shares of parity data. Since the block data commitment is the Merkle root of the "),e("mjx-container",L1,[(a(),o("svg",M1,V1)),S1]),t(" resulting data shares, light nodes no longer need to download "),e("mjx-container",C1,[(a(),o("svg",D1,j1)),Z1]),t(" bytes to validate block headers.")]),P1,e("p",null,[t("This is possible as "),N1,t(" Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares ("),I1,t(", at least "),e("mjx-container",B1,[(a(),o("svg",R1,E1)),z1]),t(" for a standard encoding and "),e("mjx-container",G1,[(a(),o("svg",J1,O1)),$1]),t(" for a 2-dimensional encoding).")]),e("p",null,[t("As a solution, "),W1,t(" enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, "),K1,t(", "),e("mjx-container",U1,[(a(),o("svg",X1,e4)),t4]),t(" bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only "),e("mjx-container",a4,[(a(),o("svg",o4,l4)),i4]),t(" bytes are required as it is sufficient to verify only one row or one column of the extended matrix.")]),n4])}const x4=l(T,[["render",r4]]);export{g4 as __pageData,x4 as default}; +import{_ as l,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/img/learn/reed-solomon-encoding.png",n="/docs-preview/pr-1699/img/learn/nmt.png",r="/docs-preview/pr-1699/img/learn/celestia-app.png",g4=JSON.parse(`{"title":"Celestia's data availability layer","description":"Celestia's Data Availability layer and its key features.","frontmatter":{"description":"Celestia's Data Availability layer and its key features.","head":[["meta",{"name":"og:title","content":"Celestia's data availability layer | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-layer.md","filePath":"learn/how-celestia-works/data-availability-layer.md","lastUpdated":1725992025000}`),T={name:"learn/how-celestia-works/data-availability-layer.md"},d=s('

        Celestia's data availability layer

        Celestia is a data availability (DA) layer that provides a scalable solution to the data availability problem. Due to the permissionless nature of the blockchain networks, a DA layer must provide a mechanism for the execution and settlement layers to check in a trust-minimized way whether transaction data is indeed available.

        Two key features of Celestia's DA layer are data availability sampling (DAS) and Namespaced Merkle trees (NMTs). Both features are novel blockchain scaling solutions: DAS enables light nodes to verify data availability without needing to download an entire block; NMTs enable execution and settlement layers on Celestia to download transactions that are only relevant to them.

        Data availability sampling (DAS)

        In general, light nodes download only block headers that contain commitments (i.e., Merkle roots) of the block data (i.e., the list of transactions).

        ',5),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},c=s('',1),m=[c],p=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},u=s('',1),_=[u],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},k=s('',1),y=[k],v=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H=s('',1),V=[H],S=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),C=e("p",null,[e("img",{src:i,alt:"2D Reed-Soloman (RS) Encoding"})],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},j=s('',1),Z=[j],P=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),N=e("p",null,[t("Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a "),e("a",{href:"https://github.com/celestiaorg/celestia-node/issues/805#issuecomment-1150081075",target:"_blank",rel:"noreferrer"},"high probability guarantee"),t(" that the whole block's data is available.")],-1),I=e("em",null,"i.e.",-1),B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},q=s('',1),E=[q],z=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),G=e("p",null,[t("For more details on DAS, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(".")],-1),J=e("h3",{id:"scalability",tabindex:"-1"},[t("Scalability "),e("a",{class:"header-anchor",href:"#scalability","aria-label":'Permalink to "Scalability"'},"​")],-1),F=e("p",null,"DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.",-1),O=e("em",null,"i.e.",-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},K=s('',1),U=[K],X=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},t1=s('',1),a1=[t1],o1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},i1=s('',1),n1=[i1],r1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),T1=e("h3",{id:"fraud-proofs-of-incorrectly-extended-data",tabindex:"-1"},[t("Fraud proofs of incorrectly extended data "),e("a",{class:"header-anchor",href:"#fraud-proofs-of-incorrectly-extended-data","aria-label":'Permalink to "Fraud proofs of incorrectly extended data"'},"​")],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},h1=s('',1),c1=[h1],m1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),p1=e("em",null,"i.e.",-1),g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},u1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),_1=[u1],w1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},k1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),y1=[k1],v1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H1=s('',1),V1=[H1],S1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k")])],-1),C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},A1=s('',1),j1=[A1],Z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),P1=e("p",null,"The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.",-1),N1=e("strong",null,[t("Celestia does not require a majority of the consensus ("),e("em",null,"i.e."),t(", block producers) to be honest to guarantee data availability.")],-1),I1=e("em",null,"i.e.",-1),B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},q1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),E1=[q1],z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},F1=s('',1),O1=[F1],$1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),W1=e("em",null,"Fraud Proofs of Incorrectly Generated Extended Data",-1),K1=e("em",null,"i.e.",-1),U1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},Y1=s('',1),e4=[Y1],t4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),a4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},s4=s('',1),l4=[s4],i4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),n4=s('

        Namespaced Merkle trees (NMTs)

        Celestia partitions the block data into multiple namespaces, one for every application (e.g., rollup) using the DA layer. As a result, every application needs to download only its own data and can ignore the data of other applications.

        For this to work, the DA layer must be able to prove that the provided data is complete, i.e., all the data for a given namespace is returned. To this end, Celestia is using Namespaced Merkle trees (NMTs).

        An NMT is a Merkle tree with the leafs ordered by the namespace identifiers and the hash function modified so that every node in the tree includes the range of namespaces of all its descendants. The following figure shows an example of an NMT with height three (i.e., eight data shares). The data is partitioned into three namespaces.

        Namespaced Merkle Tree

        When an application requests the data for namespace 2, the DA layer must provide the data shares D3, D4, D5, and D6 and the nodes N2, N8 and N7 as proof (note that the application already has the root N14 from the block header).

        As a result, the application is able to check that the provided data is part of the block data. Furthermore, the application can verify that all the data for namespace 2 was provided. If the DA layer provides for example only the data shares D4 and D5, it must also provide nodes N12 and N11 as proofs. However, the application can identify that the data is incomplete by checking the namespace range of the two nodes, i.e., both N12 and N11 have descendants part of namespace 2.

        For more details on NMTs, refer to the original paper.

        Building a PoS blockchain for DA

        Providing data availability

        The Celestia DA layer consists of a PoS blockchain. Celestia is dubbing this blockchain as the celestia-app, an application that provides transactions to facilitate the DA layer and is built using Cosmos SDK. The following figure shows the main components of celestia-app.

        Main components of celestia-app

        celestia-app is built on top of celestia-core, a modified version of the Tendermint consensus algorithm. Among the more important changes to vanilla Tendermint, celestia-core:

        • Enables the erasure coding of block data (using the 2-dimensional Reed-Solomon encoding scheme).
        • Replaces the regular Merkle tree used by Tendermint to store block data with a Namespaced Merkle tree that enables the above layers (i.e., execution and settlement) to only download the needed data (for more details, see the section below describing use cases).

        For more details on the changes to Tendermint, take a look at the ADRs. Notice that celestia-core nodes are still using the Tendermint p2p network.

        Similarly to Tendermint, celestia-core is connected to the application layer (i.e., the state machine) by ABCI++, a major evolution of ABCI (Application Blockchain Interface).

        The celestia-app state machine is necessary to execute the PoS logic and to enable the governance of the DA layer.

        However, the celestia-app is data-agnostic -- the state machine neither validates nor stores the data that is made available by the celestia-app.

        ',18);function r4(T4,d4,Q4,h4,c4,m4){return a(),o("div",null,[d,e("p",null,[t("To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into "),e("mjx-container",Q,[(a(),o("svg",h,m)),p]),t(" shares, arranged in a "),e("mjx-container",g,[(a(),o("svg",x,_)),w]),t(" matrix, and extended with parity data into a "),e("mjx-container",f,[(a(),o("svg",b,y)),v]),t(" extended matrix by applying multiple times Reed-Solomon encoding.")]),e("p",null,[t("Then, "),e("mjx-container",L,[(a(),o("svg",M,V)),S]),t(" separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.")]),C,e("p",null,[t("To verify that the data is available, Celestia light nodes are sampling the "),e("mjx-container",D,[(a(),o("svg",A,Z)),P]),t(" data shares.")]),N,e("p",null,[t("Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares ("),I,t(", at least "),e("mjx-container",B,[(a(),o("svg",R,E)),z]),t(" unique shares), the full block can be recovered by honest full nodes.")]),G,J,F,e("p",null,[t("This means that increasing the number of light nodes performing DAS allows for larger blocks ("),O,t(", with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the "),e("mjx-container",$,[(a(),o("svg",W,U)),X]),t(" intermediate Merkle roots.")]),e("p",null,[t("For a block data size of "),e("mjx-container",Y,[(a(),o("svg",e1,a1)),o1]),t(" bytes, this means that every light node must download "),e("mjx-container",s1,[(a(),o("svg",l1,n1)),r1]),t(" bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.")]),T1,e("p",null,[t("The requirement of downloading the "),e("mjx-container",d1,[(a(),o("svg",Q1,c1)),m1]),t(" intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard ("),p1,t(", 1-dimensional) Reed-Solomon encoding, where the original data is split into "),e("mjx-container",g1,[(a(),o("svg",x1,_1)),w1]),t(" shares and extended with "),e("mjx-container",f1,[(a(),o("svg",b1,y1)),v1]),t(" additional shares of parity data. Since the block data commitment is the Merkle root of the "),e("mjx-container",L1,[(a(),o("svg",M1,V1)),S1]),t(" resulting data shares, light nodes no longer need to download "),e("mjx-container",C1,[(a(),o("svg",D1,j1)),Z1]),t(" bytes to validate block headers.")]),P1,e("p",null,[t("This is possible as "),N1,t(" Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares ("),I1,t(", at least "),e("mjx-container",B1,[(a(),o("svg",R1,E1)),z1]),t(" for a standard encoding and "),e("mjx-container",G1,[(a(),o("svg",J1,O1)),$1]),t(" for a 2-dimensional encoding).")]),e("p",null,[t("As a solution, "),W1,t(" enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, "),K1,t(", "),e("mjx-container",U1,[(a(),o("svg",X1,e4)),t4]),t(" bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only "),e("mjx-container",a4,[(a(),o("svg",o4,l4)),i4]),t(" bytes are required as it is sufficient to verify only one row or one column of the extended matrix.")]),n4])}const x4=l(T,[["render",r4]]);export{g4 as __pageData,x4 as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.lean.js b/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.lean.js similarity index 99% rename from pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.lean.js rename to pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.lean.js index 96bf0284a1..02d0d71dde 100644 --- a/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.d71fa908.lean.js +++ b/pr-1699/assets/learn_how-celestia-works_data-availability-layer.md.4a9aff1a.lean.js @@ -1 +1 @@ -import{_ as l,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/img/learn/reed-solomon-encoding.png",n="/docs-preview/pr-1699/img/learn/nmt.png",r="/docs-preview/pr-1699/img/learn/celestia-app.png",g4=JSON.parse(`{"title":"Celestia's data availability layer","description":"Celestia's Data Availability layer and its key features.","frontmatter":{"description":"Celestia's Data Availability layer and its key features.","head":[["meta",{"name":"og:title","content":"Celestia's data availability layer | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-layer.md","filePath":"learn/how-celestia-works/data-availability-layer.md","lastUpdated":1725971357000}`),T={name:"learn/how-celestia-works/data-availability-layer.md"},d=s("",5),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},c=s("",1),m=[c],p=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},u=s("",1),_=[u],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},k=s("",1),y=[k],v=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H=s("",1),V=[H],S=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),C=e("p",null,[e("img",{src:i,alt:"2D Reed-Soloman (RS) Encoding"})],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},j=s("",1),Z=[j],P=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),N=e("p",null,[t("Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a "),e("a",{href:"https://github.com/celestiaorg/celestia-node/issues/805#issuecomment-1150081075",target:"_blank",rel:"noreferrer"},"high probability guarantee"),t(" that the whole block's data is available.")],-1),I=e("em",null,"i.e.",-1),B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},q=s("",1),E=[q],z=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),G=e("p",null,[t("For more details on DAS, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(".")],-1),J=e("h3",{id:"scalability",tabindex:"-1"},[t("Scalability "),e("a",{class:"header-anchor",href:"#scalability","aria-label":'Permalink to "Scalability"'},"​")],-1),F=e("p",null,"DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.",-1),O=e("em",null,"i.e.",-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},K=s("",1),U=[K],X=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},t1=s("",1),a1=[t1],o1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},i1=s("",1),n1=[i1],r1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),T1=e("h3",{id:"fraud-proofs-of-incorrectly-extended-data",tabindex:"-1"},[t("Fraud proofs of incorrectly extended data "),e("a",{class:"header-anchor",href:"#fraud-proofs-of-incorrectly-extended-data","aria-label":'Permalink to "Fraud proofs of incorrectly extended data"'},"​")],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},h1=s("",1),c1=[h1],m1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),p1=e("em",null,"i.e.",-1),g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},u1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),_1=[u1],w1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},k1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),y1=[k1],v1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H1=s("",1),V1=[H1],S1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k")])],-1),C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},A1=s("",1),j1=[A1],Z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),P1=e("p",null,"The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.",-1),N1=e("strong",null,[t("Celestia does not require a majority of the consensus ("),e("em",null,"i.e."),t(", block producers) to be honest to guarantee data availability.")],-1),I1=e("em",null,"i.e.",-1),B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},q1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),E1=[q1],z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},F1=s("",1),O1=[F1],$1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),W1=e("em",null,"Fraud Proofs of Incorrectly Generated Extended Data",-1),K1=e("em",null,"i.e.",-1),U1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},Y1=s("",1),e4=[Y1],t4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),a4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},s4=s("",1),l4=[s4],i4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),n4=s("",18);function r4(T4,d4,Q4,h4,c4,m4){return a(),o("div",null,[d,e("p",null,[t("To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into "),e("mjx-container",Q,[(a(),o("svg",h,m)),p]),t(" shares, arranged in a "),e("mjx-container",g,[(a(),o("svg",x,_)),w]),t(" matrix, and extended with parity data into a "),e("mjx-container",f,[(a(),o("svg",b,y)),v]),t(" extended matrix by applying multiple times Reed-Solomon encoding.")]),e("p",null,[t("Then, "),e("mjx-container",L,[(a(),o("svg",M,V)),S]),t(" separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.")]),C,e("p",null,[t("To verify that the data is available, Celestia light nodes are sampling the "),e("mjx-container",D,[(a(),o("svg",A,Z)),P]),t(" data shares.")]),N,e("p",null,[t("Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares ("),I,t(", at least "),e("mjx-container",B,[(a(),o("svg",R,E)),z]),t(" unique shares), the full block can be recovered by honest full nodes.")]),G,J,F,e("p",null,[t("This means that increasing the number of light nodes performing DAS allows for larger blocks ("),O,t(", with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the "),e("mjx-container",$,[(a(),o("svg",W,U)),X]),t(" intermediate Merkle roots.")]),e("p",null,[t("For a block data size of "),e("mjx-container",Y,[(a(),o("svg",e1,a1)),o1]),t(" bytes, this means that every light node must download "),e("mjx-container",s1,[(a(),o("svg",l1,n1)),r1]),t(" bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.")]),T1,e("p",null,[t("The requirement of downloading the "),e("mjx-container",d1,[(a(),o("svg",Q1,c1)),m1]),t(" intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard ("),p1,t(", 1-dimensional) Reed-Solomon encoding, where the original data is split into "),e("mjx-container",g1,[(a(),o("svg",x1,_1)),w1]),t(" shares and extended with "),e("mjx-container",f1,[(a(),o("svg",b1,y1)),v1]),t(" additional shares of parity data. Since the block data commitment is the Merkle root of the "),e("mjx-container",L1,[(a(),o("svg",M1,V1)),S1]),t(" resulting data shares, light nodes no longer need to download "),e("mjx-container",C1,[(a(),o("svg",D1,j1)),Z1]),t(" bytes to validate block headers.")]),P1,e("p",null,[t("This is possible as "),N1,t(" Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares ("),I1,t(", at least "),e("mjx-container",B1,[(a(),o("svg",R1,E1)),z1]),t(" for a standard encoding and "),e("mjx-container",G1,[(a(),o("svg",J1,O1)),$1]),t(" for a 2-dimensional encoding).")]),e("p",null,[t("As a solution, "),W1,t(" enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, "),K1,t(", "),e("mjx-container",U1,[(a(),o("svg",X1,e4)),t4]),t(" bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only "),e("mjx-container",a4,[(a(),o("svg",o4,l4)),i4]),t(" bytes are required as it is sufficient to verify only one row or one column of the extended matrix.")]),n4])}const x4=l(T,[["render",r4]]);export{g4 as __pageData,x4 as default}; +import{_ as l,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const i="/docs-preview/pr-1699/img/learn/reed-solomon-encoding.png",n="/docs-preview/pr-1699/img/learn/nmt.png",r="/docs-preview/pr-1699/img/learn/celestia-app.png",g4=JSON.parse(`{"title":"Celestia's data availability layer","description":"Celestia's Data Availability layer and its key features.","frontmatter":{"description":"Celestia's Data Availability layer and its key features.","head":[["meta",{"name":"og:title","content":"Celestia's data availability layer | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/data-availability-layer.md","filePath":"learn/how-celestia-works/data-availability-layer.md","lastUpdated":1725992025000}`),T={name:"learn/how-celestia-works/data-availability-layer.md"},d=s("",5),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},c=s("",1),m=[c],p=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},u=s("",1),_=[u],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},k=s("",1),y=[k],v=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H=s("",1),V=[H],S=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),C=e("p",null,[e("img",{src:i,alt:"2D Reed-Soloman (RS) Encoding"})],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},j=s("",1),Z=[j],P=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),N=e("p",null,[t("Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a "),e("a",{href:"https://github.com/celestiaorg/celestia-node/issues/805#issuecomment-1150081075",target:"_blank",rel:"noreferrer"},"high probability guarantee"),t(" that the whole block's data is available.")],-1),I=e("em",null,"i.e.",-1),B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},q=s("",1),E=[q],z=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),G=e("p",null,[t("For more details on DAS, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(".")],-1),J=e("h3",{id:"scalability",tabindex:"-1"},[t("Scalability "),e("a",{class:"header-anchor",href:"#scalability","aria-label":'Permalink to "Scalability"'},"​")],-1),F=e("p",null,"DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.",-1),O=e("em",null,"i.e.",-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},K=s("",1),U=[K],X=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},t1=s("",1),a1=[t1],o1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},i1=s("",1),n1=[i1],r1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),T1=e("h3",{id:"fraud-proofs-of-incorrectly-extended-data",tabindex:"-1"},[t("Fraud proofs of incorrectly extended data "),e("a",{class:"header-anchor",href:"#fraud-proofs-of-incorrectly-extended-data","aria-label":'Permalink to "Fraud proofs of incorrectly extended data"'},"​")],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},h1=s("",1),c1=[h1],m1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),p1=e("em",null,"i.e.",-1),g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},u1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),_1=[u1],w1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},k1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),y1=[k1],v1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},H1=s("",1),V1=[H1],S1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k")])],-1),C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},A1=s("",1),j1=[A1],Z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),P1=e("p",null,"The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.",-1),N1=e("strong",null,[t("Celestia does not require a majority of the consensus ("),e("em",null,"i.e."),t(", block producers) to be honest to guarantee data availability.")],-1),I1=e("em",null,"i.e.",-1),B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},q1=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mi"},[e("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1),E1=[q1],z1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k")])],-1),G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},F1=s("",1),O1=[F1],$1=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),W1=e("em",null,"Fraud Proofs of Incorrectly Generated Extended Data",-1),K1=e("em",null,"i.e.",-1),U1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.345ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1036.6 844.9","aria-hidden":"true"},Y1=s("",1),e4=[Y1],t4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("msup",null,[e("mi",null,"n"),e("mn",null,"2")])])],-1),a4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.844ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2141 1000","aria-hidden":"true"},s4=s("",1),l4=[s4],i4=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"O"),e("mo",{stretchy:"false"},"("),e("mi",null,"n"),e("mo",{stretchy:"false"},")")])],-1),n4=s("",18);function r4(T4,d4,Q4,h4,c4,m4){return a(),o("div",null,[d,e("p",null,[t("To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into "),e("mjx-container",Q,[(a(),o("svg",h,m)),p]),t(" shares, arranged in a "),e("mjx-container",g,[(a(),o("svg",x,_)),w]),t(" matrix, and extended with parity data into a "),e("mjx-container",f,[(a(),o("svg",b,y)),v]),t(" extended matrix by applying multiple times Reed-Solomon encoding.")]),e("p",null,[t("Then, "),e("mjx-container",L,[(a(),o("svg",M,V)),S]),t(" separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.")]),C,e("p",null,[t("To verify that the data is available, Celestia light nodes are sampling the "),e("mjx-container",D,[(a(),o("svg",A,Z)),P]),t(" data shares.")]),N,e("p",null,[t("Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares ("),I,t(", at least "),e("mjx-container",B,[(a(),o("svg",R,E)),z]),t(" unique shares), the full block can be recovered by honest full nodes.")]),G,J,F,e("p",null,[t("This means that increasing the number of light nodes performing DAS allows for larger blocks ("),O,t(", with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the "),e("mjx-container",$,[(a(),o("svg",W,U)),X]),t(" intermediate Merkle roots.")]),e("p",null,[t("For a block data size of "),e("mjx-container",Y,[(a(),o("svg",e1,a1)),o1]),t(" bytes, this means that every light node must download "),e("mjx-container",s1,[(a(),o("svg",l1,n1)),r1]),t(" bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.")]),T1,e("p",null,[t("The requirement of downloading the "),e("mjx-container",d1,[(a(),o("svg",Q1,c1)),m1]),t(" intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard ("),p1,t(", 1-dimensional) Reed-Solomon encoding, where the original data is split into "),e("mjx-container",g1,[(a(),o("svg",x1,_1)),w1]),t(" shares and extended with "),e("mjx-container",f1,[(a(),o("svg",b1,y1)),v1]),t(" additional shares of parity data. Since the block data commitment is the Merkle root of the "),e("mjx-container",L1,[(a(),o("svg",M1,V1)),S1]),t(" resulting data shares, light nodes no longer need to download "),e("mjx-container",C1,[(a(),o("svg",D1,j1)),Z1]),t(" bytes to validate block headers.")]),P1,e("p",null,[t("This is possible as "),N1,t(" Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares ("),I1,t(", at least "),e("mjx-container",B1,[(a(),o("svg",R1,E1)),z1]),t(" for a standard encoding and "),e("mjx-container",G1,[(a(),o("svg",J1,O1)),$1]),t(" for a 2-dimensional encoding).")]),e("p",null,[t("As a solution, "),W1,t(" enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, "),K1,t(", "),e("mjx-container",U1,[(a(),o("svg",X1,e4)),t4]),t(" bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only "),e("mjx-container",a4,[(a(),o("svg",o4,l4)),i4]),t(" bytes are required as it is sufficient to verify only one row or one column of the extended matrix.")]),n4])}const x4=l(T,[["render",r4]]);export{g4 as __pageData,x4 as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.js b/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.js similarity index 98% rename from pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.js rename to pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.js index 14f3cc6796..a32e559503 100644 --- a/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.js +++ b/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/learn/monolithic-modular.png",g=JSON.parse('{"title":"Monolithic vs. modular blockchains","description":"Comparison between monolithic and modular blockchains.","frontmatter":{"description":"Comparison between monolithic and modular blockchains.","head":[["meta",{"name":"og:title","content":"Monolithic vs. modular blockchains | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/monolithic-vs-modular.md","filePath":"learn/how-celestia-works/monolithic-vs-modular.md","lastUpdated":1725971357000}'),i={name:"learn/how-celestia-works/monolithic-vs-modular.md"},s=a('

        Monolithic vs. modular blockchains

        Blockchains instantiate replicated state machines: the nodes in a permissionless distributed network apply an ordered sequence of deterministic transactions to an initial state resulting in a common final state.

        In other words, this means that nodes in a network all follow the same set of rules (i.e., an ordered sequence of transactions) to go from a starting point (i.e., an initial state) to an ending point (i.e., a common final state). This process ensures that all nodes in the network agree on the final state of the blockchain, even though they operate independently.

        This means blockchains require the following four functions:

        • Execution entails executing transactions that update the state correctly. Thus, execution must ensure that only valid transactions are executed, i.e., transactions that result in valid state machine transitions.
        • Settlement entails an environment for execution layers to verify proofs, resolve fraud disputes, and bridge between other execution layers.
        • Consensus entails agreeing on the order of the transactions.
        • Data Availability (DA) entails making the transaction data available. Note that execution, settlement, and consensus require DA.

        Traditional blockchains, i.e. monolithic blockchains, implement all four functions together in a single base consensus layer. The problem with monolithic blockchains is that the consensus layer must perform numerous different tasks, and it cannot be optimized for only one of these functions. As a result, the monolithic paradigm limits the throughput of the system.

        Modular VS Monolithic

        As a solution, modular blockchains decouple these functions among multiple specialized layers as part of a modular stack. Due to the flexibility that specialization provides, there are many possibilities in which that stack can be arranged. For example, one such arrangement is the separation of the four functions into three specialized layers.

        The base layer consists of DA and consensus and thus, is referred to as the Consensus and DA layer (or for brevity, the DA layer), while both settlement and execution are moved on top in their own layers. As a result, every layer can be specialized to optimally perform only its function, and thus, increase the throughput of the system. Furthermore, this modular paradigm enables multiple execution layers, i.e., rollups, to use the same settlement and DA layers.

        ',9),r=[s];function l(c,h,m,d,u,p){return t(),o("div",null,r)}const b=e(i,[["render",l]]);export{g as __pageData,b as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/learn/monolithic-modular.png",g=JSON.parse('{"title":"Monolithic vs. modular blockchains","description":"Comparison between monolithic and modular blockchains.","frontmatter":{"description":"Comparison between monolithic and modular blockchains.","head":[["meta",{"name":"og:title","content":"Monolithic vs. modular blockchains | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/monolithic-vs-modular.md","filePath":"learn/how-celestia-works/monolithic-vs-modular.md","lastUpdated":1725992025000}'),i={name:"learn/how-celestia-works/monolithic-vs-modular.md"},s=a('

        Monolithic vs. modular blockchains

        Blockchains instantiate replicated state machines: the nodes in a permissionless distributed network apply an ordered sequence of deterministic transactions to an initial state resulting in a common final state.

        In other words, this means that nodes in a network all follow the same set of rules (i.e., an ordered sequence of transactions) to go from a starting point (i.e., an initial state) to an ending point (i.e., a common final state). This process ensures that all nodes in the network agree on the final state of the blockchain, even though they operate independently.

        This means blockchains require the following four functions:

        • Execution entails executing transactions that update the state correctly. Thus, execution must ensure that only valid transactions are executed, i.e., transactions that result in valid state machine transitions.
        • Settlement entails an environment for execution layers to verify proofs, resolve fraud disputes, and bridge between other execution layers.
        • Consensus entails agreeing on the order of the transactions.
        • Data Availability (DA) entails making the transaction data available. Note that execution, settlement, and consensus require DA.

        Traditional blockchains, i.e. monolithic blockchains, implement all four functions together in a single base consensus layer. The problem with monolithic blockchains is that the consensus layer must perform numerous different tasks, and it cannot be optimized for only one of these functions. As a result, the monolithic paradigm limits the throughput of the system.

        Modular VS Monolithic

        As a solution, modular blockchains decouple these functions among multiple specialized layers as part of a modular stack. Due to the flexibility that specialization provides, there are many possibilities in which that stack can be arranged. For example, one such arrangement is the separation of the four functions into three specialized layers.

        The base layer consists of DA and consensus and thus, is referred to as the Consensus and DA layer (or for brevity, the DA layer), while both settlement and execution are moved on top in their own layers. As a result, every layer can be specialized to optimally perform only its function, and thus, increase the throughput of the system. Furthermore, this modular paradigm enables multiple execution layers, i.e., rollups, to use the same settlement and DA layers.

        ',9),r=[s];function l(c,h,m,d,u,p){return t(),o("div",null,r)}const b=e(i,[["render",l]]);export{g as __pageData,b as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.lean.js b/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.lean.js similarity index 92% rename from pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.lean.js rename to pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.lean.js index c1e7fe0bc6..7f90514669 100644 --- a/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.8f0114bd.lean.js +++ b/pr-1699/assets/learn_how-celestia-works_monolithic-vs-modular.md.63b4aa3e.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/learn/monolithic-modular.png",g=JSON.parse('{"title":"Monolithic vs. modular blockchains","description":"Comparison between monolithic and modular blockchains.","frontmatter":{"description":"Comparison between monolithic and modular blockchains.","head":[["meta",{"name":"og:title","content":"Monolithic vs. modular blockchains | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/monolithic-vs-modular.md","filePath":"learn/how-celestia-works/monolithic-vs-modular.md","lastUpdated":1725971357000}'),i={name:"learn/how-celestia-works/monolithic-vs-modular.md"},s=a("",9),r=[s];function l(c,h,m,d,u,p){return t(),o("div",null,r)}const b=e(i,[["render",l]]);export{g as __pageData,b as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/learn/monolithic-modular.png",g=JSON.parse('{"title":"Monolithic vs. modular blockchains","description":"Comparison between monolithic and modular blockchains.","frontmatter":{"description":"Comparison between monolithic and modular blockchains.","head":[["meta",{"name":"og:title","content":"Monolithic vs. modular blockchains | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/monolithic-vs-modular.md","filePath":"learn/how-celestia-works/monolithic-vs-modular.md","lastUpdated":1725992025000}'),i={name:"learn/how-celestia-works/monolithic-vs-modular.md"},s=a("",9),r=[s];function l(c,h,m,d,u,p){return t(),o("div",null,r)}const b=e(i,[["render",l]]);export{g as __pageData,b as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.js b/pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.js similarity index 97% rename from pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.js rename to pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.js index 4f74f9d5bd..afa524f403 100644 --- a/pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.js +++ b/pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Introduction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/overview.md","filePath":"learn/how-celestia-works/overview.md","lastUpdated":1725971357000}'),i={name:"learn/how-celestia-works/overview.md"},o=r('

        Introduction

        Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.

        Celestia enables the next generation of scalable blockchain architectures - modular blockchains. Celestia scales by decoupling execution from consensus and introducing a new primitive, data availability sampling.

        The former entails that Celestia is only responsible for ordering transactions and guaranteeing their data availability; this is similar to reducing consensus to atomic broadcast.

        The latter provides an efficient solution to the data availability problem by only requiring resource-limited light nodes to sample a small number of random shares from each block to verify data availability.

        Interestingly, more light nodes that participate in sampling increases the amount of data that the network can safely handle, enabling the block size to increase without equally increasing the cost to verify the chain.

        ',6),n=[o];function s(l,c,h,d,p,m){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{f as __pageData,_ as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Introduction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/overview.md","filePath":"learn/how-celestia-works/overview.md","lastUpdated":1725992025000}'),i={name:"learn/how-celestia-works/overview.md"},o=r('

        Introduction

        Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.

        Celestia enables the next generation of scalable blockchain architectures - modular blockchains. Celestia scales by decoupling execution from consensus and introducing a new primitive, data availability sampling.

        The former entails that Celestia is only responsible for ordering transactions and guaranteeing their data availability; this is similar to reducing consensus to atomic broadcast.

        The latter provides an efficient solution to the data availability problem by only requiring resource-limited light nodes to sample a small number of random shares from each block to verify data availability.

        Interestingly, more light nodes that participate in sampling increases the amount of data that the network can safely handle, enabling the block size to increase without equally increasing the cost to verify the chain.

        ',6),n=[o];function s(l,c,h,d,p,m){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.lean.js b/pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.lean.js similarity index 89% rename from pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.lean.js rename to pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.lean.js index 134320c1ce..b14e754283 100644 --- a/pr-1699/assets/learn_how-celestia-works_overview.md.e560d4a4.lean.js +++ b/pr-1699/assets/learn_how-celestia-works_overview.md.42a4dc74.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Introduction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/overview.md","filePath":"learn/how-celestia-works/overview.md","lastUpdated":1725971357000}'),i={name:"learn/how-celestia-works/overview.md"},o=r("",6),n=[o];function s(l,c,h,d,p,m){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{f as __pageData,_ as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Introduction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/overview.md","filePath":"learn/how-celestia-works/overview.md","lastUpdated":1725992025000}'),i={name:"learn/how-celestia-works/overview.md"},o=r("",6),n=[o];function s(l,c,h,d,p,m){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.js b/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.js similarity index 99% rename from pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.js rename to pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.js index fc84585d02..c6bc969114 100644 --- a/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.js +++ b/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.js @@ -1 +1 @@ -import{_ as i}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as n,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/learn/consensus-da.png",K=JSON.parse('{"title":"The lifecycle of a celestia-app transaction","description":"Learn what is the lifecycle of a celestia-app transaction.","frontmatter":{"description":"Learn what is the lifecycle of a celestia-app transaction.","head":[["meta",{"name":"og:title","content":"The lifecycle of a celestia-app transaction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/transaction-lifecycle.md","filePath":"learn/how-celestia-works/transaction-lifecycle.md","lastUpdated":1725971357000}'),r={name:"learn/how-celestia-works/transaction-lifecycle.md"},c=s('

        The lifecycle of a celestia-app transaction

        Users request the celestia-app to make data available by sending PayForBlobs transactions. Every such transaction consists of the identity of the sender, the data to be made available, also referred to as the message, the data size, the namespace, and a signature. Every block producer batches multiple PayForBlobs transactions into a block.

        Before proposing the block though, the producer passes it to the state machine via ABCI++, where each PayForBlobs transaction is split into a namespaced message (denoted by Msg in the figure below), i.e., the data together with the namespace ID, and an executable transaction (denoted by e-Tx in the figure below) that does not contain the data, but only a commitment that can be used at a later time to prove that the data was indeed made available.

        Thus, the block data consists of data partitioned into namespaces and executable transactions. Note that only these transactions are executed by the Celestia state machine once the block is committed.

        Lifecycle of a celestia-app Transaction

        ',5),d=e("a",{href:"./data-availability-layer"},`described in the "Celestia's data availability layer" page`,-1),h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},Q=s('',1),p=[Q],m=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),u=e("li",null,"It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},f=s('',1),x=[f],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},y=s('',1),v=[y],L=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),H=e("li",null,"It computes a commitment for every row and column of the extended matrix using the NMTs described above.",-1),V=e("p",null,"Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.",-1),M=e("h2",{id:"checking-data-availability",tabindex:"-1"},[t("Checking data availability "),e("a",{class:"header-anchor",href:"#checking-data-availability","aria-label":'Permalink to "Checking data availability"'},"​")],-1),A=e("p",null,[e("img",{src:l,alt:"DA network"})],-1),C=e("p",null,[t("To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, "),e("em",null,"i.e."),t(", the so-called "),e("em",null,"DA network"),t(", that serves DAS requests.")],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},I=s('',1),P=[I],N=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),j=e("p",null,[t("Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., "),e("code",null,"PayForBlobs"),t(" transactions.")],-1),B=e("p",null,"While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).",-1),Z=e("p",null,"If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.",-1),q=e("p",null,[t("Alternatively, light nodes may accept a block header although the data is not available, i.e., a "),e("em",null,"false positive"),t(". This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(").")],-1),E=e("p",null,"By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.",-1);function z(R,J,F,G,$,U){return a(),o("div",null,[c,e("p",null,[t("Next, the block producer adds to the block header a commitment of the block data. As "),d,t(", the commitment is the Merkle root of the "),e("mjx-container",h,[(a(),o("svg",T,p)),m]),t(" intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:")]),e("ul",null,[u,e("li",null,[t("It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size "),e("mjx-container",_,[(a(),o("svg",g,x)),w]),t(" is referred to as the original data.")]),e("li",null,[t("It extends the original data to a "),e("mjx-container",b,[(a(),o("svg",k,v)),L]),t(" square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.")]),H]),V,M,A,C,e("p",null,[t("Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the "),e("mjx-container",D,[(a(),o("svg",S,P)),N]),t(" intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).")]),j,B,Z,q,E])}const X=n(r,[["render",z]]);export{K as __pageData,X as default}; +import{_ as i}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as n,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/learn/consensus-da.png",K=JSON.parse('{"title":"The lifecycle of a celestia-app transaction","description":"Learn what is the lifecycle of a celestia-app transaction.","frontmatter":{"description":"Learn what is the lifecycle of a celestia-app transaction.","head":[["meta",{"name":"og:title","content":"The lifecycle of a celestia-app transaction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/transaction-lifecycle.md","filePath":"learn/how-celestia-works/transaction-lifecycle.md","lastUpdated":1725992025000}'),r={name:"learn/how-celestia-works/transaction-lifecycle.md"},c=s('

        The lifecycle of a celestia-app transaction

        Users request the celestia-app to make data available by sending PayForBlobs transactions. Every such transaction consists of the identity of the sender, the data to be made available, also referred to as the message, the data size, the namespace, and a signature. Every block producer batches multiple PayForBlobs transactions into a block.

        Before proposing the block though, the producer passes it to the state machine via ABCI++, where each PayForBlobs transaction is split into a namespaced message (denoted by Msg in the figure below), i.e., the data together with the namespace ID, and an executable transaction (denoted by e-Tx in the figure below) that does not contain the data, but only a commitment that can be used at a later time to prove that the data was indeed made available.

        Thus, the block data consists of data partitioned into namespaces and executable transactions. Note that only these transactions are executed by the Celestia state machine once the block is committed.

        Lifecycle of a celestia-app Transaction

        ',5),d=e("a",{href:"./data-availability-layer"},`described in the "Celestia's data availability layer" page`,-1),h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},Q=s('',1),p=[Q],m=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),u=e("li",null,"It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},f=s('',1),x=[f],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},y=s('',1),v=[y],L=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),H=e("li",null,"It computes a commitment for every row and column of the extended matrix using the NMTs described above.",-1),V=e("p",null,"Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.",-1),M=e("h2",{id:"checking-data-availability",tabindex:"-1"},[t("Checking data availability "),e("a",{class:"header-anchor",href:"#checking-data-availability","aria-label":'Permalink to "Checking data availability"'},"​")],-1),A=e("p",null,[e("img",{src:l,alt:"DA network"})],-1),C=e("p",null,[t("To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, "),e("em",null,"i.e."),t(", the so-called "),e("em",null,"DA network"),t(", that serves DAS requests.")],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},I=s('',1),P=[I],N=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),j=e("p",null,[t("Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., "),e("code",null,"PayForBlobs"),t(" transactions.")],-1),B=e("p",null,"While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).",-1),Z=e("p",null,"If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.",-1),q=e("p",null,[t("Alternatively, light nodes may accept a block header although the data is not available, i.e., a "),e("em",null,"false positive"),t(". This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(").")],-1),E=e("p",null,"By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.",-1);function z(R,J,F,G,$,U){return a(),o("div",null,[c,e("p",null,[t("Next, the block producer adds to the block header a commitment of the block data. As "),d,t(", the commitment is the Merkle root of the "),e("mjx-container",h,[(a(),o("svg",T,p)),m]),t(" intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:")]),e("ul",null,[u,e("li",null,[t("It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size "),e("mjx-container",_,[(a(),o("svg",g,x)),w]),t(" is referred to as the original data.")]),e("li",null,[t("It extends the original data to a "),e("mjx-container",b,[(a(),o("svg",k,v)),L]),t(" square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.")]),H]),V,M,A,C,e("p",null,[t("Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the "),e("mjx-container",D,[(a(),o("svg",S,P)),N]),t(" intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).")]),j,B,Z,q,E])}const X=n(r,[["render",z]]);export{K as __pageData,X as default}; diff --git a/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.lean.js b/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.lean.js similarity index 99% rename from pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.lean.js rename to pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.lean.js index fec404fcf6..0a09633b5a 100644 --- a/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.d8853cb7.lean.js +++ b/pr-1699/assets/learn_how-celestia-works_transaction-lifecycle.md.def776d7.lean.js @@ -1 +1 @@ -import{_ as i}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as n,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/learn/consensus-da.png",K=JSON.parse('{"title":"The lifecycle of a celestia-app transaction","description":"Learn what is the lifecycle of a celestia-app transaction.","frontmatter":{"description":"Learn what is the lifecycle of a celestia-app transaction.","head":[["meta",{"name":"og:title","content":"The lifecycle of a celestia-app transaction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/transaction-lifecycle.md","filePath":"learn/how-celestia-works/transaction-lifecycle.md","lastUpdated":1725971357000}'),r={name:"learn/how-celestia-works/transaction-lifecycle.md"},c=s("",5),d=e("a",{href:"./data-availability-layer"},`described in the "Celestia's data availability layer" page`,-1),h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},Q=s("",1),p=[Q],m=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),u=e("li",null,"It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},f=s("",1),x=[f],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},y=s("",1),v=[y],L=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),H=e("li",null,"It computes a commitment for every row and column of the extended matrix using the NMTs described above.",-1),V=e("p",null,"Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.",-1),M=e("h2",{id:"checking-data-availability",tabindex:"-1"},[t("Checking data availability "),e("a",{class:"header-anchor",href:"#checking-data-availability","aria-label":'Permalink to "Checking data availability"'},"​")],-1),A=e("p",null,[e("img",{src:l,alt:"DA network"})],-1),C=e("p",null,[t("To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, "),e("em",null,"i.e."),t(", the so-called "),e("em",null,"DA network"),t(", that serves DAS requests.")],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},I=s("",1),P=[I],N=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),j=e("p",null,[t("Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., "),e("code",null,"PayForBlobs"),t(" transactions.")],-1),B=e("p",null,"While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).",-1),Z=e("p",null,"If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.",-1),q=e("p",null,[t("Alternatively, light nodes may accept a block header although the data is not available, i.e., a "),e("em",null,"false positive"),t(". This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(").")],-1),E=e("p",null,"By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.",-1);function z(R,J,F,G,$,U){return a(),o("div",null,[c,e("p",null,[t("Next, the block producer adds to the block header a commitment of the block data. As "),d,t(", the commitment is the Merkle root of the "),e("mjx-container",h,[(a(),o("svg",T,p)),m]),t(" intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:")]),e("ul",null,[u,e("li",null,[t("It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size "),e("mjx-container",_,[(a(),o("svg",g,x)),w]),t(" is referred to as the original data.")]),e("li",null,[t("It extends the original data to a "),e("mjx-container",b,[(a(),o("svg",k,v)),L]),t(" square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.")]),H]),V,M,A,C,e("p",null,[t("Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the "),e("mjx-container",D,[(a(),o("svg",S,P)),N]),t(" intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).")]),j,B,Z,q,E])}const X=n(r,[["render",z]]);export{K as __pageData,X as default}; +import{_ as i}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as n,o as a,c as o,k as e,a as t,Q as s}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/learn/consensus-da.png",K=JSON.parse('{"title":"The lifecycle of a celestia-app transaction","description":"Learn what is the lifecycle of a celestia-app transaction.","frontmatter":{"description":"Learn what is the lifecycle of a celestia-app transaction.","head":[["meta",{"name":"og:title","content":"The lifecycle of a celestia-app transaction | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-celestia-works/transaction-lifecycle.md","filePath":"learn/how-celestia-works/transaction-lifecycle.md","lastUpdated":1725992025000}'),r={name:"learn/how-celestia-works/transaction-lifecycle.md"},c=s("",5),d=e("a",{href:"./data-availability-layer"},`described in the "Celestia's data availability layer" page`,-1),h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},Q=s("",1),p=[Q],m=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),u=e("li",null,"It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.123ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2264.4 705","aria-hidden":"true"},f=s("",1),x=[f],w=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mi",null,"k"),e("mo",null,"×"),e("mi",null,"k")])],-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.386ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 3264.4 705","aria-hidden":"true"},y=s("",1),v=[y],L=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"2"),e("mi",null,"k"),e("mo",null,"×"),e("mn",null,"2"),e("mi",null,"k")])],-1),H=e("li",null,"It computes a commitment for every row and column of the extended matrix using the NMTs described above.",-1),V=e("p",null,"Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.",-1),M=e("h2",{id:"checking-data-availability",tabindex:"-1"},[t("Checking data availability "),e("a",{class:"header-anchor",href:"#checking-data-availability","aria-label":'Permalink to "Checking data availability"'},"​")],-1),A=e("p",null,[e("img",{src:l,alt:"DA network"})],-1),C=e("p",null,[t("To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, "),e("em",null,"i.e."),t(", the so-called "),e("em",null,"DA network"),t(", that serves DAS requests.")],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.31ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1021 705","aria-hidden":"true"},I=s("",1),P=[I],N=e("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mn",null,"4"),e("mi",null,"k")])],-1),j=e("p",null,[t("Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., "),e("code",null,"PayForBlobs"),t(" transactions.")],-1),B=e("p",null,"While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).",-1),Z=e("p",null,"If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.",-1),q=e("p",null,[t("Alternatively, light nodes may accept a block header although the data is not available, i.e., a "),e("em",null,"false positive"),t(". This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the "),e("a",{href:"https://arxiv.org/abs/1809.09044",target:"_blank",rel:"noreferrer"},"original paper"),t(").")],-1),E=e("p",null,"By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.",-1);function z(R,J,F,G,$,U){return a(),o("div",null,[c,e("p",null,[t("Next, the block producer adds to the block header a commitment of the block data. As "),d,t(", the commitment is the Merkle root of the "),e("mjx-container",h,[(a(),o("svg",T,p)),m]),t(" intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:")]),e("ul",null,[u,e("li",null,[t("It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size "),e("mjx-container",_,[(a(),o("svg",g,x)),w]),t(" is referred to as the original data.")]),e("li",null,[t("It extends the original data to a "),e("mjx-container",b,[(a(),o("svg",k,v)),L]),t(" square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.")]),H]),V,M,A,C,e("p",null,[t("Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the "),e("mjx-container",D,[(a(),o("svg",S,P)),N]),t(" intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).")]),j,B,Z,q,E])}const X=n(r,[["render",z]]);export{K as __pageData,X as default}; diff --git a/pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.js b/pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.js similarity index 99% rename from pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.js rename to pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.js index d437c1fb33..4ac76b6547 100644 --- a/pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.js +++ b/pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/keplr.png",i="/docs-preview/pr-1699/img/leap.png",l="/docs-preview/pr-1699/img/gem.png",s="/docs-preview/pr-1699/img/keplr/keplr1.gif",n="/docs-preview/pr-1699/img/keplr/keplr2.gif",p="/docs-preview/pr-1699/img/keplr/keplr3.gif",c="/docs-preview/pr-1699/img/keplr/keplr4.gif",d="/docs-preview/pr-1699/img/leap/leap1.gif",h="/docs-preview/pr-1699/img/leap/leap2.gif",m="/docs-preview/pr-1699/img/leap/leap3.gif",w="/docs-preview/pr-1699/img/gem/gem1.gif",k="/docs-preview/pr-1699/img/gem/gem2.gif",u="/docs-preview/pr-1699/img/gem/gem3.gif",f="/docs-preview/pr-1699/img/gem/gem4.gif",C=JSON.parse('{"title":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","frontmatter":{"sidebar_label":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","head":[["meta",{"name":"og:title","content":"How to stake TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-to-stake-tia.md","filePath":"learn/how-to-stake-tia.md","lastUpdated":1725971357000}'),g={name:"learn/how-to-stake-tia.md"},_=o('

        How to stake TIA

        Celestia is a proof-of-stake blockchain based on the Cosmos SDK.

        Staking TIA as a delegator allows you to secure the Celestia network. This means that you can stake the native token TIA and vote on governance proposals.

        In this tutorial, you will learn how to stake TIA tokens via Keplr, Leap, and Gem wallets.

        Select your preferred wallet

        Keplr
        Leap
        Gem Wallet

        Stake TIA with Keplr wallet

        1️⃣ Open your Keplr browser extension

        Navigate to Staked and select Stake with Keplr Dashboard.

        This will open the Keplr dashboard in a new browser page.

        Keplr1

        2️⃣ Select Celestia network and search for a validator

        In the Keplr dashboard, select the Celestia network and pick a validator of your choice.

        Keplr1

        3️⃣ Stake your TIA tokens

        On the following screen enter amount of TIA tokens and select Stake.

        A Keplr popup will appear, requesting your approval for the transaction. Select Approve.

        Keplr1

        4️⃣ Confirm and manage your TIA

        After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Keplr1

        Stake TIA with Leap wallet

        1️⃣ Open your Leap browser extension

        In top right select Celestia network and navigate to Stake.

        Similarly to previous step, select the +Stake button.

        Keplr1

        2️⃣ Select a validator and stake TIA

        On the following screen choose a validator of your choice, enter the desired amount, and click Review.

        Following that, review the transaction details and select Stake, then wait for the transaction to finalize.

        Keplr1

        3️⃣ Confirm and manage your TIA

        After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Keplr1

        Stake TIA with Gem wallet

        1️⃣ Open your Gem Wallet app

        Navigate to Celestia and select Stake.

        Gem1

        2️⃣ Choose the amount of Celestia and search for a validator.

        Select the amount of Celestia tokens and choose a validator from the list.

        Gem2

        3️⃣ Stake your TIA tokens

        Review the network terms and commission, then press Confirm to proceed.

        Gem3

        4️⃣ Manage your TIA

        After your transaction is confirmed, you will have access to a control panel where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Gem4

        ',48),b=[_];function v(y,T,A,I,S,q){return a(),t("div",null,b)}const K=e(g,[["render",v]]);export{C as __pageData,K as default}; +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/keplr.png",i="/docs-preview/pr-1699/img/leap.png",l="/docs-preview/pr-1699/img/gem.png",s="/docs-preview/pr-1699/img/keplr/keplr1.gif",n="/docs-preview/pr-1699/img/keplr/keplr2.gif",p="/docs-preview/pr-1699/img/keplr/keplr3.gif",c="/docs-preview/pr-1699/img/keplr/keplr4.gif",d="/docs-preview/pr-1699/img/leap/leap1.gif",h="/docs-preview/pr-1699/img/leap/leap2.gif",m="/docs-preview/pr-1699/img/leap/leap3.gif",w="/docs-preview/pr-1699/img/gem/gem1.gif",k="/docs-preview/pr-1699/img/gem/gem2.gif",u="/docs-preview/pr-1699/img/gem/gem3.gif",f="/docs-preview/pr-1699/img/gem/gem4.gif",C=JSON.parse('{"title":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","frontmatter":{"sidebar_label":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","head":[["meta",{"name":"og:title","content":"How to stake TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-to-stake-tia.md","filePath":"learn/how-to-stake-tia.md","lastUpdated":1725992025000}'),g={name:"learn/how-to-stake-tia.md"},_=o('

        How to stake TIA

        Celestia is a proof-of-stake blockchain based on the Cosmos SDK.

        Staking TIA as a delegator allows you to secure the Celestia network. This means that you can stake the native token TIA and vote on governance proposals.

        In this tutorial, you will learn how to stake TIA tokens via Keplr, Leap, and Gem wallets.

        Select your preferred wallet

        Keplr
        Leap
        Gem Wallet

        Stake TIA with Keplr wallet

        1️⃣ Open your Keplr browser extension

        Navigate to Staked and select Stake with Keplr Dashboard.

        This will open the Keplr dashboard in a new browser page.

        Keplr1

        2️⃣ Select Celestia network and search for a validator

        In the Keplr dashboard, select the Celestia network and pick a validator of your choice.

        Keplr1

        3️⃣ Stake your TIA tokens

        On the following screen enter amount of TIA tokens and select Stake.

        A Keplr popup will appear, requesting your approval for the transaction. Select Approve.

        Keplr1

        4️⃣ Confirm and manage your TIA

        After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Keplr1

        Stake TIA with Leap wallet

        1️⃣ Open your Leap browser extension

        In top right select Celestia network and navigate to Stake.

        Similarly to previous step, select the +Stake button.

        Keplr1

        2️⃣ Select a validator and stake TIA

        On the following screen choose a validator of your choice, enter the desired amount, and click Review.

        Following that, review the transaction details and select Stake, then wait for the transaction to finalize.

        Keplr1

        3️⃣ Confirm and manage your TIA

        After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Keplr1

        Stake TIA with Gem wallet

        1️⃣ Open your Gem Wallet app

        Navigate to Celestia and select Stake.

        Gem1

        2️⃣ Choose the amount of Celestia and search for a validator.

        Select the amount of Celestia tokens and choose a validator from the list.

        Gem2

        3️⃣ Stake your TIA tokens

        Review the network terms and commission, then press Confirm to proceed.

        Gem3

        4️⃣ Manage your TIA

        After your transaction is confirmed, you will have access to a control panel where you can claim rewards, unstake, redelegate, or stake additional tokens.

        Gem4

        ',48),b=[_];function v(y,T,A,I,S,q){return a(),t("div",null,b)}const K=e(g,[["render",v]]);export{C as __pageData,K as default}; diff --git a/pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.lean.js b/pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.lean.js similarity index 95% rename from pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.lean.js rename to pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.lean.js index 9cc6fec2c0..2651b30731 100644 --- a/pr-1699/assets/learn_how-to-stake-tia.md.f5076e81.lean.js +++ b/pr-1699/assets/learn_how-to-stake-tia.md.68dbd46b.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/keplr.png",i="/docs-preview/pr-1699/img/leap.png",l="/docs-preview/pr-1699/img/gem.png",s="/docs-preview/pr-1699/img/keplr/keplr1.gif",n="/docs-preview/pr-1699/img/keplr/keplr2.gif",p="/docs-preview/pr-1699/img/keplr/keplr3.gif",c="/docs-preview/pr-1699/img/keplr/keplr4.gif",d="/docs-preview/pr-1699/img/leap/leap1.gif",h="/docs-preview/pr-1699/img/leap/leap2.gif",m="/docs-preview/pr-1699/img/leap/leap3.gif",w="/docs-preview/pr-1699/img/gem/gem1.gif",k="/docs-preview/pr-1699/img/gem/gem2.gif",u="/docs-preview/pr-1699/img/gem/gem3.gif",f="/docs-preview/pr-1699/img/gem/gem4.gif",C=JSON.parse('{"title":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","frontmatter":{"sidebar_label":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","head":[["meta",{"name":"og:title","content":"How to stake TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-to-stake-tia.md","filePath":"learn/how-to-stake-tia.md","lastUpdated":1725971357000}'),g={name:"learn/how-to-stake-tia.md"},_=o("",48),b=[_];function v(y,T,A,I,S,q){return a(),t("div",null,b)}const K=e(g,[["render",v]]);export{C as __pageData,K as default}; +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/keplr.png",i="/docs-preview/pr-1699/img/leap.png",l="/docs-preview/pr-1699/img/gem.png",s="/docs-preview/pr-1699/img/keplr/keplr1.gif",n="/docs-preview/pr-1699/img/keplr/keplr2.gif",p="/docs-preview/pr-1699/img/keplr/keplr3.gif",c="/docs-preview/pr-1699/img/keplr/keplr4.gif",d="/docs-preview/pr-1699/img/leap/leap1.gif",h="/docs-preview/pr-1699/img/leap/leap2.gif",m="/docs-preview/pr-1699/img/leap/leap3.gif",w="/docs-preview/pr-1699/img/gem/gem1.gif",k="/docs-preview/pr-1699/img/gem/gem2.gif",u="/docs-preview/pr-1699/img/gem/gem3.gif",f="/docs-preview/pr-1699/img/gem/gem4.gif",C=JSON.parse('{"title":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","frontmatter":{"sidebar_label":"How to stake TIA","description":"This tutorial covers how to stake TIA with Keplr, Leap, or Gem wallet","head":[["meta",{"name":"og:title","content":"How to stake TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/how-to-stake-tia.md","filePath":"learn/how-to-stake-tia.md","lastUpdated":1725992025000}'),g={name:"learn/how-to-stake-tia.md"},_=o("",48),b=[_];function v(y,T,A,I,S,q){return a(),t("div",null,b)}const K=e(g,[["render",v]]);export{C as __pageData,K as default}; diff --git a/pr-1699/assets/learn_paying-for-blobspace.md.61719f03.js b/pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.js similarity index 97% rename from pr-1699/assets/learn_paying-for-blobspace.md.61719f03.js rename to pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.js index 9fff30330a..f15baccd53 100644 --- a/pr-1699/assets/learn_paying-for-blobspace.md.61719f03.js +++ b/pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.js @@ -1 +1 @@ -import{_ as e}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as a,o as t,c as o,Q as i}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Paying for blobspace","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Paying for blobspace | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/paying-for-blobspace.md","filePath":"learn/paying-for-blobspace.md","lastUpdated":1725971357000}'),s={name:"learn/paying-for-blobspace.md"},n=i('

        Paying for blobspace

        PayForBlobs transactions

        To publish data on Celestia, developers can submit PayForBlobs transactions. A PayForBlobs transaction consists of the identity of the sender, the data to be made available, the data size, the namespace, and a signature.

        Each PayForBlobs transaction is split into two parts: the blob or blobs which include the data to be made available along with the namespace, and the executable payment transaction which includes a commitment to the data.

        Both the blobs and executable payment transactions are put into the block within the appropriate namespace. The block data is extended using erasure coding and then Merkelized into a data root commitment included in the block header.

        Lifecycle of a celestia-app Transaction

        See the detailed life cycle of a Celestia transaction.

        Learn how to submit data to Celestia’s data availability layer.

        Fee market overview

        Celestia uses a standard gas-price prioritised mempool. This means that transactions with higher fees will be prioritised by validators. Fees are comprised of a flat fee per transaction and then a variable fee based on the size of each blob in the transaction.

        Understand how fees are calculated on Celestia in the overview on submitting PFB transactions.

        ',11),r=[n];function c(l,d,p,h,b,m){return t(),o("div",null,r)}const y=a(s,[["render",c]]);export{u as __pageData,y as default}; +import{_ as e}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as a,o as t,c as o,Q as i}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Paying for blobspace","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Paying for blobspace | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/paying-for-blobspace.md","filePath":"learn/paying-for-blobspace.md","lastUpdated":1725992025000}'),s={name:"learn/paying-for-blobspace.md"},n=i('

        Paying for blobspace

        PayForBlobs transactions

        To publish data on Celestia, developers can submit PayForBlobs transactions. A PayForBlobs transaction consists of the identity of the sender, the data to be made available, the data size, the namespace, and a signature.

        Each PayForBlobs transaction is split into two parts: the blob or blobs which include the data to be made available along with the namespace, and the executable payment transaction which includes a commitment to the data.

        Both the blobs and executable payment transactions are put into the block within the appropriate namespace. The block data is extended using erasure coding and then Merkelized into a data root commitment included in the block header.

        Lifecycle of a celestia-app Transaction

        See the detailed life cycle of a Celestia transaction.

        Learn how to submit data to Celestia’s data availability layer.

        Fee market overview

        Celestia uses a standard gas-price prioritised mempool. This means that transactions with higher fees will be prioritised by validators. Fees are comprised of a flat fee per transaction and then a variable fee based on the size of each blob in the transaction.

        Understand how fees are calculated on Celestia in the overview on submitting PFB transactions.

        ',11),r=[n];function c(l,d,p,h,b,m){return t(),o("div",null,r)}const y=a(s,[["render",c]]);export{u as __pageData,y as default}; diff --git a/pr-1699/assets/learn_paying-for-blobspace.md.61719f03.lean.js b/pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.lean.js similarity index 90% rename from pr-1699/assets/learn_paying-for-blobspace.md.61719f03.lean.js rename to pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.lean.js index c96cf137fa..616e1211a6 100644 --- a/pr-1699/assets/learn_paying-for-blobspace.md.61719f03.lean.js +++ b/pr-1699/assets/learn_paying-for-blobspace.md.06ae9c17.lean.js @@ -1 +1 @@ -import{_ as e}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as a,o as t,c as o,Q as i}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Paying for blobspace","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Paying for blobspace | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/paying-for-blobspace.md","filePath":"learn/paying-for-blobspace.md","lastUpdated":1725971357000}'),s={name:"learn/paying-for-blobspace.md"},n=i("",11),r=[n];function c(l,d,p,h,b,m){return t(),o("div",null,r)}const y=a(s,[["render",c]]);export{u as __pageData,y as default}; +import{_ as e}from"./chunks/tx-lifecycle.e01c569f.js";import{_ as a,o as t,c as o,Q as i}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Paying for blobspace","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Paying for blobspace | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/paying-for-blobspace.md","filePath":"learn/paying-for-blobspace.md","lastUpdated":1725992025000}'),s={name:"learn/paying-for-blobspace.md"},n=i("",11),r=[n];function c(l,d,p,h,b,m){return t(),o("div",null,r)}const y=a(s,[["render",c]]);export{u as __pageData,y as default}; diff --git a/pr-1699/assets/learn_retrievability.md.8931b632.js b/pr-1699/assets/learn_retrievability.md.d1e1d36b.js similarity index 98% rename from pr-1699/assets/learn_retrievability.md.8931b632.js rename to pr-1699/assets/learn_retrievability.md.d1e1d36b.js index 05816a49cd..729a16c8ec 100644 --- a/pr-1699/assets/learn_retrievability.md.8931b632.js +++ b/pr-1699/assets/learn_retrievability.md.d1e1d36b.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","frontmatter":{"sidebar_label":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","head":[["meta",{"name":"og:title","content":"Data retrievability and pruning | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/retrievability.md","filePath":"learn/retrievability.md","lastUpdated":1725971357000}'),o={name:"learn/retrievability.md"},r=i('

        Data retrievability and pruning

        The purpose of data availability layers such as Celestia is to ensure that block data is provably published, so that applications and rollups can know what the state of their chain is, and store that data. Once the data is published, data availability layers do not inherently guarantee that historical data will be permanently stored and remain retrievable.

        In this document, we discuss the state of data retrievability and pruning in Celestia, as well as some tips for rollup developers in order to ensure that syncing new rollup nodes is possible.

        Data retrievability and pruning in celestia-node

        As of version v0.13.0, celestia-node has implemented a light node sampling window of 30 days, as specified in CIP-4. This means that once pruning is implemented, light nodes will now only sample blocks within a 30-day window instead of sampling all blocks from genesis. This change introduces the concept of pruning to celestia-node, where data outside of the 30-day window may not be stored by light nodes, marking a significant update in how data retrievability and storage are managed within the network (v0.13.0 release notes).

        Data blobs older than the recency window will be pruned by default on light nodes, after pruning is fully implemented, but will continue to be stored by archival nodes that do not prune data. Light nodes will be able to query historic blob data in namespaces from archival nodes, as long as archival nodes exist on the public network.

        Once pruning is fully implemented, light nodes will only perform data availability sampling for blocks within the data recency window of 30 days.

        Suggested practices for rollups

        Rollups may need to access historic data in order to allow new rollup nodes to reconstruct the latest state by replaying historic blocks. Once data has been published on Celestia and guaranteed to have been made available, rollups and applications are responsible for storing their historical data.

        While it is possible to continue to do this by using the GetAll API method in celestia-node on historic blocks as long as archival nodes exist on the public Celestia network, rollup developers should not rely on this as the only method to access historical data, as archival nodes serving requests for historical data for free is not guaranteed. Below are some other suggested methods to access historical data.

        • Use professional archival node or data providers. It is expected that professional infrastructure providers will provide paid access to archival nodes, where historical data can be retrieved, for example using the GetAll API method. This provides better guarantees than solely relying on free archival nodes on the public Celestia network.
        • Share snapshots of rollup nodes. Rollups could share snapshots of their data directories which can be downloaded manually by users bootstrapping new nodes. These snapshots could contain the latest state of the rollup, and/or all the historical blocks.
        • Add peer-to-peer support for historical block sync. A less manual version of sharing snapshots, where rollup nodes could implement built-in support for block sync, where rollup nodes download historical block data from each other over a peer-to-peer network.
          • Namespace pinning. In the future, celestia-node is expected to allow nodes to choose to "pin" data from selected namespaces that they wish to store and make available for other nodes. This will allow rollup nodes to be responsible for storing their data, without needing to implement their own peer-to-peer historical block sync mechanism.
        ',11),s=[r];function n(l,d,c,h,p,u){return a(),t("div",null,s)}const f=e(o,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","frontmatter":{"sidebar_label":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","head":[["meta",{"name":"og:title","content":"Data retrievability and pruning | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/retrievability.md","filePath":"learn/retrievability.md","lastUpdated":1725992025000}'),o={name:"learn/retrievability.md"},r=i('

        Data retrievability and pruning

        The purpose of data availability layers such as Celestia is to ensure that block data is provably published, so that applications and rollups can know what the state of their chain is, and store that data. Once the data is published, data availability layers do not inherently guarantee that historical data will be permanently stored and remain retrievable.

        In this document, we discuss the state of data retrievability and pruning in Celestia, as well as some tips for rollup developers in order to ensure that syncing new rollup nodes is possible.

        Data retrievability and pruning in celestia-node

        As of version v0.13.0, celestia-node has implemented a light node sampling window of 30 days, as specified in CIP-4. This means that once pruning is implemented, light nodes will now only sample blocks within a 30-day window instead of sampling all blocks from genesis. This change introduces the concept of pruning to celestia-node, where data outside of the 30-day window may not be stored by light nodes, marking a significant update in how data retrievability and storage are managed within the network (v0.13.0 release notes).

        Data blobs older than the recency window will be pruned by default on light nodes, after pruning is fully implemented, but will continue to be stored by archival nodes that do not prune data. Light nodes will be able to query historic blob data in namespaces from archival nodes, as long as archival nodes exist on the public network.

        Once pruning is fully implemented, light nodes will only perform data availability sampling for blocks within the data recency window of 30 days.

        Suggested practices for rollups

        Rollups may need to access historic data in order to allow new rollup nodes to reconstruct the latest state by replaying historic blocks. Once data has been published on Celestia and guaranteed to have been made available, rollups and applications are responsible for storing their historical data.

        While it is possible to continue to do this by using the GetAll API method in celestia-node on historic blocks as long as archival nodes exist on the public Celestia network, rollup developers should not rely on this as the only method to access historical data, as archival nodes serving requests for historical data for free is not guaranteed. Below are some other suggested methods to access historical data.

        • Use professional archival node or data providers. It is expected that professional infrastructure providers will provide paid access to archival nodes, where historical data can be retrieved, for example using the GetAll API method. This provides better guarantees than solely relying on free archival nodes on the public Celestia network.
        • Share snapshots of rollup nodes. Rollups could share snapshots of their data directories which can be downloaded manually by users bootstrapping new nodes. These snapshots could contain the latest state of the rollup, and/or all the historical blocks.
        • Add peer-to-peer support for historical block sync. A less manual version of sharing snapshots, where rollup nodes could implement built-in support for block sync, where rollup nodes download historical block data from each other over a peer-to-peer network.
          • Namespace pinning. In the future, celestia-node is expected to allow nodes to choose to "pin" data from selected namespaces that they wish to store and make available for other nodes. This will allow rollup nodes to be responsible for storing their data, without needing to implement their own peer-to-peer historical block sync mechanism.
        ',11),s=[r];function n(l,d,c,h,p,u){return a(),t("div",null,s)}const f=e(o,[["render",n]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/learn_retrievability.md.8931b632.lean.js b/pr-1699/assets/learn_retrievability.md.d1e1d36b.lean.js similarity index 92% rename from pr-1699/assets/learn_retrievability.md.8931b632.lean.js rename to pr-1699/assets/learn_retrievability.md.d1e1d36b.lean.js index 4d6a1adf86..cd749ff6b7 100644 --- a/pr-1699/assets/learn_retrievability.md.8931b632.lean.js +++ b/pr-1699/assets/learn_retrievability.md.d1e1d36b.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","frontmatter":{"sidebar_label":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","head":[["meta",{"name":"og:title","content":"Data retrievability and pruning | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/retrievability.md","filePath":"learn/retrievability.md","lastUpdated":1725971357000}'),o={name:"learn/retrievability.md"},r=i("",11),s=[r];function n(l,d,c,h,p,u){return a(),t("div",null,s)}const f=e(o,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","frontmatter":{"sidebar_label":"Data retrievability and pruning","description":"Practices and expectations for data retrievability and pruning on Celestia.","head":[["meta",{"name":"og:title","content":"Data retrievability and pruning | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/retrievability.md","filePath":"learn/retrievability.md","lastUpdated":1725992025000}'),o={name:"learn/retrievability.md"},r=i("",11),s=[r];function n(l,d,c,h,p,u){return a(),t("div",null,s)}const f=e(o,[["render",n]]);export{g as __pageData,f as default}; diff --git a/pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.js b/pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.js similarity index 99% rename from pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.js rename to pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.js index 5e1384ec73..0a43afde4e 100644 --- a/pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.js +++ b/pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/learn/Celestia_TIA_Inflation.png",n="/docs-preview/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png",s="/docs-preview/pr-1699/img/learn/Celestia_TIA_Available_Supply.png",k=JSON.parse('{"title":"Staking, governance, & supply","description":"Learn about proof-of-stake on Celestia","frontmatter":{"description":"Learn about proof-of-stake on Celestia","head":[["meta",{"name":"og:title","content":"Staking, governance, & supply | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking-governance-supply.md","filePath":"learn/staking-governance-supply.md","lastUpdated":1725971357000}'),i={name:"learn/staking-governance-supply.md"},l=o('

        Staking, governance, & supply

        Proof-of-stake on Celestia

        Celestia is a proof-of-stake blockchain based on CometBFT and the Cosmos SDK. Celestia supports in-protocol delegation and will start with an initial validator set of 100.

        Staking TIA as a validator or delegator enables you to earn staking rewards from the network. Validators charge a fee to delegators which gives them a percentage of staking rewards.

        Learn how proof of stake works on Cosmos SDK chains like Celestia.

        Consensus mechanismProof-of-stake
        Blockchain frameworkCosmos SDK
        Validator set size100
        Delegation supportYes

        Learn how to stake on your own at the community dashboards.

        Inflation

        TIA inflation starts at 8% annually and decreases by 10% every year until it reaches the long term issuance rate of 1.5%. Exact annual inflation rates can be found in the diagram below.

        inflation diagram

        The annual provisions for inflation are calculated based on the total supply of TIA at the beginning of each year. To calculate how many TIA to issue per block, Celestia uses the block timestamp rather than the block height since the time between blocks can vary and cause actual issuance to be higher than the target.

        For an in-depth understanding, refer to ADR019.

        Decentralised governance

        Network parameters

        TIA holders (not just stakers) can propose and vote on governance proposals to change a subset of network parameters. To learn more, see a complete list of both the changeable and non-changeable parameters and their values. Additionally, learn how to submit and vote on governance proposals.

        Community pool

        Starting at genesis, Celestia’s community pool receives 2% of all Celestia block rewards. TIA stakers may vote to fund ecosystem initiatives as in many other Cosmos SDK chains.

        Learn how to submit a governance proposal to spend community pool funds.

        TIA allocation at genesis

        Celestia will have a total supply of 1,000,000,000 TIA at genesis, split across five categories described in the chart and table below.

        allocation diagram

        CategoryDescription%
        Public AllocationGenesis Drop and Incentivized Testnet: 7.41%
        Future initiatives: 12.59%
        20.00%
        R&D & EcosystemTokens allocated to the Celestia Foundation and core devs for research, development, and ecosystem initiatives including:
        - Protocol maintenance and development
        - Programs for rollup developers, infrastructure, and node operators
        26.79%
        Early Backers: Series A&BEarly supporters of Celestia19.67%
        Early Backers: SeedEarly supporters of Celestia15.90%
        Initial Core ContributorsMembers of Celestia Labs, the first core contributor to Celestia17.64%

        Unlocks

        Celestia’s 1 billion TIA supply at genesis will be subject to several different unlock schedules. All tokens, locked or unlocked, may be staked, but staking rewards are unlocked upon receipt and will add to the circulating supply.

        Circulating supply is defined as the amount of TIA tokens in general circulation without onchain transfer restrictions.

        Available supply is defined as the amount of TIA tokens that are either part of the circulating supply or are unlocked but subject to some form of governance to determine when the tokens are allocated. This includes the unlocked portion of the R&D & Ecosystem tokens and the tokens set aside for future initiatives.

        The definitions for circulating and available supply were adapted from Optimism’s definitions.

        supply diagram

        Unlock schedule by category is described in the table below.

        CategoryUnlock Schedule
        Public AllocationFully unlocked at launch.
        R&D & Ecosystem25.00% unlocked at launch.
        Remaining 75.00% unlocks continuously from year 1 to year 4.
        Initial Core Contributors33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 3.
        Early Backers: Seed33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 2.
        Early Backers: Series A&B33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 2.
        ',30),d=[l];function c(p,h,u,m,f,g){return t(),a("div",null,d)}const y=e(i,[["render",c]]);export{k as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/learn/Celestia_TIA_Inflation.png",n="/docs-preview/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png",s="/docs-preview/pr-1699/img/learn/Celestia_TIA_Available_Supply.png",k=JSON.parse('{"title":"Staking, governance, & supply","description":"Learn about proof-of-stake on Celestia","frontmatter":{"description":"Learn about proof-of-stake on Celestia","head":[["meta",{"name":"og:title","content":"Staking, governance, & supply | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking-governance-supply.md","filePath":"learn/staking-governance-supply.md","lastUpdated":1725992025000}'),i={name:"learn/staking-governance-supply.md"},l=o('

        Staking, governance, & supply

        Proof-of-stake on Celestia

        Celestia is a proof-of-stake blockchain based on CometBFT and the Cosmos SDK. Celestia supports in-protocol delegation and will start with an initial validator set of 100.

        Staking TIA as a validator or delegator enables you to earn staking rewards from the network. Validators charge a fee to delegators which gives them a percentage of staking rewards.

        Learn how proof of stake works on Cosmos SDK chains like Celestia.

        Consensus mechanismProof-of-stake
        Blockchain frameworkCosmos SDK
        Validator set size100
        Delegation supportYes

        Learn how to stake on your own at the community dashboards.

        Inflation

        TIA inflation starts at 8% annually and decreases by 10% every year until it reaches the long term issuance rate of 1.5%. Exact annual inflation rates can be found in the diagram below.

        inflation diagram

        The annual provisions for inflation are calculated based on the total supply of TIA at the beginning of each year. To calculate how many TIA to issue per block, Celestia uses the block timestamp rather than the block height since the time between blocks can vary and cause actual issuance to be higher than the target.

        For an in-depth understanding, refer to ADR019.

        Decentralised governance

        Network parameters

        TIA holders (not just stakers) can propose and vote on governance proposals to change a subset of network parameters. To learn more, see a complete list of both the changeable and non-changeable parameters and their values. Additionally, learn how to submit and vote on governance proposals.

        Community pool

        Starting at genesis, Celestia’s community pool receives 2% of all Celestia block rewards. TIA stakers may vote to fund ecosystem initiatives as in many other Cosmos SDK chains.

        Learn how to submit a governance proposal to spend community pool funds.

        TIA allocation at genesis

        Celestia will have a total supply of 1,000,000,000 TIA at genesis, split across five categories described in the chart and table below.

        allocation diagram

        CategoryDescription%
        Public AllocationGenesis Drop and Incentivized Testnet: 7.41%
        Future initiatives: 12.59%
        20.00%
        R&D & EcosystemTokens allocated to the Celestia Foundation and core devs for research, development, and ecosystem initiatives including:
        - Protocol maintenance and development
        - Programs for rollup developers, infrastructure, and node operators
        26.79%
        Early Backers: Series A&BEarly supporters of Celestia19.67%
        Early Backers: SeedEarly supporters of Celestia15.90%
        Initial Core ContributorsMembers of Celestia Labs, the first core contributor to Celestia17.64%

        Unlocks

        Celestia’s 1 billion TIA supply at genesis will be subject to several different unlock schedules. All tokens, locked or unlocked, may be staked, but staking rewards are unlocked upon receipt and will add to the circulating supply.

        Circulating supply is defined as the amount of TIA tokens in general circulation without onchain transfer restrictions.

        Available supply is defined as the amount of TIA tokens that are either part of the circulating supply or are unlocked but subject to some form of governance to determine when the tokens are allocated. This includes the unlocked portion of the R&D & Ecosystem tokens and the tokens set aside for future initiatives.

        The definitions for circulating and available supply were adapted from Optimism’s definitions.

        supply diagram

        Unlock schedule by category is described in the table below.

        CategoryUnlock Schedule
        Public AllocationFully unlocked at launch.
        R&D & Ecosystem25.00% unlocked at launch.
        Remaining 75.00% unlocks continuously from year 1 to year 4.
        Initial Core Contributors33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 3.
        Early Backers: Seed33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 2.
        Early Backers: Series A&B33.33% unlocked at year 1.
        Remaining 66.67% unlocks continuously from year 1 to year 2.
        ',30),d=[l];function c(p,h,u,m,f,g){return t(),a("div",null,d)}const y=e(i,[["render",c]]);export{k as __pageData,y as default}; diff --git a/pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.lean.js b/pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.lean.js similarity index 93% rename from pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.lean.js rename to pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.lean.js index 7e70192061..bdf9b287bf 100644 --- a/pr-1699/assets/learn_staking-governance-supply.md.2093ea4e.lean.js +++ b/pr-1699/assets/learn_staking-governance-supply.md.0d21fda6.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/learn/Celestia_TIA_Inflation.png",n="/docs-preview/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png",s="/docs-preview/pr-1699/img/learn/Celestia_TIA_Available_Supply.png",k=JSON.parse('{"title":"Staking, governance, & supply","description":"Learn about proof-of-stake on Celestia","frontmatter":{"description":"Learn about proof-of-stake on Celestia","head":[["meta",{"name":"og:title","content":"Staking, governance, & supply | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking-governance-supply.md","filePath":"learn/staking-governance-supply.md","lastUpdated":1725971357000}'),i={name:"learn/staking-governance-supply.md"},l=o("",30),d=[l];function c(p,h,u,m,f,g){return t(),a("div",null,d)}const y=e(i,[["render",c]]);export{k as __pageData,y as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const r="/docs-preview/pr-1699/img/learn/Celestia_TIA_Inflation.png",n="/docs-preview/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png",s="/docs-preview/pr-1699/img/learn/Celestia_TIA_Available_Supply.png",k=JSON.parse('{"title":"Staking, governance, & supply","description":"Learn about proof-of-stake on Celestia","frontmatter":{"description":"Learn about proof-of-stake on Celestia","head":[["meta",{"name":"og:title","content":"Staking, governance, & supply | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking-governance-supply.md","filePath":"learn/staking-governance-supply.md","lastUpdated":1725992025000}'),i={name:"learn/staking-governance-supply.md"},l=o("",30),d=[l];function c(p,h,u,m,f,g){return t(),a("div",null,d)}const y=e(i,[["render",c]]);export{k as __pageData,y as default}; diff --git a/pr-1699/assets/learn_staking.md.9713419c.js b/pr-1699/assets/learn_staking.md.f13c2e81.js similarity index 97% rename from pr-1699/assets/learn_staking.md.9713419c.js rename to pr-1699/assets/learn_staking.md.f13c2e81.js index f60bcae4c2..6007896eb2 100644 --- a/pr-1699/assets/learn_staking.md.9713419c.js +++ b/pr-1699/assets/learn_staking.md.f13c2e81.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Staking on Celestia","description":"Learn how to stake your tokens on the Celestia network.","frontmatter":{"description":"Learn how to stake your tokens on the Celestia network.","head":[["meta",{"name":"og:title","content":"Staking on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking.md","filePath":"learn/staking.md","lastUpdated":1725971357000}'),s={name:"learn/staking.md"},r=n('

        Staking on Celestia

        Engage with the Celestia network at a deeper level through staking. An essential mechanism to a proof-of-stake network, users can secure the network by delegating to a validator and receive a share of its staking rewards.

        Mainnet Beta

        Currently, the following staking interfaces exist for the Mainnet Beta.

        Just connect your wallet to get started!

        Mocha testnet

        Currently, the following staking interfaces exist for the Mocha testnet.

        Just connect your wallet to get started!

        ',10),l=[r];function i(o,h,c,p,k,d){return t(),a("div",null,l)}const m=e(s,[["render",i]]);export{g as __pageData,m as default}; +import{_ as e,o as t,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Staking on Celestia","description":"Learn how to stake your tokens on the Celestia network.","frontmatter":{"description":"Learn how to stake your tokens on the Celestia network.","head":[["meta",{"name":"og:title","content":"Staking on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking.md","filePath":"learn/staking.md","lastUpdated":1725992025000}'),s={name:"learn/staking.md"},r=n('

        Staking on Celestia

        Engage with the Celestia network at a deeper level through staking. An essential mechanism to a proof-of-stake network, users can secure the network by delegating to a validator and receive a share of its staking rewards.

        Mainnet Beta

        Currently, the following staking interfaces exist for the Mainnet Beta.

        Just connect your wallet to get started!

        Mocha testnet

        Currently, the following staking interfaces exist for the Mocha testnet.

        Just connect your wallet to get started!

        ',10),l=[r];function i(o,h,c,p,k,d){return t(),a("div",null,l)}const m=e(s,[["render",i]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/learn_staking.md.9713419c.lean.js b/pr-1699/assets/learn_staking.md.f13c2e81.lean.js similarity index 90% rename from pr-1699/assets/learn_staking.md.9713419c.lean.js rename to pr-1699/assets/learn_staking.md.f13c2e81.lean.js index b2934f94af..6758ac48f8 100644 --- a/pr-1699/assets/learn_staking.md.9713419c.lean.js +++ b/pr-1699/assets/learn_staking.md.f13c2e81.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Staking on Celestia","description":"Learn how to stake your tokens on the Celestia network.","frontmatter":{"description":"Learn how to stake your tokens on the Celestia network.","head":[["meta",{"name":"og:title","content":"Staking on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking.md","filePath":"learn/staking.md","lastUpdated":1725971357000}'),s={name:"learn/staking.md"},r=n("",10),l=[r];function i(o,h,c,p,k,d){return t(),a("div",null,l)}const m=e(s,[["render",i]]);export{g as __pageData,m as default}; +import{_ as e,o as t,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Staking on Celestia","description":"Learn how to stake your tokens on the Celestia network.","frontmatter":{"description":"Learn how to stake your tokens on the Celestia network.","head":[["meta",{"name":"og:title","content":"Staking on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/staking.md","filePath":"learn/staking.md","lastUpdated":1725992025000}'),s={name:"learn/staking.md"},r=n("",10),l=[r];function i(o,h,c,p,k,d){return t(),a("div",null,l)}const m=e(s,[["render",i]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/learn_tia.md.6fd97b1e.js b/pr-1699/assets/learn_tia.md.9065ce93.js similarity index 99% rename from pr-1699/assets/learn_tia.md.6fd97b1e.js rename to pr-1699/assets/learn_tia.md.9065ce93.js index ea03972e16..f07bc31e11 100644 --- a/pr-1699/assets/learn_tia.md.6fd97b1e.js +++ b/pr-1699/assets/learn_tia.md.9065ce93.js @@ -1 +1 @@ -import{_ as s,o as t,c as e,k as a,a as o,Q as n}from"./chunks/framework.b47e54aa.js";const A=JSON.parse('{"title":"Overview of TIA","description":"","frontmatter":{"prev":{"text":"Data availability FAQ","link":"/learn/how-celestia-works/data-availability-faq"},"head":[["meta",{"name":"og:title","content":"Overview of TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/tia.md","filePath":"learn/tia.md","lastUpdated":1725971357000}'),i={name:"learn/tia.md"},r=a("h1",{id:"overview-of-tia",tabindex:"-1"},[o("Overview of TIA "),a("a",{class:"header-anchor",href:"#overview-of-tia","aria-label":'Permalink to "Overview of TIA"'},"​")],-1),l=a("h2",{id:"tia-at-a-glance",tabindex:"-1"},[o("TIA at a glance "),a("a",{class:"header-anchor",href:"#tia-at-a-glance","aria-label":'Permalink to "TIA at a glance"'},"​")],-1),d=a("thead",null,[a("tr",null,[a("th",null,"Property"),a("th",null,"Details")])],-1),c=a("tr",null,[a("td",null,"Abbreviation"),a("td",null,"TIA")],-1),h=a("tr",null,[a("td",null,"Total supply at genesis"),a("td",null,"1,000,000,000 TIA")],-1),Q=a("tr",null,[a("td",null,"Inflation schedule"),a("td",null,"8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually")],-1),p=a("tr",null,[a("td",null,"Decimals"),a("td",null,"6")],-1),T=a("td",null,"Conversion",-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.526ex",height:"2.14ex",role:"img",focusable:"false",viewBox:"0 -864 9514.7 946","aria-hidden":"true"},f=n('',1),g=[f],H=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mtext",null,"1 uTIA"),a("mo",null,"="),a("mtext",null,"TIA"),a("mo",null,"×"),a("msup",null,[a("mn",null,"10"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"−"),a("mn",null,"6")])])])],-1),k=n('

        Role of TIA

        Paying for blobspace

        Celestia’s native asset, TIA, is an essential part of how developers build on the first modular blockchain network. To use Celestia for data availability, rollup developers submit PayForBlobs transactions on the network for a fee, denominated in TIA.

        Bootstrapping new rollups

        A core part of the Celestia vision is that deploying a blockchain should be as easy as deploying a smart contract. In the modular era, developers no longer need to issue a token to launch their own blockchain.

        Similarly to ETH on Ethereum-based rollups, developers may opt to bootstrap their chain quickly by using TIA as a gas token and currency, in addition to paying for data availability. In this mode, developers can focus on creating their application or execution layer, instead of issuing a token right away.

        Proof-of-stake

        As a permissionless network built with Cosmos SDK, Celestia uses proof-of-stake to secure its own consensus. Like in other Cosmos networks, any user can help secure the network by delegating their TIA to a Celestia validator for a portion of their validator’s staking rewards.

        Learn how proof-of-stake works in Cosmos.

        Decentralised governance

        TIA staking also allows the community to play a critical role in decentralised governance over key parts of Celestia, such as voting on network parameters through governance proposals, and governing the community pool, which receives 2% of block rewards.

        Learn more about Celestia’s decentralised governance model.

        Denominations

        TIA: display token

        TIA is the DisplayDenom that you will typically see in wallets and user interfaces.

        utia: staking denomination

        utia is the BondDenom and stands for "micro TIA", with 1 TIA = 1,000,000 utia. This is the native staking denomination.

        In staking operations or transactions, if no denomination is specified, utia is assumed.

        microtia: staking denomination alias

        microtia is the BondDenomAlias, an alias for utia.

        ',20);function b(_,w,V,y,v,x){return t(),e("div",null,[r,l,a("table",null,[d,a("tbody",null,[c,h,Q,p,a("tr",null,[T,a("td",null,[a("mjx-container",m,[(t(),e("svg",u,g)),H])])])])]),k])}const I=s(i,[["render",b]]);export{A as __pageData,I as default}; +import{_ as s,o as t,c as e,k as a,a as o,Q as n}from"./chunks/framework.b47e54aa.js";const A=JSON.parse('{"title":"Overview of TIA","description":"","frontmatter":{"prev":{"text":"Data availability FAQ","link":"/learn/how-celestia-works/data-availability-faq"},"head":[["meta",{"name":"og:title","content":"Overview of TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/tia.md","filePath":"learn/tia.md","lastUpdated":1725992025000}'),i={name:"learn/tia.md"},r=a("h1",{id:"overview-of-tia",tabindex:"-1"},[o("Overview of TIA "),a("a",{class:"header-anchor",href:"#overview-of-tia","aria-label":'Permalink to "Overview of TIA"'},"​")],-1),l=a("h2",{id:"tia-at-a-glance",tabindex:"-1"},[o("TIA at a glance "),a("a",{class:"header-anchor",href:"#tia-at-a-glance","aria-label":'Permalink to "TIA at a glance"'},"​")],-1),d=a("thead",null,[a("tr",null,[a("th",null,"Property"),a("th",null,"Details")])],-1),c=a("tr",null,[a("td",null,"Abbreviation"),a("td",null,"TIA")],-1),h=a("tr",null,[a("td",null,"Total supply at genesis"),a("td",null,"1,000,000,000 TIA")],-1),Q=a("tr",null,[a("td",null,"Inflation schedule"),a("td",null,"8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually")],-1),p=a("tr",null,[a("td",null,"Decimals"),a("td",null,"6")],-1),T=a("td",null,"Conversion",-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.526ex",height:"2.14ex",role:"img",focusable:"false",viewBox:"0 -864 9514.7 946","aria-hidden":"true"},f=n('',1),g=[f],H=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mtext",null,"1 uTIA"),a("mo",null,"="),a("mtext",null,"TIA"),a("mo",null,"×"),a("msup",null,[a("mn",null,"10"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"−"),a("mn",null,"6")])])])],-1),k=n('

        Role of TIA

        Paying for blobspace

        Celestia’s native asset, TIA, is an essential part of how developers build on the first modular blockchain network. To use Celestia for data availability, rollup developers submit PayForBlobs transactions on the network for a fee, denominated in TIA.

        Bootstrapping new rollups

        A core part of the Celestia vision is that deploying a blockchain should be as easy as deploying a smart contract. In the modular era, developers no longer need to issue a token to launch their own blockchain.

        Similarly to ETH on Ethereum-based rollups, developers may opt to bootstrap their chain quickly by using TIA as a gas token and currency, in addition to paying for data availability. In this mode, developers can focus on creating their application or execution layer, instead of issuing a token right away.

        Proof-of-stake

        As a permissionless network built with Cosmos SDK, Celestia uses proof-of-stake to secure its own consensus. Like in other Cosmos networks, any user can help secure the network by delegating their TIA to a Celestia validator for a portion of their validator’s staking rewards.

        Learn how proof-of-stake works in Cosmos.

        Decentralised governance

        TIA staking also allows the community to play a critical role in decentralised governance over key parts of Celestia, such as voting on network parameters through governance proposals, and governing the community pool, which receives 2% of block rewards.

        Learn more about Celestia’s decentralised governance model.

        Denominations

        TIA: display token

        TIA is the DisplayDenom that you will typically see in wallets and user interfaces.

        utia: staking denomination

        utia is the BondDenom and stands for "micro TIA", with 1 TIA = 1,000,000 utia. This is the native staking denomination.

        In staking operations or transactions, if no denomination is specified, utia is assumed.

        microtia: staking denomination alias

        microtia is the BondDenomAlias, an alias for utia.

        ',20);function b(_,w,V,y,v,x){return t(),e("div",null,[r,l,a("table",null,[d,a("tbody",null,[c,h,Q,p,a("tr",null,[T,a("td",null,[a("mjx-container",m,[(t(),e("svg",u,g)),H])])])])]),k])}const I=s(i,[["render",b]]);export{A as __pageData,I as default}; diff --git a/pr-1699/assets/learn_tia.md.6fd97b1e.lean.js b/pr-1699/assets/learn_tia.md.9065ce93.lean.js similarity index 97% rename from pr-1699/assets/learn_tia.md.6fd97b1e.lean.js rename to pr-1699/assets/learn_tia.md.9065ce93.lean.js index 81f7f651ff..34b64690f9 100644 --- a/pr-1699/assets/learn_tia.md.6fd97b1e.lean.js +++ b/pr-1699/assets/learn_tia.md.9065ce93.lean.js @@ -1 +1 @@ -import{_ as s,o as t,c as e,k as a,a as o,Q as n}from"./chunks/framework.b47e54aa.js";const A=JSON.parse('{"title":"Overview of TIA","description":"","frontmatter":{"prev":{"text":"Data availability FAQ","link":"/learn/how-celestia-works/data-availability-faq"},"head":[["meta",{"name":"og:title","content":"Overview of TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/tia.md","filePath":"learn/tia.md","lastUpdated":1725971357000}'),i={name:"learn/tia.md"},r=a("h1",{id:"overview-of-tia",tabindex:"-1"},[o("Overview of TIA "),a("a",{class:"header-anchor",href:"#overview-of-tia","aria-label":'Permalink to "Overview of TIA"'},"​")],-1),l=a("h2",{id:"tia-at-a-glance",tabindex:"-1"},[o("TIA at a glance "),a("a",{class:"header-anchor",href:"#tia-at-a-glance","aria-label":'Permalink to "TIA at a glance"'},"​")],-1),d=a("thead",null,[a("tr",null,[a("th",null,"Property"),a("th",null,"Details")])],-1),c=a("tr",null,[a("td",null,"Abbreviation"),a("td",null,"TIA")],-1),h=a("tr",null,[a("td",null,"Total supply at genesis"),a("td",null,"1,000,000,000 TIA")],-1),Q=a("tr",null,[a("td",null,"Inflation schedule"),a("td",null,"8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually")],-1),p=a("tr",null,[a("td",null,"Decimals"),a("td",null,"6")],-1),T=a("td",null,"Conversion",-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.526ex",height:"2.14ex",role:"img",focusable:"false",viewBox:"0 -864 9514.7 946","aria-hidden":"true"},f=n("",1),g=[f],H=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mtext",null,"1 uTIA"),a("mo",null,"="),a("mtext",null,"TIA"),a("mo",null,"×"),a("msup",null,[a("mn",null,"10"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"−"),a("mn",null,"6")])])])],-1),k=n("",20);function b(_,w,V,y,v,x){return t(),e("div",null,[r,l,a("table",null,[d,a("tbody",null,[c,h,Q,p,a("tr",null,[T,a("td",null,[a("mjx-container",m,[(t(),e("svg",u,g)),H])])])])]),k])}const I=s(i,[["render",b]]);export{A as __pageData,I as default}; +import{_ as s,o as t,c as e,k as a,a as o,Q as n}from"./chunks/framework.b47e54aa.js";const A=JSON.parse('{"title":"Overview of TIA","description":"","frontmatter":{"prev":{"text":"Data availability FAQ","link":"/learn/how-celestia-works/data-availability-faq"},"head":[["meta",{"name":"og:title","content":"Overview of TIA | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"learn/tia.md","filePath":"learn/tia.md","lastUpdated":1725992025000}'),i={name:"learn/tia.md"},r=a("h1",{id:"overview-of-tia",tabindex:"-1"},[o("Overview of TIA "),a("a",{class:"header-anchor",href:"#overview-of-tia","aria-label":'Permalink to "Overview of TIA"'},"​")],-1),l=a("h2",{id:"tia-at-a-glance",tabindex:"-1"},[o("TIA at a glance "),a("a",{class:"header-anchor",href:"#tia-at-a-glance","aria-label":'Permalink to "TIA at a glance"'},"​")],-1),d=a("thead",null,[a("tr",null,[a("th",null,"Property"),a("th",null,"Details")])],-1),c=a("tr",null,[a("td",null,"Abbreviation"),a("td",null,"TIA")],-1),h=a("tr",null,[a("td",null,"Total supply at genesis"),a("td",null,"1,000,000,000 TIA")],-1),Q=a("tr",null,[a("td",null,"Inflation schedule"),a("td",null,"8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually")],-1),p=a("tr",null,[a("td",null,"Decimals"),a("td",null,"6")],-1),T=a("td",null,"Conversion",-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.526ex",height:"2.14ex",role:"img",focusable:"false",viewBox:"0 -864 9514.7 946","aria-hidden":"true"},f=n("",1),g=[f],H=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mtext",null,"1 uTIA"),a("mo",null,"="),a("mtext",null,"TIA"),a("mo",null,"×"),a("msup",null,[a("mn",null,"10"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"−"),a("mn",null,"6")])])])],-1),k=n("",20);function b(_,w,V,y,v,x){return t(),e("div",null,[r,l,a("table",null,[d,a("tbody",null,[c,h,Q,p,a("tr",null,[T,a("td",null,[a("mjx-container",m,[(t(),e("svg",u,g)),H])])])])]),k])}const I=s(i,[["render",b]]);export{A as __pageData,I as default}; diff --git a/pr-1699/assets/nodes_arabica-devnet.md.960dc284.js b/pr-1699/assets/nodes_arabica-devnet.md.5fbea086.js similarity index 99% rename from pr-1699/assets/nodes_arabica-devnet.md.960dc284.js rename to pr-1699/assets/nodes_arabica-devnet.md.5fbea086.js index 278153a201..d21512b706 100644 --- a/pr-1699/assets/nodes_arabica-devnet.md.960dc284.js +++ b/pr-1699/assets/nodes_arabica-devnet.md.5fbea086.js @@ -1,3 +1,3 @@ import{A as d}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as h,o,c as r,k as e,t as a,H as s,Q as n,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";const b="/docs-preview/pr-1699/img/arabica-devnet.png",g={name:"ArabicaDevnetDetails",data(){return{constants:p}}},y=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),f=e("td",null,"Chain ID",-1),m=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"27122593765E07329BC348E8D16E92DCB4C75B34CCCB35C640FD7A4484D4C711")])],-1),E=e("td",null,"Genesis file",-1),v=["href"],k=e("td",null,"Peers file",-1),w=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 4 ")],-1);function C(l,i,c,q,t,x){return o(),r("table",null,[y,e("tr",null,[f,e("td",null,[e("code",null,a(t.constants.arabicaChainId),1)])]),m,e("tr",null,[E,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/genesis.json ",9,v)])]),e("tr",null,[k,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/peers.txt ",9,w)])]),_])}const A=h(g,[["render",C]]),D=n('

        Arabica devnet

        arabica-devnet

        Arabica devnet is a testnet from Celestia Labs that is focused exclusively on providing developers with enhanced performance and the latest upgrades for testing their rollups and applications.

        Arabica does not focus on validator or consensus-level testing, rather, that is what Mocha testnet is used for. If you are a validator, we recommend testing your validator operations on the Mocha testnet.

        Network stability and upgrades

        Arabica has the latest updates from all Celestia's products deployed on it, it can be subject to many changes. Therefore, as a fair warning, Arabica can break unexpectedly, but given it will be continuously updated, it is a useful way to keep testing the latest changes in the software.

        Developers can still deploy on Mocha testnet their sovereign rollups if they chose to do so, it just will always lag behind Arabica devnet until Mocha undergoes Hardfork Upgrades in coordination with Validators.

        Network details

        ',8),F=e("h3",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),P=n(`

        Integrations

        This guide contains the relevant sections for how to connect to Arabica devnet, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

        Production RPC endpoints

        These RPC providers are meant to be used in production environments.

        ProviderURL
        NewMetrichttps://app.newmetric.xyz/start
        NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
        NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
        Grovehttps://www.grove.city/

        Community RPC endpoints

        WARNING

        Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

        RPC endpoints and types of nodes you can run in order to participate in Arabica devnet:

        Node typeEndpoint typeEndpoint
        Consensus nodes (full)Consensus RPChttps://rpc.celestia-arabica-11.com
        APIhttps://api.celestia-arabica-11.com
        gRPCgrpc.celestia-arabica-11.com:443
        Direct endpoints with open portsOpen ports: 26656 (p2p), 26657 (RPC), 1317 (API), 9090 (GRPC)
        validator-1.celestia-arabica-11.com
        validator-2.celestia-arabica-11.com
        validator-3.celestia-arabica-11.com
        validator-4.celestia-arabica-11.com
        Data availability nodesDA Bridge Node Endpoints/dns4/da-bridge-1.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWGqwzdEqM54Dce6LXzfFr97Bnhvm6rN7KM7MFwdomfm4S
        (light, bridge, full)/dns4/da-bridge-2.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWCMGM5eZWVfCN9ZLAViGfLUWAfXP5pCm78NFKb9jpBtua
        /dns4/da-bridge-3.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWEWuqrjULANpukDFGVoHW3RoeUU53Ec9t9v5cwW3MkVdQ
        /dns4/da-bridge-4.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWLT1ysSrD7XWSBjh7tU1HQanF5M64dHV6AuM6cYEJxMPk
        --core.ip string endpointsRefer to "Direct endpoints with open ports" above

        You can find the status of these endpoints.

        Using consensus endpoints with DA nodes

        Data availability (DA) RPC endpoints for bridge node sync

        These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

        Data availability (DA) gRPC endpoints for state access

        These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

        EXAMPLE

        bash
        celestia <da_type> start –core.ip <url> -–core.grpc.port <port>
        celestia <da_type> start –core.ip <url> -–core.grpc.port <port>

        RPCs for DA nodes to initialise or start your celestia-node to Arabica devnet with can be found in the table in the "Direct endpoints with open ports" section above.

        As an example, this command will work to start a light node with state access, using default ports:

        bash
        celestia light start --p2p.network arabica \\
           --core.ip validator-1.celestia-arabica-11.com
        celestia light start --p2p.network arabica \\
        -  --core.ip validator-1.celestia-arabica-11.com

        Bridge node runners

        Not all of the RPC endpoints do not guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

        Arabica devnet faucet

        WARNING

        USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

        Discord

        You can request from Arabica devnet Faucet on the #arabica-faucet channel on Celestia's Discord server with the following command:

        text
        $request <CELESTIA-ADDRESS>
        $request <CELESTIA-ADDRESS>

        Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

        NOTE

        Faucet has a limit of 10 tokens per week per address/Discord ID.

        Web

        The web faucet is available at https://faucet.celestia-arabica-11.com/.

        Explorers

        There are multiple explorers you can use for Arabica:

        Network upgrades

        Join our Telegram announcement channel for network upgrades.

        See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

        `,35),B=JSON.parse('{"title":"Arabica devnet","description":"A guide to Arabica devnet.","frontmatter":{"description":"A guide to Arabica devnet.","head":[["meta",{"name":"og:title","content":"Arabica devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/arabica-devnet.md","filePath":"nodes/arabica-devnet.md","lastUpdated":1725971357000}'),T={name:"nodes/arabica-devnet.md"},L=Object.assign(T,{setup(l){return(i,c)=>(o(),r("div",null,[D,s(A),F,s(d),P]))}});export{B as __pageData,L as default}; + --core.ip validator-1.celestia-arabica-11.com

        Bridge node runners

        Not all of the RPC endpoints do not guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

        Arabica devnet faucet

        WARNING

        USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

        Discord

        You can request from Arabica devnet Faucet on the #arabica-faucet channel on Celestia's Discord server with the following command:

        text
        $request <CELESTIA-ADDRESS>
        $request <CELESTIA-ADDRESS>

        Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

        NOTE

        Faucet has a limit of 10 tokens per week per address/Discord ID.

        Web

        The web faucet is available at https://faucet.celestia-arabica-11.com/.

        Explorers

        There are multiple explorers you can use for Arabica:

        Network upgrades

        Join our Telegram announcement channel for network upgrades.

        See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

        `,35),B=JSON.parse('{"title":"Arabica devnet","description":"A guide to Arabica devnet.","frontmatter":{"description":"A guide to Arabica devnet.","head":[["meta",{"name":"og:title","content":"Arabica devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/arabica-devnet.md","filePath":"nodes/arabica-devnet.md","lastUpdated":1725992025000}'),T={name:"nodes/arabica-devnet.md"},L=Object.assign(T,{setup(l){return(i,c)=>(o(),r("div",null,[D,s(A),F,s(d),P]))}});export{B as __pageData,L as default}; diff --git a/pr-1699/assets/nodes_arabica-devnet.md.960dc284.lean.js b/pr-1699/assets/nodes_arabica-devnet.md.5fbea086.lean.js similarity index 97% rename from pr-1699/assets/nodes_arabica-devnet.md.960dc284.lean.js rename to pr-1699/assets/nodes_arabica-devnet.md.5fbea086.lean.js index bb8b4cfe02..da26ca3f9b 100644 --- a/pr-1699/assets/nodes_arabica-devnet.md.960dc284.lean.js +++ b/pr-1699/assets/nodes_arabica-devnet.md.5fbea086.lean.js @@ -1 +1 @@ -import{A as d}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as h,o,c as r,k as e,t as a,H as s,Q as n,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";const b="/docs-preview/pr-1699/img/arabica-devnet.png",g={name:"ArabicaDevnetDetails",data(){return{constants:p}}},y=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),f=e("td",null,"Chain ID",-1),m=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"27122593765E07329BC348E8D16E92DCB4C75B34CCCB35C640FD7A4484D4C711")])],-1),E=e("td",null,"Genesis file",-1),v=["href"],k=e("td",null,"Peers file",-1),w=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 4 ")],-1);function C(l,i,c,q,t,x){return o(),r("table",null,[y,e("tr",null,[f,e("td",null,[e("code",null,a(t.constants.arabicaChainId),1)])]),m,e("tr",null,[E,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/genesis.json ",9,v)])]),e("tr",null,[k,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/peers.txt ",9,w)])]),_])}const A=h(g,[["render",C]]),D=n("",8),F=e("h3",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),P=n("",35),B=JSON.parse('{"title":"Arabica devnet","description":"A guide to Arabica devnet.","frontmatter":{"description":"A guide to Arabica devnet.","head":[["meta",{"name":"og:title","content":"Arabica devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/arabica-devnet.md","filePath":"nodes/arabica-devnet.md","lastUpdated":1725971357000}'),T={name:"nodes/arabica-devnet.md"},L=Object.assign(T,{setup(l){return(i,c)=>(o(),r("div",null,[D,s(A),F,s(d),P]))}});export{B as __pageData,L as default}; +import{A as d}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{c as p}from"./chunks/constants.295fc0ab.js";import{_ as h,o,c as r,k as e,t as a,H as s,Q as n,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";const b="/docs-preview/pr-1699/img/arabica-devnet.png",g={name:"ArabicaDevnetDetails",data(){return{constants:p}}},y=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),f=e("td",null,"Chain ID",-1),m=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"27122593765E07329BC348E8D16E92DCB4C75B34CCCB35C640FD7A4484D4C711")])],-1),E=e("td",null,"Genesis file",-1),v=["href"],k=e("td",null,"Peers file",-1),w=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 4 ")],-1);function C(l,i,c,q,t,x){return o(),r("table",null,[y,e("tr",null,[f,e("td",null,[e("code",null,a(t.constants.arabicaChainId),1)])]),m,e("tr",null,[E,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/genesis.json ",9,v)])]),e("tr",null,[k,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.arabicaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+a(t.constants.arabicaChainId)+"/peers.txt ",9,w)])]),_])}const A=h(g,[["render",C]]),D=n("",8),F=e("h3",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),P=n("",35),B=JSON.parse('{"title":"Arabica devnet","description":"A guide to Arabica devnet.","frontmatter":{"description":"A guide to Arabica devnet.","head":[["meta",{"name":"og:title","content":"Arabica devnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/arabica-devnet.md","filePath":"nodes/arabica-devnet.md","lastUpdated":1725992025000}'),T={name:"nodes/arabica-devnet.md"},L=Object.assign(T,{setup(l){return(i,c)=>(o(),r("div",null,[D,s(A),F,s(d),P]))}});export{B as __pageData,L as default}; diff --git a/pr-1699/assets/nodes_bridge-node.md.71e96d87.js b/pr-1699/assets/nodes_bridge-node.md.40517142.js similarity index 97% rename from pr-1699/assets/nodes_bridge-node.md.71e96d87.js rename to pr-1699/assets/nodes_bridge-node.md.40517142.js index 49905397d0..a2070d0cc0 100644 --- a/pr-1699/assets/nodes_bridge-node.md.71e96d87.js +++ b/pr-1699/assets/nodes_bridge-node.md.40517142.js @@ -1,6 +1,6 @@ -import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/nodes/BridgeNodes.png",u=JSON.parse('{"title":"Setting up a Celestia bridge node","description":"","frontmatter":{"\\\\description":"Learn how to set up your Celestia bridge node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia bridge node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/bridge-node.md","filePath":"nodes/bridge-node.md","lastUpdated":1725971357000}'),l={name:"nodes/bridge-node.md"},t=o('

        Setting up a Celestia bridge node

        This tutorial will go over the steps to setting up your Celestia bridge node.

        Bridge nodes connect the data availability layer and the consensus layer.

        Overview of bridge nodes

        A Celestia bridge node has the following properties:

        1. Import and process “raw” headers & blocks from a trusted core process (meaning a trusted RPC connection to a celestia-core node) in the Consensus network. Bridge nodes can run this core process internally (embedded) or simply connect to a remote endpoint. Bridge nodes also have the option of being an active validator in the consensus network.
        2. Validate and erasure code the “raw” blocks
        3. Supply block shares with data availability headers to light nodes in the DA network.

        bridge-node-diagram

        From an implementation perspective, Bridge nodes run two separate processes:

        1. celestia-app with celestia-core (see repo)

          • celestia-app is the state machine where the application and the proof-of-stake logic is run. celestia-app is built on Cosmos SDK and also encompasses celestia-core.
          • celestia-core is the state interaction, consensus and block production layer. celestia-core is built on Tendermint Core, modified to store data roots of erasure coded blocks among other changes (see ADRs).
        2. celestia-node (see repo)

          • celestia-node augments the above with a separate libp2p network that serves data availability sampling requests. The team sometimes refers to this as the “halo” network.

        Hardware requirements

        The following hardware minimum requirements are recommended for running the bridge node:

        • Memory: 16 GB RAM (minimum)
        • CPU: 6 cores
        • Disk: 10 TB SSD Storage
        • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

        Setting up your bridge node

        The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

        Setup the dependencies

        Follow the tutorial for installing the dependencies.

        Deploy the Celestia bridge node

        Install Celestia Node

        Install the celestia-node binary, which will be used to run the bridge node.

        Follow the tutorial for installing celestia-node.

        Initialize the bridge node

        Run the following:

        sh
        celestia bridge init --core.ip <URI>
        celestia bridge init --core.ip <URI>

        The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

        Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

        Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

        Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

        Here is an example of initializing the bridge node:

        sh
        celestia bridge init --core.ip <URI>
        celestia bridge init --core.ip <URI>
        sh
        celestia bridge init --core.ip <URI> --p2p.network mocha
        celestia bridge init --core.ip <URI> --p2p.network mocha
        sh
        celestia bridge init --core.ip <URI> --p2p.network arabica
        celestia bridge init --core.ip <URI> --p2p.network arabica

        Run the bridge node

        Start the bridge node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

        sh
        celestia bridge start --core.ip <URI>
        celestia bridge start --core.ip <URI>

        Here is an example of starting the bridge node on Mocha:

        sh
        celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha
        celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha

        And on Arabica:

        sh
        celestia bridge start --core.ip validator-1.celestia-arabica-11.com \\
        +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/nodes/BridgeNodes.png",u=JSON.parse('{"title":"Setting up a Celestia bridge node","description":"","frontmatter":{"\\\\description":"Learn how to set up your Celestia bridge node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia bridge node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/bridge-node.md","filePath":"nodes/bridge-node.md","lastUpdated":1725992025000}'),l={name:"nodes/bridge-node.md"},t=o('

        Setting up a Celestia bridge node

        This tutorial will go over the steps to setting up your Celestia bridge node.

        Bridge nodes connect the data availability layer and the consensus layer.

        Overview of bridge nodes

        A Celestia bridge node has the following properties:

        1. Import and process “raw” headers & blocks from a trusted core process (meaning a trusted RPC connection to a celestia-core node) in the Consensus network. Bridge nodes can run this core process internally (embedded) or simply connect to a remote endpoint. Bridge nodes also have the option of being an active validator in the consensus network.
        2. Validate and erasure code the “raw” blocks
        3. Supply block shares with data availability headers to light nodes in the DA network.

        bridge-node-diagram

        From an implementation perspective, Bridge nodes run two separate processes:

        1. celestia-app with celestia-core (see repo)

          • celestia-app is the state machine where the application and the proof-of-stake logic is run. celestia-app is built on Cosmos SDK and also encompasses celestia-core.
          • celestia-core is the state interaction, consensus and block production layer. celestia-core is built on Tendermint Core, modified to store data roots of erasure coded blocks among other changes (see ADRs).
        2. celestia-node (see repo)

          • celestia-node augments the above with a separate libp2p network that serves data availability sampling requests. The team sometimes refers to this as the “halo” network.

        Hardware requirements

        The following hardware minimum requirements are recommended for running the bridge node:

        • Memory: 16 GB RAM (minimum)
        • CPU: 6 cores
        • Disk: 10 TB SSD Storage
        • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

        Setting up your bridge node

        The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

        Setup the dependencies

        Follow the tutorial for installing the dependencies.

        Deploy the Celestia bridge node

        Install Celestia Node

        Install the celestia-node binary, which will be used to run the bridge node.

        Follow the tutorial for installing celestia-node.

        Initialize the bridge node

        Run the following:

        sh
        celestia bridge init --core.ip <URI>
        celestia bridge init --core.ip <URI>

        The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

        Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

        Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

        Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

        Here is an example of initializing the bridge node:

        sh
        celestia bridge init --core.ip <URI>
        celestia bridge init --core.ip <URI>
        sh
        celestia bridge init --core.ip <URI> --p2p.network mocha
        celestia bridge init --core.ip <URI> --p2p.network mocha
        sh
        celestia bridge init --core.ip <URI> --p2p.network arabica
        celestia bridge init --core.ip <URI> --p2p.network arabica

        Run the bridge node

        Start the bridge node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

        sh
        celestia bridge start --core.ip <URI>
        celestia bridge start --core.ip <URI>

        Here is an example of starting the bridge node on Mocha:

        sh
        celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha
        celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha

        And on Arabica:

        sh
        celestia bridge start --core.ip validator-1.celestia-arabica-11.com \\
           --p2p.network arabica
        celestia bridge start --core.ip validator-1.celestia-arabica-11.com \\
        -  --p2p.network arabica

        You can create your key for your node by following the cel-key instructions.

        Once you start the bridge node, a wallet key will be generated for you. You will need to fund that address with Testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

        sh
        ./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>
        ./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>

        TIP

        You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

        You can get testnet tokens from:

        NOTE

        If you are running a bridge node for your validator it is highly recommended to request Mocha testnet tokens as this is the testnet used to test out validator operations.

        Optional: run the bridge node with a custom key

        In order to run a bridge node using a custom key:

        1. The custom key must exist inside the celestia bridge node directory at the correct path (default: ~/.celestia-bridge/keys/keyring-test)
        2. The name of the custom key must be passed upon start, like so:
        sh
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
        sh
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \\
        +  --p2p.network arabica

        You can create your key for your node by following the cel-key instructions.

        Once you start the bridge node, a wallet key will be generated for you. You will need to fund that address with Testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

        sh
        ./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>
        ./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>

        TIP

        You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

        You can get testnet tokens from:

        NOTE

        If you are running a bridge node for your validator it is highly recommended to request Mocha testnet tokens as this is the testnet used to test out validator operations.

        Optional: run the bridge node with a custom key

        In order to run a bridge node using a custom key:

        1. The custom key must exist inside the celestia bridge node directory at the correct path (default: ~/.celestia-bridge/keys/keyring-test)
        2. The name of the custom key must be passed upon start, like so:
        sh
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
        sh
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \\
           --p2p.network mocha
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \\
           --p2p.network mocha
        sh
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \\
           --p2p.network arabica
        celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \\
        diff --git a/pr-1699/assets/nodes_bridge-node.md.71e96d87.lean.js b/pr-1699/assets/nodes_bridge-node.md.40517142.lean.js
        similarity index 91%
        rename from pr-1699/assets/nodes_bridge-node.md.71e96d87.lean.js
        rename to pr-1699/assets/nodes_bridge-node.md.40517142.lean.js
        index 7ba0f883c4..e86a9eed4a 100644
        --- a/pr-1699/assets/nodes_bridge-node.md.71e96d87.lean.js
        +++ b/pr-1699/assets/nodes_bridge-node.md.40517142.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/nodes/BridgeNodes.png",u=JSON.parse('{"title":"Setting up a Celestia bridge node","description":"","frontmatter":{"\\\\description":"Learn how to set up your Celestia bridge node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia bridge node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/bridge-node.md","filePath":"nodes/bridge-node.md","lastUpdated":1725971357000}'),l={name:"nodes/bridge-node.md"},t=o("",53),p=[t];function r(c,i,d,y,E,h){return e(),a("div",null,p)}const b=s(l,[["render",r]]);export{u as __pageData,b as default};
        +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const n="/docs-preview/pr-1699/img/nodes/BridgeNodes.png",u=JSON.parse('{"title":"Setting up a Celestia bridge node","description":"","frontmatter":{"\\\\description":"Learn how to set up your Celestia bridge node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia bridge node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/bridge-node.md","filePath":"nodes/bridge-node.md","lastUpdated":1725992025000}'),l={name:"nodes/bridge-node.md"},t=o("",53),p=[t];function r(c,i,d,y,E,h){return e(),a("div",null,p)}const b=s(l,[["render",r]]);export{u as __pageData,b as default};
        diff --git a/pr-1699/assets/nodes_celestia-app-commands.md.0be51395.js b/pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.js
        similarity index 99%
        rename from pr-1699/assets/nodes_celestia-app-commands.md.0be51395.js
        rename to pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.js
        index fb87b9458a..c06eb9373d 100644
        --- a/pr-1699/assets/nodes_celestia-app-commands.md.0be51395.js
        +++ b/pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Helpful CLI commands","description":"Some of the most helpful celestia-app CLI commands.","frontmatter":{"description":"Some of the most helpful celestia-app CLI commands.","next":{"text":"SystemD","link":"/nodes/systemd"},"head":[["meta",{"name":"og:title","content":"Helpful CLI commands | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-commands.md","filePath":"nodes/celestia-app-commands.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-app-commands.md"},o=l(`

        Helpful CLI commands

        View all options:

        console
        $ celestia-appd --help
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Helpful CLI commands","description":"Some of the most helpful celestia-app CLI commands.","frontmatter":{"description":"Some of the most helpful celestia-app CLI commands.","next":{"text":"SystemD","link":"/nodes/systemd"},"head":[["meta",{"name":"og:title","content":"Helpful CLI commands | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-commands.md","filePath":"nodes/celestia-app-commands.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-app-commands.md"},o=l(`

        Helpful CLI commands

        View all options:

        console
        $ celestia-appd --help
         Start celestia-app
         
         Usage:
        diff --git a/pr-1699/assets/nodes_celestia-app-commands.md.0be51395.lean.js b/pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.lean.js
        similarity index 91%
        rename from pr-1699/assets/nodes_celestia-app-commands.md.0be51395.lean.js
        rename to pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.lean.js
        index ae12f4c2f2..a3f744fb79 100644
        --- a/pr-1699/assets/nodes_celestia-app-commands.md.0be51395.lean.js
        +++ b/pr-1699/assets/nodes_celestia-app-commands.md.16f0c3b5.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Helpful CLI commands","description":"Some of the most helpful celestia-app CLI commands.","frontmatter":{"description":"Some of the most helpful celestia-app CLI commands.","next":{"text":"SystemD","link":"/nodes/systemd"},"head":[["meta",{"name":"og:title","content":"Helpful CLI commands | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-commands.md","filePath":"nodes/celestia-app-commands.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-app-commands.md"},o=l("",84),e=[o];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const g=s(p,[["render",t]]);export{u as __pageData,g as default};
        +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Helpful CLI commands","description":"Some of the most helpful celestia-app CLI commands.","frontmatter":{"description":"Some of the most helpful celestia-app CLI commands.","next":{"text":"SystemD","link":"/nodes/systemd"},"head":[["meta",{"name":"og:title","content":"Helpful CLI commands | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-commands.md","filePath":"nodes/celestia-app-commands.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-app-commands.md"},o=l("",84),e=[o];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const g=s(p,[["render",t]]);export{u as __pageData,g as default};
        diff --git a/pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.js b/pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.js
        similarity index 99%
        rename from pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.js
        rename to pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.js
        index 0a309372c1..6da8cd661a 100644
        --- a/pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.js
        +++ b/pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"Metrics","description":"A guide on how to monitor the health and performance of your system.","frontmatter":{"description":"A guide on how to monitor the health and performance of your system.","prev":{"text":"Troubleshooting","link":"/nodes/celestia-node-troubleshooting"},"head":[["meta",{"name":"og:title","content":"Metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-metrics.md","filePath":"nodes/celestia-app-metrics.md","lastUpdated":1725971357000}'),o={name:"nodes/celestia-app-metrics.md"},l=e(`

        Metrics

        Metrics are a powerful tool for monitoring the health and performance of a system. Celestia provides support for metrics to make sure, as an operator, your system continues to remain up and running. Metrics can also provide critical insight into how Celestia is used and how it can be improved.

        Setup

        Celestia uses Prometheus to publish metrics. It can be enabled through the config.toml file.

        bash
        #######################################################
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"Metrics","description":"A guide on how to monitor the health and performance of your system.","frontmatter":{"description":"A guide on how to monitor the health and performance of your system.","prev":{"text":"Troubleshooting","link":"/nodes/celestia-node-troubleshooting"},"head":[["meta",{"name":"og:title","content":"Metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-metrics.md","filePath":"nodes/celestia-app-metrics.md","lastUpdated":1725992025000}'),o={name:"nodes/celestia-app-metrics.md"},l=e(`

        Metrics

        Metrics are a powerful tool for monitoring the health and performance of a system. Celestia provides support for metrics to make sure, as an operator, your system continues to remain up and running. Metrics can also provide critical insight into how Celestia is used and how it can be improved.

        Setup

        Celestia uses Prometheus to publish metrics. It can be enabled through the config.toml file.

        bash
        #######################################################
         ###       Instrumentation Configuration Options     ###
         #######################################################
         [instrumentation]
        diff --git a/pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.lean.js b/pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.lean.js
        similarity index 92%
        rename from pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.lean.js
        rename to pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.lean.js
        index e03f73dad2..b03c093df6 100644
        --- a/pr-1699/assets/nodes_celestia-app-metrics.md.ba859d9d.lean.js
        +++ b/pr-1699/assets/nodes_celestia-app-metrics.md.0b6cb333.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"Metrics","description":"A guide on how to monitor the health and performance of your system.","frontmatter":{"description":"A guide on how to monitor the health and performance of your system.","prev":{"text":"Troubleshooting","link":"/nodes/celestia-node-troubleshooting"},"head":[["meta",{"name":"og:title","content":"Metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-metrics.md","filePath":"nodes/celestia-app-metrics.md","lastUpdated":1725971357000}'),o={name:"nodes/celestia-app-metrics.md"},l=e("",27),t=[l];function p(r,c,i,y,u,h){return a(),n("div",null,t)}const E=s(o,[["render",p]]);export{m as __pageData,E as default};
        +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const m=JSON.parse('{"title":"Metrics","description":"A guide on how to monitor the health and performance of your system.","frontmatter":{"description":"A guide on how to monitor the health and performance of your system.","prev":{"text":"Troubleshooting","link":"/nodes/celestia-node-troubleshooting"},"head":[["meta",{"name":"og:title","content":"Metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-metrics.md","filePath":"nodes/celestia-app-metrics.md","lastUpdated":1725992025000}'),o={name:"nodes/celestia-app-metrics.md"},l=e("",27),t=[l];function p(r,c,i,y,u,h){return a(),n("div",null,t)}const E=s(o,[["render",p]]);export{m as __pageData,E as default};
        diff --git a/pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.js b/pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.js
        similarity index 99%
        rename from pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.js
        rename to pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.js
        index 6814d1abcd..acc24181ae 100644
        --- a/pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.js
        +++ b/pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.js
        @@ -1,4 +1,4 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const d=JSON.parse('{"title":"Multisig","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Multisig | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-multisig.md","filePath":"nodes/celestia-app-multisig.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-app-multisig.md"},o=l(`

        Multisig

        Celestia inherits support for multisig accounts from the Cosmos SDK. Multisig accounts behave similarly to regular accounts with the added requirement that a threshold of signatures is needed to authorize a transaction.

        Multisig accounts can be created from the command line or using a graphical interface such as Keplr.

        Command line

        bash
        #!/bin/sh
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const d=JSON.parse('{"title":"Multisig","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Multisig | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-multisig.md","filePath":"nodes/celestia-app-multisig.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-app-multisig.md"},o=l(`

        Multisig

        Celestia inherits support for multisig accounts from the Cosmos SDK. Multisig accounts behave similarly to regular accounts with the added requirement that a threshold of signatures is needed to authorize a transaction.

        Multisig accounts can be created from the command line or using a graphical interface such as Keplr.

        Command line

        bash
        #!/bin/sh
         
         # Prerequisite: prior to running this script, start a single node devnet with ./scripts/single-node.sh
         CHAIN_ID="private"
        diff --git a/pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.lean.js b/pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.lean.js
        similarity index 88%
        rename from pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.lean.js
        rename to pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.lean.js
        index 6125873f90..3b367fd036 100644
        --- a/pr-1699/assets/nodes_celestia-app-multisig.md.cf17caf2.lean.js
        +++ b/pr-1699/assets/nodes_celestia-app-multisig.md.4833031c.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const d=JSON.parse('{"title":"Multisig","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Multisig | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-multisig.md","filePath":"nodes/celestia-app-multisig.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-app-multisig.md"},o=l("",7),e=[o];function t(c,r,y,E,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default};
        +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const d=JSON.parse('{"title":"Multisig","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Multisig | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-multisig.md","filePath":"nodes/celestia-app-multisig.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-app-multisig.md"},o=l("",7),e=[o];function t(c,r,y,E,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default};
        diff --git a/pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.js b/pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.js
        similarity index 97%
        rename from pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.js
        rename to pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.js
        index 5f8e980a0b..136a1221f8 100644
        --- a/pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.js
        +++ b/pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.js
        @@ -1 +1 @@
        -import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Jailing and Slashing on Celestia","description":"This section covers the jailing and slashing mechanics for validators in Celestia.","frontmatter":{"description":"This section covers the jailing and slashing mechanics for validators in Celestia.","head":[["meta",{"name":"og:title","content":"Jailing and Slashing on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-slashing.md","filePath":"nodes/celestia-app-slashing.md","lastUpdated":1725971357000}'),o={name:"nodes/celestia-app-slashing.md"},s=i('

        Jailing and Slashing on Celestia

        Slashing is a mechanism employed in proof of stake blockchains that is used to deter and punish malicious behavior. It functions by removing a percentage of a validator's stake each time they act harmfully towards the network.

        Celestia is built with the Cosmos SDK and uses the x/slashing module.

        If a validator gets slashed, delegators bonded to that validator will also have the same percentage of their delegated funds slashed.

        The following are the conditions for a validator to get jailed or slashed:

        1. Downtime: If a validator is offline for more than 25% of a rolling window of the last 5,000 blocks, they will be jailed for 1 minute. During this period, the validator is removed from the validator set temporarily, and will be unable to propose new blocks or earn rewards. After the jail period, the validator can send an unjail request to rejoin the validator set.

        2. Double signing: This is a more severe offense and results in getting slashed. If a validator engages in double signing, the validator will lose 2% of their stake and the remainder of their stake will be returned to them. The validator will be permanently removed from the validator set and will not have the ability to unjail. Delegators bonded to that validator will automatically enter the unbonding period for 21 days, and can delegate to another validator after they have been unbonded.

        For more details on the jailing and slashing parameters, refer to the celestia-app specifications page.

        ',7),n=[s];function l(r,d,h,c,p,g){return a(),t("div",null,n)}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Jailing and Slashing on Celestia","description":"This section covers the jailing and slashing mechanics for validators in Celestia.","frontmatter":{"description":"This section covers the jailing and slashing mechanics for validators in Celestia.","head":[["meta",{"name":"og:title","content":"Jailing and Slashing on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-slashing.md","filePath":"nodes/celestia-app-slashing.md","lastUpdated":1725992025000}'),o={name:"nodes/celestia-app-slashing.md"},s=i('

        Jailing and Slashing on Celestia

        Slashing is a mechanism employed in proof of stake blockchains that is used to deter and punish malicious behavior. It functions by removing a percentage of a validator's stake each time they act harmfully towards the network.

        Celestia is built with the Cosmos SDK and uses the x/slashing module.

        If a validator gets slashed, delegators bonded to that validator will also have the same percentage of their delegated funds slashed.

        The following are the conditions for a validator to get jailed or slashed:

        1. Downtime: If a validator is offline for more than 25% of a rolling window of the last 5,000 blocks, they will be jailed for 1 minute. During this period, the validator is removed from the validator set temporarily, and will be unable to propose new blocks or earn rewards. After the jail period, the validator can send an unjail request to rejoin the validator set.

        2. Double signing: This is a more severe offense and results in getting slashed. If a validator engages in double signing, the validator will lose 2% of their stake and the remainder of their stake will be returned to them. The validator will be permanently removed from the validator set and will not have the ability to unjail. Delegators bonded to that validator will automatically enter the unbonding period for 21 days, and can delegate to another validator after they have been unbonded.

        For more details on the jailing and slashing parameters, refer to the celestia-app specifications page.

        ',7),n=[s];function l(r,d,h,c,p,g){return a(),t("div",null,n)}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.lean.js b/pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.lean.js similarity index 92% rename from pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.lean.js rename to pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.lean.js index ed973ed6d0..2653cf467f 100644 --- a/pr-1699/assets/nodes_celestia-app-slashing.md.c061c14c.lean.js +++ b/pr-1699/assets/nodes_celestia-app-slashing.md.5b9f9df0.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Jailing and Slashing on Celestia","description":"This section covers the jailing and slashing mechanics for validators in Celestia.","frontmatter":{"description":"This section covers the jailing and slashing mechanics for validators in Celestia.","head":[["meta",{"name":"og:title","content":"Jailing and Slashing on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-slashing.md","filePath":"nodes/celestia-app-slashing.md","lastUpdated":1725971357000}'),o={name:"nodes/celestia-app-slashing.md"},s=i("",7),n=[s];function l(r,d,h,c,p,g){return a(),t("div",null,n)}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Jailing and Slashing on Celestia","description":"This section covers the jailing and slashing mechanics for validators in Celestia.","frontmatter":{"description":"This section covers the jailing and slashing mechanics for validators in Celestia.","head":[["meta",{"name":"og:title","content":"Jailing and Slashing on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-slashing.md","filePath":"nodes/celestia-app-slashing.md","lastUpdated":1725992025000}'),o={name:"nodes/celestia-app-slashing.md"},s=i("",7),n=[s];function l(r,d,h,c,p,g){return a(),t("div",null,n)}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.js b/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.js similarity index 89% rename from pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.js rename to pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.js index 6ef75e8932..982d0cf767 100644 --- a/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.js +++ b/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.js @@ -1 +1 @@ -import{_ as o,o as a,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Upgrade Monitor","description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","frontmatter":{"description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","head":[["meta",{"name":"og:title","content":"Upgrade Monitor | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-upgrade-monitor.md","filePath":"nodes/celestia-app-upgrade-monitor.md","lastUpdated":1725971357000}'),n={name:"nodes/celestia-app-upgrade-monitor.md"},s=e("h1",{id:"upgrade-monitor",tabindex:"-1"},[t("Upgrade Monitor "),e("a",{class:"header-anchor",href:"#upgrade-monitor","aria-label":'Permalink to "Upgrade Monitor"'},"​")],-1),i=e("p",null,[t("Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the "),e("a",{href:"https://github.com/celestiaorg/upgrade-monitor",target:"_blank",rel:"noreferrer"},"README"),t(" for instructions on how to install and use the binary.")],-1),d=[s,i];function p(c,l,m,g,u,h){return a(),r("div",null,d)}const k=o(n,[["render",p]]);export{f as __pageData,k as default}; +import{_ as o,o as a,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Upgrade Monitor","description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","frontmatter":{"description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","head":[["meta",{"name":"og:title","content":"Upgrade Monitor | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-upgrade-monitor.md","filePath":"nodes/celestia-app-upgrade-monitor.md","lastUpdated":1725992025000}'),n={name:"nodes/celestia-app-upgrade-monitor.md"},s=e("h1",{id:"upgrade-monitor",tabindex:"-1"},[t("Upgrade Monitor "),e("a",{class:"header-anchor",href:"#upgrade-monitor","aria-label":'Permalink to "Upgrade Monitor"'},"​")],-1),i=e("p",null,[t("Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the "),e("a",{href:"https://github.com/celestiaorg/upgrade-monitor",target:"_blank",rel:"noreferrer"},"README"),t(" for instructions on how to install and use the binary.")],-1),d=[s,i];function p(c,l,m,g,u,h){return a(),r("div",null,d)}const k=o(n,[["render",p]]);export{f as __pageData,k as default}; diff --git a/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.lean.js b/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.lean.js similarity index 89% rename from pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.lean.js rename to pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.lean.js index 6ef75e8932..982d0cf767 100644 --- a/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.c2b31db9.lean.js +++ b/pr-1699/assets/nodes_celestia-app-upgrade-monitor.md.0555c2d4.lean.js @@ -1 +1 @@ -import{_ as o,o as a,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Upgrade Monitor","description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","frontmatter":{"description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","head":[["meta",{"name":"og:title","content":"Upgrade Monitor | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-upgrade-monitor.md","filePath":"nodes/celestia-app-upgrade-monitor.md","lastUpdated":1725971357000}'),n={name:"nodes/celestia-app-upgrade-monitor.md"},s=e("h1",{id:"upgrade-monitor",tabindex:"-1"},[t("Upgrade Monitor "),e("a",{class:"header-anchor",href:"#upgrade-monitor","aria-label":'Permalink to "Upgrade Monitor"'},"​")],-1),i=e("p",null,[t("Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the "),e("a",{href:"https://github.com/celestiaorg/upgrade-monitor",target:"_blank",rel:"noreferrer"},"README"),t(" for instructions on how to install and use the binary.")],-1),d=[s,i];function p(c,l,m,g,u,h){return a(),r("div",null,d)}const k=o(n,[["render",p]]);export{f as __pageData,k as default}; +import{_ as o,o as a,c as r,k as e,a as t}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Upgrade Monitor","description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","frontmatter":{"description":"upgrade-monitor is a tool to monitor upgrades on a Celestia network.","head":[["meta",{"name":"og:title","content":"Upgrade Monitor | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-upgrade-monitor.md","filePath":"nodes/celestia-app-upgrade-monitor.md","lastUpdated":1725992025000}'),n={name:"nodes/celestia-app-upgrade-monitor.md"},s=e("h1",{id:"upgrade-monitor",tabindex:"-1"},[t("Upgrade Monitor "),e("a",{class:"header-anchor",href:"#upgrade-monitor","aria-label":'Permalink to "Upgrade Monitor"'},"​")],-1),i=e("p",null,[t("Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the "),e("a",{href:"https://github.com/celestiaorg/upgrade-monitor",target:"_blank",rel:"noreferrer"},"README"),t(" for instructions on how to install and use the binary.")],-1),d=[s,i];function p(c,l,m,g,u,h){return a(),r("div",null,d)}const k=o(n,[["render",p]]);export{f as __pageData,k as default}; diff --git a/pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.js b/pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.js similarity index 99% rename from pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.js rename to pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.js index 3adffc6281..bad464db7a 100644 --- a/pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.js +++ b/pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"How to create a vesting account with celestia-app","description":"Learn how to generate a vesting account using celestia-app.","frontmatter":{"description":"Learn how to generate a vesting account using celestia-app.","head":[["meta",{"name":"og:title","content":"How to create a vesting account with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-vesting.md","filePath":"nodes/celestia-app-vesting.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-app-vesting.md"},p=o(`

        How to create a vesting account with celestia-app

        In this guide, we will learn how to create a vesting account using celestia-app for both a local devnet and on Mocha testnet.

        note

        The instructions for this tutorial are for a continuous vesting account, if you'd like to make a delayed vesting account, just add the --delayed flag to your vesting transaction.

        Local devnet

        First, download and install celestia-app, selecting the network and corresponding version that you would like to use.

        Setting up the local devnet

        Run the devnet

        Next, change into the $HOME/celestia-app directory and run the single-node-devnet script.

        bash
        cd $HOME/celestia-app
        +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"How to create a vesting account with celestia-app","description":"Learn how to generate a vesting account using celestia-app.","frontmatter":{"description":"Learn how to generate a vesting account using celestia-app.","head":[["meta",{"name":"og:title","content":"How to create a vesting account with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-vesting.md","filePath":"nodes/celestia-app-vesting.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-app-vesting.md"},p=o(`

        How to create a vesting account with celestia-app

        In this guide, we will learn how to create a vesting account using celestia-app for both a local devnet and on Mocha testnet.

        note

        The instructions for this tutorial are for a continuous vesting account, if you'd like to make a delayed vesting account, just add the --delayed flag to your vesting transaction.

        Local devnet

        First, download and install celestia-app, selecting the network and corresponding version that you would like to use.

        Setting up the local devnet

        Run the devnet

        Next, change into the $HOME/celestia-app directory and run the single-node-devnet script.

        bash
        cd $HOME/celestia-app
         ./scripts/build-run-single-node.sh
        cd $HOME/celestia-app
         ./scripts/build-run-single-node.sh

        Save the home directory path

        At the top of the output, you will see a path to the "Home directory", find yours from the output (it will be unique every time):

        bash
        ./scripts/build-run-single-node.sh
         Home directory: /var/folders/_8/ljj6hspn0kn09qf9fy8kdyh40000gn/T/celestia_app_XXXXXXXXXXXXX.XV92a3qx
        diff --git a/pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.lean.js b/pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.lean.js
        similarity index 91%
        rename from pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.lean.js
        rename to pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.lean.js
        index 04618fd138..51c4f8b98e 100644
        --- a/pr-1699/assets/nodes_celestia-app-vesting.md.e8ca90cc.lean.js
        +++ b/pr-1699/assets/nodes_celestia-app-vesting.md.e829dc7e.lean.js
        @@ -1 +1 @@
        -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"How to create a vesting account with celestia-app","description":"Learn how to generate a vesting account using celestia-app.","frontmatter":{"description":"Learn how to generate a vesting account using celestia-app.","head":[["meta",{"name":"og:title","content":"How to create a vesting account with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-vesting.md","filePath":"nodes/celestia-app-vesting.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-app-vesting.md"},p=o("",98),e=[p];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{u as __pageData,h as default};
        +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"How to create a vesting account with celestia-app","description":"Learn how to generate a vesting account using celestia-app.","frontmatter":{"description":"Learn how to generate a vesting account using celestia-app.","head":[["meta",{"name":"og:title","content":"How to create a vesting account with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-vesting.md","filePath":"nodes/celestia-app-vesting.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-app-vesting.md"},p=o("",98),e=[p];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{u as __pageData,h as default};
        diff --git a/pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.js b/pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.js
        similarity index 99%
        rename from pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.js
        rename to pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.js
        index 65a3be6238..9ac74204fb 100644
        --- a/pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.js
        +++ b/pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.js
        @@ -1,3 +1,3 @@
        -import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Create a wallet with celestia-app","description":"Learn how to generate a Celestia wallet using celestia-app.","frontmatter":{"description":"Learn how to generate a Celestia wallet using celestia-app.","head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-wallet.md","filePath":"nodes/celestia-app-wallet.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-app-wallet.md"},o=t(`

        Create a wallet with celestia-app

        For this guide, we will go over how you can generate a Celestia wallet using celestia-app.

        Prerequisites

        Note, you do not need to install celestia-node for this tutorial.

        Create a wallet

        First, create an application CLI configuration file:

        sh
        celestia-appd config keyring-backend test
        celestia-appd config keyring-backend test

        You can pick whatever wallet name you want. For our example we used "validator" as the wallet name:

        sh
        celestia-appd keys add validator --interactive
        celestia-appd keys add validator --interactive

        Save the mnemonic output as this is the only way to recover your validator wallet in case you lose it!

        To check all your wallets you can run:

        sh
        celestia-appd keys list
        celestia-appd keys list

        Fund a wallet

        For the public celestia address, you can fund the previously created wallet via Discord by sending this message to either the #mocha-faucet or #arabica-faucet channel:

        text
        $request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        $request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

        Wait to see if you get a confirmation that the tokens have been successfully sent. To check if tokens have arrived successfully to the destination wallet run the command below replacing the public address with your own:

        sh
        celestia-appd start
        +import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Create a wallet with celestia-app","description":"Learn how to generate a Celestia wallet using celestia-app.","frontmatter":{"description":"Learn how to generate a Celestia wallet using celestia-app.","head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-wallet.md","filePath":"nodes/celestia-app-wallet.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-app-wallet.md"},o=t(`

        Create a wallet with celestia-app

        For this guide, we will go over how you can generate a Celestia wallet using celestia-app.

        Prerequisites

        Note, you do not need to install celestia-node for this tutorial.

        Create a wallet

        First, create an application CLI configuration file:

        sh
        celestia-appd config keyring-backend test
        celestia-appd config keyring-backend test

        You can pick whatever wallet name you want. For our example we used "validator" as the wallet name:

        sh
        celestia-appd keys add validator --interactive
        celestia-appd keys add validator --interactive

        Save the mnemonic output as this is the only way to recover your validator wallet in case you lose it!

        To check all your wallets you can run:

        sh
        celestia-appd keys list
        celestia-appd keys list

        Fund a wallet

        For the public celestia address, you can fund the previously created wallet via Discord by sending this message to either the #mocha-faucet or #arabica-faucet channel:

        text
        $request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        $request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

        Wait to see if you get a confirmation that the tokens have been successfully sent. To check if tokens have arrived successfully to the destination wallet run the command below replacing the public address with your own:

        sh
        celestia-appd start
         celestia-appd query bank balances celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        celestia-appd start
         celestia-appd query bank balances celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

        TIP

        Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

        `,19),n=[o];function p(c,r,i,x,d,h){return e(),s("div",null,n)}const E=a(l,[["render",p]]);export{u as __pageData,E as default}; diff --git a/pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.lean.js b/pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.lean.js similarity index 91% rename from pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.lean.js rename to pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.lean.js index a82453b78d..5debe475be 100644 --- a/pr-1699/assets/nodes_celestia-app-wallet.md.47e26967.lean.js +++ b/pr-1699/assets/nodes_celestia-app-wallet.md.70b5fba3.lean.js @@ -1 +1 @@ -import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Create a wallet with celestia-app","description":"Learn how to generate a Celestia wallet using celestia-app.","frontmatter":{"description":"Learn how to generate a Celestia wallet using celestia-app.","head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-wallet.md","filePath":"nodes/celestia-app-wallet.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-app-wallet.md"},o=t("",19),n=[o];function p(c,r,i,x,d,h){return e(),s("div",null,n)}const E=a(l,[["render",p]]);export{u as __pageData,E as default}; +import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.b47e54aa.js";const u=JSON.parse('{"title":"Create a wallet with celestia-app","description":"Learn how to generate a Celestia wallet using celestia-app.","frontmatter":{"description":"Learn how to generate a Celestia wallet using celestia-app.","head":[["meta",{"name":"og:title","content":"Create a wallet with celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app-wallet.md","filePath":"nodes/celestia-app-wallet.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-app-wallet.md"},o=t("",19),n=[o];function p(c,r,i,x,d,h){return e(),s("div",null,n)}const E=a(l,[["render",p]]);export{u as __pageData,E as default}; diff --git a/pr-1699/assets/nodes_celestia-app.md.6fd2fd36.js b/pr-1699/assets/nodes_celestia-app.md.e09a3b72.js similarity index 82% rename from pr-1699/assets/nodes_celestia-app.md.6fd2fd36.js rename to pr-1699/assets/nodes_celestia-app.md.e09a3b72.js index 67e00cfbe5..c87309b912 100644 --- a/pr-1699/assets/nodes_celestia-app.md.6fd2fd36.js +++ b/pr-1699/assets/nodes_celestia-app.md.e09a3b72.js @@ -4,4 +4,4 @@ import{a as o}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./c cd celestia-app
        cd $HOME
         rm -rf celestia-app
         git clone https://github.com/celestiaorg/celestia-app.git
        -cd celestia-app
      22. `,1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=a('
        ',1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},m={class:"line"},F=s("span",{style:{color:"#B392F0"}},"git",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),v=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),f=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},w={class:"line"},B=s("span",{style:{color:"#6F42C1"}},"git",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),V={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},L=s("button",{title:"Copy Code",class:"copy"},null,-1),q=s("span",{class:"lang"},"bash",-1),D={class:"shiki github-dark vp-code-dark"},x={class:"line"},M=s("span",{style:{color:"#B392F0"}},"git",-1),N=s("span",{style:{color:"#E1E4E8"}}," ",-1),R=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),H=s("span",{style:{color:"#E1E4E8"}}," ",-1),O={style:{color:"#9ECBFF"}},$={class:"shiki github-light vp-code-light"},W={class:"line"},j=s("span",{style:{color:"#6F42C1"}},"git",-1),J=s("span",{style:{color:"#24292E"}}," ",-1),Q=s("span",{style:{color:"#032F62"}},"checkout",-1),X=s("span",{style:{color:"#24292E"}}," ",-1),K={style:{color:"#032F62"}},U={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),z={class:"shiki github-dark vp-code-dark"},G={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),os={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},ps=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=a('
      23. Build and install the celestia-appd binary:

        bash
        make install
        make install
      24. To check if the binary was successfully installed you can run the binary using the --help flag:

        sh
        celestia-appd --help
        celestia-appd --help
      25. ',2),_s=a('

        You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

        Installing a pre-built binary

        Installing a pre-built binary is the fastest way to get started with your Celestia consensus node. Releases after celestia-app v1.3.0 should have these binaries available.

        The steps below will download a binary file named celestia-appd. Depending on the setup that you choose during installation, the celestia-appd binary will be available at either:

        • $HOME/celestia-app-temp/celestia-appd
        • /usr/local/bin/celestia-appd

        Pre-built binaries are available for:

        • Operating systems: Darwin (Apple), Linux
        • Architectures: x86_64 (amd64), arm64

        To install the latest pre-built binary you can run this command in your terminal:

        bash
        bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"
        bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"

        Follow the instructions in the terminal output to choose your installation preferences.

        You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

        View the script to learn more about what it is doing.

        Ports

        When interacting with a consensus node, you may need to open ports on your machine to allow communication between nodes, such as bridge nodes. It is essential that specific ports are accessible. Make sure that your firewall allows connections to the correct ports.

        If you run a node on a cloud server, make sure that the ports are open on the server's firewall. If you run a node at home, make sure that your router allows connections to the correct ports.

        For example, validator ports 9090 and 26657 need to be accessible by the bridge, and port 2121 is required for P2P connections for all node types.

        The following ports are used by Celestia app nodes:

        PortProtocolAddressDescriptionEnabled by default on nodeFlag
        2121TCP/UDPlocalhostP2PtrueN/A
        9090HTTP0.0.0.0gRPCtrue--grpc.address string
        26657TCPlocalhostRPCfalse (only open to localhost)--rpc.laddr string
        ',18),vs=JSON.parse('{"title":"Install celestia-app","description":"Learn how you can build celestia-app.","frontmatter":{"description":"Learn how you can build celestia-app.","head":[["meta",{"name":"og:title","content":"Install celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app.md","filePath":"nodes/celestia-app.md","lastUpdated":1725971357000}'),us={name:"nodes/celestia-app.md"},fs=Object.assign(us,{setup(ys){return(bs,gs)=>(p(),c("div",null,[i,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[b,g,s("pre",E,[s("code",null,[s("span",m,[F,C,v,f,s("span",k,"tags/"+e(t(n)["app-latest-tag"]),1)])])]),s("pre",T,[s("code",null,[s("span",w,[B,P,A,I,s("span",V,"tags/"+e(t(n)["app-latest-tag"]),1)])])])]),s("div",S,[L,q,s("pre",D,[s("code",null,[s("span",x,[M,N,R,H,s("span",O,"tags/"+e(t(l)["app-latest-tag"]),1)])])]),s("pre",$,[s("code",null,[s("span",W,[j,J,Q,X,s("span",K,"tags/"+e(t(l)["app-latest-tag"]),1)])])])]),s("div",U,[Y,Z,s("pre",z,[s("code",null,[s("span",G,[ss,es,ts,as,s("span",os,"tags/"+e(t(o)["app-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[ps,cs,is,rs,s("span",ds,"tags/"+e(t(o)["app-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{vs as __pageData,fs as default}; +cd celestia-app
    2. `,1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=a('
      ',1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},F=s("span",{style:{color:"#B392F0"}},"git",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),v=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),f=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},B={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),I=s("span",{style:{color:"#032F62"}},"checkout",-1),A=s("span",{style:{color:"#24292E"}}," ",-1),q={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},V=s("button",{title:"Copy Code",class:"copy"},null,-1),D=s("span",{class:"lang"},"bash",-1),x={class:"shiki github-dark vp-code-dark"},L={class:"line"},N=s("span",{style:{color:"#B392F0"}},"git",-1),R=s("span",{style:{color:"#E1E4E8"}}," ",-1),G=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),M=s("span",{style:{color:"#E1E4E8"}}," ",-1),O={style:{color:"#9ECBFF"}},J={class:"shiki github-light vp-code-light"},$={class:"line"},H=s("span",{style:{color:"#6F42C1"}},"git",-1),U=s("span",{style:{color:"#24292E"}}," ",-1),Z=s("span",{style:{color:"#032F62"}},"checkout",-1),j=s("span",{style:{color:"#24292E"}}," ",-1),z={style:{color:"#032F62"}},K={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),Q=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},X={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),os={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},ps=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=a('
    3. Build and install the celestia-appd binary:

      bash
      make install
      make install
    4. To check if the binary was successfully installed you can run the binary using the --help flag:

      sh
      celestia-appd --help
      celestia-appd --help
    5. ',2),_s=a('

      You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

      Installing a pre-built binary

      Installing a pre-built binary is the fastest way to get started with your Celestia consensus node. Releases after celestia-app v1.3.0 should have these binaries available.

      The steps below will download a binary file named celestia-appd. Depending on the setup that you choose during installation, the celestia-appd binary will be available at either:

      • $HOME/celestia-app-temp/celestia-appd
      • /usr/local/bin/celestia-appd

      Pre-built binaries are available for:

      • Operating systems: Darwin (Apple), Linux
      • Architectures: x86_64 (amd64), arm64

      To install the latest pre-built binary you can run this command in your terminal:

      bash
      bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"
      bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"

      Follow the instructions in the terminal output to choose your installation preferences.

      You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

      View the script to learn more about what it is doing.

      Ports

      When interacting with a consensus node, you may need to open ports on your machine to allow communication between nodes, such as bridge nodes. It is essential that specific ports are accessible. Make sure that your firewall allows connections to the correct ports.

      If you run a node on a cloud server, make sure that the ports are open on the server's firewall. If you run a node at home, make sure that your router allows connections to the correct ports.

      For example, validator ports 9090 and 26657 need to be accessible by the bridge, and port 2121 is required for P2P connections for all node types.

      The following ports are used by Celestia app nodes:

      PortProtocolAddressDescriptionEnabled by default on nodeFlag
      2121TCP/UDPlocalhostP2PtrueN/A
      9090HTTP0.0.0.0gRPCtrue--grpc.address string
      26657TCPlocalhostRPCfalse (only open to localhost)--rpc.laddr string
      ',18),vs=JSON.parse('{"title":"Install celestia-app","description":"Learn how you can build celestia-app.","frontmatter":{"description":"Learn how you can build celestia-app.","head":[["meta",{"name":"og:title","content":"Install celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app.md","filePath":"nodes/celestia-app.md","lastUpdated":1725992025000}'),us={name:"nodes/celestia-app.md"},fs=Object.assign(us,{setup(ys){return(bs,gs)=>(p(),c("div",null,[i,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[b,g,s("pre",m,[s("code",null,[s("span",E,[F,C,v,f,s("span",k,"tags/"+e(t(n)["app-latest-tag"]),1)])])]),s("pre",T,[s("code",null,[s("span",B,[w,P,I,A,s("span",q,"tags/"+e(t(n)["app-latest-tag"]),1)])])])]),s("div",S,[V,D,s("pre",x,[s("code",null,[s("span",L,[N,R,G,M,s("span",O,"tags/"+e(t(l)["app-latest-tag"]),1)])])]),s("pre",J,[s("code",null,[s("span",$,[H,U,Z,j,s("span",z,"tags/"+e(t(l)["app-latest-tag"]),1)])])])]),s("div",K,[Y,Q,s("pre",W,[s("code",null,[s("span",X,[ss,es,ts,as,s("span",os,"tags/"+e(t(o)["app-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[ps,cs,is,rs,s("span",ds,"tags/"+e(t(o)["app-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{vs as __pageData,fs as default}; diff --git a/pr-1699/assets/nodes_celestia-app.md.6fd2fd36.lean.js b/pr-1699/assets/nodes_celestia-app.md.e09a3b72.lean.js similarity index 56% rename from pr-1699/assets/nodes_celestia-app.md.6fd2fd36.lean.js rename to pr-1699/assets/nodes_celestia-app.md.e09a3b72.lean.js index e96592f667..eb504352f6 100644 --- a/pr-1699/assets/nodes_celestia-app.md.6fd2fd36.lean.js +++ b/pr-1699/assets/nodes_celestia-app.md.e09a3b72.lean.js @@ -1 +1 @@ -import{a as o}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./chunks/mocha_versions.7704b055.js";import{m as n}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as p,c,k as s,t as e,l as t,Q as a}from"./chunks/framework.b47e54aa.js";const i=a("",5),r=a("",1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=a("",1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),E={class:"shiki github-dark vp-code-dark"},m={class:"line"},F=s("span",{style:{color:"#B392F0"}},"git",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),v=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),f=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},w={class:"line"},B=s("span",{style:{color:"#6F42C1"}},"git",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),V={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},L=s("button",{title:"Copy Code",class:"copy"},null,-1),q=s("span",{class:"lang"},"bash",-1),D={class:"shiki github-dark vp-code-dark"},x={class:"line"},M=s("span",{style:{color:"#B392F0"}},"git",-1),N=s("span",{style:{color:"#E1E4E8"}}," ",-1),R=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),H=s("span",{style:{color:"#E1E4E8"}}," ",-1),O={style:{color:"#9ECBFF"}},$={class:"shiki github-light vp-code-light"},W={class:"line"},j=s("span",{style:{color:"#6F42C1"}},"git",-1),J=s("span",{style:{color:"#24292E"}}," ",-1),Q=s("span",{style:{color:"#032F62"}},"checkout",-1),X=s("span",{style:{color:"#24292E"}}," ",-1),K={style:{color:"#032F62"}},U={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),z={class:"shiki github-dark vp-code-dark"},G={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),os={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},ps=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=a("",2),_s=a("",18),vs=JSON.parse('{"title":"Install celestia-app","description":"Learn how you can build celestia-app.","frontmatter":{"description":"Learn how you can build celestia-app.","head":[["meta",{"name":"og:title","content":"Install celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app.md","filePath":"nodes/celestia-app.md","lastUpdated":1725971357000}'),us={name:"nodes/celestia-app.md"},fs=Object.assign(us,{setup(ys){return(bs,gs)=>(p(),c("div",null,[i,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[b,g,s("pre",E,[s("code",null,[s("span",m,[F,C,v,f,s("span",k,"tags/"+e(t(n)["app-latest-tag"]),1)])])]),s("pre",T,[s("code",null,[s("span",w,[B,P,A,I,s("span",V,"tags/"+e(t(n)["app-latest-tag"]),1)])])])]),s("div",S,[L,q,s("pre",D,[s("code",null,[s("span",x,[M,N,R,H,s("span",O,"tags/"+e(t(l)["app-latest-tag"]),1)])])]),s("pre",$,[s("code",null,[s("span",W,[j,J,Q,X,s("span",K,"tags/"+e(t(l)["app-latest-tag"]),1)])])])]),s("div",U,[Y,Z,s("pre",z,[s("code",null,[s("span",G,[ss,es,ts,as,s("span",os,"tags/"+e(t(o)["app-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[ps,cs,is,rs,s("span",ds,"tags/"+e(t(o)["app-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{vs as __pageData,fs as default}; +import{a as o}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./chunks/mocha_versions.7704b055.js";import{m as n}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as p,c,k as s,t as e,l as t,Q as a}from"./chunks/framework.b47e54aa.js";const i=a("",5),r=a("",1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=a("",1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},F=s("span",{style:{color:"#B392F0"}},"git",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),v=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),f=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},B={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),I=s("span",{style:{color:"#032F62"}},"checkout",-1),A=s("span",{style:{color:"#24292E"}}," ",-1),q={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},V=s("button",{title:"Copy Code",class:"copy"},null,-1),D=s("span",{class:"lang"},"bash",-1),x={class:"shiki github-dark vp-code-dark"},L={class:"line"},N=s("span",{style:{color:"#B392F0"}},"git",-1),R=s("span",{style:{color:"#E1E4E8"}}," ",-1),G=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),M=s("span",{style:{color:"#E1E4E8"}}," ",-1),O={style:{color:"#9ECBFF"}},J={class:"shiki github-light vp-code-light"},$={class:"line"},H=s("span",{style:{color:"#6F42C1"}},"git",-1),U=s("span",{style:{color:"#24292E"}}," ",-1),Z=s("span",{style:{color:"#032F62"}},"checkout",-1),j=s("span",{style:{color:"#24292E"}}," ",-1),z={style:{color:"#032F62"}},K={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),Q=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},X={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),os={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},ps=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=a("",2),_s=a("",18),vs=JSON.parse('{"title":"Install celestia-app","description":"Learn how you can build celestia-app.","frontmatter":{"description":"Learn how you can build celestia-app.","head":[["meta",{"name":"og:title","content":"Install celestia-app | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-app.md","filePath":"nodes/celestia-app.md","lastUpdated":1725992025000}'),us={name:"nodes/celestia-app.md"},fs=Object.assign(us,{setup(ys){return(bs,gs)=>(p(),c("div",null,[i,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[b,g,s("pre",m,[s("code",null,[s("span",E,[F,C,v,f,s("span",k,"tags/"+e(t(n)["app-latest-tag"]),1)])])]),s("pre",T,[s("code",null,[s("span",B,[w,P,I,A,s("span",q,"tags/"+e(t(n)["app-latest-tag"]),1)])])])]),s("div",S,[V,D,s("pre",x,[s("code",null,[s("span",L,[N,R,G,M,s("span",O,"tags/"+e(t(l)["app-latest-tag"]),1)])])]),s("pre",J,[s("code",null,[s("span",$,[H,U,Z,j,s("span",z,"tags/"+e(t(l)["app-latest-tag"]),1)])])])]),s("div",K,[Y,Q,s("pre",W,[s("code",null,[s("span",X,[ss,es,ts,as,s("span",os,"tags/"+e(t(o)["app-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[ps,cs,is,rs,s("span",ds,"tags/"+e(t(o)["app-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{vs as __pageData,fs as default}; diff --git a/pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.js b/pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.js similarity index 99% rename from pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.js rename to pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.js index 0ed4b67d96..084c5c6c37 100644 --- a/pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.js +++ b/pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.js @@ -1 +1 @@ -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Custom networks and values","description":"Learn about custom networks and values on celestia-node.","frontmatter":{"description":"Learn about custom networks and values on celestia-node.","head":[["meta",{"name":"og:title","content":"Custom networks and values | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-custom-networks.md","filePath":"nodes/celestia-node-custom-networks.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-node-custom-networks.md"},l=n('

      Custom networks and values

      This section will cover importing bootstrapper IDs, chain ID, and network ID. This will allow you to import custom values for a chain that is not in the default configuration.

      If you have a custom network you can export CELESTIA_CUSTOM, which will look something like:

      bash
      export BRIDGE="/ip4/<ip-address>/tcp/2121/p2p/<node-ID>"\nexport GENESIS_HASH=<genesis-hash>\nexport NETWORK=<network-name>\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"
      export BRIDGE="/ip4/<ip-address>/tcp/2121/p2p/<node-ID>"\nexport GENESIS_HASH=<genesis-hash>\nexport NETWORK=<network-name>\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

      Query your node ID using the RPC CLI. These values with examples would look like:

      bash
      export BRIDGE="/ip4/151.115.14.33/tcp/2121/p2p/12D3KooWKEeRtzVMPUdxYsZo2edqps6mS67n6LT5mPdULSkPSxBQ"\nexport GENESIS_HASH=580B3DFF8A7C716968161D91116A1E171F486298D582874E93714E489C9E6E88\nexport NETWORK=custom\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"
      export BRIDGE="/ip4/151.115.14.33/tcp/2121/p2p/12D3KooWKEeRtzVMPUdxYsZo2edqps6mS67n6LT5mPdULSkPSxBQ"\nexport GENESIS_HASH=580B3DFF8A7C716968161D91116A1E171F486298D582874E93714E489C9E6E88\nexport NETWORK=custom\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

      Then, start your node with:

      bash
      celestia <node-type> start [flags...]
      celestia <node-type> start [flags...]
      ',8),e=[l];function t(c,r,E,y,i,d){return a(),o("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default}; +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Custom networks and values","description":"Learn about custom networks and values on celestia-node.","frontmatter":{"description":"Learn about custom networks and values on celestia-node.","head":[["meta",{"name":"og:title","content":"Custom networks and values | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-custom-networks.md","filePath":"nodes/celestia-node-custom-networks.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-node-custom-networks.md"},l=n('

      Custom networks and values

      This section will cover importing bootstrapper IDs, chain ID, and network ID. This will allow you to import custom values for a chain that is not in the default configuration.

      If you have a custom network you can export CELESTIA_CUSTOM, which will look something like:

      bash
      export BRIDGE="/ip4/<ip-address>/tcp/2121/p2p/<node-ID>"\nexport GENESIS_HASH=<genesis-hash>\nexport NETWORK=<network-name>\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"
      export BRIDGE="/ip4/<ip-address>/tcp/2121/p2p/<node-ID>"\nexport GENESIS_HASH=<genesis-hash>\nexport NETWORK=<network-name>\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

      Query your node ID using the RPC CLI. These values with examples would look like:

      bash
      export BRIDGE="/ip4/151.115.14.33/tcp/2121/p2p/12D3KooWKEeRtzVMPUdxYsZo2edqps6mS67n6LT5mPdULSkPSxBQ"\nexport GENESIS_HASH=580B3DFF8A7C716968161D91116A1E171F486298D582874E93714E489C9E6E88\nexport NETWORK=custom\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"
      export BRIDGE="/ip4/151.115.14.33/tcp/2121/p2p/12D3KooWKEeRtzVMPUdxYsZo2edqps6mS67n6LT5mPdULSkPSxBQ"\nexport GENESIS_HASH=580B3DFF8A7C716968161D91116A1E171F486298D582874E93714E489C9E6E88\nexport NETWORK=custom\nexport CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

      Then, start your node with:

      bash
      celestia <node-type> start [flags...]
      celestia <node-type> start [flags...]
      ',8),e=[l];function t(c,r,E,y,i,d){return a(),o("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default}; diff --git a/pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.lean.js b/pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.lean.js similarity index 91% rename from pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.lean.js rename to pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.lean.js index 3ccdf6c477..fd3bd9ac59 100644 --- a/pr-1699/assets/nodes_celestia-node-custom-networks.md.759a61e7.lean.js +++ b/pr-1699/assets/nodes_celestia-node-custom-networks.md.aac3b114.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Custom networks and values","description":"Learn about custom networks and values on celestia-node.","frontmatter":{"description":"Learn about custom networks and values on celestia-node.","head":[["meta",{"name":"og:title","content":"Custom networks and values | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-custom-networks.md","filePath":"nodes/celestia-node-custom-networks.md","lastUpdated":1725971357000}'),p={name:"nodes/celestia-node-custom-networks.md"},l=n("",8),e=[l];function t(c,r,E,y,i,d){return a(),o("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default}; +import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.b47e54aa.js";const F=JSON.parse('{"title":"Custom networks and values","description":"Learn about custom networks and values on celestia-node.","frontmatter":{"description":"Learn about custom networks and values on celestia-node.","head":[["meta",{"name":"og:title","content":"Custom networks and values | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-custom-networks.md","filePath":"nodes/celestia-node-custom-networks.md","lastUpdated":1725992025000}'),p={name:"nodes/celestia-node-custom-networks.md"},l=n("",8),e=[l];function t(c,r,E,y,i,d){return a(),o("div",null,e)}const h=s(p,[["render",t]]);export{F as __pageData,h as default}; diff --git a/pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.js b/pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.js similarity index 99% rename from pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.js rename to pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.js index b416d27450..9084431f33 100644 --- a/pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.js +++ b/pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"celestia-node metrics","description":"A guide on how to run metrics for your celestia-node DA instance.","frontmatter":{"description":"A guide on how to run metrics for your celestia-node DA instance.","head":[["meta",{"name":"og:title","content":"celestia-node metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-metrics.md","filePath":"nodes/celestia-node-metrics.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-node-metrics.md"},e=o(`

      celestia-node metrics

      This tutorial is for running metrics for your celestia-node data availability instance. This tutorial will focus on running metrics for a light node.

      This tutorial assumes you have already setup your light node by following the tutorial in the celestia-node API tutorial.

      Running metrics flags

      You can enable the celestia-node metric flags with the following command:

      sh
      celestia <node-type> start --metrics.tls=<boolean> \\
      +import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"celestia-node metrics","description":"A guide on how to run metrics for your celestia-node DA instance.","frontmatter":{"description":"A guide on how to run metrics for your celestia-node DA instance.","head":[["meta",{"name":"og:title","content":"celestia-node metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-metrics.md","filePath":"nodes/celestia-node-metrics.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-node-metrics.md"},e=o(`

      celestia-node metrics

      This tutorial is for running metrics for your celestia-node data availability instance. This tutorial will focus on running metrics for a light node.

      This tutorial assumes you have already setup your light node by following the tutorial in the celestia-node API tutorial.

      Running metrics flags

      You can enable the celestia-node metric flags with the following command:

      sh
      celestia <node-type> start --metrics.tls=<boolean> \\
           --metrics --metrics.endpoint <URI> \\
           --p2p.network <network> --core.ip <URI>
      celestia <node-type> start --metrics.tls=<boolean> \\
           --metrics --metrics.endpoint <URI> \\
      diff --git a/pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.lean.js b/pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.lean.js
      similarity index 91%
      rename from pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.lean.js
      rename to pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.lean.js
      index b419432690..e0b3bc4049 100644
      --- a/pr-1699/assets/nodes_celestia-node-metrics.md.6d2f305e.lean.js
      +++ b/pr-1699/assets/nodes_celestia-node-metrics.md.e49bb967.lean.js
      @@ -1 +1 @@
      -import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"celestia-node metrics","description":"A guide on how to run metrics for your celestia-node DA instance.","frontmatter":{"description":"A guide on how to run metrics for your celestia-node DA instance.","head":[["meta",{"name":"og:title","content":"celestia-node metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-metrics.md","filePath":"nodes/celestia-node-metrics.md","lastUpdated":1725971357000}'),l={name:"nodes/celestia-node-metrics.md"},e=o("",27),p=[e];function t(c,r,y,i,E,d){return n(),a("div",null,p)}const m=s(l,[["render",t]]);export{h as __pageData,m as default};
      +import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"celestia-node metrics","description":"A guide on how to run metrics for your celestia-node DA instance.","frontmatter":{"description":"A guide on how to run metrics for your celestia-node DA instance.","head":[["meta",{"name":"og:title","content":"celestia-node metrics | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-metrics.md","filePath":"nodes/celestia-node-metrics.md","lastUpdated":1725992025000}'),l={name:"nodes/celestia-node-metrics.md"},e=o("",27),p=[e];function t(c,r,y,i,E,d){return n(),a("div",null,p)}const m=s(l,[["render",t]]);export{h as __pageData,m as default};
      diff --git a/pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.js b/pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.js
      similarity index 99%
      rename from pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.js
      rename to pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.js
      index ecd9ca4434..bdc5167be1 100644
      --- a/pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.js
      +++ b/pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.js
      @@ -58,4 +58,4 @@ import{c as n}from"./chunks/constants.295fc0ab.js";import{o as p,c as t,k as s,a
       ...
      [Service]
       ...
       LimitNOFILE=1400000
      -...

      NOTE

      Be cautious when increasing file descriptor limits. Setting this value too high might affect system performance. Ensure the value is appropriate for your system's capabilities.

      1. Reload daemon and restart bridge service:
      bash
      sudo systemctl daemon-reload
      sudo systemctl daemon-reload
      bash
      sudo systemctl restart celestia-bridge
      sudo systemctl restart celestia-bridge
      `,70),A=JSON.parse('{"title":"Troubleshooting","description":"A guide to troubleshooting common issues with Celestia Node.","frontmatter":{"description":"A guide to troubleshooting common issues with Celestia Node.","next":{"text":"Metrics, visualization, and alerts","link":"nodes/celestia-app-metrics"},"head":[["meta",{"name":"og:title","content":"Troubleshooting | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-troubleshooting.md","filePath":"nodes/celestia-node-troubleshooting.md","lastUpdated":1725971357000}'),b={name:"nodes/celestia-node-troubleshooting.md"},w=Object.assign(b,{setup(B){return(m,k)=>(p(),t("div",null,[r,s("p",null,[a("When interacting with celestia-node, it is important to take into account the different chain IDs for different networks. For Mainnet Beta, there is no need to declare a chain ID, as the default is "+o(l(n).mainnetChainId)+", ",1),c,a(" no "),i,a(" flag is required for Mainnet Beta.")]),s("table",null,[y,s("tbody",null,[s("tr",null,[E,s("td",null,o(l(n).mainnetChainId),1),d]),s("tr",null,[h,s("td",null,o(l(n).mochaChainId),1),F]),s("tr",null,[u,s("td",null,o(l(n).arabicaChainId),1),g])])]),C]))}});export{A as __pageData,w as default}; +...

      NOTE

      Be cautious when increasing file descriptor limits. Setting this value too high might affect system performance. Ensure the value is appropriate for your system's capabilities.

      1. Reload daemon and restart bridge service:
      bash
      sudo systemctl daemon-reload
      sudo systemctl daemon-reload
      bash
      sudo systemctl restart celestia-bridge
      sudo systemctl restart celestia-bridge
      `,70),A=JSON.parse('{"title":"Troubleshooting","description":"A guide to troubleshooting common issues with Celestia Node.","frontmatter":{"description":"A guide to troubleshooting common issues with Celestia Node.","next":{"text":"Metrics, visualization, and alerts","link":"nodes/celestia-app-metrics"},"head":[["meta",{"name":"og:title","content":"Troubleshooting | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-troubleshooting.md","filePath":"nodes/celestia-node-troubleshooting.md","lastUpdated":1725992025000}'),b={name:"nodes/celestia-node-troubleshooting.md"},w=Object.assign(b,{setup(B){return(m,k)=>(p(),t("div",null,[r,s("p",null,[a("When interacting with celestia-node, it is important to take into account the different chain IDs for different networks. For Mainnet Beta, there is no need to declare a chain ID, as the default is "+o(l(n).mainnetChainId)+", ",1),c,a(" no "),i,a(" flag is required for Mainnet Beta.")]),s("table",null,[y,s("tbody",null,[s("tr",null,[E,s("td",null,o(l(n).mainnetChainId),1),d]),s("tr",null,[h,s("td",null,o(l(n).mochaChainId),1),F]),s("tr",null,[u,s("td",null,o(l(n).arabicaChainId),1),g])])]),C]))}});export{A as __pageData,w as default}; diff --git a/pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.lean.js b/pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.lean.js similarity index 96% rename from pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.lean.js rename to pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.lean.js index d445866262..00ebb9c9f8 100644 --- a/pr-1699/assets/nodes_celestia-node-troubleshooting.md.6134a7ab.lean.js +++ b/pr-1699/assets/nodes_celestia-node-troubleshooting.md.d5102d28.lean.js @@ -1 +1 @@ -import{c as n}from"./chunks/constants.295fc0ab.js";import{o as p,c as t,k as s,a,t as o,l,Q as e}from"./chunks/framework.b47e54aa.js";const r=e("",7),c=s("em",null,"i.e.",-1),i=s("code",null,"--p2p.network string",-1),y=s("thead",null,[s("tr",null,[s("th",null,"Network"),s("th",null,"Chain ID"),s("th",null,[s("code",null,"--p2p.network string")])])],-1),E=s("td",null,"Mainnet Beta",-1),d=s("td",null,[a("not required ("),s("code",null,"--p2p.network celestia"),a(")")],-1),h=s("td",null,"Mocha",-1),F=s("td",null,[s("code",null,"--p2p.network mocha")],-1),u=s("td",null,"Arabica",-1),g=s("td",null,[s("code",null,"--p2p.network arabica")],-1),C=e("",70),A=JSON.parse('{"title":"Troubleshooting","description":"A guide to troubleshooting common issues with Celestia Node.","frontmatter":{"description":"A guide to troubleshooting common issues with Celestia Node.","next":{"text":"Metrics, visualization, and alerts","link":"nodes/celestia-app-metrics"},"head":[["meta",{"name":"og:title","content":"Troubleshooting | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-troubleshooting.md","filePath":"nodes/celestia-node-troubleshooting.md","lastUpdated":1725971357000}'),b={name:"nodes/celestia-node-troubleshooting.md"},w=Object.assign(b,{setup(B){return(m,k)=>(p(),t("div",null,[r,s("p",null,[a("When interacting with celestia-node, it is important to take into account the different chain IDs for different networks. For Mainnet Beta, there is no need to declare a chain ID, as the default is "+o(l(n).mainnetChainId)+", ",1),c,a(" no "),i,a(" flag is required for Mainnet Beta.")]),s("table",null,[y,s("tbody",null,[s("tr",null,[E,s("td",null,o(l(n).mainnetChainId),1),d]),s("tr",null,[h,s("td",null,o(l(n).mochaChainId),1),F]),s("tr",null,[u,s("td",null,o(l(n).arabicaChainId),1),g])])]),C]))}});export{A as __pageData,w as default}; +import{c as n}from"./chunks/constants.295fc0ab.js";import{o as p,c as t,k as s,a,t as o,l,Q as e}from"./chunks/framework.b47e54aa.js";const r=e("",7),c=s("em",null,"i.e.",-1),i=s("code",null,"--p2p.network string",-1),y=s("thead",null,[s("tr",null,[s("th",null,"Network"),s("th",null,"Chain ID"),s("th",null,[s("code",null,"--p2p.network string")])])],-1),E=s("td",null,"Mainnet Beta",-1),d=s("td",null,[a("not required ("),s("code",null,"--p2p.network celestia"),a(")")],-1),h=s("td",null,"Mocha",-1),F=s("td",null,[s("code",null,"--p2p.network mocha")],-1),u=s("td",null,"Arabica",-1),g=s("td",null,[s("code",null,"--p2p.network arabica")],-1),C=e("",70),A=JSON.parse('{"title":"Troubleshooting","description":"A guide to troubleshooting common issues with Celestia Node.","frontmatter":{"description":"A guide to troubleshooting common issues with Celestia Node.","next":{"text":"Metrics, visualization, and alerts","link":"nodes/celestia-app-metrics"},"head":[["meta",{"name":"og:title","content":"Troubleshooting | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-troubleshooting.md","filePath":"nodes/celestia-node-troubleshooting.md","lastUpdated":1725992025000}'),b={name:"nodes/celestia-node-troubleshooting.md"},w=Object.assign(b,{setup(B){return(m,k)=>(p(),t("div",null,[r,s("p",null,[a("When interacting with celestia-node, it is important to take into account the different chain IDs for different networks. For Mainnet Beta, there is no need to declare a chain ID, as the default is "+o(l(n).mainnetChainId)+", ",1),c,a(" no "),i,a(" flag is required for Mainnet Beta.")]),s("table",null,[y,s("tbody",null,[s("tr",null,[E,s("td",null,o(l(n).mainnetChainId),1),d]),s("tr",null,[h,s("td",null,o(l(n).mochaChainId),1),F]),s("tr",null,[u,s("td",null,o(l(n).arabicaChainId),1),g])])]),C]))}});export{A as __pageData,w as default}; diff --git a/pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.js b/pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.js similarity index 99% rename from pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.js rename to pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.js index b7a813afe4..5a36b546d6 100644 --- a/pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.js +++ b/pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.js @@ -1,3 +1,3 @@ -import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Syncing a light node from a trusted hash","description":"How to sync a light node from a trusted hash.","frontmatter":{"description":"How to sync a light node from a trusted hash.","head":[["meta",{"name":"og:title","content":"Syncing a light node from a trusted hash | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-trusted-hash.md","filePath":"nodes/celestia-node-trusted-hash.md","lastUpdated":1725971357000}'),t={name:"nodes/celestia-node-trusted-hash.md"},n=o(`

      Syncing a light node from a trusted hash

      This guide goes over how to sync a DA light node from a trusted hash. The example is with Mainnet Beta. You will need to adjust the commands accordingly for Mocha, Arabica, or a custom network.

      WARNING

      Syncing to a trusted hash means that you will not sample the entire chain. This adds a trust assumption that you trust the history of the chain up to that point and that you trust the entity where you get the hash from. In this example, the trusted entity is a consensus endpoint or Celenium

      1. Get trusted height & hash from a consensus endpoint or Celenium.

      2. Initialize the node store

        sh
        celestia light init --p2p.network <network>
        celestia light init --p2p.network <network>
      3. Set the trusted height & hash

        1. Open your config.toml at .celestia-light/config.toml (or .celestia-light-<other-network>/config.toml)
        2. Set DASer.SampleFrom to the trusted height (e.g. SampleFrom = 123456)
      4. Run the node with the hash and flag:

      sh
      celestia light start --headers.trusted-hash <hash_of_block_n> \\
      +import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Syncing a light node from a trusted hash","description":"How to sync a light node from a trusted hash.","frontmatter":{"description":"How to sync a light node from a trusted hash.","head":[["meta",{"name":"og:title","content":"Syncing a light node from a trusted hash | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-trusted-hash.md","filePath":"nodes/celestia-node-trusted-hash.md","lastUpdated":1725992025000}'),t={name:"nodes/celestia-node-trusted-hash.md"},n=o(`

      Syncing a light node from a trusted hash

      This guide goes over how to sync a DA light node from a trusted hash. The example is with Mainnet Beta. You will need to adjust the commands accordingly for Mocha, Arabica, or a custom network.

      WARNING

      Syncing to a trusted hash means that you will not sample the entire chain. This adds a trust assumption that you trust the history of the chain up to that point and that you trust the entity where you get the hash from. In this example, the trusted entity is a consensus endpoint or Celenium

      1. Get trusted height & hash from a consensus endpoint or Celenium.

      2. Initialize the node store

        sh
        celestia light init --p2p.network <network>
        celestia light init --p2p.network <network>
      3. Set the trusted height & hash

        1. Open your config.toml at .celestia-light/config.toml (or .celestia-light-<other-network>/config.toml)
        2. Set DASer.SampleFrom to the trusted height (e.g. SampleFrom = 123456)
      4. Run the node with the hash and flag:

      sh
      celestia light start --headers.trusted-hash <hash_of_block_n> \\
           --p2p.network <network> --core.ip <consensus-node-rpc>
      celestia light start --headers.trusted-hash <hash_of_block_n> \\
           --p2p.network <network> --core.ip <consensus-node-rpc>

      For service operators

      If you're using multiple light nodes for similar services like tracking the same rollup, it is recommended to use the same hash and height for them all services using the same starting height.

      `,7),l=[n];function p(r,c,i,h,d,y){return a(),e("div",null,l)}const u=s(t,[["render",p]]);export{g as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.lean.js b/pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.lean.js similarity index 91% rename from pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.lean.js rename to pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.lean.js index 500d1ea4bb..cf2de67c35 100644 --- a/pr-1699/assets/nodes_celestia-node-trusted-hash.md.4094be4e.lean.js +++ b/pr-1699/assets/nodes_celestia-node-trusted-hash.md.941c6f87.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Syncing a light node from a trusted hash","description":"How to sync a light node from a trusted hash.","frontmatter":{"description":"How to sync a light node from a trusted hash.","head":[["meta",{"name":"og:title","content":"Syncing a light node from a trusted hash | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-trusted-hash.md","filePath":"nodes/celestia-node-trusted-hash.md","lastUpdated":1725971357000}'),t={name:"nodes/celestia-node-trusted-hash.md"},n=o("",7),l=[n];function p(r,c,i,h,d,y){return a(),e("div",null,l)}const u=s(t,[["render",p]]);export{g as __pageData,u as default}; +import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Syncing a light node from a trusted hash","description":"How to sync a light node from a trusted hash.","frontmatter":{"description":"How to sync a light node from a trusted hash.","head":[["meta",{"name":"og:title","content":"Syncing a light node from a trusted hash | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node-trusted-hash.md","filePath":"nodes/celestia-node-trusted-hash.md","lastUpdated":1725992025000}'),t={name:"nodes/celestia-node-trusted-hash.md"},n=o("",7),l=[n];function p(r,c,i,h,d,y){return a(),e("div",null,l)}const u=s(t,[["render",p]]);export{g as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_celestia-node.md.2de1eba4.js b/pr-1699/assets/nodes_celestia-node.md.b506c65d.js similarity index 83% rename from pr-1699/assets/nodes_celestia-node.md.2de1eba4.js rename to pr-1699/assets/nodes_celestia-node.md.b506c65d.js index 0f626e14a1..3c1488c542 100644 --- a/pr-1699/assets/nodes_celestia-node.md.2de1eba4.js +++ b/pr-1699/assets/nodes_celestia-node.md.b506c65d.js @@ -4,4 +4,4 @@ import{a as t}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./c cd celestia-node/
      cd $HOME
       rm -rf celestia-node
       git clone https://github.com/celestiaorg/celestia-node.git
      -cd celestia-node/
      `,1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},u=o('
      ',1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},v=s("span",{style:{color:"#B392F0"}},"git",-1),F=s("span",{style:{color:"#E1E4E8"}}," ",-1),k=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),f={style:{color:"#9ECBFF"}},B={class:"shiki github-light vp-code-light"},T={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),S={style:{color:"#032F62"}},V={class:"language-bash vp-adaptive-theme"},N=s("button",{title:"Copy Code",class:"copy"},null,-1),x=s("span",{class:"lang"},"bash",-1),q={class:"shiki github-dark vp-code-dark"},D={class:"line"},R=s("span",{style:{color:"#B392F0"}},"git",-1),O=s("span",{style:{color:"#E1E4E8"}}," ",-1),L=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),M=s("span",{style:{color:"#E1E4E8"}}," ",-1),j={style:{color:"#9ECBFF"}},U={class:"shiki github-light vp-code-light"},$={class:"line"},H=s("span",{style:{color:"#6F42C1"}},"git",-1),J=s("span",{style:{color:"#24292E"}}," ",-1),G=s("span",{style:{color:"#032F62"}},"checkout",-1),X=s("span",{style:{color:"#24292E"}}," ",-1),Q={style:{color:"#032F62"}},Y={class:"language-bash vp-adaptive-theme"},z=s("button",{title:"Copy Code",class:"copy"},null,-1),K=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},Z={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),as=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),os=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},is=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),ps=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=o('
    6. Build the celestia binary:

      a. Standard build

      bash
      make build
      make build

      b. Experimental build

      OPTIONAL

      If you're a node operator comfortable with experimental features and seeking optimal performance with minimal RAM usage, this option is recommended for you.

      bash
      make build-jemalloc
      make build-jemalloc

      This build option enables CGO, and downloads and installs jemalloc. Learn more about the build command.

    7. Install the binary:

      bash
      make install
      make install
    8. Build the cel-key utility:

      bash
      make cel-key
      make cel-key
    9. Verify that the binary is working and check the version:

      bash
      celestia version
      celestia version
    10. ',4),us=o('

      The output will show the semantic version of celestia-node, commit hash, build date, system version, and Golang version.

      Installing a pre-built binary

      Installing a pre-built binary is the fastest way to get started with your Celestia data availability node. Releases after celestia-node v0.13.3 should have these binaries available.

      The steps below will download a binary file named celestia. Depending on the setup that you choose during installation, the celestia binary will be available at either:

      • $HOME/celestia-node-temp/celestia
      • /usr/local/bin/celestia

      Pre-built binaries are available for:

      • Operating systems: Darwin (Apple), Linux
      • Architectures: x86_64 (amd64), arm64

      To install the latest pre-built binary you can run this command in your terminal:

      bash
      bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"
      bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"

      Follow the instructions in the terminal output to choose your installation preferences.

      You will see an output with the menu for celestia.

      View the script to learn more about what it is doing.

      Next steps

      First, we recommend reading the overview of our node types, if you haven't yet.

      Now that you've installed Celestia Node, it's time to pick your node type and run your node!

      If you're planning to run a light node, we recommend the node RPC CLI tutorial.

      Upgrading your binary

      To upgrade your binary, you can install the latest version from the instructions above and restart your node. If you run into any issues, Refer to the troubleshooting section.

      ',18),ks=JSON.parse('{"title":"Install celestia-node","description":"Learn to build and install celestia-node.","frontmatter":{"description":"Learn to build and install celestia-node.","head":[["meta",{"name":"og:title","content":"Install celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node.md","filePath":"nodes/celestia-node.md","lastUpdated":1725971357000}'),_s={name:"nodes/celestia-node.md"},Cs=Object.assign(_s,{setup(ys){return(bs,gs)=>(i(),c("div",null,[p,s("ol",null,[r,s("li",null,[d,s("div",h,[u,s("div",_,[s("div",y,[b,g,s("pre",m,[s("code",null,[s("span",E,[v,F,k,C,s("span",f,"tags/"+e(a(n)["node-latest-tag"]),1)])])]),s("pre",B,[s("code",null,[s("span",T,[w,I,A,P,s("span",S,"tags/"+e(a(n)["node-latest-tag"]),1)])])])]),s("div",V,[N,x,s("pre",q,[s("code",null,[s("span",D,[R,O,L,M,s("span",j,"tags/"+e(a(l)["node-latest-tag"]),1)])])]),s("pre",U,[s("code",null,[s("span",$,[H,J,G,X,s("span",Q,"tags/"+e(a(l)["node-latest-tag"]),1)])])])]),s("div",Y,[z,K,s("pre",W,[s("code",null,[s("span",Z,[ss,es,as,os,s("span",ts,"tags/"+e(a(t)["node-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[is,cs,ps,rs,s("span",ds,"tags/"+e(a(t)["node-latest-tag"]),1)])])])])])])]),hs]),us]))}});export{ks as __pageData,Cs as default}; +cd celestia-node/
  2. `,1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=o('
    ',1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},g=s("button",{title:"Copy Code",class:"copy"},null,-1),b=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},v=s("span",{style:{color:"#B392F0"}},"git",-1),F=s("span",{style:{color:"#E1E4E8"}}," ",-1),k=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),f={style:{color:"#9ECBFF"}},B={class:"shiki github-light vp-code-light"},T={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),V=s("span",{style:{color:"#24292E"}}," ",-1),P={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},x=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),q={class:"shiki github-dark vp-code-dark"},j={class:"line"},O=s("span",{style:{color:"#B392F0"}},"git",-1),D=s("span",{style:{color:"#E1E4E8"}}," ",-1),R=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),L=s("span",{style:{color:"#E1E4E8"}}," ",-1),M={style:{color:"#9ECBFF"}},H={class:"shiki github-light vp-code-light"},$={class:"line"},K=s("span",{style:{color:"#6F42C1"}},"git",-1),U=s("span",{style:{color:"#24292E"}}," ",-1),z=s("span",{style:{color:"#032F62"}},"checkout",-1),G=s("span",{style:{color:"#24292E"}}," ",-1),J={style:{color:"#032F62"}},Q={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),W=s("span",{class:"lang"},"bash",-1),X={class:"shiki github-dark vp-code-dark"},Z={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),as=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),os=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},is=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),ps=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=o('
  3. Build the celestia binary:

    a. Standard build

    bash
    make build
    make build

    b. Experimental build

    OPTIONAL

    If you're a node operator comfortable with experimental features and seeking optimal performance with minimal RAM usage, this option is recommended for you.

    bash
    make build-jemalloc
    make build-jemalloc

    This build option enables CGO, and downloads and installs jemalloc. Learn more about the build command.

  4. Install the binary:

    bash
    make install
    make install
  5. Build the cel-key utility:

    bash
    make cel-key
    make cel-key
  6. Verify that the binary is working and check the version:

    bash
    celestia version
    celestia version
  7. ',4),_s=o('

    The output will show the semantic version of celestia-node, commit hash, build date, system version, and Golang version.

    Installing a pre-built binary

    Installing a pre-built binary is the fastest way to get started with your Celestia data availability node. Releases after celestia-node v0.13.3 should have these binaries available.

    The steps below will download a binary file named celestia. Depending on the setup that you choose during installation, the celestia binary will be available at either:

    • $HOME/celestia-node-temp/celestia
    • /usr/local/bin/celestia

    Pre-built binaries are available for:

    • Operating systems: Darwin (Apple), Linux
    • Architectures: x86_64 (amd64), arm64

    To install the latest pre-built binary you can run this command in your terminal:

    bash
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"

    Follow the instructions in the terminal output to choose your installation preferences.

    You will see an output with the menu for celestia.

    View the script to learn more about what it is doing.

    Next steps

    First, we recommend reading the overview of our node types, if you haven't yet.

    Now that you've installed Celestia Node, it's time to pick your node type and run your node!

    If you're planning to run a light node, we recommend the node RPC CLI tutorial.

    Upgrading your binary

    To upgrade your binary, you can install the latest version from the instructions above and restart your node. If you run into any issues, Refer to the troubleshooting section.

    ',18),ks=JSON.parse('{"title":"Install celestia-node","description":"Learn to build and install celestia-node.","frontmatter":{"description":"Learn to build and install celestia-node.","head":[["meta",{"name":"og:title","content":"Install celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node.md","filePath":"nodes/celestia-node.md","lastUpdated":1725992025000}'),us={name:"nodes/celestia-node.md"},Cs=Object.assign(us,{setup(ys){return(gs,bs)=>(i(),c("div",null,[p,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[g,b,s("pre",m,[s("code",null,[s("span",E,[v,F,k,C,s("span",f,"tags/"+e(a(n)["node-latest-tag"]),1)])])]),s("pre",B,[s("code",null,[s("span",T,[w,I,A,V,s("span",P,"tags/"+e(a(n)["node-latest-tag"]),1)])])])]),s("div",S,[x,N,s("pre",q,[s("code",null,[s("span",j,[O,D,R,L,s("span",M,"tags/"+e(a(l)["node-latest-tag"]),1)])])]),s("pre",H,[s("code",null,[s("span",$,[K,U,z,G,s("span",J,"tags/"+e(a(l)["node-latest-tag"]),1)])])])]),s("div",Q,[Y,W,s("pre",X,[s("code",null,[s("span",Z,[ss,es,as,os,s("span",ts,"tags/"+e(a(t)["node-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[is,cs,ps,rs,s("span",ds,"tags/"+e(a(t)["node-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{ks as __pageData,Cs as default}; diff --git a/pr-1699/assets/nodes_celestia-node.md.2de1eba4.lean.js b/pr-1699/assets/nodes_celestia-node.md.b506c65d.lean.js similarity index 50% rename from pr-1699/assets/nodes_celestia-node.md.2de1eba4.lean.js rename to pr-1699/assets/nodes_celestia-node.md.b506c65d.lean.js index bc79d99289..d76b46b5c8 100644 --- a/pr-1699/assets/nodes_celestia-node.md.2de1eba4.lean.js +++ b/pr-1699/assets/nodes_celestia-node.md.b506c65d.lean.js @@ -1 +1 @@ -import{a as t}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./chunks/mocha_versions.7704b055.js";import{m as n}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as i,c,k as s,t as e,l as a,Q as o}from"./chunks/framework.b47e54aa.js";const p=o("",4),r=o("",1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},u=o("",1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},b=s("button",{title:"Copy Code",class:"copy"},null,-1),g=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},v=s("span",{style:{color:"#B392F0"}},"git",-1),F=s("span",{style:{color:"#E1E4E8"}}," ",-1),k=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),f={style:{color:"#9ECBFF"}},B={class:"shiki github-light vp-code-light"},T={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),P=s("span",{style:{color:"#24292E"}}," ",-1),S={style:{color:"#032F62"}},V={class:"language-bash vp-adaptive-theme"},N=s("button",{title:"Copy Code",class:"copy"},null,-1),x=s("span",{class:"lang"},"bash",-1),q={class:"shiki github-dark vp-code-dark"},D={class:"line"},R=s("span",{style:{color:"#B392F0"}},"git",-1),O=s("span",{style:{color:"#E1E4E8"}}," ",-1),L=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),M=s("span",{style:{color:"#E1E4E8"}}," ",-1),j={style:{color:"#9ECBFF"}},U={class:"shiki github-light vp-code-light"},$={class:"line"},H=s("span",{style:{color:"#6F42C1"}},"git",-1),J=s("span",{style:{color:"#24292E"}}," ",-1),G=s("span",{style:{color:"#032F62"}},"checkout",-1),X=s("span",{style:{color:"#24292E"}}," ",-1),Q={style:{color:"#032F62"}},Y={class:"language-bash vp-adaptive-theme"},z=s("button",{title:"Copy Code",class:"copy"},null,-1),K=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},Z={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),as=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),os=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},is=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),ps=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=o("",4),us=o("",18),ks=JSON.parse('{"title":"Install celestia-node","description":"Learn to build and install celestia-node.","frontmatter":{"description":"Learn to build and install celestia-node.","head":[["meta",{"name":"og:title","content":"Install celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node.md","filePath":"nodes/celestia-node.md","lastUpdated":1725971357000}'),_s={name:"nodes/celestia-node.md"},Cs=Object.assign(_s,{setup(ys){return(bs,gs)=>(i(),c("div",null,[p,s("ol",null,[r,s("li",null,[d,s("div",h,[u,s("div",_,[s("div",y,[b,g,s("pre",m,[s("code",null,[s("span",E,[v,F,k,C,s("span",f,"tags/"+e(a(n)["node-latest-tag"]),1)])])]),s("pre",B,[s("code",null,[s("span",T,[w,I,A,P,s("span",S,"tags/"+e(a(n)["node-latest-tag"]),1)])])])]),s("div",V,[N,x,s("pre",q,[s("code",null,[s("span",D,[R,O,L,M,s("span",j,"tags/"+e(a(l)["node-latest-tag"]),1)])])]),s("pre",U,[s("code",null,[s("span",$,[H,J,G,X,s("span",Q,"tags/"+e(a(l)["node-latest-tag"]),1)])])])]),s("div",Y,[z,K,s("pre",W,[s("code",null,[s("span",Z,[ss,es,as,os,s("span",ts,"tags/"+e(a(t)["node-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[is,cs,ps,rs,s("span",ds,"tags/"+e(a(t)["node-latest-tag"]),1)])])])])])])]),hs]),us]))}});export{ks as __pageData,Cs as default}; +import{a as t}from"./chunks/arabica_versions.1930378b.js";import{m as l}from"./chunks/mocha_versions.7704b055.js";import{m as n}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as i,c,k as s,t as e,l as a,Q as o}from"./chunks/framework.b47e54aa.js";const p=o("",4),r=o("",1),d=s("p",null,"Check out to the desired version, based on the network you will use:",-1),h={class:"vp-code-group vp-adaptive-theme"},_=o("",1),u={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},g=s("button",{title:"Copy Code",class:"copy"},null,-1),b=s("span",{class:"lang"},"bash",-1),m={class:"shiki github-dark vp-code-dark"},E={class:"line"},v=s("span",{style:{color:"#B392F0"}},"git",-1),F=s("span",{style:{color:"#E1E4E8"}}," ",-1),k=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),C=s("span",{style:{color:"#E1E4E8"}}," ",-1),f={style:{color:"#9ECBFF"}},B={class:"shiki github-light vp-code-light"},T={class:"line"},w=s("span",{style:{color:"#6F42C1"}},"git",-1),I=s("span",{style:{color:"#24292E"}}," ",-1),A=s("span",{style:{color:"#032F62"}},"checkout",-1),V=s("span",{style:{color:"#24292E"}}," ",-1),P={style:{color:"#032F62"}},S={class:"language-bash vp-adaptive-theme"},x=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),q={class:"shiki github-dark vp-code-dark"},j={class:"line"},O=s("span",{style:{color:"#B392F0"}},"git",-1),D=s("span",{style:{color:"#E1E4E8"}}," ",-1),R=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),L=s("span",{style:{color:"#E1E4E8"}}," ",-1),M={style:{color:"#9ECBFF"}},H={class:"shiki github-light vp-code-light"},$={class:"line"},K=s("span",{style:{color:"#6F42C1"}},"git",-1),U=s("span",{style:{color:"#24292E"}}," ",-1),z=s("span",{style:{color:"#032F62"}},"checkout",-1),G=s("span",{style:{color:"#24292E"}}," ",-1),J={style:{color:"#032F62"}},Q={class:"language-bash vp-adaptive-theme"},Y=s("button",{title:"Copy Code",class:"copy"},null,-1),W=s("span",{class:"lang"},"bash",-1),X={class:"shiki github-dark vp-code-dark"},Z={class:"line"},ss=s("span",{style:{color:"#B392F0"}},"git",-1),es=s("span",{style:{color:"#E1E4E8"}}," ",-1),as=s("span",{style:{color:"#9ECBFF"}},"checkout",-1),os=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ns={class:"line"},is=s("span",{style:{color:"#6F42C1"}},"git",-1),cs=s("span",{style:{color:"#24292E"}}," ",-1),ps=s("span",{style:{color:"#032F62"}},"checkout",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),ds={style:{color:"#032F62"}},hs=o("",4),_s=o("",18),ks=JSON.parse('{"title":"Install celestia-node","description":"Learn to build and install celestia-node.","frontmatter":{"description":"Learn to build and install celestia-node.","head":[["meta",{"name":"og:title","content":"Install celestia-node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/celestia-node.md","filePath":"nodes/celestia-node.md","lastUpdated":1725992025000}'),us={name:"nodes/celestia-node.md"},Cs=Object.assign(us,{setup(ys){return(gs,bs)=>(i(),c("div",null,[p,s("ol",null,[r,s("li",null,[d,s("div",h,[_,s("div",u,[s("div",y,[g,b,s("pre",m,[s("code",null,[s("span",E,[v,F,k,C,s("span",f,"tags/"+e(a(n)["node-latest-tag"]),1)])])]),s("pre",B,[s("code",null,[s("span",T,[w,I,A,V,s("span",P,"tags/"+e(a(n)["node-latest-tag"]),1)])])])]),s("div",S,[x,N,s("pre",q,[s("code",null,[s("span",j,[O,D,R,L,s("span",M,"tags/"+e(a(l)["node-latest-tag"]),1)])])]),s("pre",H,[s("code",null,[s("span",$,[K,U,z,G,s("span",J,"tags/"+e(a(l)["node-latest-tag"]),1)])])])]),s("div",Q,[Y,W,s("pre",X,[s("code",null,[s("span",Z,[ss,es,as,os,s("span",ts,"tags/"+e(a(t)["node-latest-tag"]),1)])])]),s("pre",ls,[s("code",null,[s("span",ns,[is,cs,ps,rs,s("span",ds,"tags/"+e(a(t)["node-latest-tag"]),1)])])])])])])]),hs]),_s]))}});export{ks as __pageData,Cs as default}; diff --git a/pr-1699/assets/nodes_config-toml.md.cfad1001.js b/pr-1699/assets/nodes_config-toml.md.ea91864b.js similarity index 98% rename from pr-1699/assets/nodes_config-toml.md.cfad1001.js rename to pr-1699/assets/nodes_config-toml.md.ea91864b.js index 30d48f4f60..7fa807abc7 100644 --- a/pr-1699/assets/nodes_config-toml.md.cfad1001.js +++ b/pr-1699/assets/nodes_config-toml.md.ea91864b.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"config.toml guide","description":"A guide to the contents of the Config.toml file.","frontmatter":{"description":"A guide to the contents of the Config.toml file.","head":[["meta",{"name":"og:title","content":"config.toml guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/config-toml.md","filePath":"nodes/config-toml.md","lastUpdated":1725971357000}'),i={name:"nodes/config-toml.md"},r=a('

    config.toml guide

    Pre-requisites

    Please, make sure that you have installed and initialized celestia-node

    Understanding config.toml

    After initialization, for any type of node, you will find a config.toml in the following path (default location):

    • $HOME/.celestia-bridge/config.toml for bridge node
    • $HOME/.celestia-light/config.toml for light node
    • $HOME/.celestia-full/config.toml for a full DA node

    Let's break down some of the most used sections.

    Core

    This section is needed for the Celestia bridge node. By default, Remote = false. Still for devnet, we are going to use the remote core option and this can also be set by the command line flag --core.remote.

    P2P

    Bootstrap

    Bootstrappers help new nodes to find peers faster in the network. By default, the Bootstrapper = false and the BootstrapPeers is empty. If you want your node to be a bootstrapper, then activate Bootstrapper = true. BootstrapPeers are already provided by default during initialisation. If you want to add your own manually, you need to provide the multiaddresses of the peers.

    Mutual peers

    The purpose of this config is to set up a bidirectional communication. This is usually the case for Celestia bridge nodes. In addition, you need to change the field PeerExchange from false to true.

    Services

    TrustedHash and TrustedPeer

    TrustedHash is needed to properly initialize a Celestia bridge node with an already-running Remote celestia-core node. Celestia light node will take a genesis hash as the trusted one, if no hash is manually provided during initialization phase.

    TrustedPeers is the array of bridge nodes' peers that Celestia light node trusts. By default, bootstrap peers becomes trusted peers for Celestia light nodes if a user is not setting the trusted peer params in config file.

    Any Celestia bridge node can be a trusted peer for the light one. However, the light node by design can not be a trusted peer for another light node.

    ',19),n=[r];function d(s,l,c,h,u,f){return t(),o("div",null,n)}const m=e(i,[["render",d]]);export{g as __pageData,m as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"config.toml guide","description":"A guide to the contents of the Config.toml file.","frontmatter":{"description":"A guide to the contents of the Config.toml file.","head":[["meta",{"name":"og:title","content":"config.toml guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/config-toml.md","filePath":"nodes/config-toml.md","lastUpdated":1725992025000}'),i={name:"nodes/config-toml.md"},r=a('

    config.toml guide

    Pre-requisites

    Please, make sure that you have installed and initialized celestia-node

    Understanding config.toml

    After initialization, for any type of node, you will find a config.toml in the following path (default location):

    • $HOME/.celestia-bridge/config.toml for bridge node
    • $HOME/.celestia-light/config.toml for light node
    • $HOME/.celestia-full/config.toml for a full DA node

    Let's break down some of the most used sections.

    Core

    This section is needed for the Celestia bridge node. By default, Remote = false. Still for devnet, we are going to use the remote core option and this can also be set by the command line flag --core.remote.

    P2P

    Bootstrap

    Bootstrappers help new nodes to find peers faster in the network. By default, the Bootstrapper = false and the BootstrapPeers is empty. If you want your node to be a bootstrapper, then activate Bootstrapper = true. BootstrapPeers are already provided by default during initialisation. If you want to add your own manually, you need to provide the multiaddresses of the peers.

    Mutual peers

    The purpose of this config is to set up a bidirectional communication. This is usually the case for Celestia bridge nodes. In addition, you need to change the field PeerExchange from false to true.

    Services

    TrustedHash and TrustedPeer

    TrustedHash is needed to properly initialize a Celestia bridge node with an already-running Remote celestia-core node. Celestia light node will take a genesis hash as the trusted one, if no hash is manually provided during initialization phase.

    TrustedPeers is the array of bridge nodes' peers that Celestia light node trusts. By default, bootstrap peers becomes trusted peers for Celestia light nodes if a user is not setting the trusted peer params in config file.

    Any Celestia bridge node can be a trusted peer for the light one. However, the light node by design can not be a trusted peer for another light node.

    ',19),n=[r];function d(s,l,c,h,u,f){return t(),o("div",null,n)}const m=e(i,[["render",d]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/nodes_config-toml.md.cfad1001.lean.js b/pr-1699/assets/nodes_config-toml.md.ea91864b.lean.js similarity index 90% rename from pr-1699/assets/nodes_config-toml.md.cfad1001.lean.js rename to pr-1699/assets/nodes_config-toml.md.ea91864b.lean.js index d244ecde5d..4c57a2d05a 100644 --- a/pr-1699/assets/nodes_config-toml.md.cfad1001.lean.js +++ b/pr-1699/assets/nodes_config-toml.md.ea91864b.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"config.toml guide","description":"A guide to the contents of the Config.toml file.","frontmatter":{"description":"A guide to the contents of the Config.toml file.","head":[["meta",{"name":"og:title","content":"config.toml guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/config-toml.md","filePath":"nodes/config-toml.md","lastUpdated":1725971357000}'),i={name:"nodes/config-toml.md"},r=a("",19),n=[r];function d(s,l,c,h,u,f){return t(),o("div",null,n)}const m=e(i,[["render",d]]);export{g as __pageData,m as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"config.toml guide","description":"A guide to the contents of the Config.toml file.","frontmatter":{"description":"A guide to the contents of the Config.toml file.","head":[["meta",{"name":"og:title","content":"config.toml guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/config-toml.md","filePath":"nodes/config-toml.md","lastUpdated":1725992025000}'),i={name:"nodes/config-toml.md"},r=a("",19),n=[r];function d(s,l,c,h,u,f){return t(),o("div",null,n)}const m=e(i,[["render",d]]);export{g as __pageData,m as default}; diff --git a/pr-1699/assets/nodes_consensus-node.md.c0f03057.js b/pr-1699/assets/nodes_consensus-node.md.99f6268d.js similarity index 89% rename from pr-1699/assets/nodes_consensus-node.md.c0f03057.js rename to pr-1699/assets/nodes_consensus-node.md.99f6268d.js index a48fc023f4..7909ef3fdc 100644 --- a/pr-1699/assets/nodes_consensus-node.md.c0f03057.js +++ b/pr-1699/assets/nodes_consensus-node.md.99f6268d.js @@ -1,10 +1,10 @@ -import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t as n,l as t,a,Q as o}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/consensus-node.jpg",r=o('

    Consensus node

    This guide covers how to set up a consensus node on Celestia. Consensus nodes allow you to sync the entire blockchain history in the Celestia consensus layer.

    consensus node

    Minimum hardware requirements

    The following minimum hardware requirements are recommended for running a consensus node:

    • Memory: 16 GB RAM
    • CPU: Quad-Core
    • Disk: 2 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Set up a consensus node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up the dependencies

    Follow the instructions on installing dependencies.

    Install celestia-app

    Follow the tutorial on installing celestia-app.

    Set up the P2P networks

    To initialize the network, pick a "node-name" that describes your node. Keep in mind that this might change if a new testnet is deployed.

    ',14),i={class:"vp-code-group vp-adaptive-theme"},d=o('
    ',1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),E=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},F={class:"line"},C=o('celestia-appd init "node-name" --chain-id ',8),g={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},b={class:"line"},m=o('celestia-appd init "node-name" --chain-id ',8),S={style:{color:"#032F62"}},v={class:"language-bash vp-adaptive-theme"},k=s("button",{title:"Copy Code",class:"copy"},null,-1),A=s("span",{class:"lang"},"bash",-1),B={class:"shiki github-dark vp-code-dark"},f={class:"line"},P=o('celestia-appd init "node-name" --chain-id ',8),q={style:{color:"#9ECBFF"}},I={class:"shiki github-light vp-code-light"},x={class:"line"},V=o('celestia-appd init "node-name" --chain-id ',8),D={style:{color:"#032F62"}},R={class:"language-bash vp-adaptive-theme"},w=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},M={class:"line"},O=o('celestia-appd init "node-name" --chain-id ',8),H={style:{color:"#9ECBFF"}},L={class:"shiki github-light vp-code-light"},j={class:"line"},z=o('celestia-appd init "node-name" --chain-id ',8),Q={style:{color:"#032F62"}},U=s("p",null,[a("Download the "),s("code",null,"genesis.json"),a(" file:")],-1),W={class:"vp-code-group vp-adaptive-theme"},X=o('
    ',1),G={class:"blocks"},J={class:"language-bash vp-adaptive-theme active"},K=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),Y={class:"shiki github-dark vp-code-dark"},ss={class:"line"},os=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),es=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),ns=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ps={class:"line"},cs=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"download-genesis",-1),ds=s("span",{style:{color:"#24292E"}}," ",-1),_s={style:{color:"#032F62"}},ys={class:"language-bash vp-adaptive-theme"},hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Es=s("span",{class:"lang"},"bash",-1),us={class:"shiki github-dark vp-code-dark"},Fs={class:"line"},Cs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ts=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),bs=s("span",{style:{color:"#E1E4E8"}}," ",-1),ms={style:{color:"#9ECBFF"}},Ss={class:"shiki github-light vp-code-light"},vs={class:"line"},ks=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),As=s("span",{style:{color:"#24292E"}}," ",-1),Bs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),fs=s("span",{style:{color:"#24292E"}}," ",-1),Ps={style:{color:"#032F62"}},qs={class:"language-bash vp-adaptive-theme"},Is=s("button",{title:"Copy Code",class:"copy"},null,-1),xs=s("span",{class:"lang"},"bash",-1),Vs={class:"shiki github-dark vp-code-dark"},Ds={class:"line"},Rs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),ws=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ns=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),$s=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ms={style:{color:"#9ECBFF"}},Os={class:"shiki github-light vp-code-light"},Hs={class:"line"},Ls=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),js=s("span",{style:{color:"#24292E"}}," ",-1),zs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),Qs=s("span",{style:{color:"#24292E"}}," ",-1),Us={style:{color:"#032F62"}},Ws=s("p",null,[a("Set seeds in the "),s("code",null,"$HOME/.celestia-app/config/config.toml"),a(" file:")],-1),Xs={class:"vp-code-group vp-adaptive-theme"},Gs=o('
    ',1),Js={class:"blocks"},Ks={class:"language-bash vp-adaptive-theme active"},Zs=s("button",{title:"Copy Code",class:"copy"},null,-1),Ys=s("span",{class:"lang"},"bash",-1),so={class:"shiki github-dark vp-code-dark"},oo={class:"line"},ao=o('SEEDS=$(curl -sL',6),eo={style:{color:"#9ECBFF"}},no=s("span",{style:{color:"#F97583"}},"|",-1),to=s("span",{style:{color:"#9ECBFF"}}," ",-1),lo=s("span",{style:{color:"#B392F0"}},"tr",-1),po=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),co=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),ro=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),io={class:"shiki github-light vp-code-light"},_o={class:"line"},yo=o('SEEDS=$(curl -sL',6),ho={style:{color:"#032F62"}},Eo=s("span",{style:{color:"#D73A49"}},"|",-1),uo=s("span",{style:{color:"#032F62"}}," ",-1),Fo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Co=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),go=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),To=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),bo={class:"language-bash vp-adaptive-theme"},mo=s("button",{title:"Copy Code",class:"copy"},null,-1),So=s("span",{class:"lang"},"bash",-1),vo={class:"shiki github-dark vp-code-dark"},ko={class:"line"},Ao=o('SEEDS=$(curl -sL',6),Bo={style:{color:"#9ECBFF"}},fo=s("span",{style:{color:"#F97583"}},"|",-1),Po=s("span",{style:{color:"#9ECBFF"}}," ",-1),qo=s("span",{style:{color:"#B392F0"}},"tr",-1),Io=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),xo=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),Vo=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),Do={class:"shiki github-light vp-code-light"},Ro={class:"line"},wo=o('SEEDS=$(curl -sL',6),No={style:{color:"#032F62"}},$o=s("span",{style:{color:"#D73A49"}},"|",-1),Mo=s("span",{style:{color:"#032F62"}}," ",-1),Oo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Ho=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Lo=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),jo=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),zo=o(`
    bash
    # For Arabica, you can set seeds manually in the
    +import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t as n,l as t,a,Q as o}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/consensus-node.jpg",r=o('

    Consensus node

    This guide covers how to set up a consensus node on Celestia. Consensus nodes allow you to sync the entire blockchain history in the Celestia consensus layer.

    consensus node

    Minimum hardware requirements

    The following minimum hardware requirements are recommended for running a consensus node:

    • Memory: 16 GB RAM
    • CPU: Quad-Core
    • Disk: 2 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Set up a consensus node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up the dependencies

    Follow the instructions on installing dependencies.

    Install celestia-app

    Follow the tutorial on installing celestia-app.

    Set up the P2P networks

    To initialize the network, pick a "node-name" that describes your node. Keep in mind that this might change if a new testnet is deployed.

    ',14),i={class:"vp-code-group vp-adaptive-theme"},d=o('
    ',1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),E=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},F={class:"line"},C=o('celestia-appd init "node-name" --chain-id ',8),g={style:{color:"#9ECBFF"}},b={class:"shiki github-light vp-code-light"},T={class:"line"},m=o('celestia-appd init "node-name" --chain-id ',8),S={style:{color:"#032F62"}},v={class:"language-bash vp-adaptive-theme"},k=s("button",{title:"Copy Code",class:"copy"},null,-1),A=s("span",{class:"lang"},"bash",-1),B={class:"shiki github-dark vp-code-dark"},f={class:"line"},P=o('celestia-appd init "node-name" --chain-id ',8),q={style:{color:"#9ECBFF"}},I={class:"shiki github-light vp-code-light"},x={class:"line"},V=o('celestia-appd init "node-name" --chain-id ',8),R={style:{color:"#032F62"}},D={class:"language-bash vp-adaptive-theme"},w=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),O={class:"shiki github-dark vp-code-dark"},$={class:"line"},M=o('celestia-appd init "node-name" --chain-id ',8),H={style:{color:"#9ECBFF"}},L={class:"shiki github-light vp-code-light"},Q={class:"line"},U=o('celestia-appd init "node-name" --chain-id ',8),j={style:{color:"#032F62"}},W=s("p",null,[a("Download the "),s("code",null,"genesis.json"),a(" file:")],-1),G={class:"vp-code-group vp-adaptive-theme"},X=o('
    ',1),z={class:"blocks"},Y={class:"language-bash vp-adaptive-theme active"},J=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),K={class:"shiki github-dark vp-code-dark"},ss={class:"line"},os=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),es=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),ns=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ps={class:"line"},cs=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"download-genesis",-1),ds=s("span",{style:{color:"#24292E"}}," ",-1),_s={style:{color:"#032F62"}},ys={class:"language-bash vp-adaptive-theme"},hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Es=s("span",{class:"lang"},"bash",-1),us={class:"shiki github-dark vp-code-dark"},Fs={class:"line"},Cs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),bs=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),Ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ms={style:{color:"#9ECBFF"}},Ss={class:"shiki github-light vp-code-light"},vs={class:"line"},ks=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),As=s("span",{style:{color:"#24292E"}}," ",-1),Bs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),fs=s("span",{style:{color:"#24292E"}}," ",-1),Ps={style:{color:"#032F62"}},qs={class:"language-bash vp-adaptive-theme"},Is=s("button",{title:"Copy Code",class:"copy"},null,-1),xs=s("span",{class:"lang"},"bash",-1),Vs={class:"shiki github-dark vp-code-dark"},Rs={class:"line"},Ds=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),ws=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ns=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),$s={style:{color:"#9ECBFF"}},Ms={class:"shiki github-light vp-code-light"},Hs={class:"line"},Ls=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),Qs=s("span",{style:{color:"#24292E"}}," ",-1),Us=s("span",{style:{color:"#032F62"}},"download-genesis",-1),js=s("span",{style:{color:"#24292E"}}," ",-1),Ws={style:{color:"#032F62"}},Gs=s("p",null,[a("Set seeds in the "),s("code",null,"$HOME/.celestia-app/config/config.toml"),a(" file:")],-1),Xs={class:"vp-code-group vp-adaptive-theme"},zs=o('
    ',1),Ys={class:"blocks"},Js={class:"language-bash vp-adaptive-theme active"},Zs=s("button",{title:"Copy Code",class:"copy"},null,-1),Ks=s("span",{class:"lang"},"bash",-1),so={class:"shiki github-dark vp-code-dark"},oo={class:"line"},ao=o('SEEDS=$(curl -sL',6),eo={style:{color:"#9ECBFF"}},no=s("span",{style:{color:"#F97583"}},"|",-1),to=s("span",{style:{color:"#9ECBFF"}}," ",-1),lo=s("span",{style:{color:"#B392F0"}},"tr",-1),po=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),co=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),ro=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),io={class:"shiki github-light vp-code-light"},_o={class:"line"},yo=o('SEEDS=$(curl -sL',6),ho={style:{color:"#032F62"}},Eo=s("span",{style:{color:"#D73A49"}},"|",-1),uo=s("span",{style:{color:"#032F62"}}," ",-1),Fo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Co=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),go=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),bo=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),To={class:"language-bash vp-adaptive-theme"},mo=s("button",{title:"Copy Code",class:"copy"},null,-1),So=s("span",{class:"lang"},"bash",-1),vo={class:"shiki github-dark vp-code-dark"},ko={class:"line"},Ao=o('SEEDS=$(curl -sL',6),Bo={style:{color:"#9ECBFF"}},fo=s("span",{style:{color:"#F97583"}},"|",-1),Po=s("span",{style:{color:"#9ECBFF"}}," ",-1),qo=s("span",{style:{color:"#B392F0"}},"tr",-1),Io=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),xo=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),Vo=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),Ro={class:"shiki github-light vp-code-light"},Do={class:"line"},wo=o('SEEDS=$(curl -sL',6),No={style:{color:"#032F62"}},Oo=s("span",{style:{color:"#D73A49"}},"|",-1),$o=s("span",{style:{color:"#032F62"}}," ",-1),Mo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Ho=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Lo=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),Qo=o('sed -i.bak -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/" $HOME/.celestia-app/config/config.toml',1),Uo=o(`
    bash
    # For Arabica, you can set seeds manually in the
     # \`$HOME/.celestia-app/config/config.toml\` file:
     # Comma separated list of seed nodes to connect to
     seeds = ""
    # For Arabica, you can set seeds manually in the
     # \`$HOME/.celestia-app/config/config.toml\` file:
     # Comma separated list of seed nodes to connect to
    -seeds = ""
    `,1),Qo=o('Optional: Set persistent peers

    Optionally, you can set persistent peers in your config.toml file. If you set persistent peers, your node will always try to connect to these peers. This is useful when running a local devnet, for example, when you would always want to connect to the same local nodes in your devnet. In production, setting persistent peers is advised only if you are running a sentry node.

    You can get the persistent peers from the @cosmos/chain-registry repository (for Mainnet Beta) or @celestiaorg/networks repository repo (for Mocha and Arabica) with the following commands:

    ',3),Uo={class:"vp-code-group vp-adaptive-theme"},Wo=o('
    ',1),Xo={class:"blocks"},Go={class:"language-bash vp-adaptive-theme active"},Jo=s("button",{title:"Copy Code",class:"copy"},null,-1),Ko=s("span",{class:"lang"},"bash",-1),Zo={class:"shiki github-dark vp-code-dark"},Yo={class:"line"},sa=o('PERSISTENT_PEERS=$(curl -s',6),oa={style:{color:"#9ECBFF"}},aa=o('| jq -r '.peers.persistent_peers[].address' | tr '\\n' ',' | sed 's/,$/\\n/')',14),ea=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),na=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ta={class:"shiki github-light vp-code-light"},la={class:"line"},pa=o('PERSISTENT_PEERS=$(curl -s',6),ca={style:{color:"#032F62"}},ra=o('| jq -r '.peers.persistent_peers[].address' | tr '\\n' ',' | sed 's/,$/\\n/')',14),ia=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),da=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),_a={class:"language-bash vp-adaptive-theme"},ya=s("button",{title:"Copy Code",class:"copy"},null,-1),ha=s("span",{class:"lang"},"bash",-1),Ea={class:"shiki github-dark vp-code-dark"},ua={class:"line"},Fa=o('PERSISTENT_PEERS=$(curl -sL',6),Ca={style:{color:"#9ECBFF"}},ga=s("span",{style:{color:"#F97583"}},"|",-1),Ta=s("span",{style:{color:"#9ECBFF"}}," ",-1),ba=s("span",{style:{color:"#B392F0"}},"tr",-1),ma=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Sa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),va=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ka={class:"shiki github-light vp-code-light"},Aa={class:"line"},Ba=o('PERSISTENT_PEERS=$(curl -sL',6),fa={style:{color:"#032F62"}},Pa=s("span",{style:{color:"#D73A49"}},"|",-1),qa=s("span",{style:{color:"#032F62"}}," ",-1),Ia=s("span",{style:{color:"#6F42C1"}},"tr",-1),xa=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Va=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),Da=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),Ra={class:"language-bash vp-adaptive-theme"},wa=s("button",{title:"Copy Code",class:"copy"},null,-1),Na=s("span",{class:"lang"},"bash",-1),$a={class:"shiki github-dark vp-code-dark"},Ma={class:"line"},Oa=o('PERSISTENT_PEERS=$(curl -sL',6),Ha={style:{color:"#9ECBFF"}},La=s("span",{style:{color:"#F97583"}},"|",-1),ja=s("span",{style:{color:"#9ECBFF"}}," ",-1),za=s("span",{style:{color:"#B392F0"}},"tr",-1),Qa=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Ua=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),Wa=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),Xa={class:"shiki github-light vp-code-light"},Ga={class:"line"},Ja=o('PERSISTENT_PEERS=$(curl -sL',6),Ka={style:{color:"#032F62"}},Za=s("span",{style:{color:"#D73A49"}},"|",-1),Ya=s("span",{style:{color:"#032F62"}}," ",-1),se=s("span",{style:{color:"#6F42C1"}},"tr",-1),oe=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),ee=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ne=o(`

    Storage and pruning configurations

    Optional: Connect a consensus node to a bridge node

    If your consensus node is being connected to a celestia-node bridge node, you will need to enable transaction indexing and retain all block data. This can be achieved with the following settings in your config.toml.

    Enable transaction indexing

    toml
    indexer = "kv"
    indexer = "kv"

    Retain all block data

    And in your app.toml, min-retain-blocks should remain as the default setting of 0:

    toml
    min-retain-blocks = 0 # retain all block data, this is default setting
    min-retain-blocks = 0 # retain all block data, this is default setting

    Query transactions by hash

    To query transactions using their hash, transaction indexing must be turned on. Set the indexer to "kv" in your config.toml:

    toml
    indexer = "kv"
    indexer = "kv"

    Optional: Access historical state

    If you want to query the historical state — for example, you might want to know the balance of a Celestia wallet at a given height in the past — you should run an archive node with pruning = "nothing" in your app.toml. Note that this configuration is resource-intensive and will require significant storage:

    toml
    pruning = "nothing"
    pruning = "nothing"

    Save on storage requirements

    If you want to save on storage requirements, consider using pruning = "everything" in your app.toml to prune everything. If you select "everything" or "default", but still want to keep the block data, you can do so by not changing the default value of min-retain-blocks = 0 in your app.toml. A value of 0 for min-retain-blocks will keep all block data. This will prune snapshots of the state, but it will keep block data:

    toml
    pruning = "everything"
    +seeds = ""
    `,1),jo=o('Optional: Set persistent peers

    Optionally, you can set persistent peers in your config.toml file. If you set persistent peers, your node will always try to connect to these peers. This is useful when running a local devnet, for example, when you would always want to connect to the same local nodes in your devnet. In production, setting persistent peers is advised only if you are running a sentry node.

    You can get the persistent peers from the @cosmos/chain-registry repository (for Mainnet Beta) or @celestiaorg/networks repository repo (for Mocha and Arabica) with the following commands:

    ',3),Wo={class:"vp-code-group vp-adaptive-theme"},Go=o('
    ',1),Xo={class:"blocks"},zo={class:"language-bash vp-adaptive-theme active"},Yo=s("button",{title:"Copy Code",class:"copy"},null,-1),Jo=s("span",{class:"lang"},"bash",-1),Zo={class:"shiki github-dark vp-code-dark"},Ko={class:"line"},sa=o('PERSISTENT_PEERS=$(curl -s',6),oa={style:{color:"#9ECBFF"}},aa=o('| jq -r '.peers.persistent_peers[].address' | tr '\\n' ',' | sed 's/,$/\\n/')',14),ea=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),na=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ta={class:"shiki github-light vp-code-light"},la={class:"line"},pa=o('PERSISTENT_PEERS=$(curl -s',6),ca={style:{color:"#032F62"}},ra=o('| jq -r '.peers.persistent_peers[].address' | tr '\\n' ',' | sed 's/,$/\\n/')',14),ia=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),da=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),_a={class:"language-bash vp-adaptive-theme"},ya=s("button",{title:"Copy Code",class:"copy"},null,-1),ha=s("span",{class:"lang"},"bash",-1),Ea={class:"shiki github-dark vp-code-dark"},ua={class:"line"},Fa=o('PERSISTENT_PEERS=$(curl -sL',6),Ca={style:{color:"#9ECBFF"}},ga=s("span",{style:{color:"#F97583"}},"|",-1),ba=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ta=s("span",{style:{color:"#B392F0"}},"tr",-1),ma=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Sa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),va=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ka={class:"shiki github-light vp-code-light"},Aa={class:"line"},Ba=o('PERSISTENT_PEERS=$(curl -sL',6),fa={style:{color:"#032F62"}},Pa=s("span",{style:{color:"#D73A49"}},"|",-1),qa=s("span",{style:{color:"#032F62"}}," ",-1),Ia=s("span",{style:{color:"#6F42C1"}},"tr",-1),xa=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Va=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),Ra=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),Da={class:"language-bash vp-adaptive-theme"},wa=s("button",{title:"Copy Code",class:"copy"},null,-1),Na=s("span",{class:"lang"},"bash",-1),Oa={class:"shiki github-dark vp-code-dark"},$a={class:"line"},Ma=o('PERSISTENT_PEERS=$(curl -sL',6),Ha={style:{color:"#9ECBFF"}},La=s("span",{style:{color:"#F97583"}},"|",-1),Qa=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ua=s("span",{style:{color:"#B392F0"}},"tr",-1),ja=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Wa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),Ga=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),Xa={class:"shiki github-light vp-code-light"},za={class:"line"},Ya=o('PERSISTENT_PEERS=$(curl -sL',6),Ja={style:{color:"#032F62"}},Za=s("span",{style:{color:"#D73A49"}},"|",-1),Ka=s("span",{style:{color:"#032F62"}}," ",-1),se=s("span",{style:{color:"#6F42C1"}},"tr",-1),oe=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),ee=o('sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \\"$PERSISTENT_PEERS\\"/" $HOME/.celestia-app/config/config.toml',1),ne=o(`

    Storage and pruning configurations

    Optional: Connect a consensus node to a bridge node

    If your consensus node is being connected to a celestia-node bridge node, you will need to enable transaction indexing and retain all block data. This can be achieved with the following settings in your config.toml.

    Enable transaction indexing

    toml
    indexer = "kv"
    indexer = "kv"

    Retain all block data

    And in your app.toml, min-retain-blocks should remain as the default setting of 0:

    toml
    min-retain-blocks = 0 # retain all block data, this is default setting
    min-retain-blocks = 0 # retain all block data, this is default setting

    Query transactions by hash

    To query transactions using their hash, transaction indexing must be turned on. Set the indexer to "kv" in your config.toml:

    toml
    indexer = "kv"
    indexer = "kv"

    Optional: Access historical state

    If you want to query the historical state — for example, you might want to know the balance of a Celestia wallet at a given height in the past — you should run an archive node with pruning = "nothing" in your app.toml. Note that this configuration is resource-intensive and will require significant storage:

    toml
    pruning = "nothing"
    pruning = "nothing"

    Save on storage requirements

    If you want to save on storage requirements, consider using pruning = "everything" in your app.toml to prune everything. If you select "everything" or "default", but still want to keep the block data, you can do so by not changing the default value of min-retain-blocks = 0 in your app.toml. A value of 0 for min-retain-blocks will keep all block data. This will prune snapshots of the state, but it will keep block data:

    toml
    pruning = "everything"
     min-retain-blocks = 0 # this is the default setting
    pruning = "everything"
     min-retain-blocks = 0 # this is the default setting

    Sync types

    Sync modeTimeNotes
    Block sync~3 weeksDownloads and executes all blocks from genesis to the tip
    State sync~1 hourDownloads a snapshot of the state then downloads and executes all blocks after that snapshot to the tip.
    Quick sync~5 hoursDownloads the data directory from a node. Time depends on your download speed because the data being downloaded can exceed 1 TB for mainnet.

    Option 1: Block sync

    By default, a consensus node will sync using block sync; which will request, validate and execute every block up to the head of the blockchain. This is the most secure mechanism yet the slowest (taking up to weeks depending on the height of the blockchain).

    There are two alternatives for quicker syncing.

    Option 2: State sync

    State sync uses light client verification to verify state snapshots from peers and then apply them. State sync relies on weak subjectivity; a trusted header (specifically the hash and height) must be provided. This can be found by querying a trusted RPC endpoint (/block). RPC endpoints are also required for retrieving light blocks. These can be found in the docs here under the respective networks or from the chain-registry.

    In $HOME/.celestia-app/config/config.toml, set

    toml
    rpc_servers = ""
     trust_height = 0
    @@ -18,43 +18,43 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t
     ###         State Sync Configuration Options        ###
     #######################################################
     [statesync]
    -enable = true

    To their respective fields. At least two different rpc endpoints should be provided. The more, the greater the chance of detecting any fraudulent behavior.

    Once setup, you should be ready to start the node as normal. In the logs, you should see: Discovering snapshots. This may take a few minutes before snapshots are found depending on the network topology.

    Option 3: Quick sync

    Quick sync effectively downloads the entire data directory from a third-party provider meaning the node has all the application and blockchain state as the node it was copied from.

    Run the following command to quick-sync from a snapshot:

    `,33),te={class:"vp-code-group vp-adaptive-theme"},le=o('
    ',1),pe={class:"blocks"},ce={class:"language-bash vp-adaptive-theme active"},re=s("button",{title:"Copy Code",class:"copy"},null,-1),ie=s("span",{class:"lang"},"bash",-1),de={class:"shiki github-dark vp-code-dark"},_e=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ye=o('rm -rf ~/.celestia-app/data',1),he=o('mkdir -p ~/.celestia-app/data',1),Ee=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),ue={class:"line"},Fe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ce=s("span",{style:{color:"#B392F0"}},"egrep",-1),ge=s("span",{style:{color:"#9ECBFF"}}," ",-1),Te=s("span",{style:{color:"#79B8FF"}},"-o",-1),be={style:{color:"#9ECBFF"}},me=o('| tr -d ">")',6),Se=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),ve=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),ke={class:"shiki github-light vp-code-light"},Ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),Be=o('rm -rf ~/.celestia-app/data',1),fe=o('mkdir -p ~/.celestia-app/data',1),Pe=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),qe={class:"line"},Ie=s("span",{style:{color:"#032F62"}}," ",-1),xe=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ve=s("span",{style:{color:"#032F62"}}," ",-1),De=s("span",{style:{color:"#005CC5"}},"-o",-1),Re={style:{color:"#032F62"}},we=o('| tr -d ">")',6),Ne=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),$e=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Me={class:"language-bash vp-adaptive-theme"},Oe=s("button",{title:"Copy Code",class:"copy"},null,-1),He=s("span",{class:"lang"},"bash",-1),Le={class:"shiki github-dark vp-code-dark"},je=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ze=o('rm -rf ~/.celestia-app/data',1),Qe=o('mkdir -p ~/.celestia-app/data',1),Ue=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),We={class:"line"},Xe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ge=s("span",{style:{color:"#B392F0"}},"egrep",-1),Je=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ke=s("span",{style:{color:"#79B8FF"}},"-o",-1),Ze={style:{color:"#9ECBFF"}},Ye=o('| tr -d ">")',6),sn=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),on=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),an={class:"shiki github-light vp-code-light"},en=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),nn=o('rm -rf ~/.celestia-app/data',1),tn=o('mkdir -p ~/.celestia-app/data',1),ln=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),pn={class:"line"},cn=s("span",{style:{color:"#032F62"}}," ",-1),rn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),dn=s("span",{style:{color:"#032F62"}}," ",-1),_n=s("span",{style:{color:"#005CC5"}},"-o",-1),yn={style:{color:"#032F62"}},hn=o('| tr -d ">")',6),En=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),un=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Fn={class:"language-bash vp-adaptive-theme"},Cn=s("button",{title:"Copy Code",class:"copy"},null,-1),gn=s("span",{class:"lang"},"bash",-1),Tn={class:"shiki github-dark vp-code-dark"},bn=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),mn=o('rm -rf ~/.celestia-app/data',1),Sn=o('mkdir -p ~/.celestia-app/data',1),vn=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),kn={class:"line"},An=s("span",{style:{color:"#9ECBFF"}}," ",-1),Bn=s("span",{style:{color:"#B392F0"}},"egrep",-1),fn=s("span",{style:{color:"#9ECBFF"}}," ",-1),Pn=s("span",{style:{color:"#79B8FF"}},"-o",-1),qn={style:{color:"#9ECBFF"}},In=o('| tr -d ">")',6),xn=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),Vn=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Dn={class:"shiki github-light vp-code-light"},Rn=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),wn=o('rm -rf ~/.celestia-app/data',1),Nn=o('mkdir -p ~/.celestia-app/data',1),$n=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),Mn={class:"line"},On=s("span",{style:{color:"#032F62"}}," ",-1),Hn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ln=s("span",{style:{color:"#032F62"}}," ",-1),jn=s("span",{style:{color:"#005CC5"}},"-o",-1),zn={style:{color:"#032F62"}},Qn=o('| tr -d ">")',6),Un=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),Wn=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Xn=o('

    Start the consensus node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    Optional: If you would like celestia-app to run as a background process, you can follow the SystemD tutorial.

    Extra resources for consensus nodes

    Optional: Reset network

    This will delete all data folders so we can start fresh:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Optional: Configure an RPC endpoint

    You can configure your consensus node to be a public RPC endpoint. This allows it to accept connections from data availability nodes and serve requests for the data availability API.

    Expose RPC

    By default, the RPC service listens on localhost which means it can't be accessed from other machines. To make the RPC service available publicly, you need to bind it to a public IP or 0.0.0.0 (which means listening on all available network interfaces).

    You can do this by editing the config.toml file:

    sh
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml

    This command replaces the localhost IP address with 0.0.0.0, making the RPC service listen on all available network interfaces.

    Note on external-address

    The external-address field in the configuration is used when your node is behind a NAT and you need to advertise a different address for peers to dial. Populating this field is not necessary for making the RPC endpoint public.

    sh
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)\nsed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \\\n    $HOME/.celestia-app/config/config.toml
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)\nsed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \\\n    $HOME/.celestia-app/config/config.toml

    Restart the node

    After making these changes, restart celestia-appd to load the new configurations.

    Optional: Transaction indexer configuration options

    This section guides you on how to configure your config.toml file in celestia-app to select which transactions to index. Depending on the application's configuration, a node operator may decide which transactions to index.

    The available options are:

    1. null: This option disables indexing. If you don't need to query transactions, you can choose this option to save space.
    2. kv (default): This is the simplest indexer, backed by key-value storage (defaults to levelDB; see DBBackend). When kv is chosen, tx.height and tx.hash will always be indexed. This option is suitable for basic queries on transactions.
    3. psql: This indexer is backed by PostgreSQL. When psql is chosen, tx.height and tx.hash will always be indexed. This option is suitable for complex queries on transactions.

    An example to set the value to kv in config.toml is:

    toml
    indexer = "kv"
    indexer = "kv"

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    Optional: Discard ABCI responses configuration

    This section will guide you on how to configure your config.toml file in celestia-app to manage the storage of ABCI responses. ABCI responses are the results of executing transactions and are used for /block_results RPC queries and to reindex events in the command-line tool.

    The discard_abci_responses option allows you to control whether these responses are persisted in the state store:

    • false (default): ABCI responses are stored in the state store. This ensures that ABCI responses are available for /block_results RPC queries and for reindexing events. However, it can consume a significant amount of disk space.
    • true: ABCI responses are not stored in the state store. This can save a considerable amount of disk space, but /block_results RPC queries and event reindexing will not be available.

    An example to set the value to false in config.toml is:

    toml
    discard_abci_responses = false
    discard_abci_responses = false

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    ',41),ot=JSON.parse('{"title":"Consensus node","description":"Learn how to set up a Celestia consensus node.","frontmatter":{"description":"Learn how to set up a Celestia consensus node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Consensus node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/consensus-node.md","filePath":"nodes/consensus-node.md","lastUpdated":1725971357000}'),Gn={name:"nodes/consensus-node.md"},at=Object.assign(Gn,{setup(Jn){return(Kn,Zn)=>(l(),p("div",null,[r,s("div",i,[d,s("div",_,[s("div",y,[h,E,s("pre",u,[s("code",null,[s("span",F,[C,s("span",g,n(t(e).mainnetChainId),1)])])]),s("pre",T,[s("code",null,[s("span",b,[m,s("span",S,n(t(e).mainnetChainId),1)])])])]),s("div",v,[k,A,s("pre",B,[s("code",null,[s("span",f,[P,s("span",q,n(t(e).mochaChainId),1)])])]),s("pre",I,[s("code",null,[s("span",x,[V,s("span",D,n(t(e).mochaChainId),1)])])])]),s("div",R,[w,N,s("pre",$,[s("code",null,[s("span",M,[O,s("span",H,n(t(e).arabicaChainId),1)])])]),s("pre",L,[s("code",null,[s("span",j,[z,s("span",Q,n(t(e).arabicaChainId),1)])])])])])]),U,s("div",W,[X,s("div",G,[s("div",J,[K,Z,s("pre",Y,[s("code",null,[s("span",ss,[os,as,es,ns,s("span",ts,n(t(e).mainnetChainId),1)])])]),s("pre",ls,[s("code",null,[s("span",ps,[cs,rs,is,ds,s("span",_s,n(t(e).mainnetChainId),1)])])])]),s("div",ys,[hs,Es,s("pre",us,[s("code",null,[s("span",Fs,[Cs,gs,Ts,bs,s("span",ms,n(t(e).mochaChainId),1)])])]),s("pre",Ss,[s("code",null,[s("span",vs,[ks,As,Bs,fs,s("span",Ps,n(t(e).mochaChainId),1)])])])]),s("div",qs,[Is,xs,s("pre",Vs,[s("code",null,[s("span",Ds,[Rs,ws,Ns,$s,s("span",Ms,n(t(e).arabicaChainId),1)])])]),s("pre",Os,[s("code",null,[s("span",Hs,[Ls,js,zs,Qs,s("span",Us,n(t(e).arabicaChainId),1)])])])])])]),Ws,s("div",Xs,[Gs,s("div",Js,[s("div",Ks,[Zs,Ys,s("pre",so,[s("code",null,[s("span",oo,[ao,s("span",eo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),no,to,lo,po]),a(` +enable = true

    To their respective fields. At least two different rpc endpoints should be provided. The more, the greater the chance of detecting any fraudulent behavior.

    Once setup, you should be ready to start the node as normal. In the logs, you should see: Discovering snapshots. This may take a few minutes before snapshots are found depending on the network topology.

    Option 3: Quick sync

    Quick sync effectively downloads the entire data directory from a third-party provider meaning the node has all the application and blockchain state as the node it was copied from.

    Run the following command to quick-sync from a snapshot:

    `,33),te={class:"vp-code-group vp-adaptive-theme"},le=o('
    ',1),pe={class:"blocks"},ce={class:"language-bash vp-adaptive-theme active"},re=s("button",{title:"Copy Code",class:"copy"},null,-1),ie=s("span",{class:"lang"},"bash",-1),de={class:"shiki github-dark vp-code-dark"},_e=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ye=o('rm -rf ~/.celestia-app/data',1),he=o('mkdir -p ~/.celestia-app/data',1),Ee=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),ue={class:"line"},Fe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ce=s("span",{style:{color:"#B392F0"}},"egrep",-1),ge=s("span",{style:{color:"#9ECBFF"}}," ",-1),be=s("span",{style:{color:"#79B8FF"}},"-o",-1),Te={style:{color:"#9ECBFF"}},me=o('| tr -d ">")',6),Se=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),ve=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),ke={class:"shiki github-light vp-code-light"},Ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),Be=o('rm -rf ~/.celestia-app/data',1),fe=o('mkdir -p ~/.celestia-app/data',1),Pe=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),qe={class:"line"},Ie=s("span",{style:{color:"#032F62"}}," ",-1),xe=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ve=s("span",{style:{color:"#032F62"}}," ",-1),Re=s("span",{style:{color:"#005CC5"}},"-o",-1),De={style:{color:"#032F62"}},we=o('| tr -d ">")',6),Ne=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),Oe=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),$e={class:"language-bash vp-adaptive-theme"},Me=s("button",{title:"Copy Code",class:"copy"},null,-1),He=s("span",{class:"lang"},"bash",-1),Le={class:"shiki github-dark vp-code-dark"},Qe=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),Ue=o('rm -rf ~/.celestia-app/data',1),je=o('mkdir -p ~/.celestia-app/data',1),We=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),Ge={class:"line"},Xe=s("span",{style:{color:"#9ECBFF"}}," ",-1),ze=s("span",{style:{color:"#B392F0"}},"egrep",-1),Ye=s("span",{style:{color:"#9ECBFF"}}," ",-1),Je=s("span",{style:{color:"#79B8FF"}},"-o",-1),Ze={style:{color:"#9ECBFF"}},Ke=o('| tr -d ">")',6),sn=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),on=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),an={class:"shiki github-light vp-code-light"},en=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),nn=o('rm -rf ~/.celestia-app/data',1),tn=o('mkdir -p ~/.celestia-app/data',1),ln=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),pn={class:"line"},cn=s("span",{style:{color:"#032F62"}}," ",-1),rn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),dn=s("span",{style:{color:"#032F62"}}," ",-1),_n=s("span",{style:{color:"#005CC5"}},"-o",-1),yn={style:{color:"#032F62"}},hn=o('| tr -d ">")',6),En=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),un=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Fn={class:"language-bash vp-adaptive-theme"},Cn=s("button",{title:"Copy Code",class:"copy"},null,-1),gn=s("span",{class:"lang"},"bash",-1),bn={class:"shiki github-dark vp-code-dark"},Tn=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),mn=o('rm -rf ~/.celestia-app/data',1),Sn=o('mkdir -p ~/.celestia-app/data',1),vn=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),kn={class:"line"},An=s("span",{style:{color:"#9ECBFF"}}," ",-1),Bn=s("span",{style:{color:"#B392F0"}},"egrep",-1),fn=s("span",{style:{color:"#9ECBFF"}}," ",-1),Pn=s("span",{style:{color:"#79B8FF"}},"-o",-1),qn={style:{color:"#9ECBFF"}},In=o('| tr -d ">")',6),xn=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),Vn=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Rn={class:"shiki github-light vp-code-light"},Dn=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),wn=o('rm -rf ~/.celestia-app/data',1),Nn=o('mkdir -p ~/.celestia-app/data',1),On=o('SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \\',1),$n={class:"line"},Mn=s("span",{style:{color:"#032F62"}}," ",-1),Hn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ln=s("span",{style:{color:"#032F62"}}," ",-1),Qn=s("span",{style:{color:"#005CC5"}},"-o",-1),Un={style:{color:"#032F62"}},jn=o('| tr -d ">")',6),Wn=o('aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"',1),Gn=o('tar xf celestia-snap.tar -C ~/.celestia-app/data/',1),Xn=o('

    Start the consensus node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    Optional: If you would like celestia-app to run as a background process, you can follow the SystemD tutorial.

    Extra resources for consensus nodes

    Optional: Reset network

    This will delete all data folders so we can start fresh:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Optional: Configure an RPC endpoint

    You can configure your consensus node to be a public RPC endpoint. This allows it to accept connections from data availability nodes and serve requests for the data availability API.

    Expose RPC

    By default, the RPC service listens on localhost which means it can't be accessed from other machines. To make the RPC service available publicly, you need to bind it to a public IP or 0.0.0.0 (which means listening on all available network interfaces).

    You can do this by editing the config.toml file:

    sh
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml

    This command replaces the localhost IP address with 0.0.0.0, making the RPC service listen on all available network interfaces.

    Note on external-address

    The external-address field in the configuration is used when your node is behind a NAT and you need to advertise a different address for peers to dial. Populating this field is not necessary for making the RPC endpoint public.

    sh
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)\nsed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \\\n    $HOME/.celestia-app/config/config.toml
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)\nsed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \\\n    $HOME/.celestia-app/config/config.toml

    Restart the node

    After making these changes, restart celestia-appd to load the new configurations.

    Optional: Transaction indexer configuration options

    This section guides you on how to configure your config.toml file in celestia-app to select which transactions to index. Depending on the application's configuration, a node operator may decide which transactions to index.

    The available options are:

    1. null: This option disables indexing. If you don't need to query transactions, you can choose this option to save space.
    2. kv (default): This is the simplest indexer, backed by key-value storage (defaults to levelDB; see DBBackend). When kv is chosen, tx.height and tx.hash will always be indexed. This option is suitable for basic queries on transactions.
    3. psql: This indexer is backed by PostgreSQL. When psql is chosen, tx.height and tx.hash will always be indexed. This option is suitable for complex queries on transactions.

    An example to set the value to kv in config.toml is:

    toml
    indexer = "kv"
    indexer = "kv"

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    Optional: Discard ABCI responses configuration

    This section will guide you on how to configure your config.toml file in celestia-app to manage the storage of ABCI responses. ABCI responses are the results of executing transactions and are used for /block_results RPC queries and to reindex events in the command-line tool.

    The discard_abci_responses option allows you to control whether these responses are persisted in the state store:

    • false (default): ABCI responses are stored in the state store. This ensures that ABCI responses are available for /block_results RPC queries and for reindexing events. However, it can consume a significant amount of disk space.
    • true: ABCI responses are not stored in the state store. This can save a considerable amount of disk space, but /block_results RPC queries and event reindexing will not be available.

    An example to set the value to false in config.toml is:

    toml
    discard_abci_responses = false
    discard_abci_responses = false

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    ',41),ot=JSON.parse('{"title":"Consensus node","description":"Learn how to set up a Celestia consensus node.","frontmatter":{"description":"Learn how to set up a Celestia consensus node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Consensus node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/consensus-node.md","filePath":"nodes/consensus-node.md","lastUpdated":1725992025000}'),zn={name:"nodes/consensus-node.md"},at=Object.assign(zn,{setup(Yn){return(Jn,Zn)=>(l(),p("div",null,[r,s("div",i,[d,s("div",_,[s("div",y,[h,E,s("pre",u,[s("code",null,[s("span",F,[C,s("span",g,n(t(e).mainnetChainId),1)])])]),s("pre",b,[s("code",null,[s("span",T,[m,s("span",S,n(t(e).mainnetChainId),1)])])])]),s("div",v,[k,A,s("pre",B,[s("code",null,[s("span",f,[P,s("span",q,n(t(e).mochaChainId),1)])])]),s("pre",I,[s("code",null,[s("span",x,[V,s("span",R,n(t(e).mochaChainId),1)])])])]),s("div",D,[w,N,s("pre",O,[s("code",null,[s("span",$,[M,s("span",H,n(t(e).arabicaChainId),1)])])]),s("pre",L,[s("code",null,[s("span",Q,[U,s("span",j,n(t(e).arabicaChainId),1)])])])])])]),W,s("div",G,[X,s("div",z,[s("div",Y,[J,Z,s("pre",K,[s("code",null,[s("span",ss,[os,as,es,ns,s("span",ts,n(t(e).mainnetChainId),1)])])]),s("pre",ls,[s("code",null,[s("span",ps,[cs,rs,is,ds,s("span",_s,n(t(e).mainnetChainId),1)])])])]),s("div",ys,[hs,Es,s("pre",us,[s("code",null,[s("span",Fs,[Cs,gs,bs,Ts,s("span",ms,n(t(e).mochaChainId),1)])])]),s("pre",Ss,[s("code",null,[s("span",vs,[ks,As,Bs,fs,s("span",Ps,n(t(e).mochaChainId),1)])])])]),s("div",qs,[Is,xs,s("pre",Vs,[s("code",null,[s("span",Rs,[Ds,ws,Ns,Os,s("span",$s,n(t(e).arabicaChainId),1)])])]),s("pre",Ms,[s("code",null,[s("span",Hs,[Ls,Qs,Us,js,s("span",Ws,n(t(e).arabicaChainId),1)])])])])])]),Gs,s("div",Xs,[zs,s("div",Ys,[s("div",Js,[Zs,Ks,s("pre",so,[s("code",null,[s("span",oo,[ao,s("span",eo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),no,to,lo,po]),a(` `),co,a(` `),ro])]),s("pre",io,[s("code",null,[s("span",_o,[yo,s("span",ho," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),Eo,uo,Fo,Co]),a(` `),go,a(` -`),To])])]),s("div",bo,[mo,So,s("pre",vo,[s("code",null,[s("span",ko,[Ao,s("span",Bo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),fo,Po,qo,Io]),a(` +`),bo])])]),s("div",To,[mo,So,s("pre",vo,[s("code",null,[s("span",ko,[Ao,s("span",Bo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),fo,Po,qo,Io]),a(` `),xo,a(` -`),Vo])]),s("pre",Do,[s("code",null,[s("span",Ro,[wo,s("span",No," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),$o,Mo,Oo,Ho]),a(` +`),Vo])]),s("pre",Ro,[s("code",null,[s("span",Do,[wo,s("span",No," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),Oo,$o,Mo,Ho]),a(` `),Lo,a(` -`),jo])])]),zo])]),s("details",null,[Qo,s("div",Uo,[Wo,s("div",Xo,[s("div",Go,[Jo,Ko,s("pre",Zo,[s("code",null,[s("span",Yo,[sa,s("span",oa," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),aa]),a(` +`),Qo])])]),Uo])]),s("details",null,[jo,s("div",Wo,[Go,s("div",Xo,[s("div",zo,[Yo,Jo,s("pre",Zo,[s("code",null,[s("span",Ko,[sa,s("span",oa," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),aa]),a(` `),ea,a(` `),na])]),s("pre",ta,[s("code",null,[s("span",la,[pa,s("span",ca," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),ra]),a(` `),ia,a(` -`),da])])]),s("div",_a,[ya,ha,s("pre",Ea,[s("code",null,[s("span",ua,[Fa,s("span",Ca," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),ga,Ta,ba,ma]),a(` +`),da])])]),s("div",_a,[ya,ha,s("pre",Ea,[s("code",null,[s("span",ua,[Fa,s("span",Ca," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),ga,ba,Ta,ma]),a(` `),Sa,a(` `),va])]),s("pre",ka,[s("code",null,[s("span",Aa,[Ba,s("span",fa," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),Pa,qa,Ia,xa]),a(` `),Va,a(` -`),Da])])]),s("div",Ra,[wa,Na,s("pre",$a,[s("code",null,[s("span",Ma,[Oa,s("span",Ha," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),La,ja,za,Qa]),a(` -`),Ua,a(` -`),Wa])]),s("pre",Xa,[s("code",null,[s("span",Ga,[Ja,s("span",Ka," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),Za,Ya,se,oe]),a(` +`),Ra])])]),s("div",Da,[wa,Na,s("pre",Oa,[s("code",null,[s("span",$a,[Ma,s("span",Ha," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),La,Qa,Ua,ja]),a(` +`),Wa,a(` +`),Ga])]),s("pre",Xa,[s("code",null,[s("span",za,[Ya,s("span",Ja," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),Za,Ka,se,oe]),a(` `),ae,a(` `),ee])])])])])]),ne,s("div",te,[le,s("div",pe,[s("div",ce,[re,ie,s("pre",de,[s("code",null,[_e,a(` `),ye,a(` `),he,a(` `),Ee,a(` -`),s("span",ue,[Fe,Ce,ge,Te,s("span",be,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),me]),a(` +`),s("span",ue,[Fe,Ce,ge,be,s("span",Te,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),me]),a(` `),Se,a(` `),ve])]),s("pre",ke,[s("code",null,[Ae,a(` `),Be,a(` `),fe,a(` `),Pe,a(` -`),s("span",qe,[Ie,xe,Ve,De,s("span",Re,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),we]),a(` +`),s("span",qe,[Ie,xe,Ve,Re,s("span",De,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),we]),a(` `),Ne,a(` -`),$e])])]),s("div",Me,[Oe,He,s("pre",Le,[s("code",null,[je,a(` -`),ze,a(` -`),Qe,a(` +`),Oe])])]),s("div",$e,[Me,He,s("pre",Le,[s("code",null,[Qe,a(` `),Ue,a(` -`),s("span",We,[Xe,Ge,Je,Ke,s("span",Ze,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),Ye]),a(` +`),je,a(` +`),We,a(` +`),s("span",Ge,[Xe,ze,Ye,Je,s("span",Ze,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),Ke]),a(` `),sn,a(` `),on])]),s("pre",an,[s("code",null,[en,a(` `),nn,a(` @@ -62,16 +62,16 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t `),ln,a(` `),s("span",pn,[cn,rn,dn,_n,s("span",yn,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),hn]),a(` `),En,a(` -`),un])])]),s("div",Fn,[Cn,gn,s("pre",Tn,[s("code",null,[bn,a(` +`),un])])]),s("div",Fn,[Cn,gn,s("pre",bn,[s("code",null,[Tn,a(` `),mn,a(` `),Sn,a(` `),vn,a(` `),s("span",kn,[An,Bn,fn,Pn,s("span",qn,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),In]),a(` `),xn,a(` -`),Vn])]),s("pre",Dn,[s("code",null,[Rn,a(` +`),Vn])]),s("pre",Rn,[s("code",null,[Dn,a(` `),wn,a(` `),Nn,a(` -`),$n,a(` -`),s("span",Mn,[On,Hn,Ln,jn,s("span",zn,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),Qn]),a(` -`),Un,a(` -`),Wn])])])])]),Xn]))}});export{ot as __pageData,at as default}; +`),On,a(` +`),s("span",$n,[Mn,Hn,Ln,Qn,s("span",Un,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),jn]),a(` +`),Wn,a(` +`),Gn])])])])]),Xn]))}});export{ot as __pageData,at as default}; diff --git a/pr-1699/assets/nodes_consensus-node.md.c0f03057.lean.js b/pr-1699/assets/nodes_consensus-node.md.99f6268d.lean.js similarity index 65% rename from pr-1699/assets/nodes_consensus-node.md.c0f03057.lean.js rename to pr-1699/assets/nodes_consensus-node.md.99f6268d.lean.js index fd950a4ae7..290296930e 100644 --- a/pr-1699/assets/nodes_consensus-node.md.c0f03057.lean.js +++ b/pr-1699/assets/nodes_consensus-node.md.99f6268d.lean.js @@ -1,40 +1,40 @@ -import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t as n,l as t,a,Q as o}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/consensus-node.jpg",r=o("",14),i={class:"vp-code-group vp-adaptive-theme"},d=o("",1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),E=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},F={class:"line"},C=o("",8),g={style:{color:"#9ECBFF"}},T={class:"shiki github-light vp-code-light"},b={class:"line"},m=o("",8),S={style:{color:"#032F62"}},v={class:"language-bash vp-adaptive-theme"},k=s("button",{title:"Copy Code",class:"copy"},null,-1),A=s("span",{class:"lang"},"bash",-1),B={class:"shiki github-dark vp-code-dark"},f={class:"line"},P=o("",8),q={style:{color:"#9ECBFF"}},I={class:"shiki github-light vp-code-light"},x={class:"line"},V=o("",8),D={style:{color:"#032F62"}},R={class:"language-bash vp-adaptive-theme"},w=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},M={class:"line"},O=o("",8),H={style:{color:"#9ECBFF"}},L={class:"shiki github-light vp-code-light"},j={class:"line"},z=o("",8),Q={style:{color:"#032F62"}},U=s("p",null,[a("Download the "),s("code",null,"genesis.json"),a(" file:")],-1),W={class:"vp-code-group vp-adaptive-theme"},X=o("",1),G={class:"blocks"},J={class:"language-bash vp-adaptive-theme active"},K=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),Y={class:"shiki github-dark vp-code-dark"},ss={class:"line"},os=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),es=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),ns=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ps={class:"line"},cs=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"download-genesis",-1),ds=s("span",{style:{color:"#24292E"}}," ",-1),_s={style:{color:"#032F62"}},ys={class:"language-bash vp-adaptive-theme"},hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Es=s("span",{class:"lang"},"bash",-1),us={class:"shiki github-dark vp-code-dark"},Fs={class:"line"},Cs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ts=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),bs=s("span",{style:{color:"#E1E4E8"}}," ",-1),ms={style:{color:"#9ECBFF"}},Ss={class:"shiki github-light vp-code-light"},vs={class:"line"},ks=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),As=s("span",{style:{color:"#24292E"}}," ",-1),Bs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),fs=s("span",{style:{color:"#24292E"}}," ",-1),Ps={style:{color:"#032F62"}},qs={class:"language-bash vp-adaptive-theme"},Is=s("button",{title:"Copy Code",class:"copy"},null,-1),xs=s("span",{class:"lang"},"bash",-1),Vs={class:"shiki github-dark vp-code-dark"},Ds={class:"line"},Rs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),ws=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ns=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),$s=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ms={style:{color:"#9ECBFF"}},Os={class:"shiki github-light vp-code-light"},Hs={class:"line"},Ls=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),js=s("span",{style:{color:"#24292E"}}," ",-1),zs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),Qs=s("span",{style:{color:"#24292E"}}," ",-1),Us={style:{color:"#032F62"}},Ws=s("p",null,[a("Set seeds in the "),s("code",null,"$HOME/.celestia-app/config/config.toml"),a(" file:")],-1),Xs={class:"vp-code-group vp-adaptive-theme"},Gs=o("",1),Js={class:"blocks"},Ks={class:"language-bash vp-adaptive-theme active"},Zs=s("button",{title:"Copy Code",class:"copy"},null,-1),Ys=s("span",{class:"lang"},"bash",-1),so={class:"shiki github-dark vp-code-dark"},oo={class:"line"},ao=o("",6),eo={style:{color:"#9ECBFF"}},no=s("span",{style:{color:"#F97583"}},"|",-1),to=s("span",{style:{color:"#9ECBFF"}}," ",-1),lo=s("span",{style:{color:"#B392F0"}},"tr",-1),po=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),co=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),ro=o("",1),io={class:"shiki github-light vp-code-light"},_o={class:"line"},yo=o("",6),ho={style:{color:"#032F62"}},Eo=s("span",{style:{color:"#D73A49"}},"|",-1),uo=s("span",{style:{color:"#032F62"}}," ",-1),Fo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Co=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),go=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),To=o("",1),bo={class:"language-bash vp-adaptive-theme"},mo=s("button",{title:"Copy Code",class:"copy"},null,-1),So=s("span",{class:"lang"},"bash",-1),vo={class:"shiki github-dark vp-code-dark"},ko={class:"line"},Ao=o("",6),Bo={style:{color:"#9ECBFF"}},fo=s("span",{style:{color:"#F97583"}},"|",-1),Po=s("span",{style:{color:"#9ECBFF"}}," ",-1),qo=s("span",{style:{color:"#B392F0"}},"tr",-1),Io=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),xo=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),Vo=o("",1),Do={class:"shiki github-light vp-code-light"},Ro={class:"line"},wo=o("",6),No={style:{color:"#032F62"}},$o=s("span",{style:{color:"#D73A49"}},"|",-1),Mo=s("span",{style:{color:"#032F62"}}," ",-1),Oo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Ho=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Lo=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),jo=o("",1),zo=o("",1),Qo=o("",3),Uo={class:"vp-code-group vp-adaptive-theme"},Wo=o("",1),Xo={class:"blocks"},Go={class:"language-bash vp-adaptive-theme active"},Jo=s("button",{title:"Copy Code",class:"copy"},null,-1),Ko=s("span",{class:"lang"},"bash",-1),Zo={class:"shiki github-dark vp-code-dark"},Yo={class:"line"},sa=o("",6),oa={style:{color:"#9ECBFF"}},aa=o("",14),ea=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),na=o("",1),ta={class:"shiki github-light vp-code-light"},la={class:"line"},pa=o("",6),ca={style:{color:"#032F62"}},ra=o("",14),ia=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),da=o("",1),_a={class:"language-bash vp-adaptive-theme"},ya=s("button",{title:"Copy Code",class:"copy"},null,-1),ha=s("span",{class:"lang"},"bash",-1),Ea={class:"shiki github-dark vp-code-dark"},ua={class:"line"},Fa=o("",6),Ca={style:{color:"#9ECBFF"}},ga=s("span",{style:{color:"#F97583"}},"|",-1),Ta=s("span",{style:{color:"#9ECBFF"}}," ",-1),ba=s("span",{style:{color:"#B392F0"}},"tr",-1),ma=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Sa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),va=o("",1),ka={class:"shiki github-light vp-code-light"},Aa={class:"line"},Ba=o("",6),fa={style:{color:"#032F62"}},Pa=s("span",{style:{color:"#D73A49"}},"|",-1),qa=s("span",{style:{color:"#032F62"}}," ",-1),Ia=s("span",{style:{color:"#6F42C1"}},"tr",-1),xa=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Va=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),Da=o("",1),Ra={class:"language-bash vp-adaptive-theme"},wa=s("button",{title:"Copy Code",class:"copy"},null,-1),Na=s("span",{class:"lang"},"bash",-1),$a={class:"shiki github-dark vp-code-dark"},Ma={class:"line"},Oa=o("",6),Ha={style:{color:"#9ECBFF"}},La=s("span",{style:{color:"#F97583"}},"|",-1),ja=s("span",{style:{color:"#9ECBFF"}}," ",-1),za=s("span",{style:{color:"#B392F0"}},"tr",-1),Qa=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Ua=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),Wa=o("",1),Xa={class:"shiki github-light vp-code-light"},Ga={class:"line"},Ja=o("",6),Ka={style:{color:"#032F62"}},Za=s("span",{style:{color:"#D73A49"}},"|",-1),Ya=s("span",{style:{color:"#032F62"}}," ",-1),se=s("span",{style:{color:"#6F42C1"}},"tr",-1),oe=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),ee=o("",1),ne=o("",33),te={class:"vp-code-group vp-adaptive-theme"},le=o("",1),pe={class:"blocks"},ce={class:"language-bash vp-adaptive-theme active"},re=s("button",{title:"Copy Code",class:"copy"},null,-1),ie=s("span",{class:"lang"},"bash",-1),de={class:"shiki github-dark vp-code-dark"},_e=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ye=o("",1),he=o("",1),Ee=o("",1),ue={class:"line"},Fe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ce=s("span",{style:{color:"#B392F0"}},"egrep",-1),ge=s("span",{style:{color:"#9ECBFF"}}," ",-1),Te=s("span",{style:{color:"#79B8FF"}},"-o",-1),be={style:{color:"#9ECBFF"}},me=o("",6),Se=o("",1),ve=o("",1),ke={class:"shiki github-light vp-code-light"},Ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),Be=o("",1),fe=o("",1),Pe=o("",1),qe={class:"line"},Ie=s("span",{style:{color:"#032F62"}}," ",-1),xe=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ve=s("span",{style:{color:"#032F62"}}," ",-1),De=s("span",{style:{color:"#005CC5"}},"-o",-1),Re={style:{color:"#032F62"}},we=o("",6),Ne=o("",1),$e=o("",1),Me={class:"language-bash vp-adaptive-theme"},Oe=s("button",{title:"Copy Code",class:"copy"},null,-1),He=s("span",{class:"lang"},"bash",-1),Le={class:"shiki github-dark vp-code-dark"},je=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ze=o("",1),Qe=o("",1),Ue=o("",1),We={class:"line"},Xe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ge=s("span",{style:{color:"#B392F0"}},"egrep",-1),Je=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ke=s("span",{style:{color:"#79B8FF"}},"-o",-1),Ze={style:{color:"#9ECBFF"}},Ye=o("",6),sn=o("",1),on=o("",1),an={class:"shiki github-light vp-code-light"},en=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),nn=o("",1),tn=o("",1),ln=o("",1),pn={class:"line"},cn=s("span",{style:{color:"#032F62"}}," ",-1),rn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),dn=s("span",{style:{color:"#032F62"}}," ",-1),_n=s("span",{style:{color:"#005CC5"}},"-o",-1),yn={style:{color:"#032F62"}},hn=o("",6),En=o("",1),un=o("",1),Fn={class:"language-bash vp-adaptive-theme"},Cn=s("button",{title:"Copy Code",class:"copy"},null,-1),gn=s("span",{class:"lang"},"bash",-1),Tn={class:"shiki github-dark vp-code-dark"},bn=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),mn=o("",1),Sn=o("",1),vn=o("",1),kn={class:"line"},An=s("span",{style:{color:"#9ECBFF"}}," ",-1),Bn=s("span",{style:{color:"#B392F0"}},"egrep",-1),fn=s("span",{style:{color:"#9ECBFF"}}," ",-1),Pn=s("span",{style:{color:"#79B8FF"}},"-o",-1),qn={style:{color:"#9ECBFF"}},In=o("",6),xn=o("",1),Vn=o("",1),Dn={class:"shiki github-light vp-code-light"},Rn=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),wn=o("",1),Nn=o("",1),$n=o("",1),Mn={class:"line"},On=s("span",{style:{color:"#032F62"}}," ",-1),Hn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ln=s("span",{style:{color:"#032F62"}}," ",-1),jn=s("span",{style:{color:"#005CC5"}},"-o",-1),zn={style:{color:"#032F62"}},Qn=o("",6),Un=o("",1),Wn=o("",1),Xn=o("",41),ot=JSON.parse('{"title":"Consensus node","description":"Learn how to set up a Celestia consensus node.","frontmatter":{"description":"Learn how to set up a Celestia consensus node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Consensus node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/consensus-node.md","filePath":"nodes/consensus-node.md","lastUpdated":1725971357000}'),Gn={name:"nodes/consensus-node.md"},at=Object.assign(Gn,{setup(Jn){return(Kn,Zn)=>(l(),p("div",null,[r,s("div",i,[d,s("div",_,[s("div",y,[h,E,s("pre",u,[s("code",null,[s("span",F,[C,s("span",g,n(t(e).mainnetChainId),1)])])]),s("pre",T,[s("code",null,[s("span",b,[m,s("span",S,n(t(e).mainnetChainId),1)])])])]),s("div",v,[k,A,s("pre",B,[s("code",null,[s("span",f,[P,s("span",q,n(t(e).mochaChainId),1)])])]),s("pre",I,[s("code",null,[s("span",x,[V,s("span",D,n(t(e).mochaChainId),1)])])])]),s("div",R,[w,N,s("pre",$,[s("code",null,[s("span",M,[O,s("span",H,n(t(e).arabicaChainId),1)])])]),s("pre",L,[s("code",null,[s("span",j,[z,s("span",Q,n(t(e).arabicaChainId),1)])])])])])]),U,s("div",W,[X,s("div",G,[s("div",J,[K,Z,s("pre",Y,[s("code",null,[s("span",ss,[os,as,es,ns,s("span",ts,n(t(e).mainnetChainId),1)])])]),s("pre",ls,[s("code",null,[s("span",ps,[cs,rs,is,ds,s("span",_s,n(t(e).mainnetChainId),1)])])])]),s("div",ys,[hs,Es,s("pre",us,[s("code",null,[s("span",Fs,[Cs,gs,Ts,bs,s("span",ms,n(t(e).mochaChainId),1)])])]),s("pre",Ss,[s("code",null,[s("span",vs,[ks,As,Bs,fs,s("span",Ps,n(t(e).mochaChainId),1)])])])]),s("div",qs,[Is,xs,s("pre",Vs,[s("code",null,[s("span",Ds,[Rs,ws,Ns,$s,s("span",Ms,n(t(e).arabicaChainId),1)])])]),s("pre",Os,[s("code",null,[s("span",Hs,[Ls,js,zs,Qs,s("span",Us,n(t(e).arabicaChainId),1)])])])])])]),Ws,s("div",Xs,[Gs,s("div",Js,[s("div",Ks,[Zs,Ys,s("pre",so,[s("code",null,[s("span",oo,[ao,s("span",eo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),no,to,lo,po]),a(` +import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t as n,l as t,a,Q as o}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/consensus-node.jpg",r=o("",14),i={class:"vp-code-group vp-adaptive-theme"},d=o("",1),_={class:"blocks"},y={class:"language-bash vp-adaptive-theme active"},h=s("button",{title:"Copy Code",class:"copy"},null,-1),E=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},F={class:"line"},C=o("",8),g={style:{color:"#9ECBFF"}},b={class:"shiki github-light vp-code-light"},T={class:"line"},m=o("",8),S={style:{color:"#032F62"}},v={class:"language-bash vp-adaptive-theme"},k=s("button",{title:"Copy Code",class:"copy"},null,-1),A=s("span",{class:"lang"},"bash",-1),B={class:"shiki github-dark vp-code-dark"},f={class:"line"},P=o("",8),q={style:{color:"#9ECBFF"}},I={class:"shiki github-light vp-code-light"},x={class:"line"},V=o("",8),R={style:{color:"#032F62"}},D={class:"language-bash vp-adaptive-theme"},w=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),O={class:"shiki github-dark vp-code-dark"},$={class:"line"},M=o("",8),H={style:{color:"#9ECBFF"}},L={class:"shiki github-light vp-code-light"},Q={class:"line"},U=o("",8),j={style:{color:"#032F62"}},W=s("p",null,[a("Download the "),s("code",null,"genesis.json"),a(" file:")],-1),G={class:"vp-code-group vp-adaptive-theme"},X=o("",1),z={class:"blocks"},Y={class:"language-bash vp-adaptive-theme active"},J=s("button",{title:"Copy Code",class:"copy"},null,-1),Z=s("span",{class:"lang"},"bash",-1),K={class:"shiki github-dark vp-code-dark"},ss={class:"line"},os=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),as=s("span",{style:{color:"#E1E4E8"}}," ",-1),es=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),ns=s("span",{style:{color:"#E1E4E8"}}," ",-1),ts={style:{color:"#9ECBFF"}},ls={class:"shiki github-light vp-code-light"},ps={class:"line"},cs=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),rs=s("span",{style:{color:"#24292E"}}," ",-1),is=s("span",{style:{color:"#032F62"}},"download-genesis",-1),ds=s("span",{style:{color:"#24292E"}}," ",-1),_s={style:{color:"#032F62"}},ys={class:"language-bash vp-adaptive-theme"},hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Es=s("span",{class:"lang"},"bash",-1),us={class:"shiki github-dark vp-code-dark"},Fs={class:"line"},Cs=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),bs=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),Ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ms={style:{color:"#9ECBFF"}},Ss={class:"shiki github-light vp-code-light"},vs={class:"line"},ks=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),As=s("span",{style:{color:"#24292E"}}," ",-1),Bs=s("span",{style:{color:"#032F62"}},"download-genesis",-1),fs=s("span",{style:{color:"#24292E"}}," ",-1),Ps={style:{color:"#032F62"}},qs={class:"language-bash vp-adaptive-theme"},Is=s("button",{title:"Copy Code",class:"copy"},null,-1),xs=s("span",{class:"lang"},"bash",-1),Vs={class:"shiki github-dark vp-code-dark"},Rs={class:"line"},Ds=s("span",{style:{color:"#B392F0"}},"celestia-appd",-1),ws=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ns=s("span",{style:{color:"#9ECBFF"}},"download-genesis",-1),Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),$s={style:{color:"#9ECBFF"}},Ms={class:"shiki github-light vp-code-light"},Hs={class:"line"},Ls=s("span",{style:{color:"#6F42C1"}},"celestia-appd",-1),Qs=s("span",{style:{color:"#24292E"}}," ",-1),Us=s("span",{style:{color:"#032F62"}},"download-genesis",-1),js=s("span",{style:{color:"#24292E"}}," ",-1),Ws={style:{color:"#032F62"}},Gs=s("p",null,[a("Set seeds in the "),s("code",null,"$HOME/.celestia-app/config/config.toml"),a(" file:")],-1),Xs={class:"vp-code-group vp-adaptive-theme"},zs=o("",1),Ys={class:"blocks"},Js={class:"language-bash vp-adaptive-theme active"},Zs=s("button",{title:"Copy Code",class:"copy"},null,-1),Ks=s("span",{class:"lang"},"bash",-1),so={class:"shiki github-dark vp-code-dark"},oo={class:"line"},ao=o("",6),eo={style:{color:"#9ECBFF"}},no=s("span",{style:{color:"#F97583"}},"|",-1),to=s("span",{style:{color:"#9ECBFF"}}," ",-1),lo=s("span",{style:{color:"#B392F0"}},"tr",-1),po=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),co=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),ro=o("",1),io={class:"shiki github-light vp-code-light"},_o={class:"line"},yo=o("",6),ho={style:{color:"#032F62"}},Eo=s("span",{style:{color:"#D73A49"}},"|",-1),uo=s("span",{style:{color:"#032F62"}}," ",-1),Fo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Co=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),go=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),bo=o("",1),To={class:"language-bash vp-adaptive-theme"},mo=s("button",{title:"Copy Code",class:"copy"},null,-1),So=s("span",{class:"lang"},"bash",-1),vo={class:"shiki github-dark vp-code-dark"},ko={class:"line"},Ao=o("",6),Bo={style:{color:"#9ECBFF"}},fo=s("span",{style:{color:"#F97583"}},"|",-1),Po=s("span",{style:{color:"#9ECBFF"}}," ",-1),qo=s("span",{style:{color:"#B392F0"}},"tr",-1),Io=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),xo=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $SEEDS")],-1),Vo=o("",1),Ro={class:"shiki github-light vp-code-light"},Do={class:"line"},wo=o("",6),No={style:{color:"#032F62"}},Oo=s("span",{style:{color:"#D73A49"}},"|",-1),$o=s("span",{style:{color:"#032F62"}}," ",-1),Mo=s("span",{style:{color:"#6F42C1"}},"tr",-1),Ho=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Lo=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $SEEDS")],-1),Qo=o("",1),Uo=o("",1),jo=o("",3),Wo={class:"vp-code-group vp-adaptive-theme"},Go=o("",1),Xo={class:"blocks"},zo={class:"language-bash vp-adaptive-theme active"},Yo=s("button",{title:"Copy Code",class:"copy"},null,-1),Jo=s("span",{class:"lang"},"bash",-1),Zo={class:"shiki github-dark vp-code-dark"},Ko={class:"line"},sa=o("",6),oa={style:{color:"#9ECBFF"}},aa=o("",14),ea=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),na=o("",1),ta={class:"shiki github-light vp-code-light"},la={class:"line"},pa=o("",6),ca={style:{color:"#032F62"}},ra=o("",14),ia=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),da=o("",1),_a={class:"language-bash vp-adaptive-theme"},ya=s("button",{title:"Copy Code",class:"copy"},null,-1),ha=s("span",{class:"lang"},"bash",-1),Ea={class:"shiki github-dark vp-code-dark"},ua={class:"line"},Fa=o("",6),Ca={style:{color:"#9ECBFF"}},ga=s("span",{style:{color:"#F97583"}},"|",-1),ba=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ta=s("span",{style:{color:"#B392F0"}},"tr",-1),ma=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Sa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),va=o("",1),ka={class:"shiki github-light vp-code-light"},Aa={class:"line"},Ba=o("",6),fa={style:{color:"#032F62"}},Pa=s("span",{style:{color:"#D73A49"}},"|",-1),qa=s("span",{style:{color:"#032F62"}}," ",-1),Ia=s("span",{style:{color:"#6F42C1"}},"tr",-1),xa=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),Va=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),Ra=o("",1),Da={class:"language-bash vp-adaptive-theme"},wa=s("button",{title:"Copy Code",class:"copy"},null,-1),Na=s("span",{class:"lang"},"bash",-1),Oa={class:"shiki github-dark vp-code-dark"},$a={class:"line"},Ma=o("",6),Ha={style:{color:"#9ECBFF"}},La=s("span",{style:{color:"#F97583"}},"|",-1),Qa=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ua=s("span",{style:{color:"#B392F0"}},"tr",-1),ja=s("span",{style:{color:"#9ECBFF"}}," '\\n' ',')",-1),Wa=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"echo"),s("span",{style:{color:"#E1E4E8"}}," $PERSISTENT_PEERS")],-1),Ga=o("",1),Xa={class:"shiki github-light vp-code-light"},za={class:"line"},Ya=o("",6),Ja={style:{color:"#032F62"}},Za=s("span",{style:{color:"#D73A49"}},"|",-1),Ka=s("span",{style:{color:"#032F62"}}," ",-1),se=s("span",{style:{color:"#6F42C1"}},"tr",-1),oe=s("span",{style:{color:"#032F62"}}," '\\n' ',')",-1),ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"echo"),s("span",{style:{color:"#24292E"}}," $PERSISTENT_PEERS")],-1),ee=o("",1),ne=o("",33),te={class:"vp-code-group vp-adaptive-theme"},le=o("",1),pe={class:"blocks"},ce={class:"language-bash vp-adaptive-theme active"},re=s("button",{title:"Copy Code",class:"copy"},null,-1),ie=s("span",{class:"lang"},"bash",-1),de={class:"shiki github-dark vp-code-dark"},_e=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),ye=o("",1),he=o("",1),Ee=o("",1),ue={class:"line"},Fe=s("span",{style:{color:"#9ECBFF"}}," ",-1),Ce=s("span",{style:{color:"#B392F0"}},"egrep",-1),ge=s("span",{style:{color:"#9ECBFF"}}," ",-1),be=s("span",{style:{color:"#79B8FF"}},"-o",-1),Te={style:{color:"#9ECBFF"}},me=o("",6),Se=o("",1),ve=o("",1),ke={class:"shiki github-light vp-code-light"},Ae=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),Be=o("",1),fe=o("",1),Pe=o("",1),qe={class:"line"},Ie=s("span",{style:{color:"#032F62"}}," ",-1),xe=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ve=s("span",{style:{color:"#032F62"}}," ",-1),Re=s("span",{style:{color:"#005CC5"}},"-o",-1),De={style:{color:"#032F62"}},we=o("",6),Ne=o("",1),Oe=o("",1),$e={class:"language-bash vp-adaptive-theme"},Me=s("button",{title:"Copy Code",class:"copy"},null,-1),He=s("span",{class:"lang"},"bash",-1),Le={class:"shiki github-dark vp-code-dark"},Qe=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),Ue=o("",1),je=o("",1),We=o("",1),Ge={class:"line"},Xe=s("span",{style:{color:"#9ECBFF"}}," ",-1),ze=s("span",{style:{color:"#B392F0"}},"egrep",-1),Ye=s("span",{style:{color:"#9ECBFF"}}," ",-1),Je=s("span",{style:{color:"#79B8FF"}},"-o",-1),Ze={style:{color:"#9ECBFF"}},Ke=o("",6),sn=o("",1),on=o("",1),an={class:"shiki github-light vp-code-light"},en=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),nn=o("",1),tn=o("",1),ln=o("",1),pn={class:"line"},cn=s("span",{style:{color:"#032F62"}}," ",-1),rn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),dn=s("span",{style:{color:"#032F62"}}," ",-1),_n=s("span",{style:{color:"#005CC5"}},"-o",-1),yn={style:{color:"#032F62"}},hn=o("",6),En=o("",1),un=o("",1),Fn={class:"language-bash vp-adaptive-theme"},Cn=s("button",{title:"Copy Code",class:"copy"},null,-1),gn=s("span",{class:"lang"},"bash",-1),bn={class:"shiki github-dark vp-code-dark"},Tn=s("span",{class:"line"},[s("span",{style:{color:"#79B8FF"}},"cd"),s("span",{style:{color:"#E1E4E8"}}," $HOME")],-1),mn=o("",1),Sn=o("",1),vn=o("",1),kn={class:"line"},An=s("span",{style:{color:"#9ECBFF"}}," ",-1),Bn=s("span",{style:{color:"#B392F0"}},"egrep",-1),fn=s("span",{style:{color:"#9ECBFF"}}," ",-1),Pn=s("span",{style:{color:"#79B8FF"}},"-o",-1),qn={style:{color:"#9ECBFF"}},In=o("",6),xn=o("",1),Vn=o("",1),Rn={class:"shiki github-light vp-code-light"},Dn=s("span",{class:"line"},[s("span",{style:{color:"#005CC5"}},"cd"),s("span",{style:{color:"#24292E"}}," $HOME")],-1),wn=o("",1),Nn=o("",1),On=o("",1),$n={class:"line"},Mn=s("span",{style:{color:"#032F62"}}," ",-1),Hn=s("span",{style:{color:"#6F42C1"}},"egrep",-1),Ln=s("span",{style:{color:"#032F62"}}," ",-1),Qn=s("span",{style:{color:"#005CC5"}},"-o",-1),Un={style:{color:"#032F62"}},jn=o("",6),Wn=o("",1),Gn=o("",1),Xn=o("",41),ot=JSON.parse('{"title":"Consensus node","description":"Learn how to set up a Celestia consensus node.","frontmatter":{"description":"Learn how to set up a Celestia consensus node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Consensus node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/consensus-node.md","filePath":"nodes/consensus-node.md","lastUpdated":1725992025000}'),zn={name:"nodes/consensus-node.md"},at=Object.assign(zn,{setup(Yn){return(Jn,Zn)=>(l(),p("div",null,[r,s("div",i,[d,s("div",_,[s("div",y,[h,E,s("pre",u,[s("code",null,[s("span",F,[C,s("span",g,n(t(e).mainnetChainId),1)])])]),s("pre",b,[s("code",null,[s("span",T,[m,s("span",S,n(t(e).mainnetChainId),1)])])])]),s("div",v,[k,A,s("pre",B,[s("code",null,[s("span",f,[P,s("span",q,n(t(e).mochaChainId),1)])])]),s("pre",I,[s("code",null,[s("span",x,[V,s("span",R,n(t(e).mochaChainId),1)])])])]),s("div",D,[w,N,s("pre",O,[s("code",null,[s("span",$,[M,s("span",H,n(t(e).arabicaChainId),1)])])]),s("pre",L,[s("code",null,[s("span",Q,[U,s("span",j,n(t(e).arabicaChainId),1)])])])])])]),W,s("div",G,[X,s("div",z,[s("div",Y,[J,Z,s("pre",K,[s("code",null,[s("span",ss,[os,as,es,ns,s("span",ts,n(t(e).mainnetChainId),1)])])]),s("pre",ls,[s("code",null,[s("span",ps,[cs,rs,is,ds,s("span",_s,n(t(e).mainnetChainId),1)])])])]),s("div",ys,[hs,Es,s("pre",us,[s("code",null,[s("span",Fs,[Cs,gs,bs,Ts,s("span",ms,n(t(e).mochaChainId),1)])])]),s("pre",Ss,[s("code",null,[s("span",vs,[ks,As,Bs,fs,s("span",Ps,n(t(e).mochaChainId),1)])])])]),s("div",qs,[Is,xs,s("pre",Vs,[s("code",null,[s("span",Rs,[Ds,ws,Ns,Os,s("span",$s,n(t(e).arabicaChainId),1)])])]),s("pre",Ms,[s("code",null,[s("span",Hs,[Ls,Qs,Us,js,s("span",Ws,n(t(e).arabicaChainId),1)])])])])])]),Gs,s("div",Xs,[zs,s("div",Ys,[s("div",Js,[Zs,Ks,s("pre",so,[s("code",null,[s("span",oo,[ao,s("span",eo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),no,to,lo,po]),a(` `),co,a(` `),ro])]),s("pre",io,[s("code",null,[s("span",_o,[yo,s("span",ho," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mainnetChainId)+"/seeds.txt ",1),Eo,uo,Fo,Co]),a(` `),go,a(` -`),To])])]),s("div",bo,[mo,So,s("pre",vo,[s("code",null,[s("span",ko,[Ao,s("span",Bo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),fo,Po,qo,Io]),a(` +`),bo])])]),s("div",To,[mo,So,s("pre",vo,[s("code",null,[s("span",ko,[Ao,s("span",Bo," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),fo,Po,qo,Io]),a(` `),xo,a(` -`),Vo])]),s("pre",Do,[s("code",null,[s("span",Ro,[wo,s("span",No," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),$o,Mo,Oo,Ho]),a(` +`),Vo])]),s("pre",Ro,[s("code",null,[s("span",Do,[wo,s("span",No," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/seeds.txt ",1),Oo,$o,Mo,Ho]),a(` `),Lo,a(` -`),jo])])]),zo])]),s("details",null,[Qo,s("div",Uo,[Wo,s("div",Xo,[s("div",Go,[Jo,Ko,s("pre",Zo,[s("code",null,[s("span",Yo,[sa,s("span",oa," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),aa]),a(` +`),Qo])])]),Uo])]),s("details",null,[jo,s("div",Wo,[Go,s("div",Xo,[s("div",zo,[Yo,Jo,s("pre",Zo,[s("code",null,[s("span",Ko,[sa,s("span",oa," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),aa]),a(` `),ea,a(` `),na])]),s("pre",ta,[s("code",null,[s("span",la,[pa,s("span",ca," https://raw.githubusercontent.com/cosmos/chain-registry/master/"+n(t(e).mainnetChainId)+"/chain.json ",1),ra]),a(` `),ia,a(` -`),da])])]),s("div",_a,[ya,ha,s("pre",Ea,[s("code",null,[s("span",ua,[Fa,s("span",Ca," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),ga,Ta,ba,ma]),a(` +`),da])])]),s("div",_a,[ya,ha,s("pre",Ea,[s("code",null,[s("span",ua,[Fa,s("span",Ca," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),ga,ba,Ta,ma]),a(` `),Sa,a(` `),va])]),s("pre",ka,[s("code",null,[s("span",Aa,[Ba,s("span",fa," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).mochaChainId)+"/peers.txt ",1),Pa,qa,Ia,xa]),a(` `),Va,a(` -`),Da])])]),s("div",Ra,[wa,Na,s("pre",$a,[s("code",null,[s("span",Ma,[Oa,s("span",Ha," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),La,ja,za,Qa]),a(` -`),Ua,a(` -`),Wa])]),s("pre",Xa,[s("code",null,[s("span",Ga,[Ja,s("span",Ka," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),Za,Ya,se,oe]),a(` +`),Ra])])]),s("div",Da,[wa,Na,s("pre",Oa,[s("code",null,[s("span",$a,[Ma,s("span",Ha," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),La,Qa,Ua,ja]),a(` +`),Wa,a(` +`),Ga])]),s("pre",Xa,[s("code",null,[s("span",za,[Ya,s("span",Ja," https://raw.githubusercontent.com/celestiaorg/networks/master/"+n(t(e).arabicaChainId)+"/peers.txt ",1),Za,Ka,se,oe]),a(` `),ae,a(` `),ee])])])])])]),ne,s("div",te,[le,s("div",pe,[s("div",ce,[re,ie,s("pre",de,[s("code",null,[_e,a(` `),ye,a(` `),he,a(` `),Ee,a(` -`),s("span",ue,[Fe,Ce,ge,Te,s("span",be,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),me]),a(` +`),s("span",ue,[Fe,Ce,ge,be,s("span",Te,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),me]),a(` `),Se,a(` `),ve])]),s("pre",ke,[s("code",null,[Ae,a(` `),Be,a(` `),fe,a(` `),Pe,a(` -`),s("span",qe,[Ie,xe,Ve,De,s("span",Re,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),we]),a(` +`),s("span",qe,[Ie,xe,Ve,Re,s("span",De,' ">'+n(t(e).mainnetChainId)+'.*tar" ',1),we]),a(` `),Ne,a(` -`),$e])])]),s("div",Me,[Oe,He,s("pre",Le,[s("code",null,[je,a(` -`),ze,a(` -`),Qe,a(` +`),Oe])])]),s("div",$e,[Me,He,s("pre",Le,[s("code",null,[Qe,a(` `),Ue,a(` -`),s("span",We,[Xe,Ge,Je,Ke,s("span",Ze,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),Ye]),a(` +`),je,a(` +`),We,a(` +`),s("span",Ge,[Xe,ze,Ye,Je,s("span",Ze,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),Ke]),a(` `),sn,a(` `),on])]),s("pre",an,[s("code",null,[en,a(` `),nn,a(` @@ -42,16 +42,16 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,t `),ln,a(` `),s("span",pn,[cn,rn,dn,_n,s("span",yn,' ">'+n(t(e).mochaChainId)+'.*tar" ',1),hn]),a(` `),En,a(` -`),un])])]),s("div",Fn,[Cn,gn,s("pre",Tn,[s("code",null,[bn,a(` +`),un])])]),s("div",Fn,[Cn,gn,s("pre",bn,[s("code",null,[Tn,a(` `),mn,a(` `),Sn,a(` `),vn,a(` `),s("span",kn,[An,Bn,fn,Pn,s("span",qn,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),In]),a(` `),xn,a(` -`),Vn])]),s("pre",Dn,[s("code",null,[Rn,a(` +`),Vn])]),s("pre",Rn,[s("code",null,[Dn,a(` `),wn,a(` `),Nn,a(` -`),$n,a(` -`),s("span",Mn,[On,Hn,Ln,jn,s("span",zn,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),Qn]),a(` -`),Un,a(` -`),Wn])])])])]),Xn]))}});export{ot as __pageData,at as default}; +`),On,a(` +`),s("span",$n,[Mn,Hn,Ln,Qn,s("span",Un,' ">'+n(t(e).arabicaChainId)+'.*tar" ',1),jn]),a(` +`),Wn,a(` +`),Gn])])])])]),Xn]))}});export{ot as __pageData,at as default}; diff --git a/pr-1699/assets/nodes_decide-node.md.ce340382.js b/pr-1699/assets/nodes_decide-node.md.12527b86.js similarity index 96% rename from pr-1699/assets/nodes_decide-node.md.ce340382.js rename to pr-1699/assets/nodes_decide-node.md.12527b86.js index 6ba735b808..1961b5d8cb 100644 --- a/pr-1699/assets/nodes_decide-node.md.ce340382.js +++ b/pr-1699/assets/nodes_decide-node.md.12527b86.js @@ -1 +1 @@ -import{_ as e,o as n,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const _=JSON.parse('{"title":"Deciding which node to run","description":"Guide on helping you decide which type of node to run.","frontmatter":{"description":"Guide on helping you decide which type of node to run.","head":[["meta",{"name":"og:title","content":"Deciding which node to run | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/decide-node.md","filePath":"nodes/decide-node.md","lastUpdated":1725971357000}'),t={name:"nodes/decide-node.md"},i=a('

    Deciding which node to run

    Now that you have installed the basic dependencies, you can start exploring which nodes to run!

    Beginner

    It is highly recommended if you are a beginner to get started with running a Data-Availability light node.

    In order to get started, you can proceed to the light node section.

    You can also play around with the Data Availability API in this tutorial for posting and retrieving data with a light node.

    Advanced

    If you are looking to run a consensus node, please follow the tutorial for running a consensus node.

    Note that running a validator means you must also run a bridge node, which is covered in this section.

    ',9),d=[i];function r(c,h,s,l,u,p){return n(),o("div",null,d)}const f=e(t,[["render",r]]);export{_ as __pageData,f as default}; +import{_ as e,o as n,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const _=JSON.parse('{"title":"Deciding which node to run","description":"Guide on helping you decide which type of node to run.","frontmatter":{"description":"Guide on helping you decide which type of node to run.","head":[["meta",{"name":"og:title","content":"Deciding which node to run | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/decide-node.md","filePath":"nodes/decide-node.md","lastUpdated":1725992025000}'),t={name:"nodes/decide-node.md"},i=a('

    Deciding which node to run

    Now that you have installed the basic dependencies, you can start exploring which nodes to run!

    Beginner

    It is highly recommended if you are a beginner to get started with running a Data-Availability light node.

    In order to get started, you can proceed to the light node section.

    You can also play around with the Data Availability API in this tutorial for posting and retrieving data with a light node.

    Advanced

    If you are looking to run a consensus node, please follow the tutorial for running a consensus node.

    Note that running a validator means you must also run a bridge node, which is covered in this section.

    ',9),d=[i];function r(c,h,s,l,u,p){return n(),o("div",null,d)}const f=e(t,[["render",r]]);export{_ as __pageData,f as default}; diff --git a/pr-1699/assets/nodes_decide-node.md.ce340382.lean.js b/pr-1699/assets/nodes_decide-node.md.12527b86.lean.js similarity index 90% rename from pr-1699/assets/nodes_decide-node.md.ce340382.lean.js rename to pr-1699/assets/nodes_decide-node.md.12527b86.lean.js index c625481f4b..bd8b52148a 100644 --- a/pr-1699/assets/nodes_decide-node.md.ce340382.lean.js +++ b/pr-1699/assets/nodes_decide-node.md.12527b86.lean.js @@ -1 +1 @@ -import{_ as e,o as n,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const _=JSON.parse('{"title":"Deciding which node to run","description":"Guide on helping you decide which type of node to run.","frontmatter":{"description":"Guide on helping you decide which type of node to run.","head":[["meta",{"name":"og:title","content":"Deciding which node to run | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/decide-node.md","filePath":"nodes/decide-node.md","lastUpdated":1725971357000}'),t={name:"nodes/decide-node.md"},i=a("",9),d=[i];function r(c,h,s,l,u,p){return n(),o("div",null,d)}const f=e(t,[["render",r]]);export{_ as __pageData,f as default}; +import{_ as e,o as n,c as o,Q as a}from"./chunks/framework.b47e54aa.js";const _=JSON.parse('{"title":"Deciding which node to run","description":"Guide on helping you decide which type of node to run.","frontmatter":{"description":"Guide on helping you decide which type of node to run.","head":[["meta",{"name":"og:title","content":"Deciding which node to run | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/decide-node.md","filePath":"nodes/decide-node.md","lastUpdated":1725992025000}'),t={name:"nodes/decide-node.md"},i=a("",9),d=[i];function r(c,h,s,l,u,p){return n(),o("div",null,d)}const f=e(t,[["render",r]]);export{_ as __pageData,f as default}; diff --git a/pr-1699/assets/nodes_docker-images.md.c689a2da.js b/pr-1699/assets/nodes_docker-images.md.01970048.js similarity index 85% rename from pr-1699/assets/nodes_docker-images.md.c689a2da.js rename to pr-1699/assets/nodes_docker-images.md.01970048.js index c6bdd4945d..2b33316d08 100644 --- a/pr-1699/assets/nodes_docker-images.md.c689a2da.js +++ b/pr-1699/assets/nodes_docker-images.md.01970048.js @@ -1,59 +1,59 @@ -import{a as l}from"./chunks/arabica_versions.1930378b.js";import{m as t}from"./chunks/mocha_versions.7704b055.js";import{m as p}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as c,c as r,k as s,a,t as n,l as e,Q as o}from"./chunks/framework.b47e54aa.js";const _=o('

    🐳 Docker setup

    This page has instructions to run celestia-node using Docker. If you are looking for instructions to run celestia-node using a binary, please refer to the celestia-node page.

    Using Docker is the easiest way to run celestia-node for most users. Docker is a containerization platform that allows you to run celestia-node in an isolated environment.

    This means that you can run celestia-node on your machine without having to worry about installing and configuring all of the dependencies required to run the node.

    If you would like to learn more about key management in Docker, visit the Docker and cel-key section.

    The easiest way to install Docker is to use the Docker Desktop installer or Ubuntu. You can follow the instructions for your operating system.

    Prerequisites

    Quick start

    ',9),i=o('
  8. Set the network you would like to run your node on:

    bash
    export NETWORK=celestia
    export NETWORK=celestia
    bash
    export NETWORK=mocha
    export NETWORK=mocha
    bash
    export NETWORK=arabica
    export NETWORK=arabica
  9. Set the node type

    bash
    export NODE_TYPE=light
    export NODE_TYPE=light
    bash
    export NODE_TYPE=bridge
    export NODE_TYPE=bridge
    bash
    export NODE_TYPE=full
    export NODE_TYPE=full
  10. Set an RPC endpoint for either Mainnet Beta, Mocha, or Arabica using the bare URL (without http or https):

    bash
    export RPC_URL=this-is-an-rpc-url.com
    export RPC_URL=this-is-an-rpc-url.com
  11. ',3),E=s("p",null,"Run the image from the command line:",-1),y={class:"vp-code-group vp-adaptive-theme"},d=o('
    ',1),h={class:"blocks"},T={class:"language-bash vp-adaptive-theme active"},F=s("button",{title:"Copy Code",class:"copy"},null,-1),C=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),b={class:"line"},v=s("span",{style:{color:"#E1E4E8"}}," ",-1),P={style:{color:"#9ECBFF"}},k=s("span",{style:{color:"#E1E4E8"}}," ",-1),m=s("span",{style:{color:"#79B8FF"}},"\\",-1),A=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),S={class:"shiki github-light vp-code-light"},B=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),N={class:"line"},D=s("span",{style:{color:"#24292E"}}," ",-1),R={style:{color:"#032F62"}},O=s("span",{style:{color:"#24292E"}}," ",-1),I=s("span",{style:{color:"#005CC5"}},"\\",-1),V=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),f={class:"language-bash vp-adaptive-theme"},$=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},K=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Y={class:"line"},x=s("span",{style:{color:"#E1E4E8"}}," ",-1),M={style:{color:"#9ECBFF"}},q=s("span",{style:{color:"#E1E4E8"}}," ",-1),L=s("span",{style:{color:"#79B8FF"}},"\\",-1),H=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),U={class:"shiki github-light vp-code-light"},z=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Q={class:"line"},j=s("span",{style:{color:"#24292E"}}," ",-1),X={style:{color:"#032F62"}},J=s("span",{style:{color:"#24292E"}}," ",-1),Z=s("span",{style:{color:"#005CC5"}},"\\",-1),G=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),ss={class:"language-bash vp-adaptive-theme"},os=s("button",{title:"Copy Code",class:"copy"},null,-1),as=s("span",{class:"lang"},"bash",-1),ns={class:"shiki github-dark vp-code-dark"},es=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ls={class:"line"},ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ps={style:{color:"#9ECBFF"}},cs=s("span",{style:{color:"#E1E4E8"}}," ",-1),rs=s("span",{style:{color:"#79B8FF"}},"\\",-1),_s=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),is={class:"shiki github-light vp-code-light"},Es=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ys={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#032F62"}},Ts=s("span",{style:{color:"#24292E"}}," ",-1),Fs=s("span",{style:{color:"#005CC5"}},"\\",-1),Cs=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),us=o(`

    Congratulations! You now have a celestia-node running!

    If you would like to run the node with custom flags, you can refer to the celestia-node tutorial page. Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    Light node setup with persistent storage

    If you delete a container that you started above, all data will be lost. To avoid this, you can mount a volume to the container. This will allow you to persist data even after the container is deleted.

    First, you will need to create a directory on your host machine. This directory will be used to store the data for the container. Create a directory on your host machine and give it a name. For example, you can name it my-node-store:

    bash
    cd $HOME
    +import{a as l}from"./chunks/arabica_versions.1930378b.js";import{m as t}from"./chunks/mocha_versions.7704b055.js";import{m as p}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as c,c as r,k as s,a,t as n,l as e,Q as o}from"./chunks/framework.b47e54aa.js";const _=o('

    🐳 Docker setup

    This page has instructions to run celestia-node using Docker. If you are looking for instructions to run celestia-node using a binary, please refer to the celestia-node page.

    Using Docker is the easiest way to run celestia-node for most users. Docker is a containerization platform that allows you to run celestia-node in an isolated environment.

    This means that you can run celestia-node on your machine without having to worry about installing and configuring all of the dependencies required to run the node.

    If you would like to learn more about key management in Docker, visit the Docker and cel-key section.

    The easiest way to install Docker is to use the Docker Desktop installer or Ubuntu. You can follow the instructions for your operating system.

    Prerequisites

    Quick start

    ',9),i=o('
  12. Set the network you would like to run your node on:

    bash
    export NETWORK=celestia
    export NETWORK=celestia
    bash
    export NETWORK=mocha
    export NETWORK=mocha
    bash
    export NETWORK=arabica
    export NETWORK=arabica
  13. Set the node type

    bash
    export NODE_TYPE=light
    export NODE_TYPE=light
    bash
    export NODE_TYPE=bridge
    export NODE_TYPE=bridge
    bash
    export NODE_TYPE=full
    export NODE_TYPE=full
  14. Set an RPC endpoint for either Mainnet Beta, Mocha, or Arabica using the bare URL (without http or https):

    bash
    export RPC_URL=this-is-an-rpc-url.com
    export RPC_URL=this-is-an-rpc-url.com
  15. ',3),E=s("p",null,"Run the image from the command line:",-1),y={class:"vp-code-group vp-adaptive-theme"},d=o('
    ',1),h={class:"blocks"},T={class:"language-bash vp-adaptive-theme active"},F=s("button",{title:"Copy Code",class:"copy"},null,-1),C=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),b={class:"line"},v=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},P=s("span",{style:{color:"#E1E4E8"}}," ",-1),m=s("span",{style:{color:"#79B8FF"}},"\\",-1),A=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),S={class:"shiki github-light vp-code-light"},B=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),N={class:"line"},R=s("span",{style:{color:"#24292E"}}," ",-1),D={style:{color:"#032F62"}},O=s("span",{style:{color:"#24292E"}}," ",-1),V=s("span",{style:{color:"#005CC5"}},"\\",-1),I=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),f={class:"language-bash vp-adaptive-theme"},$=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),Y={class:"shiki github-dark vp-code-dark"},W=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),K={class:"line"},M=s("span",{style:{color:"#E1E4E8"}}," ",-1),x={style:{color:"#9ECBFF"}},L=s("span",{style:{color:"#E1E4E8"}}," ",-1),q=s("span",{style:{color:"#79B8FF"}},"\\",-1),H=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),U={class:"shiki github-light vp-code-light"},z=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),j={class:"line"},Q=s("span",{style:{color:"#24292E"}}," ",-1),Z={style:{color:"#032F62"}},J=s("span",{style:{color:"#24292E"}}," ",-1),X=s("span",{style:{color:"#005CC5"}},"\\",-1),G=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),ss={class:"language-bash vp-adaptive-theme"},os=s("button",{title:"Copy Code",class:"copy"},null,-1),as=s("span",{class:"lang"},"bash",-1),ns={class:"shiki github-dark vp-code-dark"},es=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ls={class:"line"},ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ps={style:{color:"#9ECBFF"}},cs=s("span",{style:{color:"#E1E4E8"}}," ",-1),rs=s("span",{style:{color:"#79B8FF"}},"\\",-1),_s=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),is={class:"shiki github-light vp-code-light"},Es=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ys={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#032F62"}},Ts=s("span",{style:{color:"#24292E"}}," ",-1),Fs=s("span",{style:{color:"#005CC5"}},"\\",-1),Cs=o(' celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK',1),us=o(`

    Congratulations! You now have a celestia-node running!

    If you would like to run the node with custom flags, you can refer to the celestia-node tutorial page. Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    Light node setup with persistent storage

    If you delete a container that you started above, all data will be lost. To avoid this, you can mount a volume to the container. This will allow you to persist data even after the container is deleted.

    First, you will need to create a directory on your host machine. This directory will be used to store the data for the container. Create a directory on your host machine and give it a name. For example, you can name it my-node-store:

    bash
    cd $HOME
     mkdir my-node-store
    cd $HOME
    -mkdir my-node-store

    Now, you can mount this directory to the container. Before mounting a volume, you may need to set permissions for the user on the host machine by running:

    bash
    sudo chown 10001:10001 $HOME/my-node-store
    sudo chown 10001:10001 $HOME/my-node-store
    bash
    # you're good to go 😎
    # you're good to go 😎

    Initialize the node store and key

    In order to mount a volume to the container, you need to specify the path to the volume. When you run your container, you can specify the path to the volume using the --volume (or -v for short) flag. In this command, we'll create our key and initialize the node store, using the variables we set in the quick start section:

    bash
    # --volume == -v [local path]:[container path]
    +mkdir my-node-store

    Now, you can mount this directory to the container. Before mounting a volume, you may need to set permissions for the user on the host machine by running:

    bash
    sudo chown 10001:10001 $HOME/my-node-store
    sudo chown 10001:10001 $HOME/my-node-store
    bash
    # you're good to go 😎
    # you're good to go 😎

    Initialize the node store and key

    In order to mount a volume to the container, you need to specify the path to the volume. When you run your container, you can specify the path to the volume using the --volume (or -v for short) flag. In this command, we'll create our key and initialize the node store, using the variables we set in the quick start section:

    bash
    # --volume == -v [local path]:[container path]
     docker run [args...] -v $HOME/my-node-store:/home/celestia \\
         celestia $NODE_TYPE init [args...]
    # --volume == -v [local path]:[container path]
     docker run [args...] -v $HOME/my-node-store:/home/celestia \\
    -    celestia $NODE_TYPE init [args...]

    An example init command will look similar to below:

    `,12),gs={class:"vp-code-group vp-adaptive-theme"},bs=o('
    ',1),vs={class:"blocks"},Ps={class:"language-bash vp-adaptive-theme active"},ks=s("button",{title:"Copy Code",class:"copy"},null,-1),ms=s("span",{class:"lang"},"bash",-1),As={class:"shiki github-dark vp-code-dark"},Ss=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Bs=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ns={class:"line"},Ds=s("span",{style:{color:"#E1E4E8"}}," ",-1),Rs={style:{color:"#9ECBFF"}},Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),Is=s("span",{style:{color:"#79B8FF"}},"\\",-1),Vs=o(' celestia light init --p2p.network $NETWORK',1),fs={class:"shiki github-light vp-code-light"},$s=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ws=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ws={class:"line"},Ks=s("span",{style:{color:"#24292E"}}," ",-1),Ys={style:{color:"#032F62"}},xs=s("span",{style:{color:"#24292E"}}," ",-1),Ms=s("span",{style:{color:"#005CC5"}},"\\",-1),qs=o(' celestia light init --p2p.network $NETWORK',1),Ls={class:"language-bash vp-adaptive-theme"},Hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Us=s("span",{class:"lang"},"bash",-1),zs={class:"shiki github-dark vp-code-dark"},Qs=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),js=o(' -v $HOME/my-node-store:/home/celestia \\',1),Xs={class:"line"},Js=s("span",{style:{color:"#E1E4E8"}}," ",-1),Zs={style:{color:"#9ECBFF"}},Gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),so=s("span",{style:{color:"#79B8FF"}},"\\",-1),oo=o(' celestia light init --p2p.network $NETWORK',1),ao={class:"shiki github-light vp-code-light"},no=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),eo=o(' -v $HOME/my-node-store:/home/celestia \\',1),lo={class:"line"},to=s("span",{style:{color:"#24292E"}}," ",-1),po={style:{color:"#032F62"}},co=s("span",{style:{color:"#24292E"}}," ",-1),ro=s("span",{style:{color:"#005CC5"}},"\\",-1),_o=o(' celestia light init --p2p.network $NETWORK',1),io={class:"language-bash vp-adaptive-theme"},Eo=s("button",{title:"Copy Code",class:"copy"},null,-1),yo=s("span",{class:"lang"},"bash",-1),ho={class:"shiki github-dark vp-code-dark"},To=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Fo=o(' -v $HOME/my-node-store:/home/celestia \\',1),Co={class:"line"},uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),go={style:{color:"#9ECBFF"}},bo=s("span",{style:{color:"#E1E4E8"}}," ",-1),vo=s("span",{style:{color:"#79B8FF"}},"\\",-1),Po=o(' celestia light init --p2p.network $NETWORK',1),ko={class:"shiki github-light vp-code-light"},mo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ao=o(' -v $HOME/my-node-store:/home/celestia \\',1),So={class:"line"},Bo=s("span",{style:{color:"#24292E"}}," ",-1),No={style:{color:"#032F62"}},Do=s("span",{style:{color:"#24292E"}}," ",-1),Ro=s("span",{style:{color:"#005CC5"}},"\\",-1),Oo=o(' celestia light init --p2p.network $NETWORK',1),Io=o(`

    Start the node

    Run the following command to start the node:

    bash
    # --volume == -v [local path]:[container path]
    +    celestia $NODE_TYPE init [args...]

    An example init command will look similar to below:

    `,12),gs={class:"vp-code-group vp-adaptive-theme"},bs=o('
    ',1),vs={class:"blocks"},ks={class:"language-bash vp-adaptive-theme active"},Ps=s("button",{title:"Copy Code",class:"copy"},null,-1),ms=s("span",{class:"lang"},"bash",-1),As={class:"shiki github-dark vp-code-dark"},Ss=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Bs=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ns={class:"line"},Rs=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ds={style:{color:"#9ECBFF"}},Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),Vs=s("span",{style:{color:"#79B8FF"}},"\\",-1),Is=o(' celestia light init --p2p.network $NETWORK',1),fs={class:"shiki github-light vp-code-light"},$s=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ws=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ys={class:"line"},Ws=s("span",{style:{color:"#24292E"}}," ",-1),Ks={style:{color:"#032F62"}},Ms=s("span",{style:{color:"#24292E"}}," ",-1),xs=s("span",{style:{color:"#005CC5"}},"\\",-1),Ls=o(' celestia light init --p2p.network $NETWORK',1),qs={class:"language-bash vp-adaptive-theme"},Hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Us=s("span",{class:"lang"},"bash",-1),zs={class:"shiki github-dark vp-code-dark"},js=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Qs=o(' -v $HOME/my-node-store:/home/celestia \\',1),Zs={class:"line"},Js=s("span",{style:{color:"#E1E4E8"}}," ",-1),Xs={style:{color:"#9ECBFF"}},Gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),so=s("span",{style:{color:"#79B8FF"}},"\\",-1),oo=o(' celestia light init --p2p.network $NETWORK',1),ao={class:"shiki github-light vp-code-light"},no=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),eo=o(' -v $HOME/my-node-store:/home/celestia \\',1),lo={class:"line"},to=s("span",{style:{color:"#24292E"}}," ",-1),po={style:{color:"#032F62"}},co=s("span",{style:{color:"#24292E"}}," ",-1),ro=s("span",{style:{color:"#005CC5"}},"\\",-1),_o=o(' celestia light init --p2p.network $NETWORK',1),io={class:"language-bash vp-adaptive-theme"},Eo=s("button",{title:"Copy Code",class:"copy"},null,-1),yo=s("span",{class:"lang"},"bash",-1),ho={class:"shiki github-dark vp-code-dark"},To=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Fo=o(' -v $HOME/my-node-store:/home/celestia \\',1),Co={class:"line"},uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),go={style:{color:"#9ECBFF"}},bo=s("span",{style:{color:"#E1E4E8"}}," ",-1),vo=s("span",{style:{color:"#79B8FF"}},"\\",-1),ko=o(' celestia light init --p2p.network $NETWORK',1),Po={class:"shiki github-light vp-code-light"},mo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ao=o(' -v $HOME/my-node-store:/home/celestia \\',1),So={class:"line"},Bo=s("span",{style:{color:"#24292E"}}," ",-1),No={style:{color:"#032F62"}},Ro=s("span",{style:{color:"#24292E"}}," ",-1),Do=s("span",{style:{color:"#005CC5"}},"\\",-1),Oo=o(' celestia light init --p2p.network $NETWORK',1),Vo=o(`

    Start the node

    Run the following command to start the node:

    bash
    # --volume == -v [local path]:[container path]
     docker run [...args] -v $HOME/my-node-store:/home/celestia \\
         celestia <node-type> start [...args]
    # --volume == -v [local path]:[container path]
     docker run [...args] -v $HOME/my-node-store:/home/celestia \\
    -    celestia <node-type> start [...args]

    A full start command will look similar to below.

    `,4),Vo={class:"vp-code-group vp-adaptive-theme"},fo=o('
    ',1),$o={class:"blocks"},wo={class:"language-bash vp-adaptive-theme active"},Wo=s("button",{title:"Copy Code",class:"copy"},null,-1),Ko=s("span",{class:"lang"},"bash",-1),Yo={class:"shiki github-dark vp-code-dark"},xo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Mo=o(' -v $HOME/my-node-store:/home/celestia \\',1),qo={class:"line"},Lo=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ho={style:{color:"#9ECBFF"}},Uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),zo=s("span",{style:{color:"#79B8FF"}},"\\",-1),Qo=o(' celestia light start --core.ip $RPC_URL',1),jo={class:"shiki github-light vp-code-light"},Xo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Jo=o(' -v $HOME/my-node-store:/home/celestia \\',1),Zo={class:"line"},Go=s("span",{style:{color:"#24292E"}}," ",-1),sa={style:{color:"#032F62"}},oa=s("span",{style:{color:"#24292E"}}," ",-1),aa=s("span",{style:{color:"#005CC5"}},"\\",-1),na=o(' celestia light start --core.ip $RPC_URL',1),ea={class:"language-bash vp-adaptive-theme"},la=s("button",{title:"Copy Code",class:"copy"},null,-1),ta=s("span",{class:"lang"},"bash",-1),pa={class:"shiki github-dark vp-code-dark"},ca=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ra=o(' -v $HOME/my-node-store:/home/celestia \\',1),_a={class:"line"},ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ea={style:{color:"#9ECBFF"}},ya=s("span",{style:{color:"#E1E4E8"}}," ",-1),da=s("span",{style:{color:"#79B8FF"}},"\\",-1),ha=o(' celestia light start --core.ip $RPC_URL',1),Ta={class:"shiki github-light vp-code-light"},Fa=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ca=o(' -v $HOME/my-node-store:/home/celestia \\',1),ua={class:"line"},ga=s("span",{style:{color:"#24292E"}}," ",-1),ba={style:{color:"#032F62"}},va=s("span",{style:{color:"#24292E"}}," ",-1),Pa=s("span",{style:{color:"#005CC5"}},"\\",-1),ka=o(' celestia light start --core.ip $RPC_URL',1),ma={class:"language-bash vp-adaptive-theme"},Aa=s("button",{title:"Copy Code",class:"copy"},null,-1),Sa=s("span",{class:"lang"},"bash",-1),Ba={class:"shiki github-dark vp-code-dark"},Na=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Da=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ra={class:"line"},Oa=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ia={style:{color:"#9ECBFF"}},Va=s("span",{style:{color:"#E1E4E8"}}," ",-1),fa=s("span",{style:{color:"#79B8FF"}},"\\",-1),$a=o(' celestia light start --core.ip $RPC_URL',1),wa={class:"shiki github-light vp-code-light"},Wa=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ka=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ya={class:"line"},xa=s("span",{style:{color:"#24292E"}}," ",-1),Ma={style:{color:"#032F62"}},qa=s("span",{style:{color:"#24292E"}}," ",-1),La=s("span",{style:{color:"#005CC5"}},"\\",-1),Ha=o(' celestia light start --core.ip $RPC_URL',1),Ua=s("p",null,"Congratulations! You now have a node running with persistent storage.",-1),za=s("h2",{id:"video-walkthrough",tabindex:"-1"},[a("Video walkthrough "),s("a",{class:"header-anchor",href:"#video-walkthrough","aria-label":'Permalink to "Video walkthrough"'},"​")],-1),Qa=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/WFubhQc8tGk",allowfullscreen:""})],-1),ja=s("h3",{id:"_2-5-minute-version",tabindex:"-1"},[a("2.5 minute version "),s("a",{class:"header-anchor",href:"#_2-5-minute-version","aria-label":'Permalink to "2.5 minute version"'},"​")],-1),Xa=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/ROZv871Q7RM",allowfullscreen:""})],-1),Ja=s("h2",{id:"troubleshooting",tabindex:"-1"},[a("Troubleshooting "),s("a",{class:"header-anchor",href:"#troubleshooting","aria-label":'Permalink to "Troubleshooting"'},"​")],-1),Za=s("p",null,[a("For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find "),s("a",{href:"https://learn.microsoft.com/en-us/windows/wsl/install",target:"_blank",rel:"noreferrer"},"instructions for installing WSL"),a(".")],-1),pn=JSON.parse('{"title":"🐳 Docker setup","description":"Running Celestia Node using Docker.","frontmatter":{"sidebar_label":"Docker images","description":"Running Celestia Node using Docker.","head":[["meta",{"name":"og:title","content":"🐳 Docker setup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/docker-images.md","filePath":"nodes/docker-images.md","lastUpdated":1725971357000}'),Ga={name:"nodes/docker-images.md"},cn=Object.assign(Ga,{setup(sn){return(on,an)=>(c(),r("div",null,[_,s("ol",null,[i,s("li",null,[E,s("div",y,[d,s("div",h,[s("div",T,[F,C,s("pre",u,[s("code",null,[g,a(` -`),s("span",b,[v,s("span",P,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),k,m]),a(` + celestia <node-type> start [...args]

    A full start command will look similar to below.

    `,4),Io={class:"vp-code-group vp-adaptive-theme"},fo=o('
    ',1),$o={class:"blocks"},wo={class:"language-bash vp-adaptive-theme active"},Yo=s("button",{title:"Copy Code",class:"copy"},null,-1),Wo=s("span",{class:"lang"},"bash",-1),Ko={class:"shiki github-dark vp-code-dark"},Mo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),xo=o(' -v $HOME/my-node-store:/home/celestia \\',1),Lo={class:"line"},qo=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ho={style:{color:"#9ECBFF"}},Uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),zo=s("span",{style:{color:"#79B8FF"}},"\\",-1),jo=o(' celestia light start --core.ip $RPC_URL',1),Qo={class:"shiki github-light vp-code-light"},Zo=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Jo=o(' -v $HOME/my-node-store:/home/celestia \\',1),Xo={class:"line"},Go=s("span",{style:{color:"#24292E"}}," ",-1),sa={style:{color:"#032F62"}},oa=s("span",{style:{color:"#24292E"}}," ",-1),aa=s("span",{style:{color:"#005CC5"}},"\\",-1),na=o(' celestia light start --core.ip $RPC_URL',1),ea={class:"language-bash vp-adaptive-theme"},la=s("button",{title:"Copy Code",class:"copy"},null,-1),ta=s("span",{class:"lang"},"bash",-1),pa={class:"shiki github-dark vp-code-dark"},ca=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),ra=o(' -v $HOME/my-node-store:/home/celestia \\',1),_a={class:"line"},ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ea={style:{color:"#9ECBFF"}},ya=s("span",{style:{color:"#E1E4E8"}}," ",-1),da=s("span",{style:{color:"#79B8FF"}},"\\",-1),ha=o(' celestia light start --core.ip $RPC_URL',1),Ta={class:"shiki github-light vp-code-light"},Fa=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ca=o(' -v $HOME/my-node-store:/home/celestia \\',1),ua={class:"line"},ga=s("span",{style:{color:"#24292E"}}," ",-1),ba={style:{color:"#032F62"}},va=s("span",{style:{color:"#24292E"}}," ",-1),ka=s("span",{style:{color:"#005CC5"}},"\\",-1),Pa=o(' celestia light start --core.ip $RPC_URL',1),ma={class:"language-bash vp-adaptive-theme"},Aa=s("button",{title:"Copy Code",class:"copy"},null,-1),Sa=s("span",{class:"lang"},"bash",-1),Ba={class:"shiki github-dark vp-code-dark"},Na=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Ra=o(' -v $HOME/my-node-store:/home/celestia \\',1),Da={class:"line"},Oa=s("span",{style:{color:"#E1E4E8"}}," ",-1),Va={style:{color:"#9ECBFF"}},Ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),fa=s("span",{style:{color:"#79B8FF"}},"\\",-1),$a=o(' celestia light start --core.ip $RPC_URL',1),wa={class:"shiki github-light vp-code-light"},Ya=o('docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \\',1),Wa=o(' -v $HOME/my-node-store:/home/celestia \\',1),Ka={class:"line"},Ma=s("span",{style:{color:"#24292E"}}," ",-1),xa={style:{color:"#032F62"}},La=s("span",{style:{color:"#24292E"}}," ",-1),qa=s("span",{style:{color:"#005CC5"}},"\\",-1),Ha=o(' celestia light start --core.ip $RPC_URL',1),Ua=s("p",null,"Congratulations! You now have a node running with persistent storage.",-1),za=s("h2",{id:"video-walkthrough",tabindex:"-1"},[a("Video walkthrough "),s("a",{class:"header-anchor",href:"#video-walkthrough","aria-label":'Permalink to "Video walkthrough"'},"​")],-1),ja=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/WFubhQc8tGk",allowfullscreen:""})],-1),Qa=s("h3",{id:"_2-5-minute-version",tabindex:"-1"},[a("2.5 minute version "),s("a",{class:"header-anchor",href:"#_2-5-minute-version","aria-label":'Permalink to "2.5 minute version"'},"​")],-1),Za=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/ROZv871Q7RM",allowfullscreen:""})],-1),Ja=s("h2",{id:"troubleshooting",tabindex:"-1"},[a("Troubleshooting "),s("a",{class:"header-anchor",href:"#troubleshooting","aria-label":'Permalink to "Troubleshooting"'},"​")],-1),Xa=s("p",null,[a("For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find "),s("a",{href:"https://learn.microsoft.com/en-us/windows/wsl/install",target:"_blank",rel:"noreferrer"},"instructions for installing WSL"),a(".")],-1),pn=JSON.parse('{"title":"🐳 Docker setup","description":"Running Celestia Node using Docker.","frontmatter":{"sidebar_label":"Docker images","description":"Running Celestia Node using Docker.","head":[["meta",{"name":"og:title","content":"🐳 Docker setup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/docker-images.md","filePath":"nodes/docker-images.md","lastUpdated":1725992025000}'),Ga={name:"nodes/docker-images.md"},cn=Object.assign(Ga,{setup(sn){return(on,an)=>(c(),r("div",null,[_,s("ol",null,[i,s("li",null,[E,s("div",y,[d,s("div",h,[s("div",T,[F,C,s("pre",u,[s("code",null,[g,a(` +`),s("span",b,[v,s("span",k,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),P,m]),a(` `),A])]),s("pre",S,[s("code",null,[B,a(` -`),s("span",N,[D,s("span",R,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),O,I]),a(` -`),V])])]),s("div",f,[$,w,s("pre",W,[s("code",null,[K,a(` -`),s("span",Y,[x,s("span",M,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),q,L]),a(` +`),s("span",N,[R,s("span",D,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),O,V]),a(` +`),I])])]),s("div",f,[$,w,s("pre",Y,[s("code",null,[W,a(` +`),s("span",K,[M,s("span",x,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),L,q]),a(` `),H])]),s("pre",U,[s("code",null,[z,a(` -`),s("span",Q,[j,s("span",X,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),J,Z]),a(` +`),s("span",j,[Q,s("span",Z,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),J,X]),a(` `),G])])]),s("div",ss,[os,as,s("pre",ns,[s("code",null,[es,a(` `),s("span",ls,[ts,s("span",ps,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),cs,rs]),a(` `),_s])]),s("pre",is,[s("code",null,[Es,a(` `),s("span",ys,[ds,s("span",hs,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ts,Fs]),a(` -`),Cs])])])])])])]),us,s("div",gs,[bs,s("div",vs,[s("div",Ps,[ks,ms,s("pre",As,[s("code",null,[Ss,a(` +`),Cs])])])])])])]),us,s("div",gs,[bs,s("div",vs,[s("div",ks,[Ps,ms,s("pre",As,[s("code",null,[Ss,a(` `),Bs,a(` -`),s("span",Ns,[Ds,s("span",Rs,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Os,Is]),a(` -`),Vs])]),s("pre",fs,[s("code",null,[$s,a(` +`),s("span",Ns,[Rs,s("span",Ds,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Os,Vs]),a(` +`),Is])]),s("pre",fs,[s("code",null,[$s,a(` `),ws,a(` -`),s("span",Ws,[Ks,s("span",Ys,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),xs,Ms]),a(` -`),qs])])]),s("div",Ls,[Hs,Us,s("pre",zs,[s("code",null,[Qs,a(` -`),js,a(` -`),s("span",Xs,[Js,s("span",Zs,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),Gs,so]),a(` +`),s("span",Ys,[Ws,s("span",Ks,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Ms,xs]),a(` +`),Ls])])]),s("div",qs,[Hs,Us,s("pre",zs,[s("code",null,[js,a(` +`),Qs,a(` +`),s("span",Zs,[Js,s("span",Xs,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),Gs,so]),a(` `),oo])]),s("pre",ao,[s("code",null,[no,a(` `),eo,a(` `),s("span",lo,[to,s("span",po,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),co,ro]),a(` `),_o])])]),s("div",io,[Eo,yo,s("pre",ho,[s("code",null,[To,a(` `),Fo,a(` `),s("span",Co,[uo,s("span",go,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),bo,vo]),a(` -`),Po])]),s("pre",ko,[s("code",null,[mo,a(` +`),ko])]),s("pre",Po,[s("code",null,[mo,a(` `),Ao,a(` -`),s("span",So,[Bo,s("span",No,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Do,Ro]),a(` -`),Oo])])])])]),Io,s("div",Vo,[fo,s("div",$o,[s("div",wo,[Wo,Ko,s("pre",Yo,[s("code",null,[xo,a(` -`),Mo,a(` -`),s("span",qo,[Lo,s("span",Ho,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Uo,zo]),a(` -`),Qo])]),s("pre",jo,[s("code",null,[Xo,a(` +`),s("span",So,[Bo,s("span",No,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ro,Do]),a(` +`),Oo])])])])]),Vo,s("div",Io,[fo,s("div",$o,[s("div",wo,[Yo,Wo,s("pre",Ko,[s("code",null,[Mo,a(` +`),xo,a(` +`),s("span",Lo,[qo,s("span",Ho,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Uo,zo]),a(` +`),jo])]),s("pre",Qo,[s("code",null,[Zo,a(` `),Jo,a(` -`),s("span",Zo,[Go,s("span",sa,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),oa,aa]),a(` +`),s("span",Xo,[Go,s("span",sa,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),oa,aa]),a(` `),na])])]),s("div",ea,[la,ta,s("pre",pa,[s("code",null,[ca,a(` `),ra,a(` `),s("span",_a,[ia,s("span",Ea,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),ya,da]),a(` `),ha])]),s("pre",Ta,[s("code",null,[Fa,a(` `),Ca,a(` -`),s("span",ua,[ga,s("span",ba,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),va,Pa]),a(` -`),ka])])]),s("div",ma,[Aa,Sa,s("pre",Ba,[s("code",null,[Na,a(` -`),Da,a(` -`),s("span",Ra,[Oa,s("span",Ia,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Va,fa]),a(` -`),$a])]),s("pre",wa,[s("code",null,[Wa,a(` -`),Ka,a(` -`),s("span",Ya,[xa,s("span",Ma,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),qa,La]),a(` -`),Ha])])])])]),Ua,za,Qa,ja,Xa,Ja,Za]))}});export{pn as __pageData,cn as default}; +`),s("span",ua,[ga,s("span",ba,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),va,ka]),a(` +`),Pa])])]),s("div",ma,[Aa,Sa,s("pre",Ba,[s("code",null,[Na,a(` +`),Ra,a(` +`),s("span",Da,[Oa,s("span",Va,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ia,fa]),a(` +`),$a])]),s("pre",wa,[s("code",null,[Ya,a(` +`),Wa,a(` +`),s("span",Ka,[Ma,s("span",xa,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),La,qa]),a(` +`),Ha])])])])]),Ua,za,ja,Qa,Za,Ja,Xa]))}});export{pn as __pageData,cn as default}; diff --git a/pr-1699/assets/nodes_docker-images.md.c689a2da.lean.js b/pr-1699/assets/nodes_docker-images.md.01970048.lean.js similarity index 60% rename from pr-1699/assets/nodes_docker-images.md.c689a2da.lean.js rename to pr-1699/assets/nodes_docker-images.md.01970048.lean.js index 0ba1fdd4fa..f1fc10f8a0 100644 --- a/pr-1699/assets/nodes_docker-images.md.c689a2da.lean.js +++ b/pr-1699/assets/nodes_docker-images.md.01970048.lean.js @@ -1,49 +1,49 @@ -import{a as l}from"./chunks/arabica_versions.1930378b.js";import{m as t}from"./chunks/mocha_versions.7704b055.js";import{m as p}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as c,c as r,k as s,a,t as n,l as e,Q as o}from"./chunks/framework.b47e54aa.js";const _=o("",9),i=o("",3),E=s("p",null,"Run the image from the command line:",-1),y={class:"vp-code-group vp-adaptive-theme"},d=o("",1),h={class:"blocks"},T={class:"language-bash vp-adaptive-theme active"},F=s("button",{title:"Copy Code",class:"copy"},null,-1),C=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g=o("",1),b={class:"line"},v=s("span",{style:{color:"#E1E4E8"}}," ",-1),P={style:{color:"#9ECBFF"}},k=s("span",{style:{color:"#E1E4E8"}}," ",-1),m=s("span",{style:{color:"#79B8FF"}},"\\",-1),A=o("",1),S={class:"shiki github-light vp-code-light"},B=o("",1),N={class:"line"},D=s("span",{style:{color:"#24292E"}}," ",-1),R={style:{color:"#032F62"}},O=s("span",{style:{color:"#24292E"}}," ",-1),I=s("span",{style:{color:"#005CC5"}},"\\",-1),V=o("",1),f={class:"language-bash vp-adaptive-theme"},$=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),W={class:"shiki github-dark vp-code-dark"},K=o("",1),Y={class:"line"},x=s("span",{style:{color:"#E1E4E8"}}," ",-1),M={style:{color:"#9ECBFF"}},q=s("span",{style:{color:"#E1E4E8"}}," ",-1),L=s("span",{style:{color:"#79B8FF"}},"\\",-1),H=o("",1),U={class:"shiki github-light vp-code-light"},z=o("",1),Q={class:"line"},j=s("span",{style:{color:"#24292E"}}," ",-1),X={style:{color:"#032F62"}},J=s("span",{style:{color:"#24292E"}}," ",-1),Z=s("span",{style:{color:"#005CC5"}},"\\",-1),G=o("",1),ss={class:"language-bash vp-adaptive-theme"},os=s("button",{title:"Copy Code",class:"copy"},null,-1),as=s("span",{class:"lang"},"bash",-1),ns={class:"shiki github-dark vp-code-dark"},es=o("",1),ls={class:"line"},ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ps={style:{color:"#9ECBFF"}},cs=s("span",{style:{color:"#E1E4E8"}}," ",-1),rs=s("span",{style:{color:"#79B8FF"}},"\\",-1),_s=o("",1),is={class:"shiki github-light vp-code-light"},Es=o("",1),ys={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#032F62"}},Ts=s("span",{style:{color:"#24292E"}}," ",-1),Fs=s("span",{style:{color:"#005CC5"}},"\\",-1),Cs=o("",1),us=o("",12),gs={class:"vp-code-group vp-adaptive-theme"},bs=o("",1),vs={class:"blocks"},Ps={class:"language-bash vp-adaptive-theme active"},ks=s("button",{title:"Copy Code",class:"copy"},null,-1),ms=s("span",{class:"lang"},"bash",-1),As={class:"shiki github-dark vp-code-dark"},Ss=o("",1),Bs=o("",1),Ns={class:"line"},Ds=s("span",{style:{color:"#E1E4E8"}}," ",-1),Rs={style:{color:"#9ECBFF"}},Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),Is=s("span",{style:{color:"#79B8FF"}},"\\",-1),Vs=o("",1),fs={class:"shiki github-light vp-code-light"},$s=o("",1),ws=o("",1),Ws={class:"line"},Ks=s("span",{style:{color:"#24292E"}}," ",-1),Ys={style:{color:"#032F62"}},xs=s("span",{style:{color:"#24292E"}}," ",-1),Ms=s("span",{style:{color:"#005CC5"}},"\\",-1),qs=o("",1),Ls={class:"language-bash vp-adaptive-theme"},Hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Us=s("span",{class:"lang"},"bash",-1),zs={class:"shiki github-dark vp-code-dark"},Qs=o("",1),js=o("",1),Xs={class:"line"},Js=s("span",{style:{color:"#E1E4E8"}}," ",-1),Zs={style:{color:"#9ECBFF"}},Gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),so=s("span",{style:{color:"#79B8FF"}},"\\",-1),oo=o("",1),ao={class:"shiki github-light vp-code-light"},no=o("",1),eo=o("",1),lo={class:"line"},to=s("span",{style:{color:"#24292E"}}," ",-1),po={style:{color:"#032F62"}},co=s("span",{style:{color:"#24292E"}}," ",-1),ro=s("span",{style:{color:"#005CC5"}},"\\",-1),_o=o("",1),io={class:"language-bash vp-adaptive-theme"},Eo=s("button",{title:"Copy Code",class:"copy"},null,-1),yo=s("span",{class:"lang"},"bash",-1),ho={class:"shiki github-dark vp-code-dark"},To=o("",1),Fo=o("",1),Co={class:"line"},uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),go={style:{color:"#9ECBFF"}},bo=s("span",{style:{color:"#E1E4E8"}}," ",-1),vo=s("span",{style:{color:"#79B8FF"}},"\\",-1),Po=o("",1),ko={class:"shiki github-light vp-code-light"},mo=o("",1),Ao=o("",1),So={class:"line"},Bo=s("span",{style:{color:"#24292E"}}," ",-1),No={style:{color:"#032F62"}},Do=s("span",{style:{color:"#24292E"}}," ",-1),Ro=s("span",{style:{color:"#005CC5"}},"\\",-1),Oo=o("",1),Io=o("",4),Vo={class:"vp-code-group vp-adaptive-theme"},fo=o("",1),$o={class:"blocks"},wo={class:"language-bash vp-adaptive-theme active"},Wo=s("button",{title:"Copy Code",class:"copy"},null,-1),Ko=s("span",{class:"lang"},"bash",-1),Yo={class:"shiki github-dark vp-code-dark"},xo=o("",1),Mo=o("",1),qo={class:"line"},Lo=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ho={style:{color:"#9ECBFF"}},Uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),zo=s("span",{style:{color:"#79B8FF"}},"\\",-1),Qo=o("",1),jo={class:"shiki github-light vp-code-light"},Xo=o("",1),Jo=o("",1),Zo={class:"line"},Go=s("span",{style:{color:"#24292E"}}," ",-1),sa={style:{color:"#032F62"}},oa=s("span",{style:{color:"#24292E"}}," ",-1),aa=s("span",{style:{color:"#005CC5"}},"\\",-1),na=o("",1),ea={class:"language-bash vp-adaptive-theme"},la=s("button",{title:"Copy Code",class:"copy"},null,-1),ta=s("span",{class:"lang"},"bash",-1),pa={class:"shiki github-dark vp-code-dark"},ca=o("",1),ra=o("",1),_a={class:"line"},ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ea={style:{color:"#9ECBFF"}},ya=s("span",{style:{color:"#E1E4E8"}}," ",-1),da=s("span",{style:{color:"#79B8FF"}},"\\",-1),ha=o("",1),Ta={class:"shiki github-light vp-code-light"},Fa=o("",1),Ca=o("",1),ua={class:"line"},ga=s("span",{style:{color:"#24292E"}}," ",-1),ba={style:{color:"#032F62"}},va=s("span",{style:{color:"#24292E"}}," ",-1),Pa=s("span",{style:{color:"#005CC5"}},"\\",-1),ka=o("",1),ma={class:"language-bash vp-adaptive-theme"},Aa=s("button",{title:"Copy Code",class:"copy"},null,-1),Sa=s("span",{class:"lang"},"bash",-1),Ba={class:"shiki github-dark vp-code-dark"},Na=o("",1),Da=o("",1),Ra={class:"line"},Oa=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ia={style:{color:"#9ECBFF"}},Va=s("span",{style:{color:"#E1E4E8"}}," ",-1),fa=s("span",{style:{color:"#79B8FF"}},"\\",-1),$a=o("",1),wa={class:"shiki github-light vp-code-light"},Wa=o("",1),Ka=o("",1),Ya={class:"line"},xa=s("span",{style:{color:"#24292E"}}," ",-1),Ma={style:{color:"#032F62"}},qa=s("span",{style:{color:"#24292E"}}," ",-1),La=s("span",{style:{color:"#005CC5"}},"\\",-1),Ha=o("",1),Ua=s("p",null,"Congratulations! You now have a node running with persistent storage.",-1),za=s("h2",{id:"video-walkthrough",tabindex:"-1"},[a("Video walkthrough "),s("a",{class:"header-anchor",href:"#video-walkthrough","aria-label":'Permalink to "Video walkthrough"'},"​")],-1),Qa=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/WFubhQc8tGk",allowfullscreen:""})],-1),ja=s("h3",{id:"_2-5-minute-version",tabindex:"-1"},[a("2.5 minute version "),s("a",{class:"header-anchor",href:"#_2-5-minute-version","aria-label":'Permalink to "2.5 minute version"'},"​")],-1),Xa=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/ROZv871Q7RM",allowfullscreen:""})],-1),Ja=s("h2",{id:"troubleshooting",tabindex:"-1"},[a("Troubleshooting "),s("a",{class:"header-anchor",href:"#troubleshooting","aria-label":'Permalink to "Troubleshooting"'},"​")],-1),Za=s("p",null,[a("For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find "),s("a",{href:"https://learn.microsoft.com/en-us/windows/wsl/install",target:"_blank",rel:"noreferrer"},"instructions for installing WSL"),a(".")],-1),pn=JSON.parse('{"title":"🐳 Docker setup","description":"Running Celestia Node using Docker.","frontmatter":{"sidebar_label":"Docker images","description":"Running Celestia Node using Docker.","head":[["meta",{"name":"og:title","content":"🐳 Docker setup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/docker-images.md","filePath":"nodes/docker-images.md","lastUpdated":1725971357000}'),Ga={name:"nodes/docker-images.md"},cn=Object.assign(Ga,{setup(sn){return(on,an)=>(c(),r("div",null,[_,s("ol",null,[i,s("li",null,[E,s("div",y,[d,s("div",h,[s("div",T,[F,C,s("pre",u,[s("code",null,[g,a(` -`),s("span",b,[v,s("span",P,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),k,m]),a(` +import{a as l}from"./chunks/arabica_versions.1930378b.js";import{m as t}from"./chunks/mocha_versions.7704b055.js";import{m as p}from"./chunks/mainnet_versions.1d5e6ed9.js";import{o as c,c as r,k as s,a,t as n,l as e,Q as o}from"./chunks/framework.b47e54aa.js";const _=o("",9),i=o("",3),E=s("p",null,"Run the image from the command line:",-1),y={class:"vp-code-group vp-adaptive-theme"},d=o("",1),h={class:"blocks"},T={class:"language-bash vp-adaptive-theme active"},F=s("button",{title:"Copy Code",class:"copy"},null,-1),C=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g=o("",1),b={class:"line"},v=s("span",{style:{color:"#E1E4E8"}}," ",-1),k={style:{color:"#9ECBFF"}},P=s("span",{style:{color:"#E1E4E8"}}," ",-1),m=s("span",{style:{color:"#79B8FF"}},"\\",-1),A=o("",1),S={class:"shiki github-light vp-code-light"},B=o("",1),N={class:"line"},R=s("span",{style:{color:"#24292E"}}," ",-1),D={style:{color:"#032F62"}},O=s("span",{style:{color:"#24292E"}}," ",-1),V=s("span",{style:{color:"#005CC5"}},"\\",-1),I=o("",1),f={class:"language-bash vp-adaptive-theme"},$=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),Y={class:"shiki github-dark vp-code-dark"},W=o("",1),K={class:"line"},M=s("span",{style:{color:"#E1E4E8"}}," ",-1),x={style:{color:"#9ECBFF"}},L=s("span",{style:{color:"#E1E4E8"}}," ",-1),q=s("span",{style:{color:"#79B8FF"}},"\\",-1),H=o("",1),U={class:"shiki github-light vp-code-light"},z=o("",1),j={class:"line"},Q=s("span",{style:{color:"#24292E"}}," ",-1),Z={style:{color:"#032F62"}},J=s("span",{style:{color:"#24292E"}}," ",-1),X=s("span",{style:{color:"#005CC5"}},"\\",-1),G=o("",1),ss={class:"language-bash vp-adaptive-theme"},os=s("button",{title:"Copy Code",class:"copy"},null,-1),as=s("span",{class:"lang"},"bash",-1),ns={class:"shiki github-dark vp-code-dark"},es=o("",1),ls={class:"line"},ts=s("span",{style:{color:"#E1E4E8"}}," ",-1),ps={style:{color:"#9ECBFF"}},cs=s("span",{style:{color:"#E1E4E8"}}," ",-1),rs=s("span",{style:{color:"#79B8FF"}},"\\",-1),_s=o("",1),is={class:"shiki github-light vp-code-light"},Es=o("",1),ys={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#032F62"}},Ts=s("span",{style:{color:"#24292E"}}," ",-1),Fs=s("span",{style:{color:"#005CC5"}},"\\",-1),Cs=o("",1),us=o("",12),gs={class:"vp-code-group vp-adaptive-theme"},bs=o("",1),vs={class:"blocks"},ks={class:"language-bash vp-adaptive-theme active"},Ps=s("button",{title:"Copy Code",class:"copy"},null,-1),ms=s("span",{class:"lang"},"bash",-1),As={class:"shiki github-dark vp-code-dark"},Ss=o("",1),Bs=o("",1),Ns={class:"line"},Rs=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ds={style:{color:"#9ECBFF"}},Os=s("span",{style:{color:"#E1E4E8"}}," ",-1),Vs=s("span",{style:{color:"#79B8FF"}},"\\",-1),Is=o("",1),fs={class:"shiki github-light vp-code-light"},$s=o("",1),ws=o("",1),Ys={class:"line"},Ws=s("span",{style:{color:"#24292E"}}," ",-1),Ks={style:{color:"#032F62"}},Ms=s("span",{style:{color:"#24292E"}}," ",-1),xs=s("span",{style:{color:"#005CC5"}},"\\",-1),Ls=o("",1),qs={class:"language-bash vp-adaptive-theme"},Hs=s("button",{title:"Copy Code",class:"copy"},null,-1),Us=s("span",{class:"lang"},"bash",-1),zs={class:"shiki github-dark vp-code-dark"},js=o("",1),Qs=o("",1),Zs={class:"line"},Js=s("span",{style:{color:"#E1E4E8"}}," ",-1),Xs={style:{color:"#9ECBFF"}},Gs=s("span",{style:{color:"#E1E4E8"}}," ",-1),so=s("span",{style:{color:"#79B8FF"}},"\\",-1),oo=o("",1),ao={class:"shiki github-light vp-code-light"},no=o("",1),eo=o("",1),lo={class:"line"},to=s("span",{style:{color:"#24292E"}}," ",-1),po={style:{color:"#032F62"}},co=s("span",{style:{color:"#24292E"}}," ",-1),ro=s("span",{style:{color:"#005CC5"}},"\\",-1),_o=o("",1),io={class:"language-bash vp-adaptive-theme"},Eo=s("button",{title:"Copy Code",class:"copy"},null,-1),yo=s("span",{class:"lang"},"bash",-1),ho={class:"shiki github-dark vp-code-dark"},To=o("",1),Fo=o("",1),Co={class:"line"},uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),go={style:{color:"#9ECBFF"}},bo=s("span",{style:{color:"#E1E4E8"}}," ",-1),vo=s("span",{style:{color:"#79B8FF"}},"\\",-1),ko=o("",1),Po={class:"shiki github-light vp-code-light"},mo=o("",1),Ao=o("",1),So={class:"line"},Bo=s("span",{style:{color:"#24292E"}}," ",-1),No={style:{color:"#032F62"}},Ro=s("span",{style:{color:"#24292E"}}," ",-1),Do=s("span",{style:{color:"#005CC5"}},"\\",-1),Oo=o("",1),Vo=o("",4),Io={class:"vp-code-group vp-adaptive-theme"},fo=o("",1),$o={class:"blocks"},wo={class:"language-bash vp-adaptive-theme active"},Yo=s("button",{title:"Copy Code",class:"copy"},null,-1),Wo=s("span",{class:"lang"},"bash",-1),Ko={class:"shiki github-dark vp-code-dark"},Mo=o("",1),xo=o("",1),Lo={class:"line"},qo=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ho={style:{color:"#9ECBFF"}},Uo=s("span",{style:{color:"#E1E4E8"}}," ",-1),zo=s("span",{style:{color:"#79B8FF"}},"\\",-1),jo=o("",1),Qo={class:"shiki github-light vp-code-light"},Zo=o("",1),Jo=o("",1),Xo={class:"line"},Go=s("span",{style:{color:"#24292E"}}," ",-1),sa={style:{color:"#032F62"}},oa=s("span",{style:{color:"#24292E"}}," ",-1),aa=s("span",{style:{color:"#005CC5"}},"\\",-1),na=o("",1),ea={class:"language-bash vp-adaptive-theme"},la=s("button",{title:"Copy Code",class:"copy"},null,-1),ta=s("span",{class:"lang"},"bash",-1),pa={class:"shiki github-dark vp-code-dark"},ca=o("",1),ra=o("",1),_a={class:"line"},ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),Ea={style:{color:"#9ECBFF"}},ya=s("span",{style:{color:"#E1E4E8"}}," ",-1),da=s("span",{style:{color:"#79B8FF"}},"\\",-1),ha=o("",1),Ta={class:"shiki github-light vp-code-light"},Fa=o("",1),Ca=o("",1),ua={class:"line"},ga=s("span",{style:{color:"#24292E"}}," ",-1),ba={style:{color:"#032F62"}},va=s("span",{style:{color:"#24292E"}}," ",-1),ka=s("span",{style:{color:"#005CC5"}},"\\",-1),Pa=o("",1),ma={class:"language-bash vp-adaptive-theme"},Aa=s("button",{title:"Copy Code",class:"copy"},null,-1),Sa=s("span",{class:"lang"},"bash",-1),Ba={class:"shiki github-dark vp-code-dark"},Na=o("",1),Ra=o("",1),Da={class:"line"},Oa=s("span",{style:{color:"#E1E4E8"}}," ",-1),Va={style:{color:"#9ECBFF"}},Ia=s("span",{style:{color:"#E1E4E8"}}," ",-1),fa=s("span",{style:{color:"#79B8FF"}},"\\",-1),$a=o("",1),wa={class:"shiki github-light vp-code-light"},Ya=o("",1),Wa=o("",1),Ka={class:"line"},Ma=s("span",{style:{color:"#24292E"}}," ",-1),xa={style:{color:"#032F62"}},La=s("span",{style:{color:"#24292E"}}," ",-1),qa=s("span",{style:{color:"#005CC5"}},"\\",-1),Ha=o("",1),Ua=s("p",null,"Congratulations! You now have a node running with persistent storage.",-1),za=s("h2",{id:"video-walkthrough",tabindex:"-1"},[a("Video walkthrough "),s("a",{class:"header-anchor",href:"#video-walkthrough","aria-label":'Permalink to "Video walkthrough"'},"​")],-1),ja=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/WFubhQc8tGk",allowfullscreen:""})],-1),Qa=s("h3",{id:"_2-5-minute-version",tabindex:"-1"},[a("2.5 minute version "),s("a",{class:"header-anchor",href:"#_2-5-minute-version","aria-label":'Permalink to "2.5 minute version"'},"​")],-1),Za=s("div",{class:"youtube-wrapper"},[s("iframe",{class:"youtube-video",title:"Running a Celestia light node",src:"https://youtube.com/embed/ROZv871Q7RM",allowfullscreen:""})],-1),Ja=s("h2",{id:"troubleshooting",tabindex:"-1"},[a("Troubleshooting "),s("a",{class:"header-anchor",href:"#troubleshooting","aria-label":'Permalink to "Troubleshooting"'},"​")],-1),Xa=s("p",null,[a("For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find "),s("a",{href:"https://learn.microsoft.com/en-us/windows/wsl/install",target:"_blank",rel:"noreferrer"},"instructions for installing WSL"),a(".")],-1),pn=JSON.parse('{"title":"🐳 Docker setup","description":"Running Celestia Node using Docker.","frontmatter":{"sidebar_label":"Docker images","description":"Running Celestia Node using Docker.","head":[["meta",{"name":"og:title","content":"🐳 Docker setup | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/docker-images.md","filePath":"nodes/docker-images.md","lastUpdated":1725992025000}'),Ga={name:"nodes/docker-images.md"},cn=Object.assign(Ga,{setup(sn){return(on,an)=>(c(),r("div",null,[_,s("ol",null,[i,s("li",null,[E,s("div",y,[d,s("div",h,[s("div",T,[F,C,s("pre",u,[s("code",null,[g,a(` +`),s("span",b,[v,s("span",k,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),P,m]),a(` `),A])]),s("pre",S,[s("code",null,[B,a(` -`),s("span",N,[D,s("span",R,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),O,I]),a(` -`),V])])]),s("div",f,[$,w,s("pre",W,[s("code",null,[K,a(` -`),s("span",Y,[x,s("span",M,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),q,L]),a(` +`),s("span",N,[R,s("span",D,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),O,V]),a(` +`),I])])]),s("div",f,[$,w,s("pre",Y,[s("code",null,[W,a(` +`),s("span",K,[M,s("span",x,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),L,q]),a(` `),H])]),s("pre",U,[s("code",null,[z,a(` -`),s("span",Q,[j,s("span",X,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),J,Z]),a(` +`),s("span",j,[Q,s("span",Z,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),J,X]),a(` `),G])])]),s("div",ss,[os,as,s("pre",ns,[s("code",null,[es,a(` `),s("span",ls,[ts,s("span",ps,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),cs,rs]),a(` `),_s])]),s("pre",is,[s("code",null,[Es,a(` `),s("span",ys,[ds,s("span",hs,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ts,Fs]),a(` -`),Cs])])])])])])]),us,s("div",gs,[bs,s("div",vs,[s("div",Ps,[ks,ms,s("pre",As,[s("code",null,[Ss,a(` +`),Cs])])])])])])]),us,s("div",gs,[bs,s("div",vs,[s("div",ks,[Ps,ms,s("pre",As,[s("code",null,[Ss,a(` `),Bs,a(` -`),s("span",Ns,[Ds,s("span",Rs,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Os,Is]),a(` -`),Vs])]),s("pre",fs,[s("code",null,[$s,a(` +`),s("span",Ns,[Rs,s("span",Ds,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Os,Vs]),a(` +`),Is])]),s("pre",fs,[s("code",null,[$s,a(` `),ws,a(` -`),s("span",Ws,[Ks,s("span",Ys,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),xs,Ms]),a(` -`),qs])])]),s("div",Ls,[Hs,Us,s("pre",zs,[s("code",null,[Qs,a(` -`),js,a(` -`),s("span",Xs,[Js,s("span",Zs,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),Gs,so]),a(` +`),s("span",Ys,[Ws,s("span",Ks,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Ms,xs]),a(` +`),Ls])])]),s("div",qs,[Hs,Us,s("pre",zs,[s("code",null,[js,a(` +`),Qs,a(` +`),s("span",Zs,[Js,s("span",Xs,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),Gs,so]),a(` `),oo])]),s("pre",ao,[s("code",null,[no,a(` `),eo,a(` `),s("span",lo,[to,s("span",po,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),co,ro]),a(` `),_o])])]),s("div",io,[Eo,yo,s("pre",ho,[s("code",null,[To,a(` `),Fo,a(` `),s("span",Co,[uo,s("span",go,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),bo,vo]),a(` -`),Po])]),s("pre",ko,[s("code",null,[mo,a(` +`),ko])]),s("pre",Po,[s("code",null,[mo,a(` `),Ao,a(` -`),s("span",So,[Bo,s("span",No,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Do,Ro]),a(` -`),Oo])])])])]),Io,s("div",Vo,[fo,s("div",$o,[s("div",wo,[Wo,Ko,s("pre",Yo,[s("code",null,[xo,a(` -`),Mo,a(` -`),s("span",qo,[Lo,s("span",Ho,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Uo,zo]),a(` -`),Qo])]),s("pre",jo,[s("code",null,[Xo,a(` +`),s("span",So,[Bo,s("span",No,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ro,Do]),a(` +`),Oo])])])])]),Vo,s("div",Io,[fo,s("div",$o,[s("div",wo,[Yo,Wo,s("pre",Ko,[s("code",null,[Mo,a(` +`),xo,a(` +`),s("span",Lo,[qo,s("span",Ho,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),Uo,zo]),a(` +`),jo])]),s("pre",Qo,[s("code",null,[Zo,a(` `),Jo,a(` -`),s("span",Zo,[Go,s("span",sa,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),oa,aa]),a(` +`),s("span",Xo,[Go,s("span",sa,"ghcr.io/celestiaorg/celestia-node:"+n(e(p)["node-latest-tag"]),1),oa,aa]),a(` `),na])])]),s("div",ea,[la,ta,s("pre",pa,[s("code",null,[ca,a(` `),ra,a(` `),s("span",_a,[ia,s("span",Ea,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),ya,da]),a(` `),ha])]),s("pre",Ta,[s("code",null,[Fa,a(` `),Ca,a(` -`),s("span",ua,[ga,s("span",ba,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),va,Pa]),a(` -`),ka])])]),s("div",ma,[Aa,Sa,s("pre",Ba,[s("code",null,[Na,a(` -`),Da,a(` -`),s("span",Ra,[Oa,s("span",Ia,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Va,fa]),a(` -`),$a])]),s("pre",wa,[s("code",null,[Wa,a(` -`),Ka,a(` -`),s("span",Ya,[xa,s("span",Ma,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),qa,La]),a(` -`),Ha])])])])]),Ua,za,Qa,ja,Xa,Ja,Za]))}});export{pn as __pageData,cn as default}; +`),s("span",ua,[ga,s("span",ba,"ghcr.io/celestiaorg/celestia-node:"+n(e(t)["node-latest-tag"]),1),va,ka]),a(` +`),Pa])])]),s("div",ma,[Aa,Sa,s("pre",Ba,[s("code",null,[Na,a(` +`),Ra,a(` +`),s("span",Da,[Oa,s("span",Va,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),Ia,fa]),a(` +`),$a])]),s("pre",wa,[s("code",null,[Ya,a(` +`),Wa,a(` +`),s("span",Ka,[Ma,s("span",xa,"ghcr.io/celestiaorg/celestia-node:"+n(e(l)["node-latest-tag"]),1),La,qa]),a(` +`),Ha])])])])]),Ua,za,ja,Qa,Za,Ja,Xa]))}});export{pn as __pageData,cn as default}; diff --git a/pr-1699/assets/nodes_environment.md.d3b85368.js b/pr-1699/assets/nodes_environment.md.502fd51d.js similarity index 92% rename from pr-1699/assets/nodes_environment.md.d3b85368.js rename to pr-1699/assets/nodes_environment.md.502fd51d.js index bbe5e8978c..291f24bc12 100644 --- a/pr-1699/assets/nodes_environment.md.d3b85368.js +++ b/pr-1699/assets/nodes_environment.md.502fd51d.js @@ -1,4 +1,4 @@ -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t as n,l as o,Q as l}from"./chunks/framework.b47e54aa.js";const t=l(`

    Development environment

    This page will go over setting up your development environment to run Celestia software. This environment can be used for development, building binaries, and running nodes.

    Install dependencies

    1. If you are on Ubuntu, first update and upgrade your OS:

      bash
      sudo apt update && sudo apt upgrade -y
      sudo apt update && sudo apt upgrade -y
      bash
      sudo yum update
      sudo yum update
    2. Install essential packages that are necessary to execute many tasks like downloading files, compiling, and monitoring the node:

      bash
      sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \\
      +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t as n,l as o,Q as l}from"./chunks/framework.b47e54aa.js";const t=l(`

      Development environment

      This page will go over setting up your development environment to run Celestia software. This environment can be used for development, building binaries, and running nodes.

      Install dependencies

      1. If you are on Ubuntu, first update and upgrade your OS:

        bash
        sudo apt update && sudo apt upgrade -y
        sudo apt update && sudo apt upgrade -y
        bash
        sudo yum update
        sudo yum update
      2. Install essential packages that are necessary to execute many tasks like downloading files, compiling, and monitoring the node:

        bash
        sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \\
         git make ncdu -y
        sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \\
         git make ncdu -y
        bash
        sudo yum install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \\
         git make ncdu -y
        sudo yum install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \\
        @@ -12,7 +12,7 @@ import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t
         /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         
         # then install wget & jq
        -brew install wget && brew install jq

      Install Golang

      celestia-node is written in Golang so we must install Golang to build and run our node.

      `,6),c=s("p",null,"Set the version for your desired network:",-1),r={class:"vp-code-group vp-adaptive-theme"},y=l('
      ',1),E={class:"blocks"},i={class:"language-bash vp-adaptive-theme active"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),F=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g={class:"line"},h=s("span",{style:{color:"#E1E4E8"}},"ver",-1),C=s("span",{style:{color:"#F97583"}},"=",-1),b={style:{color:"#9ECBFF"}},v={class:"shiki github-light vp-code-light"},m={class:"line"},B=s("span",{style:{color:"#24292E"}},"ver",-1),_=s("span",{style:{color:"#D73A49"}},"=",-1),k={style:{color:"#032F62"}},q={class:"language-bash vp-adaptive-theme"},f=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},A={class:"line"},H=s("span",{style:{color:"#E1E4E8"}},"ver",-1),z=s("span",{style:{color:"#F97583"}},"=",-1),T={style:{color:"#9ECBFF"}},M={class:"shiki github-light vp-code-light"},x={class:"line"},D=s("span",{style:{color:"#24292E"}},"ver",-1),O=s("span",{style:{color:"#D73A49"}},"=",-1),S={style:{color:"#032F62"}},P={class:"language-bash vp-adaptive-theme"},I=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),j={class:"shiki github-dark vp-code-dark"},L={class:"line"},V=s("span",{style:{color:"#E1E4E8"}},"ver",-1),U=s("span",{style:{color:"#F97583"}},"=",-1),G={style:{color:"#9ECBFF"}},Y={class:"shiki github-light vp-code-light"},Q={class:"line"},R=s("span",{style:{color:"#24292E"}},"ver",-1),J=s("span",{style:{color:"#D73A49"}},"=",-1),K={style:{color:"#032F62"}},W=l(`
    3. Download and install Golang:

      bash
      cd $HOME
      +brew install wget && brew install jq

    Install Golang

    celestia-node is written in Golang so we must install Golang to build and run our node.

    `,6),c=s("p",null,"Set the version for your desired network:",-1),r={class:"vp-code-group vp-adaptive-theme"},y=l('
    ',1),E={class:"blocks"},i={class:"language-bash vp-adaptive-theme active"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),F=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g={class:"line"},h=s("span",{style:{color:"#E1E4E8"}},"ver",-1),C=s("span",{style:{color:"#F97583"}},"=",-1),b={style:{color:"#9ECBFF"}},v={class:"shiki github-light vp-code-light"},m={class:"line"},B=s("span",{style:{color:"#24292E"}},"ver",-1),_=s("span",{style:{color:"#D73A49"}},"=",-1),k={style:{color:"#032F62"}},q={class:"language-bash vp-adaptive-theme"},f=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},A={class:"line"},H=s("span",{style:{color:"#E1E4E8"}},"ver",-1),T=s("span",{style:{color:"#F97583"}},"=",-1),z={style:{color:"#9ECBFF"}},M={class:"shiki github-light vp-code-light"},x={class:"line"},D=s("span",{style:{color:"#24292E"}},"ver",-1),O=s("span",{style:{color:"#D73A49"}},"=",-1),S={style:{color:"#032F62"}},P={class:"language-bash vp-adaptive-theme"},R=s("button",{title:"Copy Code",class:"copy"},null,-1),I=s("span",{class:"lang"},"bash",-1),N={class:"shiki github-dark vp-code-dark"},j={class:"line"},V=s("span",{style:{color:"#E1E4E8"}},"ver",-1),G=s("span",{style:{color:"#F97583"}},"=",-1),L={style:{color:"#9ECBFF"}},U={class:"shiki github-light vp-code-light"},Y={class:"line"},J=s("span",{style:{color:"#24292E"}},"ver",-1),Q=s("span",{style:{color:"#D73A49"}},"=",-1),K={style:{color:"#032F62"}},X=l(`
  16. Download and install Golang:

    bash
    cd $HOME
     wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
     sudo rm -rf /usr/local/go
     sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
    @@ -44,8 +44,8 @@ import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t
     wget "https://golang.org/dl/go$ver.darwin-amd64.tar.gz"
     sudo rm -rf /usr/local/go
     sudo tar -C /usr/local -xzf "go$ver.darwin-amd64.tar.gz"
    -rm "go$ver.darwin-amd64.tar.gz"
  17. Add your /usr/local/go/bin directory to your $PATH if you have not already:

    bash
    echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
    +rm "go$ver.darwin-amd64.tar.gz"
  18. Add your /usr/local/go/bin directory to your $PATH if you have not already:

    bash
    echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
     source $HOME/.bash_profile
    echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
     source $HOME/.bash_profile
    bash
    echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.zshrc
     source $HOME/.zshrc
    echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.zshrc
    -source $HOME/.zshrc

    TIP

    Use echo $SHELL to figure out what type of shell you are using!

  19. To verify that the correct version of Go was installed correctly run:

    bash
    go version
    go version
  20. `,3),X=s("p",null,"The output will show the version installed.",-1),ps=JSON.parse('{"title":"Development environment","description":"Learn to set up your development environment to run Celestia software.","frontmatter":{"description":"Learn to set up your development environment to run Celestia software.","head":[["meta",{"name":"og:title","content":"Development environment | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/environment.md","filePath":"nodes/environment.md","lastUpdated":1725971357000}'),Z={name:"nodes/environment.md"},es=Object.assign(Z,{setup(ss){return(as,ns)=>(p(),e("div",null,[t,s("ol",null,[s("li",null,[c,s("div",r,[y,s("div",E,[s("div",i,[d,F,s("pre",u,[s("code",null,[s("span",g,[h,C,s("span",b,'"'+n(o(a).golangNodeMainnet)+'"',1)])])]),s("pre",v,[s("code",null,[s("span",m,[B,_,s("span",k,'"'+n(o(a).golangNodeMainnet)+'"',1)])])])]),s("div",q,[f,w,s("pre",$,[s("code",null,[s("span",A,[H,z,s("span",T,'"'+n(o(a).golangNodeMocha)+'"',1)])])]),s("pre",M,[s("code",null,[s("span",x,[D,O,s("span",S,'"'+n(o(a).golangNodeMocha)+'"',1)])])])]),s("div",P,[I,N,s("pre",j,[s("code",null,[s("span",L,[V,U,s("span",G,'"'+n(o(a).golangNodeArabica)+'"',1)])])]),s("pre",Y,[s("code",null,[s("span",Q,[R,J,s("span",K,'"'+n(o(a).golangNodeArabica)+'"',1)])])])])])])]),W]),X]))}});export{ps as __pageData,es as default}; +source $HOME/.zshrc

    TIP

    Use echo $SHELL to figure out what type of shell you are using!

  21. To verify that the correct version of Go was installed correctly run:

    bash
    go version
    go version
  22. `,3),W=s("p",null,"The output will show the version installed.",-1),ps=JSON.parse('{"title":"Development environment","description":"Learn to set up your development environment to run Celestia software.","frontmatter":{"description":"Learn to set up your development environment to run Celestia software.","head":[["meta",{"name":"og:title","content":"Development environment | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/environment.md","filePath":"nodes/environment.md","lastUpdated":1725992025000}'),Z={name:"nodes/environment.md"},es=Object.assign(Z,{setup(ss){return(as,ns)=>(p(),e("div",null,[t,s("ol",null,[s("li",null,[c,s("div",r,[y,s("div",E,[s("div",i,[d,F,s("pre",u,[s("code",null,[s("span",g,[h,C,s("span",b,'"'+n(o(a).golangNodeMainnet)+'"',1)])])]),s("pre",v,[s("code",null,[s("span",m,[B,_,s("span",k,'"'+n(o(a).golangNodeMainnet)+'"',1)])])])]),s("div",q,[f,w,s("pre",$,[s("code",null,[s("span",A,[H,T,s("span",z,'"'+n(o(a).golangNodeMocha)+'"',1)])])]),s("pre",M,[s("code",null,[s("span",x,[D,O,s("span",S,'"'+n(o(a).golangNodeMocha)+'"',1)])])])]),s("div",P,[R,I,s("pre",N,[s("code",null,[s("span",j,[V,G,s("span",L,'"'+n(o(a).golangNodeArabica)+'"',1)])])]),s("pre",U,[s("code",null,[s("span",Y,[J,Q,s("span",K,'"'+n(o(a).golangNodeArabica)+'"',1)])])])])])])]),X]),W]))}});export{ps as __pageData,es as default}; diff --git a/pr-1699/assets/nodes_environment.md.d3b85368.lean.js b/pr-1699/assets/nodes_environment.md.502fd51d.lean.js similarity index 67% rename from pr-1699/assets/nodes_environment.md.d3b85368.lean.js rename to pr-1699/assets/nodes_environment.md.502fd51d.lean.js index c1df6a11be..abf031a4a5 100644 --- a/pr-1699/assets/nodes_environment.md.d3b85368.lean.js +++ b/pr-1699/assets/nodes_environment.md.502fd51d.lean.js @@ -1 +1 @@ -import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t as n,l as o,Q as l}from"./chunks/framework.b47e54aa.js";const t=l("",6),c=s("p",null,"Set the version for your desired network:",-1),r={class:"vp-code-group vp-adaptive-theme"},y=l("",1),E={class:"blocks"},i={class:"language-bash vp-adaptive-theme active"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),F=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g={class:"line"},h=s("span",{style:{color:"#E1E4E8"}},"ver",-1),C=s("span",{style:{color:"#F97583"}},"=",-1),b={style:{color:"#9ECBFF"}},v={class:"shiki github-light vp-code-light"},m={class:"line"},B=s("span",{style:{color:"#24292E"}},"ver",-1),_=s("span",{style:{color:"#D73A49"}},"=",-1),k={style:{color:"#032F62"}},q={class:"language-bash vp-adaptive-theme"},f=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},A={class:"line"},H=s("span",{style:{color:"#E1E4E8"}},"ver",-1),z=s("span",{style:{color:"#F97583"}},"=",-1),T={style:{color:"#9ECBFF"}},M={class:"shiki github-light vp-code-light"},x={class:"line"},D=s("span",{style:{color:"#24292E"}},"ver",-1),O=s("span",{style:{color:"#D73A49"}},"=",-1),S={style:{color:"#032F62"}},P={class:"language-bash vp-adaptive-theme"},I=s("button",{title:"Copy Code",class:"copy"},null,-1),N=s("span",{class:"lang"},"bash",-1),j={class:"shiki github-dark vp-code-dark"},L={class:"line"},V=s("span",{style:{color:"#E1E4E8"}},"ver",-1),U=s("span",{style:{color:"#F97583"}},"=",-1),G={style:{color:"#9ECBFF"}},Y={class:"shiki github-light vp-code-light"},Q={class:"line"},R=s("span",{style:{color:"#24292E"}},"ver",-1),J=s("span",{style:{color:"#D73A49"}},"=",-1),K={style:{color:"#032F62"}},W=l("",3),X=s("p",null,"The output will show the version installed.",-1),ps=JSON.parse('{"title":"Development environment","description":"Learn to set up your development environment to run Celestia software.","frontmatter":{"description":"Learn to set up your development environment to run Celestia software.","head":[["meta",{"name":"og:title","content":"Development environment | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/environment.md","filePath":"nodes/environment.md","lastUpdated":1725971357000}'),Z={name:"nodes/environment.md"},es=Object.assign(Z,{setup(ss){return(as,ns)=>(p(),e("div",null,[t,s("ol",null,[s("li",null,[c,s("div",r,[y,s("div",E,[s("div",i,[d,F,s("pre",u,[s("code",null,[s("span",g,[h,C,s("span",b,'"'+n(o(a).golangNodeMainnet)+'"',1)])])]),s("pre",v,[s("code",null,[s("span",m,[B,_,s("span",k,'"'+n(o(a).golangNodeMainnet)+'"',1)])])])]),s("div",q,[f,w,s("pre",$,[s("code",null,[s("span",A,[H,z,s("span",T,'"'+n(o(a).golangNodeMocha)+'"',1)])])]),s("pre",M,[s("code",null,[s("span",x,[D,O,s("span",S,'"'+n(o(a).golangNodeMocha)+'"',1)])])])]),s("div",P,[I,N,s("pre",j,[s("code",null,[s("span",L,[V,U,s("span",G,'"'+n(o(a).golangNodeArabica)+'"',1)])])]),s("pre",Y,[s("code",null,[s("span",Q,[R,J,s("span",K,'"'+n(o(a).golangNodeArabica)+'"',1)])])])])])])]),W]),X]))}});export{ps as __pageData,es as default}; +import{c as a}from"./chunks/constants.295fc0ab.js";import{o as p,c as e,k as s,t as n,l as o,Q as l}from"./chunks/framework.b47e54aa.js";const t=l("",6),c=s("p",null,"Set the version for your desired network:",-1),r={class:"vp-code-group vp-adaptive-theme"},y=l("",1),E={class:"blocks"},i={class:"language-bash vp-adaptive-theme active"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),F=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},g={class:"line"},h=s("span",{style:{color:"#E1E4E8"}},"ver",-1),C=s("span",{style:{color:"#F97583"}},"=",-1),b={style:{color:"#9ECBFF"}},v={class:"shiki github-light vp-code-light"},m={class:"line"},B=s("span",{style:{color:"#24292E"}},"ver",-1),_=s("span",{style:{color:"#D73A49"}},"=",-1),k={style:{color:"#032F62"}},q={class:"language-bash vp-adaptive-theme"},f=s("button",{title:"Copy Code",class:"copy"},null,-1),w=s("span",{class:"lang"},"bash",-1),$={class:"shiki github-dark vp-code-dark"},A={class:"line"},H=s("span",{style:{color:"#E1E4E8"}},"ver",-1),T=s("span",{style:{color:"#F97583"}},"=",-1),z={style:{color:"#9ECBFF"}},M={class:"shiki github-light vp-code-light"},x={class:"line"},D=s("span",{style:{color:"#24292E"}},"ver",-1),O=s("span",{style:{color:"#D73A49"}},"=",-1),S={style:{color:"#032F62"}},P={class:"language-bash vp-adaptive-theme"},R=s("button",{title:"Copy Code",class:"copy"},null,-1),I=s("span",{class:"lang"},"bash",-1),N={class:"shiki github-dark vp-code-dark"},j={class:"line"},V=s("span",{style:{color:"#E1E4E8"}},"ver",-1),G=s("span",{style:{color:"#F97583"}},"=",-1),L={style:{color:"#9ECBFF"}},U={class:"shiki github-light vp-code-light"},Y={class:"line"},J=s("span",{style:{color:"#24292E"}},"ver",-1),Q=s("span",{style:{color:"#D73A49"}},"=",-1),K={style:{color:"#032F62"}},X=l("",3),W=s("p",null,"The output will show the version installed.",-1),ps=JSON.parse('{"title":"Development environment","description":"Learn to set up your development environment to run Celestia software.","frontmatter":{"description":"Learn to set up your development environment to run Celestia software.","head":[["meta",{"name":"og:title","content":"Development environment | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/environment.md","filePath":"nodes/environment.md","lastUpdated":1725992025000}'),Z={name:"nodes/environment.md"},es=Object.assign(Z,{setup(ss){return(as,ns)=>(p(),e("div",null,[t,s("ol",null,[s("li",null,[c,s("div",r,[y,s("div",E,[s("div",i,[d,F,s("pre",u,[s("code",null,[s("span",g,[h,C,s("span",b,'"'+n(o(a).golangNodeMainnet)+'"',1)])])]),s("pre",v,[s("code",null,[s("span",m,[B,_,s("span",k,'"'+n(o(a).golangNodeMainnet)+'"',1)])])])]),s("div",q,[f,w,s("pre",$,[s("code",null,[s("span",A,[H,T,s("span",z,'"'+n(o(a).golangNodeMocha)+'"',1)])])]),s("pre",M,[s("code",null,[s("span",x,[D,O,s("span",S,'"'+n(o(a).golangNodeMocha)+'"',1)])])])]),s("div",P,[R,I,s("pre",N,[s("code",null,[s("span",j,[V,G,s("span",L,'"'+n(o(a).golangNodeArabica)+'"',1)])])]),s("pre",U,[s("code",null,[s("span",Y,[J,Q,s("span",K,'"'+n(o(a).golangNodeArabica)+'"',1)])])])])])])]),X]),W]))}});export{ps as __pageData,es as default}; diff --git a/pr-1699/assets/nodes_full-storage-node.md.3d825d2f.js b/pr-1699/assets/nodes_full-storage-node.md.27554da6.js similarity index 96% rename from pr-1699/assets/nodes_full-storage-node.md.3d825d2f.js rename to pr-1699/assets/nodes_full-storage-node.md.27554da6.js index 86434f1ea4..67e4e922e0 100644 --- a/pr-1699/assets/nodes_full-storage-node.md.3d825d2f.js +++ b/pr-1699/assets/nodes_full-storage-node.md.27554da6.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/nodes/full-storage-node.png",g=JSON.parse('{"title":"Setting up a Celestia full storage Node","description":"Set up a Celestia full storage node.","frontmatter":{"description":"Set up a Celestia full storage node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia full storage Node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/full-storage-node.md","filePath":"nodes/full-storage-node.md","lastUpdated":1725971357000}'),n={name:"nodes/full-storage-node.md"},t=o('

    Setting up a Celestia full storage Node

    This tutorial will guide you through setting up a Celestia full storage node, which is a celestia-node that doesn't connect to celestia-app (hence not a consensus node), but stores all the data.

    Overview of full storage nodes

    Full storage nodes are Celestia nodes that store all the data. Full storage nodes send block shares, headers, and fraud proofs to light nodes. The light nodes gossip headers, fraud proofs, and sometimes block shares, between one another.

    Full storage node

    Hardware requirements

    The following hardware minimum requirements are recommended for running the full storage node:

    • Memory: 16 GB RAM (minimum)
    • CPU: 6 cores
    • Disk: 10 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Setting up your full storage node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Setup the dependencies

    You can follow the tutorial for setting up your dependencies

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Run the full storage node

    Initialize the full storage node

    Run the following command:

    sh
    celestia full init
    celestia full init
    sh
    celestia full init --p2p.network mocha
    celestia full init --p2p.network mocha
    sh
    celestia full init --p2p.network arabica
    celestia full init --p2p.network arabica

    Start the full storage node

    Start the full storage node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get/submit state-related information, such as the ability to submit PayForBlob transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia full start --core.ip <URI>
    celestia full start --core.ip <URI>

    Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

    Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

    You can create your key for your node by following the cel-key instructions

    Once you start the full storage node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

    sh
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>

    TIP

    You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

    You can get testnet tokens from:

    NOTE

    If you are running a full-storage node for your sovereign rollup, it is highly recommended to request Arabica devnet tokens as Arabica has the latest changes that can be used to test for developing your sovereign rollup. You can still use Mocha testnet as well, it is just mostly used for validator operations.

    Optional: run the full storage node with a custom key

    In order to run a full storage node using a custom key:

    1. The custom key must exist inside the celestia full storage node directory at the correct path (default: ~/.celestia-full/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia full start --core.ip <URI> \\
    +import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/nodes/full-storage-node.png",g=JSON.parse('{"title":"Setting up a Celestia full storage Node","description":"Set up a Celestia full storage node.","frontmatter":{"description":"Set up a Celestia full storage node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia full storage Node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/full-storage-node.md","filePath":"nodes/full-storage-node.md","lastUpdated":1725992025000}'),n={name:"nodes/full-storage-node.md"},t=o('

    Setting up a Celestia full storage Node

    This tutorial will guide you through setting up a Celestia full storage node, which is a celestia-node that doesn't connect to celestia-app (hence not a consensus node), but stores all the data.

    Overview of full storage nodes

    Full storage nodes are Celestia nodes that store all the data. Full storage nodes send block shares, headers, and fraud proofs to light nodes. The light nodes gossip headers, fraud proofs, and sometimes block shares, between one another.

    Full storage node

    Hardware requirements

    The following hardware minimum requirements are recommended for running the full storage node:

    • Memory: 16 GB RAM (minimum)
    • CPU: 6 cores
    • Disk: 10 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Setting up your full storage node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Setup the dependencies

    You can follow the tutorial for setting up your dependencies

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Run the full storage node

    Initialize the full storage node

    Run the following command:

    sh
    celestia full init
    celestia full init
    sh
    celestia full init --p2p.network mocha
    celestia full init --p2p.network mocha
    sh
    celestia full init --p2p.network arabica
    celestia full init --p2p.network arabica

    Start the full storage node

    Start the full storage node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get/submit state-related information, such as the ability to submit PayForBlob transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia full start --core.ip <URI>
    celestia full start --core.ip <URI>

    Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

    Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

    You can create your key for your node by following the cel-key instructions

    Once you start the full storage node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

    sh
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>

    TIP

    You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

    You can get testnet tokens from:

    NOTE

    If you are running a full-storage node for your sovereign rollup, it is highly recommended to request Arabica devnet tokens as Arabica has the latest changes that can be used to test for developing your sovereign rollup. You can still use Mocha testnet as well, it is just mostly used for validator operations.

    Optional: run the full storage node with a custom key

    In order to run a full storage node using a custom key:

    1. The custom key must exist inside the celestia full storage node directory at the correct path (default: ~/.celestia-full/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia full start --core.ip <URI> \\
       --keyring.keyname <name-of-custom-key> \\
    celestia full start --core.ip <URI> \\
       --keyring.keyname <name-of-custom-key> \\
    sh
    celestia full start --core.ip <URI> \\
       --keyring.keyname <name-of-custom-key> \\
    diff --git a/pr-1699/assets/nodes_full-storage-node.md.3d825d2f.lean.js b/pr-1699/assets/nodes_full-storage-node.md.27554da6.lean.js
    similarity index 91%
    rename from pr-1699/assets/nodes_full-storage-node.md.3d825d2f.lean.js
    rename to pr-1699/assets/nodes_full-storage-node.md.27554da6.lean.js
    index c7cbe6ecbe..d368da61c1 100644
    --- a/pr-1699/assets/nodes_full-storage-node.md.3d825d2f.lean.js
    +++ b/pr-1699/assets/nodes_full-storage-node.md.27554da6.lean.js
    @@ -1 +1 @@
    -import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/nodes/full-storage-node.png",g=JSON.parse('{"title":"Setting up a Celestia full storage Node","description":"Set up a Celestia full storage node.","frontmatter":{"description":"Set up a Celestia full storage node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia full storage Node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/full-storage-node.md","filePath":"nodes/full-storage-node.md","lastUpdated":1725971357000}'),n={name:"nodes/full-storage-node.md"},t=o("",44),p=[t];function r(c,i,d,y,u,h){return a(),e("div",null,p)}const f=s(n,[["render",r]]);export{g as __pageData,f as default};
    +import{_ as s,o as a,c as e,Q as o}from"./chunks/framework.b47e54aa.js";const l="/docs-preview/pr-1699/img/nodes/full-storage-node.png",g=JSON.parse('{"title":"Setting up a Celestia full storage Node","description":"Set up a Celestia full storage node.","frontmatter":{"description":"Set up a Celestia full storage node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia full storage Node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/full-storage-node.md","filePath":"nodes/full-storage-node.md","lastUpdated":1725992025000}'),n={name:"nodes/full-storage-node.md"},t=o("",44),p=[t];function r(c,i,d,y,u,h){return a(),e("div",null,p)}const f=s(n,[["render",r]]);export{g as __pageData,f as default};
    diff --git a/pr-1699/assets/nodes_hardfork-process.md.d852b283.js b/pr-1699/assets/nodes_hardfork-process.md.b85c06e7.js
    similarity index 97%
    rename from pr-1699/assets/nodes_hardfork-process.md.d852b283.js
    rename to pr-1699/assets/nodes_hardfork-process.md.b85c06e7.js
    index 5838193e3f..3acbf1ac59 100644
    --- a/pr-1699/assets/nodes_hardfork-process.md.d852b283.js
    +++ b/pr-1699/assets/nodes_hardfork-process.md.b85c06e7.js
    @@ -1 +1 @@
    -import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia hardfork process","description":"Overview of the Celestia hardfork process.","frontmatter":{"description":"Overview of the Celestia hardfork process.","head":[["meta",{"name":"og:title","content":"Celestia hardfork process | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/hardfork-process.md","filePath":"nodes/hardfork-process.md","lastUpdated":1725971357000}'),o={name:"nodes/hardfork-process.md"},i=r('

    Celestia hardfork process

    Blockchain networks often times need to upgrade with new features which require coordination work among the validators prior to activating the upgrades.

    This process is called a hardfork or a network upgrade. In those events, the Celestia Labs team will be coordinating with the validators on what they need to do in order to be ready for an upcoming hardfork.

    Hardforks are not backward-compatible with older versions of the network software which is why it is important that validators upgrade their software to continue validating on the network after the network upgrades.

    General process

    The general process can be broken down into several components:

    • Hardfork specifications and features (defined by description of features and code implementation of those features).
    • Binary used to add those features (a new binary release with those features will be provided by Celestia team in order for validators to upgrade their nodes to the new binary).
    • A block number for when the network upgrades (even if validators upgrade their binary to be hardfork ready, the network upgrade does not happen right away, but some short time in the future at a specific block number).
    • Testing of the features (happens on testnets first prior to activating on mainnet in order to ensure the network can upgrade securely).

    The two testnets where hardforks are deployed are:

    Lemongrass hardfork

    The Lemongrass hardfork is the first consensus layer breaking change since Celestia's Mainnet Beta genesis block. The Lemongrass hardfork includes all of the CIPs listed in CIP-17. The Lemongrass hardfork will be executed on Arabica, then Mocha, then Mainnet Beta. The hardfork will take place at an "upgrade height" that will be coordinated offline on a per-network basis. The upgrade heights will be announced in advance (see Network upgrades) to give node operators time to download and start a compatible binary prior to the upgrade height.

    • If you are a consensus node or validator operator: you will need to download and run a celestia-app binary >= v2.0.0 prior to the --v2-upgrade-height to remain on the canonical chain. You do not need to use a tool like cosmovisor to upgrade the binary at the upgrade height.
    • If you are a DA node operator, you will need to download and run a compatible celestia-node binary >= v0.16.0-rc0 prior to the upgrade height.
    NetworkChain IDDate and approximate time--v2-upgrade-height
    Arabicaarabica-112024/08/19 @ 14:00 UTC1751707
    Mochamocha-42024/08/28 @ 14:00 UTC2585031
    Mainnet Betacelestia2024/09/18 @ 14:00 UTC2371495
    ',13),s=[i];function n(d,h,l,c,p,f){return t(),a("div",null,s)}const k=e(o,[["render",n]]);export{g as __pageData,k as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia hardfork process","description":"Overview of the Celestia hardfork process.","frontmatter":{"description":"Overview of the Celestia hardfork process.","head":[["meta",{"name":"og:title","content":"Celestia hardfork process | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/hardfork-process.md","filePath":"nodes/hardfork-process.md","lastUpdated":1725992025000}'),o={name:"nodes/hardfork-process.md"},i=r('

    Celestia hardfork process

    Blockchain networks often times need to upgrade with new features which require coordination work among the validators prior to activating the upgrades.

    This process is called a hardfork or a network upgrade. In those events, the Celestia Labs team will be coordinating with the validators on what they need to do in order to be ready for an upcoming hardfork.

    Hardforks are not backward-compatible with older versions of the network software which is why it is important that validators upgrade their software to continue validating on the network after the network upgrades.

    General process

    The general process can be broken down into several components:

    • Hardfork specifications and features (defined by description of features and code implementation of those features).
    • Binary used to add those features (a new binary release with those features will be provided by Celestia team in order for validators to upgrade their nodes to the new binary).
    • A block number for when the network upgrades (even if validators upgrade their binary to be hardfork ready, the network upgrade does not happen right away, but some short time in the future at a specific block number).
    • Testing of the features (happens on testnets first prior to activating on mainnet in order to ensure the network can upgrade securely).

    The two testnets where hardforks are deployed are:

    Lemongrass hardfork

    The Lemongrass hardfork is the first consensus layer breaking change since Celestia's Mainnet Beta genesis block. The Lemongrass hardfork includes all of the CIPs listed in CIP-17. The Lemongrass hardfork will be executed on Arabica, then Mocha, then Mainnet Beta. The hardfork will take place at an "upgrade height" that will be coordinated offline on a per-network basis. The upgrade heights will be announced in advance (see Network upgrades) to give node operators time to download and start a compatible binary prior to the upgrade height.

    • If you are a consensus node or validator operator: you will need to download and run a celestia-app binary >= v2.0.0 prior to the --v2-upgrade-height to remain on the canonical chain. You do not need to use a tool like cosmovisor to upgrade the binary at the upgrade height.
    • If you are a DA node operator, you will need to download and run a compatible celestia-node binary >= v0.16.0-rc0 prior to the upgrade height.
    NetworkChain IDDate and approximate time--v2-upgrade-height
    Arabicaarabica-112024/08/19 @ 14:00 UTC1751707
    Mochamocha-42024/08/28 @ 14:00 UTC2585031
    Mainnet Betacelestia2024/09/18 @ 14:00 UTC2371495
    ',13),s=[i];function n(d,h,l,c,p,f){return t(),a("div",null,s)}const k=e(o,[["render",n]]);export{g as __pageData,k as default}; diff --git a/pr-1699/assets/nodes_hardfork-process.md.d852b283.lean.js b/pr-1699/assets/nodes_hardfork-process.md.b85c06e7.lean.js similarity index 81% rename from pr-1699/assets/nodes_hardfork-process.md.d852b283.lean.js rename to pr-1699/assets/nodes_hardfork-process.md.b85c06e7.lean.js index 004dce6541..30ebf13add 100644 --- a/pr-1699/assets/nodes_hardfork-process.md.d852b283.lean.js +++ b/pr-1699/assets/nodes_hardfork-process.md.b85c06e7.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia hardfork process","description":"Overview of the Celestia hardfork process.","frontmatter":{"description":"Overview of the Celestia hardfork process.","head":[["meta",{"name":"og:title","content":"Celestia hardfork process | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/hardfork-process.md","filePath":"nodes/hardfork-process.md","lastUpdated":1725971357000}'),o={name:"nodes/hardfork-process.md"},i=r("",13),s=[i];function n(d,h,l,c,p,f){return t(),a("div",null,s)}const k=e(o,[["render",n]]);export{g as __pageData,k as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.b47e54aa.js";const g=JSON.parse('{"title":"Celestia hardfork process","description":"Overview of the Celestia hardfork process.","frontmatter":{"description":"Overview of the Celestia hardfork process.","head":[["meta",{"name":"og:title","content":"Celestia hardfork process | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/hardfork-process.md","filePath":"nodes/hardfork-process.md","lastUpdated":1725992025000}'),o={name:"nodes/hardfork-process.md"},i=r("",13),s=[i];function n(d,h,l,c,p,f){return t(),a("div",null,s)}const k=e(o,[["render",n]]);export{g as __pageData,k as default}; diff --git a/pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.js b/pr-1699/assets/nodes_ibc-relayer.md.450545b1.js similarity index 99% rename from pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.js rename to pr-1699/assets/nodes_ibc-relayer.md.450545b1.js index f5ba462b5b..2c17e042e9 100644 --- a/pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.js +++ b/pr-1699/assets/nodes_ibc-relayer.md.450545b1.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"IBC relaying guide","description":"Learn how to establish IBC connections and relay packets.","frontmatter":{"description":"Learn how to establish IBC connections and relay packets.","next":{"text":"Metrics","link":"/nodes/celestia-node-metrics"},"head":[["meta",{"name":"og:title","content":"IBC relaying guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/ibc-relayer.md","filePath":"nodes/ibc-relayer.md","lastUpdated":1725971357000}'),p={name:"nodes/ibc-relayer.md"},o=l(`

    IBC relaying guide

    Celestia uses IBC (Inter-Blockchain Communication protocol) to enable cross-chain transfer of tokens. To support this capability it relies on relayers, processes that can be run by anyone which constantly scan for outbound packets on one chain and submits these packets alongside corresponding proofs on the destination chain. This section describes how one can setup a relayer and create new connections between chains. There are two standard implementations:

    The following guide explains how to establish IBC connections and relay packets between Mocha testnet and Cosmos hub testnet networks by using the Hermes relayer.

    Check the latest celestia-app release's go.mod for the version of ibc-go that is currently used.

    Hermes

    Hermes is an open-source Rust implementation of an IBC relayer released as part of the ibc-relayer-cli crate. It includes a CLI for relaying packets between Cosmos SDK chains, as well as Prometheus metrics and a REST API.

    Please follow the steps at Hermes Quick Start to install Hermes. Before proceeding, verify that Hermes is installed correctly by running hermes version.

    TIP

    Hermes currently doesn't support configuring the Tendermint CompatMode in chain config (see hermes#3623). Until that issue is resolved, please use Hermes v1.7.0+ because it falls back to Tendermint CompatMode v0.34 (see hermes#3663) which is compatible with Celestia.

    Configuration

    After you have successfully installed Hermes and created the necessary folders, you now have to edit config.toml and add the appropriate configurations for the chains you want to relay between.

    For this tutorial, we will be using the following chains:

    • Celestia's mocha-4 testnet
    • Cosmos Hub's theta-testnet-001 testnet

    Edit the Hermes configuration.

    bash
    vim $HOME/.hermes/config.toml
    vim $HOME/.hermes/config.toml
    toml
    [global]
    +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"IBC relaying guide","description":"Learn how to establish IBC connections and relay packets.","frontmatter":{"description":"Learn how to establish IBC connections and relay packets.","next":{"text":"Metrics","link":"/nodes/celestia-node-metrics"},"head":[["meta",{"name":"og:title","content":"IBC relaying guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/ibc-relayer.md","filePath":"nodes/ibc-relayer.md","lastUpdated":1725992025000}'),p={name:"nodes/ibc-relayer.md"},o=l(`

    IBC relaying guide

    Celestia uses IBC (Inter-Blockchain Communication protocol) to enable cross-chain transfer of tokens. To support this capability it relies on relayers, processes that can be run by anyone which constantly scan for outbound packets on one chain and submits these packets alongside corresponding proofs on the destination chain. This section describes how one can setup a relayer and create new connections between chains. There are two standard implementations:

    The following guide explains how to establish IBC connections and relay packets between Mocha testnet and Cosmos hub testnet networks by using the Hermes relayer.

    Check the latest celestia-app release's go.mod for the version of ibc-go that is currently used.

    Hermes

    Hermes is an open-source Rust implementation of an IBC relayer released as part of the ibc-relayer-cli crate. It includes a CLI for relaying packets between Cosmos SDK chains, as well as Prometheus metrics and a REST API.

    Please follow the steps at Hermes Quick Start to install Hermes. Before proceeding, verify that Hermes is installed correctly by running hermes version.

    TIP

    Hermes currently doesn't support configuring the Tendermint CompatMode in chain config (see hermes#3623). Until that issue is resolved, please use Hermes v1.7.0+ because it falls back to Tendermint CompatMode v0.34 (see hermes#3663) which is compatible with Celestia.

    Configuration

    After you have successfully installed Hermes and created the necessary folders, you now have to edit config.toml and add the appropriate configurations for the chains you want to relay between.

    For this tutorial, we will be using the following chains:

    • Celestia's mocha-4 testnet
    • Cosmos Hub's theta-testnet-001 testnet

    Edit the Hermes configuration.

    bash
    vim $HOME/.hermes/config.toml
    vim $HOME/.hermes/config.toml
    toml
    [global]
     log_level = "info"
     
     [mode.clients]
    diff --git a/pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.lean.js b/pr-1699/assets/nodes_ibc-relayer.md.450545b1.lean.js
    similarity index 91%
    rename from pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.lean.js
    rename to pr-1699/assets/nodes_ibc-relayer.md.450545b1.lean.js
    index a232eab12e..584e2462fe 100644
    --- a/pr-1699/assets/nodes_ibc-relayer.md.3c1ba349.lean.js
    +++ b/pr-1699/assets/nodes_ibc-relayer.md.450545b1.lean.js
    @@ -1 +1 @@
    -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"IBC relaying guide","description":"Learn how to establish IBC connections and relay packets.","frontmatter":{"description":"Learn how to establish IBC connections and relay packets.","next":{"text":"Metrics","link":"/nodes/celestia-node-metrics"},"head":[["meta",{"name":"og:title","content":"IBC relaying guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/ibc-relayer.md","filePath":"nodes/ibc-relayer.md","lastUpdated":1725971357000}'),p={name:"nodes/ibc-relayer.md"},o=l("",61),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
    +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"IBC relaying guide","description":"Learn how to establish IBC connections and relay packets.","frontmatter":{"description":"Learn how to establish IBC connections and relay packets.","next":{"text":"Metrics","link":"/nodes/celestia-node-metrics"},"head":[["meta",{"name":"og:title","content":"IBC relaying guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/ibc-relayer.md","filePath":"nodes/ibc-relayer.md","lastUpdated":1725992025000}'),p={name:"nodes/ibc-relayer.md"},o=l("",61),e=[o];function t(c,r,E,y,i,F){return n(),a("div",null,e)}const u=s(p,[["render",t]]);export{h as __pageData,u as default};
    diff --git a/pr-1699/assets/nodes_instantiate-testnet.md.46c96647.js b/pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.js
    similarity index 99%
    rename from pr-1699/assets/nodes_instantiate-testnet.md.46c96647.js
    rename to pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.js
    index 4c24c5be00..3a1b5008e1 100644
    --- a/pr-1699/assets/nodes_instantiate-testnet.md.46c96647.js
    +++ b/pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.js
    @@ -1,4 +1,4 @@
    -import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const E=JSON.parse('{"title":"Celestia App network instantiation guide","description":"A guide that helps you instantiate a new testnetwork with Celestia App.","frontmatter":{"description":"A guide that helps you instantiate a new testnetwork with Celestia App.","head":[["meta",{"name":"og:title","content":"Celestia App network instantiation guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/instantiate-testnet.md","filePath":"nodes/instantiate-testnet.md","lastUpdated":1725971357000}'),o={name:"nodes/instantiate-testnet.md"},t=n(`

    Celestia App network instantiation guide

    This guide is for helping instantiate a new testnetwork and following the correct steps to do so with Celestia App. You should only follow this guide if you want to experiment with your own Celestia test network (testnet) or if you want to test out new features to build as a core developer.

    Hardware requirements

    You will need to follow hardware requirements.

    Setup dependencies

    You will need to setup dependencies by following the guide.

    celestia-app installation

    You will need to install celestia-app by following the guide.

    Spin up a Celestia testnet

    If you want to spin up a quick testnet with your friends, you can follow these steps. Unless otherwise noted, every step must be done by everyone who wants to participate in this testnet.

    Optional: Reset working directory

    If you have already initialized a working directory for celestia-appd in the past, you must clean up before reinitializing a new directory. You can do so by running the following command:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Initialize a working directory

    Run the following command:

    sh
    VALIDATOR_NAME=validator1
    +import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const E=JSON.parse('{"title":"Celestia App network instantiation guide","description":"A guide that helps you instantiate a new testnetwork with Celestia App.","frontmatter":{"description":"A guide that helps you instantiate a new testnetwork with Celestia App.","head":[["meta",{"name":"og:title","content":"Celestia App network instantiation guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/instantiate-testnet.md","filePath":"nodes/instantiate-testnet.md","lastUpdated":1725992025000}'),o={name:"nodes/instantiate-testnet.md"},t=n(`

    Celestia App network instantiation guide

    This guide is for helping instantiate a new testnetwork and following the correct steps to do so with Celestia App. You should only follow this guide if you want to experiment with your own Celestia test network (testnet) or if you want to test out new features to build as a core developer.

    Hardware requirements

    You will need to follow hardware requirements.

    Setup dependencies

    You will need to setup dependencies by following the guide.

    celestia-app installation

    You will need to install celestia-app by following the guide.

    Spin up a Celestia testnet

    If you want to spin up a quick testnet with your friends, you can follow these steps. Unless otherwise noted, every step must be done by everyone who wants to participate in this testnet.

    Optional: Reset working directory

    If you have already initialized a working directory for celestia-appd in the past, you must clean up before reinitializing a new directory. You can do so by running the following command:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Initialize a working directory

    Run the following command:

    sh
    VALIDATOR_NAME=validator1
     CHAIN_ID=testnet
     celestia-appd init $VALIDATOR_NAME --chain-id $CHAIN_ID
    VALIDATOR_NAME=validator1
     CHAIN_ID=testnet
    diff --git a/pr-1699/assets/nodes_instantiate-testnet.md.46c96647.lean.js b/pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.lean.js
    similarity index 91%
    rename from pr-1699/assets/nodes_instantiate-testnet.md.46c96647.lean.js
    rename to pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.lean.js
    index 050dfdf93e..5d7af85b02 100644
    --- a/pr-1699/assets/nodes_instantiate-testnet.md.46c96647.lean.js
    +++ b/pr-1699/assets/nodes_instantiate-testnet.md.4b062bf6.lean.js
    @@ -1 +1 @@
    -import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const E=JSON.parse('{"title":"Celestia App network instantiation guide","description":"A guide that helps you instantiate a new testnetwork with Celestia App.","frontmatter":{"description":"A guide that helps you instantiate a new testnetwork with Celestia App.","head":[["meta",{"name":"og:title","content":"Celestia App network instantiation guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/instantiate-testnet.md","filePath":"nodes/instantiate-testnet.md","lastUpdated":1725971357000}'),o={name:"nodes/instantiate-testnet.md"},t=n("",60),l=[t];function p(i,r,c,d,h,y){return s(),a("div",null,l)}const g=e(o,[["render",p]]);export{E as __pageData,g as default};
    +import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.b47e54aa.js";const E=JSON.parse('{"title":"Celestia App network instantiation guide","description":"A guide that helps you instantiate a new testnetwork with Celestia App.","frontmatter":{"description":"A guide that helps you instantiate a new testnetwork with Celestia App.","head":[["meta",{"name":"og:title","content":"Celestia App network instantiation guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/instantiate-testnet.md","filePath":"nodes/instantiate-testnet.md","lastUpdated":1725992025000}'),o={name:"nodes/instantiate-testnet.md"},t=n("",60),l=[t];function p(i,r,c,d,h,y){return s(),a("div",null,l)}const g=e(o,[["render",p]]);export{E as __pageData,g as default};
    diff --git a/pr-1699/assets/nodes_light-node.md.c1fa0172.js b/pr-1699/assets/nodes_light-node.md.f1dd6ad1.js
    similarity index 95%
    rename from pr-1699/assets/nodes_light-node.md.c1fa0172.js
    rename to pr-1699/assets/nodes_light-node.md.f1dd6ad1.js
    index c4e721218d..75c04957ce 100644
    --- a/pr-1699/assets/nodes_light-node.md.c1fa0172.js
    +++ b/pr-1699/assets/nodes_light-node.md.f1dd6ad1.js
    @@ -1,6 +1,6 @@
    -import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/nodes/LightNodes.png",F=JSON.parse('{"title":"Setting up a Celestia light node","description":"This tutorial covers setting up a Celestia light node.","frontmatter":{"sidebar_label":"Light node","description":"This tutorial covers setting up a Celestia light node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia light node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/light-node.md","filePath":"nodes/light-node.md","lastUpdated":1725971357000}'),l={name:"nodes/light-node.md"},p=n('

    Setting up a Celestia light node

    This tutorial will guide you through setting up a Celestia light node, which will allow you to perform data availability sampling (DAS) on Celestia's data availability (DA) network.

    Overview of light nodes

    Light nodes ensure data availability. This is the most common way to interact with Celestia networks.

    light-node

    Light nodes have the following behavior:

    1. They listen for ExtendedHeaders, i.e. wrapped “raw” headers, that notify Celestia nodes of new block headers and relevant DA metadata.
    2. They perform DAS on the received headers

    Hardware requirements

    The following minimum hardware requirements are recommended for running a light node:

    • Memory: 500 MB RAM (minimum)
    • CPU: Single Core
    • Disk: 100 GB SSD Storage
    • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

    Setting up your light node

    This tutorial was performed on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up dependencies on the setting up environment page.

    Install celestia-node

    Install the celestia binary by building and installing celestia-node.

    Initialize the light node

    Run the following command:

    sh
    celestia light init
    celestia light init
    sh
    celestia light init --p2p.network mocha
    celestia light init --p2p.network mocha
    sh
    celestia light init --p2p.network arabica
    celestia light init --p2p.network arabica

    The output in your terminal will show the location of your node store and config. It will also show confirmation that the node store has been initialized.

    Start the light node

    Start the light node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get and submit state-related information, such as the ability to submit PayForBlobs transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    sh
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    sh
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica

    Tip: you can replace the core.ip with a consensus node RPC endpoint from mainnet, mocha, or arabica.

    Keys and wallets

    You can create your key for your node by running the following command with the cel-key utility in the celestia-node directory:

    sh
    ./cel-key add <key-name> --keyring-backend test \\
    +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/nodes/LightNodes.png",F=JSON.parse('{"title":"Setting up a Celestia light node","description":"This tutorial covers setting up a Celestia light node.","frontmatter":{"sidebar_label":"Light node","description":"This tutorial covers setting up a Celestia light node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia light node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/light-node.md","filePath":"nodes/light-node.md","lastUpdated":1725992025000}'),l={name:"nodes/light-node.md"},p=e('

    Setting up a Celestia light node

    This tutorial will guide you through setting up a Celestia light node, which will allow you to perform data availability sampling (DAS) on Celestia's data availability (DA) network.

    Overview of light nodes

    Light nodes ensure data availability. This is the most common way to interact with Celestia networks.

    light-node

    Light nodes have the following behavior:

    1. They listen for ExtendedHeaders, i.e. wrapped “raw” headers, that notify Celestia nodes of new block headers and relevant DA metadata.
    2. They perform DAS on the received headers

    Hardware requirements

    The following minimum hardware requirements are recommended for running a light node:

    • Memory: 500 MB RAM (minimum)
    • CPU: Single Core
    • Disk: 100 GB SSD Storage
    • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

    Setting up your light node

    This tutorial was performed on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up dependencies on the setting up environment page.

    Install celestia-node

    Install the celestia binary by building and installing celestia-node.

    Initialize the light node

    Run the following command:

    sh
    celestia light init
    celestia light init
    sh
    celestia light init --p2p.network mocha
    celestia light init --p2p.network mocha
    sh
    celestia light init --p2p.network arabica
    celestia light init --p2p.network arabica

    The output in your terminal will show the location of your node store and config. It will also show confirmation that the node store has been initialized.

    Start the light node

    Start the light node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get and submit state-related information, such as the ability to submit PayForBlobs transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    sh
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    sh
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica

    Tip: you can replace the core.ip with a consensus node RPC endpoint from mainnet, mocha, or arabica.

    Keys and wallets

    You can create your key for your node by running the following command with the cel-key utility in the celestia-node directory:

    sh
    ./cel-key add <key-name> --keyring-backend test \\
         --node.type light --p2p.network <network>
    ./cel-key add <key-name> --keyring-backend test \\
    -    --node.type light --p2p.network <network>

    You can start your light node with the key created above by running the following command:

    sh
    celestia light start --keyring.keyname my_celes_key \\
    +    --node.type light --p2p.network <network>

    You can start your light node with the key created above by running the following command:

    sh
    celestia light start --keyring.keyname my_celes_key \\
         --core.ip consensus.lunaroasis.net
    celestia light start --keyring.keyname my_celes_key \\
         --core.ip consensus.lunaroasis.net
    sh
    celestia light start --keyring.keyname my_celes_key \\
         --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --keyring.keyname my_celes_key \\
    @@ -10,7 +10,7 @@ import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const o=
         --core.ip validator-1.celestia-arabica-11.com \\
         --p2p.network arabica

    Once you start the light node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions.

    You can find the address using the RPC CLI or by running the following command in the celestia-node directory:

    sh
    ./cel-key list --node.type light --keyring-backend test \\
         --p2p.network <network>
    ./cel-key list --node.type light --keyring-backend test \\
    -    --p2p.network <network>

    Testnet tokens

    You have two networks to get testnet tokens from:

    You can request funds to your wallet address using the following command in Discord:

    console
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is the celestia1****** address generated when you created the wallet.

    Optional: run the light node with a custom key

    In order to run a light node using a custom key:

    1. The custom key must exist inside the celestia light node directory at the correct path (default: ~/.celestia-light/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia light start --core.ip <URI> \\
    +    --p2p.network <network>

    Testnet tokens

    You have two networks to get testnet tokens from:

    You can request funds to your wallet address using the following command in Discord:

    console
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is the celestia1****** address generated when you created the wallet.

    Optional: run the light node with a custom key

    In order to run a light node using a custom key:

    1. The custom key must exist inside the celestia light node directory at the correct path (default: ~/.celestia-light/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia light start --core.ip <URI> \\
         --keyring.keyname <name-of-custom-key> \\
    celestia light start --core.ip <URI> \\
         --keyring.keyname <name-of-custom-key> \\
    sh
    celestia light start --core.ip <URI> \\
         --keyring.keyname <name-of-custom-key> \\
    @@ -20,4 +20,4 @@ import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const o=
         --keyring.keyname <name-of-custom-key> \\
         --p2p.network mocha
    celestia light start --core.ip <URI> \\
         --keyring.keyname <name-of-custom-key> \\
    -    --p2p.network mocha

    Optional: Migrate node id to another server

    To migrate a light node ID:

    1. You need to back up two files located in the celestia-light node directory at the correct path (default: ~/.celestia-light/keys).
    2. Upload the files to the new server and start the node.

    Optional: start light node with SystemD

    Follow the tutorial on setting up the light node as a background process with SystemD.

    Data availability sampling

    With your light node running, you can check out this tutorial on submitting PayForBlob transactions.

    `,50),t=[p];function c(r,i,y,d,E,h){return a(),e("div",null,t)}const u=s(l,[["render",c]]);export{F as __pageData,u as default}; + --p2p.network mocha

    Optional: Migrate node id to another server

    To migrate a light node ID:

    1. You need to back up two files located in the celestia-light node directory at the correct path (default: ~/.celestia-light/keys).
    2. Upload the files to the new server and start the node.

    Optional: start light node with SystemD

    Follow the tutorial on setting up the light node as a background process with SystemD.

    Data availability sampling

    With your light node running, you can check out this tutorial on submitting PayForBlob transactions.

    `,50),t=[p];function c(r,i,y,d,E,h){return a(),n("div",null,t)}const u=s(l,[["render",c]]);export{F as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_light-node.md.c1fa0172.lean.js b/pr-1699/assets/nodes_light-node.md.f1dd6ad1.lean.js similarity index 67% rename from pr-1699/assets/nodes_light-node.md.c1fa0172.lean.js rename to pr-1699/assets/nodes_light-node.md.f1dd6ad1.lean.js index aaa2f9af5a..52a0c26040 100644 --- a/pr-1699/assets/nodes_light-node.md.c1fa0172.lean.js +++ b/pr-1699/assets/nodes_light-node.md.f1dd6ad1.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/nodes/LightNodes.png",F=JSON.parse('{"title":"Setting up a Celestia light node","description":"This tutorial covers setting up a Celestia light node.","frontmatter":{"sidebar_label":"Light node","description":"This tutorial covers setting up a Celestia light node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia light node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/light-node.md","filePath":"nodes/light-node.md","lastUpdated":1725971357000}'),l={name:"nodes/light-node.md"},p=n("",50),t=[p];function c(r,i,y,d,E,h){return a(),e("div",null,t)}const u=s(l,[["render",c]]);export{F as __pageData,u as default}; +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.b47e54aa.js";const o="/docs-preview/pr-1699/img/nodes/LightNodes.png",F=JSON.parse('{"title":"Setting up a Celestia light node","description":"This tutorial covers setting up a Celestia light node.","frontmatter":{"sidebar_label":"Light node","description":"This tutorial covers setting up a Celestia light node.","head":[["meta",{"name":"og:title","content":"Setting up a Celestia light node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/light-node.md","filePath":"nodes/light-node.md","lastUpdated":1725992025000}'),l={name:"nodes/light-node.md"},p=e("",50),t=[p];function c(r,i,y,d,E,h){return a(),n("div",null,t)}const u=s(l,[["render",c]]);export{F as __pageData,u as default}; diff --git a/pr-1699/assets/nodes_mainnet.md.0230b2ce.js b/pr-1699/assets/nodes_mainnet.md.0bba5c8e.js similarity index 99% rename from pr-1699/assets/nodes_mainnet.md.0230b2ce.js rename to pr-1699/assets/nodes_mainnet.md.0bba5c8e.js index 4dd78f09bc..ff255a59f7 100644 --- a/pr-1699/assets/nodes_mainnet.md.0230b2ce.js +++ b/pr-1699/assets/nodes_mainnet.md.0bba5c8e.js @@ -1 +1 @@ -import{M as p}from"./chunks/MainnetVersionTags.eb9befca.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as m,o as s,c as r,k as e,t as o,C as n,H as a,w as c,Q as i,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const f="/docs-preview/pr-1699/img/Mainnet-Beta.png",b="/docs-preview/pr-1699/grove/grove-sandbox.png",y={name:"MainnetBetaDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),H=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872")])],-1),V=e("td",null,"Genesis file",-1),w=["href"],L=e("td",null,"Peers file",-1),v=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function x(d,T,Q,l,t,F){return s(),r("table",null,[g,e("tr",null,[H,e("td",null,[e("code",null,o(t.constants.mainnetChainId),1)])]),k,e("tr",null,[V,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/genesis.json ",9,w)])]),e("tr",null,[L,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/peers.txt ",9,v)])]),_])}const M=m(y,[["render",x]]),C=i('

    Mainnet Beta

    Mainnet Beta

    Welcome to the guide for Celestia’s Mainnet Beta, the production network that marks the pinnacle of Celestia’s evolution since its inception in 2019. This network is where all components of the Celestia ecosystem come to life in a real-world environment.

    Mainnet Beta is the culmination of rigorous community testing, upgrades, and feedback. It serves as the platform for deploying mainnet rollups and applications.

    Network stability and upgrades

    Mainnet Beta is a stable network, but will still receive updates and improvements. Any changes or upgrades will be coordinated with node operators and the broader Celestia community to ensure seamless integration and minimal service interruptions.

    As we step into unexplored territories with groundbreaking technologies like data availability sampling, it's crucial to remember that Mainnet Beta remains experimental at this stage. While the network is live and functional, users may encounter occasional instability or reduced performance.

    Network details

    ',8),P=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),Z=i('

    Network parameters

    Full network parameters, such as max bytes, can be found in the celestia-app specifications.

    CIP-13 has been drafted to create a living document for these parameters as a part of the CIP process.

    Maximum bytes

    There is a hard limit on the total blob size in a transaction, which is determined by the effective maximum square size. Given that the current governance maximum square size is 64, the total blob size in a transaction must be slightly less than ~2 MiB, or 1,973,786 bytes to be exact.

    The following provides an approximation of the maximum block size:

    • The maximum square size is 64x64, which gives us 4096 shares.
    • One share is reserved for the PFB transaction, leaving us with 4095 shares.
    • The first sparse share has 478 bytes available, and the remaining sparse shares have 482 bytes each.

    This can be calculated as follows:

    ',8),E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.588ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 30315.8 1000","aria-hidden":"true"},q=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mtext"},[e("path",{"data-c":"54",d:"M36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"6F",d:"M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z",transform:"translate(722,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1222,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"61",d:"M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z",transform:"translate(1611,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"6C",d:"M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z",transform:"translate(2111,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"20",d:"",transform:"translate(2389,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"42",d:"M131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188Z",transform:"translate(2639,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(3347,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(3875,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(4264,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(4708,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(5379.8,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(6435.6,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(6824.6,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(7546.8,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(8547,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(10047,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(10214,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(12525,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(13136.2,0)"},[e("path",{"data-c":"2B",d:"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(14136.4,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(14525.4,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",transform:"translate(1500,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(16747.7,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(17747.9,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(19247.9,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(19414.9,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(21725.9,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(22392.7,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(23448.4,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(23948.4,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(24393.1,0)"},[e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(25893.1,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(26337.8,0)"},[e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"36",d:"M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(27837.8,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(28004.8,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})])])],-1),D=[q],A=e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mtext",null,"Total Bytes"),e("mo",null,"="),e("mo",{stretchy:"false"},"("),e("mn",null,"1"),e("mo",null,"×"),e("mn",null,"478"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"+"),e("mo",{stretchy:"false"},"("),e("mn",null,"4094"),e("mo",null,"×"),e("mn",null,"482"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"="),e("mn",null,"1"),e("mo",null,","),e("mn",null,"973"),e("mo",null,","),e("mn",null,"786"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes")],-1),R=i('

    Please note that there isn't a precise upper bound on the maximum total blob size. It depends on several factors:

    • The maximum square size, which is determined by a governance parameter and a versioned constant.
    • The maximum bytes in a block, which is determined by a governance parameter and a hard-coded constant in CometBFT.
    • The number of shares occupied by the PFB transaction share.

    These factors can cause the maximum total blob size that can be included in one block to vary.

    See the code in celestia-app and celestia-node.

    Integrations

    This guide contains the relevant sections for how to connect to Mainnet Beta, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

    Here is a list of options of the types of nodes you can run in order to participate in Mainnet Beta:

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Consensus nodes

    Community consensus RPC endpoints

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs.

    • public-celestia-rpc.numia.xyz
    • celestia-rpc.mesa.newmetric.xyz
    • rpc.celestia.pops.one
    • rpc.lunaroasis.net
    • rpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com
    • celestia-rpc.spidey.services
    • rpc-celestia.contributiondao.com
    • celestia.rpc.stakin-nodes.com
    • celestia.cumulo.org.es
    • rpc-celestia.mzonder.com
    • rpc-celestia-01.stakeflow.io
    • rpc-celestia.alphab.ai
    • rpc-celestia-full.avril14th.org
    • celestia-rpc.easy2stake.com
    • celestia.rpc.kjnodes.com
    • celestia-rpc.0xcryptovestor.com
    • rpc-celestia-mainnet.trusted-point.com
    • celestia.rpc.archives.validao.xyz
    • rpc-archive.celestia.bitszn.com
    • celestia-rpc.f5nodes.com
    • celestia-rpc.chainode.tech:33373
    • rpc-celestia.staker.space
    • celestia-rpc.noders.services
    • celestia.moonli.me
    • celestia-mainnet-rpc.itrocket.net:443
    • rpc.celestia.mainnet.dteam.tech:443

    Community API endpoints

    • public-celestia-lcd.numia.xyz
    • celestia-rest.mesa.newmetric.xyz
    • api.celestia.pops.one
    • api.lunaroasis.net
    • api.celestia.nodestake.top
    • celestia-rpc.brightlystake.com/api
    • celestia-api.spidey.services
    • api-celestia.contributiondao.com
    • celestia.rest.stakin-nodes.com
    • celestia.api.cumulo.org.es
    • api-celestia.mzonder.com
    • api-celestia-01.stakeflow.io
    • api-celestia.alphab.ai
    • api-celestia-full.avril14th.org
    • celestia-lcd.easy2stake.com
    • celestia.api.kjnodes.com
    • api-celestia-mainnet.trusted-point.com
    • celestia.rest.archives.validao.xyz
    • api-archive.celestia.bitszn.com
    • celestia-api.f5nodes.com
    • celestia-api.chainode.tech
    • api-celestia.staker.space
    • celestia-api.noders.services
    • celestia.moonli.me/api
    • celestia-mainnet-api.itrocket.net:443
    • api.celestia.mainnet.dteam.tech:443

    Community gRPC endpoints

    • public-celestia-grpc.numia.xyz
    • celestia-grpc.mesa.newmetric.xyz
    • grpc.celestia.pops.one
    • grpc.lunaroasis.net:443
    • grpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com:9090
    • celestia-grpc.spidey.services
    • grpc-celestia.contributiondao.com
    • celestia.grpc.stakin-nodes.com:443
    • celestia.grpc.cumulo.org.es:443
    • grpc-celestia.mzonder.com:443
    • grpc-celestia-01.stakeflow.io:15002
    • rpc-celestia.alphab.ai:9090
    • grpc-celestia-full.avril14th.org
    • celestia.grpc.kjnodes.com:443
    • grpc-celestia-mainnet.trusted-point.com:9095
    • celestia.grpc.archives.validao.xyz:9090
    • gprc-archive.celestia.bitszn.com
    • celestia-grpc.f5nodes.com:9390
    • celestia-grpc.chainode.tech:443
    • grpc-celestia.staker.space
    • celestia-grpc.noders.services:11090
    • celestia-mainnet-grpc.itrocket.net:443
    • grpc.celestia.mainnet.dteam.tech:28090

    Community WebSocket endpoints

    • wss://celestia-ws.chainode.tech:33373/websocket
    • wss://celestia-mainnet-ws.itrocket.net:443/websocket
    • wss://rpc.celestia.mainnet.dteam.tech:443/websocket

    Data availability nodes

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    TIP

    bash
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>

    Bridge nodes

    Not all RPC endpoints guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

    RPCs for DA nodes to initialise or start your celestia-node to Mainnet Beta with:

    • public-celestia-consensus.numia.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-consensus.mesa.newmetric.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.pops.one
      • gRPC: port 9090
      • RPC: port 26657
    • consensus.lunaroasis.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc-celestia.alphab.ai
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-mainnet-consensus.itrocket.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.mainnet.dteam.tech
      • gRPC: port 28090
      • RPC: 28657
    • celestia-consensus-mainnet.noders.services
      • gRPC: port 9080
      • RPC: port 26557

    DA full and light nodes might have troubles connecting to the networks, so you can check out this Grafana dashboard to see health/uptime status of DA bootstrappers (now celestia network only).

    You can find the status of these endpoints.

    Archival DA RPC endpoints

    By default, light nodes prune recent data to save on storage space. Archival data availability (DA) nodes store the entire history of the chain without pruning any data so all data available data is retrievable. You can read more about light vs archival nodes.

    Grove archival endpoints

    You can provision your own Celestia Archival endpoint on Grove. Learn more about Celestia on Grove, or find the fully supported spec.

    There is a sandbox you can leverage for testing straight in your browser:

    grove-sandbox

    Explorers

    There are multiple explorers you can use for Mainnet Beta:

    Analytics

    The following websites provide analytics for Celestia:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mainnet Beta:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',50),j=JSON.parse('{"title":"Mainnet Beta","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Mainnet Beta | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mainnet.md","filePath":"nodes/mainnet.md","lastUpdated":1725971357000}'),B={name:"nodes/mainnet.md"},G=Object.assign(B,{setup(d){return(T,Q)=>{const l=n("mjx-assistive-mml"),t=n("mjx-container");return s(),r("div",null,[C,a(M),P,a(p),Z,e("p",null,[a(t,{class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},{default:c(()=>[(s(),r("svg",E,D)),a(l,{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},{default:c(()=>[A]),_:1})]),_:1})]),R])}}});export{j as __pageData,G as default}; +import{M as p}from"./chunks/MainnetVersionTags.eb9befca.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as m,o as s,c as r,k as e,t as o,C as n,H as a,w as c,Q as i,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const f="/docs-preview/pr-1699/img/Mainnet-Beta.png",b="/docs-preview/pr-1699/grove/grove-sandbox.png",y={name:"MainnetBetaDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),H=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872")])],-1),V=e("td",null,"Genesis file",-1),w=["href"],L=e("td",null,"Peers file",-1),v=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function x(d,T,Q,l,t,F){return s(),r("table",null,[g,e("tr",null,[H,e("td",null,[e("code",null,o(t.constants.mainnetChainId),1)])]),k,e("tr",null,[V,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/genesis.json ",9,w)])]),e("tr",null,[L,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/peers.txt ",9,v)])]),_])}const M=m(y,[["render",x]]),C=i('

    Mainnet Beta

    Mainnet Beta

    Welcome to the guide for Celestia’s Mainnet Beta, the production network that marks the pinnacle of Celestia’s evolution since its inception in 2019. This network is where all components of the Celestia ecosystem come to life in a real-world environment.

    Mainnet Beta is the culmination of rigorous community testing, upgrades, and feedback. It serves as the platform for deploying mainnet rollups and applications.

    Network stability and upgrades

    Mainnet Beta is a stable network, but will still receive updates and improvements. Any changes or upgrades will be coordinated with node operators and the broader Celestia community to ensure seamless integration and minimal service interruptions.

    As we step into unexplored territories with groundbreaking technologies like data availability sampling, it's crucial to remember that Mainnet Beta remains experimental at this stage. While the network is live and functional, users may encounter occasional instability or reduced performance.

    Network details

    ',8),P=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),Z=i('

    Network parameters

    Full network parameters, such as max bytes, can be found in the celestia-app specifications.

    CIP-13 has been drafted to create a living document for these parameters as a part of the CIP process.

    Maximum bytes

    There is a hard limit on the total blob size in a transaction, which is determined by the effective maximum square size. Given that the current governance maximum square size is 64, the total blob size in a transaction must be slightly less than ~2 MiB, or 1,973,786 bytes to be exact.

    The following provides an approximation of the maximum block size:

    • The maximum square size is 64x64, which gives us 4096 shares.
    • One share is reserved for the PFB transaction, leaving us with 4095 shares.
    • The first sparse share has 478 bytes available, and the remaining sparse shares have 482 bytes each.

    This can be calculated as follows:

    ',8),E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.588ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 30315.8 1000","aria-hidden":"true"},q=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mtext"},[e("path",{"data-c":"54",d:"M36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"6F",d:"M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z",transform:"translate(722,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1222,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"61",d:"M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z",transform:"translate(1611,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"6C",d:"M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z",transform:"translate(2111,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"20",d:"",transform:"translate(2389,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"42",d:"M131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188Z",transform:"translate(2639,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(3347,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(3875,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(4264,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(4708,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(5379.8,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(6435.6,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(6824.6,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(7546.8,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(8547,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(10047,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(10214,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(12525,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(13136.2,0)"},[e("path",{"data-c":"2B",d:"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(14136.4,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(14525.4,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",transform:"translate(1500,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(16747.7,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(17747.9,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(19247.9,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(19414.9,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(21725.9,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(22392.7,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(23448.4,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(23948.4,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(24393.1,0)"},[e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(25893.1,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(26337.8,0)"},[e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"36",d:"M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(27837.8,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(28004.8,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})])])],-1),D=[q],A=e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mtext",null,"Total Bytes"),e("mo",null,"="),e("mo",{stretchy:"false"},"("),e("mn",null,"1"),e("mo",null,"×"),e("mn",null,"478"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"+"),e("mo",{stretchy:"false"},"("),e("mn",null,"4094"),e("mo",null,"×"),e("mn",null,"482"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"="),e("mn",null,"1"),e("mo",null,","),e("mn",null,"973"),e("mo",null,","),e("mn",null,"786"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes")],-1),R=i('

    Please note that there isn't a precise upper bound on the maximum total blob size. It depends on several factors:

    • The maximum square size, which is determined by a governance parameter and a versioned constant.
    • The maximum bytes in a block, which is determined by a governance parameter and a hard-coded constant in CometBFT.
    • The number of shares occupied by the PFB transaction share.

    These factors can cause the maximum total blob size that can be included in one block to vary.

    See the code in celestia-app and celestia-node.

    Integrations

    This guide contains the relevant sections for how to connect to Mainnet Beta, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

    Here is a list of options of the types of nodes you can run in order to participate in Mainnet Beta:

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Consensus nodes

    Community consensus RPC endpoints

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs.

    • public-celestia-rpc.numia.xyz
    • celestia-rpc.mesa.newmetric.xyz
    • rpc.celestia.pops.one
    • rpc.lunaroasis.net
    • rpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com
    • celestia-rpc.spidey.services
    • rpc-celestia.contributiondao.com
    • celestia.rpc.stakin-nodes.com
    • celestia.cumulo.org.es
    • rpc-celestia.mzonder.com
    • rpc-celestia-01.stakeflow.io
    • rpc-celestia.alphab.ai
    • rpc-celestia-full.avril14th.org
    • celestia-rpc.easy2stake.com
    • celestia.rpc.kjnodes.com
    • celestia-rpc.0xcryptovestor.com
    • rpc-celestia-mainnet.trusted-point.com
    • celestia.rpc.archives.validao.xyz
    • rpc-archive.celestia.bitszn.com
    • celestia-rpc.f5nodes.com
    • celestia-rpc.chainode.tech:33373
    • rpc-celestia.staker.space
    • celestia-rpc.noders.services
    • celestia.moonli.me
    • celestia-mainnet-rpc.itrocket.net:443
    • rpc.celestia.mainnet.dteam.tech:443

    Community API endpoints

    • public-celestia-lcd.numia.xyz
    • celestia-rest.mesa.newmetric.xyz
    • api.celestia.pops.one
    • api.lunaroasis.net
    • api.celestia.nodestake.top
    • celestia-rpc.brightlystake.com/api
    • celestia-api.spidey.services
    • api-celestia.contributiondao.com
    • celestia.rest.stakin-nodes.com
    • celestia.api.cumulo.org.es
    • api-celestia.mzonder.com
    • api-celestia-01.stakeflow.io
    • api-celestia.alphab.ai
    • api-celestia-full.avril14th.org
    • celestia-lcd.easy2stake.com
    • celestia.api.kjnodes.com
    • api-celestia-mainnet.trusted-point.com
    • celestia.rest.archives.validao.xyz
    • api-archive.celestia.bitszn.com
    • celestia-api.f5nodes.com
    • celestia-api.chainode.tech
    • api-celestia.staker.space
    • celestia-api.noders.services
    • celestia.moonli.me/api
    • celestia-mainnet-api.itrocket.net:443
    • api.celestia.mainnet.dteam.tech:443

    Community gRPC endpoints

    • public-celestia-grpc.numia.xyz
    • celestia-grpc.mesa.newmetric.xyz
    • grpc.celestia.pops.one
    • grpc.lunaroasis.net:443
    • grpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com:9090
    • celestia-grpc.spidey.services
    • grpc-celestia.contributiondao.com
    • celestia.grpc.stakin-nodes.com:443
    • celestia.grpc.cumulo.org.es:443
    • grpc-celestia.mzonder.com:443
    • grpc-celestia-01.stakeflow.io:15002
    • rpc-celestia.alphab.ai:9090
    • grpc-celestia-full.avril14th.org
    • celestia.grpc.kjnodes.com:443
    • grpc-celestia-mainnet.trusted-point.com:9095
    • celestia.grpc.archives.validao.xyz:9090
    • gprc-archive.celestia.bitszn.com
    • celestia-grpc.f5nodes.com:9390
    • celestia-grpc.chainode.tech:443
    • grpc-celestia.staker.space
    • celestia-grpc.noders.services:11090
    • celestia-mainnet-grpc.itrocket.net:443
    • grpc.celestia.mainnet.dteam.tech:28090

    Community WebSocket endpoints

    • wss://celestia-ws.chainode.tech:33373/websocket
    • wss://celestia-mainnet-ws.itrocket.net:443/websocket
    • wss://rpc.celestia.mainnet.dteam.tech:443/websocket

    Data availability nodes

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    TIP

    bash
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>

    Bridge nodes

    Not all RPC endpoints guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

    RPCs for DA nodes to initialise or start your celestia-node to Mainnet Beta with:

    • public-celestia-consensus.numia.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-consensus.mesa.newmetric.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.pops.one
      • gRPC: port 9090
      • RPC: port 26657
    • consensus.lunaroasis.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc-celestia.alphab.ai
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-mainnet-consensus.itrocket.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.mainnet.dteam.tech
      • gRPC: port 28090
      • RPC: 28657
    • celestia-consensus-mainnet.noders.services
      • gRPC: port 9080
      • RPC: port 26557

    DA full and light nodes might have troubles connecting to the networks, so you can check out this Grafana dashboard to see health/uptime status of DA bootstrappers (now celestia network only).

    You can find the status of these endpoints.

    Archival DA RPC endpoints

    By default, light nodes prune recent data to save on storage space. Archival data availability (DA) nodes store the entire history of the chain without pruning any data so all data available data is retrievable. You can read more about light vs archival nodes.

    Grove archival endpoints

    You can provision your own Celestia Archival endpoint on Grove. Learn more about Celestia on Grove, or find the fully supported spec.

    There is a sandbox you can leverage for testing straight in your browser:

    grove-sandbox

    Explorers

    There are multiple explorers you can use for Mainnet Beta:

    Analytics

    The following websites provide analytics for Celestia:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mainnet Beta:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',50),j=JSON.parse('{"title":"Mainnet Beta","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Mainnet Beta | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mainnet.md","filePath":"nodes/mainnet.md","lastUpdated":1725992025000}'),B={name:"nodes/mainnet.md"},G=Object.assign(B,{setup(d){return(T,Q)=>{const l=n("mjx-assistive-mml"),t=n("mjx-container");return s(),r("div",null,[C,a(M),P,a(p),Z,e("p",null,[a(t,{class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},{default:c(()=>[(s(),r("svg",E,D)),a(l,{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},{default:c(()=>[A]),_:1})]),_:1})]),R])}}});export{j as __pageData,G as default}; diff --git a/pr-1699/assets/nodes_mainnet.md.0230b2ce.lean.js b/pr-1699/assets/nodes_mainnet.md.0bba5c8e.lean.js similarity index 99% rename from pr-1699/assets/nodes_mainnet.md.0230b2ce.lean.js rename to pr-1699/assets/nodes_mainnet.md.0bba5c8e.lean.js index a627c56195..698262dae9 100644 --- a/pr-1699/assets/nodes_mainnet.md.0230b2ce.lean.js +++ b/pr-1699/assets/nodes_mainnet.md.0bba5c8e.lean.js @@ -1 +1 @@ -import{M as p}from"./chunks/MainnetVersionTags.eb9befca.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as m,o as s,c as r,k as e,t as o,C as n,H as a,w as c,Q as i,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const f="/docs-preview/pr-1699/img/Mainnet-Beta.png",b="/docs-preview/pr-1699/grove/grove-sandbox.png",y={name:"MainnetBetaDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),H=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872")])],-1),V=e("td",null,"Genesis file",-1),w=["href"],L=e("td",null,"Peers file",-1),v=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function x(d,T,Q,l,t,F){return s(),r("table",null,[g,e("tr",null,[H,e("td",null,[e("code",null,o(t.constants.mainnetChainId),1)])]),k,e("tr",null,[V,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/genesis.json ",9,w)])]),e("tr",null,[L,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/peers.txt ",9,v)])]),_])}const M=m(y,[["render",x]]),C=i("",8),P=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),Z=i("",8),E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.588ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 30315.8 1000","aria-hidden":"true"},q=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mtext"},[e("path",{"data-c":"54",d:"M36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"6F",d:"M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z",transform:"translate(722,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1222,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"61",d:"M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z",transform:"translate(1611,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"6C",d:"M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z",transform:"translate(2111,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"20",d:"",transform:"translate(2389,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"42",d:"M131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188Z",transform:"translate(2639,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(3347,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(3875,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(4264,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(4708,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(5379.8,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(6435.6,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(6824.6,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(7546.8,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(8547,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(10047,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(10214,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(12525,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(13136.2,0)"},[e("path",{"data-c":"2B",d:"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(14136.4,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(14525.4,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",transform:"translate(1500,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(16747.7,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(17747.9,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(19247.9,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(19414.9,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(21725.9,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(22392.7,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(23448.4,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(23948.4,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(24393.1,0)"},[e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(25893.1,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(26337.8,0)"},[e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"36",d:"M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(27837.8,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(28004.8,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})])])],-1),D=[q],A=e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mtext",null,"Total Bytes"),e("mo",null,"="),e("mo",{stretchy:"false"},"("),e("mn",null,"1"),e("mo",null,"×"),e("mn",null,"478"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"+"),e("mo",{stretchy:"false"},"("),e("mn",null,"4094"),e("mo",null,"×"),e("mn",null,"482"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"="),e("mn",null,"1"),e("mo",null,","),e("mn",null,"973"),e("mo",null,","),e("mn",null,"786"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes")],-1),R=i("",50),j=JSON.parse('{"title":"Mainnet Beta","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Mainnet Beta | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mainnet.md","filePath":"nodes/mainnet.md","lastUpdated":1725971357000}'),B={name:"nodes/mainnet.md"},G=Object.assign(B,{setup(d){return(T,Q)=>{const l=n("mjx-assistive-mml"),t=n("mjx-container");return s(),r("div",null,[C,a(M),P,a(p),Z,e("p",null,[a(t,{class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},{default:c(()=>[(s(),r("svg",E,D)),a(l,{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},{default:c(()=>[A]),_:1})]),_:1})]),R])}}});export{j as __pageData,G as default}; +import{M as p}from"./chunks/MainnetVersionTags.eb9befca.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as m,o as s,c as r,k as e,t as o,C as n,H as a,w as c,Q as i,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const f="/docs-preview/pr-1699/img/Mainnet-Beta.png",b="/docs-preview/pr-1699/grove/grove-sandbox.png",y={name:"MainnetBetaDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),H=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872")])],-1),V=e("td",null,"Genesis file",-1),w=["href"],L=e("td",null,"Peers file",-1),v=["href"],_=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function x(d,T,Q,l,t,F){return s(),r("table",null,[g,e("tr",null,[H,e("td",null,[e("code",null,o(t.constants.mainnetChainId),1)])]),k,e("tr",null,[V,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/genesis.json ",9,w)])]),e("tr",null,[L,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mainnetChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mainnetChainId)+"/peers.txt ",9,v)])]),_])}const M=m(y,[["render",x]]),C=i("",8),P=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),Z=i("",8),E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.588ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 30315.8 1000","aria-hidden":"true"},q=e("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[e("g",{"data-mml-node":"math"},[e("g",{"data-mml-node":"mtext"},[e("path",{"data-c":"54",d:"M36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"6F",d:"M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z",transform:"translate(722,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1222,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"61",d:"M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z",transform:"translate(1611,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"6C",d:"M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z",transform:"translate(2111,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"20",d:"",transform:"translate(2389,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"42",d:"M131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188Z",transform:"translate(2639,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(3347,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(3875,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(4264,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(4708,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(5379.8,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(6435.6,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(6824.6,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(7546.8,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(8547,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(10047,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(10214,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(12525,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(13136.2,0)"},[e("path",{"data-c":"2B",d:"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(14136.4,0)"},[e("path",{"data-c":"28",d:"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(14525.4,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",transform:"translate(1500,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(16747.7,0)"},[e("path",{"data-c":"D7",d:"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(17747.9,0)"},[e("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(19247.9,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(19414.9,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(21725.9,0)"},[e("path",{"data-c":"29",d:"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(22392.7,0)"},[e("path",{"data-c":"3D",d:"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(23448.4,0)"},[e("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(23948.4,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(24393.1,0)"},[e("path",{"data-c":"39",d:"M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mo",transform:"translate(25893.1,0)"},[e("path",{"data-c":"2C",d:"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mn",transform:"translate(26337.8,0)"},[e("path",{"data-c":"37",d:"M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"38",d:"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z",transform:"translate(500,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"36",d:"M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z",transform:"translate(1000,0)",style:{"stroke-width":"3"}})]),e("g",{"data-mml-node":"mstyle",transform:"translate(27837.8,0)"},[e("g",{"data-mml-node":"mspace"})]),e("g",{"data-mml-node":"mtext",transform:"translate(28004.8,0)"},[e("path",{"data-c":"62",d:"M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z",style:{"stroke-width":"3"}}),e("path",{"data-c":"79",d:"M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z",transform:"translate(556,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"74",d:"M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z",transform:"translate(1084,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"65",d:"M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z",transform:"translate(1473,0)",style:{"stroke-width":"3"}}),e("path",{"data-c":"73",d:"M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z",transform:"translate(1917,0)",style:{"stroke-width":"3"}})])])],-1),D=[q],A=e("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[e("mtext",null,"Total Bytes"),e("mo",null,"="),e("mo",{stretchy:"false"},"("),e("mn",null,"1"),e("mo",null,"×"),e("mn",null,"478"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"+"),e("mo",{stretchy:"false"},"("),e("mn",null,"4094"),e("mo",null,"×"),e("mn",null,"482"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes"),e("mo",{stretchy:"false"},")"),e("mo",null,"="),e("mn",null,"1"),e("mo",null,","),e("mn",null,"973"),e("mo",null,","),e("mn",null,"786"),e("mstyle",{scriptlevel:"0"},[e("mspace",{width:"0.167em"})]),e("mtext",null,"bytes")],-1),R=i("",50),j=JSON.parse('{"title":"Mainnet Beta","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Mainnet Beta | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mainnet.md","filePath":"nodes/mainnet.md","lastUpdated":1725992025000}'),B={name:"nodes/mainnet.md"},G=Object.assign(B,{setup(d){return(T,Q)=>{const l=n("mjx-assistive-mml"),t=n("mjx-container");return s(),r("div",null,[C,a(M),P,a(p),Z,e("p",null,[a(t,{class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},{default:c(()=>[(s(),r("svg",E,D)),a(l,{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},{default:c(()=>[A]),_:1})]),_:1})]),R])}}});export{j as __pageData,G as default}; diff --git a/pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.js b/pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.js similarity index 99% rename from pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.js rename to pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.js index a38eca36fc..7510ed12d3 100644 --- a/pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.js +++ b/pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.js @@ -1 +1 @@ -import{M as d}from"./chunks/MochaVersionTags.743560ae.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as p,o as s,c as i,k as e,t as o,H as a,Q as r,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mocha_versions.7704b055.js";const m="/docs-preview/pr-1699/img/mocha.jpg",f={name:"MochaTestnetDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),b=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"B93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D")])],-1),y=e("td",null,"Genesis file",-1),_=["href"],w=e("td",null,"Peers file",-1),v=["href"],C=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function P(l,n,c,S,t,E){return s(),i("table",null,[g,e("tr",null,[b,e("td",null,[e("code",null,o(t.constants.mochaChainId),1)])]),k,e("tr",null,[y,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/genesis.json ",9,_)])]),e("tr",null,[w,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/peers.txt ",9,v)])]),C])}const T=p(f,[["render",P]]),R=r('

    Mocha testnet

    mocha-testnet

    This guide contains the relevant sections for how to connect to Mocha, depending on the type of node you are running. Mocha testnet is designed to help validators test out their infrastructure and node software. Developers are encouraged to deploy their sovereign rollups on Mocha, but we also recommend Arabica devnet for that as it is designed for development purposes.

    Mocha is a milestone in Celestia, allowing everyone to test out core functionalities on the network. Read the announcement. Your best approach to participating is to first determine which node you would like to run. Each node's guide will link to the relevant networks, to show you how to connect to them.

    You have a list of options on the types of nodes you can run to participate in Mocha:

    Consensus:

    Data Availability:

    Select the type of node you would like to run and follow the instructions on each respective page. Whenever you are asked to select the type of network you want to connect to in those guides, select Mocha to refer to the correct instructions on this page on how to connect to Mocha.

    Network details

    ',11),x=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),A=r('

    RPC for DA bridge, full, and light nodes

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    Bridge nodes

    Mentioned below RPC endpoints do not guarantee you the download of full blocks from them. We advise that if you are running a bridge node, that you also run a local consensus node in order to download full blocks from it.

    • public-celestia-mocha4-consensus.numia.xyz
    • mocha-4-consensus.mesa.newmetric.xyz
    • full.consensus.mocha-4.celestia-mocha.com
    • consensus-full-mocha-4.celestia-mocha.com
    • rpc-mocha.pops.one
    • celestia-testnet-consensus.itrocket.net
      • RPC port: 26657
      • gRPC port: 9090
    • rpc-celestia-testnet.cryptech.com.ua
      • gRPC: grpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443
      • gRPC: grpc.celestia.testnet.dteam.tech:27090
    • celestia-consensus-testnet.noders.services
      • RPC port: 26357
      • gRPC port: 9070

    Community RPC endpoints

    The RPC endpoint is to allow users to interact with Celestia's nodes by querying the node's state and broadcasting transactions on the Celestia network. The default port is 26657.

    • public-celestia-mocha4-consensus.numia.xyz:26657
    • mocha-4-consensus.mesa.newmetric.xyz:26657
    • rpc.celestia-mocha.com
    • celestia-testnet-rpc.f5nodes.com
    • celestia-testnet.brightlystake.com
    • rpc-celestia-mocha.architectnodes.com
    • rpc-celestia-mocha.trusted-point.com
    • rpc-celestia-testnet-01.stakeflow.io
    • mocha.celestia.rpc.cumulo.me
    • rpc-mocha-4.spidey.services
    • rpc-mocha-full.avril14th.org
    • rpc.mocha.bitszn.com
    • celestia-t-rpc.noders.services/
    • rpc-1.testnet.celestia.nodes.guru
    • rpc-2.testnet.celestia.nodes.guru
    • celestia-testnet-rpc.itrocket.net:443
    • rpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443

    Community API endpoints

    The API endpoint is to allow users to interact with the REST API in Cosmos SDK which is implemented using gRPC-gateway, which exposes gRPC endpoints as REST endpoints. This allows for communication with the node using REST calls, which can be useful if the client does not support gRPC or HTTP2. The default port is 1317.

    Community gRPC endpoints

    The gRPC endpoint is to allow users to interact with a Celestia Node using gRPC, a modern open-source and high-performance RPC framework. The default port is 9090. In the Cosmos SDK, gRPC is used to define state queries and broadcast transactions.

    • public-celestia-mocha4-consensus.numia.xyz:9090
    • mocha-4-consensus.mesa.newmetric.xyz:9090
    • grpc-mocha.pops.one
    • grpc.celestia-mocha.com:443
    • full.consensus.mocha-4.celestia-mocha.com:9090
    • consensus-full-mocha-4.celestia-mocha.com:9090
    • celestia-testnet-grpc.f5nodes.com
    • celestia-testnet.brightlystake.com:9390
    • grpc-celestia-mocha.architectnodes.com:1443
    • grpc-celestia-mocha.trusted-point.com:9099
    • grpc-celestia-testnet-01.stakeflow.io:16002
    • mocha.grpc.cumulo.me:443
    • grpc-mocha-4.spidey.services
    • grpc-mocha-full.avril14th.org
    • grpc.mocha.bitszn.com
    • celestia-grpc.noders.services:21090
    • grpc-1.testnet.celestia.nodes.guru:10790
    • grpc-2.testnet.celestia.nodes.guru:10790
    • celestia-testnet-grpc.itrocket.net:443
    • grpc-celestia-testnet.cryptech.com.ua:443
    • grpc.celestia.testnet.dteam.tech:27090

    Community bridge and full node endpoints

    The endpoints below are for bridge and full nodes only. They can be used to find bootstrapper peers in the p2p network.

    Bridge node 1:

    • da-bridge-mocha-4.celestia-mocha.com
    • bridge-mocha-4.da.celestia-mocha.com

    Bridge node 2:

    • da-bridge-mocha-4-2.celestia-mocha.com
    • bridge-mocha-4-2.da.celestia-mocha.com

    Full node 1:

    • da-full-1-mocha-4.celestia-mocha.com
    • full-1-mocha-4.da.celestia-mocha.com

    Full node 2:

    • da-full-2-mocha-4.celestia-mocha.com
    • full-2-mocha-4.da.celestia-mocha.com

    Mocha testnet faucet

    WARNING

    USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

    You can request from Mocha testnet Faucet on the #mocha-faucet channel on Celestia's Discord server with the following command:

    text
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

    NOTE

    Faucet has a limit of 10 tokens per week per address/Discord ID.

    Analytics

    The following websites provide analytics for Mocha Testnet:

    Explorers

    There are several explorers you can use for Mocha:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mocha testnet:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',46),F=JSON.parse('{"title":"Mocha testnet","description":"Learn how to connect to the Mocha network.","frontmatter":{"description":"Learn how to connect to the Mocha network.","head":[["meta",{"name":"og:title","content":"Mocha testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mocha-testnet.md","filePath":"nodes/mocha-testnet.md","lastUpdated":1725971357000}'),D={name:"nodes/mocha-testnet.md"},B=Object.assign(D,{setup(l){return(n,c)=>(s(),i("div",null,[R,a(T),x,a(d),A]))}});export{F as __pageData,B as default}; +import{M as d}from"./chunks/MochaVersionTags.743560ae.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as p,o as s,c as i,k as e,t as o,H as a,Q as r,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mocha_versions.7704b055.js";const m="/docs-preview/pr-1699/img/mocha.jpg",f={name:"MochaTestnetDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),b=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"B93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D")])],-1),y=e("td",null,"Genesis file",-1),_=["href"],w=e("td",null,"Peers file",-1),v=["href"],C=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function P(l,n,c,S,t,E){return s(),i("table",null,[g,e("tr",null,[b,e("td",null,[e("code",null,o(t.constants.mochaChainId),1)])]),k,e("tr",null,[y,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/genesis.json ",9,_)])]),e("tr",null,[w,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/peers.txt ",9,v)])]),C])}const T=p(f,[["render",P]]),R=r('

    Mocha testnet

    mocha-testnet

    This guide contains the relevant sections for how to connect to Mocha, depending on the type of node you are running. Mocha testnet is designed to help validators test out their infrastructure and node software. Developers are encouraged to deploy their sovereign rollups on Mocha, but we also recommend Arabica devnet for that as it is designed for development purposes.

    Mocha is a milestone in Celestia, allowing everyone to test out core functionalities on the network. Read the announcement. Your best approach to participating is to first determine which node you would like to run. Each node's guide will link to the relevant networks, to show you how to connect to them.

    You have a list of options on the types of nodes you can run to participate in Mocha:

    Consensus:

    Data Availability:

    Select the type of node you would like to run and follow the instructions on each respective page. Whenever you are asked to select the type of network you want to connect to in those guides, select Mocha to refer to the correct instructions on this page on how to connect to Mocha.

    Network details

    ',11),x=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),A=r('

    RPC for DA bridge, full, and light nodes

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    Bridge nodes

    Mentioned below RPC endpoints do not guarantee you the download of full blocks from them. We advise that if you are running a bridge node, that you also run a local consensus node in order to download full blocks from it.

    • public-celestia-mocha4-consensus.numia.xyz
    • mocha-4-consensus.mesa.newmetric.xyz
    • full.consensus.mocha-4.celestia-mocha.com
    • consensus-full-mocha-4.celestia-mocha.com
    • rpc-mocha.pops.one
    • celestia-testnet-consensus.itrocket.net
      • RPC port: 26657
      • gRPC port: 9090
    • rpc-celestia-testnet.cryptech.com.ua
      • gRPC: grpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443
      • gRPC: grpc.celestia.testnet.dteam.tech:27090
    • celestia-consensus-testnet.noders.services
      • RPC port: 26357
      • gRPC port: 9070

    Community RPC endpoints

    The RPC endpoint is to allow users to interact with Celestia's nodes by querying the node's state and broadcasting transactions on the Celestia network. The default port is 26657.

    • public-celestia-mocha4-consensus.numia.xyz:26657
    • mocha-4-consensus.mesa.newmetric.xyz:26657
    • rpc.celestia-mocha.com
    • celestia-testnet-rpc.f5nodes.com
    • celestia-testnet.brightlystake.com
    • rpc-celestia-mocha.architectnodes.com
    • rpc-celestia-mocha.trusted-point.com
    • rpc-celestia-testnet-01.stakeflow.io
    • mocha.celestia.rpc.cumulo.me
    • rpc-mocha-4.spidey.services
    • rpc-mocha-full.avril14th.org
    • rpc.mocha.bitszn.com
    • celestia-t-rpc.noders.services/
    • rpc-1.testnet.celestia.nodes.guru
    • rpc-2.testnet.celestia.nodes.guru
    • celestia-testnet-rpc.itrocket.net:443
    • rpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443

    Community API endpoints

    The API endpoint is to allow users to interact with the REST API in Cosmos SDK which is implemented using gRPC-gateway, which exposes gRPC endpoints as REST endpoints. This allows for communication with the node using REST calls, which can be useful if the client does not support gRPC or HTTP2. The default port is 1317.

    Community gRPC endpoints

    The gRPC endpoint is to allow users to interact with a Celestia Node using gRPC, a modern open-source and high-performance RPC framework. The default port is 9090. In the Cosmos SDK, gRPC is used to define state queries and broadcast transactions.

    • public-celestia-mocha4-consensus.numia.xyz:9090
    • mocha-4-consensus.mesa.newmetric.xyz:9090
    • grpc-mocha.pops.one
    • grpc.celestia-mocha.com:443
    • full.consensus.mocha-4.celestia-mocha.com:9090
    • consensus-full-mocha-4.celestia-mocha.com:9090
    • celestia-testnet-grpc.f5nodes.com
    • celestia-testnet.brightlystake.com:9390
    • grpc-celestia-mocha.architectnodes.com:1443
    • grpc-celestia-mocha.trusted-point.com:9099
    • grpc-celestia-testnet-01.stakeflow.io:16002
    • mocha.grpc.cumulo.me:443
    • grpc-mocha-4.spidey.services
    • grpc-mocha-full.avril14th.org
    • grpc.mocha.bitszn.com
    • celestia-grpc.noders.services:21090
    • grpc-1.testnet.celestia.nodes.guru:10790
    • grpc-2.testnet.celestia.nodes.guru:10790
    • celestia-testnet-grpc.itrocket.net:443
    • grpc-celestia-testnet.cryptech.com.ua:443
    • grpc.celestia.testnet.dteam.tech:27090

    Community bridge and full node endpoints

    The endpoints below are for bridge and full nodes only. They can be used to find bootstrapper peers in the p2p network.

    Bridge node 1:

    • da-bridge-mocha-4.celestia-mocha.com
    • bridge-mocha-4.da.celestia-mocha.com

    Bridge node 2:

    • da-bridge-mocha-4-2.celestia-mocha.com
    • bridge-mocha-4-2.da.celestia-mocha.com

    Full node 1:

    • da-full-1-mocha-4.celestia-mocha.com
    • full-1-mocha-4.da.celestia-mocha.com

    Full node 2:

    • da-full-2-mocha-4.celestia-mocha.com
    • full-2-mocha-4.da.celestia-mocha.com

    Mocha testnet faucet

    WARNING

    USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

    You can request from Mocha testnet Faucet on the #mocha-faucet channel on Celestia's Discord server with the following command:

    text
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

    NOTE

    Faucet has a limit of 10 tokens per week per address/Discord ID.

    Analytics

    The following websites provide analytics for Mocha Testnet:

    Explorers

    There are several explorers you can use for Mocha:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mocha testnet:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',46),F=JSON.parse('{"title":"Mocha testnet","description":"Learn how to connect to the Mocha network.","frontmatter":{"description":"Learn how to connect to the Mocha network.","head":[["meta",{"name":"og:title","content":"Mocha testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mocha-testnet.md","filePath":"nodes/mocha-testnet.md","lastUpdated":1725992025000}'),D={name:"nodes/mocha-testnet.md"},B=Object.assign(D,{setup(l){return(n,c)=>(s(),i("div",null,[R,a(T),x,a(d),A]))}});export{F as __pageData,B as default}; diff --git a/pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.lean.js b/pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.lean.js similarity index 97% rename from pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.lean.js rename to pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.lean.js index 76f7a82236..391b421d6a 100644 --- a/pr-1699/assets/nodes_mocha-testnet.md.58edd1a9.lean.js +++ b/pr-1699/assets/nodes_mocha-testnet.md.0e4cf674.lean.js @@ -1 +1 @@ -import{M as d}from"./chunks/MochaVersionTags.743560ae.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as p,o as s,c as i,k as e,t as o,H as a,Q as r,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mocha_versions.7704b055.js";const m="/docs-preview/pr-1699/img/mocha.jpg",f={name:"MochaTestnetDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),b=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"B93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D")])],-1),y=e("td",null,"Genesis file",-1),_=["href"],w=e("td",null,"Peers file",-1),v=["href"],C=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function P(l,n,c,S,t,E){return s(),i("table",null,[g,e("tr",null,[b,e("td",null,[e("code",null,o(t.constants.mochaChainId),1)])]),k,e("tr",null,[y,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/genesis.json ",9,_)])]),e("tr",null,[w,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/peers.txt ",9,v)])]),C])}const T=p(f,[["render",P]]),R=r("",11),x=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),A=r("",46),F=JSON.parse('{"title":"Mocha testnet","description":"Learn how to connect to the Mocha network.","frontmatter":{"description":"Learn how to connect to the Mocha network.","head":[["meta",{"name":"og:title","content":"Mocha testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mocha-testnet.md","filePath":"nodes/mocha-testnet.md","lastUpdated":1725971357000}'),D={name:"nodes/mocha-testnet.md"},B=Object.assign(D,{setup(l){return(n,c)=>(s(),i("div",null,[R,a(T),x,a(d),A]))}});export{F as __pageData,B as default}; +import{M as d}from"./chunks/MochaVersionTags.743560ae.js";import{c as h}from"./chunks/constants.295fc0ab.js";import{_ as p,o as s,c as i,k as e,t as o,H as a,Q as r,a as u}from"./chunks/framework.b47e54aa.js";import"./chunks/mocha_versions.7704b055.js";const m="/docs-preview/pr-1699/img/mocha.jpg",f={name:"MochaTestnetDetails",data(){return{constants:h}}},g=e("tr",null,[e("th",null,"Detail"),e("th",null,"Value")],-1),b=e("td",null,"Chain ID",-1),k=e("tr",null,[e("td",null,"Genesis hash"),e("td",null,[e("code",null,"B93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D")])],-1),y=e("td",null,"Genesis file",-1),_=["href"],w=e("td",null,"Peers file",-1),v=["href"],C=e("tr",null,[e("td",null,"Validators"),e("td",null," 100 ")],-1);function P(l,n,c,S,t,E){return s(),i("table",null,[g,e("tr",null,[b,e("td",null,[e("code",null,o(t.constants.mochaChainId),1)])]),k,e("tr",null,[y,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/genesis.json`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/genesis.json ",9,_)])]),e("tr",null,[w,e("td",null,[e("a",{href:`https://github.com/celestiaorg/networks/blob/master/${t.constants.mochaChainId}/peers.txt`,target:"_blank",rel:"noopener noreferrer"}," https://github.com/celestiaorg/networks/blob/master/"+o(t.constants.mochaChainId)+"/peers.txt ",9,v)])]),C])}const T=p(f,[["render",P]]),R=r("",11),x=e("h2",{id:"software-version-numbers",tabindex:"-1"},[u("Software version numbers "),e("a",{class:"header-anchor",href:"#software-version-numbers","aria-label":'Permalink to "Software version numbers"'},"​")],-1),A=r("",46),F=JSON.parse('{"title":"Mocha testnet","description":"Learn how to connect to the Mocha network.","frontmatter":{"description":"Learn how to connect to the Mocha network.","head":[["meta",{"name":"og:title","content":"Mocha testnet | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/mocha-testnet.md","filePath":"nodes/mocha-testnet.md","lastUpdated":1725992025000}'),D={name:"nodes/mocha-testnet.md"},B=Object.assign(D,{setup(l){return(n,c)=>(s(),i("div",null,[R,a(T),x,a(d),A]))}});export{F as __pageData,B as default}; diff --git a/pr-1699/assets/nodes_overview.md.8cf8c5aa.js b/pr-1699/assets/nodes_overview.md.4223caea.js similarity index 98% rename from pr-1699/assets/nodes_overview.md.8cf8c5aa.js rename to pr-1699/assets/nodes_overview.md.4223caea.js index ca07b153f1..3ee8c6d5ab 100644 --- a/pr-1699/assets/nodes_overview.md.8cf8c5aa.js +++ b/pr-1699/assets/nodes_overview.md.4223caea.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const v=JSON.parse('{"title":"Overview to running nodes on Celestia","description":"An overview on how to participate in the Celestia network.","frontmatter":{"description":"An overview on how to participate in the Celestia network.","head":[["meta",{"name":"og:title","content":"Overview to running nodes on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/overview.md","filePath":"nodes/overview.md","lastUpdated":1725971357000}'),n={name:"nodes/overview.md"},d=o('

    Overview to running nodes on Celestia

    There are many ways you can participate in the Celestia networks.

    Celestia node operators can run several options on the network.

    Consensus:

    • Validator node: This type of node participates in consensus by producing and voting on blocks.
    • Consensus node: A celestia-app full node to sync blockchain history.

    Data Availability:

    • Bridge node: This node bridges blocks between the Data-Availability network and the Consensus network.
    • Full storage node: This node stores all the data but does not connect to Consensus.
    • Light node: Light clients conduct data availability sampling on the Data Availability network.

    You can learn more about how to set up each different node by going through each tutorial guide.

    Data availability nodes

    Node typeMemoryCPUDiskBandwidth
    Light node500 MB RAMSingle core100 GB SSD56 Kbps
    Bridge node16 GB RAM6 cores10 TB SSD1 Gbps
    Full storage node16 GB RAMQuad-core10 TB SSD1 Gbps

    Consensus nodes

    Node typeMemoryCPUDiskBandwidth
    Validator16 GB RAM8 cores2 TB SSD1 Gbps
    Consensus node16 GB RAMQuad-core2 TB SSD1 Gbps

    Please provide any feedback on the tutorials and guides. If you notice a bug or issue, feel free to make a pull request or write up a Github issue!

    ',14),i=[d];function s(r,l,h,c,u,p){return t(),a("div",null,i)}const m=e(n,[["render",s]]);export{v as __pageData,m as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const v=JSON.parse('{"title":"Overview to running nodes on Celestia","description":"An overview on how to participate in the Celestia network.","frontmatter":{"description":"An overview on how to participate in the Celestia network.","head":[["meta",{"name":"og:title","content":"Overview to running nodes on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/overview.md","filePath":"nodes/overview.md","lastUpdated":1725992025000}'),n={name:"nodes/overview.md"},d=o('

    Overview to running nodes on Celestia

    There are many ways you can participate in the Celestia networks.

    Celestia node operators can run several options on the network.

    Consensus:

    • Validator node: This type of node participates in consensus by producing and voting on blocks.
    • Consensus node: A celestia-app full node to sync blockchain history.

    Data Availability:

    • Bridge node: This node bridges blocks between the Data-Availability network and the Consensus network.
    • Full storage node: This node stores all the data but does not connect to Consensus.
    • Light node: Light clients conduct data availability sampling on the Data Availability network.

    You can learn more about how to set up each different node by going through each tutorial guide.

    Data availability nodes

    Node typeMemoryCPUDiskBandwidth
    Light node500 MB RAMSingle core100 GB SSD56 Kbps
    Bridge node16 GB RAM6 cores10 TB SSD1 Gbps
    Full storage node16 GB RAMQuad-core10 TB SSD1 Gbps

    Consensus nodes

    Node typeMemoryCPUDiskBandwidth
    Validator16 GB RAM8 cores2 TB SSD1 Gbps
    Consensus node16 GB RAMQuad-core2 TB SSD1 Gbps

    Please provide any feedback on the tutorials and guides. If you notice a bug or issue, feel free to make a pull request or write up a Github issue!

    ',14),i=[d];function s(r,l,h,c,u,p){return t(),a("div",null,i)}const m=e(n,[["render",s]]);export{v as __pageData,m as default}; diff --git a/pr-1699/assets/nodes_overview.md.8cf8c5aa.lean.js b/pr-1699/assets/nodes_overview.md.4223caea.lean.js similarity index 91% rename from pr-1699/assets/nodes_overview.md.8cf8c5aa.lean.js rename to pr-1699/assets/nodes_overview.md.4223caea.lean.js index 7f9146a69f..3cf66ac754 100644 --- a/pr-1699/assets/nodes_overview.md.8cf8c5aa.lean.js +++ b/pr-1699/assets/nodes_overview.md.4223caea.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const v=JSON.parse('{"title":"Overview to running nodes on Celestia","description":"An overview on how to participate in the Celestia network.","frontmatter":{"description":"An overview on how to participate in the Celestia network.","head":[["meta",{"name":"og:title","content":"Overview to running nodes on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/overview.md","filePath":"nodes/overview.md","lastUpdated":1725971357000}'),n={name:"nodes/overview.md"},d=o("",14),i=[d];function s(r,l,h,c,u,p){return t(),a("div",null,i)}const m=e(n,[["render",s]]);export{v as __pageData,m as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const v=JSON.parse('{"title":"Overview to running nodes on Celestia","description":"An overview on how to participate in the Celestia network.","frontmatter":{"description":"An overview on how to participate in the Celestia network.","head":[["meta",{"name":"og:title","content":"Overview to running nodes on Celestia | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/overview.md","filePath":"nodes/overview.md","lastUpdated":1725992025000}'),n={name:"nodes/overview.md"},d=o("",14),i=[d];function s(r,l,h,c,u,p){return t(),a("div",null,i)}const m=e(n,[["render",s]]);export{v as __pageData,m as default}; diff --git a/pr-1699/assets/nodes_participate.md.cd0dcc78.js b/pr-1699/assets/nodes_participate.md.704b27c3.js similarity index 98% rename from pr-1699/assets/nodes_participate.md.cd0dcc78.js rename to pr-1699/assets/nodes_participate.md.704b27c3.js index 9e5fdb0e59..e62927415e 100644 --- a/pr-1699/assets/nodes_participate.md.cd0dcc78.js +++ b/pr-1699/assets/nodes_participate.md.704b27c3.js @@ -1 +1 @@ -import{A as t}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{M as o}from"./chunks/MochaVersionTags.743560ae.js";import{M as r}from"./chunks/MainnetVersionTags.eb9befca.js";import{o as n,c as i,H as a,Q as e}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";import"./chunks/constants.295fc0ab.js";import"./chunks/mocha_versions.7704b055.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const s=e('

    Participate in the Celestia networks

    Mainnet Beta

    Celestia’s Mainnet Beta is the production network for deploying mainnet rollups and applications. This marks the culmination of years of development and community testing. While the network is stable and continues to receive updates, it remains experimental and users may experience occasional instability or reduced performance.

    Compatible software versions for Mainnet Beta

    ',4),c=e('

    Testnets

    Celestia currently has two existing testnets that you can participate in:

    Arabica Devnet

    Arabica devnet is a devnet focused on developers who want to deploy sovereign rollups on the latest changes from Celestia's codebase. Arabica will be updated frequently and might be unstable at times given new updates. Validators won't be able to validate on Arabica as it is not designed for validators to participate.

    Compatible software versions for Arabica devnet

    ',5),l=e('

    Mocha testnet

    Mocha testnet is a testnet focused on enabling validators to test out their infrastructure by running nodes connected to the network. Developers can also deploy sovereign rollups on Mocha, it just will always be behind Arabica as Mocha upgrades are slower given they need to be done via hardforks in coordination with the validator community on Mocha.

    Compatible software versions for Mocha testnet

    ',3),h=e('

    Network upgrades

    There are a few ways to stay informed about network upgrades:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',4),A=JSON.parse('{"title":"Participate in the Celestia networks","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Participate in the Celestia networks | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/participate.md","filePath":"nodes/participate.md","lastUpdated":1725971357000}'),d={name:"nodes/participate.md"},P=Object.assign(d,{setup(p){return(m,f)=>(n(),i("div",null,[s,a(r),c,a(t),l,a(o),h]))}});export{A as __pageData,P as default}; +import{A as t}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{M as o}from"./chunks/MochaVersionTags.743560ae.js";import{M as r}from"./chunks/MainnetVersionTags.eb9befca.js";import{o as n,c as i,H as a,Q as e}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";import"./chunks/constants.295fc0ab.js";import"./chunks/mocha_versions.7704b055.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const s=e('

    Participate in the Celestia networks

    Mainnet Beta

    Celestia’s Mainnet Beta is the production network for deploying mainnet rollups and applications. This marks the culmination of years of development and community testing. While the network is stable and continues to receive updates, it remains experimental and users may experience occasional instability or reduced performance.

    Compatible software versions for Mainnet Beta

    ',4),c=e('

    Testnets

    Celestia currently has two existing testnets that you can participate in:

    Arabica Devnet

    Arabica devnet is a devnet focused on developers who want to deploy sovereign rollups on the latest changes from Celestia's codebase. Arabica will be updated frequently and might be unstable at times given new updates. Validators won't be able to validate on Arabica as it is not designed for validators to participate.

    Compatible software versions for Arabica devnet

    ',5),l=e('

    Mocha testnet

    Mocha testnet is a testnet focused on enabling validators to test out their infrastructure by running nodes connected to the network. Developers can also deploy sovereign rollups on Mocha, it just will always be behind Arabica as Mocha upgrades are slower given they need to be done via hardforks in coordination with the validator community on Mocha.

    Compatible software versions for Mocha testnet

    ',3),h=e('

    Network upgrades

    There are a few ways to stay informed about network upgrades:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    ',4),A=JSON.parse('{"title":"Participate in the Celestia networks","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Participate in the Celestia networks | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/participate.md","filePath":"nodes/participate.md","lastUpdated":1725992025000}'),d={name:"nodes/participate.md"},P=Object.assign(d,{setup(p){return(m,f)=>(n(),i("div",null,[s,a(r),c,a(t),l,a(o),h]))}});export{A as __pageData,P as default}; diff --git a/pr-1699/assets/nodes_participate.md.cd0dcc78.lean.js b/pr-1699/assets/nodes_participate.md.704b27c3.lean.js similarity index 93% rename from pr-1699/assets/nodes_participate.md.cd0dcc78.lean.js rename to pr-1699/assets/nodes_participate.md.704b27c3.lean.js index 64f3164bee..83f60de6d7 100644 --- a/pr-1699/assets/nodes_participate.md.cd0dcc78.lean.js +++ b/pr-1699/assets/nodes_participate.md.704b27c3.lean.js @@ -1 +1 @@ -import{A as t}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{M as o}from"./chunks/MochaVersionTags.743560ae.js";import{M as r}from"./chunks/MainnetVersionTags.eb9befca.js";import{o as n,c as i,H as a,Q as e}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";import"./chunks/constants.295fc0ab.js";import"./chunks/mocha_versions.7704b055.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const s=e("",4),c=e("",5),l=e("",3),h=e("",4),A=JSON.parse('{"title":"Participate in the Celestia networks","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Participate in the Celestia networks | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/participate.md","filePath":"nodes/participate.md","lastUpdated":1725971357000}'),d={name:"nodes/participate.md"},P=Object.assign(d,{setup(p){return(m,f)=>(n(),i("div",null,[s,a(r),c,a(t),l,a(o),h]))}});export{A as __pageData,P as default}; +import{A as t}from"./chunks/ArabicaVersionTags.5d1acc99.js";import{M as o}from"./chunks/MochaVersionTags.743560ae.js";import{M as r}from"./chunks/MainnetVersionTags.eb9befca.js";import{o as n,c as i,H as a,Q as e}from"./chunks/framework.b47e54aa.js";import"./chunks/arabica_versions.1930378b.js";import"./chunks/constants.295fc0ab.js";import"./chunks/mocha_versions.7704b055.js";import"./chunks/mainnet_versions.1d5e6ed9.js";const s=e("",4),c=e("",5),l=e("",3),h=e("",4),A=JSON.parse('{"title":"Participate in the Celestia networks","description":"","frontmatter":{"head":[["meta",{"name":"og:title","content":"Participate in the Celestia networks | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/participate.md","filePath":"nodes/participate.md","lastUpdated":1725992025000}'),d={name:"nodes/participate.md"},P=Object.assign(d,{setup(p){return(m,f)=>(n(),i("div",null,[s,a(r),c,a(t),l,a(o),h]))}});export{A as __pageData,P as default}; diff --git a/pr-1699/assets/nodes_quick-start.md.7f0ce7b8.js b/pr-1699/assets/nodes_quick-start.md.9a9eabfc.js similarity index 97% rename from pr-1699/assets/nodes_quick-start.md.7f0ce7b8.js rename to pr-1699/assets/nodes_quick-start.md.9a9eabfc.js index 5fd7e0728d..a4aa8b5db6 100644 --- a/pr-1699/assets/nodes_quick-start.md.7f0ce7b8.js +++ b/pr-1699/assets/nodes_quick-start.md.9a9eabfc.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Quick start guide","description":"Learn how to get started and run your first node on Celestia.","frontmatter":{"description":"Learn how to get started and run your first node on Celestia.","head":[["meta",{"name":"og:title","content":"Quick start guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/quick-start.md","filePath":"nodes/quick-start.md","lastUpdated":1725971357000}'),i={name:"nodes/quick-start.md"},n=o('

    Quick start guide

    In this section, we show you how to get started with installing the needed libraries and packages in Celestia to help you run a node on Celestia.

    Celestia Node

    Install celestia-node allows you to get started with running a light node and do data availability sampling.

    Light nodes are the best nodes to test out initially if you are new to participating in Celestia.

    celestia-node client also allows you to run other types of data availability (DA) nodes like bridge and full DA storage nodes, which will be covered in later sections.

    Celestia App

    Install celestia-app allows you to get started running a consensus node.

    celestia-app is the software that allows you to run validator nodes and also provide RPC endpoints.

    celestia-app covers the consensus layer, while celestia-node covers the DA layer.

    Getting started

    As covered in the previous section, Celestia offers two different test networks, Arabica devnet and Mocha testnet.

    If you are planning to run a light node, it is recommended to use Arabica, which you will find options to connecting to in the later sections.

    If you plan on running a validator, your only option is to run your node on Mocha.

    In this quick start guide, we will go over installing both of the software clients: celestia-node and celestia-app.

    NOTE

    If you just want to run a light node, you don't need to install celestia-app and can skip that part.

    Proceed to the next section in order to get started.

    ',17),s=[n];function r(l,d,c,p,u,h){return t(),a("div",null,s)}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Quick start guide","description":"Learn how to get started and run your first node on Celestia.","frontmatter":{"description":"Learn how to get started and run your first node on Celestia.","head":[["meta",{"name":"og:title","content":"Quick start guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/quick-start.md","filePath":"nodes/quick-start.md","lastUpdated":1725992025000}'),i={name:"nodes/quick-start.md"},n=o('

    Quick start guide

    In this section, we show you how to get started with installing the needed libraries and packages in Celestia to help you run a node on Celestia.

    Celestia Node

    Install celestia-node allows you to get started with running a light node and do data availability sampling.

    Light nodes are the best nodes to test out initially if you are new to participating in Celestia.

    celestia-node client also allows you to run other types of data availability (DA) nodes like bridge and full DA storage nodes, which will be covered in later sections.

    Celestia App

    Install celestia-app allows you to get started running a consensus node.

    celestia-app is the software that allows you to run validator nodes and also provide RPC endpoints.

    celestia-app covers the consensus layer, while celestia-node covers the DA layer.

    Getting started

    As covered in the previous section, Celestia offers two different test networks, Arabica devnet and Mocha testnet.

    If you are planning to run a light node, it is recommended to use Arabica, which you will find options to connecting to in the later sections.

    If you plan on running a validator, your only option is to run your node on Mocha.

    In this quick start guide, we will go over installing both of the software clients: celestia-node and celestia-app.

    NOTE

    If you just want to run a light node, you don't need to install celestia-app and can skip that part.

    Proceed to the next section in order to get started.

    ',17),s=[n];function r(l,d,c,p,u,h){return t(),a("div",null,s)}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; diff --git a/pr-1699/assets/nodes_quick-start.md.7f0ce7b8.lean.js b/pr-1699/assets/nodes_quick-start.md.9a9eabfc.lean.js similarity index 90% rename from pr-1699/assets/nodes_quick-start.md.7f0ce7b8.lean.js rename to pr-1699/assets/nodes_quick-start.md.9a9eabfc.lean.js index c1c2e5bf30..7988023e2c 100644 --- a/pr-1699/assets/nodes_quick-start.md.7f0ce7b8.lean.js +++ b/pr-1699/assets/nodes_quick-start.md.9a9eabfc.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Quick start guide","description":"Learn how to get started and run your first node on Celestia.","frontmatter":{"description":"Learn how to get started and run your first node on Celestia.","head":[["meta",{"name":"og:title","content":"Quick start guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/quick-start.md","filePath":"nodes/quick-start.md","lastUpdated":1725971357000}'),i={name:"nodes/quick-start.md"},n=o("",17),s=[n];function r(l,d,c,p,u,h){return t(),a("div",null,s)}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.b47e54aa.js";const f=JSON.parse('{"title":"Quick start guide","description":"Learn how to get started and run your first node on Celestia.","frontmatter":{"description":"Learn how to get started and run your first node on Celestia.","head":[["meta",{"name":"og:title","content":"Quick start guide | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/quick-start.md","filePath":"nodes/quick-start.md","lastUpdated":1725992025000}'),i={name:"nodes/quick-start.md"},n=o("",17),s=[n];function r(l,d,c,p,u,h){return t(),a("div",null,s)}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; diff --git a/pr-1699/assets/nodes_systemd.md.794b3b4f.js b/pr-1699/assets/nodes_systemd.md.66ed5d05.js similarity index 99% rename from pr-1699/assets/nodes_systemd.md.794b3b4f.js rename to pr-1699/assets/nodes_systemd.md.66ed5d05.js index c14ec19b5e..283a2d9156 100644 --- a/pr-1699/assets/nodes_systemd.md.794b3b4f.js +++ b/pr-1699/assets/nodes_systemd.md.66ed5d05.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Setting up your node as a background process with SystemD","description":"Learn how to setup your node as a background process with SystemD.","frontmatter":{"description":"Learn how to setup your node as a background process with SystemD.","head":[["meta",{"name":"og:title","content":"Setting up your node as a background process with SystemD | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/systemd.md","filePath":"nodes/systemd.md","lastUpdated":1725971357000}'),e={name:"nodes/systemd.md"},p=l(`

    Setting up your node as a background process with SystemD

    SystemD is a daemon service useful for running applications as background processes.

    Consensus nodes

    If you are running a validator or consensus node, here are the steps to setting up celestia-appd as a background process.

    Start the celestia-app with SystemD

    SystemD is a daemon service useful for running applications as background processes.

    Create Celestia-App systemd file:

    sh
    sudo tee <<EOF >/dev/null /etc/systemd/system/celestia-appd.service
    +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Setting up your node as a background process with SystemD","description":"Learn how to setup your node as a background process with SystemD.","frontmatter":{"description":"Learn how to setup your node as a background process with SystemD.","head":[["meta",{"name":"og:title","content":"Setting up your node as a background process with SystemD | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/systemd.md","filePath":"nodes/systemd.md","lastUpdated":1725992025000}'),e={name:"nodes/systemd.md"},p=l(`

    Setting up your node as a background process with SystemD

    SystemD is a daemon service useful for running applications as background processes.

    Consensus nodes

    If you are running a validator or consensus node, here are the steps to setting up celestia-appd as a background process.

    Start the celestia-app with SystemD

    SystemD is a daemon service useful for running applications as background processes.

    Create Celestia-App systemd file:

    sh
    sudo tee <<EOF >/dev/null /etc/systemd/system/celestia-appd.service
     [Unit]
     Description=celestia-appd Cosmos daemon
     After=network-online.target
    diff --git a/pr-1699/assets/nodes_systemd.md.794b3b4f.lean.js b/pr-1699/assets/nodes_systemd.md.66ed5d05.lean.js
    similarity index 91%
    rename from pr-1699/assets/nodes_systemd.md.794b3b4f.lean.js
    rename to pr-1699/assets/nodes_systemd.md.66ed5d05.lean.js
    index 8dc46ef6f0..e6d4d18226 100644
    --- a/pr-1699/assets/nodes_systemd.md.794b3b4f.lean.js
    +++ b/pr-1699/assets/nodes_systemd.md.66ed5d05.lean.js
    @@ -1 +1 @@
    -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Setting up your node as a background process with SystemD","description":"Learn how to setup your node as a background process with SystemD.","frontmatter":{"description":"Learn how to setup your node as a background process with SystemD.","head":[["meta",{"name":"og:title","content":"Setting up your node as a background process with SystemD | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/systemd.md","filePath":"nodes/systemd.md","lastUpdated":1725971357000}'),e={name:"nodes/systemd.md"},p=l("",52),o=[p];function t(c,r,i,y,d,E){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default};
    +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.b47e54aa.js";const h=JSON.parse('{"title":"Setting up your node as a background process with SystemD","description":"Learn how to setup your node as a background process with SystemD.","frontmatter":{"description":"Learn how to setup your node as a background process with SystemD.","head":[["meta",{"name":"og:title","content":"Setting up your node as a background process with SystemD | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/systemd.md","filePath":"nodes/systemd.md","lastUpdated":1725992025000}'),e={name:"nodes/systemd.md"},p=l("",52),o=[p];function t(c,r,i,y,d,E){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default};
    diff --git a/pr-1699/assets/nodes_validator-node.md.2b9abf8d.js b/pr-1699/assets/nodes_validator-node.md.084b1069.js
    similarity index 97%
    rename from pr-1699/assets/nodes_validator-node.md.2b9abf8d.js
    rename to pr-1699/assets/nodes_validator-node.md.084b1069.js
    index 504f453235..aa0d06a478 100644
    --- a/pr-1699/assets/nodes_validator-node.md.2b9abf8d.js
    +++ b/pr-1699/assets/nodes_validator-node.md.084b1069.js
    @@ -22,7 +22,7 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a
     raw_log: '[]'
     timestamp: ""
     tx: null
    -txhash: <tx-hash>

    You can check if the TX hash went through using the block explorer by inputting the txhash ID that was returned.

    Optional: Deploy the celestia-node

    Running a bridge node is critical to the Celestia network as it enables the data availability and consensus nodes to communicate with one another. It is recommended to support the data availability network, but is not required for celestia-app.

    If you are not running a bridge node, you can skip to run a validator node.

    This section describes part 2 of Celestia validator node setup: running a Celestia bridge node daemon.

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Initialize the bridge node

    Run the following:

    bash
    celestia bridge init --core.ip <URI>
    celestia bridge init --core.ip <URI>

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    If you need a list of RPC endpoints to connect to, you can find the list on the Mocha testnet page or list on the Arabica devnet page.

    Run the bridge node

    Run the following:

    bash
    celestia bridge start
    celestia bridge start

    Optional: start the bridge node with SystemD

    Follow the tutorial on setting up the bridge node as a background process with SystemD.

    You have successfully set up a bridge node that is syncing with the network.

    Run the validator node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    After completing all the necessary steps, you are now ready to run a validator! In order to create your validator onchain, follow the instructions below. Keep in mind that these steps are necessary ONLY if you want to participate in the consensus.

    Pick a moniker name of your choice! This is the validator name that will show up on public dashboards and explorers. VALIDATOR_WALLET must be the same you defined previously. Parameter --min-self-delegation=1000000 defines the amount of tokens that are self delegated from your validator wallet.

    Now, connect to the network of your choice.

    You have the following option of connecting to list of networks shown below:

    Continuing the validator tutorial, here are the steps to connect your validator to Mocha:

    `,30),I={class:"language-bash vp-adaptive-theme"},P=s("button",{title:"Copy Code",class:"copy"},null,-1),V=s("span",{class:"lang"},"bash",-1),R={class:"shiki github-dark vp-code-dark"},D=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"MONIKER"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"your_moniker"')],-1),N=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"validator"')],-1),L=s("span",{class:"line"},null,-1),O=n('celestia-appd tx staking create-validator \\',1),z=n(' --amount=1000000utia \\',1),W=n(' --pubkey=$(celestia-appd tendermint show-validator) \\',1),M=n(' --moniker=$MONIKER \\',1),U={class:"line"},$=s("span",{style:{color:"#E1E4E8"}}," ",-1),H={style:{color:"#79B8FF"}},Y=s("span",{style:{color:"#E1E4E8"}}," ",-1),K=s("span",{style:{color:"#79B8FF"}},"\\",-1),G=n(' --commission-rate=0.1 \\',1),J=n(' --commission-max-rate=0.2 \\',1),Q=n(' --commission-max-change-rate=0.01 \\',1),X=n(' --min-self-delegation=1000000 \\',1),j=n(' --from=$VALIDATOR_WALLET \\',1),Z=n(' --keyring-backend=test \\',1),ss=n(' --fees=21000utia \\',1),as=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#79B8FF"}},"--gas=220000")],-1),ns={class:"shiki github-light vp-code-light"},es=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"MONIKER"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"your_moniker"')],-1),os=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"validator"')],-1),ts=s("span",{class:"line"},null,-1),ls=n('celestia-appd tx staking create-validator \\',1),ps=n(' --amount=1000000utia \\',1),cs=n(' --pubkey=$(celestia-appd tendermint show-validator) \\',1),rs=n(' --moniker=$MONIKER \\',1),is={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#005CC5"}},us=s("span",{style:{color:"#24292E"}}," ",-1),_s=s("span",{style:{color:"#005CC5"}},"\\",-1),ys=n(' --commission-rate=0.1 \\',1),gs=n(' --commission-max-rate=0.2 \\',1),Es=n(' --commission-max-change-rate=0.01 \\',1),Cs=n(' --min-self-delegation=1000000 \\',1),ms=n(' --from=$VALIDATOR_WALLET \\',1),Fs=n(' --keyring-backend=test \\',1),bs=n(' --fees=21000utia \\',1),vs=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#005CC5"}},"--gas=220000")],-1),Ts=n(`

    You will be prompted to confirm the transaction:

    console
    confirm transaction before signing and broadcasting [y/N]: y
    confirm transaction before signing and broadcasting [y/N]: y

    Inputting y should provide an output similar to:

    console
    code: 0
    +txhash: <tx-hash>

    You can check if the TX hash went through using the block explorer by inputting the txhash ID that was returned.

    Optional: Deploy the celestia-node

    Running a bridge node is critical to the Celestia network as it enables the data availability and consensus nodes to communicate with one another. It is recommended to support the data availability network, but is not required for celestia-app.

    If you are not running a bridge node, you can skip to run a validator node.

    This section describes part 2 of Celestia validator node setup: running a Celestia bridge node daemon.

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Initialize the bridge node

    Run the following:

    bash
    celestia bridge init --core.ip <URI>
    celestia bridge init --core.ip <URI>

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    If you need a list of RPC endpoints to connect to, you can find the list on the Mocha testnet page or list on the Arabica devnet page.

    Run the bridge node

    Run the following:

    bash
    celestia bridge start
    celestia bridge start

    Optional: start the bridge node with SystemD

    Follow the tutorial on setting up the bridge node as a background process with SystemD.

    You have successfully set up a bridge node that is syncing with the network.

    Run the validator node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    After completing all the necessary steps, you are now ready to run a validator! In order to create your validator onchain, follow the instructions below. Keep in mind that these steps are necessary ONLY if you want to participate in the consensus.

    Pick a moniker name of your choice! This is the validator name that will show up on public dashboards and explorers. VALIDATOR_WALLET must be the same you defined previously. Parameter --min-self-delegation=1000000 defines the amount of tokens that are self delegated from your validator wallet.

    Now, connect to the network of your choice.

    You have the following option of connecting to list of networks shown below:

    Continuing the validator tutorial, here are the steps to connect your validator to Mocha:

    `,30),I={class:"language-bash vp-adaptive-theme"},P=s("button",{title:"Copy Code",class:"copy"},null,-1),V=s("span",{class:"lang"},"bash",-1),R={class:"shiki github-dark vp-code-dark"},D=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"MONIKER"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"your_moniker"')],-1),N=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"validator"')],-1),L=s("span",{class:"line"},null,-1),O=n('celestia-appd tx staking create-validator \\',1),W=n(' --amount=1000000utia \\',1),M=n(' --pubkey=$(celestia-appd tendermint show-validator) \\',1),z=n(' --moniker=$MONIKER \\',1),U={class:"line"},Y=s("span",{style:{color:"#E1E4E8"}}," ",-1),$={style:{color:"#79B8FF"}},H=s("span",{style:{color:"#E1E4E8"}}," ",-1),K=s("span",{style:{color:"#79B8FF"}},"\\",-1),G=n(' --commission-rate=0.1 \\',1),J=n(' --commission-max-rate=0.2 \\',1),Q=n(' --commission-max-change-rate=0.01 \\',1),j=n(' --min-self-delegation=1000000 \\',1),X=n(' --from=$VALIDATOR_WALLET \\',1),Z=n(' --keyring-backend=test \\',1),ss=n(' --fees=21000utia \\',1),as=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#79B8FF"}},"--gas=220000")],-1),ns={class:"shiki github-light vp-code-light"},es=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"MONIKER"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"your_moniker"')],-1),os=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"validator"')],-1),ts=s("span",{class:"line"},null,-1),ls=n('celestia-appd tx staking create-validator \\',1),ps=n(' --amount=1000000utia \\',1),cs=n(' --pubkey=$(celestia-appd tendermint show-validator) \\',1),rs=n(' --moniker=$MONIKER \\',1),is={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#005CC5"}},us=s("span",{style:{color:"#24292E"}}," ",-1),_s=s("span",{style:{color:"#005CC5"}},"\\",-1),ys=n(' --commission-rate=0.1 \\',1),gs=n(' --commission-max-rate=0.2 \\',1),Es=n(' --commission-max-change-rate=0.01 \\',1),Cs=n(' --min-self-delegation=1000000 \\',1),ms=n(' --from=$VALIDATOR_WALLET \\',1),Fs=n(' --keyring-backend=test \\',1),bs=n(' --fees=21000utia \\',1),vs=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#005CC5"}},"--gas=220000")],-1),Ts=n(`

    You will be prompted to confirm the transaction:

    console
    confirm transaction before signing and broadcasting [y/N]: y
    confirm transaction before signing and broadcasting [y/N]: y

    Inputting y should provide an output similar to:

    console
    code: 0
     codespace: ""
     data: ""
     gas_used: "0"
    @@ -44,7 +44,7 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a
     raw_log: '[]'
     timestamp: ""
     tx: null
    -txhash: <tx-hash>

    You should now be able to see your validator from a block explorer

    Submit your validator information

    After starting your node, please submit your node as a seed and peer to the networks repository.

    Optional: Transaction indexer configuration options

    Follow the instructions under transaction indexer configuration options to configure your config.toml file to select which transactions to index.

    Additional resources

    For additional resources, refer to the extra resources for consensus nodessection of the consensus node page.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    `,16),qs=JSON.parse('{"title":"Setting up a Celestia validator node","description":"Learn how to set up a Celestia validator node.","frontmatter":{"description":"Learn how to set up a Celestia validator node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Setting up a Celestia validator node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/validator-node.md","filePath":"nodes/validator-node.md","lastUpdated":1725971357000}'),ks={name:"nodes/validator-node.md"},ws=Object.assign(ks,{setup(fs){return(As,Ss)=>(l(),p("div",null,[r,s("div",i,[d,h,s("pre",u,[s("code",null,[_,a(` +txhash: <tx-hash>

    You should now be able to see your validator from a block explorer

    Submit your validator information

    After starting your node, please submit your node as a seed and peer to the networks repository.

    Optional: Transaction indexer configuration options

    Follow the instructions under transaction indexer configuration options to configure your config.toml file to select which transactions to index.

    Additional resources

    For additional resources, refer to the extra resources for consensus nodessection of the consensus node page.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\\nruntime/debug.Stack()\\n\\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\\npanic({0x1b91180?, 0x400153b240?})\\n\\t/usr/local/go/src/runtime/panic.go:770 +0x124\\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\\n\\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    `,16),qs=JSON.parse('{"title":"Setting up a Celestia validator node","description":"Learn how to set up a Celestia validator node.","frontmatter":{"description":"Learn how to set up a Celestia validator node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Setting up a Celestia validator node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/validator-node.md","filePath":"nodes/validator-node.md","lastUpdated":1725992025000}'),ks={name:"nodes/validator-node.md"},ws=Object.assign(ks,{setup(fs){return(As,Ss)=>(l(),p("div",null,[r,s("div",i,[d,h,s("pre",u,[s("code",null,[_,a(` `),y,a(` `),s("span",g,[E,s("span",C,"--chain-id="+o(t(e).mochaChainId),1),m,F]),a(` `),b])]),s("pre",v,[s("code",null,[T,a(` @@ -54,15 +54,15 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a `),N,a(` `),L,a(` `),O,a(` -`),z,a(` `),W,a(` `),M,a(` -`),s("span",U,[$,s("span",H,"--chain-id="+o(t(e).mochaChainId),1),Y,K]),a(` +`),z,a(` +`),s("span",U,[Y,s("span",$,"--chain-id="+o(t(e).mochaChainId),1),H,K]),a(` `),G,a(` `),J,a(` `),Q,a(` -`),X,a(` `),j,a(` +`),X,a(` `),Z,a(` `),ss,a(` `),as])]),s("pre",ns,[s("code",null,[es,a(` diff --git a/pr-1699/assets/nodes_validator-node.md.2b9abf8d.lean.js b/pr-1699/assets/nodes_validator-node.md.084b1069.lean.js similarity index 90% rename from pr-1699/assets/nodes_validator-node.md.2b9abf8d.lean.js rename to pr-1699/assets/nodes_validator-node.md.084b1069.lean.js index 0603544a24..eeee1502ec 100644 --- a/pr-1699/assets/nodes_validator-node.md.2b9abf8d.lean.js +++ b/pr-1699/assets/nodes_validator-node.md.084b1069.lean.js @@ -1,4 +1,4 @@ -import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a,t as o,l as t,Q as n}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/validator.png",r=n("",19),i={class:"language-bash vp-adaptive-theme"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},_=n("",1),y=n("",1),g={class:"line"},E=s("span",{style:{color:"#E1E4E8"}},"--from=$VALIDATOR_WALLET ",-1),C={style:{color:"#79B8FF"}},m=s("span",{style:{color:"#E1E4E8"}}," ",-1),F=s("span",{style:{color:"#79B8FF"}},"\\",-1),b=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"--fees=21000utia")],-1),v={class:"shiki github-light vp-code-light"},T=n("",1),k=n("",1),f={class:"line"},A=s("span",{style:{color:"#24292E"}},"--from=$VALIDATOR_WALLET ",-1),S={style:{color:"#005CC5"}},B=s("span",{style:{color:"#24292E"}}," ",-1),x=s("span",{style:{color:"#005CC5"}},"\\",-1),q=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"--fees=21000utia")],-1),w=n("",30),I={class:"language-bash vp-adaptive-theme"},P=s("button",{title:"Copy Code",class:"copy"},null,-1),V=s("span",{class:"lang"},"bash",-1),R={class:"shiki github-dark vp-code-dark"},D=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"MONIKER"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"your_moniker"')],-1),N=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"validator"')],-1),L=s("span",{class:"line"},null,-1),O=n("",1),z=n("",1),W=n("",1),M=n("",1),U={class:"line"},$=s("span",{style:{color:"#E1E4E8"}}," ",-1),H={style:{color:"#79B8FF"}},Y=s("span",{style:{color:"#E1E4E8"}}," ",-1),K=s("span",{style:{color:"#79B8FF"}},"\\",-1),G=n("",1),J=n("",1),Q=n("",1),X=n("",1),j=n("",1),Z=n("",1),ss=n("",1),as=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#79B8FF"}},"--gas=220000")],-1),ns={class:"shiki github-light vp-code-light"},es=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"MONIKER"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"your_moniker"')],-1),os=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"validator"')],-1),ts=s("span",{class:"line"},null,-1),ls=n("",1),ps=n("",1),cs=n("",1),rs=n("",1),is={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#005CC5"}},us=s("span",{style:{color:"#24292E"}}," ",-1),_s=s("span",{style:{color:"#005CC5"}},"\\",-1),ys=n("",1),gs=n("",1),Es=n("",1),Cs=n("",1),ms=n("",1),Fs=n("",1),bs=n("",1),vs=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#005CC5"}},"--gas=220000")],-1),Ts=n("",16),qs=JSON.parse('{"title":"Setting up a Celestia validator node","description":"Learn how to set up a Celestia validator node.","frontmatter":{"description":"Learn how to set up a Celestia validator node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Setting up a Celestia validator node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/validator-node.md","filePath":"nodes/validator-node.md","lastUpdated":1725971357000}'),ks={name:"nodes/validator-node.md"},ws=Object.assign(ks,{setup(fs){return(As,Ss)=>(l(),p("div",null,[r,s("div",i,[d,h,s("pre",u,[s("code",null,[_,a(` +import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a,t as o,l as t,Q as n}from"./chunks/framework.b47e54aa.js";const c="/docs-preview/pr-1699/img/nodes/validator.png",r=n("",19),i={class:"language-bash vp-adaptive-theme"},d=s("button",{title:"Copy Code",class:"copy"},null,-1),h=s("span",{class:"lang"},"bash",-1),u={class:"shiki github-dark vp-code-dark"},_=n("",1),y=n("",1),g={class:"line"},E=s("span",{style:{color:"#E1E4E8"}},"--from=$VALIDATOR_WALLET ",-1),C={style:{color:"#79B8FF"}},m=s("span",{style:{color:"#E1E4E8"}}," ",-1),F=s("span",{style:{color:"#79B8FF"}},"\\",-1),b=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"--fees=21000utia")],-1),v={class:"shiki github-light vp-code-light"},T=n("",1),k=n("",1),f={class:"line"},A=s("span",{style:{color:"#24292E"}},"--from=$VALIDATOR_WALLET ",-1),S={style:{color:"#005CC5"}},B=s("span",{style:{color:"#24292E"}}," ",-1),x=s("span",{style:{color:"#005CC5"}},"\\",-1),q=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"--fees=21000utia")],-1),w=n("",30),I={class:"language-bash vp-adaptive-theme"},P=s("button",{title:"Copy Code",class:"copy"},null,-1),V=s("span",{class:"lang"},"bash",-1),R={class:"shiki github-dark vp-code-dark"},D=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"MONIKER"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"your_moniker"')],-1),N=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#F97583"}},"="),s("span",{style:{color:"#9ECBFF"}},'"validator"')],-1),L=s("span",{class:"line"},null,-1),O=n("",1),W=n("",1),M=n("",1),z=n("",1),U={class:"line"},Y=s("span",{style:{color:"#E1E4E8"}}," ",-1),$={style:{color:"#79B8FF"}},H=s("span",{style:{color:"#E1E4E8"}}," ",-1),K=s("span",{style:{color:"#79B8FF"}},"\\",-1),G=n("",1),J=n("",1),Q=n("",1),j=n("",1),X=n("",1),Z=n("",1),ss=n("",1),as=s("span",{class:"line"},[s("span",{style:{color:"#E1E4E8"}}," "),s("span",{style:{color:"#79B8FF"}},"--gas=220000")],-1),ns={class:"shiki github-light vp-code-light"},es=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"MONIKER"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"your_moniker"')],-1),os=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}},"VALIDATOR_WALLET"),s("span",{style:{color:"#D73A49"}},"="),s("span",{style:{color:"#032F62"}},'"validator"')],-1),ts=s("span",{class:"line"},null,-1),ls=n("",1),ps=n("",1),cs=n("",1),rs=n("",1),is={class:"line"},ds=s("span",{style:{color:"#24292E"}}," ",-1),hs={style:{color:"#005CC5"}},us=s("span",{style:{color:"#24292E"}}," ",-1),_s=s("span",{style:{color:"#005CC5"}},"\\",-1),ys=n("",1),gs=n("",1),Es=n("",1),Cs=n("",1),ms=n("",1),Fs=n("",1),bs=n("",1),vs=s("span",{class:"line"},[s("span",{style:{color:"#24292E"}}," "),s("span",{style:{color:"#005CC5"}},"--gas=220000")],-1),Ts=n("",16),qs=JSON.parse('{"title":"Setting up a Celestia validator node","description":"Learn how to set up a Celestia validator node.","frontmatter":{"description":"Learn how to set up a Celestia validator node.","outline":"deep","head":[["meta",{"name":"og:title","content":"Setting up a Celestia validator node | Celestia Docs"},{"name":"og:description","content":false}]]},"headers":[],"relativePath":"nodes/validator-node.md","filePath":"nodes/validator-node.md","lastUpdated":1725992025000}'),ks={name:"nodes/validator-node.md"},ws=Object.assign(ks,{setup(fs){return(As,Ss)=>(l(),p("div",null,[r,s("div",i,[d,h,s("pre",u,[s("code",null,[_,a(` `),y,a(` `),s("span",g,[E,s("span",C,"--chain-id="+o(t(e).mochaChainId),1),m,F]),a(` `),b])]),s("pre",v,[s("code",null,[T,a(` @@ -8,15 +8,15 @@ import{c as e}from"./chunks/constants.295fc0ab.js";import{o as l,c as p,k as s,a `),N,a(` `),L,a(` `),O,a(` -`),z,a(` `),W,a(` `),M,a(` -`),s("span",U,[$,s("span",H,"--chain-id="+o(t(e).mochaChainId),1),Y,K]),a(` +`),z,a(` +`),s("span",U,[Y,s("span",$,"--chain-id="+o(t(e).mochaChainId),1),H,K]),a(` `),G,a(` `),J,a(` `),Q,a(` -`),X,a(` `),j,a(` +`),X,a(` `),Z,a(` `),ss,a(` `),as])]),s("pre",ns,[s("code",null,[es,a(` diff --git a/pr-1699/community/calendar.html b/pr-1699/community/calendar.html index 2dca2a4eaf..93217e7f9a 100644 --- a/pr-1699/community/calendar.html +++ b/pr-1699/community/calendar.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Community calendar

    The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.

    Add the community calendar to your personal calendar to stay updated with all the events.

    Explore past community call agendas, notes, and recordings for more insights.

    - +

    Community calendar

    The Celestia community calendar is available for finding all the different community call events happening in Celestia's community.

    Add the community calendar to your personal calendar to stay updated with all the events.

    Explore past community call agendas, notes, and recordings for more insights.

    + \ No newline at end of file diff --git a/pr-1699/community/coc.html b/pr-1699/community/coc.html index 7cb4873124..7e8a0529ca 100644 --- a/pr-1699/community/coc.html +++ b/pr-1699/community/coc.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Celestia.org Code of Conduct

    Our Pledge

    We as Celestia.org members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

    We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

    Our Standards

    Examples of behavior that contributes to a positive environment for our community include:

    • Demonstrating empathy and kindness toward other people
    • Being respectful of differing opinions, viewpoints, and experiences
    • Giving and gracefully accepting constructive feedback
    • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    • Focusing on what is best not just for us as individuals, but for the overall community
    • Contributing to conversations about Celestia’s technology and ecosystem

    Examples of unacceptable behavior include:

    • The use of sexualized language or imagery, and sexual attention or advances of any kind
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • Public or private harassment
    • Publishing others' private information, such as a physical or email address, without their explicit permission
    • Focusing on the prices of digital assets or tokens, or where they can be purchased
    • Other conduct which could reasonably be considered inappropriate in a professional setting

    Enforcement Responsibilities

    Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

    Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

    Scope

    This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

    Enforcement

    Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Celestia.org Discord. All complaints will be reviewed and investigated promptly and fairly.

    All community leaders are obligated to respect the privacy and security of the reporter of any incident.

    Enforcement Guidelines

    Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

    1. Correction

    Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

    Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

    2. Warning

    Community Impact: A violation through a single incident or series of actions.

    Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

    3. Temporary Ban

    Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

    Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

    4. Permanent Ban

    Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

    Consequence: A permanent ban from any sort of public interaction within the community.

    Attribution

    This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

    Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - +

    Celestia.org Code of Conduct

    Our Pledge

    We as Celestia.org members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

    We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

    Our Standards

    Examples of behavior that contributes to a positive environment for our community include:

    • Demonstrating empathy and kindness toward other people
    • Being respectful of differing opinions, viewpoints, and experiences
    • Giving and gracefully accepting constructive feedback
    • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    • Focusing on what is best not just for us as individuals, but for the overall community
    • Contributing to conversations about Celestia’s technology and ecosystem

    Examples of unacceptable behavior include:

    • The use of sexualized language or imagery, and sexual attention or advances of any kind
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • Public or private harassment
    • Publishing others' private information, such as a physical or email address, without their explicit permission
    • Focusing on the prices of digital assets or tokens, or where they can be purchased
    • Other conduct which could reasonably be considered inappropriate in a professional setting

    Enforcement Responsibilities

    Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

    Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

    Scope

    This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

    Enforcement

    Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Celestia.org Discord. All complaints will be reviewed and investigated promptly and fairly.

    All community leaders are obligated to respect the privacy and security of the reporter of any incident.

    Enforcement Guidelines

    Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

    1. Correction

    Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

    Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

    2. Warning

    Community Impact: A violation through a single incident or series of actions.

    Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

    3. Temporary Ban

    Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

    Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

    4. Permanent Ban

    Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

    Consequence: A permanent ban from any sort of public interaction within the community.

    Attribution

    This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

    Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    + \ No newline at end of file diff --git a/pr-1699/community/foundation-delegation-program.html b/pr-1699/community/foundation-delegation-program.html index 379670599c..92e61b6fdc 100644 --- a/pr-1699/community/foundation-delegation-program.html +++ b/pr-1699/community/foundation-delegation-program.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    The Celestia Foundation Delegation Program

    Delegation program banner

    Objectives of the program

    The primary objectives of the Celestia Foundation Delegation Program are:

    • To provide a fair opportunity for Celestia’s users to join the validator set, while ensuring the validator set remains proficient, trustworthy, and dependable.
    • To maintain network stability by promoting a steady transition of validators and avoiding sudden and disruptive changes in participation.
    • To enable the Celestia Foundation to use its stake towards its mission of fostering a modular blockchain network that delivers exceptional performance.

    Foundation delegation process

    Program launch

    Prospective validators are welcome to apply to the program starting February 6, 2024. The application is designed to assess a validator’s uptime performance and contributions to the Celestia ecosystem. Of the 100 total slots in Celestia’s active validator set, up to 50 will receive delegations within the program.

    Application submissions will be reviewed by the Celestia Foundation. More details about the application and eligibility criteria are described below.

    Cohort process

    cohort timeline

    Every 4 months, the Celestia Foundation will distribute a portion of the Foundation’s total available stake to a cohort of validators who meet certain criteria, detailed below. Here is an overview of how the cohort process will work for Cohort 1 and what that means for future cohorts.

    Key Points

    • Initial Cohort (Cohort 1): 50 applicants will be accepted
      • Grading System: Applicants in Cohort 1 are divided into first, second, and third place based eligibility criteria outlined in this document.
      • Delegation Duration: This varies based on the applicant’s placement in Cohort 1. First place receives 12 months of delegation, second place receives 8 months, third place receives 4 months.
    TierPlacementDelegation DurationRenewal By Cohort
    First PlaceApplicants 1-2012 monthsCohort 4
    Second PlaceApplicants 21-358 monthsCohort 3
    Third PlaceApplicants 36-504 monthsCohort 2
    • Subsequent Cohorts (Cohorts 2-onwards):
      • After Cohort 1, open slots may be filled by Cohort 1 members up for renewals or new applicants. There will be no Tiers (e.g. First Place, Second Place, Third Place) in cohorts after Cohort 1. This structure allows for a steady flow of both existing applicants and new applicants to maintain a stable set of participants in the program.

    During this period, so long as the validator maintains high uptime and does not violate the rules of the program, the validator will receive the delegation for the duration of the cohort they are currently in.

    Eligibility criteria

    The minimum requirements for participation in the program are as follows:

    • Run an active mainnet validator or an active Mocha testnet validator for at least 1 month before application deadline
    • Run a bridge node (on mainnet if you are already an active mainnet validator or on Mocha testnet if not) that is connected and reporting to the Celestia Labs OTEL collector (for new applicants - on testnet, so that we can evaluate performance)
    • Not jailed or slashed in the 6 months before application deadline
    • Not associated with an exchange or custodian
    • Not in the top 10 validators by delegation power, unless it enters the top 10 as a result of the Foundation’s delegation under this program
    • Have 10% or less commission
    • Not based within the US, within any country subject to economic sanctions, or within any other prohibited jurisdiction, and successfully complete a compliance screen
    • Dedicated email address so that the Foundation can reach you in the event of emergency upgrades and fixes
    • Maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha if selected for the program
    • Not running your infrastructure in Hetzner or OVH

    Not adhering to any of the criteria above will automatically disqualify your application, and violating any of the criteria after you have received delegation will result in withdrawal of the delegation. A participant who loses stake due to being jailed by the protocol may reapply to the program after 2 cohort periods.

    Applicants are also expected to have reviewed Celestia docs and recommended guides on devops and monitoring setups.

    Other optional but important criteria:

    • Develop and maintain developer tooling, services, applications, and dashboards
    • Work on projects aligned with Celestia's values
    • Contribute to documentation and new guides and tutorials
    • Quality of infrastructure
    • Operated within a location that improves geolocation of the validator set

    Undelegation criteria

    • Getting slashed/tombstoned (cannot apply for 1 year afterwards)
    • Getting jailed more than once during the cohort’s applicable delegation period
    • Violating the Celestia.org Community Code of Conduct or engaging in harmful activities towards the network
    • Failing to upgrade your node in a timely manner (24 hours or less)
    • If necessary to protect or secure Mainnet Beta or to comply with applicable law
    • For any other reason, in the Celestia Foundation’s sole discretion

    Application

    The program will be divided into cohorts with applications open for new applicants and renewal of existing applicants every 4 months. Validators will be delegated for up to a year. For each cohort, the deadline to apply/be evaluated (if you are reapplying) is exactly 1 month prior to the date of being delegated to.

    Application details

    Before applying, be ready to share the following:

    • General info
      • Security Email
      • Validator Entity Name
      • Discord ID
      • Mark if entity or individual
      • Website if any
      • Github page of your organization
      • Team experience and roster (including Twitter + Github links)
      • Which networks you validate on mainnet + links to your validators
      • A personal statement why you should receive delegation from the Foundation (max 1500 characters)
    • Infrastructure
      • Validator address and bridge node ID on MAINNET
      • If you don't run an active mainnet validator, please provide us with validator address, bridge node ID and blobstream address on Mocha-4
      • Have you been slashed or jailed in the last 6 months on Celestia or other chains you validated on.
      • Hosting provider and Data Center location (mainnet and testnet if applicable)
      • Setup of the 2 components (validator and bridge)
        • Hardware
        • Security setup (servers, private keys)
        • Monitoring and alerting
    • Contributions
      • Please list all technical contributions for Celestia and its ecosystem
      • Please list all community contributions for Celestia and its ecosystem

    Please note, the objective of the program is to contribute to Celestia’s resilience and uptime. If you contribute a lot to the Celestia ecosystem, but your validator uptime is low, this will negatively impact your chance at selection for the program. Furthermore, merely receiving delegation from the Foundation under the program does not guarantee your placement in the active validator set.

    Get Started with the Application Form

    Cohort information

    The Foundation will report each cohort’s composition and the duration of their respective delegations.

    • Cohort 1: 50 Validator Seats
    • Cohort 2: 15 Validator Seats (Applications open June 1, 2024)
    • Cohort 3: 15 Validator Seats (Applications open October 1, 2024)
    • Cohort 4: 20 Validator Seats (Applications open February 1, 2025)

    IMPORTANT: Each validator selected for the program has to maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha.

    Feedback process

    Validators in the program will receive a feedback form every quarter, so the program can be continually improved.

    - +

    The Celestia Foundation Delegation Program

    Delegation program banner

    Objectives of the program

    The primary objectives of the Celestia Foundation Delegation Program are:

    • To provide a fair opportunity for Celestia’s users to join the validator set, while ensuring the validator set remains proficient, trustworthy, and dependable.
    • To maintain network stability by promoting a steady transition of validators and avoiding sudden and disruptive changes in participation.
    • To enable the Celestia Foundation to use its stake towards its mission of fostering a modular blockchain network that delivers exceptional performance.

    Foundation delegation process

    Program launch

    Prospective validators are welcome to apply to the program starting February 6, 2024. The application is designed to assess a validator’s uptime performance and contributions to the Celestia ecosystem. Of the 100 total slots in Celestia’s active validator set, up to 50 will receive delegations within the program.

    Application submissions will be reviewed by the Celestia Foundation. More details about the application and eligibility criteria are described below.

    Cohort process

    cohort timeline

    Every 4 months, the Celestia Foundation will distribute a portion of the Foundation’s total available stake to a cohort of validators who meet certain criteria, detailed below. Here is an overview of how the cohort process will work for Cohort 1 and what that means for future cohorts.

    Key Points

    • Initial Cohort (Cohort 1): 50 applicants will be accepted
      • Grading System: Applicants in Cohort 1 are divided into first, second, and third place based eligibility criteria outlined in this document.
      • Delegation Duration: This varies based on the applicant’s placement in Cohort 1. First place receives 12 months of delegation, second place receives 8 months, third place receives 4 months.
    TierPlacementDelegation DurationRenewal By Cohort
    First PlaceApplicants 1-2012 monthsCohort 4
    Second PlaceApplicants 21-358 monthsCohort 3
    Third PlaceApplicants 36-504 monthsCohort 2
    • Subsequent Cohorts (Cohorts 2-onwards):
      • After Cohort 1, open slots may be filled by Cohort 1 members up for renewals or new applicants. There will be no Tiers (e.g. First Place, Second Place, Third Place) in cohorts after Cohort 1. This structure allows for a steady flow of both existing applicants and new applicants to maintain a stable set of participants in the program.

    During this period, so long as the validator maintains high uptime and does not violate the rules of the program, the validator will receive the delegation for the duration of the cohort they are currently in.

    Eligibility criteria

    The minimum requirements for participation in the program are as follows:

    • Run an active mainnet validator or an active Mocha testnet validator for at least 1 month before application deadline
    • Run a bridge node (on mainnet if you are already an active mainnet validator or on Mocha testnet if not) that is connected and reporting to the Celestia Labs OTEL collector (for new applicants - on testnet, so that we can evaluate performance)
    • Not jailed or slashed in the 6 months before application deadline
    • Not associated with an exchange or custodian
    • Not in the top 10 validators by delegation power, unless it enters the top 10 as a result of the Foundation’s delegation under this program
    • Have 10% or less commission
    • Not based within the US, within any country subject to economic sanctions, or within any other prohibited jurisdiction, and successfully complete a compliance screen
    • Dedicated email address so that the Foundation can reach you in the event of emergency upgrades and fixes
    • Maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha if selected for the program
    • Not running your infrastructure in Hetzner or OVH

    Not adhering to any of the criteria above will automatically disqualify your application, and violating any of the criteria after you have received delegation will result in withdrawal of the delegation. A participant who loses stake due to being jailed by the protocol may reapply to the program after 2 cohort periods.

    Applicants are also expected to have reviewed Celestia docs and recommended guides on devops and monitoring setups.

    Other optional but important criteria:

    • Develop and maintain developer tooling, services, applications, and dashboards
    • Work on projects aligned with Celestia's values
    • Contribute to documentation and new guides and tutorials
    • Quality of infrastructure
    • Operated within a location that improves geolocation of the validator set

    Undelegation criteria

    • Getting slashed/tombstoned (cannot apply for 1 year afterwards)
    • Getting jailed more than once during the cohort’s applicable delegation period
    • Violating the Celestia.org Community Code of Conduct or engaging in harmful activities towards the network
    • Failing to upgrade your node in a timely manner (24 hours or less)
    • If necessary to protect or secure Mainnet Beta or to comply with applicable law
    • For any other reason, in the Celestia Foundation’s sole discretion

    Application

    The program will be divided into cohorts with applications open for new applicants and renewal of existing applicants every 4 months. Validators will be delegated for up to a year. For each cohort, the deadline to apply/be evaluated (if you are reapplying) is exactly 1 month prior to the date of being delegated to.

    Application details

    Before applying, be ready to share the following:

    • General info
      • Security Email
      • Validator Entity Name
      • Discord ID
      • Mark if entity or individual
      • Website if any
      • Github page of your organization
      • Team experience and roster (including Twitter + Github links)
      • Which networks you validate on mainnet + links to your validators
      • A personal statement why you should receive delegation from the Foundation (max 1500 characters)
    • Infrastructure
      • Validator address and bridge node ID on MAINNET
      • If you don't run an active mainnet validator, please provide us with validator address, bridge node ID and blobstream address on Mocha-4
      • Have you been slashed or jailed in the last 6 months on Celestia or other chains you validated on.
      • Hosting provider and Data Center location (mainnet and testnet if applicable)
      • Setup of the 2 components (validator and bridge)
        • Hardware
        • Security setup (servers, private keys)
        • Monitoring and alerting
    • Contributions
      • Please list all technical contributions for Celestia and its ecosystem
      • Please list all community contributions for Celestia and its ecosystem

    Please note, the objective of the program is to contribute to Celestia’s resilience and uptime. If you contribute a lot to the Celestia ecosystem, but your validator uptime is low, this will negatively impact your chance at selection for the program. Furthermore, merely receiving delegation from the Foundation under the program does not guarantee your placement in the active validator set.

    Get Started with the Application Form

    Cohort information

    The Foundation will report each cohort’s composition and the duration of their respective delegations.

    • Cohort 1: 50 Validator Seats
    • Cohort 2: 15 Validator Seats (Applications open June 1, 2024)
    • Cohort 3: 15 Validator Seats (Applications open October 1, 2024)
    • Cohort 4: 20 Validator Seats (Applications open February 1, 2025)

    IMPORTANT: Each validator selected for the program has to maintain a fully archival (non pruned) bridge node for both Mainnet Beta and Mocha.

    Feedback process

    Validators in the program will receive a feedback form every quarter, so the program can be continually improved.

    + \ No newline at end of file diff --git a/pr-1699/community/itn-tos.html b/pr-1699/community/itn-tos.html index 4bdbbee063..023ddd75c3 100644 --- a/pr-1699/community/itn-tos.html +++ b/pr-1699/community/itn-tos.html @@ -11,7 +11,7 @@ - + @@ -39,7 +39,7 @@

    SUPPLEMENTAL INCENTIVIZED TESTNET TERMS

    Last Revised on 1/16/2023

    Welcome to the Supplemental Terms (these "ITN Award Program Terms" or "Terms") for the Incentivized Testnet Award Program (the "ITN Award Program" or the "Program") as operated on behalf of Strange Loop Labs AG ("Company", "we" or "us"). The ITN Award Program provides eligible users of a Testnet designated by the Company the opportunity to earn rewards, which may include Celestia tokens. These Terms are supplemental to, and incorporate by reference, the broader Celestia Terms of Service ("Services Terms") available at Celestia Terms of Service.

    Defined terms used but not defined herein have the meaning set forth in the Services Terms. The Program and your participation in it is a Service as defined under the Services Terms.

    These Terms govern your ability to participate in the Program and any awards you receive from that participation, which may include Celestia tokens ("ITN Rewards").

    Please read these Terms carefully, as they include important information about your legal rights. By participating in the Program or claiming ITN Rewards, you are agreeing to these Terms. If you do not understand or agree to these Terms, please do not participate in the Program or claim ITN Rewards.

    In order to participate in the Program you must provide certain information about you. Our collection of such information, your rights with respect to such collection, and other relevant information is described in the Celestia Privacy Policy available at Celestia Privacy Policy, and is supplemented by Section 3 of these Terms.

    The Program is a discretionary Service provided by the Company, pursuant to which the Company may, in its sole discretion, provide you ITN Rewards for your successful completion of certain tasks on a Testnet designated by the Company. Please note that any such Testnet itself (as well as any other Testnets or any mainnet deployment of the Celestia Protocol) is not a Service and does not constitute an element of the Services. We do not control the Celestia Protocol and accept no liability for its operation or its deployment in any testnet or mainnet environment.

    1. General Terms

    1.1 You must be eighteen (18) years of age or older and capable of forming a binding contract with the Company in order to participate in the Program or receive ITN Rewards.

    1.2 You agree and acknowledge that you (a) may receive ITN Rewards for free (other than applicable taxes, if any) from your participation in the Program, (b) were not previously promised ITN Rewards, unless pursuant to a separate written agreement, and (c) took no action in anticipation of or in reliance on receiving any ITN Rewards, unless pursuant to a separate written agreement.

    1.3 Your eligibility to participate in or receive ITN Rewards from the Program is subject to our sole discretion. The complete list of actions you must complete to earn ITN Rewards may not have been described in the documentation released by us from time to time, you may not receive ITN Rewards even if you successfully complete such actions, and no documentation related to the Program entitles you to any ITN Rewards or to participate in the Program.

    1.4 You agree and acknowledge that (a) you are not a Prohibited Person, (b) you are not a U.S. Person as defined in Rule 902(k) of Regulation S under the U.S. Securities Act of 1933, as amended (the "1933 Act" or "Act"), (c) you will not use a VPN or other tool to circumvent any geoblock or other restrictions that we may have implemented for participants in the Program, and (d) you are not participating in, and have not become eligible to participate in, the Program by receiving credentials from any other person or entity. Any circumvention or violation of the above will permanently disqualify you from participation in the Program.

    1.5 You agree and acknowledge that if you are unable to claim ITN Rewards due to technical bugs, gas fees, loss of access to a Wallet or the keys thereto, or for any other reason, you will have no recourse or claim against us or any other Company Entity and that neither we nor any other Company Entity will bear any liability.

    1.6 You agree and acknowledge that claiming an ITN Reward may require reliance on or an integration with third party products (e.g., a Wallet or an unaffiliated network or blockchain) that we do not control. In the event that you are unable to access such products or integrations, or if they fail for any reason, and you are unable to participate in the Program or claim ITN Rewards, you will have no recourse or claim against us or any other Company Entity and neither we nor any other Company Entity will bear any liability.

    1.7 The Company may share identifying information and documentation with certain vendors or third-party providers who provide such identity verification and sanctions and watchlist screening services (the "Third-Party Services"). You agree that your access and use of such Third-Party Services is governed solely by the terms and conditions of such Third-Party Services, and the Company is not responsible or liable for, and make no representations as to any aspect of such Third-Party Services, including, without limitation, their content or the manner in which they handle, protect, manage or process data or any interaction between you and the provider of such Third-Party Services. You irrevocably waive any claim against the Company with respect to such Third-Party Services. We are not liable for any damage or loss caused or alleged to be caused by or in connection with your enablement, access or use of any such Third-Party Services, or your reliance on the privacy practices, data security processes or other policies of such Third-Party Services.

    2. Taxes

    2.1 You are responsible for the payment of all taxes associated with your participation in the Program and your receipt of ITN Rewards. You agree to provide the Company with any additional information and complete any required tax or other forms relating to your receipt of ITN Rewards. You may suffer adverse tax consequences as a result of your participation in the Program or your receipt of ITN Rewards. You hereby represent that (a) you have consulted with a tax adviser that you deem advisable in connection with your participation, or that you have had the opportunity to obtain tax advice but have chosen not to do so, (b) the Company has not provided you with any tax advice with respect to your participation, and (c) you are not relying on the Company for any tax advice.

    3. Supplemental Privacy Information

    We may collect information to help us determine the reliability or uptime of your activities within the Program, including through the use of telemetry or metrics endpoints to collect and analyse such information, and link this information to a unique identifier to represent your activities within the Program. We may display all of the foregoing information on a public dashboard.

    Additionally, we may collect certain information about you from Third-Party Services and may combine information we receive from you with information we obtain from Third-Party Services, including but not limited to:

    • Transaction information. Information related to transactions in your Wallet, your Wallet address, activities performed using your Wallet, tokens received by your Wallet, or transactions initiated or completed.
    • Identification information. We collect your government identification (e.g., driver’s license, passport, etc.), proof of address, biometric information, and entity formation information if applicable. By agreeing to these Terms, you consent to our use of your biometric information, and understand and agree that our use of the biometric information is necessary for the performance of these Terms and the implementation of the Services.

    We collect this information to confirm your eligibility to participate in the Program and receive ITN Rewards, comply with our legal obligations, detect and prevent fraud, and to provide you with the Program.

    Any information we receive from third-party sources will be treated in accordance with the Celestia Privacy Policy, available at Celestia Privacy Policy. We are not responsible or liable for the accuracy of the information provided to us by third parties and are not responsible for any third party’s policies or practices. See Section 9 of the Celestia Privacy Policy for more information.

    4. Certain Additional Representations

    4.1 Receipt of Rewards Entirely for Own Account. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that any ITN Rewards you receive will be for your own account, not as a nominee or agent, and not with a view to the resale or distribution of any part thereof, and that you have no present intention of selling, granting any participation in, or otherwise distributing the same. By agreeing to these Terms, you further represent that you do not presently have any contract, undertaking, agreement or arrangement with any person to sell, transfer or grant participations to such person or to any third person, with respect to any ITN Rewards. If you are agreeing to these terms on behalf of an entity, that entity has not been formed for the specific purpose of obtaining the ITN Rewards.

    4.2 Disclosure of Information. Your eligibility to receive ITN Rewards is made in reliance upon your representation to the Company, which by your agreement to these Terms you hereby confirm, that you have sufficient knowledge of and experience in business and financial matters to be able to evaluate the risks and merits of your participation in the Program and of any ITN Rewards and are able to bear the risks thereof. You hereby affirm that you have not relied on any representations or warranties made by the Company related to the Program, including, but not limited to, conversations of any kind, whether through oral or electronic communication, or any white paper.

    4.3 Compliance with United States Securities Laws. You understand that the ITN Rewards have not been, and will not be, registered under the 1933 Act or any applicable state securities laws. You acknowledge that the availability of an exemption from the registration provisions of the Securities Act and other applicable state securities laws depends upon, among other things, the bona fide nature of your intent as described in Section 4.1 above and with respect to the accuracy of your representations as expressed throughout these Terms. You understand that the ITN Rewards may be deemed "restricted securities" under applicable United States federal and state securities laws and that, pursuant to these laws, you may be restricted from transferring any ITN Rewards unless they are registered with the Securities and Exchange Commission and qualified by state authorities, or an exemption from such registration and qualification requirements is available. You acknowledge that the Company does not undertake any obligation to register or qualify the ITN Rewards for resale, and exemptions from registration and qualification may not be available or may not permit you to transfer all or any of the ITN Rewards in the amounts or at the times proposed by you. You further acknowledge that if an exemption from registration or qualification is available, such exemption may be conditioned on various requirements including, but not limited to, the time and manner of sale, the holding period for the ITN Rewards, and on other factors outside of your control, for which the Company makes no assurances and may not be able to satisfy.

    4.4 Compliance with Liechtenstein Security Law. You understand that nothing in these Terms will be deemed to constitute a prospectus of any sort in Liechtenstein or in any jurisdiction in the EU; nor does it in any way pertain to a public offering or a solicitation of an offer to buy any securities in Liechtenstein or in any jurisdiction in the EU.

    4.5 No Public Market. You understand that no public market now exists for the ITN Rewards, and that the Company has not made any assurances that a public market will ever exist for the ITN Rewards.

    4.6 No Solicitation. At no time were you presented with or solicited by any publicly issued or circulated newspaper, mail, radio, television or other form of general advertising or solicitation in connection with any invitation to participate in the Program or offer of the ITN Rewards.

    4.7 Other Applicable Laws. You hereby represent that you have satisfied yourself as to the full observance of the laws of your jurisdiction in connection with any invitation to participate in the Program, receipt of ITN Awards, and other use of these Terms, including (a) the legal requirements within your jurisdiction for participating in the Program and receiving ITN Rewards, (b) any foreign exchange restrictions applicable to such participation or receipt, (c) any governmental or other consents that may need to be obtained, and (d) the income tax and other tax consequences, if any, that may be relevant to the receipt, holding, sale, or transfer of the ITN Rewards. Your participation in the Program and continued beneficial ownership of ITN Rewards will not violate any applicable securities or other laws of your jurisdiction.

    4.8 Non-US Transaction. You are not a U.S. Person as defined in Rule 902(k) of Regulation S under the 1933 Act. The offer of the ITN Rewards to you was made in an offshore transaction (as defined in Rule 902(h) of Regulation S), no directed selling efforts (as defined in Rule 902(c) of Regulation S) were made in the United States, and you are not obtaining the ITN Rewards for the account or benefit of any U.S. Person.

    4.9 Transfer Restrictions. You will not, during the Restricted Period (as defined below) offer or sell any of the ITN Rewards (or create or maintain any derivative position equivalent thereto) in the United States, to or for the account or benefit of a U.S. Person or other than in accordance with Regulation S. The Company reserves the right to impose additional transfer restrictions with respect to the ITN Rewards in its sole discretion.

    4.10 Subsequent Sales. You will, after the expiration of the applicable Restricted Period, only offer, sell, pledge or otherwise transfer the ITN Rewards (or create or maintain any derivative position equivalent thereto) pursuant to registration under the 1933 Act or any available exemption therefrom and, in any case, in accordance with applicable state securities laws.

    4.11 Legends. You acknowledge and agree that the ITN Rewards will be deemed to bear the following legends: (a) any legend required by the securities laws of any state or country to the extent such laws are applicable to the ITN Rewards represented by the certificate so legended, and (b): the following legend (and even without such legend the following restrictions apply):

    THE ITN REWARDS HAVE NOT BEEN REGISTERED UNDER THE ACT WITH THE UNITED STATES SECURITIES AND EXCHANGE COMMISSION, AND THE COMPANY DOES NOT INTEND TO REGISTER THEM. THE ITN REWARDS HAVE BEEN OBTAINED TO HOLD FOR THE LONG TERM AND NOT WITH A VIEW TO, OR IN CONNECTION WITH, THE SALE OR DISTRIBUTION THEREFOR. PRIOR TO THE ONE YEAR ANNIVERSARY FROM THE TERMINATION OF THE ITN REWARD PROGRAM (THE "PROGRAM COMPLETION DATE" AND SUCH ONE YEAR PERIOD, THE "RESTRICTED PERIOD"), THE ITN REWARDS MAY NOT BE OFFERED OR SOLD (INCLUDING OPENING A SHORT POSITION IN SUCH ITN REWARDS) IN THE UNITED STATES OR TO U.S. PERSONS AS DEFINED BY RULE 902(k) ADOPTED UNDER THE ACT, OTHER THAN TO DISTRIBUTORS, UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT, OR AN EXEMPTION FROM THE REGISTRATION REQUIREMENTS OF THE ACT IS AVAILABLE. RECIPIENTS OF ITN REWARDS PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE MAY SELL SUCH ITN REWARDS ONLY PURSUANT TO AN EXEMPTION FROM REGISTRATION UNDER THE ACT OR OTHERWISE IN ACCORDANCE WITH THE PROVISIONS OF REGULATION S OF THE ACT, OR IN TRANSACTIONS EFFECTED OUTSIDE OF THE UNITED STATES PROVIDED THEY DO NOT SOLICIT (AND NO ONE ACTING ON THEIR BEHALF SOLICITS) PURCHASERS IN THE UNITED STATES OR OTHERWISE ENGAGE(S) IN SELLING EFFORTS IN THE UNITED STATES AND PROVIDED THAT HEDGING TRANSACTIONS INVOLVING THESE ITN REWARDS MAY NOT BE CONDUCTED UNLESS IN COMPLIANCE WITH THE ACT. A HOLDER OF THE ITN REWARDS WHO IS A DISTRIBUTOR, DEALER, SUB-UNDERWRITER OR OTHER SECURITIES PROFESSIONAL, IN ADDITION, CANNOT PRIOR TO THE ONE YEAR ANNIVERSARY OF THE PROGRAM COMPLETION DATE SELL THE ITN REWARDS TO A U.S. PERSON AS DEFINED BY RULE 902(k) OF REGULATION S UNLESS THE ITN REWARDS ARE REGISTERED UNDER THE ACT OR AN EXEMPTION FROM REGISTRATION UNDER THE ACT IS AVAILABLE.

    - + \ No newline at end of file diff --git a/pr-1699/community/modular-meetup-guide.html b/pr-1699/community/modular-meetup-guide.html index 0dc7702e24..20702e76ea 100644 --- a/pr-1699/community/modular-meetup-guide.html +++ b/pr-1699/community/modular-meetup-guide.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Modular Meetup guide

    These are recommended steps you can follow that can help you organize a successful Modular Meetup. You aren’t required to follow the entire checklist but it is available to help aid you in your journey to organize a Modular Meetup.

    Before the Meetup

    1. Determine the meetup topic and objectives.
    2. Select a suitable date and time for the event.
    3. Secure a convenient and accessible venue that can accommodate the expected number of attendees.
    4. Finalize a schedule or agenda for the event, including speakers, presentations, and activities.
    5. Prepare and send out invitations to potential attendees using various channels (email, social media, community platforms, etc.).
    6. Create and share promotional materials (graphics, blog posts, etc.) to raise awareness about the meetup.
    7. Confirm speakers, including their availability, presentation topics, and technical requirements. If you are working from a Speaker List, please reach out to Nat for any support needed on coordination with speakers.
    8. Arrange any necessary equipment, such as microphones, projectors, and whiteboards.
    9. Plan and arrange refreshments, if applicable.
    10. Prepare and print any required materials, like agendas, name tags, and feedback forms.
    11. Coordinate with volunteers or team members to help manage the event.
    12. Set up a registration system or RSVP process to track attendance.
    13. Send out reminder messages to registered attendees prior to the event.
    14. Conduct a final review of the event logistics, including venue setup, equipment functionality, and volunteer roles.

    During the Meetup

    1. Set up the venue, including arranging seating, preparing equipment, and displaying any promotional materials.
    2. Designate a registration area and ensure that someone is available to greet and check-in attendees.
    3. Welcome the attendees and provide an overview of the event schedule.
    4. Introduce speakers and facilitate any presentations or discussions.
    5. Encourage networking and interaction among attendees during breaks or dedicated activities.
    6. Capture the event with photos or videos for future promotions and documentation.
    7. Collect feedback from attendees using forms, online surveys, or informal conversations if needed.

    After the Meetup

    1. Send follow-up messages to attendees, thanking them for their participation and soliciting additional feedback.
    2. Evaluate the success of the event by reviewing feedback and assessing key performance indicators (e.g., attendance, engagement, etc.).
    3. Analyze and document lessons learned, identifying areas for improvement in future meetups.
    4. Share event highlights, photos, and key takeaways with the community through social media, blog posts, or newsletters.
    5. Connect with speakers, attendees, and volunteers to maintain and strengthen relationships.
    6. Begin planning for the next meetup, applying insights gained from the previous event to enhance the experience for future attendees.

    Logistics and guidance

    These are provided guidelines for different components of kickstarting a Modular Meetup to help you get started on the logistics of organizing a meetup. A lot of those guidelines are thanks to the wonderful write ups in Ethereum Meetup Support Program and Elastic Community Organizer Guides.

    Venue

    Selecting the perfect venue for your Modular Meetup is essential in creating a welcoming atmosphere for the Celestia community.

    1. Startup Incubators
      • Often they would have spaces for meetups.
    2. Libraries
      • Libraries can normally have spaces for meetups at little to no costs
    3. Co-working spaces:
      • Co-working spaces might be able to offer necessary equipment like microphones, projectors, and whiteboards.
    4. Restaurants:
      • Restaurants might have private rooms for larger groups of people that you can book, depending on the restaurant.
    5. Universities and Blockchain Clubs:
      • Partnering with universities and their local university clubs can offer you a lot of spaces for meetups, as well as necessary equipments if needed for giving a talk.
    6. Other options:
      • If you're having difficulty finding a venue, don't hesitate to ask for help within the Celestia community. Your fellow organizers and attendees may have valuable suggestions or connections.

    An ideal venue should offer:

    • Sufficient seating for the audience
    • A projector and screen
    • A microphone (especially for meetups with 10+ attendees)
    • Optional: A whiteboard for speakers or workshops (not always necessary, but a nice addition)

    Consider recording the event, even with a smartphone, to share with the community later. If the speaker uses a microphone, their voice will be more audible in the video. We might be able to post those recordings of the meetup talks on a meetup youtube channel after.

    Remember to negotiate on costs and seek discounts, emphasizing that your meetup benefits the community.

    Collaborate with your venue provider to explore options like borrowing recording equipment, tripods, or even having them record the event for you. Some providers may offer these services for free or at a reduced cost.

    Catering and refreshments

    Providing refreshments or catering for your Modular Meetup enhances the overall experience and encourages networking among attendees.

    1. Determine your budget
      • Identify the amount you can allocate for food and drinks at your event which will help you determine how much you can bring in refreshments. You can also contact the Celestia Devrel team for ideas and support. Costs for refreshments and drinks can vary depending on your location, so be mindful to be flexible on your plans according to your specific location and budget.
    2. Offer a variety of refreshments
      • If you're ordering in, pizza and finger foods work well, but you can also have more budget-friendly options for food.
      • Offering drinks like beer, soda, or lemonade are great, but water also works. Keep in mind that not everyone drinks alcohol so it’s not a requirement. But having at least water and plastic cups works well.
    3. Plan ahead
      • Order refreshments 1 or 2 days in advance and schedule delivery to avoid last-minute stress during the event.

    By following these recommendations, you'll be able to provide enjoyable refreshments for your Celestia Modular Meetup attendees while fostering a friendly and engaging atmosphere.

    Audience

    Understanding your audience and estimating attendance are crucial for organizing successful Modular Meetups for Celestia.

    1. Research the local tech scene:
      • Investigate the types of meetups and events popular in your area. Attend other technology-focused events to get a sense of the audience size and interests. This information will help you tailor your meetup to attract a larger audience.
    2. Assess the availability of speakers:
      • Before organizing a meetup, ensure that you have access to a pool of knowledgeable speakers. If you anticipate difficulty in securing speakers, consider joining forces with an existing meetup group or speaking at other events before launching a new group. This approach will help spread the word about your planned Modular Meetup and gauge interest. Speakers are covered in the following section with a reference to Speaker List offered by the Modular Meetup program.
    3. Establish connections with other user groups:
      • Forge relationships with other tech-focused meetup groups to mutually promote each other's events, potentially increasing attendance.
    4. Set a regular routine for your meetup:
      • Communicate how often you plan to hold meetups, whether it's monthly or quarterly, to help attendees manage their expectations and maintain their interest.
    5. Organize casual meetups:
      • If there's a gap between more formal events, arrange casual meetups at pubs or cafes to keep people engaged and connect with potential speakers for future events.
    6. Estimate the number of attendees:
      • Consider factors such as the size of your city, the popularity of the topic, and the appeal of the event description when estimating attendance.

    Speakers

    Securing engaging and knowledgeable speakers is key to hosting an exceptional Celestia Modular Meetup.

    1. Define your event topic
      • Determine the theme of your event, focusing on areas such as DeFi, Gaming, NFTs, coding workshops, protocol changes, rollups, data availability, or other topics relevant to the Modular ecosystem. This will help you find speakers with expertise in the chosen subject.
    2. Utilize the Speaker List provided by the Modular Meetup program
      • As a meetup organizer, you have access to a curated list of talented speakers from Celestia Labs and the broader Modular ecosystem. This valuable resource can connect you with experts who can share their knowledge with your meetup attendees.
    3. Aim for multiple speakers
      • Ideally, invite 2-3 speakers to your event, allotting 20-40 minutes per talk. Schedule short breaks between presentations to maintain audience engagement.
    4. Organize the speaker lineup
      • Discuss the topics and slides with your speakers before the event to ensure a smooth flow. Arrange the talks in a logical order, saving the most impactful presentation for last.
    5. Invite local speakers
      • For your first meetup, consider presenting an introduction to the Celestia ecosystem or a specific area of interest. Encourage local experts or enthusiasts to speak at future meetups. This approach fosters community involvement and helps build a network of potential speakers.
    6. Seek speaker referrals
      • Ask your current speakers, attendees, or other meetup organizers for referrals. Personal connections often lead to discovering new speakers with valuable insights.
    7. Leverage your meetup discussion board
      • Post a call for speakers on your meetup discussion board to reach out to potential presenters within your community. Be clear about the event theme and requirements to attract relevant speakers.
    8. Offer incentives and appreciation
      • Reward speakers with tokens of gratitude, such as T-shirts, gifts, or public recognition, to show your appreciation for their contribution to the meetup. The Celestia Labs Devrel team can help with swag logistics if needed.

    Sponsors

    Finding sponsors for your meetup can be challenging, but securing financial support is crucial for covering costs related to venue and refreshments.

    1. Leverage Celestia Labs' support
      • Celestia Labs may offer co-sponsorship for your meetup. However, they also encourage organizers to find local co-sponsors to help cover costs and create a more sustainable event.
    2. Offer value to your sponsors:
      • Show potential sponsors how partnering with your event will benefit them. Include their logo on event banners, mention them in the event description, and give them a shoutout at the beginning of the event. If they desire, allow them to place a rollup banner at the venue.
    3. Reach out to your network
      • Ask friends and acquaintances if they know of coworking spaces, schools, universities, or companies interested in sponsorship. A personal connection can significantly increase the chances of securing support.
    4. Approach speakers for sponsorship
      • Request speakers or their affiliated projects to contribute towards the event's expenses, such as catering costs. This can be an effective way to obtain additional funding.
    5. Create a sponsorship deck
      • Develop a compelling sponsorship deck to pitch your event to tech companies in your city or potential online sponsors. This presentation should highlight the benefits of supporting your event and showcase past successful meetups.
    6. Research local companies
      • Investigate businesses in your area that may be interested in sponsoring your event. Tailor your pitch to align with their industry and demonstrate how the meetup can benefit their company.
    7. Engage sponsors during the event
      • Allow sponsors to briefly address the audience, participate in Q&A sessions, or mention their hiring needs. Remember to avoid sales pitches, as they can negatively impact the meetup experience.
    8. Thank your sponsors
      • Express gratitude to your sponsors at the beginning and end of the meetup. Acknowledging their support encourages continued collaboration and enhances the credibility of your event.

    Communications and marketing

    Effectively marketing and announcing your Modular Meetup is essential for attracting attendees and ensuring a successful event.

    1. Plan your announcement
      • Announce your meetup at least two weeks prior. This gives your audience ample time to prepare and increases the likelihood of their attendance.
    2. Utilize Celestia Labs' resources
      • Celestia Labs can help co-promote your meetup on social media and Discord. They can also add your event to their online calendar, email local contacts, and share the event via their Developer Relations Team on Twitter. Don't hesitate to reach out to them for assistance.
    3. Share on social media
      • Promote your event on Twitter and any other popular social media platforms in your area. Tag speakers, sponsors, and use relevant hashtags to increase visibility.
    4. Leverage local community groups
      • Post your event in local Telegram, Discord, or other community groups relevant to your city. These groups often have many members who may be interested in attending your event.
    5. Engage speakers and the venue
      • Maintain communication with speakers and the venue to ensure any changes can be announced in advance. Trust is critical, so avoid canceling planned meetups whenever possible.
    6. Send reminders via meetup.com (optional)
      • After announcing your event, send a warm invite to your meetup group members through meetup.com. Additionally, send a reminder email one day before the event to encourage attendance.
    7. Share with friends and family
      • Invite your friends, family, and acquaintances to the meetup, as they may help spread the word or know someone interested in the event.
    8. Utilize conference groups
      • If you've attended conferences, share your meetup in the associated Telegram or social media groups, as there may be members nearby who would be interested in attending.

    Recording

    Recording and live-streaming your Modular Meetup can greatly benefit those who cannot attend in person and expand the reach of your event.

    1. Plan for recording
      • Consider recording your meetup to create additional learning resources and share the knowledge with a broader audience.
    2. Consider live-streaming
      • Live-streaming your event on platforms like Twitch, YouTube, or Twitter allows remote participants to watch and engage in the meetup. This can also boost your event's reach and create a sense of inclusion for those who couldn't attend in person.
    3. Coordinate with Celestia Labs
      • Celestia Labs can potentially help cover recording costs and promote recorded meetups. Reach out to them at meetups@celestia.org to discuss available options and support. They can also assist with finding local contacts for recording if you don't have one already.
    4. Utilize available resources
      • If you have a small budget, consider allocating some funds for recording and live-streaming your event. Look for local professionals or affordable equipment rentals to ensure high-quality recordings.
    5. Share recordings on Celestia Labs' channels
      • Celestia Labs can help promote recorded meetups by sharing videos in their meetups playlist on YouTube and hosting them on their website. Ensure you coordinate with Celestia Labs to provide them with the recorded video.
    6. Promote recorded content
      • Share the recordings on your social media channels and meetup group after the event. This helps attendees revisit the content and allows those who couldn't attend to learn from the talks.

    Utilizing Meetup.com platform

    Celestia Labs is committed to supporting your meetup efforts by helping you with meetup.com, from setting up the group to covering organizer dues. Below is a detailed overview of how Celestia Labs can assist you.

    1. Meetup.com organizer dues
      • Celestia Labs is happy to cover organizer dues for meetup.com. To get started, send an email to meetups@celestia.org and let them help you with the process.
    2. Co-organizing existing groups
      • If you already have a meetup.com group but need Celestia Labs' assistance with organizing or covering dues, email meetups@celestia.org to add one of their employees as the Organizer.
    3. Setting up groups on Meetup.com
      • Celestia Labs will help you set up your meetup group, including logos, naming, custom URLs, group description, and other essential details. They provide a unique logo for Celestia Modular Meetups, which you can use for your group.
    4. User group naming
      • Celestia Labs recommends naming your group "Celestia Modular Meetup" to encompass various aspects of the Celestia community and create a consistent brand.
    5. Custom URL for the group
      • Meetup.com allows you to create a custom URL for your user group. Celestia Labs encourages consistent URLs across regions, making it easy for people to find your meetup group.
    6. Group description
      • Celestia Labs has a standard group description to ensure consistency across all meetups. However, if you'd like to customize it, let them know.
    7. New member intake questions
      • To improve the quality of your meetups, Celestia Labs suggests a set of intake questions for new members. The answers can help you better understand their needs and interests, allowing you to plan engaging meetups.
    8. Welcome message
      • Celestia Labs provides a welcome message for new members joining your group. If you'd like to customize this message, let them know.

    Onboarding questions for community members joining a Modular Meetup

    1. Q1: How did you hear about this Modular Meetup?
      • Why: This information helps us understand the most effective channels for recruiting new participants to the meetup.
    2. Q2: What do you hope to gain by participating in this meetup? (e.g., networking, learning about Celestia, learning about Modularity, finding a job, etc.)
      • Why: This information helps us cater to the needs of the user group members. If most attendees are looking for networking opportunities, we can schedule casual meetups alongside informative talks.
    3. Q3: Are you currently using or planning to use Celestia, Rollkit, Celestia’s Node API or any of the rollups deployed on Celestia? Tell us all about it. We will use your response to help us better understand what talks would be most beneficial to the group.
      • Why: Responses to this question help us determine the most relevant talks for the group members. If we discover that most participants are interested in a specific area, we can tailor the talks accordingly.
    4. Q4: We love Celestia and the modular ecosystem, but we also appreciate other Web3 technologies. What other topics would you like to hear about? (e.g., Infrastructure, Data Storage, DID, MEV)
      • Why: Knowing our group participants' interests in other technical areas helps us understand what related topics would be useful and valuable to the group, which in turn helps when recruiting speakers.
    5. Q5: Would you be interested in speaking at a future meetup? We welcome 2-minute lightning talks to 1-hour deep dives. Would you be interested in hosting a meetup? If you answer yes to this question, the group organizers will contact you to follow up.
      • Why: One of the challenges in hosting regular meetups is finding speakers. We hope this question will identify people eager to share their stories and expertise with the group, making the lives of organizers easier.
    - +

    Modular Meetup guide

    These are recommended steps you can follow that can help you organize a successful Modular Meetup. You aren’t required to follow the entire checklist but it is available to help aid you in your journey to organize a Modular Meetup.

    Before the Meetup

    1. Determine the meetup topic and objectives.
    2. Select a suitable date and time for the event.
    3. Secure a convenient and accessible venue that can accommodate the expected number of attendees.
    4. Finalize a schedule or agenda for the event, including speakers, presentations, and activities.
    5. Prepare and send out invitations to potential attendees using various channels (email, social media, community platforms, etc.).
    6. Create and share promotional materials (graphics, blog posts, etc.) to raise awareness about the meetup.
    7. Confirm speakers, including their availability, presentation topics, and technical requirements. If you are working from a Speaker List, please reach out to Nat for any support needed on coordination with speakers.
    8. Arrange any necessary equipment, such as microphones, projectors, and whiteboards.
    9. Plan and arrange refreshments, if applicable.
    10. Prepare and print any required materials, like agendas, name tags, and feedback forms.
    11. Coordinate with volunteers or team members to help manage the event.
    12. Set up a registration system or RSVP process to track attendance.
    13. Send out reminder messages to registered attendees prior to the event.
    14. Conduct a final review of the event logistics, including venue setup, equipment functionality, and volunteer roles.

    During the Meetup

    1. Set up the venue, including arranging seating, preparing equipment, and displaying any promotional materials.
    2. Designate a registration area and ensure that someone is available to greet and check-in attendees.
    3. Welcome the attendees and provide an overview of the event schedule.
    4. Introduce speakers and facilitate any presentations or discussions.
    5. Encourage networking and interaction among attendees during breaks or dedicated activities.
    6. Capture the event with photos or videos for future promotions and documentation.
    7. Collect feedback from attendees using forms, online surveys, or informal conversations if needed.

    After the Meetup

    1. Send follow-up messages to attendees, thanking them for their participation and soliciting additional feedback.
    2. Evaluate the success of the event by reviewing feedback and assessing key performance indicators (e.g., attendance, engagement, etc.).
    3. Analyze and document lessons learned, identifying areas for improvement in future meetups.
    4. Share event highlights, photos, and key takeaways with the community through social media, blog posts, or newsletters.
    5. Connect with speakers, attendees, and volunteers to maintain and strengthen relationships.
    6. Begin planning for the next meetup, applying insights gained from the previous event to enhance the experience for future attendees.

    Logistics and guidance

    These are provided guidelines for different components of kickstarting a Modular Meetup to help you get started on the logistics of organizing a meetup. A lot of those guidelines are thanks to the wonderful write ups in Ethereum Meetup Support Program and Elastic Community Organizer Guides.

    Venue

    Selecting the perfect venue for your Modular Meetup is essential in creating a welcoming atmosphere for the Celestia community.

    1. Startup Incubators
      • Often they would have spaces for meetups.
    2. Libraries
      • Libraries can normally have spaces for meetups at little to no costs
    3. Co-working spaces:
      • Co-working spaces might be able to offer necessary equipment like microphones, projectors, and whiteboards.
    4. Restaurants:
      • Restaurants might have private rooms for larger groups of people that you can book, depending on the restaurant.
    5. Universities and Blockchain Clubs:
      • Partnering with universities and their local university clubs can offer you a lot of spaces for meetups, as well as necessary equipments if needed for giving a talk.
    6. Other options:
      • If you're having difficulty finding a venue, don't hesitate to ask for help within the Celestia community. Your fellow organizers and attendees may have valuable suggestions or connections.

    An ideal venue should offer:

    • Sufficient seating for the audience
    • A projector and screen
    • A microphone (especially for meetups with 10+ attendees)
    • Optional: A whiteboard for speakers or workshops (not always necessary, but a nice addition)

    Consider recording the event, even with a smartphone, to share with the community later. If the speaker uses a microphone, their voice will be more audible in the video. We might be able to post those recordings of the meetup talks on a meetup youtube channel after.

    Remember to negotiate on costs and seek discounts, emphasizing that your meetup benefits the community.

    Collaborate with your venue provider to explore options like borrowing recording equipment, tripods, or even having them record the event for you. Some providers may offer these services for free or at a reduced cost.

    Catering and refreshments

    Providing refreshments or catering for your Modular Meetup enhances the overall experience and encourages networking among attendees.

    1. Determine your budget
      • Identify the amount you can allocate for food and drinks at your event which will help you determine how much you can bring in refreshments. You can also contact the Celestia Devrel team for ideas and support. Costs for refreshments and drinks can vary depending on your location, so be mindful to be flexible on your plans according to your specific location and budget.
    2. Offer a variety of refreshments
      • If you're ordering in, pizza and finger foods work well, but you can also have more budget-friendly options for food.
      • Offering drinks like beer, soda, or lemonade are great, but water also works. Keep in mind that not everyone drinks alcohol so it’s not a requirement. But having at least water and plastic cups works well.
    3. Plan ahead
      • Order refreshments 1 or 2 days in advance and schedule delivery to avoid last-minute stress during the event.

    By following these recommendations, you'll be able to provide enjoyable refreshments for your Celestia Modular Meetup attendees while fostering a friendly and engaging atmosphere.

    Audience

    Understanding your audience and estimating attendance are crucial for organizing successful Modular Meetups for Celestia.

    1. Research the local tech scene:
      • Investigate the types of meetups and events popular in your area. Attend other technology-focused events to get a sense of the audience size and interests. This information will help you tailor your meetup to attract a larger audience.
    2. Assess the availability of speakers:
      • Before organizing a meetup, ensure that you have access to a pool of knowledgeable speakers. If you anticipate difficulty in securing speakers, consider joining forces with an existing meetup group or speaking at other events before launching a new group. This approach will help spread the word about your planned Modular Meetup and gauge interest. Speakers are covered in the following section with a reference to Speaker List offered by the Modular Meetup program.
    3. Establish connections with other user groups:
      • Forge relationships with other tech-focused meetup groups to mutually promote each other's events, potentially increasing attendance.
    4. Set a regular routine for your meetup:
      • Communicate how often you plan to hold meetups, whether it's monthly or quarterly, to help attendees manage their expectations and maintain their interest.
    5. Organize casual meetups:
      • If there's a gap between more formal events, arrange casual meetups at pubs or cafes to keep people engaged and connect with potential speakers for future events.
    6. Estimate the number of attendees:
      • Consider factors such as the size of your city, the popularity of the topic, and the appeal of the event description when estimating attendance.

    Speakers

    Securing engaging and knowledgeable speakers is key to hosting an exceptional Celestia Modular Meetup.

    1. Define your event topic
      • Determine the theme of your event, focusing on areas such as DeFi, Gaming, NFTs, coding workshops, protocol changes, rollups, data availability, or other topics relevant to the Modular ecosystem. This will help you find speakers with expertise in the chosen subject.
    2. Utilize the Speaker List provided by the Modular Meetup program
      • As a meetup organizer, you have access to a curated list of talented speakers from Celestia Labs and the broader Modular ecosystem. This valuable resource can connect you with experts who can share their knowledge with your meetup attendees.
    3. Aim for multiple speakers
      • Ideally, invite 2-3 speakers to your event, allotting 20-40 minutes per talk. Schedule short breaks between presentations to maintain audience engagement.
    4. Organize the speaker lineup
      • Discuss the topics and slides with your speakers before the event to ensure a smooth flow. Arrange the talks in a logical order, saving the most impactful presentation for last.
    5. Invite local speakers
      • For your first meetup, consider presenting an introduction to the Celestia ecosystem or a specific area of interest. Encourage local experts or enthusiasts to speak at future meetups. This approach fosters community involvement and helps build a network of potential speakers.
    6. Seek speaker referrals
      • Ask your current speakers, attendees, or other meetup organizers for referrals. Personal connections often lead to discovering new speakers with valuable insights.
    7. Leverage your meetup discussion board
      • Post a call for speakers on your meetup discussion board to reach out to potential presenters within your community. Be clear about the event theme and requirements to attract relevant speakers.
    8. Offer incentives and appreciation
      • Reward speakers with tokens of gratitude, such as T-shirts, gifts, or public recognition, to show your appreciation for their contribution to the meetup. The Celestia Labs Devrel team can help with swag logistics if needed.

    Sponsors

    Finding sponsors for your meetup can be challenging, but securing financial support is crucial for covering costs related to venue and refreshments.

    1. Leverage Celestia Labs' support
      • Celestia Labs may offer co-sponsorship for your meetup. However, they also encourage organizers to find local co-sponsors to help cover costs and create a more sustainable event.
    2. Offer value to your sponsors:
      • Show potential sponsors how partnering with your event will benefit them. Include their logo on event banners, mention them in the event description, and give them a shoutout at the beginning of the event. If they desire, allow them to place a rollup banner at the venue.
    3. Reach out to your network
      • Ask friends and acquaintances if they know of coworking spaces, schools, universities, or companies interested in sponsorship. A personal connection can significantly increase the chances of securing support.
    4. Approach speakers for sponsorship
      • Request speakers or their affiliated projects to contribute towards the event's expenses, such as catering costs. This can be an effective way to obtain additional funding.
    5. Create a sponsorship deck
      • Develop a compelling sponsorship deck to pitch your event to tech companies in your city or potential online sponsors. This presentation should highlight the benefits of supporting your event and showcase past successful meetups.
    6. Research local companies
      • Investigate businesses in your area that may be interested in sponsoring your event. Tailor your pitch to align with their industry and demonstrate how the meetup can benefit their company.
    7. Engage sponsors during the event
      • Allow sponsors to briefly address the audience, participate in Q&A sessions, or mention their hiring needs. Remember to avoid sales pitches, as they can negatively impact the meetup experience.
    8. Thank your sponsors
      • Express gratitude to your sponsors at the beginning and end of the meetup. Acknowledging their support encourages continued collaboration and enhances the credibility of your event.

    Communications and marketing

    Effectively marketing and announcing your Modular Meetup is essential for attracting attendees and ensuring a successful event.

    1. Plan your announcement
      • Announce your meetup at least two weeks prior. This gives your audience ample time to prepare and increases the likelihood of their attendance.
    2. Utilize Celestia Labs' resources
      • Celestia Labs can help co-promote your meetup on social media and Discord. They can also add your event to their online calendar, email local contacts, and share the event via their Developer Relations Team on Twitter. Don't hesitate to reach out to them for assistance.
    3. Share on social media
      • Promote your event on Twitter and any other popular social media platforms in your area. Tag speakers, sponsors, and use relevant hashtags to increase visibility.
    4. Leverage local community groups
      • Post your event in local Telegram, Discord, or other community groups relevant to your city. These groups often have many members who may be interested in attending your event.
    5. Engage speakers and the venue
      • Maintain communication with speakers and the venue to ensure any changes can be announced in advance. Trust is critical, so avoid canceling planned meetups whenever possible.
    6. Send reminders via meetup.com (optional)
      • After announcing your event, send a warm invite to your meetup group members through meetup.com. Additionally, send a reminder email one day before the event to encourage attendance.
    7. Share with friends and family
      • Invite your friends, family, and acquaintances to the meetup, as they may help spread the word or know someone interested in the event.
    8. Utilize conference groups
      • If you've attended conferences, share your meetup in the associated Telegram or social media groups, as there may be members nearby who would be interested in attending.

    Recording

    Recording and live-streaming your Modular Meetup can greatly benefit those who cannot attend in person and expand the reach of your event.

    1. Plan for recording
      • Consider recording your meetup to create additional learning resources and share the knowledge with a broader audience.
    2. Consider live-streaming
      • Live-streaming your event on platforms like Twitch, YouTube, or Twitter allows remote participants to watch and engage in the meetup. This can also boost your event's reach and create a sense of inclusion for those who couldn't attend in person.
    3. Coordinate with Celestia Labs
      • Celestia Labs can potentially help cover recording costs and promote recorded meetups. Reach out to them at meetups@celestia.org to discuss available options and support. They can also assist with finding local contacts for recording if you don't have one already.
    4. Utilize available resources
      • If you have a small budget, consider allocating some funds for recording and live-streaming your event. Look for local professionals or affordable equipment rentals to ensure high-quality recordings.
    5. Share recordings on Celestia Labs' channels
      • Celestia Labs can help promote recorded meetups by sharing videos in their meetups playlist on YouTube and hosting them on their website. Ensure you coordinate with Celestia Labs to provide them with the recorded video.
    6. Promote recorded content
      • Share the recordings on your social media channels and meetup group after the event. This helps attendees revisit the content and allows those who couldn't attend to learn from the talks.

    Utilizing Meetup.com platform

    Celestia Labs is committed to supporting your meetup efforts by helping you with meetup.com, from setting up the group to covering organizer dues. Below is a detailed overview of how Celestia Labs can assist you.

    1. Meetup.com organizer dues
      • Celestia Labs is happy to cover organizer dues for meetup.com. To get started, send an email to meetups@celestia.org and let them help you with the process.
    2. Co-organizing existing groups
      • If you already have a meetup.com group but need Celestia Labs' assistance with organizing or covering dues, email meetups@celestia.org to add one of their employees as the Organizer.
    3. Setting up groups on Meetup.com
      • Celestia Labs will help you set up your meetup group, including logos, naming, custom URLs, group description, and other essential details. They provide a unique logo for Celestia Modular Meetups, which you can use for your group.
    4. User group naming
      • Celestia Labs recommends naming your group "Celestia Modular Meetup" to encompass various aspects of the Celestia community and create a consistent brand.
    5. Custom URL for the group
      • Meetup.com allows you to create a custom URL for your user group. Celestia Labs encourages consistent URLs across regions, making it easy for people to find your meetup group.
    6. Group description
      • Celestia Labs has a standard group description to ensure consistency across all meetups. However, if you'd like to customize it, let them know.
    7. New member intake questions
      • To improve the quality of your meetups, Celestia Labs suggests a set of intake questions for new members. The answers can help you better understand their needs and interests, allowing you to plan engaging meetups.
    8. Welcome message
      • Celestia Labs provides a welcome message for new members joining your group. If you'd like to customize this message, let them know.

    Onboarding questions for community members joining a Modular Meetup

    1. Q1: How did you hear about this Modular Meetup?
      • Why: This information helps us understand the most effective channels for recruiting new participants to the meetup.
    2. Q2: What do you hope to gain by participating in this meetup? (e.g., networking, learning about Celestia, learning about Modularity, finding a job, etc.)
      • Why: This information helps us cater to the needs of the user group members. If most attendees are looking for networking opportunities, we can schedule casual meetups alongside informative talks.
    3. Q3: Are you currently using or planning to use Celestia, Rollkit, Celestia’s Node API or any of the rollups deployed on Celestia? Tell us all about it. We will use your response to help us better understand what talks would be most beneficial to the group.
      • Why: Responses to this question help us determine the most relevant talks for the group members. If we discover that most participants are interested in a specific area, we can tailor the talks accordingly.
    4. Q4: We love Celestia and the modular ecosystem, but we also appreciate other Web3 technologies. What other topics would you like to hear about? (e.g., Infrastructure, Data Storage, DID, MEV)
      • Why: Knowing our group participants' interests in other technical areas helps us understand what related topics would be useful and valuable to the group, which in turn helps when recruiting speakers.
    5. Q5: Would you be interested in speaking at a future meetup? We welcome 2-minute lightning talks to 1-hour deep dives. Would you be interested in hosting a meetup? If you answer yes to this question, the group organizers will contact you to follow up.
      • Why: One of the challenges in hosting regular meetups is finding speakers. We hope this question will identify people eager to share their stories and expertise with the group, making the lives of organizers easier.
    + \ No newline at end of file diff --git a/pr-1699/community/modular-meetup-intro.html b/pr-1699/community/modular-meetup-intro.html index e6c5dfb4b9..9f797369ee 100644 --- a/pr-1699/community/modular-meetup-intro.html +++ b/pr-1699/community/modular-meetup-intro.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Celestia Modular Meetup program

    Modular Meetup Banner

    Welcome to the ultimate guide for Modular Meetup organizers! This collection of resources is designed for those enthusiastic about fostering grassroots Modular Meetups with support from Celestia around the world.

    Program description

    The Celestia Modular Meetup Program aims to empower meetup organizers, providing education and support, and encouraging collaboration within the Web3 ecosystem. This rapidly growing community has already achieved incredible success with the first Modular Meetup in Lisbon, and will grow from there.

    Join fellow enthusiasts, engage in enlightening discussions, and make the most of the insightful resources provided. These resources are designed to serve as a go-to playbook for meetup organizers, especially when starting your journey.

    Important info

    Celestia.org Community Code of Conduct

    The purpose of our Community Code of Conduct is to foster an inclusive, welcoming, and supportive environment for everyone participating in Celestia community events. We're all here to learn from each other, expand our skillsets, and enjoy a positive experience together.

    All meetup attendees, speakers, sponsors, and volunteers, including the event organizing team, are kindly asked to adhere to the following Code of Conduct. Organizers will respectfully enforce this code throughout the event. We genuinely appreciate the cooperation of all participants in maintaining a safe and empowering space for everyone.

    Signup form

    To become part of the program, please complete the registration form.

    Following the review and approval of your submission, you will receive an email confirmation and an invitation to participate in the upcoming Modular Meetup call. Furthermore, you will be granted access to the exclusive Discord channel labeled "#modular-meetup" on our Discord server. Please take note that joining our Discord is a prerequisite for channel access. It's essential to recognize that this program is tailored for dedicated organizers with a genuine interest in nurturing their local modular ecosystem community.

    Emails

    As a participant in the Celestia Modular Meetup Program, you can expect to receive the following emails:

    1. Welcome email with links to calendar events and Discord channel
    2. Monthly Catch-up call invites
    3. Recap emails with notes from calls

    Discord

    Your active participation is key to unlocking the full potential of this vibrant community. Our primary communication tool is Discord, providing an engaging platform to connect with fellow organizers:

    Materials

    As a meetup organizer, you'll gain access to the Celestia Modular Meetup Program's list of resources. This collection should become your trusted companion in organizing events. Drawing upon the wisdom of seasoned event organizers, this resource is available for you and your co-organizers to explore and learn.

    - +

    Celestia Modular Meetup program

    Modular Meetup Banner

    Welcome to the ultimate guide for Modular Meetup organizers! This collection of resources is designed for those enthusiastic about fostering grassroots Modular Meetups with support from Celestia around the world.

    Program description

    The Celestia Modular Meetup Program aims to empower meetup organizers, providing education and support, and encouraging collaboration within the Web3 ecosystem. This rapidly growing community has already achieved incredible success with the first Modular Meetup in Lisbon, and will grow from there.

    Join fellow enthusiasts, engage in enlightening discussions, and make the most of the insightful resources provided. These resources are designed to serve as a go-to playbook for meetup organizers, especially when starting your journey.

    Important info

    Celestia.org Community Code of Conduct

    The purpose of our Community Code of Conduct is to foster an inclusive, welcoming, and supportive environment for everyone participating in Celestia community events. We're all here to learn from each other, expand our skillsets, and enjoy a positive experience together.

    All meetup attendees, speakers, sponsors, and volunteers, including the event organizing team, are kindly asked to adhere to the following Code of Conduct. Organizers will respectfully enforce this code throughout the event. We genuinely appreciate the cooperation of all participants in maintaining a safe and empowering space for everyone.

    Signup form

    To become part of the program, please complete the registration form.

    Following the review and approval of your submission, you will receive an email confirmation and an invitation to participate in the upcoming Modular Meetup call. Furthermore, you will be granted access to the exclusive Discord channel labeled "#modular-meetup" on our Discord server. Please take note that joining our Discord is a prerequisite for channel access. It's essential to recognize that this program is tailored for dedicated organizers with a genuine interest in nurturing their local modular ecosystem community.

    Emails

    As a participant in the Celestia Modular Meetup Program, you can expect to receive the following emails:

    1. Welcome email with links to calendar events and Discord channel
    2. Monthly Catch-up call invites
    3. Recap emails with notes from calls

    Discord

    Your active participation is key to unlocking the full potential of this vibrant community. Our primary communication tool is Discord, providing an engaging platform to connect with fellow organizers:

    Materials

    As a meetup organizer, you'll gain access to the Celestia Modular Meetup Program's list of resources. This collection should become your trusted companion in organizing events. Drawing upon the wisdom of seasoned event organizers, this resource is available for you and your co-organizers to explore and learn.

    + \ No newline at end of file diff --git a/pr-1699/community/modular-meetup-toolkit.html b/pr-1699/community/modular-meetup-toolkit.html index 00541a74c4..061639dfd4 100644 --- a/pr-1699/community/modular-meetup-toolkit.html +++ b/pr-1699/community/modular-meetup-toolkit.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Modular Meetup Toolkit

    Welcome to the Modular Meetups Toolkit! This kit is designed to help you run successful meetups for the Celestia community. As the first modular blockchain, Celestia offers a lot to discuss and explore. This kit includes useful resources and materials to help you plan and execute your meetups effectively.

    Celestia branding guidelines

    • Brand kit
      1. Includes logo files, color schemes, typography, icons and illustrations

    Sample “Introduction to Modularity” workshop presentation

    • Sample presentation - introduction to modularity
    • Summary: This is an overview presentation on Modular blockchains and dives deep into Celestia core technologies.
    • The sample presentation covers:
      1. What are modular blockchains?
      2. The benefits of modular over monolithic blockchains
      3. Introduction to Celestia: The first modular blockchain
      4. The concept of Data Availability Sampling
      5. Sovereign Rollups
      6. Q&A session

    Sample “Run a Celestia light node” workshop presentation

    • Sample presentation - run a light node
    • Summary: This is an overview presentation goes over running a Celestia light node. You can find existing video presentations for this here:
    • The sample presentation covers:
      1. What is a Celestia light node?
      2. The role of light nodes in the Celestia ecosystem
      3. Setting up a light node: hardware and software requirements
      4. Step-by-step guide on how to run a Celestia light node
      5. Troubleshooting common issues
      6. Best practices for maintaining a light node
      7. Q&A session

    Sample “Deploy a Sovereign Rollup” workshop presentation

    • Sample presentation - deploy a sovereign rollup
    • Summary: This is an overview presentation on deploying a sovereign rollup with Rollkit on Celestia. You can find existing video presentations for this here:
    • The sample presentation covers:
      1. What is a sovereign rollup?
      2. The role of sovereign rollups in the Celestia ecosystem
      3. Introduction to Rollkit
      4. Setting up a sovereign rollup: hardware and software requirements
      5. Q&A session

    Sample “Modular Meetup Introduction” workshop presentation

    Swag logistics

    With this Modular Meetups Organizer Kit, you’ll have everything you need to plan and execute engaging, informative, and successful meetups for the Celestia community. Happy organizing!

    - +

    Modular Meetup Toolkit

    Welcome to the Modular Meetups Toolkit! This kit is designed to help you run successful meetups for the Celestia community. As the first modular blockchain, Celestia offers a lot to discuss and explore. This kit includes useful resources and materials to help you plan and execute your meetups effectively.

    Celestia branding guidelines

    • Brand kit
      1. Includes logo files, color schemes, typography, icons and illustrations

    Sample “Introduction to Modularity” workshop presentation

    • Sample presentation - introduction to modularity
    • Summary: This is an overview presentation on Modular blockchains and dives deep into Celestia core technologies.
    • The sample presentation covers:
      1. What are modular blockchains?
      2. The benefits of modular over monolithic blockchains
      3. Introduction to Celestia: The first modular blockchain
      4. The concept of Data Availability Sampling
      5. Sovereign Rollups
      6. Q&A session

    Sample “Run a Celestia light node” workshop presentation

    • Sample presentation - run a light node
    • Summary: This is an overview presentation goes over running a Celestia light node. You can find existing video presentations for this here:
    • The sample presentation covers:
      1. What is a Celestia light node?
      2. The role of light nodes in the Celestia ecosystem
      3. Setting up a light node: hardware and software requirements
      4. Step-by-step guide on how to run a Celestia light node
      5. Troubleshooting common issues
      6. Best practices for maintaining a light node
      7. Q&A session

    Sample “Deploy a Sovereign Rollup” workshop presentation

    • Sample presentation - deploy a sovereign rollup
    • Summary: This is an overview presentation on deploying a sovereign rollup with Rollkit on Celestia. You can find existing video presentations for this here:
    • The sample presentation covers:
      1. What is a sovereign rollup?
      2. The role of sovereign rollups in the Celestia ecosystem
      3. Introduction to Rollkit
      4. Setting up a sovereign rollup: hardware and software requirements
      5. Q&A session

    Sample “Modular Meetup Introduction” workshop presentation

    Swag logistics

    With this Modular Meetups Organizer Kit, you’ll have everything you need to plan and execute engaging, informative, and successful meetups for the Celestia community. Happy organizing!

    + \ No newline at end of file diff --git a/pr-1699/community/overview.html b/pr-1699/community/overview.html index 0a3772c534..94a6aeaa6d 100644 --- a/pr-1699/community/overview.html +++ b/pr-1699/community/overview.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Community overview

    This section will highlight all the different resources and activities for the Celestia community.

    Here you will find links to our community calendar, Code of Conduct and other community-related resources.

    - +

    Community overview

    This section will highlight all the different resources and activities for the Celestia community.

    Here you will find links to our community calendar, Code of Conduct and other community-related resources.

    + \ No newline at end of file diff --git a/pr-1699/community/speaker-list.html b/pr-1699/community/speaker-list.html index 748d772452..d386a3ab83 100644 --- a/pr-1699/community/speaker-list.html +++ b/pr-1699/community/speaker-list.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Speaker list

    As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.

    The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.

    By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.

    You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.

    - +

    Speaker list

    As a Modular Meetup organizer, we understand the importance of delivering engaging and informative content to your attendees. That's why we've created an exclusive Speaker List specifically tailored for organizers participating in the Modular Meetup Program. This resource gives you access to a curated selection of top-tier speakers who are passionate about Celestia and the modular ecosystem. Due to privacy, the list is not shared publicly but is accessible to participants of the Modular Meetup program when they create a meetup.

    The Speaker List features experts from Celestia Labs, as well as prominent figures from the broader Celestia and modular communities. Each individual is well-versed in various aspects of the modular ecosystem, ensuring that your meetup attendees gain valuable insights and deepen their understanding of modular blockchains.

    By joining the Modular Meetup Program, you can enjoy the benefits of our Speaker List and bring a touch of expertise to your events. The speakers can participate either in person or virtually, depending on location and timing.

    You can expect benefits from the Speaker List including high-quality presentations, interactive Q&A sessions, and knowledge-sharing opportunities facilitated by the best and brightest in the Celestia ecosystem. With our Speaker List, you'll be able to create memorable and impactful Modular Meetups that foster genuine connections and promote growth within the community.

    + \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-bridge.html b/pr-1699/developers/arbitrum-bridge.html index 1e6dc4e428..d764c3c888 100644 --- a/pr-1699/developers/arbitrum-bridge.html +++ b/pr-1699/developers/arbitrum-bridge.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Bridging in and out of your Orbit rollup

    This guide covers how to bridge in (deposit) and bridge out (withdrawal) from your Arbitrum Orbit L3 rollup.

    This guide will cover bridging in and out of your Orbit rollup.

    Below are two example transactions, one of a deposit and one of a withdrawal:

    bridge-overview-deposit-and-withdrawal-l3

    Bridge in (deposit) to your rollup

    Step 1: Add your custom chain config

    (1a) In the Arbitrum Bridge UI, click the menu dropdown in the top right. Select Settings.

    bridge-settings

    (1b) Under Developer Mode, select Turn on testnet mode. Add your custom chain config from outputInfo.json in the root of your orbit-setup-script directory.

    add-testnet-orbit-chain

    (1c) You'll then see the chain under Live Orbit Chains:

    live-orbit-chains

    Step 2: Deposit to your Orbit rollup

    (2a) Choose an amount of Arbitrum Sepolia ETH to bridge into your rollup. Click Move funds to <YOUR_ROLLUP_NAME>, in this case Move funds to Arbitrum L3 Rollup. Approve the transaction in your wallet.

    bridge-in-start

    (2b) You'll then see it load in the Pending transactions tab:

    bridge-in-pending

    (2c) Shortly after, in the Settled transactions tab you can see the transaction status. Click Success.

    bridge-in-settled-txs

    (2d) View the transaction on your local instance of Blockscout for your rollup:

    bridge-in-explorer-rollup-tx

    (2e) Optionally, click See Details for an overview of your deposit:

    bridge-in-success

    (2f) From the details page, you can also see the transaction for your deposit on Arbitrum Sepolia:

    bridge-in-sepolia-tx-explorer

    Bridge out (withdrawal) from your rollup

    Step 1: Choose an amount to withdraw from your rollup

    (1a) In the Arbitrum Bridge UI, choose your origin chain to your Arbitrum L3 Rollup and the destination chain as Arbitrum Sepolia.

    bridge-out-small-screenshot

    (1b) Click Move funds to Arbitrum Sepolia and read the disclaimer, check the boxes, and click Continue.

    bridge-out-begin

    (1c) Optionally, set a reminder on your calendar so you don't forget.

    (1d) After approving the transaction in your wallet, you'll be able to see the transaction in the Pending transactions tab:

    bridge-out-pending

    After approximately two hours, you will be able to proceed to Step 2: Claim your withdrawal.

    (1e) Click See details to see an overview of your withdrawal:

    bridge-out-begin-overview

    (1f) Optionally, view the transaction on your local explorer.

    bridge-out-tx-details

    (1g) To learn more about what is going on, click the Logs tab:

    bridge-out-logs-details-1

    bridge-out-logs-explorer-2

    Step 2: Claim your withdrawal

    After approximately 2 hours, you will be able to claim your withdrawal.

    (2a) Head back to the bridge UI and you will have a notification to claim your withdrawal. Click Claim in the details of the transaction:

    bridge-out-claim-withdrawal

    (2b) Approve the transaction in your wallet.

    (2c) After your transaction goes through, you can see the details in the bridge UI under Settled transactions:

    bridge-out-claim-success-withdrawal

    - +

    Bridging in and out of your Orbit rollup

    This guide covers how to bridge in (deposit) and bridge out (withdrawal) from your Arbitrum Orbit L3 rollup.

    This guide will cover bridging in and out of your Orbit rollup.

    Below are two example transactions, one of a deposit and one of a withdrawal:

    bridge-overview-deposit-and-withdrawal-l3

    Bridge in (deposit) to your rollup

    Step 1: Add your custom chain config

    (1a) In the Arbitrum Bridge UI, click the menu dropdown in the top right. Select Settings.

    bridge-settings

    (1b) Under Developer Mode, select Turn on testnet mode. Add your custom chain config from outputInfo.json in the root of your orbit-setup-script directory.

    add-testnet-orbit-chain

    (1c) You'll then see the chain under Live Orbit Chains:

    live-orbit-chains

    Step 2: Deposit to your Orbit rollup

    (2a) Choose an amount of Arbitrum Sepolia ETH to bridge into your rollup. Click Move funds to <YOUR_ROLLUP_NAME>, in this case Move funds to Arbitrum L3 Rollup. Approve the transaction in your wallet.

    bridge-in-start

    (2b) You'll then see it load in the Pending transactions tab:

    bridge-in-pending

    (2c) Shortly after, in the Settled transactions tab you can see the transaction status. Click Success.

    bridge-in-settled-txs

    (2d) View the transaction on your local instance of Blockscout for your rollup:

    bridge-in-explorer-rollup-tx

    (2e) Optionally, click See Details for an overview of your deposit:

    bridge-in-success

    (2f) From the details page, you can also see the transaction for your deposit on Arbitrum Sepolia:

    bridge-in-sepolia-tx-explorer

    Bridge out (withdrawal) from your rollup

    Step 1: Choose an amount to withdraw from your rollup

    (1a) In the Arbitrum Bridge UI, choose your origin chain to your Arbitrum L3 Rollup and the destination chain as Arbitrum Sepolia.

    bridge-out-small-screenshot

    (1b) Click Move funds to Arbitrum Sepolia and read the disclaimer, check the boxes, and click Continue.

    bridge-out-begin

    (1c) Optionally, set a reminder on your calendar so you don't forget.

    (1d) After approving the transaction in your wallet, you'll be able to see the transaction in the Pending transactions tab:

    bridge-out-pending

    After approximately two hours, you will be able to proceed to Step 2: Claim your withdrawal.

    (1e) Click See details to see an overview of your withdrawal:

    bridge-out-begin-overview

    (1f) Optionally, view the transaction on your local explorer.

    bridge-out-tx-details

    (1g) To learn more about what is going on, click the Logs tab:

    bridge-out-logs-details-1

    bridge-out-logs-explorer-2

    Step 2: Claim your withdrawal

    After approximately 2 hours, you will be able to claim your withdrawal.

    (2a) Head back to the bridge UI and you will have a notification to claim your withdrawal. Click Claim in the details of the transaction:

    bridge-out-claim-withdrawal

    (2b) Approve the transaction in your wallet.

    (2c) After your transaction goes through, you can see the details in the bridge UI under Settled transactions:

    bridge-out-claim-success-withdrawal

    + \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-dapp-deploy.html b/pr-1699/developers/arbitrum-dapp-deploy.html index 4469278a09..ccbe10b6fd 100644 --- a/pr-1699/developers/arbitrum-dapp-deploy.html +++ b/pr-1699/developers/arbitrum-dapp-deploy.html @@ -11,7 +11,7 @@ - + @@ -58,8 +58,8 @@ cast send --private-key $PRIVATE_KEY $RECEIVER --value 1ether --rpc-url $ARB_RPC_URL
    export RECEIVER=<receiver ETH address>
     cast send --private-key $PRIVATE_KEY $RECEIVER --value 1ether --rpc-url $ARB_RPC_URL

    TIP

    If you are in a different terminal than the one you set the private key in, you may need to set it again.

Update the frontend

Next, you will need to update a few things before you can interact with the contract on the frontend:

  1. Change the contract address on gm-portal/frontend/src/App.tsx to your contract address
  2. Match the chain info on gm-portal/frontend/src/main.tsx with the chain config of your L2
  3. If you changed the contract, update the ABI in gm-portal/frontend/GmPortal.json from gm-portal/contracts/out/GmPortal.sol/GmPortal.json. This can be done with:
bash
cd $HOME
 cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend
cd $HOME
-cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend

Interact with the frontend

Now, login with your wallet that you funded, and post a GM on your GM portal!

gm-arb

- +cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend

Interact with the frontend

Now, login with your wallet that you funded, and post a GM on your GM portal!

gm-arb

+ \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-deploy.html b/pr-1699/developers/arbitrum-deploy.html index a77933091b..38756dab9f 100644 --- a/pr-1699/developers/arbitrum-deploy.html +++ b/pr-1699/developers/arbitrum-deploy.html @@ -11,7 +11,7 @@ - + @@ -148,8 +148,8 @@ Executor has been added to chain owners on TX: 0x97b50f60b60d0e658fdbf185969db0a0327bd0ae9e57cd65af2a7f9be0eeb5b0 Executing removeChainOwner through the UpgradeExecutor contract Transaction complete, rollup owner removed from chain owners on TX: 0x019850732270d8c436585c7921219252422228b5d0f559da0da219f0fa2b7216 - Done in 58.49s.

Find your PFB on Celenium by looking at the namespace or account you posted from.

See an example blob that was posted while making this guide.

Congratulations with Celestia underneath

Your local Orbit rollup is now running. You'll see an outputInfo.json file in the main directory of your script folder - this contains more information about your chain, including the addresses of your chain's base contracts.

In the next guides, learn how to run a full and validating full node or bridge in and out of your rollup.

Appendix

Extra resources in Arbitrum documentation:

Compatibility matrix

ComponentVersionDetails
Nitrov2.3.1-rc.1Includes the replay binary for the WASM root 0x10c65b27d5031ce2351c719072e58f3153228887f027f9f6d65300d2b5b30152. Read the overview for overall changes.
Contractsv1.2.1-celestiaIntegrates Blobstream X functionality into nitro-contracts v1.2.1
Orbit SDKv0.8.2 Orbit SDK for Celestia DAThis is not compatible with Orbit SDK v0.8.2 or with the latest changes to nitro-contracts for the Atlas upgrade. The Orbit SDK itself is in Alpha.
celestia-nodev0.13.1This integration has only been tested with celestia-node 0.13.1 and only works with said version, and with future versions after that. Under the hood, the Nitro node uses this commit of celestia-openrpc.

Blobstream X contract deployments

The Orbit contracts depend on the following Blobstream X deployments. The current deployments, which can be found at 0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2 in both chains, relays headers from the Mocha-4 testnet to the chains below:

Arbitrum Sepolia

Base Sepolia

Arbitrum Sepolia additional deployments

ContractAddress
Bridge0x95FEA00e689e8D1CBa909836E1Ef1b941D5f21b1
SequencerInbox0x95CBDa89325db5529eAF1813E181f66B83A7d65a
Inbox0x3681Cbb0E95AB50b63F2FC524FbBcC78adEfBd33
RollupEventInbox0x61e154128b6a1400ea8090B4431B4aA1DBb80Cc4
Outbox0x5187a92539bB4A2befe1fc078745c84AB6d37171
ERC20Bridge0xD0a6699Fc7519966685181c80BF98D35aFa1fC95
SequencerInbox0x2588867F19E2DE51f90F0aB852C7Ad11228e3d83
ERC20Inbox0x6cB49605f10831749c6090AD09918bC61439bacE
ERC20RollupEventInbox0x7fC4D9A24949680faD666FeEe7cD6a100E39C4F0
ERC20Outbox0xA773e19DC9e822933A7e72Df9c87eD1578701D29
BridgeCreator0x3Bc040EAca40b91FA06cf55Ea91842FaC88b1AF4
OneStepProver00x5810F0916BAE1067Ca1efcc00AaaF30301af001c
OneStepProverMemory0xaC3427E621C6F10dC2ABdAB00188D92690503914
OneStepProverMath0xFB612fb83959b8ACD3E49540B29C93c5A67e05f1
OneStepProverHostIo0x630093954CbF19Fe4532A2edD0bD3B10dEcA7A4D
OneStepProofEntry0x53DEA3A90Fd6C82840a1f7224F799D622f142Df4
ChallengeManager0x01B5905B154F21a393F5B5a0C6d15B53a493C05e
RollupAdminLogic0xe371AFcb8437bF61bd831EF57Be7A2496D88488B
RollupUserLogic0xE24a60b758b51b0a3dA5E8F4F6ddf1cd0aFF646C
ValidatorUtils0x7973D0b475E898082dF25c1617CBce1917cFED17
ValidatorWalletCreator0xe2662ff9b41f39e63A850E50E013Ea66e60A4F37
RollupCreator0x79751B011BCc20F413a2c4E3AF019b6E2a9738B9
DeployHelper0xd2D353916B34a877793628049c99858f04123eE1

Base Sepolia additional deployments

ContractAddress
Bridge0xb6052122545AACD2BDda0Ca9FA56416bD968cDbc
SequencerInbox0xcd9FCa5015b5ce2B06a2266e4a5dd54D9ca39F1a
Inbox0x44B412b291fEf00398501B2cA353EA912AD0fe13
RollupEventInbox0x51D196e07a27DBA0F4461Dd6CC26108424F196f7
Outbox0x5A48aDf22f526eBD06e3e8856cFEa2490923CC55
ERC20Bridge0x9abC41fEfAe7E7543a01FA837AeC909F96147280
SequencerInbox0x8f97Cb7c643Acd7f79f3B13841b24a243dA51242
ERC20Inbox0x40f8c63e0a20B399bCd9631A22E57BB988a9400e
ERC20RollupEventInbox0x3B6e845fb9f0c8Ee4E9F6D44781f6547d9c6359a
ERC20Outbox0xc99eEA0B8e67D5b2226AB6D37882DAAf6dd7593b
BridgeCreator0xC7535F078CB3880a0FD5E54FA7A3B4EAf09b3924
OneStepProver00xf889a3174Fddd9f78E6cd250Ebf4c16F1bDd1b6a
OneStepProverMemory0x61254e43e5c1e9E801F9C56B47a9ac3EADF6d1E9
OneStepProverMath0x55527d53fdA37Dbf1924482b40AcF8625E1cAA5B
OneStepProverHostIo0x03B43F7B61Fa100611191F481Ef48aa1fc98F434
OneStepProofEntry0x89b7c7970c13BB587893a70697AD6d2A335b6A15
ChallengeManager0x04CAe899Fc0B7Ef45c529f8Bf075D54F6fB70eD9
RollupAdminLogic0x99E9D2F04352B42C18F1DA5Dd93a970F82C08aFe
RollupUserLogic0x1ae3A8DC1e7eFD37F418B2987D3DF74c5a917a8B
ValidatorUtils0x1cc4551922C069A9aDE06756BF14bF0410eA44fF
ValidatorWalletCreator0x78f8B2941ddE5a8A312814Ebd29c2E2A36f25E91
RollupCreator0x1Bb8ADd5e878b12Fa37756392642eB94C53A1Cf4
DeployHelper0x20d8153AaCC4E6D29558fa3916BfF422BEDE9B5E
- + Done in 58.49s.

Find your PFB on Celenium by looking at the namespace or account you posted from.

See an example blob that was posted while making this guide.

Congratulations with Celestia underneath

Your local Orbit rollup is now running. You'll see an outputInfo.json file in the main directory of your script folder - this contains more information about your chain, including the addresses of your chain's base contracts.

In the next guides, learn how to run a full and validating full node or bridge in and out of your rollup.

Appendix

Extra resources in Arbitrum documentation:

Compatibility matrix

ComponentVersionDetails
Nitrov2.3.1-rc.1Includes the replay binary for the WASM root 0x10c65b27d5031ce2351c719072e58f3153228887f027f9f6d65300d2b5b30152. Read the overview for overall changes.
Contractsv1.2.1-celestiaIntegrates Blobstream X functionality into nitro-contracts v1.2.1
Orbit SDKv0.8.2 Orbit SDK for Celestia DAThis is not compatible with Orbit SDK v0.8.2 or with the latest changes to nitro-contracts for the Atlas upgrade. The Orbit SDK itself is in Alpha.
celestia-nodev0.13.1This integration has only been tested with celestia-node 0.13.1 and only works with said version, and with future versions after that. Under the hood, the Nitro node uses this commit of celestia-openrpc.

Blobstream X contract deployments

The Orbit contracts depend on the following Blobstream X deployments. The current deployments, which can be found at 0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2 in both chains, relays headers from the Mocha-4 testnet to the chains below:

Arbitrum Sepolia

Base Sepolia

Arbitrum Sepolia additional deployments

ContractAddress
Bridge0x95FEA00e689e8D1CBa909836E1Ef1b941D5f21b1
SequencerInbox0x95CBDa89325db5529eAF1813E181f66B83A7d65a
Inbox0x3681Cbb0E95AB50b63F2FC524FbBcC78adEfBd33
RollupEventInbox0x61e154128b6a1400ea8090B4431B4aA1DBb80Cc4
Outbox0x5187a92539bB4A2befe1fc078745c84AB6d37171
ERC20Bridge0xD0a6699Fc7519966685181c80BF98D35aFa1fC95
SequencerInbox0x2588867F19E2DE51f90F0aB852C7Ad11228e3d83
ERC20Inbox0x6cB49605f10831749c6090AD09918bC61439bacE
ERC20RollupEventInbox0x7fC4D9A24949680faD666FeEe7cD6a100E39C4F0
ERC20Outbox0xA773e19DC9e822933A7e72Df9c87eD1578701D29
BridgeCreator0x3Bc040EAca40b91FA06cf55Ea91842FaC88b1AF4
OneStepProver00x5810F0916BAE1067Ca1efcc00AaaF30301af001c
OneStepProverMemory0xaC3427E621C6F10dC2ABdAB00188D92690503914
OneStepProverMath0xFB612fb83959b8ACD3E49540B29C93c5A67e05f1
OneStepProverHostIo0x630093954CbF19Fe4532A2edD0bD3B10dEcA7A4D
OneStepProofEntry0x53DEA3A90Fd6C82840a1f7224F799D622f142Df4
ChallengeManager0x01B5905B154F21a393F5B5a0C6d15B53a493C05e
RollupAdminLogic0xe371AFcb8437bF61bd831EF57Be7A2496D88488B
RollupUserLogic0xE24a60b758b51b0a3dA5E8F4F6ddf1cd0aFF646C
ValidatorUtils0x7973D0b475E898082dF25c1617CBce1917cFED17
ValidatorWalletCreator0xe2662ff9b41f39e63A850E50E013Ea66e60A4F37
RollupCreator0x79751B011BCc20F413a2c4E3AF019b6E2a9738B9
DeployHelper0xd2D353916B34a877793628049c99858f04123eE1

Base Sepolia additional deployments

ContractAddress
Bridge0xb6052122545AACD2BDda0Ca9FA56416bD968cDbc
SequencerInbox0xcd9FCa5015b5ce2B06a2266e4a5dd54D9ca39F1a
Inbox0x44B412b291fEf00398501B2cA353EA912AD0fe13
RollupEventInbox0x51D196e07a27DBA0F4461Dd6CC26108424F196f7
Outbox0x5A48aDf22f526eBD06e3e8856cFEa2490923CC55
ERC20Bridge0x9abC41fEfAe7E7543a01FA837AeC909F96147280
SequencerInbox0x8f97Cb7c643Acd7f79f3B13841b24a243dA51242
ERC20Inbox0x40f8c63e0a20B399bCd9631A22E57BB988a9400e
ERC20RollupEventInbox0x3B6e845fb9f0c8Ee4E9F6D44781f6547d9c6359a
ERC20Outbox0xc99eEA0B8e67D5b2226AB6D37882DAAf6dd7593b
BridgeCreator0xC7535F078CB3880a0FD5E54FA7A3B4EAf09b3924
OneStepProver00xf889a3174Fddd9f78E6cd250Ebf4c16F1bDd1b6a
OneStepProverMemory0x61254e43e5c1e9E801F9C56B47a9ac3EADF6d1E9
OneStepProverMath0x55527d53fdA37Dbf1924482b40AcF8625E1cAA5B
OneStepProverHostIo0x03B43F7B61Fa100611191F481Ef48aa1fc98F434
OneStepProofEntry0x89b7c7970c13BB587893a70697AD6d2A335b6A15
ChallengeManager0x04CAe899Fc0B7Ef45c529f8Bf075D54F6fB70eD9
RollupAdminLogic0x99E9D2F04352B42C18F1DA5Dd93a970F82C08aFe
RollupUserLogic0x1ae3A8DC1e7eFD37F418B2987D3DF74c5a917a8B
ValidatorUtils0x1cc4551922C069A9aDE06756BF14bF0410eA44fF
ValidatorWalletCreator0x78f8B2941ddE5a8A312814Ebd29c2E2A36f25E91
RollupCreator0x1Bb8ADd5e878b12Fa37756392642eB94C53A1Cf4
DeployHelper0x20d8153AaCC4E6D29558fa3916BfF422BEDE9B5E
+ \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-full-node.html b/pr-1699/developers/arbitrum-full-node.html index 9126a407d5..532ce01c15 100644 --- a/pr-1699/developers/arbitrum-full-node.html +++ b/pr-1699/developers/arbitrum-full-node.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@

Running a full node and/or validator

Prerequisites

Running a full node

To run a full node, you can follow the steps outlined in the Arbitrum docs, with the difference being that you will use this image: dfcelestia/nitro-node-dev:latest instead of the one mentioned in the Arbitrum docs.

Note that you can either use the flags in the nitro binary + the flags found in the celestia package, or you can just provide a node config.json file with the celestia-cfg for them to run it, which would look something like this:

json
docker run --rm -v "$HOME/Documents/configs/nodeConfig.json:/config.json:ro" \
   --network host celestia-nitro:v2.3.1-rc.1 --conf.file /config.json
docker run --rm -v "$HOME/Documents/configs/nodeConfig.json:/config.json:ro" \
-  --network host celestia-nitro:v2.3.1-rc.1 --conf.file /config.json

Running a full node with validation

The information above applies to the steps outlined to run a validating full node (validator).

Finally, note that this will require connection to a DA node, and we recommend running a Bridge node if you will be instantiating multiple rollups.

- + --network host celestia-nitro:v2.3.1-rc.1 --conf.file /config.json

Running a full node with validation

The information above applies to the steps outlined to run a validating full node (validator).

Finally, note that this will require connection to a DA node, and we recommend running a Bridge node if you will be instantiating multiple rollups.

+ \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-integration.html b/pr-1699/developers/arbitrum-integration.html index da8ff18b50..3b5c71907c 100644 --- a/pr-1699/developers/arbitrum-integration.html +++ b/pr-1699/developers/arbitrum-integration.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Introduction to Arbitrum rollups with Celestia as DA

Celestia_Arbitrum

Overview

The integration of Celestia with Arbitrum Orbit and the Nitro tech stack marks the first external contribution to the Arbitrum Orbit protocol layer, offering developers an additional option for selecting a data availability layer alongside Arbitrum AnyTrust. The integration allows developers to deploy an Orbit Chain that uses Celestia for data availability and settles on Arbitrum One, Ethereum, or other EVM chains.

Learn more about Orbit in Arbitrum's introduction.

Key components

The integration of Celestia with Arbitrum orbit is possible thanks to 3 key components:

Additionally, the Ethereum fallback mechanism is a feature of the integration, which is native in Nitro.

DA provider implementation

The Arbitrum Nitro code has a DataAvailabilityProvider interface that is used across the codebase to store and retrieve data from a specific provider (eip4844 blobs, Anytrust, and now Celestia).

This integration implements the DataAvailabilityProvider interface for Celestia DA

Additionally, this integration comes with the necessary code for a Nitro chain node to post and retrieve data from Celestia.

The core logic behind posting and retrieving data happens in celestia.go where data is stored on Celestia and serialized into a small batch of data that gets published once the necessary range of headers (data roots) has been relayed to the BlobstreamX contract. Then the Read logic takes care of taking the deserialized Blob Pointer struct and consuming it in order to fetch the data from Celestia and additionally inform the fetcher about the position of the data on Celestia (we'll get back to this in the next section).

The following represents a non-exhaustive list of considerations when running a Batch Poster node for a chain with Celestia underneath:

  • You will need to use a consensus node RPC endpoint, you can find a list of them for Mocha
  • The Batch Poster will only post a Celestia batch to the underlying chain if the height for which it posted is in a recent range in BlobstreamX and if the verification succeeds, otherwise it will discard the batch. Since it will wait until a range is relayed, it can take several minutes for a batch to be posted, but one can always make an on-chain request for the BlobstreamX contract to relay a header promptly.

The following represents a non-exhaustive list of considerations when running a Nitro node for a chain with Celestia underneath:

  • The TendermintRpc endpoint is only needed by the batch poster, every other node can operate without a connection to a full node.
  • The message header flag for Celestia batches is 0x0c.
  • You will need to know the namespace for the chain that you are trying to connect to, but don't worry if you don't find it, as the information in the BlobPointer can be used to identify where a batch of data is in the Celestia Data Square for a given height, and thus can be used to find out the namespace as well!

Preimage Oracle Implementation

In order to support fraud proofs, this integration has the necessary code for a Nitro validator to populate its preimage mapping with Celestia hashes that then get "unpealed" in order to reveal the full data for a Blob. You can read more about the "Hash Oracle Trick".

The data structures and hashing functions for this can be found in the nitro/das/celestia/tree folder

You can see where the preimage oracle gets used in the fraud proof replay binary here

Something important to note is that the preimage oracle only keeps track of hashes for the rows in the Celestia data square in which a blob resides in, this way each Orbit chain with Celestia underneath does not need validators to recompute an entire Celestia Data Square, but instead, only have to compute the row roots for the rows in which it's data lives in, and the header data root, which is the binary merkle tree hash built using the row roots and column roots fetched from a Celestia node. Because only data roots that can be confirmed on Blobstream get accepted into the sequencer inbox, one can have a high degree of certainty that the canonical data root being unpealed as well as the row roots are in fact correct.

Blobstream X implementation

Finally, the integration only accepts batches with information that can be confirmed on BlobstreamX, which gives us a high certainty that data was made available on Celestia.

You can see how BlobstreamX is integrated into the SequencerInbox.sol contract here, which allows us to discard batches with otherwise faulty data roots, thus giving us a high degree of confidence that the data root can be safely unpacked in case of a challenge.

The Celestia and Arbitrum integration also includes Blobstream, which relays commitments to Celestia’s data root to an onchain light client on Ethereum. This allows L2 solutions that settle on Ethereum to benefit from the scalability Celestia’s data availability layer can provide.

Ethereum fallback mechanism in Nitro

By default in Arbitrum Nitro, the Ethereum fallback mechanism in the BatchPoster function is handling the process of storing data, with a fallback mechanism to store data onchain if the primary data availability storage fails.

The @celestiaorg/nitro integration uses the same fallback mechanism.

More information can be found on the Ethereum fallback mechanisms for Celestia, which enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta.

The fallback logic for Celestia DA is configurable, providing an alternative to the previous default fallback mechanism. Additionally, an ability has been added to the Arbitrum node software which allows the sequencer to call VerifyAttestation to check if a data root has been posted on Blobstream or not, before it sends the sequencer message (data pointer) to the underlying chain.

Next steps

In the next page, learn how to deploy an Arbitrum rollup devnet using Celestia as DA.

- +

Introduction to Arbitrum rollups with Celestia as DA

Celestia_Arbitrum

Overview

The integration of Celestia with Arbitrum Orbit and the Nitro tech stack marks the first external contribution to the Arbitrum Orbit protocol layer, offering developers an additional option for selecting a data availability layer alongside Arbitrum AnyTrust. The integration allows developers to deploy an Orbit Chain that uses Celestia for data availability and settles on Arbitrum One, Ethereum, or other EVM chains.

Learn more about Orbit in Arbitrum's introduction.

Key components

The integration of Celestia with Arbitrum orbit is possible thanks to 3 key components:

Additionally, the Ethereum fallback mechanism is a feature of the integration, which is native in Nitro.

DA provider implementation

The Arbitrum Nitro code has a DataAvailabilityProvider interface that is used across the codebase to store and retrieve data from a specific provider (eip4844 blobs, Anytrust, and now Celestia).

This integration implements the DataAvailabilityProvider interface for Celestia DA

Additionally, this integration comes with the necessary code for a Nitro chain node to post and retrieve data from Celestia.

The core logic behind posting and retrieving data happens in celestia.go where data is stored on Celestia and serialized into a small batch of data that gets published once the necessary range of headers (data roots) has been relayed to the BlobstreamX contract. Then the Read logic takes care of taking the deserialized Blob Pointer struct and consuming it in order to fetch the data from Celestia and additionally inform the fetcher about the position of the data on Celestia (we'll get back to this in the next section).

The following represents a non-exhaustive list of considerations when running a Batch Poster node for a chain with Celestia underneath:

  • You will need to use a consensus node RPC endpoint, you can find a list of them for Mocha
  • The Batch Poster will only post a Celestia batch to the underlying chain if the height for which it posted is in a recent range in BlobstreamX and if the verification succeeds, otherwise it will discard the batch. Since it will wait until a range is relayed, it can take several minutes for a batch to be posted, but one can always make an on-chain request for the BlobstreamX contract to relay a header promptly.

The following represents a non-exhaustive list of considerations when running a Nitro node for a chain with Celestia underneath:

  • The TendermintRpc endpoint is only needed by the batch poster, every other node can operate without a connection to a full node.
  • The message header flag for Celestia batches is 0x0c.
  • You will need to know the namespace for the chain that you are trying to connect to, but don't worry if you don't find it, as the information in the BlobPointer can be used to identify where a batch of data is in the Celestia Data Square for a given height, and thus can be used to find out the namespace as well!

Preimage Oracle Implementation

In order to support fraud proofs, this integration has the necessary code for a Nitro validator to populate its preimage mapping with Celestia hashes that then get "unpealed" in order to reveal the full data for a Blob. You can read more about the "Hash Oracle Trick".

The data structures and hashing functions for this can be found in the nitro/das/celestia/tree folder

You can see where the preimage oracle gets used in the fraud proof replay binary here

Something important to note is that the preimage oracle only keeps track of hashes for the rows in the Celestia data square in which a blob resides in, this way each Orbit chain with Celestia underneath does not need validators to recompute an entire Celestia Data Square, but instead, only have to compute the row roots for the rows in which it's data lives in, and the header data root, which is the binary merkle tree hash built using the row roots and column roots fetched from a Celestia node. Because only data roots that can be confirmed on Blobstream get accepted into the sequencer inbox, one can have a high degree of certainty that the canonical data root being unpealed as well as the row roots are in fact correct.

Blobstream X implementation

Finally, the integration only accepts batches with information that can be confirmed on BlobstreamX, which gives us a high certainty that data was made available on Celestia.

You can see how BlobstreamX is integrated into the SequencerInbox.sol contract here, which allows us to discard batches with otherwise faulty data roots, thus giving us a high degree of confidence that the data root can be safely unpacked in case of a challenge.

The Celestia and Arbitrum integration also includes Blobstream, which relays commitments to Celestia’s data root to an onchain light client on Ethereum. This allows L2 solutions that settle on Ethereum to benefit from the scalability Celestia’s data availability layer can provide.

Ethereum fallback mechanism in Nitro

By default in Arbitrum Nitro, the Ethereum fallback mechanism in the BatchPoster function is handling the process of storing data, with a fallback mechanism to store data onchain if the primary data availability storage fails.

The @celestiaorg/nitro integration uses the same fallback mechanism.

More information can be found on the Ethereum fallback mechanisms for Celestia, which enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta.

The fallback logic for Celestia DA is configurable, providing an alternative to the previous default fallback mechanism. Additionally, an ability has been added to the Arbitrum node software which allows the sequencer to call VerifyAttestation to check if a data root has been posted on Blobstream or not, before it sends the sequencer message (data pointer) to the underlying chain.

Next steps

In the next page, learn how to deploy an Arbitrum rollup devnet using Celestia as DA.

+ \ No newline at end of file diff --git a/pr-1699/developers/arbitrum-smart-contract.html b/pr-1699/developers/arbitrum-smart-contract.html index 74f3c04303..5c354fc8bb 100644 --- a/pr-1699/developers/arbitrum-smart-contract.html +++ b/pr-1699/developers/arbitrum-smart-contract.html @@ -11,7 +11,7 @@ - + @@ -170,8 +170,8 @@ status 1 transactionHash 0x8f15d6004598f0662dd673a9898dceef77be8cc28408cecc284b28d7be32307d transactionIndex 0 -type 2

Now, we can make a read call to view the state of the number variable, using the cast call command:

bash
cast call $CONTRACT_ADDRESS "number()" --rpc-url $ARB_RPC_URL
cast call $CONTRACT_ADDRESS "number()" --rpc-url $ARB_RPC_URL

The result will look similar:

bash
0x000000000000000000000000000000000000000000000000000000000000000a
0x000000000000000000000000000000000000000000000000000000000000000a

Convert the result from hexadecimal to a base 10 value with:

bash
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))

Next steps

Congratulations! You've learned how to deploy a smart contract to your Arbitrum rollup devnet.

What will you build next? In our next tutorial, we will be going over how to deploy a dapp to your Arbitrum rollup.

- +type 2

Now, we can make a read call to view the state of the number variable, using the cast call command:

bash
cast call $CONTRACT_ADDRESS "number()" --rpc-url $ARB_RPC_URL
cast call $CONTRACT_ADDRESS "number()" --rpc-url $ARB_RPC_URL

The result will look similar:

bash
0x000000000000000000000000000000000000000000000000000000000000000a
0x000000000000000000000000000000000000000000000000000000000000000a

Convert the result from hexadecimal to a base 10 value with:

bash
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))

Next steps

Congratulations! You've learned how to deploy a smart contract to your Arbitrum rollup devnet.

What will you build next? In our next tutorial, we will be going over how to deploy a dapp to your Arbitrum rollup.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-contracts.html b/pr-1699/developers/blobstream-contracts.html index dd9232d571..cf8ee87947 100644 --- a/pr-1699/developers/blobstream-contracts.html +++ b/pr-1699/developers/blobstream-contracts.html @@ -11,7 +11,7 @@ - + @@ -124,8 +124,8 @@ ) private pure returns (bool) { return true; } -}

Data structures

Each DataRootTuple is a tuple of block height and data root. It is analogous to a Celestia block header. DataRootTuples are relayed in batches, committed to as a DataRootTuples root (i.e. a Merkle root of DataRootTuples).

The BinaryMerkleProof is an RFC-6962-compliant Merkle proof. Since DataRootTuples are Merkleized in a binary Merkle tree, verifying the inclusion of a DataRootTuple against a DataRootTuples root requires verifying a Merkle inclusion proof.

Interface

The IDAOracle (Data Availability Oracle Interface) interface allows L2 contracts on Ethereum to query the BlobstreamX.sol contract for relayed DataRootTuples. The single interface method verifyAttestation verifies a Merkle inclusion proof that a DataRootTuple is included under a specific batch (indexed by batch nonce). In other words, analogously it verifies that a specific block header is included in the Celestia chain.

Querying the proof

To prove that the data was published to Celestia, check out the proof queries documentation to understand how to query the proofs from Celestia consensus nodes and make them usable in the Blobstream X verifier contract.

Verifying data inclusion for fraud proofs

A high-level overview of how a fraud-proof based L2 would interact with Blobstream can be found in the inclusion proofs documentation.

The DAVerifier library is available at blobstream-contracts/lib/verifier/DAVerifier.sol, and provides functions to verify the inclusion of individual (or multiple) shares against a DataRootTuple. The library is stateless, and allows to pass an IDAOracle interface as a parameter to verify inclusion against it.

In the DAVerifier library, we find functions that help with data inclusion verification and calculating the square size of a Celestia block. These functions work with the Blobstream X smart contract, using different proofs to check and confirm the data's availability. Let's take a closer look at these functions:

  • verifySharesToDataRootTupleRoot: This function verifies that the shares, which were posted to Celestia, were committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the shares were committed to by the rows roots.
  • verifyRowRootToDataRootTupleRoot: This function verifies that a row/column root, from a Celestia block, was committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the row root commits to the data root.
  • verifyMultiRowRootsToDataRootTupleRoot: This function verifies that a set of rows/columns, from a Celestia block, were committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the rows roots commit to the data root.
  • computeSquareSizeFromRowProof: This function computes the Celestia block square size from a row/column root to data root binary Merkle proof. It is the user's responsibility to verify that the proof is valid and was successfully committed to using the verifyRowRootToDataRootTupleRoot() method.
  • computeSquareSizeFromShareProof: This function computes the Celestia block square size from a shares to row/column root proof. It is the user's responsibility to verify that the proof is valid and that the shares were successfully committed to using the verifySharesToDataRootTupleRoot() method.

For an overview of a demo rollup implementation, head to the next section.

- +}

Data structures

Each DataRootTuple is a tuple of block height and data root. It is analogous to a Celestia block header. DataRootTuples are relayed in batches, committed to as a DataRootTuples root (i.e. a Merkle root of DataRootTuples).

The BinaryMerkleProof is an RFC-6962-compliant Merkle proof. Since DataRootTuples are Merkleized in a binary Merkle tree, verifying the inclusion of a DataRootTuple against a DataRootTuples root requires verifying a Merkle inclusion proof.

Interface

The IDAOracle (Data Availability Oracle Interface) interface allows L2 contracts on Ethereum to query the BlobstreamX.sol contract for relayed DataRootTuples. The single interface method verifyAttestation verifies a Merkle inclusion proof that a DataRootTuple is included under a specific batch (indexed by batch nonce). In other words, analogously it verifies that a specific block header is included in the Celestia chain.

Querying the proof

To prove that the data was published to Celestia, check out the proof queries documentation to understand how to query the proofs from Celestia consensus nodes and make them usable in the Blobstream X verifier contract.

Verifying data inclusion for fraud proofs

A high-level overview of how a fraud-proof based L2 would interact with Blobstream can be found in the inclusion proofs documentation.

The DAVerifier library is available at blobstream-contracts/lib/verifier/DAVerifier.sol, and provides functions to verify the inclusion of individual (or multiple) shares against a DataRootTuple. The library is stateless, and allows to pass an IDAOracle interface as a parameter to verify inclusion against it.

In the DAVerifier library, we find functions that help with data inclusion verification and calculating the square size of a Celestia block. These functions work with the Blobstream X smart contract, using different proofs to check and confirm the data's availability. Let's take a closer look at these functions:

  • verifySharesToDataRootTupleRoot: This function verifies that the shares, which were posted to Celestia, were committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the shares were committed to by the rows roots.
  • verifyRowRootToDataRootTupleRoot: This function verifies that a row/column root, from a Celestia block, was committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the row root commits to the data root.
  • verifyMultiRowRootsToDataRootTupleRoot: This function verifies that a set of rows/columns, from a Celestia block, were committed to by the Blobstream X smart contract. It checks that the data root was committed to by the Blobstream X smart contract and that the rows roots commit to the data root.
  • computeSquareSizeFromRowProof: This function computes the Celestia block square size from a row/column root to data root binary Merkle proof. It is the user's responsibility to verify that the proof is valid and was successfully committed to using the verifyRowRootToDataRootTupleRoot() method.
  • computeSquareSizeFromShareProof: This function computes the Celestia block square size from a shares to row/column root proof. It is the user's responsibility to verify that the proof is valid and that the shares were successfully committed to using the verifySharesToDataRootTupleRoot() method.

For an overview of a demo rollup implementation, head to the next section.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-offchain.html b/pr-1699/developers/blobstream-offchain.html index 088f53903b..a1c13492d0 100644 --- a/pr-1699/developers/blobstream-offchain.html +++ b/pr-1699/developers/blobstream-offchain.html @@ -11,7 +11,7 @@ - + @@ -334,8 +334,8 @@ Header: header, }, ) -}

This outline of a Blobstream rollup isn't doing execution or state transitions induced by the transactions, however, that step would occur here. If fraud is detected, the fraud proof process will begin. The only difference between the fraud proof process of a normal optimistic rollup and a rollup that uses Blobstream for DA is that the full node would first prove the fraudulent transaction was committed to by the Sequencer using the Span in the header and before proceeding with the normal process.

More documentation

Proving inclusion via Blobstream

Blobstream inclusion proof docs and the verifier helper contracts.

Submitting block data to Celestia via light node

As linked above, use the Celestia light node RPC to submit the data to Celestia.

Posting headers to Ethereum

How headers are posted to Ethereum is entirely dependent upon how the rollup light client contracts work. For examples of interacting with the Ethereum blockchain programmatically, please see the go-ethereum book or one of the many other resources for submitting transactions or writing contracts.

- +}

This outline of a Blobstream rollup isn't doing execution or state transitions induced by the transactions, however, that step would occur here. If fraud is detected, the fraud proof process will begin. The only difference between the fraud proof process of a normal optimistic rollup and a rollup that uses Blobstream for DA is that the full node would first prove the fraudulent transaction was committed to by the Sequencer using the Span in the header and before proceeding with the normal process.

More documentation

Proving inclusion via Blobstream

Blobstream inclusion proof docs and the verifier helper contracts.

Submitting block data to Celestia via light node

As linked above, use the Celestia light node RPC to submit the data to Celestia.

Posting headers to Ethereum

How headers are posted to Ethereum is entirely dependent upon how the rollup light client contracts work. For examples of interacting with the Ethereum blockchain programmatically, please see the go-ethereum book or one of the many other resources for submitting transactions or writing contracts.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-proof-queries.html b/pr-1699/developers/blobstream-proof-queries.html index 48b2a2b063..e6a9b4ecf2 100644 --- a/pr-1699/developers/blobstream-proof-queries.html +++ b/pr-1699/developers/blobstream-proof-queries.html @@ -11,7 +11,7 @@ - + @@ -64,7 +64,7 @@ if err != nil { ... } - }(trpc)

The <rpc_endpoint> can be retrieved from mainnet for Celestia mainnet beta, and mocha for the Mocha testnet.

In case the reader wants to interact with an on-chain contract that can be used to verify that data was posted to Celestia, the bindings of that contract are needed.

For Blobstream, the golang bindings can be found in the following links:

text
https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
text
https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go
https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go

For other languages, the corresponding smart contract bindings should be generated. Refer to abigen for more information.

Overview of the proof queries

To prove the inclusion of PayForBlobs (PFB) transactions, blobs or shares, committed to in a Celestia block, we use the Celestia consensus node's RPC to query for proofs that can be verified in a rollup settlement contract via Blobstream. In fact, when a PFB transaction is included in a block, it gets separated into a PFB transaction (without the blob), and the actual data blob that it carries. These two are split into shares, which are the low level constructs of a Celestia block, and saved to the corresponding Celestia block. Learn more about shares in the shares specs.

The two diagrams below summarize how a single share, which can contain a PFB transaction, or a part of the rollup data that was posted using a PFB, is committed to in Blobstream.

The share is highlighted in green. R0, R1 etc, represent the respective row and column roots, the blue and pink gradients are erasure encoded data. More details on the square layout can be found in the data square layout and data structures portion of the specs.

The Celestia square

Square

The commitment scheme

Blobstream Commitment Diagram

So to prove inclusion of a share to a Celestia block, we use Blobstream as a source of truth. In a nutshell, Blobstream attests to the data posted to Celestia in the zk-Blobstream contract via verifying a zk-proof of the headers of a batch of Celestia blocks. Then, it keeps reference of that batch of blocks using the merkleized commitment of their (dataRoot, height) resulting in a data root tuple root. Check the above diagram which shows:

  • 0: those are the shares, that when unified, contain the PFB or the rollup data blob.
  • 1: the row and column roots are the namespace merkle tree roots over the shares. More information on the NMT in the NMT specs. These commit to the rows and columns containing the above shares.
  • 2: the data roots: which are the binary merkle tree commitment over the row and column roots. This means that if you can prove that a share is part of a row, using a namespace merkle proof. Then prove that this row is committed to by the data root. Then you can be sure that that share was published to the corresponding block.
  • 3: in order to batch multiple blocks into the same commitment, we create a commitment over the (dataRoot, height) tuple for a batch of blocks, which results in a data root tuple root. It's this commitment that gets stored in the Blobstream smart contract.

So, if we're able to prove:

  • That a share is part of a row, then that row is committed to by a data root.
  • Then, prove that that data root along with its height is committed to by the data root tuple root, which gets saved to the Blobstream contract.

We can be sure that that share was committed to in the corresponding Celestia block.

In this document, we will provide details on how to query the above proofs, and how to adapt them to be sent to a rollup contract for verification.

Hands-on demonstration

This part will provide the details of proof generation, and the way to make the results of the proofs queries ready to be consumed by the target rollup contract.

NOTE

For the go client snippets, make sure to have the following replaces in your go.mod:

go
// go.mod
+	}(trpc)

The <rpc_endpoint> can be retrieved from mainnet for Celestia mainnet beta, and mocha for the Mocha testnet.

In case the reader wants to interact with an on-chain contract that can be used to verify that data was posted to Celestia, the bindings of that contract are needed.

For Blobstream, the golang bindings can be found in the following links:

text
https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
https://github.com/succinctlabs/blobstreamx/blob/main/bindings/BlobstreamX.go
text
https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go
https://github.com/succinctlabs/sp1-blobstream/blob/main/bindings/SP1Blobstream.go

For other languages, the corresponding smart contract bindings should be generated. Refer to abigen for more information.

Overview of the proof queries

To prove the inclusion of PayForBlobs (PFB) transactions, blobs or shares, committed to in a Celestia block, we use the Celestia consensus node's RPC to query for proofs that can be verified in a rollup settlement contract via Blobstream. In fact, when a PFB transaction is included in a block, it gets separated into a PFB transaction (without the blob), and the actual data blob that it carries. These two are split into shares, which are the low level constructs of a Celestia block, and saved to the corresponding Celestia block. Learn more about shares in the shares specs.

The two diagrams below summarize how a single share, which can contain a PFB transaction, or a part of the rollup data that was posted using a PFB, is committed to in Blobstream.

The share is highlighted in green. R0, R1 etc, represent the respective row and column roots, the blue and pink gradients are erasure encoded data. More details on the square layout can be found in the data square layout and data structures portion of the specs.

The Celestia square

Square

The commitment scheme

Blobstream Commitment Diagram

So to prove inclusion of a share to a Celestia block, we use Blobstream as a source of truth. In a nutshell, Blobstream attests to the data posted to Celestia in the zk-Blobstream contract via verifying a zk-proof of the headers of a batch of Celestia blocks. Then, it keeps reference of that batch of blocks using the merkleized commitment of their (dataRoot, height) resulting in a data root tuple root. Check the above diagram which shows:

  • 0: those are the shares, that when unified, contain the PFB or the rollup data blob.
  • 1: the row and column roots are the namespace merkle tree roots over the shares. More information on the NMT in the NMT specs. These commit to the rows and columns containing the above shares.
  • 2: the data roots: which are the binary merkle tree commitment over the row and column roots. This means that if you can prove that a share is part of a row, using a namespace merkle proof. Then prove that this row is committed to by the data root. Then you can be sure that that share was published to the corresponding block.
  • 3: in order to batch multiple blocks into the same commitment, we create a commitment over the (dataRoot, height) tuple for a batch of blocks, which results in a data root tuple root. It's this commitment that gets stored in the Blobstream smart contract.

So, if we're able to prove:

  • That a share is part of a row, then that row is committed to by a data root.
  • Then, prove that that data root along with its height is committed to by the data root tuple root, which gets saved to the Blobstream contract.

We can be sure that that share was committed to in the corresponding Celestia block.

In this document, we will provide details on how to query the above proofs, and how to adapt them to be sent to a rollup contract for verification.

Hands-on demonstration

This part will provide the details of proof generation, and the way to make the results of the proofs queries ready to be consumed by the target rollup contract.

NOTE

For the go client snippets, make sure to have the following replaces in your go.mod:

go
// go.mod
     github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.18.3-sdk-v0.46.14
     github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
     github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
@@ -162,7 +162,7 @@
 		os.Exit(1)
 	}
 	fmt.Println(dcProof.Proof.String())
-}

Full example of proving that a Celestia block was committed to by Blobstream contract

go
package main
+}

Full example of proving that a Celestia block was committed to by Blobstream contract

go
package main
 
 import (
 	"context"
@@ -1162,7 +1162,7 @@
 			NumLeaves: big.NewInt(dataRootInclusionProof.Total),
 		},
 	}
-}

With the nonce being the attestation nonce, which can be retrieved using Blobstream contract events. Check below for an example. And height being the Celestia Block height that contains the rollup data, along with the blockDataRoot being the data root of the block height. Finally, dataRootInclusionProof is the Celestia block data root inclusion proof to the data root tuple root that was queried at the beginning of this page.

If the dataRoot or the tupleRootNonce is unknown during the verification:

  • dataRoot: can be queried using the /block?height=15 query (15 in this example endpoint), and taking the data_hash field from the response.
  • tupleRootNonce: can be retried via querying the data commitment stored events from the Blobstream contract and looking for the nonce attesting to the corresponding data.

Querying the proof's tupleRootNonce

go
	// get the nonce corresponding to the block height that contains the PayForBlob transaction
+}

With the nonce being the attestation nonce, which can be retrieved using Blobstream contract events. Check below for an example. And height being the Celestia Block height that contains the rollup data, along with the blockDataRoot being the data root of the block height. Finally, dataRootInclusionProof is the Celestia block data root inclusion proof to the data root tuple root that was queried at the beginning of this page.

If the dataRoot or the tupleRootNonce is unknown during the verification:

  • dataRoot: can be queried using the /block?height=15 query (15 in this example endpoint), and taking the data_hash field from the response.
  • tupleRootNonce: can be retried via querying the data commitment stored events from the Blobstream contract and looking for the nonce attesting to the corresponding data.

Querying the proof's tupleRootNonce

go
	// get the nonce corresponding to the block height that contains the PayForBlob transaction
 	// since BlobstreamX emits events when new batches are submitted, we will query the events
 	// and look for the range committing to the blob
 	// first, connect to an EVM RPC endpoint
@@ -1286,7 +1286,7 @@
 import {
     sp1blobstreamwrapper "github.com/succinctlabs/sp1-blobstream/bindings"
 } 
-// and use the `BlobstreamDataCommitmentStored` event instead.

Listening for new data commitments

For listening for new data commitment stored events, sequencers can use the WatchDataCommitmentStored as follows:

go
    ethClient, err := ethclient.Dial("evm_rpc")
+// and use the `BlobstreamDataCommitmentStored` event instead.

Listening for new data commitments

For listening for new data commitment stored events, sequencers can use the WatchDataCommitmentStored as follows:

go
    ethClient, err := ethclient.Dial("evm_rpc")
     if err != nil {
 	    return err
     }
@@ -1404,7 +1404,7 @@
         // (4) verify invalid state transition
         // (5) effects
     }
-}

Then, you can submit the fraud proof using golang as follows:

go
package main
+}

Then, you can submit the fraud proof using golang as follows:

go
package main
 
 import (
 	"context"
@@ -1878,8 +1878,8 @@
 import {
     sp1blobstreamwrapper "github.com/succinctlabs/sp1-blobstream/bindings"
 } 
-// and use the `BlobstreamDataCommitmentStored` event instead.

For the step (2), check the rollup inclusion proofs documentation for more information.

For an example BlobstreamX project that uses the above proof queries, checkout the blobstreamx-example sample project.

Conclusion

After creating all the proofs, and verifying them:

  1. Verify inclusion proof of the transaction to Celestia data root
  2. Prove that the data root tuple is committed to by the Blobstream X smart contract

We can be sure that the data was published to Celestia, and then rollups can proceed with their normal fraud proving mechanism.

NOTE

The above proof constructions are implemented in Solidity, and may require different approaches in other programming languages.

- +// and use the `BlobstreamDataCommitmentStored` event instead.

For the step (2), check the rollup inclusion proofs documentation for more information.

For an example BlobstreamX project that uses the above proof queries, checkout the blobstreamx-example sample project.

Conclusion

After creating all the proofs, and verifying them:

  1. Verify inclusion proof of the transaction to Celestia data root
  2. Prove that the data root tuple is committed to by the Blobstream X smart contract

We can be sure that the data was published to Celestia, and then rollups can proceed with their normal fraud proving mechanism.

NOTE

The above proof constructions are implemented in Solidity, and may require different approaches in other programming languages.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-rollups.html b/pr-1699/developers/blobstream-rollups.html index 8626741a29..fe45f382d5 100644 --- a/pr-1699/developers/blobstream-rollups.html +++ b/pr-1699/developers/blobstream-rollups.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@

Introduction to Blobstream rollups

Blobstream is the first data availability solution for EVM chains that securely scales with the number of users. It allows rollups to post their data on Celestia while proving their availability in the rollup settlement contract.

This document will outline a few ways to build optimistic or zk-rollups that post their data to Celestia and use Blobstream to prove that data's availability.

Concepts

This section will go over two constructs that can be used in building Blobstream rollups. Each with its pros and cons and the rollup developer can choose which one suits their needs better.

Note: Only the sequence of spans method can be used currently to build Blobstream rollups. The blob share commitment way still requires some tooling that will be built in the upcoming months.

Blob share commitment

The blob share commitment is a commitment over the data contained in the MsgPayForBlobs transaction. This commitment allows proving that the corresponding data exists on Celestia efficiently.

Blob share commitment: Proof details

To prove that the data corresponding to a blob share commitment was posted to Celestia using Blobstream, the following proofs need to be verified:

  1. share inclusion proof to the blob share commitment: meaning creating two merkle proofs:
    1. share merkle proof up to the subtree root corresponding to that share
    2. subtree root merkle proof to the blob share commitment
  2. blob share commitment inclusion proof to the data root tuple root: meaning four merkle proofs:
    1. subtree roots merkle proofs to the blob share commitment: to make sure the subtree roots are valid
    2. subtree roots merkle proofs up to the row roots: to prove that the subtree roots belong to a set of rows in the Celestia block
    3. row roots proofs to the data root: to prove that those rows belong to the Celestia Block
    4. data root tuple proof to the data root tuple: to prove that the Celestia block referenced by its height and data root, was committed to by Blobstream.

More details on the blob share commitment inclusion proof can be found in the commitment scheme docs and also the data square layout.

If all of these proofs are valid, then you successfully managed to prove that the data corresponding to that blob share commitment has been posted to Celestia.

NOTE

Generating/verifying blob share commitment proofs is still not supported. It still needs tooling to generate the proofs on the node side, and verifying them on the Solidity side which will be built in the upcoming months.

Blob share commitment: Compact proofs

There is a way to have compact proofs, when using blob share commitments, unlike the ones defined above; that allow less costly inclusion proofs. These require the ability to parse the protobuf encoded PFBs.

In fact, if the rollup project has a way to parse the protobuf encoded PFB, either in a smart contract or a zk-circuit, they will be able to create compact proofs of the rollup data.

These proofs will work as follows:

  • Parsing the PFB and taking out the blob share commitment
  • Comparing the PFB commitment to the one saved in the rollup contract
  • Proving inclusion of the PFB to the data root tuple root. This will be a compact proof since we will only be proving two shares regardless of the size of the rollup data.

More details on compact proofs can be found in ADR-011.

Blob share commitment: Pros

The pros of referencing rollup data using a blob share commitment:

  • Using the same commitment that exists on the PFB, without having to find another way of referencing the rollup data.
  • If the team has access to protobuf parsing, it allows for compact proof, but the parsing costs need to be investigated.

Blob share commitment: Cons

  • Large/expensive proofs in the case of having no way to parse the protobuf PFB encoding.
  • In the optimistic rollups construction, defined below, this requires waiting for the Celestia block to be committed to by Blobstream before saving updating the settlement contract. This might require waiting for a few hours, depending on the batches size on each chain, to finally submit the rollup update.

Given these limitations, an alternative design will be discussed in the next section.

Sequence of spans

An alternative way of referencing rollup data in the rollup settlement contract is using a sequence of spans.

A sequence of spans is a data pointer that allows pointing to the rollup data inside a Celestia square using its location inside the square. It can be defined using the following information:

  • height: The height of the Celestia block containing the rollup data.
  • startIndex: The index of the first share containing the rollup data.
  • dataLen: The number of shares containing the rollup data.

The startIndex and the dataLen can be queried from Celestia after the corresponding transaction gets included in a block and committed to the chain. An example of how to query them can be found in the verify command. The TxShareRange returns the start and end share of the data referenced by a transaction hash.

NOTE

If the rollup data is submitted in multiple blocks, the above sequence of spans can be generalized to include multiple blocks. For simplicity, we will stick with the data only submitted to a single Celestia block.

Sequence of spans: Proof details

Using sequence of spans is different from using the blob share commitment because we're referencing a location in the square, and not actual data commitment. So, the proof types and their generation are different.

Sequence of spans: Proving unavailable data

By construction, if the sequence of spans refers to a certain location in the square, that location is the data. This location can be in the reserved namespaces, the parity bytes, etc. What matters is that it's part of the square. So to prove that the sequence of spans is invalid, i.e., refers to data that is not available on Celestia, it is necessary and sufficient to show that the sequence of spans doesn't belong to the Celestia block, i.e., the span is out of bounds.

We could create this proof via generating a binary Merkle proof of any row/column to the Celestia data root. This proof will provide the total which is the number of rows/columns in the extended data square. This can be used to calculate the square size. The computeSquareSizeFromRowProof method in the DAVerifier library allows calculating the square size from a row proof or a share proof.

Then, we will use that information to check if the provided share index, in the header, is out of the square size bounds. In order words, we will check if the startIndex and the startIndex + dataLen are included in the range [0, 4*square_size].

NOTE

The square size is the number of rows of the original square.

For the data root, we will use a binary Merkle proof to prove its inclusion in a data root tuple root that was committed to by the Blobstream smart contract. More on this in the data root inclusion proofs section.

Sequence of spans: Proving inclusion of some data

The difference between using a blob share commitment and a sequence of spans is that when using a blob share commitment, an extra merkle proof is needed to prove inclusion of the share to the blob share commitment. However, in the case of a sequence of spans, only the usual inclusion proof of a share to the data root tuple root is needed. The inclusion of the share to the sequence of spans is gotten using the same proof.

In fact, proving that a share is part of the sequence of spans, i.e., part of the rollup data is done as follows:

  1. Prove that the data root tuple is committed to by the Blobstream smart contract:

    To prove the data root is committed to by the Blobstream smart contract, we will need to provide a Merkle proof of the data root tuple to a data root tuple root. This can be created using the data_root_inclusion_proof query. More on this can be found in the data root inclusion proofs documentation.

  2. Verify inclusion proof of the data to Celestia data root:

    To prove that the data is part of the data root, we will need to provide two proofs: a namespace Merkle proof of the data to a row root. This could be done via proving the shares that contain the data to the row root using a namespace Merkle proof. And, a binary Merkle proof of the row root to the data root.

    These proofs can be generated using the ProveShares query.

    More details on these proofs can be found in the transaction inclusion proof documentation.

  3. Prove that the data is in the sequence spans:

    To prove that the data is part of the rollup sequence of spans, we take the authenticated share proofs in step (2) and use the shares begin/end key to define the shares' positions in the row.

    Then, we use the row proof to get the row index in the extended Celestia square and get the index of the share in row major order:

    solidity
    uint256 shareIndexInRow = shareProof.shareProofs[0].beginKey;
     uint256 shareIndexInRowMajorOrder = shareIndexInRow + shareProof.rowProofs[0].numLeaves * shareProof.rowProofs[0].key;
    uint256 shareIndexInRow = shareProof.shareProofs[0].beginKey;
    -uint256 shareIndexInRowMajorOrder = shareIndexInRow + shareProof.rowProofs[0].numLeaves * shareProof.rowProofs[0].key;

Finally, we can compare the computed index with the sequence of spans, and be sure that the data/shares is part of the rollup data.

Sequence of spans: Pros

  • Using a sequence of spans instead of the blob share commitment allows for simpler proofs

Sequence of spans: Cons

None

Optimistic rollups

One type of rollups that can be built with Blobstream is optimistic rollups. An optimistic rollup is a rollup that commits optimistically to a set of blocks, and allows the other parties to verify that the blocks are valid, and if they're not, they can create fraud proofs to signal that.

Celestia allows optimistic rollups to post their data on its DA layer, and to prove that the data is available using Blobstream.

To build an optimistic rollup that uses Celestia as a DA layer, the following constructions can be inspired by.

Optimistic rollups that use a sequence of spans

Optimistic rollups can post their data in Celestia, then in the rollup settlement contract, they can reference optimistically that data using a sequence of spans. Then, rollup full nodes can verify if that data is valid. If not, they can trigger a fraud proof.

When using a sequence of spans, triggering the data availability fraud proofs, which are different from the state transitions fraud proofs (left for the rollup to define), goes back to the following cases:

Optimistic rollups that use a sequence of spans: Pros

  • Not needing to verify anything at the moment of submitting the commitments to the rollup settlement contracts
  • The fraud proofs are simple and can be reduced to a single share: if, for example, a single transaction in the rollup data that was posted to Celestia is faulty, only the shares containing that transaction, which can be as minimal as a single share, need to be proven on chain and verified.

Optimistic rollups that use a sequence of spans: Cons

None

Optimistic rollups that use a sequence of spans: Example

An example optimistic rollup that uses sequence of spans to reference its data can be found in the RollupInclusionProofs. It portrays the different possible data availability proofs, constructs them and shows how to verify them.

Also, more details on querying these kinds of proofs can be found in the proof queries documentation.

Optimistic rollups that use blob share commitments

Another way to build a rollup is to replace the sequence of spans with a height and a blob share commitment. Then, users/rollup full nodes will be able to query that data and validate it. If the rollup data is not valid, they can create a fraud proof.

The first difference between the sequence of spans construction and the share commitment construction is having to verify that the provided blob share commitment is part of the Celestia block, referenced by its height in the moment of submitting the rollup commitments to the settlement contract. This is necessary to make sure that the commitment is part of Celestia. Otherwise, rollup sequencers can commit to random blob share commitments and there won't be a way to prove they're invalid.

The second difference is the proof types. In the case of a fraud proof, the proofs outlined in the proofs details of blob share commitment section would need to be verified to be sure that the share containing the invalid state transition is part of the rollup data. Alternatively, the rollup settlement contract would need to have a library to parse protobuf encoded PFBs, as explained in the compact proofs of blob share commitment section, to have less expensive proofs. The cost of parsing the protobuf is not included in this analysis and needs to be investigated separately.

Optimistic rollups that use blob share commitments: Pros

  • Using the same blob share commitment as the one saved in Celestia which gives access to existing tooling

Optimistic rollups that use blob share commitments: Cons

  • The proofs are expensive in the base case. And if the settlement contract is able to parse the PFBs, thorough investigations of the cost of that would need to be done.

Zk-rollups

Zk-rollups, aka validity rollups, can also use Celestia as a DA and Blobstream to verify that the data was posted. However, the submission process is different from the above constructions, since there are no fraud proofs, and everything should be verified when submitting the commitment to the settlement contract.

Similar to the optimistic case, the rollup settlement contract can reference the rollup data using either the sequence of spans approach or the blob share commitments. We will discuss both in this section.

Zk-rollups that use sequence of spans

When submitting the commitments to the rollup settlement contract, this latter will need to verify the following:

  1. Zk-proof of the state transitions, which is left for the rollup to define.
  2. Verify that the sequence of spans is valid, i.e., is part of the Celestia block referenced by its height, as described in the proof details section.
  3. Zk-proof of the rollup data to the data root. The verification process of this should accept a commitment as input so that the settlement contract makes sure it's the correct value that's being saved. The commitment can be the data root and the sequence of spans. And, when the rollup data is proven inside the circuit to the data root, the used data root is asserted to be the input one. Similarly, the data's location is asserted to be the same as the input sequence of spans. These arguments are the ones used in the sequence of spans verification in (2).

Once these are valid, the settlement contract can be sure that the rollup data was posted to Celestia, and the sequence of spans references it correctly.

Zk-rollups that use sequence of spans: Pros

  • The inclusion proof inside the zk-circuit is a simple proof that uses traditional merkle tree. In the case of using blob share commitment, as will be explained below, additional libraries that can be expensive to prove are required.

Zk-rollups that use sequence of spans: Cons

None

Zk-rollups that use blob share commitments

To use blob share commitments to reference rollup data in the zk-rollup settlement contract, the zk-circuits need to be able to deserialize protobuf encoded messages. Alternatively, more involved merkle proofs will need to be verified.

Protobuf deserialization inside a zk-circuit

One way of using the blob share commitment to reference the rollup data in zk-rollups is via using a protobuf deserialization library inside the zk-circuit. And the verification would proceed as follows:

  1. Zk-proof of the state transitions, which is left to the rollup team to define.
  2. Verify that the blob share commitment is valid using the proofs laid out in the proof details of blob share commitment section.
  3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit, the protobuf encoded PFB transaction will be deserialized and then verify the following:
  • The deserialized blob share commitment is the same as the one provided as input
  • The circuit will prove the inclusion of the PFB to the data root, then assert that the data root is the same as the one provided as input.

If the above conditions are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

Zk-rollups that use blob share commitments: Pros

None

Zk-rollups that use blob share commitments: Cons

  • This approach requires having access to a protobuf decoder inside a zk-circuit which is not straightforward to have. Also, the relative costs will need to be investigated.

Heavy merkle proofs usage

Similar to Protobuf deserialization inside a zk-circuit, the zk-circuit will proceed to the verification of the availability of the data. The difference is that instead of parsing the encoded protobuf, the proofs defined under the blob share commitment proof details section will need to be verified inside the zk-circuit as follows:

  1. Zk-proof of the state transitions, which is left to the rollup team to define.
  2. Verify that the blob share commitment is valid using the proofs laid out in the blob share commitment proof details section.
  3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit:
  • It will verify that the input blob share commitment corresponds to the rollup data.
  • Verify that the input data root commits to that blob share commitment. Check the blob share commitment proof details for more details

Once these proofs are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

heavy merkle proofs usage: Pros

None

heavy merkle proofs usage: Cons

  • More heavy usage of merkle proofs inside and outside the zk-circuit.

Conclusion

Given the above details, using the sequence of spans is the better solution in the general case as explained in the optimistic rollups that uses a sequence of spans and zk-rollups that use sequence of spans sections. The proof sizes are small and allow for greater flexibility. However, if the rollup team has different requirements, then the other designs can be explored.

FAQ

Should I use the Celestia transaction hash to reference the rollup data?

This is asked a lot since it's the most intuitive way of referencing data. However, in Celestia, referencing the data using the transaction hash is not recommended.

A transaction proof in Celestia goes back to providing an inclusion proof of the shares containing the transaction. This means if the transaction hash is used to reference data in a Celestia block, the rollup verification mechanism should do the following:

  • Verify an inclusion proof of the shares comprising the transaction up to the data root tuple root
  • Decode those shares and parse the transaction, then hash its components to generate the transaction hash
  • Verify that the generated transaction hash matches the one used to reference the data

At this level, the transaction hash is authenticated and the verification contract has the shares of the transaction. Then, the verification contract needs to take the share commitment from the parsed transaction and follow the steps outlined in the blob share commitment section.

As observed, using the transaction hash is expensive and doesn't yield any advantages over using the blob share commitment, which in turn is more expensive than using the sequence of spans.

So, unless there are more reasons to use the transaction hash to reference the rollup data, the sequence of spans approach remains better.

- +uint256 shareIndexInRowMajorOrder = shareIndexInRow + shareProof.rowProofs[0].numLeaves * shareProof.rowProofs[0].key;

Finally, we can compare the computed index with the sequence of spans, and be sure that the data/shares is part of the rollup data.

Sequence of spans: Pros

  • Using a sequence of spans instead of the blob share commitment allows for simpler proofs

Sequence of spans: Cons

None

Optimistic rollups

One type of rollups that can be built with Blobstream is optimistic rollups. An optimistic rollup is a rollup that commits optimistically to a set of blocks, and allows the other parties to verify that the blocks are valid, and if they're not, they can create fraud proofs to signal that.

Celestia allows optimistic rollups to post their data on its DA layer, and to prove that the data is available using Blobstream.

To build an optimistic rollup that uses Celestia as a DA layer, the following constructions can be inspired by.

Optimistic rollups that use a sequence of spans

Optimistic rollups can post their data in Celestia, then in the rollup settlement contract, they can reference optimistically that data using a sequence of spans. Then, rollup full nodes can verify if that data is valid. If not, they can trigger a fraud proof.

When using a sequence of spans, triggering the data availability fraud proofs, which are different from the state transitions fraud proofs (left for the rollup to define), goes back to the following cases:

Optimistic rollups that use a sequence of spans: Pros

  • Not needing to verify anything at the moment of submitting the commitments to the rollup settlement contracts
  • The fraud proofs are simple and can be reduced to a single share: if, for example, a single transaction in the rollup data that was posted to Celestia is faulty, only the shares containing that transaction, which can be as minimal as a single share, need to be proven on chain and verified.

Optimistic rollups that use a sequence of spans: Cons

None

Optimistic rollups that use a sequence of spans: Example

An example optimistic rollup that uses sequence of spans to reference its data can be found in the RollupInclusionProofs. It portrays the different possible data availability proofs, constructs them and shows how to verify them.

Also, more details on querying these kinds of proofs can be found in the proof queries documentation.

Optimistic rollups that use blob share commitments

Another way to build a rollup is to replace the sequence of spans with a height and a blob share commitment. Then, users/rollup full nodes will be able to query that data and validate it. If the rollup data is not valid, they can create a fraud proof.

The first difference between the sequence of spans construction and the share commitment construction is having to verify that the provided blob share commitment is part of the Celestia block, referenced by its height in the moment of submitting the rollup commitments to the settlement contract. This is necessary to make sure that the commitment is part of Celestia. Otherwise, rollup sequencers can commit to random blob share commitments and there won't be a way to prove they're invalid.

The second difference is the proof types. In the case of a fraud proof, the proofs outlined in the proofs details of blob share commitment section would need to be verified to be sure that the share containing the invalid state transition is part of the rollup data. Alternatively, the rollup settlement contract would need to have a library to parse protobuf encoded PFBs, as explained in the compact proofs of blob share commitment section, to have less expensive proofs. The cost of parsing the protobuf is not included in this analysis and needs to be investigated separately.

Optimistic rollups that use blob share commitments: Pros

  • Using the same blob share commitment as the one saved in Celestia which gives access to existing tooling

Optimistic rollups that use blob share commitments: Cons

  • The proofs are expensive in the base case. And if the settlement contract is able to parse the PFBs, thorough investigations of the cost of that would need to be done.

Zk-rollups

Zk-rollups, aka validity rollups, can also use Celestia as a DA and Blobstream to verify that the data was posted. However, the submission process is different from the above constructions, since there are no fraud proofs, and everything should be verified when submitting the commitment to the settlement contract.

Similar to the optimistic case, the rollup settlement contract can reference the rollup data using either the sequence of spans approach or the blob share commitments. We will discuss both in this section.

Zk-rollups that use sequence of spans

When submitting the commitments to the rollup settlement contract, this latter will need to verify the following:

  1. Zk-proof of the state transitions, which is left for the rollup to define.
  2. Verify that the sequence of spans is valid, i.e., is part of the Celestia block referenced by its height, as described in the proof details section.
  3. Zk-proof of the rollup data to the data root. The verification process of this should accept a commitment as input so that the settlement contract makes sure it's the correct value that's being saved. The commitment can be the data root and the sequence of spans. And, when the rollup data is proven inside the circuit to the data root, the used data root is asserted to be the input one. Similarly, the data's location is asserted to be the same as the input sequence of spans. These arguments are the ones used in the sequence of spans verification in (2).

Once these are valid, the settlement contract can be sure that the rollup data was posted to Celestia, and the sequence of spans references it correctly.

Zk-rollups that use sequence of spans: Pros

  • The inclusion proof inside the zk-circuit is a simple proof that uses traditional merkle tree. In the case of using blob share commitment, as will be explained below, additional libraries that can be expensive to prove are required.

Zk-rollups that use sequence of spans: Cons

None

Zk-rollups that use blob share commitments

To use blob share commitments to reference rollup data in the zk-rollup settlement contract, the zk-circuits need to be able to deserialize protobuf encoded messages. Alternatively, more involved merkle proofs will need to be verified.

Protobuf deserialization inside a zk-circuit

One way of using the blob share commitment to reference the rollup data in zk-rollups is via using a protobuf deserialization library inside the zk-circuit. And the verification would proceed as follows:

  1. Zk-proof of the state transitions, which is left to the rollup team to define.
  2. Verify that the blob share commitment is valid using the proofs laid out in the proof details of blob share commitment section.
  3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit, the protobuf encoded PFB transaction will be deserialized and then verify the following:
  • The deserialized blob share commitment is the same as the one provided as input
  • The circuit will prove the inclusion of the PFB to the data root, then assert that the data root is the same as the one provided as input.

If the above conditions are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

Zk-rollups that use blob share commitments: Pros

None

Zk-rollups that use blob share commitments: Cons

  • This approach requires having access to a protobuf decoder inside a zk-circuit which is not straightforward to have. Also, the relative costs will need to be investigated.

Heavy merkle proofs usage

Similar to Protobuf deserialization inside a zk-circuit, the zk-circuit will proceed to the verification of the availability of the data. The difference is that instead of parsing the encoded protobuf, the proofs defined under the blob share commitment proof details section will need to be verified inside the zk-circuit as follows:

  1. Zk-proof of the state transitions, which is left to the rollup team to define.
  2. Verify that the blob share commitment is valid using the proofs laid out in the blob share commitment proof details section.
  3. The zk-proof verifier would take as argument the data root and the blob share commitment. Then, inside the circuit:
  • It will verify that the input blob share commitment corresponds to the rollup data.
  • Verify that the input data root commits to that blob share commitment. Check the blob share commitment proof details for more details

Once these proofs are valid, the rollup settlement contract can be sure that the rollup data was posted to Celestia and is correctly referenced.

heavy merkle proofs usage: Pros

None

heavy merkle proofs usage: Cons

  • More heavy usage of merkle proofs inside and outside the zk-circuit.

Conclusion

Given the above details, using the sequence of spans is the better solution in the general case as explained in the optimistic rollups that uses a sequence of spans and zk-rollups that use sequence of spans sections. The proof sizes are small and allow for greater flexibility. However, if the rollup team has different requirements, then the other designs can be explored.

FAQ

Should I use the Celestia transaction hash to reference the rollup data?

This is asked a lot since it's the most intuitive way of referencing data. However, in Celestia, referencing the data using the transaction hash is not recommended.

A transaction proof in Celestia goes back to providing an inclusion proof of the shares containing the transaction. This means if the transaction hash is used to reference data in a Celestia block, the rollup verification mechanism should do the following:

  • Verify an inclusion proof of the shares comprising the transaction up to the data root tuple root
  • Decode those shares and parse the transaction, then hash its components to generate the transaction hash
  • Verify that the generated transaction hash matches the one used to reference the data

At this level, the transaction hash is authenticated and the verification contract has the shares of the transaction. Then, the verification contract needs to take the share commitment from the parsed transaction and follow the steps outlined in the blob share commitment section.

As observed, using the transaction hash is expensive and doesn't yield any advantages over using the blob share commitment, which in turn is more expensive than using the sequence of spans.

So, unless there are more reasons to use the transaction hash to reference the rollup data, the sequence of spans approach remains better.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-x-deploy.html b/pr-1699/developers/blobstream-x-deploy.html index 56ac87c55b..3680c76d00 100644 --- a/pr-1699/developers/blobstream-x-deploy.html +++ b/pr-1699/developers/blobstream-x-deploy.html @@ -11,7 +11,7 @@ - + @@ -210,8 +210,8 @@ # ^ This copies the verifier build to the blobstreamx folder mkdir -p build && RUST_LOG=debug cargo run --bin header_range_1024 --release build --wrapper-path verifier-build/ && mv ./target/release/header_range_1024 ./build/header_range_1024 ls build -# ^ should return something like: 0x007d0b2a2e2b013612e8.circuit 0x9039e58b2089e5f9abbb.circuit 0xce1636cfaf2bd5497c11.circuit FunctionVerifier.sol main.circuit 0x8e1ede4ce0865b41d714.circuit 0xa2140c9bde000dc5e21e.circuit 0xf6759ff933786ddacb92.circuit header_range_1024

The header_range_1024 is a specific circuit. Other circuit names can be used there. The current circuits that we have for BlobstreamX:

  • header_range_1024: skip function circuit for batches that are <= 1024 block.
  • header_range_2048: skip function circuit for batches that are <= 2048 block.
  • next_header: step function circuit.

All the deployments currently rely on two circuits: a header range circuit, either the 1024 or the 2048, depending on the frequency of the batches; The 1024 is mainly for batches that are at a ~1hr frequency and the 2048 for batches that are at a ~3-4hr frequency; and a next header circuit. So, if you're re-building the circuits, make sure to build the correct two circuits for your target deployment.

Now, if you check the build folder, you will find a file called FunctionVerifier.sol, which is the function verifier contract for your circuit that you can deploy on-chain.

Also, you will find the header_range_1024 under build folder which is the binary used to generate the proofs. It is mainly used by the operator to generate the plonky2x proofs that will be PLONK wrapped later using the generated verifier-build.

At this level, you can deploy the FunctionVerifier.sol onchain, then register it in the SuccinctGateway, then use the generated header_range_1024 circuit and the verifier to generate the proofs and submit them onchain. These steps are detailed in the previous section.

NOTE: In a scaleway instance of 64CPU and 504G RAM, the build takes ~10 minutes to complete. Make sure to run it on a beefy machine.

- +# ^ should return something like: 0x007d0b2a2e2b013612e8.circuit 0x9039e58b2089e5f9abbb.circuit 0xce1636cfaf2bd5497c11.circuit FunctionVerifier.sol main.circuit 0x8e1ede4ce0865b41d714.circuit 0xa2140c9bde000dc5e21e.circuit 0xf6759ff933786ddacb92.circuit header_range_1024

The header_range_1024 is a specific circuit. Other circuit names can be used there. The current circuits that we have for BlobstreamX:

  • header_range_1024: skip function circuit for batches that are <= 1024 block.
  • header_range_2048: skip function circuit for batches that are <= 2048 block.
  • next_header: step function circuit.

All the deployments currently rely on two circuits: a header range circuit, either the 1024 or the 2048, depending on the frequency of the batches; The 1024 is mainly for batches that are at a ~1hr frequency and the 2048 for batches that are at a ~3-4hr frequency; and a next header circuit. So, if you're re-building the circuits, make sure to build the correct two circuits for your target deployment.

Now, if you check the build folder, you will find a file called FunctionVerifier.sol, which is the function verifier contract for your circuit that you can deploy on-chain.

Also, you will find the header_range_1024 under build folder which is the binary used to generate the proofs. It is mainly used by the operator to generate the plonky2x proofs that will be PLONK wrapped later using the generated verifier-build.

At this level, you can deploy the FunctionVerifier.sol onchain, then register it in the SuccinctGateway, then use the generated header_range_1024 circuit and the verifier to generate the proofs and submit them onchain. These steps are detailed in the previous section.

NOTE: In a scaleway instance of 64CPU and 504G RAM, the build takes ~10 minutes to complete. Make sure to run it on a beefy machine.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream-x-requesting-data-commitment-ranges.html b/pr-1699/developers/blobstream-x-requesting-data-commitment-ranges.html index 52b3bbbce6..30c71b5352 100644 --- a/pr-1699/developers/blobstream-x-requesting-data-commitment-ranges.html +++ b/pr-1699/developers/blobstream-x-requesting-data-commitment-ranges.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Requesting data commitment ranges

By default, the Blobstream X deployments on Ethereum will be updated every 4 hours, and on Arbitrum One and Base, updating every 1 hour. If you wish for the Blobstream X contract to be updated at a different cadence, then you have several different options for how to update the smart contract.

To request proofs to be submitted to the Blobstream X contract at a different cadence, you can do one of the following:

NOTE: The requested proof ranges cannot include blocks that were already used in a previous batch. The ranges should start from the last proven block, aka, latest_block and they should end in a block already committed by Celestia. In other words, it's the end-inclusive range defined by [latest_block, target_block] with target_block <= Celestia tip.

Local proving

To run the Blobstream X operator with local proving, follow this guide.

Local proving allows self-generating the proofs and submitting them to an existing BlobstreamX contract. Alternatively, if a team needs a very specific cadence that starts at very specific heights, they can deploy their own BlobstreamX contract and submit proofs to it. Deployment instructions can be found in the BlobstreamX deploy documentation.

::: Note Requires a large cloud machine to run in a reasonable amount of time. EC2 r6a.16xlarge, i.e., 64CPU 512GB RAM, takes ~30 minutes to generate a header range proof. :::

Request proofs from the Succinct platform

NOTE: Requesting a proof from the succinct platform requires having a Succinct API key. It can be requested using this form.

Run the Blobstream X operator with hosted proving on the Succinct platform, by running an operator script that pings the platform with proof requests at a specified cadence.

Follow these instructions to run the operator script.

Here are example values for the .env file:

  1. TENDERMINT_RPC_URL from the public Celestia list.
  2. SUCCINCT_RPC_URL = https://alpha.succinct.xyz/api
  3. Request for SUCCINCT_API_KEY from the Succinct team.
  4. CHAIN_ID is the chain ID of the deployed Blobstream X contract.
  5. CONTRACT_ADDRESS: Blobstream X proxy contract address.
  6. NEXT_HEADER_FUNCTION_ID & HEADER_RANGE_FUNCTION_ID: Get the functionId's from the Blobstream X contract by using the nextHeaderFunctionId and headerRangeFunctionId respectively, which are public storage variables.

Request proofs onchain

Directly request a proof via the Blobstream X contract interface. Unlike the Blobstream X operator which handles requests off-chain, requesting on-chain requires gas, but the proof will be generated and relayed by the Succinct platform.

  1. Call requestHeaderRange(uint64 _targetBlock) with the end of the range you want a commitment for.

  2. A DataCommitmentStored(uint256, uint64, uint64, bytes32) will be emitted for the requested range when it is stored in the contract. Listen to this event to know that the proof has been generated successfully.

- +

Requesting data commitment ranges

By default, the Blobstream X deployments on Ethereum will be updated every 4 hours, and on Arbitrum One and Base, updating every 1 hour. If you wish for the Blobstream X contract to be updated at a different cadence, then you have several different options for how to update the smart contract.

To request proofs to be submitted to the Blobstream X contract at a different cadence, you can do one of the following:

NOTE: The requested proof ranges cannot include blocks that were already used in a previous batch. The ranges should start from the last proven block, aka, latest_block and they should end in a block already committed by Celestia. In other words, it's the end-inclusive range defined by [latest_block, target_block] with target_block <= Celestia tip.

Local proving

To run the Blobstream X operator with local proving, follow this guide.

Local proving allows self-generating the proofs and submitting them to an existing BlobstreamX contract. Alternatively, if a team needs a very specific cadence that starts at very specific heights, they can deploy their own BlobstreamX contract and submit proofs to it. Deployment instructions can be found in the BlobstreamX deploy documentation.

::: Note Requires a large cloud machine to run in a reasonable amount of time. EC2 r6a.16xlarge, i.e., 64CPU 512GB RAM, takes ~30 minutes to generate a header range proof. :::

Request proofs from the Succinct platform

NOTE: Requesting a proof from the succinct platform requires having a Succinct API key. It can be requested using this form.

Run the Blobstream X operator with hosted proving on the Succinct platform, by running an operator script that pings the platform with proof requests at a specified cadence.

Follow these instructions to run the operator script.

Here are example values for the .env file:

  1. TENDERMINT_RPC_URL from the public Celestia list.
  2. SUCCINCT_RPC_URL = https://alpha.succinct.xyz/api
  3. Request for SUCCINCT_API_KEY from the Succinct team.
  4. CHAIN_ID is the chain ID of the deployed Blobstream X contract.
  5. CONTRACT_ADDRESS: Blobstream X proxy contract address.
  6. NEXT_HEADER_FUNCTION_ID & HEADER_RANGE_FUNCTION_ID: Get the functionId's from the Blobstream X contract by using the nextHeaderFunctionId and headerRangeFunctionId respectively, which are public storage variables.

Request proofs onchain

Directly request a proof via the Blobstream X contract interface. Unlike the Blobstream X operator which handles requests off-chain, requesting on-chain requires gas, but the proof will be generated and relayed by the Succinct platform.

  1. Call requestHeaderRange(uint64 _targetBlock) with the end of the range you want a commitment for.

  2. A DataCommitmentStored(uint256, uint64, uint64, bytes32) will be emitted for the requested range when it is stored in the contract. Listen to this event to know that the proof has been generated successfully.

+ \ No newline at end of file diff --git a/pr-1699/developers/blobstream.html b/pr-1699/developers/blobstream.html index 7d79c0ceb9..cec4c0f63e 100644 --- a/pr-1699/developers/blobstream.html +++ b/pr-1699/developers/blobstream.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Blobstream: Streaming modular DA to Ethereum

Blobstream logo

What is Blobstream?

Blobstream is the first data availability solution for Ethereum that securely scales with the number of users. Formerly known as the Quantum Gravity Bridge (QGB), Blobstream relays commitments to Celestia's data root to an onchain light client on Ethereum, for integration by developers into L2 contracts. This enables Ethereum developers to build high-throughput L2s using Celestia's optimised DA layer, the first with Data Availability Sampling (DAS). Any ecosystem can deploy a Blobstream light client onchain to allow L2s and L3s to access DA from Celestia.

An implementation of Blobstream, by Succinct, called Blobstream X, is out and will be used in the upcoming deployments. This implementation proves the validity of Celestia block headers on a target EVM chain using zero-knowledge (ZK) proofs, which allow inheriting all the security guarantees of Celestia.

The latest implementation of Blobstream X is SP1 Blobstream, which is written in Rust for the SP1 zkVM. SP1 Blobstream offers improved performance and efficiency while maintaining the security guarantees of the original Blobstream X.

Please note: Blobstream remains early-stage, experimental software and users should use Blobstream at their own risk.

Implementations of Blobstream

Blobstream vs. data availability committees (DACs)

Decentralization and security

Blobstream is built on Celestia, which uses a CometBFT-based proof-of-stake system. Blobstream shares the same security assumptions as Celestia. In contrast, data availability committees (DACs), are typically centralized or semi-centralized, relying on a specific set of entities or individuals to vouch for data availability.

Mechanism of verification

Blobstream uses data availability attestations, which are Merkle roots of the batched L2 data, to confirm that the necessary data is present on Celestia. The L2 contract on Ethereum can check directly with Blobstream if the data is published on Celestia. Similarly, a DAC would rely on attestations or confirmations from its permissioned members.

Flexibility and scalability

Blobstream is designed to offer high-throughput data availability for Ethereum L2s, aiming to strike a balance between scalability and security. It operates independently of Ethereum's gas costs, as Celestia's resource pricing is more byte-focused rather than computation-centric. On the other hand, the scalability and flexibility of a DAC would depend on its specific design and implementation.

In summary, both Blobstream and DACs aim to ensure offchain data availability, but Blobstream offers a more decentralized, secure, and scalable solution compared to the potential centralized nature of DACs.

What is SP1 Blobstream?

SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

SP1 Blobstream is the latest implementation of Blobstream with a ZK light client that bridges Celestia’s modular DA layer to Ethereum to allow high-throughput rollups to use Celestia’s DA while settling on Ethereum.

Optimistic or ZK rollups that settle on Ethereum, but wish to use Celestia for DA, require a mechanism for bridging Celestia’s data root to Ethereum as part of the settlement process. This data root is used during inclusion proofs to prove that particular rollup transactions were included and made available in the Celestia network.

Bridging Celestia’s data root to Ethereum requires running a Celestia light client as a smart contract on Ethereum, to make the latest state of the Celestia chain known on Ethereum and available to rollups. SP1 Blobstream uses the latest advances in ZK proofs to generate a succinct proof that enough Celestia validators have come to consensus (according to the CometBFT consensus protocol) on a block header, and verifies this proof in the SP1 Blobstream Ethereum smart contract to update it with the latest Celestia header.

The SP1 Blobstream ZK proof not only verifies the consensus of Celestia validators, but it also merkelizes and hashes all the data roots in the block range from the previous update to the current update, making accessible all Celestia data roots (verifiable with a Merkle inclusion proof against the stored Merkle root) to rollups.

If you're looking to deploy SP1 blobstream to a new chain, see new Sp1 Blobstream deployments.

Learn more at the sp1-blobstream repo.

NOTE

The current Blobstream deployments all use SP1 Blobstream.

Integrate with SP1 Blobstream

The following docs go over how developers can integrate SP1 Blobstream.

You can find the repository for SP1 Blobstream along with code for:

The first deployments of SP1 Blobstream will be maintained on the following chains: Arbitrum One, Base and Ethereum Mainnet. Every 1 hour, the prover/relayer will post an update to the Blobstream contract that will include a new data commitment range that covers a 1-hour block range from the latestBlock in the contract. On Ethereum Mainnet, the contract will be updated every 4 hours.

How to integrate with Blobstream

Integrating your L2 with Blobstream requires two components: your onchain smart contract logic, and your offchain client logic for your rollup. The next three sections cover these topics:

Blobstream rollups

More on the different ways to build a blobstream rollup can be found in the blobstream rollups documentation.

Deployed contracts

You can interact with the SP1 Blobstream contracts today. The SP1 Blobstream Solidity smart contracts are currently deployed on the following chains:

ContractEVM networkContract addressAttested data on CelestiaLink to Celenium
SP1 BlobstreamEthereum Mainnet0x7Cf3876F681Dbb6EdA8f6FfC45D66B996Df08fAeMainnet BetaDeployment on Celenium
SP1 BlobstreamArbitrum One0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
SP1 BlobstreamBase0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
SP1 BlobstreamSepolia0xf0c6429ebab2e7dc6e05dafb61128be21f13cb1eMocha testnetDeployment on Celenium
SP1 BlobstreamArbitrum Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
SP1 BlobstreamBase Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
- +

Blobstream: Streaming modular DA to Ethereum

Blobstream logo

What is Blobstream?

Blobstream is the first data availability solution for Ethereum that securely scales with the number of users. Formerly known as the Quantum Gravity Bridge (QGB), Blobstream relays commitments to Celestia's data root to an onchain light client on Ethereum, for integration by developers into L2 contracts. This enables Ethereum developers to build high-throughput L2s using Celestia's optimised DA layer, the first with Data Availability Sampling (DAS). Any ecosystem can deploy a Blobstream light client onchain to allow L2s and L3s to access DA from Celestia.

An implementation of Blobstream, by Succinct, called Blobstream X, is out and will be used in the upcoming deployments. This implementation proves the validity of Celestia block headers on a target EVM chain using zero-knowledge (ZK) proofs, which allow inheriting all the security guarantees of Celestia.

The latest implementation of Blobstream X is SP1 Blobstream, which is written in Rust for the SP1 zkVM. SP1 Blobstream offers improved performance and efficiency while maintaining the security guarantees of the original Blobstream X.

Please note: Blobstream remains early-stage, experimental software and users should use Blobstream at their own risk.

Implementations of Blobstream

Blobstream vs. data availability committees (DACs)

Decentralization and security

Blobstream is built on Celestia, which uses a CometBFT-based proof-of-stake system. Blobstream shares the same security assumptions as Celestia. In contrast, data availability committees (DACs), are typically centralized or semi-centralized, relying on a specific set of entities or individuals to vouch for data availability.

Mechanism of verification

Blobstream uses data availability attestations, which are Merkle roots of the batched L2 data, to confirm that the necessary data is present on Celestia. The L2 contract on Ethereum can check directly with Blobstream if the data is published on Celestia. Similarly, a DAC would rely on attestations or confirmations from its permissioned members.

Flexibility and scalability

Blobstream is designed to offer high-throughput data availability for Ethereum L2s, aiming to strike a balance between scalability and security. It operates independently of Ethereum's gas costs, as Celestia's resource pricing is more byte-focused rather than computation-centric. On the other hand, the scalability and flexibility of a DAC would depend on its specific design and implementation.

In summary, both Blobstream and DACs aim to ensure offchain data availability, but Blobstream offers a more decentralized, secure, and scalable solution compared to the potential centralized nature of DACs.

What is SP1 Blobstream?

SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

SP1 Blobstream is the latest implementation of Blobstream with a ZK light client that bridges Celestia’s modular DA layer to Ethereum to allow high-throughput rollups to use Celestia’s DA while settling on Ethereum.

Optimistic or ZK rollups that settle on Ethereum, but wish to use Celestia for DA, require a mechanism for bridging Celestia’s data root to Ethereum as part of the settlement process. This data root is used during inclusion proofs to prove that particular rollup transactions were included and made available in the Celestia network.

Bridging Celestia’s data root to Ethereum requires running a Celestia light client as a smart contract on Ethereum, to make the latest state of the Celestia chain known on Ethereum and available to rollups. SP1 Blobstream uses the latest advances in ZK proofs to generate a succinct proof that enough Celestia validators have come to consensus (according to the CometBFT consensus protocol) on a block header, and verifies this proof in the SP1 Blobstream Ethereum smart contract to update it with the latest Celestia header.

The SP1 Blobstream ZK proof not only verifies the consensus of Celestia validators, but it also merkelizes and hashes all the data roots in the block range from the previous update to the current update, making accessible all Celestia data roots (verifiable with a Merkle inclusion proof against the stored Merkle root) to rollups.

If you're looking to deploy SP1 blobstream to a new chain, see new Sp1 Blobstream deployments.

Learn more at the sp1-blobstream repo.

NOTE

The current Blobstream deployments all use SP1 Blobstream.

Integrate with SP1 Blobstream

The following docs go over how developers can integrate SP1 Blobstream.

You can find the repository for SP1 Blobstream along with code for:

The first deployments of SP1 Blobstream will be maintained on the following chains: Arbitrum One, Base and Ethereum Mainnet. Every 1 hour, the prover/relayer will post an update to the Blobstream contract that will include a new data commitment range that covers a 1-hour block range from the latestBlock in the contract. On Ethereum Mainnet, the contract will be updated every 4 hours.

How to integrate with Blobstream

Integrating your L2 with Blobstream requires two components: your onchain smart contract logic, and your offchain client logic for your rollup. The next three sections cover these topics:

Blobstream rollups

More on the different ways to build a blobstream rollup can be found in the blobstream rollups documentation.

Deployed contracts

You can interact with the SP1 Blobstream contracts today. The SP1 Blobstream Solidity smart contracts are currently deployed on the following chains:

ContractEVM networkContract addressAttested data on CelestiaLink to Celenium
SP1 BlobstreamEthereum Mainnet0x7Cf3876F681Dbb6EdA8f6FfC45D66B996Df08fAeMainnet BetaDeployment on Celenium
SP1 BlobstreamArbitrum One0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
SP1 BlobstreamBase0xA83ca7775Bc2889825BcDeDfFa5b758cf69e8794Mainnet BetaDeployment on Celenium
SP1 BlobstreamSepolia0xf0c6429ebab2e7dc6e05dafb61128be21f13cb1eMocha testnetDeployment on Celenium
SP1 BlobstreamArbitrum Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
SP1 BlobstreamBase Sepolia0xc3e209eb245Fd59c8586777b499d6A665DF3ABD2Mocha testnetDeployment on Celenium
+ \ No newline at end of file diff --git a/pr-1699/developers/blobstreamx.html b/pr-1699/developers/blobstreamx.html index f602025c76..dc5f09fe27 100644 --- a/pr-1699/developers/blobstreamx.html +++ b/pr-1699/developers/blobstreamx.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

BlobstreamX: the previous zk implementation of Blobstream

blobstream x draft diagram

What is Blobstream X?

Blobstream X is the previous implementation of Blobstream. It uses plonky2x to create circuits that verify the Celestia consensus and generate the corresponding proofs.

Blobstream X is built and deployed with Succinct's protocol.

NOTE

The Blobstream deployments below don't use the BlobstreamX circuits.

You can find the repository for Blobstream X along with code for:

NOTE

Custom ranges can be requested using the BlobstreamX contract to create proofs for specific Celestia block batches. These ranges can be constructed as [latestBlock, customTargetBlock), with latestBlock as the latest block height that was committed to by the BlobstreamX contract, and latestBlock > customTargetBlock, and customTargetBlock - latestBlock <= DATA_COMMITMENT_MAX.

Block ranges that are before the contract's latestBlock can't be proven a second time in different batches.

More information can be found in the requestHeaderRange(...) method.

How Blobstream X works

As shown in the diagram below, the entrypoint for updates to the Blobstream X contract is through the SuccinctGateway smart contract, which is a simple entrypoint contract that verifies proofs (against a deployed onchain verifier for the Blobstream X circuit) and then calls the BlobstreamX.sol contract to update it. Find more information about the SuccinctGateway.

blobstream x overview diagram draft

NOTE

If the Blobstream X contract is not deployed on a desired chain, it needs to be deployed before it can be used by your rollup. See the deployment documentation for more details.

Deploy Blobstream X

It is possible to deploy and maintain a Blobstream x instance and have the same security guarantees.

First, you will need to create a multisig that governs the Blobstream X contract and also the function identifiers. The function identifiers can be registered in the Succinct gateway.

Then, check the deployment documentation for how to deploy the contract.

Then, you will need to run a relayer, which will generate the proofs and relay them to your deployed Blobstream X contract. Check the local proving documentation for more information.

- +

BlobstreamX: the previous zk implementation of Blobstream

blobstream x draft diagram

What is Blobstream X?

Blobstream X is the previous implementation of Blobstream. It uses plonky2x to create circuits that verify the Celestia consensus and generate the corresponding proofs.

Blobstream X is built and deployed with Succinct's protocol.

NOTE

The Blobstream deployments below don't use the BlobstreamX circuits.

You can find the repository for Blobstream X along with code for:

NOTE

Custom ranges can be requested using the BlobstreamX contract to create proofs for specific Celestia block batches. These ranges can be constructed as [latestBlock, customTargetBlock), with latestBlock as the latest block height that was committed to by the BlobstreamX contract, and latestBlock > customTargetBlock, and customTargetBlock - latestBlock <= DATA_COMMITMENT_MAX.

Block ranges that are before the contract's latestBlock can't be proven a second time in different batches.

More information can be found in the requestHeaderRange(...) method.

How Blobstream X works

As shown in the diagram below, the entrypoint for updates to the Blobstream X contract is through the SuccinctGateway smart contract, which is a simple entrypoint contract that verifies proofs (against a deployed onchain verifier for the Blobstream X circuit) and then calls the BlobstreamX.sol contract to update it. Find more information about the SuccinctGateway.

blobstream x overview diagram draft

NOTE

If the Blobstream X contract is not deployed on a desired chain, it needs to be deployed before it can be used by your rollup. See the deployment documentation for more details.

Deploy Blobstream X

It is possible to deploy and maintain a Blobstream x instance and have the same security guarantees.

First, you will need to create a multisig that governs the Blobstream X contract and also the function identifiers. The function identifiers can be registered in the Succinct gateway.

Then, check the deployment documentation for how to deploy the contract.

Then, you will need to run a relayer, which will generate the proofs and relay them to your deployed Blobstream X contract. Check the local proving documentation for more information.

+ \ No newline at end of file diff --git a/pr-1699/developers/bubs-testnet.html b/pr-1699/developers/bubs-testnet.html index bf19dfaf9a..f8a9c47191 100644 --- a/pr-1699/developers/bubs-testnet.html +++ b/pr-1699/developers/bubs-testnet.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Bubs testnet

Bubs testnet

Bubs Testnet is a the first OP Stack testnet with Celestia underneath hosted by Caldera with support from Celestia Labs. Bubs is dedicated to providing developers with an EVM-compatible execution layer to deploy their EVM applications on.

Built with the OP Stack and Celestia

The Bubs Testnet is a testnet rollup, a modified version of optimism-bedrock that uses Celestia as a data availability (DA) layer. This integration can be found in the @celestiaorg/optimism repository. The testnet is hosted by Caldera, who makes it easy to launch rollups with no code required. Bubs' data is posted to Celestia on the Mocha testnet. View the namespace for Bubs on Celestia's Mocha testnet.

Learn more about the setup of the integration in the introduction.

Building on Bubs

Bubs Testnet provides a robust environment for developers to test their Ethereum Virtual Machine (EVM) applications. It offers an EVM-compatible execution layer, making it an ideal platform for developers looking to build and test applications in a setting that closely mirrors an OP Stack rollup on Celestia.

Learn more at https://bubs-sepolia.hub.caldera.xyz/.

RPC URLs

Remote Procedure Call (RPC) URLs are endpoints that allow developers to interact with the blockchain. They are essential for sending transactions, querying blockchain data, and performing other interactions with the blockchain.

For the Bubs Testnet, you can connect to the following RPC URLs:

HTTPS

  • https://bubs-sepolia.rpc.caldera.xyz/http

WSS

  • wss://bubs-sepolia.rpc.caldera.xyz/ws

This URL serves as the entry point to the Bubs Testnet. You can use it in your applications to connect to the testnet and interact with the smart contracts you deploy there.

Remember, Bubs Testnet is a testing environment!

Bridge

Bridging is a process that enables the transfer of assets between different blockchains.

To bridge between Ethereum Sepolia and Bubs Testnet, visit the Bubs Testnet bridge.

Faucet

To visit the Bubs testnet faucet, go to https://bubs-sepolia.hub.caldera.xyz/ and click the "Faucet" tab.

Explorer

To visit the explorer, go to https://bubs-sepolia.explorer.caldera.xyz/.

Status

To see the status and uptime information for Bubs, visit the status page.

Next steps

Now that you have a better understanding of the Bubs Testnet and its integration of OP Stack and Celestia, you can start exploring its capabilities.

- +

Bubs testnet

Bubs testnet

Bubs Testnet is a the first OP Stack testnet with Celestia underneath hosted by Caldera with support from Celestia Labs. Bubs is dedicated to providing developers with an EVM-compatible execution layer to deploy their EVM applications on.

Built with the OP Stack and Celestia

The Bubs Testnet is a testnet rollup, a modified version of optimism-bedrock that uses Celestia as a data availability (DA) layer. This integration can be found in the @celestiaorg/optimism repository. The testnet is hosted by Caldera, who makes it easy to launch rollups with no code required. Bubs' data is posted to Celestia on the Mocha testnet. View the namespace for Bubs on Celestia's Mocha testnet.

Learn more about the setup of the integration in the introduction.

Building on Bubs

Bubs Testnet provides a robust environment for developers to test their Ethereum Virtual Machine (EVM) applications. It offers an EVM-compatible execution layer, making it an ideal platform for developers looking to build and test applications in a setting that closely mirrors an OP Stack rollup on Celestia.

Learn more at https://bubs-sepolia.hub.caldera.xyz/.

RPC URLs

Remote Procedure Call (RPC) URLs are endpoints that allow developers to interact with the blockchain. They are essential for sending transactions, querying blockchain data, and performing other interactions with the blockchain.

For the Bubs Testnet, you can connect to the following RPC URLs:

HTTPS

  • https://bubs-sepolia.rpc.caldera.xyz/http

WSS

  • wss://bubs-sepolia.rpc.caldera.xyz/ws

This URL serves as the entry point to the Bubs Testnet. You can use it in your applications to connect to the testnet and interact with the smart contracts you deploy there.

Remember, Bubs Testnet is a testing environment!

Bridge

Bridging is a process that enables the transfer of assets between different blockchains.

To bridge between Ethereum Sepolia and Bubs Testnet, visit the Bubs Testnet bridge.

Faucet

To visit the Bubs testnet faucet, go to https://bubs-sepolia.hub.caldera.xyz/ and click the "Faucet" tab.

Explorer

To visit the explorer, go to https://bubs-sepolia.explorer.caldera.xyz/.

Status

To see the status and uptime information for Bubs, visit the status page.

Next steps

Now that you have a better understanding of the Bubs Testnet and its integration of OP Stack and Celestia, you can start exploring its capabilities.

+ \ No newline at end of file diff --git a/pr-1699/developers/build-whatever.html b/pr-1699/developers/build-whatever.html index 2cfb204f47..dc0a2c93e8 100644 --- a/pr-1699/developers/build-whatever.html +++ b/pr-1699/developers/build-whatever.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Build whatever

If you're a developer and want to know what the benefits of modular blockchains are for you, you’ve come to the right place. This page will give you the rundown on modular blockchains and their benefits for developers like you.

This section provides various guides and tutorials that cover different options for deploying rollups on Celestia.

Quickstart - Building on Celestia

Choose a framework

So, you’re ready to start experimenting and building on Celestia? Here are a few options that are currently available for developers.

Rollups as a Service

Deploy your rollup with a RaaS provider.

Smart contracts

Deploy your smart contracts on dedicated EVM-compatible rollups.

What is a rollup?

A rollup is a type of blockchain that offloads some work to a layer 1, like Celestia. Rollups host applications and process user transactions. Once those transactions get processed, they are then published to layer 1. It’s layer 1s job to order those transactions and check that they are available, at minimum.

What is a modular blockchain?

With blockchains there are more or less four core functions that they do.

  • Execution: transaction execution and state update.
  • Settlement: finality and dispute resolution.
  • Consensus: agreement on transaction ordering.
  • Data availability: prove data was published to the network.

Modular blockchains specialize in one or two of these functions rather than doing all of them like a monolithic blockchain. You probably know about layer 1s and layer 2s. That’s the general idea.

A typical example of a modular blockchain you might’ve heard of is a rollup. Rollups host smart contracts and execute transactions, much like any monolithic chain. But, the data of those transactions get sent to a layer 1 blockchain to carry out the remaining functions.

If you want to brush up on your understanding of modular blockchains, head over to learn modular.

Benefits of modular blockchains

Ease of deploying a chain

One of the goals of modular blockchains is to make it as easy to deploy a blockchain as a smart contract. There are a few unique ways that modular blockchains can significantly reduce the cost of deploying a new blockchain.

  1. No validator set is required. Rollups can deploy without sourcing their own set of validators or sequencers.
  2. Inherit security from the start. Rollups don’t need to build all their security from scratch.
  3. Any part of the stack can be delegated. Development time can be reduced by outsourcing functions of the rollup to external providers.

All in all, builders will be able to outsource as much of the stack as they need. Deploying a new blockchain will be as simple as clicking a few options to initialize a production-ready rollup.

Scaling

Of course, a much higher scale is necessary if we want to support many more users. And modular blockchains use some new innovative technologies that can help us get there.

  • Data availability sampling enables modular blockchains like Celestia to scale data availability with the number of light nodes - that means more capacity for rollups.
  • Fraud and validity proofs make rollups vastly more efficient to verify. Nodes only need to verify a small proof of transaction validity (validity proof) or assume transactions are valid by default (fraud proof). This means rollups don’t require every node in the network to re-execute every transaction.

image

  • Decoupling execution from consensus lets developers define the VM that best fits the scaling needs of their application.
  • Separating applications across multiple rollups isolates congestion. If an application congests the execution capacity of one rollup, all other rollups remain unaffected in their execution capacity.

All these scaling properties combined make new types of applications and features possible, like onchain gaming, dynamic metadata, and ephemeral rollups, to name a few.

Customizability

By design, modular blockchains don’t lock in any feature set. They promote experimentation and customization.

Remember how decoupling execution from consensus enables VM customizability? Well, rollups are the execution component. Applications can run on their own rollup and adjust the VM to maximize their application's performance. Developers have that flexibility because Celestia's execution logic doesn't restrict rollups.

Basically, rollups can be customized to integrate any new or existing VM stack.

With existing rollup frameworks, developers can run rollup testnets using the EVM or Cosmos SDK. In the future, one can imagine a variety of VMs that rollup frameworks support, providing developers with more out-of-the-box options for their applications.

Some customizations that could be made to a rollup's VM include custom precompiles, changing transaction processing from sequential to parallel, or adding support for private smart contracts.

All of this only scratches the surface.

- +

Build whatever

If you're a developer and want to know what the benefits of modular blockchains are for you, you’ve come to the right place. This page will give you the rundown on modular blockchains and their benefits for developers like you.

This section provides various guides and tutorials that cover different options for deploying rollups on Celestia.

Quickstart - Building on Celestia

Choose a framework

So, you’re ready to start experimenting and building on Celestia? Here are a few options that are currently available for developers.

Rollups as a Service

Deploy your rollup with a RaaS provider.

Smart contracts

Deploy your smart contracts on dedicated EVM-compatible rollups.

What is a rollup?

A rollup is a type of blockchain that offloads some work to a layer 1, like Celestia. Rollups host applications and process user transactions. Once those transactions get processed, they are then published to layer 1. It’s layer 1s job to order those transactions and check that they are available, at minimum.

What is a modular blockchain?

With blockchains there are more or less four core functions that they do.

  • Execution: transaction execution and state update.
  • Settlement: finality and dispute resolution.
  • Consensus: agreement on transaction ordering.
  • Data availability: prove data was published to the network.

Modular blockchains specialize in one or two of these functions rather than doing all of them like a monolithic blockchain. You probably know about layer 1s and layer 2s. That’s the general idea.

A typical example of a modular blockchain you might’ve heard of is a rollup. Rollups host smart contracts and execute transactions, much like any monolithic chain. But, the data of those transactions get sent to a layer 1 blockchain to carry out the remaining functions.

If you want to brush up on your understanding of modular blockchains, head over to learn modular.

Benefits of modular blockchains

Ease of deploying a chain

One of the goals of modular blockchains is to make it as easy to deploy a blockchain as a smart contract. There are a few unique ways that modular blockchains can significantly reduce the cost of deploying a new blockchain.

  1. No validator set is required. Rollups can deploy without sourcing their own set of validators or sequencers.
  2. Inherit security from the start. Rollups don’t need to build all their security from scratch.
  3. Any part of the stack can be delegated. Development time can be reduced by outsourcing functions of the rollup to external providers.

All in all, builders will be able to outsource as much of the stack as they need. Deploying a new blockchain will be as simple as clicking a few options to initialize a production-ready rollup.

Scaling

Of course, a much higher scale is necessary if we want to support many more users. And modular blockchains use some new innovative technologies that can help us get there.

  • Data availability sampling enables modular blockchains like Celestia to scale data availability with the number of light nodes - that means more capacity for rollups.
  • Fraud and validity proofs make rollups vastly more efficient to verify. Nodes only need to verify a small proof of transaction validity (validity proof) or assume transactions are valid by default (fraud proof). This means rollups don’t require every node in the network to re-execute every transaction.

image

  • Decoupling execution from consensus lets developers define the VM that best fits the scaling needs of their application.
  • Separating applications across multiple rollups isolates congestion. If an application congests the execution capacity of one rollup, all other rollups remain unaffected in their execution capacity.

All these scaling properties combined make new types of applications and features possible, like onchain gaming, dynamic metadata, and ephemeral rollups, to name a few.

Customizability

By design, modular blockchains don’t lock in any feature set. They promote experimentation and customization.

Remember how decoupling execution from consensus enables VM customizability? Well, rollups are the execution component. Applications can run on their own rollup and adjust the VM to maximize their application's performance. Developers have that flexibility because Celestia's execution logic doesn't restrict rollups.

Basically, rollups can be customized to integrate any new or existing VM stack.

With existing rollup frameworks, developers can run rollup testnets using the EVM or Cosmos SDK. In the future, one can imagine a variety of VMs that rollup frameworks support, providing developers with more out-of-the-box options for their applications.

Some customizations that could be made to a rollup's VM include custom precompiles, changing transaction processing from sequential to parallel, or adding support for private smart contracts.

All of this only scratches the surface.

+ \ No newline at end of file diff --git a/pr-1699/developers/celestia-node-key.html b/pr-1699/developers/celestia-node-key.html index c5e841a6f7..f016a4b1f6 100644 --- a/pr-1699/developers/celestia-node-key.html +++ b/pr-1699/developers/celestia-node-key.html @@ -12,7 +12,7 @@ - + @@ -45,19 +45,19 @@ make cel-key
# dumps binary in current working directory, accessible via `./cel-key`
 make cel-key

or

sh
# installs binary in GOBIN path, accessible via `cel-key`
 make install-key
# installs binary in GOBIN path, accessible via `cel-key`
-make install-key

For the purpose of this guide, we will use the make cel-key command.

Steps for generating node keys

To generate a key for a Celestia node, select the tab for your node type:

TIP

You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

bash
./cel-key add <key-name> --keyring-backend test --node.type bridge \
+make install-key

For the purpose of this guide, we will use the make cel-key command.

Steps for generating node keys

To generate a key for a Celestia node, select the tab for your node type:

TIP

You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

bash
./cel-key add <key-name> --keyring-backend test --node.type bridge \
   --p2p.network <network>
./cel-key add <key-name> --keyring-backend test --node.type bridge \
   --p2p.network <network>
bash
./cel-key add <key-name> --keyring-backend test --node.type full \
   --p2p.network <network>
./cel-key add <key-name> --keyring-backend test --node.type full \
   --p2p.network <network>
bash
./cel-key add <key-name> --keyring-backend test --node.type light \
   --p2p.network <network>
./cel-key add <key-name> --keyring-backend test --node.type light \
-  --p2p.network <network>

This will load the key <key-name> into the directory of the node.

Further flags you can use to customize your key are the following:

  • --p2p.network: Specifies which network you want the key for. Values are arabica and mocha. Please note the default network will be mocha.

Keep in mind that your celestia-node will only pick up keys that are inside the default directory under /keys so you should make sure to point cel-key utility to the correct directory via the p2p.network or home flags if you have specified a custom directory or network other than Arabica, Mocha, or Mainnet Beta.

Also keep in mind that if you do not specify a network with --p2p.network, the default one will always be celestia (Mainnet Beta).

Steps for exporting node keys

You can export a private key from the local keyring in encrypted and ASCII-armored format.

bash
./cel-key export <key-name> --keyring-backend test --node.type bridge \
+  --p2p.network <network>

This will load the key <key-name> into the directory of the node.

Further flags you can use to customize your key are the following:

  • --p2p.network: Specifies which network you want the key for. Values are arabica and mocha. Please note the default network will be mocha.

Keep in mind that your celestia-node will only pick up keys that are inside the default directory under /keys so you should make sure to point cel-key utility to the correct directory via the p2p.network or home flags if you have specified a custom directory or network other than Arabica, Mocha, or Mainnet Beta.

Also keep in mind that if you do not specify a network with --p2p.network, the default one will always be celestia (Mainnet Beta).

Steps for exporting node keys

You can export a private key from the local keyring in encrypted and ASCII-armored format.

bash
./cel-key export <key-name> --keyring-backend test --node.type bridge \
   --p2p.network <network>
./cel-key export <key-name> --keyring-backend test --node.type bridge \
   --p2p.network <network>
bash
./cel-key export <key-name> --keyring-backend test --node.type full \
   --p2p.network <network>
./cel-key export <key-name> --keyring-backend test --node.type full \
   --p2p.network <network>
bash
./cel-key export <key-name> --keyring-backend test --node.type light \
   --p2p.network <network>
./cel-key export <key-name> --keyring-backend test --node.type light \
-  --p2p.network <network>

Steps for importing node keys

To import from a mnemonic, use the following command, then enter your bip39 mnemonic:

bash
./cel-key add <key-name> --recover --keyring-backend test \
+  --p2p.network <network>

Steps for importing node keys

To import from a mnemonic, use the following command, then enter your bip39 mnemonic:

bash
./cel-key add <key-name> --recover --keyring-backend test \
   --node.type bridge --p2p.network <network>
./cel-key add <key-name> --recover --keyring-backend test \
   --node.type bridge --p2p.network <network>
bash
./cel-key add <key-name> --recover --keyring-backend test \
   --node.type full --p2p.network <network>
./cel-key add <key-name> --recover --keyring-backend test \
@@ -101,8 +101,8 @@
 - address: celestia1wkhyhr7ngf0ayqlpnsnxg4d72hfs5453dvunm9
   name: my_celes_key
   pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A1/NsoY0RGL7Hqt4VWLg441GQKJsZ2fBUnZXipgns8oV"}'
-  type: local
- + type: local + \ No newline at end of file diff --git a/pr-1699/developers/deploy-on-bubs.html b/pr-1699/developers/deploy-on-bubs.html index 02d572036f..e9ecb73453 100644 --- a/pr-1699/developers/deploy-on-bubs.html +++ b/pr-1699/developers/deploy-on-bubs.html @@ -11,7 +11,7 @@ - + @@ -174,8 +174,8 @@ status 1 transactionHash 0x8f15d6004598f0662dd673a9898dceef77be8cc28408cecc284b28d7be32307d transactionIndex 0 -type 2

Now, we can make a read call to view the state of the number variable, using the cast call command:

bash
cast call $CONTRACT_ADDRESS "number()" --rpc-url $BUBS_RPC_URL
cast call $CONTRACT_ADDRESS "number()" --rpc-url $BUBS_RPC_URL

The result will look similar:

bash
0x000000000000000000000000000000000000000000000000000000000000000a
0x000000000000000000000000000000000000000000000000000000000000000a

Convert the result from hexadecimal to a base 10 value with:

bash
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))

Next steps

Congratulations! You've learned how to deploy a smart contract to Bubs testnet.

What will you build next? Now, you're ready to check out the GM Portal tutorial.

- +type 2

Now, we can make a read call to view the state of the number variable, using the cast call command:

bash
cast call $CONTRACT_ADDRESS "number()" --rpc-url $BUBS_RPC_URL
cast call $CONTRACT_ADDRESS "number()" --rpc-url $BUBS_RPC_URL

The result will look similar:

bash
0x000000000000000000000000000000000000000000000000000000000000000a
0x000000000000000000000000000000000000000000000000000000000000000a

Convert the result from hexadecimal to a base 10 value with:

bash
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))
echo $((0x000000000000000000000000000000000000000000000000000000000000000a))

Next steps

Congratulations! You've learned how to deploy a smart contract to Bubs testnet.

What will you build next? Now, you're ready to check out the GM Portal tutorial.

+ \ No newline at end of file diff --git a/pr-1699/developers/ethereum-fallback.html b/pr-1699/developers/ethereum-fallback.html index dd85055904..9d8be677ba 100644 --- a/pr-1699/developers/ethereum-fallback.html +++ b/pr-1699/developers/ethereum-fallback.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Ethereum fallback

Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:

In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.

Ethereum fallback is triggered whenever the sequencer has an error sending the PayForBlobs transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.

Ethereum fallback

- +

Ethereum fallback

Ethereum fallback is a mechanism that enables Ethereum L2s (or L3s) to “fall back” to using Ethereum calldata for data availability in the event of downtime on Celestia Mainnet Beta. This feature is currently supported by Celestia integrations with:

In the case of Celestia downtime or temporary unavailability, L2s can fallback to posting transactions as calldata on Ethereum or another DA layer for data availability instead of posting to Celestia. This mechanism ensures users can continue to transact securely and seamlessly, preventing disruptions and helping to ensure user funds do not get stuck in the L2's bridge on Ethereum.

Ethereum fallback is triggered whenever the sequencer has an error sending the PayForBlobs transaction on Celestia. Fallback can be triggered due to a congested mempool or nonce error and can be simulated with an error such as low balance or incorrect sequence. Fallback can also be triggered in the event Blobstream stops relaying attestations.

Ethereum fallback

+ \ No newline at end of file diff --git a/pr-1699/developers/feegrant-for-blobs.html b/pr-1699/developers/feegrant-for-blobs.html index e36566f24a..e15612416d 100644 --- a/pr-1699/developers/feegrant-for-blobs.html +++ b/pr-1699/developers/feegrant-for-blobs.html @@ -11,7 +11,7 @@ - + @@ -100,8 +100,8 @@ --broadcast-mode block \ --yes

Example: FeeGrant transaction on Mocha

Optional: Checking the granter's account

To confirm that the fees have been deducted from the granter's account that granted the fee allowance, run:

bash
celestia-appd query bank balances $GRANTER_ADDRESS \
 --node https://rpc.celestia-mocha.com:443 --denom utia
celestia-appd query bank balances $GRANTER_ADDRESS \
---node https://rpc.celestia-mocha.com:443 --denom utia

This output will show the remaining balance after fees have been deducted, confirming that the FeeGrant module is working as intended.

- +--node https://rpc.celestia-mocha.com:443 --denom utia

This output will show the remaining balance after fees have been deducted, confirming that the FeeGrant module is working as intended.

+ \ No newline at end of file diff --git a/pr-1699/developers/full-stack-modular-development-guide.html b/pr-1699/developers/full-stack-modular-development-guide.html index 3fcd8260ce..8ba95c7b57 100644 --- a/pr-1699/developers/full-stack-modular-development-guide.html +++ b/pr-1699/developers/full-stack-modular-development-guide.html @@ -11,7 +11,7 @@ - + @@ -930,8 +930,8 @@ && echo $PRIVATE_KEY | pbcopy
PRIVATE_KEY=$(ethermintd keys unsafe-export-eth-key mykey --keyring-backend test)
 && echo $PRIVATE_KEY | pbcopy

Now, import the private key to MetaMask and switch to that account.

Next, let’s run it on your Ethermint rollup.

To do so, first update the contractAddress variable with the contract address deployed to Ethermint:

jsx
/* src/App.jsx */
 const contractAddress = "your-ethermint-contract-address";
/* src/App.jsx */
-const contractAddress = "your-ethermint-contract-address";

Next, run the React application:

bash
npm run dev
npm run dev

When you run the app, you should now be connected to and using the Ethermint rollup.

If you imported the address that started the chain, you'll see quite a large balance.

Now give it a spin 🌀

Now that you have your dapp running, go ahead and test out a new post on your Ethermint sovereign rollup. If you enjoyed this tutorial, be sure to share your example in our Discord!

- +const contractAddress = "your-ethermint-contract-address";

Next, run the React application:

bash
npm run dev
npm run dev

When you run the app, you should now be connected to and using the Ethermint rollup.

If you imported the address that started the chain, you'll see quite a large balance.

Now give it a spin 🌀

Now that you have your dapp running, go ahead and test out a new post on your Ethermint sovereign rollup. If you enjoyed this tutorial, be sure to share your example in our Discord!

+ \ No newline at end of file diff --git a/pr-1699/developers/gm-portal-bubs.html b/pr-1699/developers/gm-portal-bubs.html index ca4206f587..5c9edb768c 100644 --- a/pr-1699/developers/gm-portal-bubs.html +++ b/pr-1699/developers/gm-portal-bubs.html @@ -11,7 +11,7 @@ - + @@ -58,8 +58,8 @@ cast send --private-key $PRIVATE_KEY $RECEIVER --value 1ether --rpc-url $BUBS_RPC_URL
export RECEIVER=<receiver ETH address>
 cast send --private-key $PRIVATE_KEY $RECEIVER --value 1ether --rpc-url $BUBS_RPC_URL

If you are in a different terminal than the one you set the private key in, you may need to set it again.

Update the frontend

Next, you will need to update a few things before you can interact with the contract on the frontend:

  1. Change the contract address on gm-portal/frontend/src/App.tsx to your contract address
  2. Match the chain info on gm-portal/frontend/src/main.tsx with the chain config of your L2
  3. If you changed the contract, update the ABI in gm-portal/frontend/GmPortal.json from gm-portal/contracts/out/GmPortal.sol/GmPortal.json. This can be done with:
bash
cd $HOME
 cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend
cd $HOME
-cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend

Interact with the frontend

Now, login with your wallet that you funded, and post a GM on your GM portal!

gm-bubs

Next steps

There are many possibilities of what could be built with this stack. These projects would be good to build on this stack:

  • onchain gaming
  • decentralized social media
  • an NFT ticketing rollup
  • Optimism on CelOPstia
  • OP Craft on Celestia
- +cp dev/gm-portal/contracts/out/GmPortal.sol/GmPortal.json dev/gm-portal/frontend

Interact with the frontend

Now, login with your wallet that you funded, and post a GM on your GM portal!

gm-bubs

Next steps

There are many possibilities of what could be built with this stack. These projects would be good to build on this stack:

  • onchain gaming
  • decentralized social media
  • an NFT ticketing rollup
  • Optimism on CelOPstia
  • OP Craft on Celestia
+ \ No newline at end of file diff --git a/pr-1699/developers/golang-client-tutorial.html b/pr-1699/developers/golang-client-tutorial.html index 27563bb512..28a4549947 100644 --- a/pr-1699/developers/golang-client-tutorial.html +++ b/pr-1699/developers/golang-client-tutorial.html @@ -11,7 +11,7 @@ - + @@ -276,8 +276,8 @@ // Fetch the EDS return client.Share.GetEDS(ctx, header) -}

API documentation

To see the full list of available methods, see the API documentation.

- +}

API documentation

To see the full list of available methods, see the API documentation.

+ \ No newline at end of file diff --git a/pr-1699/developers/integrate-celestia.html b/pr-1699/developers/integrate-celestia.html index 8a9589a160..3399988530 100644 --- a/pr-1699/developers/integrate-celestia.html +++ b/pr-1699/developers/integrate-celestia.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Integrate Celestia for service providers

This document is for third-party service providers, such as custodians and explorers, integrating the Celestia network.

Getting started

When getting started Celestia, we recommend checking out these resources first:

Celestia service provider notes

Celestia is a fairly standard Cosmos-SDK based chain. We use the latest version of Tendermint and the Cosmos-SDK, with only minor modifications to each. This means that we are:

  • Using the default Cosmos-SDK modules: auth, bank, distribution, staking, slashing, mint, crisis, ibchost, genutil, evidence, ibctransfer, params, gov (limited in some TBD capacities), upgrade, vesting, feegrant, capability, and payment.
  • Use the standard digital keys schemes provided by the Cosmos-SDK and Tendermint, those being secp256k1 for user transactions, and tm-ed25519 for signing and verifying consensus messages.

While exactly which modules used is subject to change, Celestia aims to be as minimal as possible.

Custody and key management

Celestia supports many already existing key management systems, as we rely on the Cosmos-SDK and Tendermint libraries for signing and verifying transactions. Learn more in the Cosmos-SDK documentation

RPC and querying

In celestia-app, only the standard RPC endpoints for Tendermint and the Cosmos-SDK are exposed. We do not currently add or subtract any core functionality, but this could change in the future. The same goes for querying data from the chain.

In celestia-node, the Data Availability node client, there is a JSON-RPC API that allows you to interact directly with Celestia's Data Availability layer. Learn how to use the API in this tutorial.

Compatibility

Linux, particularly Ubuntu 20.04 LTS, is the most well tested. Potentially compatible with other OSs, but they are currently untested. Some of the cryptography libraries used for erasure data are not guaranteed to work on other platforms.

Syncing

Since we utilize Tendermint and the Cosmos-SDK, syncing the chain can be performed by any method that is supported by those libraries. This includes fast-sync, state sync, and quick sync.

Notable exceptions relative to other blockchains

Relative to other Tendermint based chains, Celestia will have significantly longer blocktimes of roughly 12* seconds. The reason behind this block time is to optimize the bandwidth used by light clients that are sampling the chain, and is not because we have modified Tendermint consensus in any meaningful way. Validators will likely download/upload relatively large blocks. It should be noted that while these blocks are large, very little typical blockchain state execution is actually occurring on Celestia. Meaning that the bandwidth requirements will likely be larger than that of a typical Cosmos-SDK based blockchain full node, the computing requirements should be similar in magnitude.

*Subject to Change

- +

Integrate Celestia for service providers

This document is for third-party service providers, such as custodians and explorers, integrating the Celestia network.

Getting started

When getting started Celestia, we recommend checking out these resources first:

Celestia service provider notes

Celestia is a fairly standard Cosmos-SDK based chain. We use the latest version of Tendermint and the Cosmos-SDK, with only minor modifications to each. This means that we are:

  • Using the default Cosmos-SDK modules: auth, bank, distribution, staking, slashing, mint, crisis, ibchost, genutil, evidence, ibctransfer, params, gov (limited in some TBD capacities), upgrade, vesting, feegrant, capability, and payment.
  • Use the standard digital keys schemes provided by the Cosmos-SDK and Tendermint, those being secp256k1 for user transactions, and tm-ed25519 for signing and verifying consensus messages.

While exactly which modules used is subject to change, Celestia aims to be as minimal as possible.

Custody and key management

Celestia supports many already existing key management systems, as we rely on the Cosmos-SDK and Tendermint libraries for signing and verifying transactions. Learn more in the Cosmos-SDK documentation

RPC and querying

In celestia-app, only the standard RPC endpoints for Tendermint and the Cosmos-SDK are exposed. We do not currently add or subtract any core functionality, but this could change in the future. The same goes for querying data from the chain.

In celestia-node, the Data Availability node client, there is a JSON-RPC API that allows you to interact directly with Celestia's Data Availability layer. Learn how to use the API in this tutorial.

Compatibility

Linux, particularly Ubuntu 20.04 LTS, is the most well tested. Potentially compatible with other OSs, but they are currently untested. Some of the cryptography libraries used for erasure data are not guaranteed to work on other platforms.

Syncing

Since we utilize Tendermint and the Cosmos-SDK, syncing the chain can be performed by any method that is supported by those libraries. This includes fast-sync, state sync, and quick sync.

Notable exceptions relative to other blockchains

Relative to other Tendermint based chains, Celestia will have significantly longer blocktimes of roughly 12* seconds. The reason behind this block time is to optimize the bandwidth used by light clients that are sampling the chain, and is not because we have modified Tendermint consensus in any meaningful way. Validators will likely download/upload relatively large blocks. It should be noted that while these blocks are large, very little typical blockchain state execution is actually occurring on Celestia. Meaning that the bandwidth requirements will likely be larger than that of a typical Cosmos-SDK based blockchain full node, the computing requirements should be similar in magnitude.

*Subject to Change

+ \ No newline at end of file diff --git a/pr-1699/developers/intro-to-op-stack.html b/pr-1699/developers/intro-to-op-stack.html index c208c62a55..6d55432299 100644 --- a/pr-1699/developers/intro-to-op-stack.html +++ b/pr-1699/developers/intro-to-op-stack.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Introduction to OP Stack integration

Optimism is a low-cost and lightning-fast Ethereum L2 blockchain, built with the OP Stack.

Celestia is a modular consensus and data availability (DA) network, built to enable anyone to easily deploy their own blockchain with minimal overhead.

Together, they allow developers to create rollups that post data to Celestia and settle on Ethereum.

About the integration

Optimism uses Ethereum as a DA layer. Currently, settlement and DA for Optimism are on Ethereum, both onchain. op-batcher batches up rollup blocks and posts to Ethereum.

The integration of OP Stack with Celestia underneath for DA allows rollup operators to reduce overhead that is associated with posting data as calldata on Ethereum. Instead, op-batcher batches up rollup blocks and posts them to Celestia's DA network.

Data is managed in two ways. First, data is written to the data availability (DA) layer i.e. in this case Celestia, then the data commitment is written to the op-batcher. When reading op-node simply reads the data back from the DA layer by reading the data commitment from the op-batcher first, then reading the data from the DA layer using the data commitment. While previously op-node was reading from calldata on Ethereum, it now reads data from Celestia.

There are a few tools involved in the data handling process. op-batcher batches up rollup blocks and posts them to Ethereum. op-geth handles execution, while op-proposer is responsible for state commitment submission.

By using Celestia as a DA layer, existing L2s can switch from posting their data as calldata on Ethereum, to posting to Celestia. The commitment to the block is posted on Celestia, which is purpose-built for data availability. This is a more scalable than the traditional method of posting this data as calldata on monolithic chains.

GitHub repository

Find the repository for this integration at https://github.com/celestiaorg/optimism.

WARNING

This is a beta integration and we are working on resolving open issues.

Category contents

This category will guide you through interacting with existing OP Stack rollups with Celestia underneath, then how to start your own devnet with a modified version of optimism-bedrock that uses Celestia as a DA layer.

Next steps

Now that you understand the integration, you can start learning about the Bubs testnet, built with OP Stack and Celestia! This testnet is a great way to explore the possibilities of this integration and test your applications in a live environment.

- +

Introduction to OP Stack integration

Optimism is a low-cost and lightning-fast Ethereum L2 blockchain, built with the OP Stack.

Celestia is a modular consensus and data availability (DA) network, built to enable anyone to easily deploy their own blockchain with minimal overhead.

Together, they allow developers to create rollups that post data to Celestia and settle on Ethereum.

About the integration

Optimism uses Ethereum as a DA layer. Currently, settlement and DA for Optimism are on Ethereum, both onchain. op-batcher batches up rollup blocks and posts to Ethereum.

The integration of OP Stack with Celestia underneath for DA allows rollup operators to reduce overhead that is associated with posting data as calldata on Ethereum. Instead, op-batcher batches up rollup blocks and posts them to Celestia's DA network.

Data is managed in two ways. First, data is written to the data availability (DA) layer i.e. in this case Celestia, then the data commitment is written to the op-batcher. When reading op-node simply reads the data back from the DA layer by reading the data commitment from the op-batcher first, then reading the data from the DA layer using the data commitment. While previously op-node was reading from calldata on Ethereum, it now reads data from Celestia.

There are a few tools involved in the data handling process. op-batcher batches up rollup blocks and posts them to Ethereum. op-geth handles execution, while op-proposer is responsible for state commitment submission.

By using Celestia as a DA layer, existing L2s can switch from posting their data as calldata on Ethereum, to posting to Celestia. The commitment to the block is posted on Celestia, which is purpose-built for data availability. This is a more scalable than the traditional method of posting this data as calldata on monolithic chains.

GitHub repository

Find the repository for this integration at https://github.com/celestiaorg/optimism.

WARNING

This is a beta integration and we are working on resolving open issues.

Category contents

This category will guide you through interacting with existing OP Stack rollups with Celestia underneath, then how to start your own devnet with a modified version of optimism-bedrock that uses Celestia as a DA layer.

Next steps

Now that you understand the integration, you can start learning about the Bubs testnet, built with OP Stack and Celestia! This testnet is a great way to explore the possibilities of this integration and test your applications in a live environment.

+ \ No newline at end of file diff --git a/pr-1699/developers/multiaccounts.html b/pr-1699/developers/multiaccounts.html index 7b6daf4bd7..59810de346 100644 --- a/pr-1699/developers/multiaccounts.html +++ b/pr-1699/developers/multiaccounts.html @@ -11,7 +11,7 @@ - + @@ -42,8 +42,8 @@ --p2p.network=arabica --keyring.keyname testKey
celestia light start --core.ip=consensus.celestia-arabica-11.com \
     --p2p.network=arabica --keyring.keyname testKey

In this example, testKey becomes the default node key, and the node's address will change accordingly.

Submitting blobs with a different signer/key name

Option 1: Submit passing key name

You can submit a blob by specifying a different key name:

sh
celestia blob submit 0x42690c204d39600fddd3 'gm' --key.name testKey2
celestia blob submit 0x42690c204d39600fddd3 'gm' --key.name testKey2

This transaction will be signed by the address associated with testKey2.

Option 2: Submit passing signer address

Alternatively, you can submit a blob by specifying the signer's address:

sh
celestia blob submit 0x42690c204d39600fddd3 'gm' --signer $SIGNER_ADDRESS
celestia blob submit 0x42690c204d39600fddd3 'gm' --signer $SIGNER_ADDRESS

Both options achieve the same result but use different inputs. The testKey2 points to SIGNER_ADDRESS in the KeyStore.

Key management

All keys and addresses must be added to the KeyStore. To create a new key, use the cel-key library:

Creating a new key

sh
./cel-key add testKey --keyring-backend test \
     --node.type light --p2p.network arabica
./cel-key add testKey --keyring-backend test \
-    --node.type light --p2p.network arabica

Importing an existing key

sh
./cel-key import
./cel-key import

Learn more on the Create a wallet with celestia-node page.

Optional flags for write transactions

All other flags are now optional for all write transactions. This means you don't have to specify gas/fee parameters each time. The configuration can handle it for you automatically.

The default configuration applies to all write transactions, including those in the state module and blob.Submit. This simplifies the process of submitting transactions and reduces the need for manual input.

For reference, see the:

- + --node.type light --p2p.network arabica

Importing an existing key

sh
./cel-key import
./cel-key import

Learn more on the Create a wallet with celestia-node page.

Optional flags for write transactions

All other flags are now optional for all write transactions. This means you don't have to specify gas/fee parameters each time. The configuration can handle it for you automatically.

The default configuration applies to all write transactions, including those in the state module and blob.Submit. This simplifies the process of submitting transactions and reduces the need for manual input.

For reference, see the:

+ \ No newline at end of file diff --git a/pr-1699/developers/node-api.html b/pr-1699/developers/node-api.html index 3e9792ac9a..c53e03572d 100644 --- a/pr-1699/developers/node-api.html +++ b/pr-1699/developers/node-api.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Node API

The celestia-node API is made for interacting with celestia-node. There are two ways in which a user and developer can interact with the API, the RPC API and the Gateway API. View the API's documentation.

RPC API

The RPC API primarily focuses on developers and projects building on top of Celestia, who are willing to run their own DA nodes. The RPC API provides a richer set of features and a superior user experience. Unlike the Gateway API, the RPC API allows access to the internal wallet and keyring of the DA node, as well as other sensitive and administrative capabilities.

Library

The node can be used as a Golang library and designed for programmatic API access.

RPC

The RPC API is also exposed to OpenRPC(JSON-RPC 2.0) for users wanting to run their DA node as a separate DA service. It provides the same set of features as the library with an additional authentication system with different permissions levels to protect the wallet and signing + providing RPC-level DOS protection.

RPC API tutorial

The node tutorial, which uses the RPC CLI, is the recommended way to get started interacting with your Celestia node.

Gateway API

WARNING

The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

The gateway API is a REST API which is meant to be deployed by infra providers to enable the public read-only gateway to the DA network for external users who don't want or can't run light nodes (like browsers currently) over HTTP. It has no wallet or signing functionality.

Gateway API tutorial

Check out the Prompt scavenger gateway API tutorial for more details.

- +

Node API

The celestia-node API is made for interacting with celestia-node. There are two ways in which a user and developer can interact with the API, the RPC API and the Gateway API. View the API's documentation.

RPC API

The RPC API primarily focuses on developers and projects building on top of Celestia, who are willing to run their own DA nodes. The RPC API provides a richer set of features and a superior user experience. Unlike the Gateway API, the RPC API allows access to the internal wallet and keyring of the DA node, as well as other sensitive and administrative capabilities.

Library

The node can be used as a Golang library and designed for programmatic API access.

RPC

The RPC API is also exposed to OpenRPC(JSON-RPC 2.0) for users wanting to run their DA node as a separate DA service. It provides the same set of features as the library with an additional authentication system with different permissions levels to protect the wallet and signing + providing RPC-level DOS protection.

RPC API tutorial

The node tutorial, which uses the RPC CLI, is the recommended way to get started interacting with your Celestia node.

Gateway API

WARNING

The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

The gateway API is a REST API which is meant to be deployed by infra providers to enable the public read-only gateway to the DA network for external users who don't want or can't run light nodes (like browsers currently) over HTTP. It has no wallet or signing functionality.

Gateway API tutorial

Check out the Prompt scavenger gateway API tutorial for more details.

+ \ No newline at end of file diff --git a/pr-1699/developers/node-tutorial.html b/pr-1699/developers/node-tutorial.html index 150cb390dc..6c0665566d 100644 --- a/pr-1699/developers/node-tutorial.html +++ b/pr-1699/developers/node-tutorial.html @@ -12,7 +12,7 @@ - + @@ -39,11 +39,11 @@

Celestia-node RPC CLI tutorial

In this tutorial, we will cover how to use the celestia-node RPC API to submit and retrieve data (blobs) from the data availability layer by their namespace.

Introduction

Blobs

Data is posted to Celestia's DA layer by using MsgPayForBlobs transactions to the core network. Read more about MsgPayForBlobs.

Namespaces

Celestia partitions the block data into multiple namespaces, one for every application. This allows applications to only download their data, and not the data of other applications. Read more about Namespaced Merkle trees (NMTs).

TIP

If you already have a running and funded node, you can skip to the RPC CLI guide section.

WARNING

The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

Hardware requirements

The following minimum hardware requirements are recommended for running a light node:

  • Memory: 500 MB RAM (minimum)
  • CPU: Single Core
  • Disk: 50 GB SSD Storage
  • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

Setting up dependencies

Install dependencies and celestia-node if you have not already.

Instantiate a Celestia light node

Now, let's instantiate a Celestia Light node:

TIP

RPC endpoints are exposed in all celestia-node types such as light, bridge and full nodes.

bash
celestia light init
celestia light init
bash
celestia light init --p2p.network mocha
celestia light init --p2p.network mocha
bash
celestia light init --p2p.network arabica
celestia light init --p2p.network arabica

Instantiating (or initializing) the node means setting up a node store on your machine. This is where the data and your keys will be stored.

Connect to a core endpoint

Let's now run the Celestia Light node with a gRPC connection to an example core endpoint. Connecting to a core endpoint provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

Note: You are also encouraged to find a community-run API endpoint and there are several in the Discord. This one is used for demonstration purposes. Check out the Mocha testnet page, or Arabica devnet page.

bash
celestia light start --core.ip <URI>
celestia light start --core.ip <URI>
bash
celestia light start --core.ip <URI> --p2p.network mocha
celestia light start --core.ip <URI> --p2p.network mocha
bash
celestia light start --core.ip <URI> --p2p.network arabica
celestia light start --core.ip <URI> --p2p.network arabica

TIP

The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

For example, your command along with an RPC endpoint might look like this:

bash
celestia light start --core.ip consensus.lunaroasis.net
celestia light start --core.ip consensus.lunaroasis.net
bash
celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
bash
celestia light start --core.ip validator-1.celestia-arabica-11.com \
+

Celestia-node RPC CLI tutorial

In this tutorial, we will cover how to use the celestia-node RPC API to submit and retrieve data (blobs) from the data availability layer by their namespace.

Introduction

Blobs

Data is posted to Celestia's DA layer by using MsgPayForBlobs transactions to the core network. Read more about MsgPayForBlobs.

Namespaces

Celestia partitions the block data into multiple namespaces, one for every application. This allows applications to only download their data, and not the data of other applications. Read more about Namespaced Merkle trees (NMTs).

TIP

If you already have a running and funded node, you can skip to the RPC CLI guide section.

WARNING

The gateway endpoints have been deprecated and will be removed in the future. If you would like to use them anyway, you can find more details on GitHub.

Hardware requirements

The following minimum hardware requirements are recommended for running a light node:

  • Memory: 500 MB RAM (minimum)
  • CPU: Single Core
  • Disk: 50 GB SSD Storage
  • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

Setting up dependencies

Install dependencies and celestia-node if you have not already.

Instantiate a Celestia light node

Now, let's instantiate a Celestia Light node:

TIP

RPC endpoints are exposed in all celestia-node types such as light, bridge and full nodes.

bash
celestia light init
celestia light init
bash
celestia light init --p2p.network mocha
celestia light init --p2p.network mocha
bash
celestia light init --p2p.network arabica
celestia light init --p2p.network arabica

Instantiating (or initializing) the node means setting up a node store on your machine. This is where the data and your keys will be stored.

Connect to a core endpoint

Let's now run the Celestia Light node with a gRPC connection to an example core endpoint. Connecting to a core endpoint provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

Note: You are also encouraged to find a community-run API endpoint and there are several in the Discord. This one is used for demonstration purposes. Check out the Mocha testnet page, or Arabica devnet page.

bash
celestia light start --core.ip <URI>
celestia light start --core.ip <URI>
bash
celestia light start --core.ip <URI> --p2p.network mocha
celestia light start --core.ip <URI> --p2p.network mocha
bash
celestia light start --core.ip <URI> --p2p.network arabica
celestia light start --core.ip <URI> --p2p.network arabica

TIP

The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

For example, your command along with an RPC endpoint might look like this:

bash
celestia light start --core.ip consensus.lunaroasis.net
celestia light start --core.ip consensus.lunaroasis.net
bash
celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
bash
celestia light start --core.ip validator-1.celestia-arabica-11.com \
   --p2p.network arabica
celestia light start --core.ip validator-1.celestia-arabica-11.com \
   --p2p.network arabica

Keys and wallets

You can create your key for your node by running the following command from the celestia-node directory:

TIP

You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

bash
./cel-key add <key-name> --keyring-backend test --node.type light \
   --p2p.network <network>
./cel-key add <key-name> --keyring-backend test --node.type light \
-  --p2p.network <network>

You can start your light node with the key created by running the following command:

bash
celestia light start --core.ip <URI> --keyring.keyname <key-name>
celestia light start --core.ip <URI> --keyring.keyname <key-name>
bash
celestia light start --core.ip <URI> --keyring.keyname <key-name> \
+  --p2p.network <network>

You can start your light node with the key created by running the following command:

bash
celestia light start --core.ip <URI> --keyring.keyname <key-name>
celestia light start --core.ip <URI> --keyring.keyname <key-name>
bash
celestia light start --core.ip <URI> --keyring.keyname <key-name> \
   --p2p.network mocha
celestia light start --core.ip <URI> --keyring.keyname <key-name> \
   --p2p.network mocha
bash
celestia light start --core.ip <URI> --keyring.keyname <key-name> \
   --p2p.network arabica
celestia light start --core.ip <URI> --keyring.keyname <key-name> \
@@ -435,8 +435,8 @@
     ],
     0.002
   ]
-}' 127.0.0.1:26658
  1. Upon successful blob submission, the result will show the block height:
bash
{"jsonrpc":"2.0","result":362101,"id":1}
{"jsonrpc":"2.0","result":362101,"id":1}

The example transaction can be found on Celenium.

Post an SVG as a PFB

If you'd like to create your own SVG, post it to Celestia, and retrieve it, you can check out the Base64 SVG Tutorial.

Troubleshooting

If you encounter an error like:

sh
"rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"
"rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"

It is possible that the account you are trying to submit a PayForBlobs from doesn't have testnet tokens yet. Ensure the testnet faucet has funded your account with tokens and then try again.

- +}' 127.0.0.1:26658
  1. Upon successful blob submission, the result will show the block height:
bash
{"jsonrpc":"2.0","result":362101,"id":1}
{"jsonrpc":"2.0","result":362101,"id":1}

The example transaction can be found on Celenium.

Post an SVG as a PFB

If you'd like to create your own SVG, post it to Celestia, and retrieve it, you can check out the Base64 SVG Tutorial.

Troubleshooting

If you encounter an error like:

sh
"rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"
"rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"

It is possible that the account you are trying to submit a PayForBlobs from doesn't have testnet tokens yet. Ensure the testnet faucet has funded your account with tokens and then try again.

+ \ No newline at end of file diff --git a/pr-1699/developers/optimism-devnet.html b/pr-1699/developers/optimism-devnet.html index 37e79610a6..a4700ad8dc 100644 --- a/pr-1699/developers/optimism-devnet.html +++ b/pr-1699/developers/optimism-devnet.html @@ -11,7 +11,7 @@ - + @@ -112,8 +112,8 @@ value 0 yParity 0

TIP

You are looking for a batcher transaction to the address 0xFf00000000000000000000000000000000000901.

First, remove the prefix 0xce. Now, set the input as the INPUT variable and encode it as base64:

bash
export INPUT=3500000000000000769074a923011bdda721eacc34c8a77c69c10f2b6c8e659f987e82f217a5340f
 export ENCODED_INPUT=$(echo "$INPUT" | xxd -r -p | base64)
export INPUT=3500000000000000769074a923011bdda721eacc34c8a77c69c10f2b6c8e659f987e82f217a5340f
-export ENCODED_INPUT=$(echo "$INPUT" | xxd -r -p | base64)

TIP

Remember to remove the 0xce prefix!

Find the data on Celestia

bash
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $CELESTIA_NODE_AUTH_TOKEN" -d '{ "id": 1, "jsonrpc": "2.0", "method": "da.Get", "params": [["$ENCODED_INPUT"], "AAAAAAAAAAAAAAAAAAAAAAAAAAECAwQFBgcICRA="]}' http://127.0.0.1:26658
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $CELESTIA_NODE_AUTH_TOKEN" -d '{ "id": 1, "jsonrpc": "2.0", "method": "da.Get", "params": [["$ENCODED_INPUT"], "AAAAAAAAAAAAAAAAAAAAAAAAAAECAwQFBgcICRA="]}' http://127.0.0.1:26658

The params are []blobs, namespace, base64-encoded.

Your result will look similar to the below!

console
{"jsonrpc":"2.0","result":["SGVsbG8gd28ybGQh"],"id":1}
{"jsonrpc":"2.0","result":["SGVsbG8gd28ybGQh"],"id":1}

Span batches

Span batches can be enabled by setting OP_BATCHER_BATCH_TYPE: 1 in your docker-compose.yml file.

Note that this requires the Delta activation time to be configured. For your devnet, you should set "l2GenesisDeltaTimeOffset": "0x0", in devnetL1-template.json. This will enable span batches and can be tested by grepping docker compose logs -f | grep batch_type which should include batch_type=SpanBatch and batch_type=1.

- +export ENCODED_INPUT=$(echo "$INPUT" | xxd -r -p | base64)

TIP

Remember to remove the 0xce prefix!

Find the data on Celestia

bash
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $CELESTIA_NODE_AUTH_TOKEN" -d '{ "id": 1, "jsonrpc": "2.0", "method": "da.Get", "params": [["$ENCODED_INPUT"], "AAAAAAAAAAAAAAAAAAAAAAAAAAECAwQFBgcICRA="]}' http://127.0.0.1:26658
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $CELESTIA_NODE_AUTH_TOKEN" -d '{ "id": 1, "jsonrpc": "2.0", "method": "da.Get", "params": [["$ENCODED_INPUT"], "AAAAAAAAAAAAAAAAAAAAAAAAAAECAwQFBgcICRA="]}' http://127.0.0.1:26658

The params are []blobs, namespace, base64-encoded.

Your result will look similar to the below!

console
{"jsonrpc":"2.0","result":["SGVsbG8gd28ybGQh"],"id":1}
{"jsonrpc":"2.0","result":["SGVsbG8gd28ybGQh"],"id":1}

Span batches

Span batches can be enabled by setting OP_BATCHER_BATCH_TYPE: 1 in your docker-compose.yml file.

Note that this requires the Delta activation time to be configured. For your devnet, you should set "l2GenesisDeltaTimeOffset": "0x0", in devnetL1-template.json. This will enable span batches and can be tested by grepping docker compose logs -f | grep batch_type which should include batch_type=SpanBatch and batch_type=1.

+ \ No newline at end of file diff --git a/pr-1699/developers/optimism.html b/pr-1699/developers/optimism.html index 1113597352..0ec60078bf 100644 --- a/pr-1699/developers/optimism.html +++ b/pr-1699/developers/optimism.html @@ -12,7 +12,7 @@ - + @@ -39,7 +39,7 @@

Run an OP Stack rollup with Celestia underneath

This guide will show you how to run your own OP Stack devnet and testnet that posts data to Celestia's Mocha testnet using roll-op and op-plasma-celestia.

If you don't have devops experience and would like to use a Rollups as a Service (RaaS) provider, see the RaaS category in the menu.

Dependency setup

Setting up your light node

Sync and fund a Celestia light node. The light node must be fully synced and funded for you to be able to submit and retrieve PayForBlobs to Mocha Testnet. This allows your rollup to post and retrieve data without any errors.

In order to mount existing data, you must have a node store that is in the default directory:

bash
$HOME/.celestia-light-mocha-4
$HOME/.celestia-light-mocha-4
bash
$HOME/.celestia-light
$HOME/.celestia-light
bash
$HOME/.celestia-light-arabica-11
$HOME/.celestia-light-arabica-11

By default, the node will run with the account named my_celes_key on Mocha. This is the account that needs to be funded.

TIP

Unless you changed your configuration, you won't have to change anything. 😎

Deploying a devnet to Mocha

See the Alt-DA x Celestia README for instructions on how to deploy a Devnet.

TIP for macOS users

If you are on macOS, you will need to run a venv before starting roll-op.

sh
cd $HOME/roll-op
+

Run an OP Stack rollup with Celestia underneath

This guide will show you how to run your own OP Stack devnet and testnet that posts data to Celestia's Mocha testnet using roll-op and op-plasma-celestia.

If you don't have devops experience and would like to use a Rollups as a Service (RaaS) provider, see the RaaS category in the menu.

Dependency setup

Setting up your light node

Sync and fund a Celestia light node. The light node must be fully synced and funded for you to be able to submit and retrieve PayForBlobs to Mocha Testnet. This allows your rollup to post and retrieve data without any errors.

In order to mount existing data, you must have a node store that is in the default directory:

bash
$HOME/.celestia-light-mocha-4
$HOME/.celestia-light-mocha-4
bash
$HOME/.celestia-light
$HOME/.celestia-light
bash
$HOME/.celestia-light-arabica-11
$HOME/.celestia-light-arabica-11

By default, the node will run with the account named my_celes_key on Mocha. This is the account that needs to be funded.

TIP

Unless you changed your configuration, you won't have to change anything. 😎

Deploying a devnet to Mocha

See the Alt-DA x Celestia README for instructions on how to deploy a Devnet.

TIP for macOS users

If you are on macOS, you will need to run a venv before starting roll-op.

sh
cd $HOME/roll-op
 python3 -m venv ./venv
 source ./venv/bin/activate
cd $HOME/roll-op
 python3 -m venv ./venv
@@ -83,8 +83,8 @@
 admin_account = "0xaddress"
 admin_key = "privatekey"
 p2p_sequencer_account = "0xaddress"
-p2p_sequencer_key = "privatekey"

Your 0xaddress key must also be funded with testnet ETH. We recommend at least 10 SepoliaETH to get your chain started, but you will need more to keep it running longer.

Congratulations

Congrats! You now have an OP Stack rollup running with Celestia underneath.

You can learn more about Alt-DA in Optimism docs.

- +p2p_sequencer_key = "privatekey"

Your 0xaddress key must also be funded with testnet ETH. We recommend at least 10 SepoliaETH to get your chain started, but you will need more to keep it running longer.

Congratulations

Congrats! You now have an OP Stack rollup running with Celestia underneath.

You can learn more about Alt-DA in Optimism docs.

+ \ No newline at end of file diff --git a/pr-1699/developers/prompt-scavenger.html b/pr-1699/developers/prompt-scavenger.html index 2273f49e1e..3886ad4e8e 100644 --- a/pr-1699/developers/prompt-scavenger.html +++ b/pr-1699/developers/prompt-scavenger.html @@ -11,7 +11,7 @@ - + @@ -456,8 +456,8 @@ } log.Printf("GPT-3 response: %s\n", promptAnswer) -}

And now you have the final version of the prompt scavenger!

Run the golang script with the following command:

sh
go run main.go <nodeIP> <namespace> <prompt>
go run main.go <nodeIP> <namespace> <prompt>

For example, you could run:

sh
go run main.go ws://localhost:26658 ce1e5714 'What is a modular blockchain?'
go run main.go ws://localhost:26658 ce1e5714 'What is a modular blockchain?'

After some time, it’ll post the output of the prompt you submitted to OpenAI that you pulled from Celestia’s blockchain.

Next steps

With this tutorial, you were able to construct a blob, submit it to Celestia, get it back from Celestia, decode its contents, then for added bonus, submit the message to GPT-3.5.

If you're up for a challenge, you can refer to the Node API client guide and try to implement more advanced features, such as:

  • Subscribing to new prompts inside the ce1e5714 namespace, submitting each one to GPT-3.5
  • Posting the responses back to Celestia under a different namespace.
- +}

And now you have the final version of the prompt scavenger!

Run the golang script with the following command:

sh
go run main.go <nodeIP> <namespace> <prompt>
go run main.go <nodeIP> <namespace> <prompt>

For example, you could run:

sh
go run main.go ws://localhost:26658 ce1e5714 'What is a modular blockchain?'
go run main.go ws://localhost:26658 ce1e5714 'What is a modular blockchain?'

After some time, it’ll post the output of the prompt you submitted to OpenAI that you pulled from Celestia’s blockchain.

Next steps

With this tutorial, you were able to construct a blob, submit it to Celestia, get it back from Celestia, decode its contents, then for added bonus, submit the message to GPT-3.5.

If you're up for a challenge, you can refer to the Node API client guide and try to implement more advanced features, such as:

  • Subscribing to new prompts inside the ce1e5714 namespace, submitting each one to GPT-3.5
  • Posting the responses back to Celestia under a different namespace.
+ \ No newline at end of file diff --git a/pr-1699/developers/rust-client-tutorial.html b/pr-1699/developers/rust-client-tutorial.html index 3e6311f235..f1b7ca408f 100644 --- a/pr-1699/developers/rust-client-tutorial.html +++ b/pr-1699/developers/rust-client-tutorial.html @@ -11,7 +11,7 @@ - + @@ -208,8 +208,8 @@ .share_get_eds(&latest_header) .await .expect("Failed to get EDS from latest header") -}

API documentation

To see the full list of available methods, see the API documentation.

- +}

API documentation

To see the full list of available methods, see the API documentation.

+ \ No newline at end of file diff --git a/pr-1699/developers/sp1-blobstream-deploy.html b/pr-1699/developers/sp1-blobstream-deploy.html index e91dd77394..dfb5bc4982 100644 --- a/pr-1699/developers/sp1-blobstream-deploy.html +++ b/pr-1699/developers/sp1-blobstream-deploy.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@

New SP1 Blobstream deployments

This document provides instructions for deploying SP1 Blobstream to a new chain.

SP1 Blobstream is the latest implementation of Blobstream in Rust using the SP1 zkVM.

Deploying the contracts

To deploy SP1 Blobstream to a new chain, follow these steps:

  1. Clone the sp1-blobstream repository:
shell
git clone https://github.com/succinctlabs/sp1-blobstream
 cd sp1-blobstream
git clone https://github.com/succinctlabs/sp1-blobstream
-cd sp1-blobstream
  1. Follow the deployment instructions in the sp1-blobstream README.

  2. If you're deploying on a chain where there isn't a canonical verifier listed in the SP1 contract addresses, you'll need to:

    a. Deploy your own SP1 Verifier from the sp1-contracts matching your sp1-sdk version. b. Set the SP1_VERIFIER_ADDRESS in your .env file to the address of your deployed verifier.

  3. To run the prover:

    • For local proving, set SP1_PROVER=local in your environment.
    • To use the Succinct Proving Network for remote proving, set SP1_PROVER=network.
    • We recommend an instance with 64 vCPU and 128GB of RAM for local proving.

Note: Any whitelisting for custom provers would need to be implemented in the application's smart contracts (e.g., by using an approvedProvers mapping).

- +cd sp1-blobstream
  1. Follow the deployment instructions in the sp1-blobstream README.

  2. If you're deploying on a chain where there isn't a canonical verifier listed in the SP1 contract addresses, you'll need to:

    a. Deploy your own SP1 Verifier from the sp1-contracts matching your sp1-sdk version. b. Set the SP1_VERIFIER_ADDRESS in your .env file to the address of your deployed verifier.

  3. To run the prover:

    • For local proving, set SP1_PROVER=local in your environment.
    • To use the Succinct Proving Network for remote proving, set SP1_PROVER=network.
    • We recommend an instance with 64 vCPU and 128GB of RAM for local proving.

Note: Any whitelisting for custom provers would need to be implemented in the application's smart contracts (e.g., by using an approvedProvers mapping).

+ \ No newline at end of file diff --git a/pr-1699/developers/submit-data.html b/pr-1699/developers/submit-data.html index 1e8f1fd494..fd43a4ef61 100644 --- a/pr-1699/developers/submit-data.html +++ b/pr-1699/developers/submit-data.html @@ -11,7 +11,7 @@ - + @@ -336,8 +336,8 @@ } return err -}

RPC to a celestia-node

Using the JSON RPC API, submit data using the following methods:

Learn more in the celestia-node API docs.

- +}

RPC to a celestia-node

Using the JSON RPC API, submit data using the following methods:

Learn more in the celestia-node API docs.

+ \ No newline at end of file diff --git a/pr-1699/developers/transaction-resubmission.html b/pr-1699/developers/transaction-resubmission.html index 167f91d802..59f6b9bca4 100644 --- a/pr-1699/developers/transaction-resubmission.html +++ b/pr-1699/developers/transaction-resubmission.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Transaction resubmission

In cases where transactions are not included within a 75-second window, resubmission is necessary. This is especially important during network congestion, as transactions with relatively low fees may not be processed even after the network clears up.

Regardless of whether they originate from celestia-app or celestia-node, transactions will not be re-gossiped, except in the presence of a new peer.

Monitoring and resubmission

Monitor the status of your transactions. If a transaction is not included within a 75-second window, it should be resubmitted. This can be done manually or through automated processes.

Changes introduced in celestiaorg/celestia-core#1089 may affect transaction gossiping and inclusion speed.

Notes

  • All transactions, regardless of their origin, are subject to being sorted and pruned based on fees.
  • It is the user or developer's responsibility to monitor and possibly resubmit transactions if they are not included in a 75-second window.
- +

Transaction resubmission

In cases where transactions are not included within a 75-second window, resubmission is necessary. This is especially important during network congestion, as transactions with relatively low fees may not be processed even after the network clears up.

Regardless of whether they originate from celestia-app or celestia-node, transactions will not be re-gossiped, except in the presence of a new peer.

Monitoring and resubmission

Monitor the status of your transactions. If a transaction is not included within a 75-second window, it should be resubmitted. This can be done manually or through automated processes.

Changes introduced in celestiaorg/celestia-core#1089 may affect transaction gossiping and inclusion speed.

Notes

  • All transactions, regardless of their origin, are subject to being sorted and pruned based on fees.
  • It is the user or developer's responsibility to monitor and possibly resubmit transactions if they are not included in a 75-second window.
+ \ No newline at end of file diff --git a/pr-1699/developers/wallets.html b/pr-1699/developers/wallets.html index 49aecde8ed..b58b449bbb 100644 --- a/pr-1699/developers/wallets.html +++ b/pr-1699/developers/wallets.html @@ -12,7 +12,7 @@ - + @@ -39,7 +39,7 @@

Wallet integrations with Celestia

This page covers how developers can use Keplr and React to add Celestia network parameters to wallets, and how to add custom networks to Leap and Cosmostation.

Add Celestia network parameters to Keplr with React

Before we demonstrate how to export the specific parameters for Celestia's testnets, we need to create a ReactJS component that allows us to connect directly to Keplr and pass it the network parameters.

In the following code, we show how you can export a component that detects whether Keplr is installed and sets the network params for it:

jsx
// @site/src/components/AddNetworkKeplr.js
+

Wallet integrations with Celestia

This page covers how developers can use Keplr and React to add Celestia network parameters to wallets, and how to add custom networks to Leap and Cosmostation.

Add Celestia network parameters to Keplr with React

Before we demonstrate how to export the specific parameters for Celestia's testnets, we need to create a ReactJS component that allows us to connect directly to Keplr and pass it the network parameters.

In the following code, we show how you can export a component that detects whether Keplr is installed and sets the network params for it:

jsx
// @site/src/components/AddNetworkKeplr.js
 import React from "react";
 import styles from "./Keplr.module.css";
 
@@ -187,7 +187,7 @@
       </button>
     </div>
   );
-}

We still need to pass the Celestia network parameters to the AddNetworkKeplr function:

js
import '@site/src/components/AddNetworkKeplr'
+}

We still need to pass the Celestia network parameters to the AddNetworkKeplr function:

js
import '@site/src/components/AddNetworkKeplr'
 
 export const MAINNET_PARAMS = {`{
   chainId: 'celestia',
@@ -241,8 +241,8 @@
   rest: 'https://api.celestia-arabica-11.com'
 }`}
 
-{<AddNetworkKeplr params={ARABICA_PARAMS}/>}

Now, we can connect to the network that you would like to use in Keplr wallet.

Adding a custom chain to Leap

If you want to add a custom chain to Leap, you can do so by:

  1. Clicking the Cosmos logo in the top corner of Leap wallet
  2. Scrolling down and clicking "Add new chain"

You can then add the following parameters:

  • Chain Id: arabica-11
  • Chain Name: Arabica devnet
  • New RPC URL: https://rpc.celestia-arabica-11.com/
  • New REST URL: https://api.celestia-arabica-11.com
  • Address Prefix: celestia
  • Native Denom: utia
  • Coin Type: 118
  • Decimals: 6
  • Block explorer URL (optional): https://explorer.celestia-arabica-10.com

Now, click Add chain and you will be able to view your Arabica account balance and transactions in Leap wallet.

You'll see that you're connected to Arabica Devnet.

Adding a custom chain to Cosmostation

Click the hamburger menu icon in the top corner of Cosmostation wallet. Scroll down and click "Add Custom Chain"

You can then add the following parameters:

  • Custom Chain name: Mocha testnet
  • Rest URL: https://api-mocha.pops.one
  • New RPC URL: https://rpc-mocha.pops.one
  • Currency symbol: TIA
  • Address prefix: celestia
  • Denom: utia
  • Symbol image URL (optional): https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/celestiatestnet/images/celestia.svg
  • Explorer URL (optional): https://testnet.mintscan.io/celestia-testnet
  • Coin Type: 118
  • Decimals: 6
  • Gas rate Tiny: 0.1
  • Gas rate Low: 0.25
  • Gas rate Average: 0.5

Now, click Add a custom chain and you will be able to view your Celestia account balance and transactions in Cosmostation wallet.

Switch chains to "Mocha testnet" and you'll see that you're connected to Celestia's Mocha testnet!

- +{<AddNetworkKeplr params={ARABICA_PARAMS}/>}

Now, we can connect to the network that you would like to use in Keplr wallet.

Adding a custom chain to Leap

If you want to add a custom chain to Leap, you can do so by:

  1. Clicking the Cosmos logo in the top corner of Leap wallet
  2. Scrolling down and clicking "Add new chain"

You can then add the following parameters:

  • Chain Id: arabica-11
  • Chain Name: Arabica devnet
  • New RPC URL: https://rpc.celestia-arabica-11.com/
  • New REST URL: https://api.celestia-arabica-11.com
  • Address Prefix: celestia
  • Native Denom: utia
  • Coin Type: 118
  • Decimals: 6
  • Block explorer URL (optional): https://explorer.celestia-arabica-10.com

Now, click Add chain and you will be able to view your Arabica account balance and transactions in Leap wallet.

You'll see that you're connected to Arabica Devnet.

Adding a custom chain to Cosmostation

Click the hamburger menu icon in the top corner of Cosmostation wallet. Scroll down and click "Add Custom Chain"

You can then add the following parameters:

  • Custom Chain name: Mocha testnet
  • Rest URL: https://api-mocha.pops.one
  • New RPC URL: https://rpc-mocha.pops.one
  • Currency symbol: TIA
  • Address prefix: celestia
  • Denom: utia
  • Symbol image URL (optional): https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/celestiatestnet/images/celestia.svg
  • Explorer URL (optional): https://testnet.mintscan.io/celestia-testnet
  • Coin Type: 118
  • Decimals: 6
  • Gas rate Tiny: 0.1
  • Gas rate Low: 0.25
  • Gas rate Average: 0.5

Now, click Add a custom chain and you will be able to view your Celestia account balance and transactions in Cosmostation wallet.

Switch chains to "Mocha testnet" and you'll see that you're connected to Celestia's Mocha testnet!

+ \ No newline at end of file diff --git a/pr-1699/hashmap.json b/pr-1699/hashmap.json index ac94e6e881..f6c361d30b 100644 --- a/pr-1699/hashmap.json +++ b/pr-1699/hashmap.json @@ -1 +1 @@ -{"community_modular-meetup-guide.md":"3d71d8e8","community_speaker-list.md":"716e09e6","community_overview.md":"aec66ec4","developers_arbitrum-dapp-deploy.md":"26b815d3","community_calendar.md":"5a6b1214","developers_blobstream-x-requesting-data-commitment-ranges.md":"409fcb45","developers_blobstream.md":"c9e61c23","developers_blobstreamx.md":"67c7a6c7","developers_bubs-testnet.md":"c168048a","readme.md":"44659d85","community_coc.md":"db13614f","developers_blobstream-x-deploy.md":"e0b78833","developers_arbitrum-integration.md":"2b72ec21","developers_ethereum-fallback.md":"00e7ac0b","developers_blobstream-contracts.md":"25c4c416","developers_arbitrum-bridge.md":"d7cda10d","community_modular-meetup-toolkit.md":"f6184c46","developers_blobstream-offchain.md":"3b490822","developers_arbitrum-full-node.md":"09e489d4","developers_gm-portal-bubs.md":"2e8017d7","developers_deploy-on-bubs.md":"97e444d7","learn_paying-for-blobspace.md":"61719f03","developers_sp1-blobstream-deploy.md":"b0ce75b2","nodes_celestia-node-trusted-hash.md":"4094be4e","developers_build-whatever.md":"4b64aa7d","developers_prompt-scavenger.md":"fea07a57","developers_blobstream-rollups.md":"580268e1","developers_optimism-devnet.md":"6da256da","developers_arbitrum-smart-contract.md":"5de83013","developers_feegrant-for-blobs.md":"7c93aaff","community_modular-meetup-intro.md":"1b04ad48","developers_integrate-celestia.md":"871c3298","developers_celestia-node-key.md":"93827487","community_foundation-delegation-program.md":"abd31332","developers_full-stack-modular-development-guide.md":"3910bdad","developers_arbitrum-deploy.md":"c142d06c","nodes_hardfork-process.md":"d852b283","nodes_bridge-node.md":"71e96d87","developers_blobstream-proof-queries.md":"21c99b59","developers_submit-data.md":"506ef31e","nodes_celestia-node.md":"2de1eba4","nodes_config-toml.md":"cfad1001","nodes_celestia-app-multisig.md":"cf17caf2","nodes_consensus-node.md":"c0f03057","nodes_decide-node.md":"ce340382","nodes_environment.md":"d3b85368","learn_how-celestia-works_transaction-lifecycle.md":"d8853cb7","learn_how-to-stake-tia.md":"f5076e81","nodes_mocha-testnet.md":"58edd1a9","index.md":"d57eea6f","nodes_overview.md":"8cf8c5aa","nodes_mainnet.md":"0230b2ce","nodes_participate.md":"cd0dcc78","nodes_quick-start.md":"7f0ce7b8","nodes_systemd.md":"794b3b4f","developers_rust-client-tutorial.md":"df611bd3","developers_node-api.md":"8d88dab0","nodes_validator-node.md":"2b9abf8d","nodes_celestia-app-wallet.md":"47e26967","nodes_celestia-app.md":"6fd2fd36","developers_node-tutorial.md":"358f7307","developers_intro-to-op-stack.md":"c09be10b","nodes_instantiate-testnet.md":"46c96647","nodes_celestia-node-custom-networks.md":"759a61e7","nodes_light-node.md":"c1fa0172","nodes_celestia-node-metrics.md":"6d2f305e","nodes_celestia-app-commands.md":"0be51395","nodes_celestia-node-troubleshooting.md":"6134a7ab","community_itn-tos.md":"23529d8e","nodes_full-storage-node.md":"3d825d2f","developers_multiaccounts.md":"5fe51e02","learn_how-celestia-works_data-availability-faq.md":"506e0c10","learn_tia.md":"6fd97b1e","learn_how-celestia-works_overview.md":"e560d4a4","nodes_celestia-app-vesting.md":"e8ca90cc","nodes_ibc-relayer.md":"3c1ba349","developers_optimism.md":"363527ac","nodes_celestia-app-metrics.md":"ba859d9d","learn_retrievability.md":"8931b632","developers_golang-client-tutorial.md":"0dce1977","nodes_celestia-app-slashing.md":"c061c14c","learn_staking-governance-supply.md":"2093ea4e","learn_staking.md":"9713419c","nodes_docker-images.md":"c689a2da","developers_transaction-resubmission.md":"2c716084","nodes_celestia-app-upgrade-monitor.md":"c2b31db9","learn_how-celestia-works_monolithic-vs-modular.md":"8f0114bd","nodes_arabica-devnet.md":"960dc284","developers_wallets.md":"c5fba5d1","learn_how-celestia-works_data-availability-layer.md":"d71fa908"} +{"readme.md":"ebe4136d","developers_intro-to-op-stack.md":"2deb5540","nodes_celestia-node-metrics.md":"e49bb967","developers_arbitrum-full-node.md":"319badbc","community_calendar.md":"f70856a8","developers_optimism-devnet.md":"3b3f49a3","developers_blobstream-x-deploy.md":"6ed5e09e","developers_ethereum-fallback.md":"764773da","community_overview.md":"fb9fd608","developers_gm-portal-bubs.md":"cd727490","developers_arbitrum-dapp-deploy.md":"4b34cdb2","developers_arbitrum-smart-contract.md":"8b7aa3c4","developers_integrate-celestia.md":"cabcfa45","developers_golang-client-tutorial.md":"727ea5e8","community_itn-tos.md":"6454438f","community_foundation-delegation-program.md":"ff7a7f05","developers_feegrant-for-blobs.md":"84d98514","developers_deploy-on-bubs.md":"f7abcbb6","developers_blobstream-rollups.md":"9c8cb137","community_modular-meetup-intro.md":"b7a491a8","developers_bubs-testnet.md":"ddf17ba1","developers_blobstreamx.md":"7838cfd1","developers_blobstream-x-requesting-data-commitment-ranges.md":"adbc6c7c","developers_blobstream-offchain.md":"fbd363f2","developers_wallets.md":"b2bd7cc6","developers_sp1-blobstream-deploy.md":"e4975a52","learn_how-celestia-works_data-availability-faq.md":"b4d6ab8b","learn_how-celestia-works_monolithic-vs-modular.md":"63b4aa3e","learn_how-to-stake-tia.md":"68dbd46b","learn_paying-for-blobspace.md":"06ae9c17","developers_arbitrum-deploy.md":"26acb828","learn_retrievability.md":"d1e1d36b","nodes_celestia-app-multisig.md":"4833031c","developers_prompt-scavenger.md":"ae717331","nodes_docker-images.md":"01970048","nodes_celestia-node-troubleshooting.md":"d5102d28","nodes_full-storage-node.md":"27554da6","nodes_celestia-node.md":"b506c65d","developers_optimism.md":"d6e1e2ee","developers_rust-client-tutorial.md":"168637c4","index.md":"7de6d8b3","nodes_config-toml.md":"ea91864b","nodes_consensus-node.md":"99f6268d","nodes_decide-node.md":"12527b86","nodes_celestia-node-trusted-hash.md":"941c6f87","nodes_arabica-devnet.md":"5fbea086","nodes_celestia-app-metrics.md":"0b6cb333","developers_blobstream-contracts.md":"06e023da","nodes_celestia-app-wallet.md":"70b5fba3","community_modular-meetup-toolkit.md":"0a2e761b","nodes_celestia-node-custom-networks.md":"aac3b114","community_speaker-list.md":"872a3b69","developers_arbitrum-bridge.md":"8c851802","community_coc.md":"de9fdd2a","developers_node-tutorial.md":"79e6f899","learn_tia.md":"9065ce93","nodes_environment.md":"502fd51d","nodes_celestia-app-upgrade-monitor.md":"0555c2d4","developers_blobstream-proof-queries.md":"19225b90","developers_blobstream.md":"4afef8bd","community_modular-meetup-guide.md":"6b50cb94","developers_arbitrum-integration.md":"fd5df284","learn_how-celestia-works_data-availability-layer.md":"4a9aff1a","nodes_celestia-app.md":"e09a3b72","nodes_celestia-app-vesting.md":"e829dc7e","learn_staking-governance-supply.md":"0d21fda6","nodes_celestia-app-commands.md":"16f0c3b5","developers_full-stack-modular-development-guide.md":"766923fe","nodes_celestia-app-slashing.md":"5b9f9df0","developers_multiaccounts.md":"6ee7c0ad","learn_how-celestia-works_overview.md":"42a4dc74","learn_how-celestia-works_transaction-lifecycle.md":"def776d7","nodes_hardfork-process.md":"b85c06e7","developers_node-api.md":"6709e8d4","learn_staking.md":"f13c2e81","developers_transaction-resubmission.md":"ebf49e01","developers_celestia-node-key.md":"fe2dab0d","nodes_light-node.md":"f1dd6ad1","nodes_bridge-node.md":"40517142","developers_submit-data.md":"7f90d09f","nodes_systemd.md":"66ed5d05","nodes_validator-node.md":"084b1069","developers_build-whatever.md":"5677fdce","nodes_mocha-testnet.md":"0e4cf674","nodes_mainnet.md":"0bba5c8e","nodes_overview.md":"4223caea","nodes_participate.md":"704b27c3","nodes_quick-start.md":"9a9eabfc","nodes_ibc-relayer.md":"450545b1","nodes_instantiate-testnet.md":"4b062bf6"} diff --git a/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png b/pr-1699/img/learn/Celestia_TIA_Allocation_at_Genesis.png index 1dc9b99b9a0a1634b8354ab524d2aeca0f494e03..b2acf3c74e4fa17a51f47e3736c9ab59c54c00aa 100644 GIT binary patch literal 472556 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�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

nD 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 NyU^Xlr&W|IKmC_Z>|28;q3{Os{zQDZLJl~j zV`_7f(d9Op@odT)fZ0Kk8O6{ZN&vJIeUZv8_G@G#XbBw4X?qJk!^Z{<)`S@82JBxV z?{E|d#ZG5qkDJqabJon4p}nD@p&U=2uIVm&4{gah4&vUgHGDkWkfUb3NuKC%`o+iV z3z_Vta+d&1t5TX>(Q;aFMlB^W+m$oQI=;l-ILD%(=fx z@k-iufCnJA&L8Io06iGr=oy(tR3%XI%{1kYj6(GYY&* z!FluXFF9b@F`#JRH_I~K%X`J_8&DUsyINu&R@B>4Yd~*k+y!{v7lFuL{}TkC*6!Wko_{Jb$_HHVi(>{pxXR zuKcl`t)ynxvN85h-!U10#Hek&qg>X`D}rp=K1k17(9jw!_VTnm`2u;MfMlX-OFZi# zl}nK0aAekNv2jo{epF0t&;${%%7AenHJ$K1IqE&FqfZ_HidH6v(%}RaF zU4jaClY~aAdrGotSE|-|zn^c3W6Isb_;(K!94KRd%5i6Xmjh@Npu~Km8C3J4qTYVo z?Jc)lWvT%807}++rly;?b&WWzAc#cEr9al}V+vy{TMLDbGc??|D>SHCWxMC(6UW@= z7`HOuY6i;9d5`7>nR_SE$Xmdc1sdE5)Mxkf&Br7_lu>fEqsD6#Y%5W7>0FyIDNnN_ z@YsA1v~sbv5AH#+j(HJvbZw0T*U=X$N|D?^@6rO-Jv63BhVvdKT6>!t*9c6P3W9d@ zS&_ZH=Dc@wD~r|{-B}Rmz0UW<&$KaS-41}Sk9b*bt>!^RFEUyF(RH|?OVneLMfQ0w zG$e$JDRn#Ic#aXKVD($5K~++E7f~JZN4(5eKB8AY#9tZ>n`CKub(_nsT8(O8Z9RVG zOWew!ySeGwk?jbBx_%O_O<#Uj*MNS0Re+W4z)#9rTtC&3$@_TXJTAgV3C1t{#m_Su zAaH6nBS{76EsW4NgXd1l*G~u@U;dZ&Quwd-LaQgO`@?NMk(7)`xCt-B+8?taO;0%k z6Wn5JFxF@!zQz&}ycz62M6dqlv9Y0G|AL#(3G^kz3Nio4>D`2rg8mQ%OB$Uvs}JuOw7WB z>7eaV-4xe=k49I8GpR$l!0H_2Ep6m0wjqW9iF9kUPSa8?e{%zSHQb)T4hIu5P$-}l zzv%CL!6HLigJ3BiS&_3w|4GQ&NqdszZP57KryyL)y^?~USw$M?;av2?kL}tdL_|Yp zQ?TEND7>I%de=Nz%DHT`_i*r;wuwnV?WY#r{!YMPr%XaNF<>C(JR_l()Dtp{f)iv2>- zb5=oHZE+hHC%mur{Fa3U-s+N2zL5aca;VF#QR9wn0O(G7{v2B9dfeC7qZp{(8S1tH zR8<%xLPANl1Po(7SF0nz_|A*(p=3hXKVZir?o1ltM?AVi^GXH{v6{jM{4DY4HOOEN zk-lD$cr)3KI8Jp#fM65ku=?9LZ9tc}O6xF@LRSWJ^2#Y@WQ%UB+?1X!W5>VPQdK(1 zWI6&wL2>jc|J&1n+2A?QWa$nenBavQxYN{NpXhlH?ouhgpHzEh)N{Ng(pYE(e%ixc z6MCX_8PBunF2oMa{PM28b6Vd(4Bw)*kr2SHtRH{@`o@WFk^4b!VK3FHW(zAx&k*=n zT7oyIpovGO`+dRfm!Xi2#V$If}le-88ukl2XTT=dl#fPd0eh| z>RZ`V!$~q4G_>i+lA2zWkzO$pYpEt{@AqE#8h5L>$A=GI=w?zNNrmm4XdASnK;_)& zZ9osi)lXgOA3}pKlQ*+rHOZDfKuRx=3HKO!rmErh=Gxw)(5N61M;8~zoo~h_ zR%i@Aqx4iCS_Aq`u-XV7X%;OzSMiN8Awl5cR!yNj`jjssD3}&!aU< zg$*qxE^07SM~_;gMSIJOoxod(j%+8iA5m(YJ}LgZGo<`8q@Q@2((*yhYMWWwOvqO| zW?XV)AuhSDFLus7O<+-SaJ@70)HerDg!Xi$%N^@2pDhXz@a+fT`eT-vWZXANEz*_w zX6lD3vEwpQ_k1)yz7iSwY;=xRX@GBIaTI8fL~)cexBp`68`F7z3`*tLj8@N^coEM9Ib1d7O#z~Z4NwIZwbvZ1+bp+ zM~uc`L{zd9CP%(y5I^)tkc$otZ+Rgk2YJ;6Qf(FR+_Nm9R0VT^dl^a#7m@U;G*;$X zHz_HBCZmH6imk?mpIAZ3H3H|Bl&O3_-C*xnc(C8@#s2Rh<)k*T!zUKJ7#EqU=HlYM znEw&qfGMbx9>sc^U?+g$taAE>4S$eKYw@aVov?xGHF_f4?(pdza4k>dR=1m8PGTVy zKCLQ8cjPPmd74H5T@K2OEA0crTm+QRLe1K#8eKC4(n)B|r|i+0>ithlhb)IpTyoPg z#B#|cmg|;wXr6Y{1gpn;C*(TLnia0CGF(Zx#iZ6}kPK+N$Ep-mbX~&!djmPiq@+~# zJ|njYd#r~*b@HaCp?9FugrHbx6yu>`08rvBocUY7(zA32hYry)UFYKBdSA^Y;OrKO zv3t$wOrE%Z54aj8CUe8_-49ikNcom0D>NHkQ88U^4$LX=JEBAj6WW?Y?HhY>luU2@ zubA$UUbb7yY#946Lux7~uAUXS4n`7W=|dlM1@1ptEH5@?GBCu5EyH_i9oagTPQG%= zT_iXdN1s!{6F(j&HqU7F%JF+bxp`ONxpqe0CzR1$xOn1vv2^QL)5;-tqnmW-v66#g zS$Kg=?T}5~GQ)(-iXa>+L@l%kFply@6Zpc)MBrMk&b~Z1#vKG)N}34D{PLR6OOu-? zNE5Bzm=Ge4bB^821~w|AL08I8!i+F#@y+#PZ)WaW2kh3(rMK8^hgo&%kejO^9+-j6 z4JA~FZ(>v(+L+Hj1UZ=j6X{qG_Mr+OV){4B-&?Cdm+>3zS)9O@bpFEa4{|{>!AmL! z@OkYarD5R$gF7#_Wc=_CQ8vCOPiL?mEg;{#8HTHN`zd8BKfuwLVvE98u}m9HCsiDg zwERt*$fu1LjJZZ^&C1b>Bh`U7SkVW9@}NYYbbH*R0-X#VCcGk3UCV2Yqn*WIfWgg` ztDCYnLC?HBj7`v;B-fp;Pi6gYo`G~b++1D-z#+5mE(551v!%lZrFwHVL9T@Fqmf$I9R^M~W`dG0YF0Y39ifs_%qq~V_0u1<6l^;5!_~Xs4klvQ>8zlO&p$=%jiGh^AELhdpY1>TUR9^Iv1yCc zDr!}SQ5vrfKi|*y@%;;4 zzueb-o_p>&=Wb#aC?#$mN*ke~%E!|o#w_z+-*$M9MS%sz;O=>!jHm?Jr>ONL(_P+; zjhR*Jj5_FGFO%$F|FX3wSM(oVdgc3HW)c%a^4i4mK=|;b`mV07xoVjc=$m^+eKON#9v6)#=wL6Y&`3V)fM$UxotG+ru>i!wQ#dOdq zr*hJ+)tNGba1&ekG;r+>Xd*c?&N(Xmn_KM-bFE(j>sJ3TfwbV zhGDmI;`i(oVvbZlU>qI}Yf3oPMjX{;fbJS3)UI<%(77?FagerN(%7f9A(}e|7WaJ* zCbJk~Xsy3dZOakpVsjTWHe)j|($Qc(E_rn+I#Xx2yrwFHig*NR>IEdfsg-i7!dLtU z2<`kULL6kYJfK4HzWTkm;Cei__xMFV*roq+sy<^QF~I?ntwY2Qp&@$?$0w?y;xZ=x zUt;BhJ}gf_2@N-1<@@G*A#jcQd6>JJQ+E=zdmsckN$6nQnNkW$RM>3&{&}69NU}z^ ziaquD(Gi}vojR@fe3L?&$bWcBOl@()r`1-|(&Z$Z0>E3>hKS-RmEsMwt);^Xf>HUh z1*j*qOjo`fa-YK-v`QK2AD6d;8`u!9d+hG{yWe`qCA;n=0_1{BIliPjB2i zy*T6d+>m3fFGqX?iyKB0Wt(`KLzqZ(NYR2lcA<%NY#{Q0(NZ$mB z7N2E)~&PK;Z!^Q)v_m&Mpb;eQL(?4T(<@6mBxZ^eDv{Uq-z8I$7mt#8|7|C zDZL$ygO@#aEJ^~)*7eKW-dBQ8GEuyvRo=1NxAtGkG_U^tubJt!JItj|v)q)~m$EDJ zJo}pDf~134yN#wa1d>^54z*_6R$f>sx_kK_s0NngcWUjiBSMfWm~mBWxG*k$P_t-4 z*URIkF;)YYVp`Omt~$Jle~vsfk&}{tcvDoN^t@O7`^x@>ybyouWCq)`$Dr)jxqnqc zq#>cO+tIQ0yoI*>-}ffq{CYp`TcoK@1a^6^~KfzHWe zJ&)}SK~Nbj4%h9|B@te84}9d5ODDXoEt!^G@3)`g1bv5<2|oW$E#!gHX-5mQlUCbK6hHvYQOPPJz)!&CVAj{>$|<*}Zq;y>jo0hpCzE z+XMU|b3U-WOXuVBRG&^2;jAgDgb_8@TFYu-dxrn!OVWM~Jd>JeOLfPtcpfZVDJeh# z*rXjDdKUx|ztRMS`onc6psp`zk4^>(X5T!-lwe2GO%^ixpBo=m{X}Iju@4J>Hp>MJ znU!rD3~%q~#73z%z5&@QOuVRa`Sf}c^twr+Gf>Aguh6wg;>~5z(fy|uS?8K3UOuVx zbCbk2ykIFd_?qo*pXQF*4@(72PC8k|OQVs_HBU?ak>r@Q4_nAIL^d5P>)yH_x4`F- z73)uU`}cpk;Keo2t0&MO4Fz1anZnb^yWNY~pA9#Q8n+XN1s&H?m%H?*Cwqs5bDQ{+ zrke$%e4%l-v^Uc^meGK4>G{|C#7${V3LKA1D!#trXwxF61E&m6&Y`KyI;U#?t< zH|xy_w_lFlN?LgR@S@)(B%#(9ohut>G&0}cVi?gKClbFAhs*0-(EBM)aQC+sinHeX z>{{DmOk2Wy=QeXJ>n|zB|EklwhcupXUfl92A^SRWz72Cr>FySWWS6o0uY*uA=-EN% z)@Ywb3O4vN;ZG9dwH0|8;?vhDEz@5Tr!9O+ZNb^#q^~nt^p3s&zQWMn?Z?^#ZTBV_ z51hs?;vbsf^8MuMB-Bp*k%OoM&1Bxk9$ZShk9c33ra%p`53SxP=Gawws!b*7XXmTD z`p7gGVGrE33;Go@7PNMn0^|%G4_`Kaq1hpTJ_I{esd{d6A8B@PVQ#m2|ML+q362#; z08Tm{tEH|4)3m;-R5auzc!#FmKMYgV2&%TNbAA#~RhzjjWmBhsY?)QnU1m#BFf?zU zSq5W-vMJwam!ir2frBA`Jl;j19z{A0OVK1G1tqPT@vRb9BXti*9@VF3&fD(q51tHA zkj_%bI4KrEx(|2GF@Nt#K#Io=WtzBU=)H69lS|8qGj>gB7^&lU_#-85v(7Lzeow2{ zB<1O@plPXTiLuK4@Lzncl+KaR&)m?FmQie4O9IXs-beCiA@X^EDx>~jmLE97p zg)mt=+k|h%w;Y{0NqTL|H&GOuoH2ROlYD0cHPh72V&Ak;<$kO1c8H#IU5XfHwk!UR zxgSqWy~u z>i#1rD=Rq@Js&Ke|LhC&0?;gJYCF3~`-G`83jE4S+IL92VZYsfuO9kDPg*R5SUnfA zu?St4lIEva64wjJhBr#s{<(Wmej*I)f*THFPaFLijC~D^bK!Ao(!6yk-e7GuYkl&ol5^eoBZ31N5uV?uHa!SL6?s%`Fok76k zQyTsATkho`1KoS0BMl)x)y<|!#%aOoAec7uVhyuzQ8z%wW{Sk4&rXJG137fZ>EE3w zKinUj$&f0@__)5T2i(!7vpZXNXr7C4%mz3K`j0b4vl$h^_Yc}`TXOu;hHp98UL1uZ z4@RpTY@PhPubqS6M4VA9tbJaI%b3NwsF_NWi`vEGo2FjH8F}<-{Cz)ISP#2;w@LTG zW?XmpWP|(g%5xI()Aiv98)nH(kdZsZo>|=G~c-J>D{&WFd7mE>c|$pO_dT&Y~Zcqt(mr z)TE^YEcF-MnK{ooY0wDN>1RD7lTPhRojBQ`M^WQ z4vWvHtTE52^@}qgq1J%MNO#_uX5o{KKz)W${?aqc^{(*Kk!eBR=S;uC4_<_wnNgAm zg1ZiZoxm8o;~TwIwgZZI_pLiur+U3Tsiz9EKn{L}CH$CH_@SduC4KTomdZ=(eD(|k z{=%m}6AKDz)aLjKKScZpzli3Tw&QI4%b6STBwguuwoLds*SWc7MTQw^qJql}dRBqI zOLg2@-$zOS94bWp@%9%gzFGGcd}FyHN&F0iFh#Ptx7G2AK-!UF31DJH?bE+j`xRGn zuHNKO@P~KHo;sZiw>tFmfLGG~_-gV+d=XJtG4H&rfWYij$68#c&1J0?QE0q|&g|v> z*IgIA?X7SZolG_ifQw<$9j+Xq;~i$she`nnOMV4+++-59`l^?G9J*yk!;#;dt51TG z$CCX3xtp6#oX_+8UM>IFbR&m@igqnBbMCW zDXe8muX@U2I&B@3&b{%WAnY7hND$#X$O$wgtn~YLkImEjJ7-`D&w8Mc)J3DH`k$C} zKrnS7rRZX3?8iwC&FJ4xzn2^v70py~N;g;OSJ%3V-Y0}s56Sc`7Vh=F6%kq{IBlc~w;%EnMlX7__Y}P3yX9-1cR)j$1#)Y+Wdg==C6bAVuyP5bDLVTEH z!rQeFpVIXamab`g&pf9T%}?}id~!8T>0&EHh;KYUYOs;K-;l0{ka3KDn-eF!D1>%( zkcX`uvXbGije6F$C2pp8R$aZP<9j{B93uzJIK%(EcJH}GZ_^wLU+Xq;9!>Bv8&7d# z@bpfG{%-h4!jcCOR{ivWQSewm|L3xx@T}yqvz>cGQ0{niC|bsn+}R=+vBlq8Dyhf+ zGv+UBM7h~jDX!Hkh(BF_Ua6T-T}wu_G(D%TZtd#s3VRA2N7xFG>%|Ticl%Zj^X0hh zX7U@;I;}`4)KdKO(`++h5yJQONhvJ(2%;IAM9_N2PaYNPJ$!lE)KtWu3q>?5?{V7R z$Qe$?=ayG>Hl(5tPeQd6c{vk3_hEM2XjS1M?7ytd_-Hz z`{LaCmk$q4UtY-BZHd8?R`}*kMSkmwWa^nIl9y7S6ASJY-mik+TGtOjsIJ-ZDVfvd zKDg8Yih5}ya-E5Tl^YUAes*Vxmbl2y{8Ld;f0Li&kUjzBwSS&VnGYwo1HuOp`S@`+ za4g0Vq}eAgnpeJbI+}4Y60c;u67{7G7Z~oFyT7Lbjz??frY^{Y9j}$PoO~h`r(?(K z9c~WPf{ryfJAZL8J^VzJzt#9@2Xx9+?00Qpu^SI^&F5g(^7uOMz<%6DPxt%aeH#y* zLD(=?NbHR(+2p%XKphno8(L?^2qpUEg{=Qjt_$w#zct$vNWR}Edlc5JVmI@1IW-e0 zaKX2=HV&#ipOI7$bG`lx``J+vr_yEbrYPQK^EtQBubhjJQ-f~zLK5Ra7yL<;ieoeb zp&AtpHY{|=mXc1 zh=?w%%SNB_$oqUB)s#!Dx>3N%xbiq^gOh0V2^)<*)TQ^L`0%JM7l(hDyTuvw+|0N4 z(df1>h-JR6aOZyEbY{QI4Z(`F&P@dl`1@MD40=78j;{!jhsmD#N64PPk&vc&k88fLd2k#6&o zbYGfD4U1JZtHEZ&6_1Zpa5Dw1w)qMiu#BsZU?1Q%FYncqz&A8n+}6LucsKwdf57mViH zmpX0wbpPKNFOqa3R9^q{n^%EvG(OUPh7z-q8l)$nsn&x^-)j16cCOTDuofynQ!Yt7nD+R86D<*`b?0u-3F z=EXpY)2C^Fk_dj1pQ2$F^`X|Py=P2IZs0r4X-tv3Y09*k(?lH0wFIZGumekQ>@nR)Aw`%Tq3L`ZpqTthcz=ePha2~%7 zUiTmmbx)WzHb>>aEm@(Th}zd>ULWEAx2>ZfIy4q@&!_bXKY1fVi`v${f5X>DHZHZv zsvmn{&&=-1nErQ-D7+$xa5#hRu|sI_^TkuBufuM~#Q>Og^#NNCgOzu4>&oyH888)% zT0ozjhzUjzn|{a^+)SP!suLD_wgNv16xIH=2|vt1fhNI6-Ro*Wys<$TL)=$>+}&U#fGth(w=!KK{GvQ7M3}K5JgG~}w^~@40m_+@3}XfF&E<)@ z2>Vr*kAR-Tzq5R8HcsvaqMBU}@p^CU*Z94{hGIXp#appuH)zEqu9l%Zr%@`i58XCmznr1Jf0!!o}` zSZwqAyF9LsGLMgy>&h_S{cSlQsxg?`7$q>iJDh*&w-2FD%LDI@N;_Zq^JRH(0>Cj? zyEAK+m-z3pm0z~y4G%9^-vquXe^M$k?8b3qN~ zF)1cq2in^OiOyj!Lf|hCIexD)EIgt&ebW|5hRpV|!bul2W6nk)ry=)AC5*U=;Qh;_ zvjujRh(m*yY6rIDb@mjy78Y;4x1^egwH~<-Vd6#kl$XnIw<2%ZnCyy5!} zod})-2t}v4AF)@|_H}lTVz&!1Qx6r<2~u@juAJNm`y4(mGzmnV2RP&L4)eFPjqr^e{#)it z!7@w8WK|I@?$leaL3KvYR?o`-6>lixY%`$XO^1C123)xwqeb`rHGQN4-M5EF8Vjnx zV}reqcW2ucyFG%Fq?LMTyBHWt0jCR&Ltfk4yA^+_z~IrPlh+E}86!OtVchai{cEnZ zxA&s4f_U}F_@%rB?bUOi(8k&&T^c^l^Q~3=*5nub@cRWqFKi60!w&2tj{ckj4O9bW zbH+&aSlIVz{sGnT_zT70e7m!Iod;Z>_v zU+!5Utp>2lK}-!0TG`P_1!X0HI>jTa8Rqm}Iy#?b|S^!$wkHnw?2YcaM> zQUJYob?V2>uIXC`x!lWGH9~fR#%;gT4wuG_N{Wl4qg9i{9S@SQ#TR&s$(gO_-Sd{J zmvKDEPHVKQW|;6*&E~2H0h~uS#Y2152{{LqJbsJDq`7X#D~1by)jPJ+T4|=MgjuV@ z>JMI5AuQRS7zi)Q+~dzi4h<$D>#m3>wIt*dsh<(iNq_jGvk{#P*r6+NA7bj_0|^M; zCuSdE{aJ%%X@7`v^6lxz@9|$%49gt4!%hu-P2ZW)=WXxt#C+BrO_#;~zek&sBqXi8 zU{vK=Kn8z8MdtXP;UiA*MJw+{|IV%lEqD0-sYG_25~a(7f!~hJE4-8IrKyGqRsBK0 z@!FLboBvmcwHbHBuj(?_*Zkgbieo^s8)%` z&)^#7$s{lVI_$nS1wdhpb`}8=0Os%Nc<^l(e=;$i-4yj^Z}dxLJvN;f43v(GH$7 z&z)PtGsmjzz9m;zG5g_eQh(pvSTa1~oIPRN z*y)`vLXa##iiS8RQ?#x+&uKY-3577_2Ub*6{EH@*uC3;h22Lsk-|J173YKgeeZ!?` zS-%V{1GYlqli5=w5%88_T1j-}eN5EuL$*}ekLM?` z*a@JMTlaZbXef1csZ#kso7|ei7qV;lCjSTa?z?|?GL@n{7=>WU|TAg+Qk@mQhq$J z?f-zVGKZH**rPs8*%QCKB~&jL=M0pFM z&l(d$Js1YxvatS&!Va+6M9)yfylrN`#83GU0f>lY4HH{7ZtA6NGS;i@4oKg1z}YvL z`Ufm4^v%T1i%#W6faylFk(eG4fRXjijp6O(b=yL=1J%27Cdsx&%^r2@pk8yRYtZUj`uuF z(}V5(;Kw)btTJM^$ctYr0S(mqR(tkeh@~UBz;1gpw%-yJC6HZ@ zrB4jhlg*^&_hp=`o8EnN4B`6;dezf49_R)P?EE|xUI2aMQ}{R<6wz2kV9l*NXmzFRu$V`mNFPCK#(q6_U2#=FGVCx5;^ezelCv@q)?*Y!{m9AZ_ z@pL-kY1wWO+g=Q;dY7cuk_t#eT;`~LL3eCs<2Dr3&X7l<9-)+MpN7D%igYdC5dCl; z|?F89A{!c1=7c%oGY`TAxx2x}KO&drZ!n~J(Wu%=WKqX_l z0?#@reeYvwb#m#yI$7W8zu)?0E<2Iywb*Pz=gh00#atG@GQ_eDzwF5zn}cfXG}PoxGb_N&fA0=l~Qq7!XqbeEVH0i;{iV>!Ipk zs_M`V?aU3(X1^c2IUfVmOUg;P-LCFVnkTBq?fcs4WP&qMmLBKpm+V~xGgwskeJg$A z+FJIbHF^v}%zgBGf3hnbORGis)OmX3@eCxN#?r>K-F?PhTVuX$z zN5Q!lYR9=QrPVe~L0Gq=hCr_BX<;8ueQtqW6erj6-rsID+^JPn3>5kjK&~$rWVt}t zb2VEyj$}dPw<<3P-;g?u0+TQH=Fc|cPuA1mprZAFH^OnPY-iz`;k%hO!{A5pKs^yoexnxA(@QO1gIp{2R6i`8JDvcYcRIhW8s{#9D zmnJER@&^_+(o=H0YpUK7c;a!I5i4W60JL^TB}S z(#0Uzax?zIN-sQ zixloBG1}(~qvsI&Y=-`Cmpx*!C(Wdm?SlqBAmB3Y+{Dx~TA08p1G0VYlFKRmBf(E^ zq{CJVQavq?E*M-NdNA8}%s_aY(ZBW~Gln2}fj}*k-2YuPRh`b24rH>Hx=ePeuX1S6 zF-)RZc03rlTO1y>huu`#?PP7|?D_%tLH*;v4pqg?+Ha)YYF8iq@hF~A=`xYadV{N6 zYx|wzO1}E#=?sZ~L7du|l6&XR(=}|W?&=lNybyZF-DhZKz_>Hklr1njD3peu-Y^Ha z8sf0W=`L)6HENN<596C~IH{H7!Cqc+GyCQ=4#b`SOLpjOl=#`0-YF7BNCnioTk;3) zsd>XL@A(IstYlzXo}sqGKQ|E1C8#@X#p}!sT=EWm!xD?-^SGqlyCqy-ebRSuc*iq9 zgpWnN;@C)-S5qZV*GSZ#41eA(6purZacr$GDl#7qAF zwoIizNaTVxMMy%M%`xHW#sBA~n z6yoq5ZR0b4?mzrKe90wTd7fhV703&g9lG|gn(L2-y98oS{Dqr`U=}b zwD5G<48b9YST-|8wBN}Os29KQ;bss~^NcDW#d1RaBY0X~ zM0`uYk9CXDFD0^8o){-n&ZsQRj2ma`-h~Q*E5O;=7M-Gq-xg!CFCPv#puJ-ehvP{{ z9tRL^fWrlcmoAo7fb$%P?OBbD{3p_H)#d&3Yg{Gw%jty*XDY0cD3KrD>q%Y8BH{^mg4Y6wUv{Ole+LqXJiTa zSv0;PD`WAFYx9S8G7*nL+OO92dOc7iRXzlN%;Z0Ic@|3^t{!rDeHNYXwmOP;C zchqy`tlj3WH>FT*L1^L7=p?ilaPE!f7LSgt1x`{d?O`kpU1R=3*8!L_+hBras5tCU z*d~_O&iST#4OcT*#lZVvf@6Oo9X}L0@0yq%E5n;JY5?HO~HIBm6 zCa1GuiLWZ!9I>tNNfa^|Ebb!82VNzGtnH2}Si)G|V15gM=;#w?1ZG&xqZ8dbr%$^yrjX$tQM|aw8=O zg+#z-E-`LL(70q{PT{lC1f_z89?4RO-&drBc!lOtUWi><)72QE+2c|IU+}M4_Q!2w zd>RP{OR4&IG3uk?`cD~5p52;NWN0M_L@QPgP`LsTCC?>kGJx$h7VZ z_k=|v`lYjwhZE1`aaoy0@ZXp_kQ)oKCZBxrBx*c6S+Z2Ovu^?G#j)$l5IT2S!)xPt zpUo6rW(w#)?5J`pWfFDYtbS4fx4ivBdTgWfWg&ZaB{4%`Z>WA^ghYq=U>S>TH<&{n zB}2pBQ0e*|Ohq1q-1{#ntJ}e(41?0}n)l7XR1Grz{vsl2y+SjZta(q5ra&H}1i}q1 zL!O?adtczS`u+Py6rn`hIghC6Jsy4&GU(hZcts$->ES)H$tYpO?n;t@M{gCRV|4ra z5XstWoM}v7R?GEK;179M&P^B%yz`U3x;$*zJ@-s|$z#b~y$TRFCo5|ke!{;sRUdPM z+fU6V8vgXBfyHz|I92kVlUN+qk)7zjalzxN2VxX%n}hJsUu~Z2RZMPjbcDjG_38w* zhBSkkfue6BR$_AZ_CkG|sKR)G0n*>(g<#6)^^`O3djV(a5<|Vyf*uxMso_DW70f`1 z5_j@RhnkyIRnj%-CUihSPi|5BS&XjTY+E7GD)vyXtJ_RwW2e5{a^&!VLLyjPEk9jB zdjNPLXX>faUGb1v*UR~KGj7>L-`z&PD}$+pMc56Yvl-Y{snMQ1t7mO9j-lx|A3yeX zzW}fGyX}M|$@vB7X?HrMUf7?%Ye(AVYv(8RpWSALVJdZ_wy0;5^u zSu2IvduVVD0E#1`SByvRE&V8rsQ0OYTJOqZp6})~c@D&pCr}^`_HVHyN|Gigb7sZ` zp?y<41MC8<$@7NP2rSJ2{vF^KE$Q)cs2MS!$hn?vHF}=d^()?>#;CKVW)p9bh%`Je z>G>9z{M#c2wZsCx26Nm>yRITuERL0rg*wpDG10X0HFMd#NQ=enEkO9r$M)?0ob2T6 zt@*p3G67c`+2Ap}Y7NKIj8EV1{n6}Qzg!TbnJb`~!~it~N@?0tSN9@?N?Lty*fbJ53T_CYfYkN3$=cTqKTcEC4k0B1`Ir|*8 z`IHOK?Jww&F@5Dr6U(Ah6TAhW93*^d^>@_@H{;UMru(OWm3TwI)<(FoVLqvkz>0vf zPb6(b)!U`V<6QETN@gL0&y7X1Lcf?lxpR4dsnv`*wlw{$-}MyGL2J#6TV}&xDcfwd z`0c5r@>8l|+rz1*R_Dqkm~J0vZv^sSJ$+OEd;e0S;Kbuow^*zLW-ariqCti`Jiy<_ zmP%NDpkU#U)%0{>!(`6*mz`*UF=}DNTR}K0RG*(T1f6+tTgh9&!{k}%PUyPH5%_qJ zziLe7LWg(%Z1l>3+%^*fElf#C^KEb8?4Y9R-)0TF69{%X5XW_6?@#0xBkUhDr#0() z7)<#yKjh(@$XM*k@q2pnm=3n)lbMS(`T>E172 zq7S5dwtHQE){Sg?>r1R~J2!ju6SV;dkV$iO!wT6>*nm(5KVHfYL?CyxrDoT!hIA4> z1DmZaTv|!YmMZ^boW4r2z$@TLs(n-h)aKpiU>X!H;+1pYhj;!OG*}dZNd}B#Ev}rB zg#&`+mqYF7NrSs9i*j{koV2em%t=4joC%W6Ju6bmbn{YwZ1zM^Agl2@jGzoz0I{b+ zM?fxWuV89AFm-QEzDWN!kF1}X|Ekp~{u`)f7x>j(&3l|-rvh*(p)d8Ugg;O_>%S9; z)lG!b+@?cu4e=Y^pJ!sl~BB)kaX4*=} zZcSef-TxH805f^Hob%k7C&BqVX|#VSBx+i{(*Gd`8FG`6m#(iK?%xxDPb3vizk| z)hLIgIa|ewuk{WHln06oPmlth9icv|1QUaPPa8CmBK7xsP7)}U`kCwRYS|(cuwJ6#ew!|`;9(F%8L2qCD5rTF*i&vdJ|v){I70kVzPat zLz!Xo=%uSj-v=uW_wp7c6E9+9%yGPyro~mkCr0)!2MpY=(f!{MwamwOCc4e$inzAN zf;9kwyuHg;$m```J0R|JMGV=i17>FWs4qB;mu8&i4m3UEw)4qIxuy>O{dDJuHx_|e z(MSbI@5k3pzRD*G-?fehN+ zRkqD66df7wI((dc=z9#B6_ENsq9qef(gzMGuzfMNu1H_c!p@WL=c&dqb7v9LRoCqb zMgwnxDy=~@D^lQ0(usPYVTvvsj_}^}5@wi(9vT{f~aIGD%h7L9tt_u{% z`;UefRGS_w7CiXBWfhf4j74>hv;|3f@qiE08aiZSfXA6HY+QqEZ7=*>JcKZNl+y)R zBd?Zm-r{V^(ya2wgpl`^zi%AZTs}NUNB)lx5h+>HklwGifBQV&WTb!k!8FzDc2s(; z@lK*|M#q4`Bo2wNcd|PH`{SiPQus%dUaSLIWQl0u>G0LaPrwGBuz60Kf*3EWrl|Dn z;UZ+I;;&B(vn5KKts9XsT|?FAa&H7~h1!t<>ebZjr9kUZ>j88sxN4pgG_6ZtpGpWgzG`0hw2(hQj=!(wLfjp zpIETHkobmXgdtXYAt^Ucl6 z8O)u&m~+T^3mS!!LTi8R^=(%oc#NRz_?z}ih8!EB$v?xxjMbeJ$fprnClL3j6>ct2 z<@!X8{yPuF`lm^02S-D(C1{~P2mdBC~TnK2Sw*;-r zwN!?HO}~Ly{l$&ee5f{^Ps@Yz>FFl2{;N83kpf4^$oS{SygDNpRR!56d~Hadrk(Lq zQP~n3r8Zhz-OhN6IDh3XQ@bn;u=*!no)J9&w5%>@F^g)){s_-IHWJi;SElnOfZs12 z-XOoOMPtLraH(3U>II)=?Nvw^_RovAaSskgeZ|)=JnPGt=c8>w%c#;j5TF@w8N6Ps z_V;7x0E9f@`vvO%SNaNgxw17jAv$`iz@hn?R1Y29f!yIruHVX6hq~|+H&vxEmiJh- zi^kCux%eg_BgzqmrY(#+!U&yus9C_)Mc{hLO>R%VF>X6V zuQ{;=uEjl?t%N*{S8zr)gamWc`32>cJ_*0}aA!^dF~KTv zkBqdxH`QoR4t;JhStX~1zy&X6X2&&WHtq$f5ynof?)j7kpJozOqx8g?*8)p&N8WCr zC4B-%Ax|2TO#tiNdS#%l<>*6GmQmwKUCZ~=29vp)`U!V|wMq)QpQJ<`reCrn6gFnS zk4Ohl?$RNJ>O#IU&CMoLc8R)f3bBF?BlI1qY4_>dJt6zY*uQnOF1HC})Hinf@=L=Y zG%phG8AOl}%sEi+GV^^UO&of$YU87Goa1VEA|;qKO0l}K((L%cZocj@eNWfbKK~)F z-rYKKA4+aS*dJ)01ciWU`&Rc3qmoIIY&Xj!lA5_ull&9#47^h^c3U+KOQHiICF zxA`TJf89U41Zm>%x*78M{nI5`m=q~-LhD+=X-T@l^@GRLpoq-HkH7?1TOb|XA7=`U z>jlc|9m~$MPUg71o%M^_jc{$f|8MPzu1#+F=Qu%}OH+$#!{(LgyiwSXXL_0G_+)If z7uI{sW?ZCyv)8GG$K7dGa?3^L3`sri+JzSX+ZMB6_|H9E^Jii>`r5s7V^7SbMf>&cchga{M|?F3rSbUqlfYl{?zl&blnQyFx@qMeH2p5R0m~81`|pkA*f%V@)ccc z-}|EHetw#`SU?kJ9eHc1Y#@_LwX@r>l=w27nN3Eo*=%sbDl+*h)PgTk0Xl1gneYCU z#QQJQ%b-Jj7ArAKX0Z}xC_6v5LdQ(Ykz$OFj+eFzuUSpIFiZU-dyku(dj@Oqn!9bo z@uozQG2_;#TsIzB_|nU2!j{Fq{SQEio4rEWu2TQXkj3Qpv63z?#8`unqHh$GjEfYD`~fP`UsFuAl@Aw zy`>e#Wg%v*RKu4h$M3IOH3i&sZ+Sf&%VsC=ud$qJc^Wenb8oUo{sy0d+CgEr88(Ay zy4mtO>4i+~CW~ntKQMLHQp5fcd4TG5q+%lFqqtn+`$m$tiII9O-9{;;DGWd3y&pi= z_f@ z+$hsPE#H13oBfBP1L>ICwYL~BvP5d*Ml;@F_+XbrKBGnA)?`2t$5GhY?N^y}@4M(| z-2bbB9bJ=z`(t5rW^39RS2rjtF!b$z$n=?cP7mr}>Rw9e%D?9!Eu6c1P$1R**e%g< zl*{-_Wol!Nsg@dd2kC-1?P{^rK}-rU17l{D4`s&^8QJrhK*dVm+fWG^A9Um+jEcT? zUTzybvT(R|UHx_JfpGCt`;2Q9hMJB5Ixk(C=)IuytPCm-hp!DzT&W zWgeHkUX_?fQusf}A?98^Qv?`p1o>JZwW?J&>=a?09or-9UJjUI(2DnDH*KOPx4*=+PVxP6tWKttWXe zTHEj@y|}un{tWL634H(KwGfR8+w@icoC&C%u$!%if|p(Cq3Sl_)YpfQ|5D4XUf?PV zhhkoWY2mOu|KkKw|08Px3Hdhasg<$DXh)p?jk)~~RMbV8%N|odxJ{^4tsWgWGP-xQ zfpKPhT$MqIo5Fws^W@{8;zq>pCELF8lHnprHzVFLb|RXQ$exu3>;1=9X*Q!9ys3Va zUdl?%qoJd!A8li#E0h;RqvF&`_@YL546ldyU0L)2KPsfd`=!3+P+9)94b#3Fzt-;x zErPY-zR6#9(mW;f2f}4_lm45>sB61tOS@uMW3h{=T9zK(p+C;jA6(?~s4|qIdvuE# zhp`ndHOD-8-;_@0y_`%?1SyoX$%(cmh$wYIqYiuP1$w+4Qj9-&HkFy^L6^ttl8vE~ zn@8)$!|DF{WyVhbc3F1udX@SGjpr$SnHRbma!bV zjCP`_wG+_yTJ^ah^KWa%mp?+UP^`4?|D2j*rKw*!@D@QgYMrJ>f;YudDJFe57c+Vr z0vac5-~HV@C_HI{`=M+PDhCSg7eN=u*rmH}6k=-CNr_x??=3`n?DEh3HJKY2Ji2x4 z6^Wh?SRfW^CjuycW#D#h?A}d{s3RO6bje$RPWEQ(f1p+_OttI7nz}fuh?oDEO?=!9 zR_PfAcJH>cl6psOQ;$fV9A`0-M!}%PohD!h>Q)FsKHTd{%g&n!a!w_4!PEVne4>h^ z&Rs#c1Lq>A3(s66eEiznfvk7WD#tM*&JrqTC2O7{*e%iy`|G*M{J6m2}e=Ri%TiYhPaTQC)eY}qQ7gt97Dc=B<_i+eEc4}uQ06lqRxNzP+i?p zUqY$a_OZJf{&_4{{yUUee$Ju(Oa_yD-jf;&BT2`p>v?#aO_-eZyCM-?r#HccNdia( zegx}iB7c6?ST;y0i}K&ZMDCu3i=Jy~^OY7CJf;O!$%UhCQ%>`{67Jm}=)bFCv|jpjogHx(JibJe3ahxwDdH**v) z`H0T(=3G1l&I3QyS32=CVj!r)l*?wnjOf-&kL#=3-zZo~wZXHH>Lry<=ZR4lD#JW> z<+~4bb5YC3AnMMaMTaZ_6MVx0&|hzt>i9RT;GJ)t6wg$QGGra{_`kR0I?(Q@gY$#S zao(S05Z4pEU*~An!_nY^mo0eW2dq+{WG*%z!|v~Hedrs#QR6v_^tLl|XnSx``~uyG z@~_Iu@L=MZ<`5gLr`b^nX};&!{HXpluW@mW@-Gywq-DbgX* z6%Yuh^pXIfN(d+xnt-82y3&!}5<(;>(h-ne5Zzu>G?}@4l*QL3|*qaw~ySoj` ztj-7fq4qpBvg`>AObd2Nb{%aJyD=Bas%`|_-%qqlo+j*aph_^wW$DA1Wd>kn3eWaX zdvNITu=cI6K(P=KW{~0!A?up|0uzl>=q7x=9dYwRWy$V+tMn|2a-8kD*cF7%Ru4dQ zSFwaiMW2d8C5p$%ZhQc`cU+Q z=7RA`7m`;K{rZ#yZ5rz5iSIwKQC&g%YanAT#m)d?Ixs-I381?u7HmVGq~%rV$6buVvsBwJdezf5et?@Kkbo?VM*Gv}Egw(Jtqx9{Z4X!2asQP)ZK zG*^tq>i6A_#ugbzD+PV5pFG2ro`n43Qh0>{h;6flSK=G{0e&!)>prL$F(Z|pFJtAN zczHD2KCvoFg65%%$DoBzPh!ca?&4sb0==Hg>2rCS9>4-IuVc-ugU4JukB+jvH6*@V zpP!UzkFV#fHa5>lbD0MtN3t&o1ztEeHmX=u9uSDk9@RR~^vi6(9L38Xcdx%RzqdLa zQHh}H)sWEgnbA~TeyDhVooP5sT;6&4;p+R)-{9TTm&bsaFKxq%1B=F>N^+!uD2d1S z$2<}5VhqI_SltiHIQ2#2f#Liy8CTMXU8T3_i`5jZ6_)a3h9k8mm3|q)p`@41?~^#L zRm4|{b0_(>DlUAoPXK3R39hPfsCjmUrdcI5nX^WS-|OaT19m;6NctGlI@K!jslm94 zx|?F@zuO-dVF?WSa6H5>#93gyI4LtloY`6I9sT=x11gHid+h5Tz6*Hpi#e3{-0v1@ z@+QMvTHO!55S?+V$&Ok2KVCJHR<@>L?JO_r{xc*}{nZVEHD~3(w29 zZaQEUt*s3}E_B*`ZtzbJ86_yjRw~HFbYowjeW6t~fZT(eS-A G@bfb2+`HFl+uS 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 gDOp`Q*H5%CPbrAg^;n0us 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≥~3Hhm#AG=((j*Qit z)Wam!X9Iez^ZJetmwNY^BWuxB&$#)TtWmDQ;vdEj{9Z0{ZMG1B>5PP~<*mj}dyxx@ zxQf%;p#zbyNB+b`-z`yjxYo>Ns~ZCe{jygo*CO=gpKk0U|0v}mbu;t(oA27zjuoLT zhQ5N8gN_CF~B z7FxD5GSK}WVWoaz9o9ztd6+5U1Kk~h-@9>=&PEs}o{*`e_c0sL_4!6vMrD}gP+mn+ zMvUkdDrSS*+)JLJ)_4fJx*Vq?_EkyUWTZgqayhTRS2RRU)TMgtN47!+=7#sV-aT~i z;p%!vwO9Hr3uiQE{=P@9bpPuCXT?t;`)@|u)%rf_{>~qd7pauldyfh@22qXULbX=# zd8Pb5>l*HW69u#TF^$N$_&)`b{u#c4{iW8r)+S!yvu&Z>wUnHnMmfx(5~kN*Bc{oK z_vwr1?Qql*Ya?=(`)i3kePcLTTNWqy!FA~a*Z+1bZqOQ0>3*#2d;9`P6sapH?gJ2rRnd95j!Ay}0rjoo84lHt%pvREjU#ODh= z69%|0(I0dUD5>J)Ym&!fzb&YwIq8bu7oaA(+|d@azZd*HPHVmRx0+vxu8P&P-;D;& zh@qU%vJmObJ{@bpwTyvy6nIpJJpYNGJb z#s+-KaaR}`bHurzR;a;!Y!p4py4$!Fs4M3S(gGCYZJ4$DVmPk56ofrNCQ{|Ptw z1I-$*5A^j##l| zS*C}kc7aQ~9VXsOQjpK)Lr>n?lcYs|imNw)U+YmJtHmxi(DJOYq;L!G(L(YD5)iXg zms1MimG1b8+z~K_rsgB=s0Jlm^2HF|Zuag0;)9(t)Lv{#FScSo=zKgm6y>LIta9_t ztl4eIazXi!NuT)%X!*-(v_zkI#-JLi$cky>dq&6kH& zaI(j{^FQO^{6JoNjQN|-R2Sc1xtEa)^K1aNCNl8YUoi4WnN8we-}P{#i`vkAEs`M2 zT6qdl(4baQnYAFUWq&uO_M<783e!V<=0WyQ)4mV&lvQ+V7hH!uO@~qwt|tGZ8#GC>=lC&Rl}HI_cfSTzjEIyqqIDNTOMam>=rf*L0~g zT!xs!!WP5ne?ig+r@y$K@s-R7L_QswhY;lbP3Qq}k!$iCY+SmDNMI};xOf#|8*ZFY zx}%eJHzSWYEa_pnD6DsC#e%#S;P(K%5fn|?@r^zpa-1NA$;p&{eNl9RXP#pry~sP6yf`b)T? zmUN2W@rXB-Mozwvs2D`vog3MU>X*vZNAg(PR$4T%oSAl8LJcpTM5kIG_$^tR1~?;a z2eA(ADBCe!+M=$#NO9rf#ZwYyby>a)sevWyHWW&M;w=P2NZH+dcQ&bG_mi?b{XF>fX zj`A%NHB#pd%%BcZ&dm)H#33I|PXio!D9Ix!k)}s2c-0;`8bV{QzBc?9T=c?PDf) zmkfHo-+gQCmIP*&S!yhRJ$9J9C7U|<-TpSwc6Y-n-=QmQUW4w}z96Ap1sg7&-~a$y zpK7Z%D4>a~)0k%M3!z|+S5)<=MZwjQS@_$Y2O1;Nh05X`{#_}lx*Op((RJiD@x8MZ zy73mqr!stGZ|kpkJx>kcv6@?Wz<;)D84_w8b8&-ELi3`RYQM=iS{>d-BDa>nQO~pUMapS7E#VZBYJ4 zX>jej+#?l5-)fYJ7nJXT5WUsAvRFI9&!!KbkF#)I1bTS3x>4k3ydZ9u}0 z#nqDT;M#O#ofSsP8nJo0O?B9pq&~ocN;~OR=^dne!*0;O+PC(6dHJUMy-}{_ z42fg-2#g0?}0KIeGEmXOg$%H#^ zg!1FFg?KI~;%+9|_^SR#*o#>p-@b93ac-r}dWJ!j=!?H|)@a<-{v&tmscV~viyy&X zcRzep$%>Eep`R41kH750dOEz`nZc@e^q4TpwqoKxH>neIu&-Yc-M!hiCHq>t!%+`n z#N+2;?{1^<;Lw!0Z7RzVp%6DZ$WYTNlnzX&)&ie4&8Vs&-gr^a8esn)nw~MM4lBmL zeJ4NdDzpDYTP$2&Qe8dkMYzlFd;29D-lIe*;=rT@rf6kYo425s;$1Ge^bHz3a6}+M z_zYQ@kEe1NG>xxB;A;W#Y5N?D%w?%G*1&km8nh?+f+8lCsW0(y9 z$}Gc>nG%;EsC_T1&cK#Unadac|s@Qdcd#G%IMSXM;)?+zBcC&0YWV$H= z00ujrAu7|_ZJu8?0V7~MzphP#i5vKFsHHs#PMW>qrz+>h6nw2tW6i{&LnOqz%$us- zq?ae1#E!q&Bkl-jLm@6+JT){P_Z>BZyss5!P|ySY=Li$s;gH8ZTpun#mdB|p&~w}C zZe}lFY_L5{Zth;?suwvvAJQ_vs009k6U#_hm<)zcITeDR&&hHOOdUGD+&HH3hk?CO z0kbnn$4F)f*#!Cwx7=7%U}S6rFKWoD0Wqw;c&4^Gx&CA+_ErMj+S{c}{T7O}OIdUPGDD0PG zun?fZHvg#pK2yrY+&U_vX%0y8H{Q@LPtnIO;KWn>h5^}pWlpzI z>_^U&HdHmc%r>QYG6oKLV@|K#{^dl1Au55Zoe}q~>L{b?8>hFG$ilr+t?}0mn(?9% z-NRe;7%Xid6TE>-tAvoG0s!?sQ@VPFf>+;(tQVKE zA;A=dJ(J`CWX_p+Bs;stl|s7^g{L-CQ{qZDrTdt|jucEkXbS-2ANi^WPCre-r)Rbz zF*esEnC@~etvbS2V)Yejqo*he(HB$mXEQt@8&PKD?ZGQdXIiIq;3*IuPf=iqJoX`{5E!gYv*`S5j-u0ReU};C zWL%rdNgd&1zvW;biA`b9L;-2cE|NSX^gxJgz}n6D9!1Kfbz4<*@#UzB$i}Ye8Ur=XF<>;i@!)}kOJ{Nh!hcDl zVuy1oR7cS*H6i+YGnjIs2L~^q;t7TE&^yZ%MLi!Y37=1o+~Yb!^1gGXL*Gz3lU^?t zg#A&ju?uxr4WT6QP}k4GH(k zpEihJKUJ}mpo!Q#hrujaMRspecl66+r4T?&Q4vE0h^;|DP$yMGuCU@DQw7JAPI|rc zrwW+#zmOz&URh+t%j#&nZxwh<6^GAfaCY7Qr2@N75m?Ud7&582LE<$gIc%VUC)qAK zE)Hrrrzpx#ncN%6;X@f+r#}lAx)TtpBEd zJ*vg}Nmb7%Wxrej09O3{-qnA|k9zQi(wLf0ma_%Zs)g{D8ZC!2V@@e^v4C57pJ%vx zi;CGVA4*jGatP!3BLCKW;;WB=NyiqP3ERxNurgGmNmLZZ2mMkLUZM~P3g#MkDN@Iz zG#A7;ABBEcmuBnmw2IDXrY6h5z#3E(G&<80Gi$b&u*yqFiB!^SlqAfw68iMUs*VjW j()^IBok3L``OyTD)S~O5J{{QzIko-M@c?cAsZ0L?yfhR& literal 456336 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%0ABQME-RfR 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 z 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

Zhdh})MiX19 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

Wio^a?i03VNAl8MU@T0B4I_P*1Xcwn`h5 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ʍ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 - + @@ -39,7 +39,7 @@

- + \ No newline at end of file diff --git a/pr-1699/learn/how-celestia-works/data-availability-faq.html b/pr-1699/learn/how-celestia-works/data-availability-faq.html index f6bb6321a0..b182e80770 100644 --- a/pr-1699/learn/how-celestia-works/data-availability-faq.html +++ b/pr-1699/learn/how-celestia-works/data-availability-faq.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Data availability FAQ

What is data availability?

Data availability answers the question, has this data been published? Specifically, a node will verify data availability when it receives a new block that is getting added to the chain. The node will attempt to download all the transaction data for the new block to verify availability. If the node can download all the transaction data, then it successfully verified data availability, proving that the block data was actually published to the network.

Modular VS Monolithic

As you’ll see, modular blockchains like Celestia employ other primitives that allow nodes to verify data availability more efficiently. Data availability is critical to the security of any blockchain because it ensures that anyone can inspect the ledger of transactions and verify it. Data availability becomes particularly problematic when scaling blockchains. As the blocks get bigger, it becomes impractical for normal users to download all the data, and therefore users can no longer verify the chain.

What is the data availability problem?

The problem with data availability occurs when the transaction data for a newly proposed block cannot be downloaded and verified. This type of attack by a block producer is called a data withholding attack, which sees the block producer withhold transaction data of a new block.

Since transaction data is withheld, nodes cannot update to the latest state. Such an attack can have numerous consequences, from halting a chain to gaining the ability to steal funds. The severity of the consequences will depend on the type of blockchain (L1 or L2) and whether data availability is kept onchain or offchain. The data availability problem commonly arises around L2 scaling solutions like rollups and validiums.

How do nodes verify data availability in Celestia?

In most blockchains, nodes that verify data availability do so by downloading all transaction data for a block. If they are able to download all the data, they have verified its availability. In Celestia, light nodes have access to a new mechanism to verify data availability without needing to download all the data for a block. This new primitive for verifying data availability is called data availability sampling.

What is data availability sampling?

Data availability sampling is a mechanism for light nodes to verify data availability without having to download all data for a block. Data availability sampling (DAS) works by having light nodes conduct multiple rounds of random sampling for small portions of block data. As a light node completes more rounds of sampling for block data, it increases its confidence that data is available. Once the light node successfully reaches a predetermined confidence level (e.g. 99%) it will consider the block data as available.

Want a simpler explanation? Check out this thread on how data availability sampling is like flipping a coin.

What are some of the security assumptions that Celestia makes for data availability sampling?

Celestia assumes that there is a minimum number of light nodes that are conducting data availability sampling for a given block size. This assumption is necessary so that a full node can reconstruct an entire block from the portions of data light nodes sampled and stored. The amount of light nodes that are needed will depend on the block size - for bigger blocks more light nodes are assumed to be running.

A second notable assumption that is made by light nodes is that they are connected to at least one honest full node. This ensures that they can receive fraud proofs for incorrectly erasure coded blocks. If a light node is not connected to an honest full node, such as during an eclipse attack, it can’t verify that the block is improperly constructed.

Why is block reconstruction necessary for security?

In Celestia, blocks need to be erasure coded so that there is redundant data to aid the data availability sampling process. However, nodes tasked with erasure coding the data could do so incorrectly. Since Celestia uses fraud proofs to verify that erasure coding is incorrect, the full block data is needed to generate a bad encoding fraud proof.

There could be a situation where validators only provide data to light nodes and not full nodes. If the full nodes don’t have the ability to reconstruct the full block from the portions of data stored by light nodes, they wouldn’t be able to generate a bad encoding fraud proof.

What is data storage?

Data storage is concerned with the ability to store and access past transaction data.

Modular VS Monolithic

Data storage and retrieval is needed for multiple purposes, such as:

  • Reading the information of a previous transaction
  • Syncing a node
  • Indexing and serving transaction data
  • Retrieving NFT information

What is the problem around data storage?

The issue with data storage is whether past transaction data can be stored and successfully retrieved at a later time. The inability to retrieve historical transaction data can cause problems, such as users being unable to access information about their past transactions or nodes that cannot sync from genesis. Luckily, the assumptions around storing and accessing past data are weak. Only a single copy of a blockchain’s history needs to be accessible for users to gain access to historical transaction data. In other words, data storage security is a 1 of N honesty assumption.

What is the difference between data availability and data storage?

Data availability is about verifying that transaction data for a new block is public and available. In contrast, data storage involves storing and accessing past transaction data from old blocks.

Where does blockchain state fit into this?

Up until now it’s been all about transaction data, but blockchain state is a related topic. The state is different from transaction data. Specifically, the state is like a current snapshot of the network, which includes information about account balances, smart contract balances, and validator set info. Problems that arise from the size of the state are different in nature than those around data availability and retrievability.

Why doesn’t Celestia incentivize storage of historical data?

Most blockchains don’t incentivize storage of data because it shouldn’t be the responsibility of a blockchain to guarantee past data will be retrievable forever. In addition, the data storage problem only requires a single party to store and provide the data for users, which is not a strong problem. As such, Celestia’s purpose is to provide a secure and scalable way to verify the availability of data. Once data has been verified as available, the job of storing and retrieving historical data is left up to other entities that require the data. Luckily, there are natural incentives for outside parties to store and serve historical data to users.

Who may store historical data if there is no reward?

There are multiple types of actors that may be likely to store historical data. Some of those include:

  • Block explorers that provide access to past transaction data.
  • Indexers that provide API queries for past data.
  • Applications or rollups that require historical data for certain processes.
  • Users that want to guarantee that they will have access to their transaction history.

What are some things blockchains can do to provide stronger assurances of data retrievability?

  • Reward nodes based on the amount of transaction data they store and requests for data they serve (this is the case with some data storage blockchains, like Filecoin).
  • Publish transaction data onto a data storage blockchain that incentivizes storing and serving requests for historical data.
- +

Data availability FAQ

What is data availability?

Data availability answers the question, has this data been published? Specifically, a node will verify data availability when it receives a new block that is getting added to the chain. The node will attempt to download all the transaction data for the new block to verify availability. If the node can download all the transaction data, then it successfully verified data availability, proving that the block data was actually published to the network.

Modular VS Monolithic

As you’ll see, modular blockchains like Celestia employ other primitives that allow nodes to verify data availability more efficiently. Data availability is critical to the security of any blockchain because it ensures that anyone can inspect the ledger of transactions and verify it. Data availability becomes particularly problematic when scaling blockchains. As the blocks get bigger, it becomes impractical for normal users to download all the data, and therefore users can no longer verify the chain.

What is the data availability problem?

The problem with data availability occurs when the transaction data for a newly proposed block cannot be downloaded and verified. This type of attack by a block producer is called a data withholding attack, which sees the block producer withhold transaction data of a new block.

Since transaction data is withheld, nodes cannot update to the latest state. Such an attack can have numerous consequences, from halting a chain to gaining the ability to steal funds. The severity of the consequences will depend on the type of blockchain (L1 or L2) and whether data availability is kept onchain or offchain. The data availability problem commonly arises around L2 scaling solutions like rollups and validiums.

How do nodes verify data availability in Celestia?

In most blockchains, nodes that verify data availability do so by downloading all transaction data for a block. If they are able to download all the data, they have verified its availability. In Celestia, light nodes have access to a new mechanism to verify data availability without needing to download all the data for a block. This new primitive for verifying data availability is called data availability sampling.

What is data availability sampling?

Data availability sampling is a mechanism for light nodes to verify data availability without having to download all data for a block. Data availability sampling (DAS) works by having light nodes conduct multiple rounds of random sampling for small portions of block data. As a light node completes more rounds of sampling for block data, it increases its confidence that data is available. Once the light node successfully reaches a predetermined confidence level (e.g. 99%) it will consider the block data as available.

Want a simpler explanation? Check out this thread on how data availability sampling is like flipping a coin.

What are some of the security assumptions that Celestia makes for data availability sampling?

Celestia assumes that there is a minimum number of light nodes that are conducting data availability sampling for a given block size. This assumption is necessary so that a full node can reconstruct an entire block from the portions of data light nodes sampled and stored. The amount of light nodes that are needed will depend on the block size - for bigger blocks more light nodes are assumed to be running.

A second notable assumption that is made by light nodes is that they are connected to at least one honest full node. This ensures that they can receive fraud proofs for incorrectly erasure coded blocks. If a light node is not connected to an honest full node, such as during an eclipse attack, it can’t verify that the block is improperly constructed.

Why is block reconstruction necessary for security?

In Celestia, blocks need to be erasure coded so that there is redundant data to aid the data availability sampling process. However, nodes tasked with erasure coding the data could do so incorrectly. Since Celestia uses fraud proofs to verify that erasure coding is incorrect, the full block data is needed to generate a bad encoding fraud proof.

There could be a situation where validators only provide data to light nodes and not full nodes. If the full nodes don’t have the ability to reconstruct the full block from the portions of data stored by light nodes, they wouldn’t be able to generate a bad encoding fraud proof.

What is data storage?

Data storage is concerned with the ability to store and access past transaction data.

Modular VS Monolithic

Data storage and retrieval is needed for multiple purposes, such as:

  • Reading the information of a previous transaction
  • Syncing a node
  • Indexing and serving transaction data
  • Retrieving NFT information

What is the problem around data storage?

The issue with data storage is whether past transaction data can be stored and successfully retrieved at a later time. The inability to retrieve historical transaction data can cause problems, such as users being unable to access information about their past transactions or nodes that cannot sync from genesis. Luckily, the assumptions around storing and accessing past data are weak. Only a single copy of a blockchain’s history needs to be accessible for users to gain access to historical transaction data. In other words, data storage security is a 1 of N honesty assumption.

What is the difference between data availability and data storage?

Data availability is about verifying that transaction data for a new block is public and available. In contrast, data storage involves storing and accessing past transaction data from old blocks.

Where does blockchain state fit into this?

Up until now it’s been all about transaction data, but blockchain state is a related topic. The state is different from transaction data. Specifically, the state is like a current snapshot of the network, which includes information about account balances, smart contract balances, and validator set info. Problems that arise from the size of the state are different in nature than those around data availability and retrievability.

Why doesn’t Celestia incentivize storage of historical data?

Most blockchains don’t incentivize storage of data because it shouldn’t be the responsibility of a blockchain to guarantee past data will be retrievable forever. In addition, the data storage problem only requires a single party to store and provide the data for users, which is not a strong problem. As such, Celestia’s purpose is to provide a secure and scalable way to verify the availability of data. Once data has been verified as available, the job of storing and retrieving historical data is left up to other entities that require the data. Luckily, there are natural incentives for outside parties to store and serve historical data to users.

Who may store historical data if there is no reward?

There are multiple types of actors that may be likely to store historical data. Some of those include:

  • Block explorers that provide access to past transaction data.
  • Indexers that provide API queries for past data.
  • Applications or rollups that require historical data for certain processes.
  • Users that want to guarantee that they will have access to their transaction history.

What are some things blockchains can do to provide stronger assurances of data retrievability?

  • Reward nodes based on the amount of transaction data they store and requests for data they serve (this is the case with some data storage blockchains, like Filecoin).
  • Publish transaction data onto a data storage blockchain that incentivizes storing and serving requests for historical data.
+ \ No newline at end of file diff --git a/pr-1699/learn/how-celestia-works/data-availability-layer.html b/pr-1699/learn/how-celestia-works/data-availability-layer.html index ece88aab2c..9d756602f5 100644 --- a/pr-1699/learn/how-celestia-works/data-availability-layer.html +++ b/pr-1699/learn/how-celestia-works/data-availability-layer.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Celestia's data availability layer

Celestia is a data availability (DA) layer that provides a scalable solution to the data availability problem. Due to the permissionless nature of the blockchain networks, a DA layer must provide a mechanism for the execution and settlement layers to check in a trust-minimized way whether transaction data is indeed available.

Two key features of Celestia's DA layer are data availability sampling (DAS) and Namespaced Merkle trees (NMTs). Both features are novel blockchain scaling solutions: DAS enables light nodes to verify data availability without needing to download an entire block; NMTs enable execution and settlement layers on Celestia to download transactions that are only relevant to them.

Data availability sampling (DAS)

In general, light nodes download only block headers that contain commitments (i.e., Merkle roots) of the block data (i.e., the list of transactions).

To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into k×k shares, arranged in a k×k matrix, and extended with parity data into a 2k×2k extended matrix by applying multiple times Reed-Solomon encoding.

Then, 4k separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.

2D Reed-Soloman (RS) Encoding

To verify that the data is available, Celestia light nodes are sampling the 2k×2k data shares.

Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a high probability guarantee that the whole block's data is available.

Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares (i.e., at least k×k unique shares), the full block can be recovered by honest full nodes.

For more details on DAS, take a look at the original paper.

Scalability

DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.

This means that increasing the number of light nodes performing DAS allows for larger blocks (i.e., with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the 4k intermediate Merkle roots.

For a block data size of n2 bytes, this means that every light node must download O(n) bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.

Fraud proofs of incorrectly extended data

The requirement of downloading the 4k intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard (i.e., 1-dimensional) Reed-Solomon encoding, where the original data is split into k shares and extended with k additional shares of parity data. Since the block data commitment is the Merkle root of the 2k resulting data shares, light nodes no longer need to download O(n) bytes to validate block headers.

The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.

This is possible as Celestia does not require a majority of the consensus (i.e., block producers) to be honest to guarantee data availability. Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares (i.e., at least k for a standard encoding and k×k for a 2-dimensional encoding).

As a solution, Fraud Proofs of Incorrectly Generated Extended Data enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, i.e., n2 bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only O(n) bytes are required as it is sufficient to verify only one row or one column of the extended matrix.

Namespaced Merkle trees (NMTs)

Celestia partitions the block data into multiple namespaces, one for every application (e.g., rollup) using the DA layer. As a result, every application needs to download only its own data and can ignore the data of other applications.

For this to work, the DA layer must be able to prove that the provided data is complete, i.e., all the data for a given namespace is returned. To this end, Celestia is using Namespaced Merkle trees (NMTs).

An NMT is a Merkle tree with the leafs ordered by the namespace identifiers and the hash function modified so that every node in the tree includes the range of namespaces of all its descendants. The following figure shows an example of an NMT with height three (i.e., eight data shares). The data is partitioned into three namespaces.

Namespaced Merkle Tree

When an application requests the data for namespace 2, the DA layer must provide the data shares D3, D4, D5, and D6 and the nodes N2, N8 and N7 as proof (note that the application already has the root N14 from the block header).

As a result, the application is able to check that the provided data is part of the block data. Furthermore, the application can verify that all the data for namespace 2 was provided. If the DA layer provides for example only the data shares D4 and D5, it must also provide nodes N12 and N11 as proofs. However, the application can identify that the data is incomplete by checking the namespace range of the two nodes, i.e., both N12 and N11 have descendants part of namespace 2.

For more details on NMTs, refer to the original paper.

Building a PoS blockchain for DA

Providing data availability

The Celestia DA layer consists of a PoS blockchain. Celestia is dubbing this blockchain as the celestia-app, an application that provides transactions to facilitate the DA layer and is built using Cosmos SDK. The following figure shows the main components of celestia-app.

Main components of celestia-app

celestia-app is built on top of celestia-core, a modified version of the Tendermint consensus algorithm. Among the more important changes to vanilla Tendermint, celestia-core:

  • Enables the erasure coding of block data (using the 2-dimensional Reed-Solomon encoding scheme).
  • Replaces the regular Merkle tree used by Tendermint to store block data with a Namespaced Merkle tree that enables the above layers (i.e., execution and settlement) to only download the needed data (for more details, see the section below describing use cases).

For more details on the changes to Tendermint, take a look at the ADRs. Notice that celestia-core nodes are still using the Tendermint p2p network.

Similarly to Tendermint, celestia-core is connected to the application layer (i.e., the state machine) by ABCI++, a major evolution of ABCI (Application Blockchain Interface).

The celestia-app state machine is necessary to execute the PoS logic and to enable the governance of the DA layer.

However, the celestia-app is data-agnostic -- the state machine neither validates nor stores the data that is made available by the celestia-app.

- +

Celestia's data availability layer

Celestia is a data availability (DA) layer that provides a scalable solution to the data availability problem. Due to the permissionless nature of the blockchain networks, a DA layer must provide a mechanism for the execution and settlement layers to check in a trust-minimized way whether transaction data is indeed available.

Two key features of Celestia's DA layer are data availability sampling (DAS) and Namespaced Merkle trees (NMTs). Both features are novel blockchain scaling solutions: DAS enables light nodes to verify data availability without needing to download an entire block; NMTs enable execution and settlement layers on Celestia to download transactions that are only relevant to them.

Data availability sampling (DAS)

In general, light nodes download only block headers that contain commitments (i.e., Merkle roots) of the block data (i.e., the list of transactions).

To make DAS possible, Celestia uses a 2-dimensional Reed-Solomon encoding scheme to encode the block data: every block data is split into k×k shares, arranged in a k×k matrix, and extended with parity data into a 2k×2k extended matrix by applying multiple times Reed-Solomon encoding.

Then, 4k separate Merkle roots are computed for the rows and columns of the extended matrix; the Merkle root of these Merkle roots is used as the block data commitment in the block header.

2D Reed-Soloman (RS) Encoding

To verify that the data is available, Celestia light nodes are sampling the 2k×2k data shares.

Every light node randomly chooses a set of unique coordinates in the extended matrix and queries full nodes for the data shares and the corresponding Merkle proofs at those coordinates. If light nodes receive a valid response for each sampling query, then there is a high probability guarantee that the whole block's data is available.

Additionally, every received data share with a correct Merkle proof is gossiped to the network. As a result, as long as the Celestia light nodes are sampling together enough data shares (i.e., at least k×k unique shares), the full block can be recovered by honest full nodes.

For more details on DAS, take a look at the original paper.

Scalability

DAS enables Celestia to scale the DA layer. DAS can be performed by resource-limited light nodes since each light node only samples a small portion of the block data. The more light nodes there are in the network, the more data they can collectively download and store.

This means that increasing the number of light nodes performing DAS allows for larger blocks (i.e., with more transactions), while still keeping DAS feasible for resource-limited light nodes. However, in order to validate block headers, Celestia light nodes need to download the 4k intermediate Merkle roots.

For a block data size of n2 bytes, this means that every light node must download O(n) bytes. Therefore, any improvement in the bandwidth capacity of Celestia light nodes has a quadratic effect on the throughput of Celestia's DA layer.

Fraud proofs of incorrectly extended data

The requirement of downloading the 4k intermediate Merkle roots is a consequence of using a 2-dimensional Reed-Solomon encoding scheme. Alternatively, DAS could be designed with a standard (i.e., 1-dimensional) Reed-Solomon encoding, where the original data is split into k shares and extended with k additional shares of parity data. Since the block data commitment is the Merkle root of the 2k resulting data shares, light nodes no longer need to download O(n) bytes to validate block headers.

The downside of the standard Reed-Solomon encoding is dealing with malicious block producers that generate the extended data incorrectly.

This is possible as Celestia does not require a majority of the consensus (i.e., block producers) to be honest to guarantee data availability. Thus, if the extended data is invalid, the original data might not be recoverable, even if the light nodes are sampling sufficient unique shares (i.e., at least k for a standard encoding and k×k for a 2-dimensional encoding).

As a solution, Fraud Proofs of Incorrectly Generated Extended Data enable light nodes to reject blocks with invalid extended data. Such proofs require reconstructing the encoding and verifying the mismatch. With standard Reed-Solomon encoding, this entails downloading the original data, i.e., n2 bytes. Contrastingly, with 2-dimensional Reed-Solomon encoding, only O(n) bytes are required as it is sufficient to verify only one row or one column of the extended matrix.

Namespaced Merkle trees (NMTs)

Celestia partitions the block data into multiple namespaces, one for every application (e.g., rollup) using the DA layer. As a result, every application needs to download only its own data and can ignore the data of other applications.

For this to work, the DA layer must be able to prove that the provided data is complete, i.e., all the data for a given namespace is returned. To this end, Celestia is using Namespaced Merkle trees (NMTs).

An NMT is a Merkle tree with the leafs ordered by the namespace identifiers and the hash function modified so that every node in the tree includes the range of namespaces of all its descendants. The following figure shows an example of an NMT with height three (i.e., eight data shares). The data is partitioned into three namespaces.

Namespaced Merkle Tree

When an application requests the data for namespace 2, the DA layer must provide the data shares D3, D4, D5, and D6 and the nodes N2, N8 and N7 as proof (note that the application already has the root N14 from the block header).

As a result, the application is able to check that the provided data is part of the block data. Furthermore, the application can verify that all the data for namespace 2 was provided. If the DA layer provides for example only the data shares D4 and D5, it must also provide nodes N12 and N11 as proofs. However, the application can identify that the data is incomplete by checking the namespace range of the two nodes, i.e., both N12 and N11 have descendants part of namespace 2.

For more details on NMTs, refer to the original paper.

Building a PoS blockchain for DA

Providing data availability

The Celestia DA layer consists of a PoS blockchain. Celestia is dubbing this blockchain as the celestia-app, an application that provides transactions to facilitate the DA layer and is built using Cosmos SDK. The following figure shows the main components of celestia-app.

Main components of celestia-app

celestia-app is built on top of celestia-core, a modified version of the Tendermint consensus algorithm. Among the more important changes to vanilla Tendermint, celestia-core:

  • Enables the erasure coding of block data (using the 2-dimensional Reed-Solomon encoding scheme).
  • Replaces the regular Merkle tree used by Tendermint to store block data with a Namespaced Merkle tree that enables the above layers (i.e., execution and settlement) to only download the needed data (for more details, see the section below describing use cases).

For more details on the changes to Tendermint, take a look at the ADRs. Notice that celestia-core nodes are still using the Tendermint p2p network.

Similarly to Tendermint, celestia-core is connected to the application layer (i.e., the state machine) by ABCI++, a major evolution of ABCI (Application Blockchain Interface).

The celestia-app state machine is necessary to execute the PoS logic and to enable the governance of the DA layer.

However, the celestia-app is data-agnostic -- the state machine neither validates nor stores the data that is made available by the celestia-app.

+ \ No newline at end of file diff --git a/pr-1699/learn/how-celestia-works/monolithic-vs-modular.html b/pr-1699/learn/how-celestia-works/monolithic-vs-modular.html index a5b5246a5c..1b5b7a097d 100644 --- a/pr-1699/learn/how-celestia-works/monolithic-vs-modular.html +++ b/pr-1699/learn/how-celestia-works/monolithic-vs-modular.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Monolithic vs. modular blockchains

Blockchains instantiate replicated state machines: the nodes in a permissionless distributed network apply an ordered sequence of deterministic transactions to an initial state resulting in a common final state.

In other words, this means that nodes in a network all follow the same set of rules (i.e., an ordered sequence of transactions) to go from a starting point (i.e., an initial state) to an ending point (i.e., a common final state). This process ensures that all nodes in the network agree on the final state of the blockchain, even though they operate independently.

This means blockchains require the following four functions:

  • Execution entails executing transactions that update the state correctly. Thus, execution must ensure that only valid transactions are executed, i.e., transactions that result in valid state machine transitions.
  • Settlement entails an environment for execution layers to verify proofs, resolve fraud disputes, and bridge between other execution layers.
  • Consensus entails agreeing on the order of the transactions.
  • Data Availability (DA) entails making the transaction data available. Note that execution, settlement, and consensus require DA.

Traditional blockchains, i.e. monolithic blockchains, implement all four functions together in a single base consensus layer. The problem with monolithic blockchains is that the consensus layer must perform numerous different tasks, and it cannot be optimized for only one of these functions. As a result, the monolithic paradigm limits the throughput of the system.

Modular VS Monolithic

As a solution, modular blockchains decouple these functions among multiple specialized layers as part of a modular stack. Due to the flexibility that specialization provides, there are many possibilities in which that stack can be arranged. For example, one such arrangement is the separation of the four functions into three specialized layers.

The base layer consists of DA and consensus and thus, is referred to as the Consensus and DA layer (or for brevity, the DA layer), while both settlement and execution are moved on top in their own layers. As a result, every layer can be specialized to optimally perform only its function, and thus, increase the throughput of the system. Furthermore, this modular paradigm enables multiple execution layers, i.e., rollups, to use the same settlement and DA layers.

- +

Monolithic vs. modular blockchains

Blockchains instantiate replicated state machines: the nodes in a permissionless distributed network apply an ordered sequence of deterministic transactions to an initial state resulting in a common final state.

In other words, this means that nodes in a network all follow the same set of rules (i.e., an ordered sequence of transactions) to go from a starting point (i.e., an initial state) to an ending point (i.e., a common final state). This process ensures that all nodes in the network agree on the final state of the blockchain, even though they operate independently.

This means blockchains require the following four functions:

  • Execution entails executing transactions that update the state correctly. Thus, execution must ensure that only valid transactions are executed, i.e., transactions that result in valid state machine transitions.
  • Settlement entails an environment for execution layers to verify proofs, resolve fraud disputes, and bridge between other execution layers.
  • Consensus entails agreeing on the order of the transactions.
  • Data Availability (DA) entails making the transaction data available. Note that execution, settlement, and consensus require DA.

Traditional blockchains, i.e. monolithic blockchains, implement all four functions together in a single base consensus layer. The problem with monolithic blockchains is that the consensus layer must perform numerous different tasks, and it cannot be optimized for only one of these functions. As a result, the monolithic paradigm limits the throughput of the system.

Modular VS Monolithic

As a solution, modular blockchains decouple these functions among multiple specialized layers as part of a modular stack. Due to the flexibility that specialization provides, there are many possibilities in which that stack can be arranged. For example, one such arrangement is the separation of the four functions into three specialized layers.

The base layer consists of DA and consensus and thus, is referred to as the Consensus and DA layer (or for brevity, the DA layer), while both settlement and execution are moved on top in their own layers. As a result, every layer can be specialized to optimally perform only its function, and thus, increase the throughput of the system. Furthermore, this modular paradigm enables multiple execution layers, i.e., rollups, to use the same settlement and DA layers.

+ \ No newline at end of file diff --git a/pr-1699/learn/how-celestia-works/overview.html b/pr-1699/learn/how-celestia-works/overview.html index daa1df0467..50e01c8f7b 100644 --- a/pr-1699/learn/how-celestia-works/overview.html +++ b/pr-1699/learn/how-celestia-works/overview.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Introduction

Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.

Celestia enables the next generation of scalable blockchain architectures - modular blockchains. Celestia scales by decoupling execution from consensus and introducing a new primitive, data availability sampling.

The former entails that Celestia is only responsible for ordering transactions and guaranteeing their data availability; this is similar to reducing consensus to atomic broadcast.

The latter provides an efficient solution to the data availability problem by only requiring resource-limited light nodes to sample a small number of random shares from each block to verify data availability.

Interestingly, more light nodes that participate in sampling increases the amount of data that the network can safely handle, enabling the block size to increase without equally increasing the cost to verify the chain.

- +

Introduction

Celestia is a modular data availability network that securely scales with the number of users, making it easy for anyone to launch their own blockchain.

Celestia enables the next generation of scalable blockchain architectures - modular blockchains. Celestia scales by decoupling execution from consensus and introducing a new primitive, data availability sampling.

The former entails that Celestia is only responsible for ordering transactions and guaranteeing their data availability; this is similar to reducing consensus to atomic broadcast.

The latter provides an efficient solution to the data availability problem by only requiring resource-limited light nodes to sample a small number of random shares from each block to verify data availability.

Interestingly, more light nodes that participate in sampling increases the amount of data that the network can safely handle, enabling the block size to increase without equally increasing the cost to verify the chain.

+ \ No newline at end of file diff --git a/pr-1699/learn/how-celestia-works/transaction-lifecycle.html b/pr-1699/learn/how-celestia-works/transaction-lifecycle.html index e16fdd5b16..db4e61b9ab 100644 --- a/pr-1699/learn/how-celestia-works/transaction-lifecycle.html +++ b/pr-1699/learn/how-celestia-works/transaction-lifecycle.html @@ -12,7 +12,7 @@ - + @@ -39,8 +39,8 @@

The lifecycle of a celestia-app transaction

Users request the celestia-app to make data available by sending PayForBlobs transactions. Every such transaction consists of the identity of the sender, the data to be made available, also referred to as the message, the data size, the namespace, and a signature. Every block producer batches multiple PayForBlobs transactions into a block.

Before proposing the block though, the producer passes it to the state machine via ABCI++, where each PayForBlobs transaction is split into a namespaced message (denoted by Msg in the figure below), i.e., the data together with the namespace ID, and an executable transaction (denoted by e-Tx in the figure below) that does not contain the data, but only a commitment that can be used at a later time to prove that the data was indeed made available.

Thus, the block data consists of data partitioned into namespaces and executable transactions. Note that only these transactions are executed by the Celestia state machine once the block is committed.

Lifecycle of a celestia-app Transaction

Next, the block producer adds to the block header a commitment of the block data. As described in the "Celestia's data availability layer" page, the commitment is the Merkle root of the 4k intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:

  • It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.
  • It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size k×k is referred to as the original data.
  • It extends the original data to a 2k×2k square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.
  • It computes a commitment for every row and column of the extended matrix using the NMTs described above.

Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.

Checking data availability

DA network

To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, i.e., the so-called DA network, that serves DAS requests.

Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the 4k intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).

Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., PayForBlobs transactions.

While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).

If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.

Alternatively, light nodes may accept a block header although the data is not available, i.e., a false positive. This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the original paper).

By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.

- +

The lifecycle of a celestia-app transaction

Users request the celestia-app to make data available by sending PayForBlobs transactions. Every such transaction consists of the identity of the sender, the data to be made available, also referred to as the message, the data size, the namespace, and a signature. Every block producer batches multiple PayForBlobs transactions into a block.

Before proposing the block though, the producer passes it to the state machine via ABCI++, where each PayForBlobs transaction is split into a namespaced message (denoted by Msg in the figure below), i.e., the data together with the namespace ID, and an executable transaction (denoted by e-Tx in the figure below) that does not contain the data, but only a commitment that can be used at a later time to prove that the data was indeed made available.

Thus, the block data consists of data partitioned into namespaces and executable transactions. Note that only these transactions are executed by the Celestia state machine once the block is committed.

Lifecycle of a celestia-app Transaction

Next, the block producer adds to the block header a commitment of the block data. As described in the "Celestia's data availability layer" page, the commitment is the Merkle root of the 4k intermediate Merkle roots (i.e., one for each row and column of the extended matrix). To compute this commitment, the block producer performs the following operations:

  • It splits the executable transactions and the namespaced data into shares. Every share consists of some bytes prefixed by a namespace. To this end, the executable transactions are associated with a reserved namespace.
  • It arranges these shares into a square matrix (row-wise). Note that the shares are padded to the next power of two. The outcome square of size k×k is referred to as the original data.
  • It extends the original data to a 2k×2k square matrix using the 2-dimensional Reed-Solomon encoding scheme described above. The extended shares (i.e., containing erasure data) are associated with another reserved namespace.
  • It computes a commitment for every row and column of the extended matrix using the NMTs described above.

Thus, the commitment of the block data is the root of a Merkle tree with the leaves the roots of a forest of Namespaced Merkle subtrees, one for every row and column of the extended matrix.

Checking data availability

DA network

To enhance connectivity, the celestia-node augments the celestia-app with a separate libp2p network, i.e., the so-called DA network, that serves DAS requests.

Light nodes connect to a celestia-node in the DA network, listen to extended block headers (i.e., the block headers together with the relevant DA metadata, such as the 4k intermediate Merkle roots), and perform DAS on the received headers (i.e., ask for random data shares).

Note that although it is recommended, performing DAS is optional -- light nodes could just trust that the data corresponding to the commitments in the block headers was indeed made available by the Celestia DA layer. In addition, light nodes can also submit transactions to the celestia-app, i.e., PayForBlobs transactions.

While performing DAS for a block header, every light node queries Celestia Nodes for a number of random data shares from the extended matrix and the corresponding Merkle proofs. If all the queries are successful, then the light node accepts the block header as valid (from a DA perspective).

If at least one of the queries fails (i.e., either the data share is not received or the Merkle proof is invalid), then the light node rejects the block header and tries again later. The retrial is necessary to deal with false negatives, i.e., block headers being rejected although the block data is available. This may happen due to network congestion for example.

Alternatively, light nodes may accept a block header although the data is not available, i.e., a false positive. This is possible since the soundness property (i.e., if an honest light node accepts a block as available, then at least one honest full node will eventually have the entire block data) is probabilistically guaranteed (for more details, take a look at the original paper).

By fine tuning Celestia's parameters (e.g., the number of data shares sampled by each light node) the likelihood of false positives can be sufficiently reduced such that block producers have no incentive to withhold the block data.

+ \ No newline at end of file diff --git a/pr-1699/learn/how-to-stake-tia.html b/pr-1699/learn/how-to-stake-tia.html index 1af1839ec6..86aea68742 100644 --- a/pr-1699/learn/how-to-stake-tia.html +++ b/pr-1699/learn/how-to-stake-tia.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

How to stake TIA

Celestia is a proof-of-stake blockchain based on the Cosmos SDK.

Staking TIA as a delegator allows you to secure the Celestia network. This means that you can stake the native token TIA and vote on governance proposals.

In this tutorial, you will learn how to stake TIA tokens via Keplr, Leap, and Gem wallets.

Select your preferred wallet

Keplr
Leap
Gem Wallet

Stake TIA with Keplr wallet

1️⃣ Open your Keplr browser extension

Navigate to Staked and select Stake with Keplr Dashboard.

This will open the Keplr dashboard in a new browser page.

Keplr1

2️⃣ Select Celestia network and search for a validator

In the Keplr dashboard, select the Celestia network and pick a validator of your choice.

Keplr1

3️⃣ Stake your TIA tokens

On the following screen enter amount of TIA tokens and select Stake.

A Keplr popup will appear, requesting your approval for the transaction. Select Approve.

Keplr1

4️⃣ Confirm and manage your TIA

After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

Keplr1

Stake TIA with Leap wallet

1️⃣ Open your Leap browser extension

In top right select Celestia network and navigate to Stake.

Similarly to previous step, select the +Stake button.

Keplr1

2️⃣ Select a validator and stake TIA

On the following screen choose a validator of your choice, enter the desired amount, and click Review.

Following that, review the transaction details and select Stake, then wait for the transaction to finalize.

Keplr1

3️⃣ Confirm and manage your TIA

After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

Keplr1

Stake TIA with Gem wallet

1️⃣ Open your Gem Wallet app

Navigate to Celestia and select Stake.

Gem1

2️⃣ Choose the amount of Celestia and search for a validator.

Select the amount of Celestia tokens and choose a validator from the list.

Gem2

3️⃣ Stake your TIA tokens

Review the network terms and commission, then press Confirm to proceed.

Gem3

4️⃣ Manage your TIA

After your transaction is confirmed, you will have access to a control panel where you can claim rewards, unstake, redelegate, or stake additional tokens.

Gem4

- +

How to stake TIA

Celestia is a proof-of-stake blockchain based on the Cosmos SDK.

Staking TIA as a delegator allows you to secure the Celestia network. This means that you can stake the native token TIA and vote on governance proposals.

In this tutorial, you will learn how to stake TIA tokens via Keplr, Leap, and Gem wallets.

Select your preferred wallet

Keplr
Leap
Gem Wallet

Stake TIA with Keplr wallet

1️⃣ Open your Keplr browser extension

Navigate to Staked and select Stake with Keplr Dashboard.

This will open the Keplr dashboard in a new browser page.

Keplr1

2️⃣ Select Celestia network and search for a validator

In the Keplr dashboard, select the Celestia network and pick a validator of your choice.

Keplr1

3️⃣ Stake your TIA tokens

On the following screen enter amount of TIA tokens and select Stake.

A Keplr popup will appear, requesting your approval for the transaction. Select Approve.

Keplr1

4️⃣ Confirm and manage your TIA

After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

Keplr1

Stake TIA with Leap wallet

1️⃣ Open your Leap browser extension

In top right select Celestia network and navigate to Stake.

Similarly to previous step, select the +Stake button.

Keplr1

2️⃣ Select a validator and stake TIA

On the following screen choose a validator of your choice, enter the desired amount, and click Review.

Following that, review the transaction details and select Stake, then wait for the transaction to finalize.

Keplr1

3️⃣ Confirm and manage your TIA

After the transaction is confirmed, you will see the following overview dashboard where you can claim rewards, unstake, redelegate, or stake additional tokens.

Keplr1

Stake TIA with Gem wallet

1️⃣ Open your Gem Wallet app

Navigate to Celestia and select Stake.

Gem1

2️⃣ Choose the amount of Celestia and search for a validator.

Select the amount of Celestia tokens and choose a validator from the list.

Gem2

3️⃣ Stake your TIA tokens

Review the network terms and commission, then press Confirm to proceed.

Gem3

4️⃣ Manage your TIA

After your transaction is confirmed, you will have access to a control panel where you can claim rewards, unstake, redelegate, or stake additional tokens.

Gem4

+ \ No newline at end of file diff --git a/pr-1699/learn/paying-for-blobspace.html b/pr-1699/learn/paying-for-blobspace.html index 7e48ea2bea..88f2d3e750 100644 --- a/pr-1699/learn/paying-for-blobspace.html +++ b/pr-1699/learn/paying-for-blobspace.html @@ -12,7 +12,7 @@ - + @@ -39,8 +39,8 @@

Paying for blobspace

PayForBlobs transactions

To publish data on Celestia, developers can submit PayForBlobs transactions. A PayForBlobs transaction consists of the identity of the sender, the data to be made available, the data size, the namespace, and a signature.

Each PayForBlobs transaction is split into two parts: the blob or blobs which include the data to be made available along with the namespace, and the executable payment transaction which includes a commitment to the data.

Both the blobs and executable payment transactions are put into the block within the appropriate namespace. The block data is extended using erasure coding and then Merkelized into a data root commitment included in the block header.

Lifecycle of a celestia-app Transaction

See the detailed life cycle of a Celestia transaction.

Learn how to submit data to Celestia’s data availability layer.

Fee market overview

Celestia uses a standard gas-price prioritised mempool. This means that transactions with higher fees will be prioritised by validators. Fees are comprised of a flat fee per transaction and then a variable fee based on the size of each blob in the transaction.

Understand how fees are calculated on Celestia in the overview on submitting PFB transactions.

- +

Paying for blobspace

PayForBlobs transactions

To publish data on Celestia, developers can submit PayForBlobs transactions. A PayForBlobs transaction consists of the identity of the sender, the data to be made available, the data size, the namespace, and a signature.

Each PayForBlobs transaction is split into two parts: the blob or blobs which include the data to be made available along with the namespace, and the executable payment transaction which includes a commitment to the data.

Both the blobs and executable payment transactions are put into the block within the appropriate namespace. The block data is extended using erasure coding and then Merkelized into a data root commitment included in the block header.

Lifecycle of a celestia-app Transaction

See the detailed life cycle of a Celestia transaction.

Learn how to submit data to Celestia’s data availability layer.

Fee market overview

Celestia uses a standard gas-price prioritised mempool. This means that transactions with higher fees will be prioritised by validators. Fees are comprised of a flat fee per transaction and then a variable fee based on the size of each blob in the transaction.

Understand how fees are calculated on Celestia in the overview on submitting PFB transactions.

+ \ No newline at end of file diff --git a/pr-1699/learn/retrievability.html b/pr-1699/learn/retrievability.html index 586afb0ef3..c7aa5d2839 100644 --- a/pr-1699/learn/retrievability.html +++ b/pr-1699/learn/retrievability.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Data retrievability and pruning

The purpose of data availability layers such as Celestia is to ensure that block data is provably published, so that applications and rollups can know what the state of their chain is, and store that data. Once the data is published, data availability layers do not inherently guarantee that historical data will be permanently stored and remain retrievable.

In this document, we discuss the state of data retrievability and pruning in Celestia, as well as some tips for rollup developers in order to ensure that syncing new rollup nodes is possible.

Data retrievability and pruning in celestia-node

As of version v0.13.0, celestia-node has implemented a light node sampling window of 30 days, as specified in CIP-4. This means that once pruning is implemented, light nodes will now only sample blocks within a 30-day window instead of sampling all blocks from genesis. This change introduces the concept of pruning to celestia-node, where data outside of the 30-day window may not be stored by light nodes, marking a significant update in how data retrievability and storage are managed within the network (v0.13.0 release notes).

Data blobs older than the recency window will be pruned by default on light nodes, after pruning is fully implemented, but will continue to be stored by archival nodes that do not prune data. Light nodes will be able to query historic blob data in namespaces from archival nodes, as long as archival nodes exist on the public network.

Once pruning is fully implemented, light nodes will only perform data availability sampling for blocks within the data recency window of 30 days.

Suggested practices for rollups

Rollups may need to access historic data in order to allow new rollup nodes to reconstruct the latest state by replaying historic blocks. Once data has been published on Celestia and guaranteed to have been made available, rollups and applications are responsible for storing their historical data.

While it is possible to continue to do this by using the GetAll API method in celestia-node on historic blocks as long as archival nodes exist on the public Celestia network, rollup developers should not rely on this as the only method to access historical data, as archival nodes serving requests for historical data for free is not guaranteed. Below are some other suggested methods to access historical data.

  • Use professional archival node or data providers. It is expected that professional infrastructure providers will provide paid access to archival nodes, where historical data can be retrieved, for example using the GetAll API method. This provides better guarantees than solely relying on free archival nodes on the public Celestia network.
  • Share snapshots of rollup nodes. Rollups could share snapshots of their data directories which can be downloaded manually by users bootstrapping new nodes. These snapshots could contain the latest state of the rollup, and/or all the historical blocks.
  • Add peer-to-peer support for historical block sync. A less manual version of sharing snapshots, where rollup nodes could implement built-in support for block sync, where rollup nodes download historical block data from each other over a peer-to-peer network.
    • Namespace pinning. In the future, celestia-node is expected to allow nodes to choose to "pin" data from selected namespaces that they wish to store and make available for other nodes. This will allow rollup nodes to be responsible for storing their data, without needing to implement their own peer-to-peer historical block sync mechanism.
- +

Data retrievability and pruning

The purpose of data availability layers such as Celestia is to ensure that block data is provably published, so that applications and rollups can know what the state of their chain is, and store that data. Once the data is published, data availability layers do not inherently guarantee that historical data will be permanently stored and remain retrievable.

In this document, we discuss the state of data retrievability and pruning in Celestia, as well as some tips for rollup developers in order to ensure that syncing new rollup nodes is possible.

Data retrievability and pruning in celestia-node

As of version v0.13.0, celestia-node has implemented a light node sampling window of 30 days, as specified in CIP-4. This means that once pruning is implemented, light nodes will now only sample blocks within a 30-day window instead of sampling all blocks from genesis. This change introduces the concept of pruning to celestia-node, where data outside of the 30-day window may not be stored by light nodes, marking a significant update in how data retrievability and storage are managed within the network (v0.13.0 release notes).

Data blobs older than the recency window will be pruned by default on light nodes, after pruning is fully implemented, but will continue to be stored by archival nodes that do not prune data. Light nodes will be able to query historic blob data in namespaces from archival nodes, as long as archival nodes exist on the public network.

Once pruning is fully implemented, light nodes will only perform data availability sampling for blocks within the data recency window of 30 days.

Suggested practices for rollups

Rollups may need to access historic data in order to allow new rollup nodes to reconstruct the latest state by replaying historic blocks. Once data has been published on Celestia and guaranteed to have been made available, rollups and applications are responsible for storing their historical data.

While it is possible to continue to do this by using the GetAll API method in celestia-node on historic blocks as long as archival nodes exist on the public Celestia network, rollup developers should not rely on this as the only method to access historical data, as archival nodes serving requests for historical data for free is not guaranteed. Below are some other suggested methods to access historical data.

  • Use professional archival node or data providers. It is expected that professional infrastructure providers will provide paid access to archival nodes, where historical data can be retrieved, for example using the GetAll API method. This provides better guarantees than solely relying on free archival nodes on the public Celestia network.
  • Share snapshots of rollup nodes. Rollups could share snapshots of their data directories which can be downloaded manually by users bootstrapping new nodes. These snapshots could contain the latest state of the rollup, and/or all the historical blocks.
  • Add peer-to-peer support for historical block sync. A less manual version of sharing snapshots, where rollup nodes could implement built-in support for block sync, where rollup nodes download historical block data from each other over a peer-to-peer network.
    • Namespace pinning. In the future, celestia-node is expected to allow nodes to choose to "pin" data from selected namespaces that they wish to store and make available for other nodes. This will allow rollup nodes to be responsible for storing their data, without needing to implement their own peer-to-peer historical block sync mechanism.
+ \ No newline at end of file diff --git a/pr-1699/learn/staking-governance-supply.html b/pr-1699/learn/staking-governance-supply.html index 8f24cab841..f4b426999f 100644 --- a/pr-1699/learn/staking-governance-supply.html +++ b/pr-1699/learn/staking-governance-supply.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Staking, governance, & supply

Proof-of-stake on Celestia

Celestia is a proof-of-stake blockchain based on CometBFT and the Cosmos SDK. Celestia supports in-protocol delegation and will start with an initial validator set of 100.

Staking TIA as a validator or delegator enables you to earn staking rewards from the network. Validators charge a fee to delegators which gives them a percentage of staking rewards.

Learn how proof of stake works on Cosmos SDK chains like Celestia.

Consensus mechanismProof-of-stake
Blockchain frameworkCosmos SDK
Validator set size100
Delegation supportYes

Learn how to stake on your own at the community dashboards.

Inflation

TIA inflation starts at 8% annually and decreases by 10% every year until it reaches the long term issuance rate of 1.5%. Exact annual inflation rates can be found in the diagram below.

inflation diagram

The annual provisions for inflation are calculated based on the total supply of TIA at the beginning of each year. To calculate how many TIA to issue per block, Celestia uses the block timestamp rather than the block height since the time between blocks can vary and cause actual issuance to be higher than the target.

For an in-depth understanding, refer to ADR019.

Decentralised governance

Network parameters

TIA holders (not just stakers) can propose and vote on governance proposals to change a subset of network parameters. To learn more, see a complete list of both the changeable and non-changeable parameters and their values. Additionally, learn how to submit and vote on governance proposals.

Community pool

Starting at genesis, Celestia’s community pool receives 2% of all Celestia block rewards. TIA stakers may vote to fund ecosystem initiatives as in many other Cosmos SDK chains.

Learn how to submit a governance proposal to spend community pool funds.

TIA allocation at genesis

Celestia will have a total supply of 1,000,000,000 TIA at genesis, split across five categories described in the chart and table below.

allocation diagram

CategoryDescription%
Public AllocationGenesis Drop and Incentivized Testnet: 7.41%
Future initiatives: 12.59%
20.00%
R&D & EcosystemTokens allocated to the Celestia Foundation and core devs for research, development, and ecosystem initiatives including:
- Protocol maintenance and development
- Programs for rollup developers, infrastructure, and node operators
26.79%
Early Backers: Series A&BEarly supporters of Celestia19.67%
Early Backers: SeedEarly supporters of Celestia15.90%
Initial Core ContributorsMembers of Celestia Labs, the first core contributor to Celestia17.64%

Unlocks

Celestia’s 1 billion TIA supply at genesis will be subject to several different unlock schedules. All tokens, locked or unlocked, may be staked, but staking rewards are unlocked upon receipt and will add to the circulating supply.

Circulating supply is defined as the amount of TIA tokens in general circulation without onchain transfer restrictions.

Available supply is defined as the amount of TIA tokens that are either part of the circulating supply or are unlocked but subject to some form of governance to determine when the tokens are allocated. This includes the unlocked portion of the R&D & Ecosystem tokens and the tokens set aside for future initiatives.

The definitions for circulating and available supply were adapted from Optimism’s definitions.

supply diagram

Unlock schedule by category is described in the table below.

CategoryUnlock Schedule
Public AllocationFully unlocked at launch.
R&D & Ecosystem25.00% unlocked at launch.
Remaining 75.00% unlocks continuously from year 1 to year 4.
Initial Core Contributors33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 3.
Early Backers: Seed33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 2.
Early Backers: Series A&B33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 2.
- +

Staking, governance, & supply

Proof-of-stake on Celestia

Celestia is a proof-of-stake blockchain based on CometBFT and the Cosmos SDK. Celestia supports in-protocol delegation and will start with an initial validator set of 100.

Staking TIA as a validator or delegator enables you to earn staking rewards from the network. Validators charge a fee to delegators which gives them a percentage of staking rewards.

Learn how proof of stake works on Cosmos SDK chains like Celestia.

Consensus mechanismProof-of-stake
Blockchain frameworkCosmos SDK
Validator set size100
Delegation supportYes

Learn how to stake on your own at the community dashboards.

Inflation

TIA inflation starts at 8% annually and decreases by 10% every year until it reaches the long term issuance rate of 1.5%. Exact annual inflation rates can be found in the diagram below.

inflation diagram

The annual provisions for inflation are calculated based on the total supply of TIA at the beginning of each year. To calculate how many TIA to issue per block, Celestia uses the block timestamp rather than the block height since the time between blocks can vary and cause actual issuance to be higher than the target.

For an in-depth understanding, refer to ADR019.

Decentralised governance

Network parameters

TIA holders (not just stakers) can propose and vote on governance proposals to change a subset of network parameters. To learn more, see a complete list of both the changeable and non-changeable parameters and their values. Additionally, learn how to submit and vote on governance proposals.

Community pool

Starting at genesis, Celestia’s community pool receives 2% of all Celestia block rewards. TIA stakers may vote to fund ecosystem initiatives as in many other Cosmos SDK chains.

Learn how to submit a governance proposal to spend community pool funds.

TIA allocation at genesis

Celestia will have a total supply of 1,000,000,000 TIA at genesis, split across five categories described in the chart and table below.

allocation diagram

CategoryDescription%
Public AllocationGenesis Drop and Incentivized Testnet: 7.41%
Future initiatives: 12.59%
20.00%
R&D & EcosystemTokens allocated to the Celestia Foundation and core devs for research, development, and ecosystem initiatives including:
- Protocol maintenance and development
- Programs for rollup developers, infrastructure, and node operators
26.79%
Early Backers: Series A&BEarly supporters of Celestia19.67%
Early Backers: SeedEarly supporters of Celestia15.90%
Initial Core ContributorsMembers of Celestia Labs, the first core contributor to Celestia17.64%

Unlocks

Celestia’s 1 billion TIA supply at genesis will be subject to several different unlock schedules. All tokens, locked or unlocked, may be staked, but staking rewards are unlocked upon receipt and will add to the circulating supply.

Circulating supply is defined as the amount of TIA tokens in general circulation without onchain transfer restrictions.

Available supply is defined as the amount of TIA tokens that are either part of the circulating supply or are unlocked but subject to some form of governance to determine when the tokens are allocated. This includes the unlocked portion of the R&D & Ecosystem tokens and the tokens set aside for future initiatives.

The definitions for circulating and available supply were adapted from Optimism’s definitions.

supply diagram

Unlock schedule by category is described in the table below.

CategoryUnlock Schedule
Public AllocationFully unlocked at launch.
R&D & Ecosystem25.00% unlocked at launch.
Remaining 75.00% unlocks continuously from year 1 to year 4.
Initial Core Contributors33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 3.
Early Backers: Seed33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 2.
Early Backers: Series A&B33.33% unlocked at year 1.
Remaining 66.67% unlocks continuously from year 1 to year 2.
+ \ No newline at end of file diff --git a/pr-1699/learn/staking.html b/pr-1699/learn/staking.html index 8791290d9c..940fae4360 100644 --- a/pr-1699/learn/staking.html +++ b/pr-1699/learn/staking.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Staking on Celestia

Engage with the Celestia network at a deeper level through staking. An essential mechanism to a proof-of-stake network, users can secure the network by delegating to a validator and receive a share of its staking rewards.

Mainnet Beta

Currently, the following staking interfaces exist for the Mainnet Beta.

Just connect your wallet to get started!

Mocha testnet

Currently, the following staking interfaces exist for the Mocha testnet.

Just connect your wallet to get started!

- +

Staking on Celestia

Engage with the Celestia network at a deeper level through staking. An essential mechanism to a proof-of-stake network, users can secure the network by delegating to a validator and receive a share of its staking rewards.

Mainnet Beta

Currently, the following staking interfaces exist for the Mainnet Beta.

Just connect your wallet to get started!

Mocha testnet

Currently, the following staking interfaces exist for the Mocha testnet.

Just connect your wallet to get started!

+ \ No newline at end of file diff --git a/pr-1699/learn/tia.html b/pr-1699/learn/tia.html index 6d39dd753b..9992c35c43 100644 --- a/pr-1699/learn/tia.html +++ b/pr-1699/learn/tia.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Overview of TIA

TIA at a glance

PropertyDetails
AbbreviationTIA
Total supply at genesis1,000,000,000 TIA
Inflation schedule8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually
Decimals6
Conversion1 uTIA=TIA×106

Role of TIA

Paying for blobspace

Celestia’s native asset, TIA, is an essential part of how developers build on the first modular blockchain network. To use Celestia for data availability, rollup developers submit PayForBlobs transactions on the network for a fee, denominated in TIA.

Bootstrapping new rollups

A core part of the Celestia vision is that deploying a blockchain should be as easy as deploying a smart contract. In the modular era, developers no longer need to issue a token to launch their own blockchain.

Similarly to ETH on Ethereum-based rollups, developers may opt to bootstrap their chain quickly by using TIA as a gas token and currency, in addition to paying for data availability. In this mode, developers can focus on creating their application or execution layer, instead of issuing a token right away.

Proof-of-stake

As a permissionless network built with Cosmos SDK, Celestia uses proof-of-stake to secure its own consensus. Like in other Cosmos networks, any user can help secure the network by delegating their TIA to a Celestia validator for a portion of their validator’s staking rewards.

Learn how proof-of-stake works in Cosmos.

Decentralised governance

TIA staking also allows the community to play a critical role in decentralised governance over key parts of Celestia, such as voting on network parameters through governance proposals, and governing the community pool, which receives 2% of block rewards.

Learn more about Celestia’s decentralised governance model.

Denominations

TIA: display token

TIA is the DisplayDenom that you will typically see in wallets and user interfaces.

utia: staking denomination

utia is the BondDenom and stands for "micro TIA", with 1 TIA = 1,000,000 utia. This is the native staking denomination.

In staking operations or transactions, if no denomination is specified, utia is assumed.

microtia: staking denomination alias

microtia is the BondDenomAlias, an alias for utia.

- +

Overview of TIA

TIA at a glance

PropertyDetails
AbbreviationTIA
Total supply at genesis1,000,000,000 TIA
Inflation schedule8% in the first year, decreasing 10% per year until reaching an inflation floor of 1.5% annually
Decimals6
Conversion1 uTIA=TIA×106

Role of TIA

Paying for blobspace

Celestia’s native asset, TIA, is an essential part of how developers build on the first modular blockchain network. To use Celestia for data availability, rollup developers submit PayForBlobs transactions on the network for a fee, denominated in TIA.

Bootstrapping new rollups

A core part of the Celestia vision is that deploying a blockchain should be as easy as deploying a smart contract. In the modular era, developers no longer need to issue a token to launch their own blockchain.

Similarly to ETH on Ethereum-based rollups, developers may opt to bootstrap their chain quickly by using TIA as a gas token and currency, in addition to paying for data availability. In this mode, developers can focus on creating their application or execution layer, instead of issuing a token right away.

Proof-of-stake

As a permissionless network built with Cosmos SDK, Celestia uses proof-of-stake to secure its own consensus. Like in other Cosmos networks, any user can help secure the network by delegating their TIA to a Celestia validator for a portion of their validator’s staking rewards.

Learn how proof-of-stake works in Cosmos.

Decentralised governance

TIA staking also allows the community to play a critical role in decentralised governance over key parts of Celestia, such as voting on network parameters through governance proposals, and governing the community pool, which receives 2% of block rewards.

Learn more about Celestia’s decentralised governance model.

Denominations

TIA: display token

TIA is the DisplayDenom that you will typically see in wallets and user interfaces.

utia: staking denomination

utia is the BondDenom and stands for "micro TIA", with 1 TIA = 1,000,000 utia. This is the native staking denomination.

In staking operations or transactions, if no denomination is specified, utia is assumed.

microtia: staking denomination alias

microtia is the BondDenomAlias, an alias for utia.

+ \ No newline at end of file diff --git a/pr-1699/nodes/arabica-devnet.html b/pr-1699/nodes/arabica-devnet.html index 5c01cfe9c5..ddc5d37400 100644 --- a/pr-1699/nodes/arabica-devnet.html +++ b/pr-1699/nodes/arabica-devnet.html @@ -14,7 +14,7 @@ - + @@ -43,8 +43,8 @@

Arabica devnet

arabica-devnet

Arabica devnet is a testnet from Celestia Labs that is focused exclusively on providing developers with enhanced performance and the latest upgrades for testing their rollups and applications.

Arabica does not focus on validator or consensus-level testing, rather, that is what Mocha testnet is used for. If you are a validator, we recommend testing your validator operations on the Mocha testnet.

Network stability and upgrades

Arabica has the latest updates from all Celestia's products deployed on it, it can be subject to many changes. Therefore, as a fair warning, Arabica can break unexpectedly, but given it will be continuously updated, it is a useful way to keep testing the latest changes in the software.

Developers can still deploy on Mocha testnet their sovereign rollups if they chose to do so, it just will always lag behind Arabica devnet until Mocha undergoes Hardfork Upgrades in coordination with Validators.

Network details

DetailValue
Chain IDarabica-11
Genesis hash27122593765E07329BC348E8D16E92DCB4C75B34CCCB35C640FD7A4484D4C711
Genesis file https://github.com/celestiaorg/networks/blob/master/arabica-11/genesis.json
Peers file https://github.com/celestiaorg/networks/blob/master/arabica-11/peers.txt
Validators 4

Software version numbers

SoftwareVersion
celestia-nodev0.16.0
celestia-appv2.1.2

Integrations

This guide contains the relevant sections for how to connect to Arabica devnet, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

Production RPC endpoints

These RPC providers are meant to be used in production environments.

ProviderURL
NewMetrichttps://app.newmetric.xyz/start
NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
Grovehttps://www.grove.city/

Community RPC endpoints

WARNING

Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

RPC endpoints and types of nodes you can run in order to participate in Arabica devnet:

Node typeEndpoint typeEndpoint
Consensus nodes (full)Consensus RPChttps://rpc.celestia-arabica-11.com
APIhttps://api.celestia-arabica-11.com
gRPCgrpc.celestia-arabica-11.com:443
Direct endpoints with open portsOpen ports: 26656 (p2p), 26657 (RPC), 1317 (API), 9090 (GRPC)
validator-1.celestia-arabica-11.com
validator-2.celestia-arabica-11.com
validator-3.celestia-arabica-11.com
validator-4.celestia-arabica-11.com
Data availability nodesDA Bridge Node Endpoints/dns4/da-bridge-1.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWGqwzdEqM54Dce6LXzfFr97Bnhvm6rN7KM7MFwdomfm4S
(light, bridge, full)/dns4/da-bridge-2.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWCMGM5eZWVfCN9ZLAViGfLUWAfXP5pCm78NFKb9jpBtua
/dns4/da-bridge-3.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWEWuqrjULANpukDFGVoHW3RoeUU53Ec9t9v5cwW3MkVdQ
/dns4/da-bridge-4.celestia-arabica-11.com/tcp/2121/p2p/12D3KooWLT1ysSrD7XWSBjh7tU1HQanF5M64dHV6AuM6cYEJxMPk
--core.ip string endpointsRefer to "Direct endpoints with open ports" above

You can find the status of these endpoints.

Using consensus endpoints with DA nodes

Data availability (DA) RPC endpoints for bridge node sync

These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

Data availability (DA) gRPC endpoints for state access

These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

EXAMPLE

bash
celestia <da_type> start –core.ip <url> -–core.grpc.port <port>
celestia <da_type> start –core.ip <url> -–core.grpc.port <port>

RPCs for DA nodes to initialise or start your celestia-node to Arabica devnet with can be found in the table in the "Direct endpoints with open ports" section above.

As an example, this command will work to start a light node with state access, using default ports:

bash
celestia light start --p2p.network arabica \
   --core.ip validator-1.celestia-arabica-11.com
celestia light start --p2p.network arabica \
-  --core.ip validator-1.celestia-arabica-11.com

Bridge node runners

Not all of the RPC endpoints do not guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

Arabica devnet faucet

WARNING

USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

Discord

You can request from Arabica devnet Faucet on the #arabica-faucet channel on Celestia's Discord server with the following command:

text
$request <CELESTIA-ADDRESS>
$request <CELESTIA-ADDRESS>

Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

NOTE

Faucet has a limit of 10 tokens per week per address/Discord ID.

Web

The web faucet is available at https://faucet.celestia-arabica-11.com/.

Explorers

There are multiple explorers you can use for Arabica:

Network upgrades

Join our Telegram announcement channel for network upgrades.

See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

- + --core.ip validator-1.celestia-arabica-11.com

Bridge node runners

Not all of the RPC endpoints do not guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

Arabica devnet faucet

WARNING

USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

Discord

You can request from Arabica devnet Faucet on the #arabica-faucet channel on Celestia's Discord server with the following command:

text
$request <CELESTIA-ADDRESS>
$request <CELESTIA-ADDRESS>

Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

NOTE

Faucet has a limit of 10 tokens per week per address/Discord ID.

Web

The web faucet is available at https://faucet.celestia-arabica-11.com/.

Explorers

There are multiple explorers you can use for Arabica:

Network upgrades

Join our Telegram announcement channel for network upgrades.

See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

+ \ No newline at end of file diff --git a/pr-1699/nodes/bridge-node.html b/pr-1699/nodes/bridge-node.html index 710c9fd066..a07a4e4f5d 100644 --- a/pr-1699/nodes/bridge-node.html +++ b/pr-1699/nodes/bridge-node.html @@ -11,7 +11,7 @@ - + @@ -38,14 +38,14 @@

Setting up a Celestia bridge node

This tutorial will go over the steps to setting up your Celestia bridge node.

Bridge nodes connect the data availability layer and the consensus layer.

Overview of bridge nodes

A Celestia bridge node has the following properties:

  1. Import and process “raw” headers & blocks from a trusted core process (meaning a trusted RPC connection to a celestia-core node) in the Consensus network. Bridge nodes can run this core process internally (embedded) or simply connect to a remote endpoint. Bridge nodes also have the option of being an active validator in the consensus network.
  2. Validate and erasure code the “raw” blocks
  3. Supply block shares with data availability headers to light nodes in the DA network.

bridge-node-diagram

From an implementation perspective, Bridge nodes run two separate processes:

  1. celestia-app with celestia-core (see repo)

    • celestia-app is the state machine where the application and the proof-of-stake logic is run. celestia-app is built on Cosmos SDK and also encompasses celestia-core.
    • celestia-core is the state interaction, consensus and block production layer. celestia-core is built on Tendermint Core, modified to store data roots of erasure coded blocks among other changes (see ADRs).
  2. celestia-node (see repo)

    • celestia-node augments the above with a separate libp2p network that serves data availability sampling requests. The team sometimes refers to this as the “halo” network.

Hardware requirements

The following hardware minimum requirements are recommended for running the bridge node:

  • Memory: 16 GB RAM (minimum)
  • CPU: 6 cores
  • Disk: 10 TB SSD Storage
  • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

Setting up your bridge node

The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

Setup the dependencies

Follow the tutorial for installing the dependencies.

Deploy the Celestia bridge node

Install Celestia Node

Install the celestia-node binary, which will be used to run the bridge node.

Follow the tutorial for installing celestia-node.

Initialize the bridge node

Run the following:

sh
celestia bridge init --core.ip <URI>
celestia bridge init --core.ip <URI>

The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

Here is an example of initializing the bridge node:

sh
celestia bridge init --core.ip <URI>
celestia bridge init --core.ip <URI>
sh
celestia bridge init --core.ip <URI> --p2p.network mocha
celestia bridge init --core.ip <URI> --p2p.network mocha
sh
celestia bridge init --core.ip <URI> --p2p.network arabica
celestia bridge init --core.ip <URI> --p2p.network arabica

Run the bridge node

Start the bridge node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

sh
celestia bridge start --core.ip <URI>
celestia bridge start --core.ip <URI>

Here is an example of starting the bridge node on Mocha:

sh
celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha
celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha

And on Arabica:

sh
celestia bridge start --core.ip validator-1.celestia-arabica-11.com \
+

Setting up a Celestia bridge node

This tutorial will go over the steps to setting up your Celestia bridge node.

Bridge nodes connect the data availability layer and the consensus layer.

Overview of bridge nodes

A Celestia bridge node has the following properties:

  1. Import and process “raw” headers & blocks from a trusted core process (meaning a trusted RPC connection to a celestia-core node) in the Consensus network. Bridge nodes can run this core process internally (embedded) or simply connect to a remote endpoint. Bridge nodes also have the option of being an active validator in the consensus network.
  2. Validate and erasure code the “raw” blocks
  3. Supply block shares with data availability headers to light nodes in the DA network.

bridge-node-diagram

From an implementation perspective, Bridge nodes run two separate processes:

  1. celestia-app with celestia-core (see repo)

    • celestia-app is the state machine where the application and the proof-of-stake logic is run. celestia-app is built on Cosmos SDK and also encompasses celestia-core.
    • celestia-core is the state interaction, consensus and block production layer. celestia-core is built on Tendermint Core, modified to store data roots of erasure coded blocks among other changes (see ADRs).
  2. celestia-node (see repo)

    • celestia-node augments the above with a separate libp2p network that serves data availability sampling requests. The team sometimes refers to this as the “halo” network.

Hardware requirements

The following hardware minimum requirements are recommended for running the bridge node:

  • Memory: 16 GB RAM (minimum)
  • CPU: 6 cores
  • Disk: 10 TB SSD Storage
  • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

Setting up your bridge node

The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

Setup the dependencies

Follow the tutorial for installing the dependencies.

Deploy the Celestia bridge node

Install Celestia Node

Install the celestia-node binary, which will be used to run the bridge node.

Follow the tutorial for installing celestia-node.

Initialize the bridge node

Run the following:

sh
celestia bridge init --core.ip <URI>
celestia bridge init --core.ip <URI>

The --core.ip gRPC port defaults to 9090, so if you do not specify it in the command line, it will default to that port. You can add the port after the IP address or use the --core.grpc.port flag to specify another port if you prefer.

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

Here is an example of initializing the bridge node:

sh
celestia bridge init --core.ip <URI>
celestia bridge init --core.ip <URI>
sh
celestia bridge init --core.ip <URI> --p2p.network mocha
celestia bridge init --core.ip <URI> --p2p.network mocha
sh
celestia bridge init --core.ip <URI> --p2p.network arabica
celestia bridge init --core.ip <URI> --p2p.network arabica

Run the bridge node

Start the bridge node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

sh
celestia bridge start --core.ip <URI>
celestia bridge start --core.ip <URI>

Here is an example of starting the bridge node on Mocha:

sh
celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha
celestia bridge start --core.ip rpc-mocha.pops.one:26657 --p2p.network mocha

And on Arabica:

sh
celestia bridge start --core.ip validator-1.celestia-arabica-11.com \
   --p2p.network arabica
celestia bridge start --core.ip validator-1.celestia-arabica-11.com \
-  --p2p.network arabica

You can create your key for your node by following the cel-key instructions.

Once you start the bridge node, a wallet key will be generated for you. You will need to fund that address with Testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

sh
./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>
./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>

TIP

You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

You can get testnet tokens from:

NOTE

If you are running a bridge node for your validator it is highly recommended to request Mocha testnet tokens as this is the testnet used to test out validator operations.

Optional: run the bridge node with a custom key

In order to run a bridge node using a custom key:

  1. The custom key must exist inside the celestia bridge node directory at the correct path (default: ~/.celestia-bridge/keys/keyring-test)
  2. The name of the custom key must be passed upon start, like so:
sh
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
sh
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \
+  --p2p.network arabica

You can create your key for your node by following the cel-key instructions.

Once you start the bridge node, a wallet key will be generated for you. You will need to fund that address with Testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

sh
./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>
./cel-key list --node.type bridge --keyring-backend test --p2p.network <network>

TIP

You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

You can get testnet tokens from:

NOTE

If you are running a bridge node for your validator it is highly recommended to request Mocha testnet tokens as this is the testnet used to test out validator operations.

Optional: run the bridge node with a custom key

In order to run a bridge node using a custom key:

  1. The custom key must exist inside the celestia bridge node directory at the correct path (default: ~/.celestia-bridge/keys/keyring-test)
  2. The name of the custom key must be passed upon start, like so:
sh
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key>
sh
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \
   --p2p.network mocha
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \
   --p2p.network mocha
sh
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \
   --p2p.network arabica
celestia bridge start --core.ip <URI> --keyring.keyname <name-of-custom-key> \
-  --p2p.network arabica

Optional: Migrate node id to another server

To migrate a bridge node ID:

  1. You need to back up two files located in the celestia-bridge node directory at the correct path (default: ~/.celestia-bridge/keys).
  2. Upload the files to the new server and start the node.

Optional: start the bridge node with SystemD

Follow the tutorial on setting up the bridge node as a background process with SystemD.

You have successfully set up a bridge node that is syncing with the network.

- + --p2p.network arabica

Optional: Migrate node id to another server

To migrate a bridge node ID:

  1. You need to back up two files located in the celestia-bridge node directory at the correct path (default: ~/.celestia-bridge/keys).
  2. Upload the files to the new server and start the node.

Optional: start the bridge node with SystemD

Follow the tutorial on setting up the bridge node as a background process with SystemD.

You have successfully set up a bridge node that is syncing with the network.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-commands.html b/pr-1699/nodes/celestia-app-commands.html index 6b1d076656..9f3544b72b 100644 --- a/pr-1699/nodes/celestia-app-commands.html +++ b/pr-1699/nodes/celestia-app-commands.html @@ -11,7 +11,7 @@ - + @@ -250,8 +250,8 @@ --commission-max-rate=0.2 \ --commission-max-change-rate=0.01 \ --min-self-delegation=1 \ - --evm-address=$EVM_ADDRESS \

You can then share your gentx JSON file on the networks repo in the respective network directory you are participating in.

- + --evm-address=$EVM_ADDRESS \

You can then share your gentx JSON file on the networks repo in the respective network directory you are participating in.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-metrics.html b/pr-1699/nodes/celestia-app-metrics.html index 2c90c2daf5..9cd60c5185 100644 --- a/pr-1699/nodes/celestia-app-metrics.html +++ b/pr-1699/nodes/celestia-app-metrics.html @@ -11,7 +11,7 @@ - + @@ -120,8 +120,8 @@ static_configs: # Point to the same endpoint that Celestia is publishing on - - targets: ["localhost:26660"]

Note, that Prometheus by default runs its server on :9090. If you are running this on the same machine as your consensus node, it will collide with gRPC which runs on the same port. To avoid this, either switch off gRPC (if it's not needed), change the gRPC port in app.toml, or run Prometheus on a different port e.g. --web.listen-address="0.0.0.0:8000"

To run the prometheus server:

bash
prometheus --config.file="$HOME/.celestia-app/config/prometheus.yml"
prometheus --config.file="$HOME/.celestia-app/config/prometheus.yml"

A prometheus server can scrape metrics from multiple nodes at once; a good way of bringing together information from many machines to one place.

To visualize the information, you can use Grafana: either with their cloud option or run the open source code yourself.

Once setup, run:

bash
grafana server
grafana server

which will begin a server on localhost:3000. If you open the url on your browser you will see the Grafana login page. Use admin for both the user and password to log in.

You will need to link the prometheus server as a data source. To do that go to "Configuration" in the sidebar and then "Data Sources". Add a new data source specifying the URL of the Prometheus instance (default at localhost:9090). Click "Save & test" to confirm.

Lastly, you will need to setup a dashboard. You can choose to do this yourself, handpicking the metrics that are important or you can simply export an existing design. Fortunately the cosmos ecosystem has conjured a "Cosmos Dashboard". On the sidebar, click "Dashboards" and then "import". Enter the following dashboard ID: 11036 and then link it to the "Prometheus" data source you just set up. Finally click the "Import" button and the "Cosmos Dashboard" should appear.

Node exporter

Celestia's metrics include a plethora of application specific trackers but it's also important to keep an eye on system level metrics such as memory usage and disk space. This can be best achieved by running Node Exporter. Follow the guide in the link to get set up, adding the port number to the prometheus.yml file.

Alerts

The final cherry on the cake is to integrate your monitoring system with a mechanism for producing alerts to warn you if your node has crashed or is no longer able to stay at the head of the chain.

Since we're already using Grafana, we can install the Grafana OnCall plugin. OnCall allows you to setup integrations. It could be a webhook or a direct integration into Telegram or Slack. You can find more information on Grafana's Docs Page.

- + - targets: ["localhost:26660"]

Note, that Prometheus by default runs its server on :9090. If you are running this on the same machine as your consensus node, it will collide with gRPC which runs on the same port. To avoid this, either switch off gRPC (if it's not needed), change the gRPC port in app.toml, or run Prometheus on a different port e.g. --web.listen-address="0.0.0.0:8000"

To run the prometheus server:

bash
prometheus --config.file="$HOME/.celestia-app/config/prometheus.yml"
prometheus --config.file="$HOME/.celestia-app/config/prometheus.yml"

A prometheus server can scrape metrics from multiple nodes at once; a good way of bringing together information from many machines to one place.

To visualize the information, you can use Grafana: either with their cloud option or run the open source code yourself.

Once setup, run:

bash
grafana server
grafana server

which will begin a server on localhost:3000. If you open the url on your browser you will see the Grafana login page. Use admin for both the user and password to log in.

You will need to link the prometheus server as a data source. To do that go to "Configuration" in the sidebar and then "Data Sources". Add a new data source specifying the URL of the Prometheus instance (default at localhost:9090). Click "Save & test" to confirm.

Lastly, you will need to setup a dashboard. You can choose to do this yourself, handpicking the metrics that are important or you can simply export an existing design. Fortunately the cosmos ecosystem has conjured a "Cosmos Dashboard". On the sidebar, click "Dashboards" and then "import". Enter the following dashboard ID: 11036 and then link it to the "Prometheus" data source you just set up. Finally click the "Import" button and the "Cosmos Dashboard" should appear.

Node exporter

Celestia's metrics include a plethora of application specific trackers but it's also important to keep an eye on system level metrics such as memory usage and disk space. This can be best achieved by running Node Exporter. Follow the guide in the link to get set up, adding the port number to the prometheus.yml file.

Alerts

The final cherry on the cake is to integrate your monitoring system with a mechanism for producing alerts to warn you if your node has crashed or is no longer able to stay at the head of the chain.

Since we're already using Grafana, we can install the Grafana OnCall plugin. OnCall allows you to setup integrations. It could be a webhook or a direct integration into Telegram or Slack. You can find more information on Grafana's Docs Page.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-multisig.html b/pr-1699/nodes/celestia-app-multisig.html index cc34f891a1..7cc68d25e2 100644 --- a/pr-1699/nodes/celestia-app-multisig.html +++ b/pr-1699/nodes/celestia-app-multisig.html @@ -11,7 +11,7 @@ - + @@ -140,8 +140,8 @@ celestia-appd tx multisign unsignedTx.json multisig \ test1sig.json test2sig.json \ --output-document signedTx.json \ - --chain-id $CHAIN_ID

Resources

- + --chain-id $CHAIN_ID

Resources

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-slashing.html b/pr-1699/nodes/celestia-app-slashing.html index 0cbb24d0d1..7f1cdf3611 100644 --- a/pr-1699/nodes/celestia-app-slashing.html +++ b/pr-1699/nodes/celestia-app-slashing.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Jailing and Slashing on Celestia

Slashing is a mechanism employed in proof of stake blockchains that is used to deter and punish malicious behavior. It functions by removing a percentage of a validator's stake each time they act harmfully towards the network.

Celestia is built with the Cosmos SDK and uses the x/slashing module.

If a validator gets slashed, delegators bonded to that validator will also have the same percentage of their delegated funds slashed.

The following are the conditions for a validator to get jailed or slashed:

  1. Downtime: If a validator is offline for more than 25% of a rolling window of the last 5,000 blocks, they will be jailed for 1 minute. During this period, the validator is removed from the validator set temporarily, and will be unable to propose new blocks or earn rewards. After the jail period, the validator can send an unjail request to rejoin the validator set.

  2. Double signing: This is a more severe offense and results in getting slashed. If a validator engages in double signing, the validator will lose 2% of their stake and the remainder of their stake will be returned to them. The validator will be permanently removed from the validator set and will not have the ability to unjail. Delegators bonded to that validator will automatically enter the unbonding period for 21 days, and can delegate to another validator after they have been unbonded.

For more details on the jailing and slashing parameters, refer to the celestia-app specifications page.

- +

Jailing and Slashing on Celestia

Slashing is a mechanism employed in proof of stake blockchains that is used to deter and punish malicious behavior. It functions by removing a percentage of a validator's stake each time they act harmfully towards the network.

Celestia is built with the Cosmos SDK and uses the x/slashing module.

If a validator gets slashed, delegators bonded to that validator will also have the same percentage of their delegated funds slashed.

The following are the conditions for a validator to get jailed or slashed:

  1. Downtime: If a validator is offline for more than 25% of a rolling window of the last 5,000 blocks, they will be jailed for 1 minute. During this period, the validator is removed from the validator set temporarily, and will be unable to propose new blocks or earn rewards. After the jail period, the validator can send an unjail request to rejoin the validator set.

  2. Double signing: This is a more severe offense and results in getting slashed. If a validator engages in double signing, the validator will lose 2% of their stake and the remainder of their stake will be returned to them. The validator will be permanently removed from the validator set and will not have the ability to unjail. Delegators bonded to that validator will automatically enter the unbonding period for 21 days, and can delegate to another validator after they have been unbonded.

For more details on the jailing and slashing parameters, refer to the celestia-app specifications page.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-upgrade-monitor.html b/pr-1699/nodes/celestia-app-upgrade-monitor.html index 617d34369e..6907714632 100644 --- a/pr-1699/nodes/celestia-app-upgrade-monitor.html +++ b/pr-1699/nodes/celestia-app-upgrade-monitor.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

Upgrade Monitor

Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the README for instructions on how to install and use the binary.

- +

Upgrade Monitor

Upgrade monitor is a binary that monitors that status of upgrades on a Celestia network. See the README for instructions on how to install and use the binary.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-vesting.html b/pr-1699/nodes/celestia-app-vesting.html index de6f260c51..e6f3296fb6 100644 --- a/pr-1699/nodes/celestia-app-vesting.html +++ b/pr-1699/nodes/celestia-app-vesting.html @@ -11,7 +11,7 @@ - + @@ -252,8 +252,8 @@ # <host>:<port> to Tendermint RPC interface for this chain node = "tcp://rpc-mocha.pops.one:443" # Transaction broadcasting mode (sync|async|block) -broadcast-mode = "sync"

Notes

Not all vesting accounts can be created with a message, some need to be set at genesis. You can learn more in the Cosmos Network documentation.

Conclusion

Congratulations! You've learned how to create a local devnet, create a vesting account on it, and how to make a vesting account on the Mocha testnet!

- +broadcast-mode = "sync"

Notes

Not all vesting accounts can be created with a message, some need to be set at genesis. You can learn more in the Cosmos Network documentation.

Conclusion

Congratulations! You've learned how to create a local devnet, create a vesting account on it, and how to make a vesting account on the Mocha testnet!

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app-wallet.html b/pr-1699/nodes/celestia-app-wallet.html index cd853fbf19..5e4f8c777e 100644 --- a/pr-1699/nodes/celestia-app-wallet.html +++ b/pr-1699/nodes/celestia-app-wallet.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@

Create a wallet with celestia-app

For this guide, we will go over how you can generate a Celestia wallet using celestia-app.

Prerequisites

Note, you do not need to install celestia-node for this tutorial.

Create a wallet

First, create an application CLI configuration file:

sh
celestia-appd config keyring-backend test
celestia-appd config keyring-backend test

You can pick whatever wallet name you want. For our example we used "validator" as the wallet name:

sh
celestia-appd keys add validator --interactive
celestia-appd keys add validator --interactive

Save the mnemonic output as this is the only way to recover your validator wallet in case you lose it!

To check all your wallets you can run:

sh
celestia-appd keys list
celestia-appd keys list

Fund a wallet

For the public celestia address, you can fund the previously created wallet via Discord by sending this message to either the #mocha-faucet or #arabica-faucet channel:

text
$request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$request celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Wait to see if you get a confirmation that the tokens have been successfully sent. To check if tokens have arrived successfully to the destination wallet run the command below replacing the public address with your own:

sh
celestia-appd start
 celestia-appd query bank balances celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
celestia-appd start
-celestia-appd query bank balances celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

TIP

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

- +celestia-appd query bank balances celestia1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

TIP

Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

+ \ No newline at end of file diff --git a/pr-1699/nodes/celestia-app.html b/pr-1699/nodes/celestia-app.html index 96ff335d8e..bea58ded78 100644 --- a/pr-1699/nodes/celestia-app.html +++ b/pr-1699/nodes/celestia-app.html @@ -14,7 +14,7 @@ - + @@ -47,8 +47,8 @@ cd celestia-app
cd $HOME
 rm -rf celestia-app
 git clone https://github.com/celestiaorg/celestia-app.git
-cd celestia-app
  • Check out to the desired version, based on the network you will use:

    bash
    git checkout tags/v1.13.0
    git checkout tags/v1.13.0
    bash
    git checkout tags/v2.1.2
    git checkout tags/v2.1.2
    bash
    git checkout tags/v2.1.2
    git checkout tags/v2.1.2
  • Build and install the celestia-appd binary:

    bash
    make install
    make install
  • To check if the binary was successfully installed you can run the binary using the --help flag:

    sh
    celestia-appd --help
    celestia-appd --help
  • You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

    Installing a pre-built binary

    Installing a pre-built binary is the fastest way to get started with your Celestia consensus node. Releases after celestia-app v1.3.0 should have these binaries available.

    The steps below will download a binary file named celestia-appd. Depending on the setup that you choose during installation, the celestia-appd binary will be available at either:

    • $HOME/celestia-app-temp/celestia-appd
    • /usr/local/bin/celestia-appd

    Pre-built binaries are available for:

    • Operating systems: Darwin (Apple), Linux
    • Architectures: x86_64 (amd64), arm64

    To install the latest pre-built binary you can run this command in your terminal:

    bash
    bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"
    bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"

    Follow the instructions in the terminal output to choose your installation preferences.

    You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

    View the script to learn more about what it is doing.

    Ports

    When interacting with a consensus node, you may need to open ports on your machine to allow communication between nodes, such as bridge nodes. It is essential that specific ports are accessible. Make sure that your firewall allows connections to the correct ports.

    If you run a node on a cloud server, make sure that the ports are open on the server's firewall. If you run a node at home, make sure that your router allows connections to the correct ports.

    For example, validator ports 9090 and 26657 need to be accessible by the bridge, and port 2121 is required for P2P connections for all node types.

    The following ports are used by Celestia app nodes:

    PortProtocolAddressDescriptionEnabled by default on nodeFlag
    2121TCP/UDPlocalhostP2PtrueN/A
    9090HTTP0.0.0.0gRPCtrue--grpc.address string
    26657TCPlocalhostRPCfalse (only open to localhost)--rpc.laddr string
    - +cd celestia-app
  • Check out to the desired version, based on the network you will use:

    bash
    git checkout tags/v1.13.0
    git checkout tags/v1.13.0
    bash
    git checkout tags/v2.1.2
    git checkout tags/v2.1.2
    bash
    git checkout tags/v2.1.2
    git checkout tags/v2.1.2
  • Build and install the celestia-appd binary:

    bash
    make install
    make install
  • To check if the binary was successfully installed you can run the binary using the --help flag:

    sh
    celestia-appd --help
    celestia-appd --help
  • You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

    Installing a pre-built binary

    Installing a pre-built binary is the fastest way to get started with your Celestia consensus node. Releases after celestia-app v1.3.0 should have these binaries available.

    The steps below will download a binary file named celestia-appd. Depending on the setup that you choose during installation, the celestia-appd binary will be available at either:

    • $HOME/celestia-app-temp/celestia-appd
    • /usr/local/bin/celestia-appd

    Pre-built binaries are available for:

    • Operating systems: Darwin (Apple), Linux
    • Architectures: x86_64 (amd64), arm64

    To install the latest pre-built binary you can run this command in your terminal:

    bash
    bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"
    bash -c "$(curl -sL https://docs.celestia.org/celestia-app.sh)"

    Follow the instructions in the terminal output to choose your installation preferences.

    You will see an output with the menu for celestia-appd. Learn more on the helpful CLI commands page

    View the script to learn more about what it is doing.

    Ports

    When interacting with a consensus node, you may need to open ports on your machine to allow communication between nodes, such as bridge nodes. It is essential that specific ports are accessible. Make sure that your firewall allows connections to the correct ports.

    If you run a node on a cloud server, make sure that the ports are open on the server's firewall. If you run a node at home, make sure that your router allows connections to the correct ports.

    For example, validator ports 9090 and 26657 need to be accessible by the bridge, and port 2121 is required for P2P connections for all node types.

    The following ports are used by Celestia app nodes:

    PortProtocolAddressDescriptionEnabled by default on nodeFlag
    2121TCP/UDPlocalhostP2PtrueN/A
    9090HTTP0.0.0.0gRPCtrue--grpc.address string
    26657TCPlocalhostRPCfalse (only open to localhost)--rpc.laddr string
    + \ No newline at end of file diff --git a/pr-1699/nodes/celestia-node-custom-networks.html b/pr-1699/nodes/celestia-node-custom-networks.html index ed62b37f4b..296849975a 100644 --- a/pr-1699/nodes/celestia-node-custom-networks.html +++ b/pr-1699/nodes/celestia-node-custom-networks.html @@ -11,7 +11,7 @@ - + @@ -50,8 +50,8 @@ export CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"
    export BRIDGE="/ip4/151.115.14.33/tcp/2121/p2p/12D3KooWKEeRtzVMPUdxYsZo2edqps6mS67n6LT5mPdULSkPSxBQ"
     export GENESIS_HASH=580B3DFF8A7C716968161D91116A1E171F486298D582874E93714E489C9E6E88
     export NETWORK=custom
    -export CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

    Then, start your node with:

    bash
    celestia <node-type> start [flags...]
    celestia <node-type> start [flags...]
    - +export CELESTIA_CUSTOM="${NETWORK}:${GENESIS_HASH}:${BRIDGE}"

    Then, start your node with:

    bash
    celestia <node-type> start [flags...]
    celestia <node-type> start [flags...]
    + \ No newline at end of file diff --git a/pr-1699/nodes/celestia-node-metrics.html b/pr-1699/nodes/celestia-node-metrics.html index 4126118341..6d604a1781 100644 --- a/pr-1699/nodes/celestia-node-metrics.html +++ b/pr-1699/nodes/celestia-node-metrics.html @@ -11,7 +11,7 @@ - + @@ -66,8 +66,8 @@ # To disable TLS connection celestia <node-type> start --metrics.tls=false --metrics \ --metrics.endpoint <URI> \ - --p2p.network <network> --core.ip <URI>

    Metrics endpoint design considerations

    At the moment, the architecture of celestia-node metrics works as specified in the following ADR #010.

    Essentially, the design considerations here will necessitate running an OpenTelemetry (OTEL) collector that connects to Celestia light node.

    For an overview of OTEL, check out the guide.

    The ADR and the OTEL docs will help you run your collector on the metrics endpoint. This will then allow you to process the data in the collector on a Prometheus server which can then be viewed on a Grafana dashboard.

    In the future, we do want to open-source some developer toolings around this infrastructure to allow for node operators to be able to monitor their data availability nodes.

    - + --p2p.network <network> --core.ip <URI>

    Metrics endpoint design considerations

    At the moment, the architecture of celestia-node metrics works as specified in the following ADR #010.

    Essentially, the design considerations here will necessitate running an OpenTelemetry (OTEL) collector that connects to Celestia light node.

    For an overview of OTEL, check out the guide.

    The ADR and the OTEL docs will help you run your collector on the metrics endpoint. This will then allow you to process the data in the collector on a Prometheus server which can then be viewed on a Grafana dashboard.

    In the future, we do want to open-source some developer toolings around this infrastructure to allow for node operators to be able to monitor their data availability nodes.

    + \ No newline at end of file diff --git a/pr-1699/nodes/celestia-node-troubleshooting.html b/pr-1699/nodes/celestia-node-troubleshooting.html index d683068cd4..d1c4aa9cad 100644 --- a/pr-1699/nodes/celestia-node-troubleshooting.html +++ b/pr-1699/nodes/celestia-node-troubleshooting.html @@ -12,7 +12,7 @@ - + @@ -99,8 +99,8 @@ ...
    [Service]
     ...
     LimitNOFILE=1400000
    -...

    NOTE

    Be cautious when increasing file descriptor limits. Setting this value too high might affect system performance. Ensure the value is appropriate for your system's capabilities.

    1. Reload daemon and restart bridge service:
    bash
    sudo systemctl daemon-reload
    sudo systemctl daemon-reload
    bash
    sudo systemctl restart celestia-bridge
    sudo systemctl restart celestia-bridge
    - +...

    NOTE

    Be cautious when increasing file descriptor limits. Setting this value too high might affect system performance. Ensure the value is appropriate for your system's capabilities.

    1. Reload daemon and restart bridge service:
    bash
    sudo systemctl daemon-reload
    sudo systemctl daemon-reload
    bash
    sudo systemctl restart celestia-bridge
    sudo systemctl restart celestia-bridge
    + \ No newline at end of file diff --git a/pr-1699/nodes/celestia-node-trusted-hash.html b/pr-1699/nodes/celestia-node-trusted-hash.html index b8122e299d..ee91d643b8 100644 --- a/pr-1699/nodes/celestia-node-trusted-hash.html +++ b/pr-1699/nodes/celestia-node-trusted-hash.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@

    Syncing a light node from a trusted hash

    This guide goes over how to sync a DA light node from a trusted hash. The example is with Mainnet Beta. You will need to adjust the commands accordingly for Mocha, Arabica, or a custom network.

    WARNING

    Syncing to a trusted hash means that you will not sample the entire chain. This adds a trust assumption that you trust the history of the chain up to that point and that you trust the entity where you get the hash from. In this example, the trusted entity is a consensus endpoint or Celenium

    1. Get trusted height & hash from a consensus endpoint or Celenium.

    2. Initialize the node store

      sh
      celestia light init --p2p.network <network>
      celestia light init --p2p.network <network>
    3. Set the trusted height & hash

      1. Open your config.toml at .celestia-light/config.toml (or .celestia-light-<other-network>/config.toml)
      2. Set DASer.SampleFrom to the trusted height (e.g. SampleFrom = 123456)
    4. Run the node with the hash and flag:

    sh
    celestia light start --headers.trusted-hash <hash_of_block_n> \
         --p2p.network <network> --core.ip <consensus-node-rpc>
    celestia light start --headers.trusted-hash <hash_of_block_n> \
    -    --p2p.network <network> --core.ip <consensus-node-rpc>

    For service operators

    If you're using multiple light nodes for similar services like tracking the same rollup, it is recommended to use the same hash and height for them all services using the same starting height.

    - + --p2p.network <network> --core.ip <consensus-node-rpc>

    For service operators

    If you're using multiple light nodes for similar services like tracking the same rollup, it is recommended to use the same hash and height for them all services using the same starting height.

    + \ No newline at end of file diff --git a/pr-1699/nodes/celestia-node.html b/pr-1699/nodes/celestia-node.html index d6c3942f05..8f24307065 100644 --- a/pr-1699/nodes/celestia-node.html +++ b/pr-1699/nodes/celestia-node.html @@ -14,7 +14,7 @@ - + @@ -47,8 +47,8 @@ cd celestia-node/
    cd $HOME
     rm -rf celestia-node
     git clone https://github.com/celestiaorg/celestia-node.git
    -cd celestia-node/
  • Check out to the desired version, based on the network you will use:

    bash
    git checkout tags/v0.15.0
    git checkout tags/v0.15.0
    bash
    git checkout tags/v0.16.0
    git checkout tags/v0.16.0
    bash
    git checkout tags/v0.16.0
    git checkout tags/v0.16.0
  • Build the celestia binary:

    a. Standard build

    bash
    make build
    make build

    b. Experimental build

    OPTIONAL

    If you're a node operator comfortable with experimental features and seeking optimal performance with minimal RAM usage, this option is recommended for you.

    bash
    make build-jemalloc
    make build-jemalloc

    This build option enables CGO, and downloads and installs jemalloc. Learn more about the build command.

  • Install the binary:

    bash
    make install
    make install
  • Build the cel-key utility:

    bash
    make cel-key
    make cel-key
  • Verify that the binary is working and check the version:

    bash
    celestia version
    celestia version
  • The output will show the semantic version of celestia-node, commit hash, build date, system version, and Golang version.

    Installing a pre-built binary

    Installing a pre-built binary is the fastest way to get started with your Celestia data availability node. Releases after celestia-node v0.13.3 should have these binaries available.

    The steps below will download a binary file named celestia. Depending on the setup that you choose during installation, the celestia binary will be available at either:

    • $HOME/celestia-node-temp/celestia
    • /usr/local/bin/celestia

    Pre-built binaries are available for:

    • Operating systems: Darwin (Apple), Linux
    • Architectures: x86_64 (amd64), arm64

    To install the latest pre-built binary you can run this command in your terminal:

    bash
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"

    Follow the instructions in the terminal output to choose your installation preferences.

    You will see an output with the menu for celestia.

    View the script to learn more about what it is doing.

    Next steps

    First, we recommend reading the overview of our node types, if you haven't yet.

    Now that you've installed Celestia Node, it's time to pick your node type and run your node!

    If you're planning to run a light node, we recommend the node RPC CLI tutorial.

    Upgrading your binary

    To upgrade your binary, you can install the latest version from the instructions above and restart your node. If you run into any issues, Refer to the troubleshooting section.

    - +cd celestia-node/
  • Check out to the desired version, based on the network you will use:

    bash
    git checkout tags/v0.15.0
    git checkout tags/v0.15.0
    bash
    git checkout tags/v0.16.0
    git checkout tags/v0.16.0
    bash
    git checkout tags/v0.16.0
    git checkout tags/v0.16.0
  • Build the celestia binary:

    a. Standard build

    bash
    make build
    make build

    b. Experimental build

    OPTIONAL

    If you're a node operator comfortable with experimental features and seeking optimal performance with minimal RAM usage, this option is recommended for you.

    bash
    make build-jemalloc
    make build-jemalloc

    This build option enables CGO, and downloads and installs jemalloc. Learn more about the build command.

  • Install the binary:

    bash
    make install
    make install
  • Build the cel-key utility:

    bash
    make cel-key
    make cel-key
  • Verify that the binary is working and check the version:

    bash
    celestia version
    celestia version
  • The output will show the semantic version of celestia-node, commit hash, build date, system version, and Golang version.

    Installing a pre-built binary

    Installing a pre-built binary is the fastest way to get started with your Celestia data availability node. Releases after celestia-node v0.13.3 should have these binaries available.

    The steps below will download a binary file named celestia. Depending on the setup that you choose during installation, the celestia binary will be available at either:

    • $HOME/celestia-node-temp/celestia
    • /usr/local/bin/celestia

    Pre-built binaries are available for:

    • Operating systems: Darwin (Apple), Linux
    • Architectures: x86_64 (amd64), arm64

    To install the latest pre-built binary you can run this command in your terminal:

    bash
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"
    bash -c "$(curl -sL https://docs.celestia.org/celestia-node.sh)"

    Follow the instructions in the terminal output to choose your installation preferences.

    You will see an output with the menu for celestia.

    View the script to learn more about what it is doing.

    Next steps

    First, we recommend reading the overview of our node types, if you haven't yet.

    Now that you've installed Celestia Node, it's time to pick your node type and run your node!

    If you're planning to run a light node, we recommend the node RPC CLI tutorial.

    Upgrading your binary

    To upgrade your binary, you can install the latest version from the instructions above and restart your node. If you run into any issues, Refer to the troubleshooting section.

    + \ No newline at end of file diff --git a/pr-1699/nodes/config-toml.html b/pr-1699/nodes/config-toml.html index 010e0065d7..ef8896af09 100644 --- a/pr-1699/nodes/config-toml.html +++ b/pr-1699/nodes/config-toml.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    config.toml guide

    Pre-requisites

    Please, make sure that you have installed and initialized celestia-node

    Understanding config.toml

    After initialization, for any type of node, you will find a config.toml in the following path (default location):

    • $HOME/.celestia-bridge/config.toml for bridge node
    • $HOME/.celestia-light/config.toml for light node
    • $HOME/.celestia-full/config.toml for a full DA node

    Let's break down some of the most used sections.

    Core

    This section is needed for the Celestia bridge node. By default, Remote = false. Still for devnet, we are going to use the remote core option and this can also be set by the command line flag --core.remote.

    P2P

    Bootstrap

    Bootstrappers help new nodes to find peers faster in the network. By default, the Bootstrapper = false and the BootstrapPeers is empty. If you want your node to be a bootstrapper, then activate Bootstrapper = true. BootstrapPeers are already provided by default during initialisation. If you want to add your own manually, you need to provide the multiaddresses of the peers.

    Mutual peers

    The purpose of this config is to set up a bidirectional communication. This is usually the case for Celestia bridge nodes. In addition, you need to change the field PeerExchange from false to true.

    Services

    TrustedHash and TrustedPeer

    TrustedHash is needed to properly initialize a Celestia bridge node with an already-running Remote celestia-core node. Celestia light node will take a genesis hash as the trusted one, if no hash is manually provided during initialization phase.

    TrustedPeers is the array of bridge nodes' peers that Celestia light node trusts. By default, bootstrap peers becomes trusted peers for Celestia light nodes if a user is not setting the trusted peer params in config file.

    Any Celestia bridge node can be a trusted peer for the light one. However, the light node by design can not be a trusted peer for another light node.

    - +

    config.toml guide

    Pre-requisites

    Please, make sure that you have installed and initialized celestia-node

    Understanding config.toml

    After initialization, for any type of node, you will find a config.toml in the following path (default location):

    • $HOME/.celestia-bridge/config.toml for bridge node
    • $HOME/.celestia-light/config.toml for light node
    • $HOME/.celestia-full/config.toml for a full DA node

    Let's break down some of the most used sections.

    Core

    This section is needed for the Celestia bridge node. By default, Remote = false. Still for devnet, we are going to use the remote core option and this can also be set by the command line flag --core.remote.

    P2P

    Bootstrap

    Bootstrappers help new nodes to find peers faster in the network. By default, the Bootstrapper = false and the BootstrapPeers is empty. If you want your node to be a bootstrapper, then activate Bootstrapper = true. BootstrapPeers are already provided by default during initialisation. If you want to add your own manually, you need to provide the multiaddresses of the peers.

    Mutual peers

    The purpose of this config is to set up a bidirectional communication. This is usually the case for Celestia bridge nodes. In addition, you need to change the field PeerExchange from false to true.

    Services

    TrustedHash and TrustedPeer

    TrustedHash is needed to properly initialize a Celestia bridge node with an already-running Remote celestia-core node. Celestia light node will take a genesis hash as the trusted one, if no hash is manually provided during initialization phase.

    TrustedPeers is the array of bridge nodes' peers that Celestia light node trusts. By default, bootstrap peers becomes trusted peers for Celestia light nodes if a user is not setting the trusted peer params in config file.

    Any Celestia bridge node can be a trusted peer for the light one. However, the light node by design can not be a trusted peer for another light node.

    + \ No newline at end of file diff --git a/pr-1699/nodes/consensus-node.html b/pr-1699/nodes/consensus-node.html index ba38367a44..5f6f418bfb 100644 --- a/pr-1699/nodes/consensus-node.html +++ b/pr-1699/nodes/consensus-node.html @@ -12,7 +12,7 @@ - + @@ -39,7 +39,7 @@

    Consensus node

    This guide covers how to set up a consensus node on Celestia. Consensus nodes allow you to sync the entire blockchain history in the Celestia consensus layer.

    consensus node

    Minimum hardware requirements

    The following minimum hardware requirements are recommended for running a consensus node:

    • Memory: 16 GB RAM
    • CPU: Quad-Core
    • Disk: 2 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Set up a consensus node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up the dependencies

    Follow the instructions on installing dependencies.

    Install celestia-app

    Follow the tutorial on installing celestia-app.

    Set up the P2P networks

    To initialize the network, pick a "node-name" that describes your node. Keep in mind that this might change if a new testnet is deployed.

    bash
    celestia-appd init "node-name" --chain-id celestia
    celestia-appd init "node-name" --chain-id celestia
    bash
    celestia-appd init "node-name" --chain-id mocha-4
    celestia-appd init "node-name" --chain-id mocha-4
    bash
    celestia-appd init "node-name" --chain-id arabica-11
    celestia-appd init "node-name" --chain-id arabica-11

    Download the genesis.json file:

    bash
    celestia-appd download-genesis celestia
    celestia-appd download-genesis celestia
    bash
    celestia-appd download-genesis mocha-4
    celestia-appd download-genesis mocha-4
    bash
    celestia-appd download-genesis arabica-11
    celestia-appd download-genesis arabica-11

    Set seeds in the $HOME/.celestia-app/config/config.toml file:

    bash
    SEEDS=$(curl -sL https://raw.githubusercontent.com/celestiaorg/networks/master/celestia/seeds.txt | tr '\n' ',')
    +

    Consensus node

    This guide covers how to set up a consensus node on Celestia. Consensus nodes allow you to sync the entire blockchain history in the Celestia consensus layer.

    consensus node

    Minimum hardware requirements

    The following minimum hardware requirements are recommended for running a consensus node:

    • Memory: 16 GB RAM
    • CPU: Quad-Core
    • Disk: 2 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Set up a consensus node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up the dependencies

    Follow the instructions on installing dependencies.

    Install celestia-app

    Follow the tutorial on installing celestia-app.

    Set up the P2P networks

    To initialize the network, pick a "node-name" that describes your node. Keep in mind that this might change if a new testnet is deployed.

    bash
    celestia-appd init "node-name" --chain-id celestia
    celestia-appd init "node-name" --chain-id celestia
    bash
    celestia-appd init "node-name" --chain-id mocha-4
    celestia-appd init "node-name" --chain-id mocha-4
    bash
    celestia-appd init "node-name" --chain-id arabica-11
    celestia-appd init "node-name" --chain-id arabica-11

    Download the genesis.json file:

    bash
    celestia-appd download-genesis celestia
    celestia-appd download-genesis celestia
    bash
    celestia-appd download-genesis mocha-4
    celestia-appd download-genesis mocha-4
    bash
    celestia-appd download-genesis arabica-11
    celestia-appd download-genesis arabica-11

    Set seeds in the $HOME/.celestia-app/config/config.toml file:

    bash
    SEEDS=$(curl -sL https://raw.githubusercontent.com/celestiaorg/networks/master/celestia/seeds.txt | tr '\n' ',')
     echo $SEEDS
     sed -i.bak -e "s/^seeds *=.*/seeds = \"$SEEDS\"/" $HOME/.celestia-app/config/config.toml
    SEEDS=$(curl -sL https://raw.githubusercontent.com/celestiaorg/networks/master/celestia/seeds.txt | tr '\n' ',')
     echo $SEEDS
    @@ -53,7 +53,7 @@
     seeds = ""
    # For Arabica, you can set seeds manually in the
     # `$HOME/.celestia-app/config/config.toml` file:
     # Comma separated list of seed nodes to connect to
    -seeds = ""
    Optional: Set persistent peers

    Optionally, you can set persistent peers in your config.toml file. If you set persistent peers, your node will always try to connect to these peers. This is useful when running a local devnet, for example, when you would always want to connect to the same local nodes in your devnet. In production, setting persistent peers is advised only if you are running a sentry node.

    You can get the persistent peers from the @cosmos/chain-registry repository (for Mainnet Beta) or @celestiaorg/networks repository repo (for Mocha and Arabica) with the following commands:

    bash
    PERSISTENT_PEERS=$(curl -s https://raw.githubusercontent.com/cosmos/chain-registry/master/celestia/chain.json | jq -r '.peers.persistent_peers[].address' | tr '\n' ',' | sed 's/,$/\n/')
    +seeds = ""
    Optional: Set persistent peers

    Optionally, you can set persistent peers in your config.toml file. If you set persistent peers, your node will always try to connect to these peers. This is useful when running a local devnet, for example, when you would always want to connect to the same local nodes in your devnet. In production, setting persistent peers is advised only if you are running a sentry node.

    You can get the persistent peers from the @cosmos/chain-registry repository (for Mainnet Beta) or @celestiaorg/networks repository repo (for Mocha and Arabica) with the following commands:

    bash
    PERSISTENT_PEERS=$(curl -s https://raw.githubusercontent.com/cosmos/chain-registry/master/celestia/chain.json | jq -r '.peers.persistent_peers[].address' | tr '\n' ',' | sed 's/,$/\n/')
     echo $PERSISTENT_PEERS
     sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PERSISTENT_PEERS\"/" $HOME/.celestia-app/config/config.toml
    PERSISTENT_PEERS=$(curl -s https://raw.githubusercontent.com/cosmos/chain-registry/master/celestia/chain.json | jq -r '.peers.persistent_peers[].address' | tr '\n' ',' | sed 's/,$/\n/')
     echo $PERSISTENT_PEERS
    @@ -79,7 +79,7 @@
     ###         State Sync Configuration Options        ###
     #######################################################
     [statesync]
    -enable = true

    To their respective fields. At least two different rpc endpoints should be provided. The more, the greater the chance of detecting any fraudulent behavior.

    Once setup, you should be ready to start the node as normal. In the logs, you should see: Discovering snapshots. This may take a few minutes before snapshots are found depending on the network topology.

    Option 3: Quick sync

    Quick sync effectively downloads the entire data directory from a third-party provider meaning the node has all the application and blockchain state as the node it was copied from.

    Run the following command to quick-sync from a snapshot:

    bash
    cd $HOME
    +enable = true

    To their respective fields. At least two different rpc endpoints should be provided. The more, the greater the chance of detecting any fraudulent behavior.

    Once setup, you should be ready to start the node as normal. In the logs, you should see: Discovering snapshots. This may take a few minutes before snapshots are found depending on the network topology.

    Option 3: Quick sync

    Quick sync effectively downloads the entire data directory from a third-party provider meaning the node has all the application and blockchain state as the node it was copied from.

    Run the following command to quick-sync from a snapshot:

    bash
    cd $HOME
     rm -rf ~/.celestia-app/data
     mkdir -p ~/.celestia-app/data
     SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \
    @@ -115,12 +115,12 @@
     SNAP_NAME=$(curl -s https://snaps.qubelabs.io/celestia/ | \
         egrep -o ">arabica-11.*tar" | tr -d ">")
     aria2c -x 16 -s 16 -o celestia-snap.tar "https://snaps.qubelabs.io/celestia/${SNAP_NAME}"
    -tar xf celestia-snap.tar -C ~/.celestia-app/data/

    Start the consensus node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    Optional: If you would like celestia-app to run as a background process, you can follow the SystemD tutorial.

    Extra resources for consensus nodes

    Optional: Reset network

    This will delete all data folders so we can start fresh:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Optional: Configure an RPC endpoint

    You can configure your consensus node to be a public RPC endpoint. This allows it to accept connections from data availability nodes and serve requests for the data availability API.

    Expose RPC

    By default, the RPC service listens on localhost which means it can't be accessed from other machines. To make the RPC service available publicly, you need to bind it to a public IP or 0.0.0.0 (which means listening on all available network interfaces).

    You can do this by editing the config.toml file:

    sh
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml

    This command replaces the localhost IP address with 0.0.0.0, making the RPC service listen on all available network interfaces.

    Note on external-address

    The external-address field in the configuration is used when your node is behind a NAT and you need to advertise a different address for peers to dial. Populating this field is not necessary for making the RPC endpoint public.

    sh
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)
    +tar xf celestia-snap.tar -C ~/.celestia-app/data/

    Start the consensus node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    Optional: If you would like celestia-app to run as a background process, you can follow the SystemD tutorial.

    Extra resources for consensus nodes

    Optional: Reset network

    This will delete all data folders so we can start fresh:

    sh
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
    celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app

    Optional: Configure an RPC endpoint

    You can configure your consensus node to be a public RPC endpoint. This allows it to accept connections from data availability nodes and serve requests for the data availability API.

    Expose RPC

    By default, the RPC service listens on localhost which means it can't be accessed from other machines. To make the RPC service available publicly, you need to bind it to a public IP or 0.0.0.0 (which means listening on all available network interfaces).

    You can do this by editing the config.toml file:

    sh
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml
    sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.celestia-app/config/config.toml

    This command replaces the localhost IP address with 0.0.0.0, making the RPC service listen on all available network interfaces.

    Note on external-address

    The external-address field in the configuration is used when your node is behind a NAT and you need to advertise a different address for peers to dial. Populating this field is not necessary for making the RPC endpoint public.

    sh
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)
     sed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \
         $HOME/.celestia-app/config/config.toml
    EXTERNAL-ADDRESS=$(wget -qO- eth0.me)
     sed -i.bak -e "s/^external-address = ""/external-address = "$EXTERNAL-ADDRESS:26656"/" \
    -    $HOME/.celestia-app/config/config.toml

    Restart the node

    After making these changes, restart celestia-appd to load the new configurations.

    Optional: Transaction indexer configuration options

    This section guides you on how to configure your config.toml file in celestia-app to select which transactions to index. Depending on the application's configuration, a node operator may decide which transactions to index.

    The available options are:

    1. null: This option disables indexing. If you don't need to query transactions, you can choose this option to save space.
    2. kv (default): This is the simplest indexer, backed by key-value storage (defaults to levelDB; see DBBackend). When kv is chosen, tx.height and tx.hash will always be indexed. This option is suitable for basic queries on transactions.
    3. psql: This indexer is backed by PostgreSQL. When psql is chosen, tx.height and tx.hash will always be indexed. This option is suitable for complex queries on transactions.

    An example to set the value to kv in config.toml is:

    toml
    indexer = "kv"
    indexer = "kv"

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    Optional: Discard ABCI responses configuration

    This section will guide you on how to configure your config.toml file in celestia-app to manage the storage of ABCI responses. ABCI responses are the results of executing transactions and are used for /block_results RPC queries and to reindex events in the command-line tool.

    The discard_abci_responses option allows you to control whether these responses are persisted in the state store:

    • false (default): ABCI responses are stored in the state store. This ensures that ABCI responses are available for /block_results RPC queries and for reindexing events. However, it can consume a significant amount of disk space.
    • true: ABCI responses are not stored in the state store. This can save a considerable amount of disk space, but /block_results RPC queries and event reindexing will not be available.

    An example to set the value to false in config.toml is:

    toml
    discard_abci_responses = false
    discard_abci_responses = false

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    - + $HOME/.celestia-app/config/config.toml

    Restart the node

    After making these changes, restart celestia-appd to load the new configurations.

    Optional: Transaction indexer configuration options

    This section guides you on how to configure your config.toml file in celestia-app to select which transactions to index. Depending on the application's configuration, a node operator may decide which transactions to index.

    The available options are:

    1. null: This option disables indexing. If you don't need to query transactions, you can choose this option to save space.
    2. kv (default): This is the simplest indexer, backed by key-value storage (defaults to levelDB; see DBBackend). When kv is chosen, tx.height and tx.hash will always be indexed. This option is suitable for basic queries on transactions.
    3. psql: This indexer is backed by PostgreSQL. When psql is chosen, tx.height and tx.hash will always be indexed. This option is suitable for complex queries on transactions.

    An example to set the value to kv in config.toml is:

    toml
    indexer = "kv"
    indexer = "kv"

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    Optional: Discard ABCI responses configuration

    This section will guide you on how to configure your config.toml file in celestia-app to manage the storage of ABCI responses. ABCI responses are the results of executing transactions and are used for /block_results RPC queries and to reindex events in the command-line tool.

    The discard_abci_responses option allows you to control whether these responses are persisted in the state store:

    • false (default): ABCI responses are stored in the state store. This ensures that ABCI responses are available for /block_results RPC queries and for reindexing events. However, it can consume a significant amount of disk space.
    • true: ABCI responses are not stored in the state store. This can save a considerable amount of disk space, but /block_results RPC queries and event reindexing will not be available.

    An example to set the value to false in config.toml is:

    toml
    discard_abci_responses = false
    discard_abci_responses = false

    Remember to restart celestia-appd after making changes to the configuration to load the new settings.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    + \ No newline at end of file diff --git a/pr-1699/nodes/decide-node.html b/pr-1699/nodes/decide-node.html index bcba35b8bf..8f07c85a4b 100644 --- a/pr-1699/nodes/decide-node.html +++ b/pr-1699/nodes/decide-node.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Deciding which node to run

    Now that you have installed the basic dependencies, you can start exploring which nodes to run!

    Beginner

    It is highly recommended if you are a beginner to get started with running a Data-Availability light node.

    In order to get started, you can proceed to the light node section.

    You can also play around with the Data Availability API in this tutorial for posting and retrieving data with a light node.

    Advanced

    If you are looking to run a consensus node, please follow the tutorial for running a consensus node.

    Note that running a validator means you must also run a bridge node, which is covered in this section.

    - +

    Deciding which node to run

    Now that you have installed the basic dependencies, you can start exploring which nodes to run!

    Beginner

    It is highly recommended if you are a beginner to get started with running a Data-Availability light node.

    In order to get started, you can proceed to the light node section.

    You can also play around with the Data Availability API in this tutorial for posting and retrieving data with a light node.

    Advanced

    If you are looking to run a consensus node, please follow the tutorial for running a consensus node.

    Note that running a validator means you must also run a bridge node, which is covered in this section.

    + \ No newline at end of file diff --git a/pr-1699/nodes/docker-images.html b/pr-1699/nodes/docker-images.html index 8e75071f7b..a46a24536c 100644 --- a/pr-1699/nodes/docker-images.html +++ b/pr-1699/nodes/docker-images.html @@ -14,7 +14,7 @@ - + @@ -41,7 +41,7 @@

    🐳 Docker setup

    This page has instructions to run celestia-node using Docker. If you are looking for instructions to run celestia-node using a binary, please refer to the celestia-node page.

    Using Docker is the easiest way to run celestia-node for most users. Docker is a containerization platform that allows you to run celestia-node in an isolated environment.

    This means that you can run celestia-node on your machine without having to worry about installing and configuring all of the dependencies required to run the node.

    If you would like to learn more about key management in Docker, visit the Docker and cel-key section.

    The easiest way to install Docker is to use the Docker Desktop installer or Ubuntu. You can follow the instructions for your operating system.

    Prerequisites

    Quick start

    1. Set the network you would like to run your node on:

      bash
      export NETWORK=celestia
      export NETWORK=celestia
      bash
      export NETWORK=mocha
      export NETWORK=mocha
      bash
      export NETWORK=arabica
      export NETWORK=arabica
    2. Set the node type

      bash
      export NODE_TYPE=light
      export NODE_TYPE=light
      bash
      export NODE_TYPE=bridge
      export NODE_TYPE=bridge
      bash
      export NODE_TYPE=full
      export NODE_TYPE=full
    3. Set an RPC endpoint for either Mainnet Beta, Mocha, or Arabica using the bare URL (without http or https):

      bash
      export RPC_URL=this-is-an-rpc-url.com
      export RPC_URL=this-is-an-rpc-url.com
    4. Run the image from the command line:

      bash
      docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
      +

    🐳 Docker setup

    This page has instructions to run celestia-node using Docker. If you are looking for instructions to run celestia-node using a binary, please refer to the celestia-node page.

    Using Docker is the easiest way to run celestia-node for most users. Docker is a containerization platform that allows you to run celestia-node in an isolated environment.

    This means that you can run celestia-node on your machine without having to worry about installing and configuring all of the dependencies required to run the node.

    If you would like to learn more about key management in Docker, visit the Docker and cel-key section.

    The easiest way to install Docker is to use the Docker Desktop installer or Ubuntu. You can follow the instructions for your operating system.

    Prerequisites

    Quick start

    1. Set the network you would like to run your node on:

      bash
      export NETWORK=celestia
      export NETWORK=celestia
      bash
      export NETWORK=mocha
      export NETWORK=mocha
      bash
      export NETWORK=arabica
      export NETWORK=arabica
    2. Set the node type

      bash
      export NODE_TYPE=light
      export NODE_TYPE=light
      bash
      export NODE_TYPE=bridge
      export NODE_TYPE=bridge
      bash
      export NODE_TYPE=full
      export NODE_TYPE=full
    3. Set an RPC endpoint for either Mainnet Beta, Mocha, or Arabica using the bare URL (without http or https):

      bash
      export RPC_URL=this-is-an-rpc-url.com
      export RPC_URL=this-is-an-rpc-url.com
    4. Run the image from the command line:

      bash
      docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
           ghcr.io/celestiaorg/celestia-node:v0.15.0 \
           celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK
      docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
           ghcr.io/celestiaorg/celestia-node:v0.15.0 \
      @@ -55,11 +55,11 @@
           ghcr.io/celestiaorg/celestia-node:v0.16.0 \
           celestia $NODE_TYPE start --core.ip $RPC_URL --p2p.network $NETWORK

    Congratulations! You now have a celestia-node running!

    If you would like to run the node with custom flags, you can refer to the celestia-node tutorial page. Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    Light node setup with persistent storage

    If you delete a container that you started above, all data will be lost. To avoid this, you can mount a volume to the container. This will allow you to persist data even after the container is deleted.

    First, you will need to create a directory on your host machine. This directory will be used to store the data for the container. Create a directory on your host machine and give it a name. For example, you can name it my-node-store:

    bash
    cd $HOME
     mkdir my-node-store
    cd $HOME
    -mkdir my-node-store

    Now, you can mount this directory to the container. Before mounting a volume, you may need to set permissions for the user on the host machine by running:

    bash
    sudo chown 10001:10001 $HOME/my-node-store
    sudo chown 10001:10001 $HOME/my-node-store
    bash
    # you're good to go 😎
    # you're good to go 😎

    Initialize the node store and key

    In order to mount a volume to the container, you need to specify the path to the volume. When you run your container, you can specify the path to the volume using the --volume (or -v for short) flag. In this command, we'll create our key and initialize the node store, using the variables we set in the quick start section:

    bash
    # --volume == -v [local path]:[container path]
    +mkdir my-node-store

    Now, you can mount this directory to the container. Before mounting a volume, you may need to set permissions for the user on the host machine by running:

    bash
    sudo chown 10001:10001 $HOME/my-node-store
    sudo chown 10001:10001 $HOME/my-node-store
    bash
    # you're good to go 😎
    # you're good to go 😎

    Initialize the node store and key

    In order to mount a volume to the container, you need to specify the path to the volume. When you run your container, you can specify the path to the volume using the --volume (or -v for short) flag. In this command, we'll create our key and initialize the node store, using the variables we set in the quick start section:

    bash
    # --volume == -v [local path]:[container path]
     docker run [args...] -v $HOME/my-node-store:/home/celestia \
         celestia $NODE_TYPE init [args...]
    # --volume == -v [local path]:[container path]
     docker run [args...] -v $HOME/my-node-store:/home/celestia \
    -    celestia $NODE_TYPE init [args...]

    An example init command will look similar to below:

    bash
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
    +    celestia $NODE_TYPE init [args...]

    An example init command will look similar to below:

    bash
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
         -v $HOME/my-node-store:/home/celestia \
         ghcr.io/celestiaorg/celestia-node:v0.15.0 \
         celestia light init --p2p.network $NETWORK
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
    @@ -81,7 +81,7 @@
     docker run [...args] -v $HOME/my-node-store:/home/celestia \
         celestia <node-type> start [...args]
    # --volume == -v [local path]:[container path]
     docker run [...args] -v $HOME/my-node-store:/home/celestia \
    -    celestia <node-type> start [...args]

    A full start command will look similar to below.

    bash
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
    +    celestia <node-type> start [...args]

    A full start command will look similar to below.

    bash
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
         -v $HOME/my-node-store:/home/celestia \
         ghcr.io/celestiaorg/celestia-node:v0.15.0 \
         celestia light start --core.ip $RPC_URL
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
    @@ -99,8 +99,8 @@
         celestia light start --core.ip $RPC_URL
    docker run -e NODE_TYPE=$NODE_TYPE -e P2P_NETWORK=$NETWORK \
         -v $HOME/my-node-store:/home/celestia \
         ghcr.io/celestiaorg/celestia-node:v0.16.0 \
    -    celestia light start --core.ip $RPC_URL

    Congratulations! You now have a node running with persistent storage.

    Video walkthrough

    2.5 minute version

    Troubleshooting

    For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find instructions for installing WSL.

    - + celestia light start --core.ip $RPC_URL

    Congratulations! You now have a node running with persistent storage.

    Video walkthrough

    2.5 minute version

    Troubleshooting

    For security purposes Celestia expects to interact with the your node's keys in a read-only manner. This is enforced using linux style permissions on the filesystem. Windows NTFS does not support these types of permissions. As a result the recommended path for Windows users to mount a persisted volume is to do so within WSL. You can find instructions for installing WSL.

    + \ No newline at end of file diff --git a/pr-1699/nodes/environment.html b/pr-1699/nodes/environment.html index a202784416..01a8c32f91 100644 --- a/pr-1699/nodes/environment.html +++ b/pr-1699/nodes/environment.html @@ -12,7 +12,7 @@ - + @@ -39,7 +39,7 @@

    Development environment

    This page will go over setting up your development environment to run Celestia software. This environment can be used for development, building binaries, and running nodes.

    Install dependencies

    1. If you are on Ubuntu, first update and upgrade your OS:

      bash
      sudo apt update && sudo apt upgrade -y
      sudo apt update && sudo apt upgrade -y
      bash
      sudo yum update
      sudo yum update
    2. Install essential packages that are necessary to execute many tasks like downloading files, compiling, and monitoring the node:

      bash
      sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \
      +

    Development environment

    This page will go over setting up your development environment to run Celestia software. This environment can be used for development, building binaries, and running nodes.

    Install dependencies

    1. If you are on Ubuntu, first update and upgrade your OS:

      bash
      sudo apt update && sudo apt upgrade -y
      sudo apt update && sudo apt upgrade -y
      bash
      sudo yum update
      sudo yum update
    2. Install essential packages that are necessary to execute many tasks like downloading files, compiling, and monitoring the node:

      bash
      sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \
       git make ncdu -y
      sudo apt install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \
       git make ncdu -y
      bash
      sudo yum install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \
       git make ncdu -y
      sudo yum install curl tar wget aria2 clang pkg-config libssl-dev jq build-essential \
      @@ -53,7 +53,7 @@
       /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
       
       # then install wget & jq
      -brew install wget && brew install jq

    Install Golang

    celestia-node is written in Golang so we must install Golang to build and run our node.

    1. Set the version for your desired network:

      bash
      ver="1.22.0"
      ver="1.22.0"
      bash
      ver="1.23.0"
      ver="1.23.0"
      bash
      ver="1.23.0"
      ver="1.23.0"
    2. Download and install Golang:

      bash
      cd $HOME
      +brew install wget && brew install jq

    Install Golang

    celestia-node is written in Golang so we must install Golang to build and run our node.

    1. Set the version for your desired network:

      bash
      ver="1.22.0"
      ver="1.22.0"
      bash
      ver="1.23.0"
      ver="1.23.0"
      bash
      ver="1.23.0"
      ver="1.23.0"
    2. Download and install Golang:

      bash
      cd $HOME
       wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
       sudo rm -rf /usr/local/go
       sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
      @@ -85,12 +85,12 @@
       wget "https://golang.org/dl/go$ver.darwin-amd64.tar.gz"
       sudo rm -rf /usr/local/go
       sudo tar -C /usr/local -xzf "go$ver.darwin-amd64.tar.gz"
      -rm "go$ver.darwin-amd64.tar.gz"
    3. Add your /usr/local/go/bin directory to your $PATH if you have not already:

      bash
      echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
      +rm "go$ver.darwin-amd64.tar.gz"
    4. Add your /usr/local/go/bin directory to your $PATH if you have not already:

      bash
      echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
       source $HOME/.bash_profile
      echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
       source $HOME/.bash_profile
      bash
      echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.zshrc
       source $HOME/.zshrc
      echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.zshrc
      -source $HOME/.zshrc

      TIP

      Use echo $SHELL to figure out what type of shell you are using!

    5. To verify that the correct version of Go was installed correctly run:

      bash
      go version
      go version

    The output will show the version installed.

    - +source $HOME/.zshrc

    TIP

    Use echo $SHELL to figure out what type of shell you are using!

  • To verify that the correct version of Go was installed correctly run:

    bash
    go version
    go version
  • The output will show the version installed.

    + \ No newline at end of file diff --git a/pr-1699/nodes/full-storage-node.html b/pr-1699/nodes/full-storage-node.html index ca10da6e56..9f06c20e90 100644 --- a/pr-1699/nodes/full-storage-node.html +++ b/pr-1699/nodes/full-storage-node.html @@ -11,7 +11,7 @@ - + @@ -38,7 +38,7 @@

    Setting up a Celestia full storage Node

    This tutorial will guide you through setting up a Celestia full storage node, which is a celestia-node that doesn't connect to celestia-app (hence not a consensus node), but stores all the data.

    Overview of full storage nodes

    Full storage nodes are Celestia nodes that store all the data. Full storage nodes send block shares, headers, and fraud proofs to light nodes. The light nodes gossip headers, fraud proofs, and sometimes block shares, between one another.

    Full storage node

    Hardware requirements

    The following hardware minimum requirements are recommended for running the full storage node:

    • Memory: 16 GB RAM (minimum)
    • CPU: 6 cores
    • Disk: 10 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Setting up your full storage node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Setup the dependencies

    You can follow the tutorial for setting up your dependencies

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Run the full storage node

    Initialize the full storage node

    Run the following command:

    sh
    celestia full init
    celestia full init
    sh
    celestia full init --p2p.network mocha
    celestia full init --p2p.network mocha
    sh
    celestia full init --p2p.network arabica
    celestia full init --p2p.network arabica

    Start the full storage node

    Start the full storage node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get/submit state-related information, such as the ability to submit PayForBlob transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia full start --core.ip <URI>
    celestia full start --core.ip <URI>

    Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

    Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

    You can create your key for your node by following the cel-key instructions

    Once you start the full storage node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

    sh
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>

    TIP

    You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

    You can get testnet tokens from:

    NOTE

    If you are running a full-storage node for your sovereign rollup, it is highly recommended to request Arabica devnet tokens as Arabica has the latest changes that can be used to test for developing your sovereign rollup. You can still use Mocha testnet as well, it is just mostly used for validator operations.

    Optional: run the full storage node with a custom key

    In order to run a full storage node using a custom key:

    1. The custom key must exist inside the celestia full storage node directory at the correct path (default: ~/.celestia-full/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia full start --core.ip <URI> \
    +

    Setting up a Celestia full storage Node

    This tutorial will guide you through setting up a Celestia full storage node, which is a celestia-node that doesn't connect to celestia-app (hence not a consensus node), but stores all the data.

    Overview of full storage nodes

    Full storage nodes are Celestia nodes that store all the data. Full storage nodes send block shares, headers, and fraud proofs to light nodes. The light nodes gossip headers, fraud proofs, and sometimes block shares, between one another.

    Full storage node

    Hardware requirements

    The following hardware minimum requirements are recommended for running the full storage node:

    • Memory: 16 GB RAM (minimum)
    • CPU: 6 cores
    • Disk: 10 TB SSD Storage
    • Bandwidth: 1 Gbps for Download/1 Gbps for Upload

    Setting up your full storage node

    The following tutorial is done on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Setup the dependencies

    You can follow the tutorial for setting up your dependencies

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Run the full storage node

    Initialize the full storage node

    Run the following command:

    sh
    celestia full init
    celestia full init
    sh
    celestia full init --p2p.network mocha
    celestia full init --p2p.network mocha
    sh
    celestia full init --p2p.network arabica
    celestia full init --p2p.network arabica

    Start the full storage node

    Start the full storage node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get/submit state-related information, such as the ability to submit PayForBlob transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia full start --core.ip <URI>
    celestia full start --core.ip <URI>

    Using an RPC of your own, or one from the list on the Mocha testnet page or list on the Arabica devnet page, start your node.

    Connecting to a core endpoint with --core.ip string provides the light node with access to state queries (reading balances, submitting transactions, and other state-related queries).

    You can create your key for your node by following the cel-key instructions

    Once you start the full storage node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

    sh
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>
    ./cel-key list --node.type full --keyring-backend test --p2p.network <network>

    TIP

    You do not need to declare a network for Mainnet Beta. Refer to the chain ID section on the troubleshooting page for more information

    You can get testnet tokens from:

    NOTE

    If you are running a full-storage node for your sovereign rollup, it is highly recommended to request Arabica devnet tokens as Arabica has the latest changes that can be used to test for developing your sovereign rollup. You can still use Mocha testnet as well, it is just mostly used for validator operations.

    Optional: run the full storage node with a custom key

    In order to run a full storage node using a custom key:

    1. The custom key must exist inside the celestia full storage node directory at the correct path (default: ~/.celestia-full/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia full start --core.ip <URI> \
       --keyring.keyname <name-of-custom-key> \
    celestia full start --core.ip <URI> \
       --keyring.keyname <name-of-custom-key> \
    sh
    celestia full start --core.ip <URI> \
       --keyring.keyname <name-of-custom-key> \
    @@ -48,8 +48,8 @@
       --keyring.keyname <name-of-custom-key> \
       --p2p.network arabica
    celestia full start --core.ip <URI> \
       --keyring.keyname <name-of-custom-key> \
    -  --p2p.network arabica

    Optional: Migrate node id to another server

    To migrate a full storage node ID:

    1. You need to back up two files located in the celestia-full node directory at the correct path (default: ~/.celestia-full/keys).
    2. Upload the files to the new server and start the node.

    Optional: start the full storage node with SystemD

    If you would like to run the full storage node as a background process, follow the SystemD tutorial.

    With that, you are now running a Celestia full storage node.

    Stop the full storage node

    In order to gracefully stop the full storage node, use Control + C in the terminal window where the node is running. Be sure to only do this once as the shutdown will not be instantaneous.

    - + --p2p.network arabica

    Optional: Migrate node id to another server

    To migrate a full storage node ID:

    1. You need to back up two files located in the celestia-full node directory at the correct path (default: ~/.celestia-full/keys).
    2. Upload the files to the new server and start the node.

    Optional: start the full storage node with SystemD

    If you would like to run the full storage node as a background process, follow the SystemD tutorial.

    With that, you are now running a Celestia full storage node.

    Stop the full storage node

    In order to gracefully stop the full storage node, use Control + C in the terminal window where the node is running. Be sure to only do this once as the shutdown will not be instantaneous.

    + \ No newline at end of file diff --git a/pr-1699/nodes/hardfork-process.html b/pr-1699/nodes/hardfork-process.html index 3f5d06e75e..7a4fcd27de 100644 --- a/pr-1699/nodes/hardfork-process.html +++ b/pr-1699/nodes/hardfork-process.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Celestia hardfork process

    Blockchain networks often times need to upgrade with new features which require coordination work among the validators prior to activating the upgrades.

    This process is called a hardfork or a network upgrade. In those events, the Celestia Labs team will be coordinating with the validators on what they need to do in order to be ready for an upcoming hardfork.

    Hardforks are not backward-compatible with older versions of the network software which is why it is important that validators upgrade their software to continue validating on the network after the network upgrades.

    General process

    The general process can be broken down into several components:

    • Hardfork specifications and features (defined by description of features and code implementation of those features).
    • Binary used to add those features (a new binary release with those features will be provided by Celestia team in order for validators to upgrade their nodes to the new binary).
    • A block number for when the network upgrades (even if validators upgrade their binary to be hardfork ready, the network upgrade does not happen right away, but some short time in the future at a specific block number).
    • Testing of the features (happens on testnets first prior to activating on mainnet in order to ensure the network can upgrade securely).

    The two testnets where hardforks are deployed are:

    Lemongrass hardfork

    The Lemongrass hardfork is the first consensus layer breaking change since Celestia's Mainnet Beta genesis block. The Lemongrass hardfork includes all of the CIPs listed in CIP-17. The Lemongrass hardfork will be executed on Arabica, then Mocha, then Mainnet Beta. The hardfork will take place at an "upgrade height" that will be coordinated offline on a per-network basis. The upgrade heights will be announced in advance (see Network upgrades) to give node operators time to download and start a compatible binary prior to the upgrade height.

    • If you are a consensus node or validator operator: you will need to download and run a celestia-app binary >= v2.0.0 prior to the --v2-upgrade-height to remain on the canonical chain. You do not need to use a tool like cosmovisor to upgrade the binary at the upgrade height.
    • If you are a DA node operator, you will need to download and run a compatible celestia-node binary >= v0.16.0-rc0 prior to the upgrade height.
    NetworkChain IDDate and approximate time--v2-upgrade-height
    Arabicaarabica-112024/08/19 @ 14:00 UTC1751707
    Mochamocha-42024/08/28 @ 14:00 UTC2585031
    Mainnet Betacelestia2024/09/18 @ 14:00 UTC2371495
    - +

    Celestia hardfork process

    Blockchain networks often times need to upgrade with new features which require coordination work among the validators prior to activating the upgrades.

    This process is called a hardfork or a network upgrade. In those events, the Celestia Labs team will be coordinating with the validators on what they need to do in order to be ready for an upcoming hardfork.

    Hardforks are not backward-compatible with older versions of the network software which is why it is important that validators upgrade their software to continue validating on the network after the network upgrades.

    General process

    The general process can be broken down into several components:

    • Hardfork specifications and features (defined by description of features and code implementation of those features).
    • Binary used to add those features (a new binary release with those features will be provided by Celestia team in order for validators to upgrade their nodes to the new binary).
    • A block number for when the network upgrades (even if validators upgrade their binary to be hardfork ready, the network upgrade does not happen right away, but some short time in the future at a specific block number).
    • Testing of the features (happens on testnets first prior to activating on mainnet in order to ensure the network can upgrade securely).

    The two testnets where hardforks are deployed are:

    Lemongrass hardfork

    The Lemongrass hardfork is the first consensus layer breaking change since Celestia's Mainnet Beta genesis block. The Lemongrass hardfork includes all of the CIPs listed in CIP-17. The Lemongrass hardfork will be executed on Arabica, then Mocha, then Mainnet Beta. The hardfork will take place at an "upgrade height" that will be coordinated offline on a per-network basis. The upgrade heights will be announced in advance (see Network upgrades) to give node operators time to download and start a compatible binary prior to the upgrade height.

    • If you are a consensus node or validator operator: you will need to download and run a celestia-app binary >= v2.0.0 prior to the --v2-upgrade-height to remain on the canonical chain. You do not need to use a tool like cosmovisor to upgrade the binary at the upgrade height.
    • If you are a DA node operator, you will need to download and run a compatible celestia-node binary >= v0.16.0-rc0 prior to the upgrade height.
    NetworkChain IDDate and approximate time--v2-upgrade-height
    Arabicaarabica-112024/08/19 @ 14:00 UTC1751707
    Mochamocha-42024/08/28 @ 14:00 UTC2585031
    Mainnet Betacelestia2024/09/18 @ 14:00 UTC2371495
    + \ No newline at end of file diff --git a/pr-1699/nodes/ibc-relayer.html b/pr-1699/nodes/ibc-relayer.html index 2d679acf06..41c27118f3 100644 --- a/pr-1699/nodes/ibc-relayer.html +++ b/pr-1699/nodes/ibc-relayer.html @@ -11,7 +11,7 @@ - + @@ -492,8 +492,8 @@ policy = 'allow' list = [ ['transfer', 'channel-3108'], # mocha-4 -]

    Start the relayer

    Start the relayer via hermes start

    Transfer

    The Celestia state machine is built with the IBC transfer module, allowing for the native Celestia token to be transferred to any other IBC enabled chain. Transfer can be initialized through the celestia-appd CLI. Information can be found via the help label as follows:

    bash
    celestia-appd tx ibc-transfer transfer --help
    celestia-appd tx ibc-transfer transfer --help

    Token filter

    The transfer module uses a token filter middleware which serves to prevent non-native Celestia tokens from being on Celestia. If a user is to try to send a token from another chain across, it will be simply rejected and the token returned back to the user.

    - +]

    Start the relayer

    Start the relayer via hermes start

    Transfer

    The Celestia state machine is built with the IBC transfer module, allowing for the native Celestia token to be transferred to any other IBC enabled chain. Transfer can be initialized through the celestia-appd CLI. Information can be found via the help label as follows:

    bash
    celestia-appd tx ibc-transfer transfer --help
    celestia-appd tx ibc-transfer transfer --help

    Token filter

    The transfer module uses a token filter middleware which serves to prevent non-native Celestia tokens from being on Celestia. If a user is to try to send a token from another chain across, it will be simply rejected and the token returned back to the user.

    + \ No newline at end of file diff --git a/pr-1699/nodes/instantiate-testnet.html b/pr-1699/nodes/instantiate-testnet.html index 969937f793..102abb7bfe 100644 --- a/pr-1699/nodes/instantiate-testnet.html +++ b/pr-1699/nodes/instantiate-testnet.html @@ -11,7 +11,7 @@ - + @@ -58,8 +58,8 @@ NODE_ID=$(celestia-appd tendermint show-node-id) PORT_NUMBER=26656

    Note that the default port is 26656

    Now you can run the following command to output your validator node address:

    sh
    PEER="$NODE_ID@$IP_ADDRESS:$PORT_NUMBER"
     echo $PEER
    PEER="$NODE_ID@$IP_ADDRESS:$PORT_NUMBER"
    -echo $PEER

    The output is your validator node address which you can share with other validators so they can peer with you.

    Instantiate the network

    You can start your node by running the following command:

    sh
    celestia-appd start
    celestia-appd start

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    Now you have a new Celestia testnet to play around with!

    - +echo $PEER

    The output is your validator node address which you can share with other validators so they can peer with you.

    Instantiate the network

    You can start your node by running the following command:

    sh
    celestia-appd start
    celestia-appd start

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    Now you have a new Celestia testnet to play around with!

    + \ No newline at end of file diff --git a/pr-1699/nodes/light-node.html b/pr-1699/nodes/light-node.html index 562825552d..f813b4ec05 100644 --- a/pr-1699/nodes/light-node.html +++ b/pr-1699/nodes/light-node.html @@ -11,7 +11,7 @@ - + @@ -38,9 +38,9 @@

    Setting up a Celestia light node

    This tutorial will guide you through setting up a Celestia light node, which will allow you to perform data availability sampling (DAS) on Celestia's data availability (DA) network.

    Overview of light nodes

    Light nodes ensure data availability. This is the most common way to interact with Celestia networks.

    light-node

    Light nodes have the following behavior:

    1. They listen for ExtendedHeaders, i.e. wrapped “raw” headers, that notify Celestia nodes of new block headers and relevant DA metadata.
    2. They perform DAS on the received headers

    Hardware requirements

    The following minimum hardware requirements are recommended for running a light node:

    • Memory: 500 MB RAM (minimum)
    • CPU: Single Core
    • Disk: 100 GB SSD Storage
    • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

    Setting up your light node

    This tutorial was performed on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up dependencies on the setting up environment page.

    Install celestia-node

    Install the celestia binary by building and installing celestia-node.

    Initialize the light node

    Run the following command:

    sh
    celestia light init
    celestia light init
    sh
    celestia light init --p2p.network mocha
    celestia light init --p2p.network mocha
    sh
    celestia light init --p2p.network arabica
    celestia light init --p2p.network arabica

    The output in your terminal will show the location of your node store and config. It will also show confirmation that the node store has been initialized.

    Start the light node

    Start the light node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get and submit state-related information, such as the ability to submit PayForBlobs transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    sh
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    sh
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica

    Tip: you can replace the core.ip with a consensus node RPC endpoint from mainnet, mocha, or arabica.

    Keys and wallets

    You can create your key for your node by running the following command with the cel-key utility in the celestia-node directory:

    sh
    ./cel-key add <key-name> --keyring-backend test \
    +

    Setting up a Celestia light node

    This tutorial will guide you through setting up a Celestia light node, which will allow you to perform data availability sampling (DAS) on Celestia's data availability (DA) network.

    Overview of light nodes

    Light nodes ensure data availability. This is the most common way to interact with Celestia networks.

    light-node

    Light nodes have the following behavior:

    1. They listen for ExtendedHeaders, i.e. wrapped “raw” headers, that notify Celestia nodes of new block headers and relevant DA metadata.
    2. They perform DAS on the received headers

    Hardware requirements

    The following minimum hardware requirements are recommended for running a light node:

    • Memory: 500 MB RAM (minimum)
    • CPU: Single Core
    • Disk: 100 GB SSD Storage
    • Bandwidth: 56 Kbps for Download/56 Kbps for Upload

    Setting up your light node

    This tutorial was performed on an Ubuntu Linux 20.04 (LTS) x64 instance machine.

    Set up dependencies on the setting up environment page.

    Install celestia-node

    Install the celestia binary by building and installing celestia-node.

    Initialize the light node

    Run the following command:

    sh
    celestia light init
    celestia light init
    sh
    celestia light init --p2p.network mocha
    celestia light init --p2p.network mocha
    sh
    celestia light init --p2p.network arabica
    celestia light init --p2p.network arabica

    The output in your terminal will show the location of your node store and config. It will also show confirmation that the node store has been initialized.

    Start the light node

    Start the light node with a connection to a validator node's gRPC endpoint (which is usually exposed on port 9090):

    In order for access to the ability to get and submit state-related information, such as the ability to submit PayForBlobs transactions, or query for the node's account balance, a gRPC endpoint of a validator (core) node must be passed as directed below.

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    sh
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    celestia light start --core.ip rpc.celestia.pops.one --p2p.network celestia
    sh
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --core.ip rpc-mocha.pops.one --p2p.network mocha
    sh
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica
    celestia light start --core.ip validator-1.celestia-arabica-11.com --p2p.network arabica

    Tip: you can replace the core.ip with a consensus node RPC endpoint from mainnet, mocha, or arabica.

    Keys and wallets

    You can create your key for your node by running the following command with the cel-key utility in the celestia-node directory:

    sh
    ./cel-key add <key-name> --keyring-backend test \
         --node.type light --p2p.network <network>
    ./cel-key add <key-name> --keyring-backend test \
    -    --node.type light --p2p.network <network>

    You can start your light node with the key created above by running the following command:

    sh
    celestia light start --keyring.keyname my_celes_key \
    +    --node.type light --p2p.network <network>

    You can start your light node with the key created above by running the following command:

    sh
    celestia light start --keyring.keyname my_celes_key \
         --core.ip consensus.lunaroasis.net
    celestia light start --keyring.keyname my_celes_key \
         --core.ip consensus.lunaroasis.net
    sh
    celestia light start --keyring.keyname my_celes_key \
         --core.ip rpc-mocha.pops.one --p2p.network mocha
    celestia light start --keyring.keyname my_celes_key \
    @@ -50,7 +50,7 @@
         --core.ip validator-1.celestia-arabica-11.com \
         --p2p.network arabica

    Once you start the light node, a wallet key will be generated for you. You will need to fund that address with testnet tokens to pay for PayForBlob transactions.

    You can find the address using the RPC CLI or by running the following command in the celestia-node directory:

    sh
    ./cel-key list --node.type light --keyring-backend test \
         --p2p.network <network>
    ./cel-key list --node.type light --keyring-backend test \
    -    --p2p.network <network>

    Testnet tokens

    You have two networks to get testnet tokens from:

    You can request funds to your wallet address using the following command in Discord:

    console
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is the celestia1****** address generated when you created the wallet.

    Optional: run the light node with a custom key

    In order to run a light node using a custom key:

    1. The custom key must exist inside the celestia light node directory at the correct path (default: ~/.celestia-light/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia light start --core.ip <URI> \
    +    --p2p.network <network>

    Testnet tokens

    You have two networks to get testnet tokens from:

    You can request funds to your wallet address using the following command in Discord:

    console
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is the celestia1****** address generated when you created the wallet.

    Optional: run the light node with a custom key

    In order to run a light node using a custom key:

    1. The custom key must exist inside the celestia light node directory at the correct path (default: ~/.celestia-light/keys/keyring-test)
    2. The name of the custom key must be passed upon start, like so:
    sh
    celestia light start --core.ip <URI> \
         --keyring.keyname <name-of-custom-key> \
    celestia light start --core.ip <URI> \
         --keyring.keyname <name-of-custom-key> \
    sh
    celestia light start --core.ip <URI> \
         --keyring.keyname <name-of-custom-key> \
    @@ -60,8 +60,8 @@
         --keyring.keyname <name-of-custom-key> \
         --p2p.network mocha
    celestia light start --core.ip <URI> \
         --keyring.keyname <name-of-custom-key> \
    -    --p2p.network mocha

    Optional: Migrate node id to another server

    To migrate a light node ID:

    1. You need to back up two files located in the celestia-light node directory at the correct path (default: ~/.celestia-light/keys).
    2. Upload the files to the new server and start the node.

    Optional: start light node with SystemD

    Follow the tutorial on setting up the light node as a background process with SystemD.

    Data availability sampling

    With your light node running, you can check out this tutorial on submitting PayForBlob transactions.

    - + --p2p.network mocha

    Optional: Migrate node id to another server

    To migrate a light node ID:

    1. You need to back up two files located in the celestia-light node directory at the correct path (default: ~/.celestia-light/keys).
    2. Upload the files to the new server and start the node.

    Optional: start light node with SystemD

    Follow the tutorial on setting up the light node as a background process with SystemD.

    Data availability sampling

    With your light node running, you can check out this tutorial on submitting PayForBlob transactions.

    + \ No newline at end of file diff --git a/pr-1699/nodes/mainnet.html b/pr-1699/nodes/mainnet.html index 5b9735876b..d9a27d8ee5 100644 --- a/pr-1699/nodes/mainnet.html +++ b/pr-1699/nodes/mainnet.html @@ -14,7 +14,7 @@ - + @@ -41,8 +41,8 @@

    Mainnet Beta

    Mainnet Beta

    Welcome to the guide for Celestia’s Mainnet Beta, the production network that marks the pinnacle of Celestia’s evolution since its inception in 2019. This network is where all components of the Celestia ecosystem come to life in a real-world environment.

    Mainnet Beta is the culmination of rigorous community testing, upgrades, and feedback. It serves as the platform for deploying mainnet rollups and applications.

    Network stability and upgrades

    Mainnet Beta is a stable network, but will still receive updates and improvements. Any changes or upgrades will be coordinated with node operators and the broader Celestia community to ensure seamless integration and minimal service interruptions.

    As we step into unexplored territories with groundbreaking technologies like data availability sampling, it's crucial to remember that Mainnet Beta remains experimental at this stage. While the network is live and functional, users may encounter occasional instability or reduced performance.

    Network details

    DetailValue
    Chain IDcelestia
    Genesis hash6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872
    Genesis file https://github.com/celestiaorg/networks/blob/master/celestia/genesis.json
    Peers file https://github.com/celestiaorg/networks/blob/master/celestia/peers.txt
    Validators 100

    Software version numbers

    SoftwareVersion
    celestia-nodev0.15.0
    celestia-appv1.13.0

    Network parameters

    Full network parameters, such as max bytes, can be found in the celestia-app specifications.

    CIP-13 has been drafted to create a living document for these parameters as a part of the CIP process.

    Maximum bytes

    There is a hard limit on the total blob size in a transaction, which is determined by the effective maximum square size. Given that the current governance maximum square size is 64, the total blob size in a transaction must be slightly less than ~2 MiB, or 1,973,786 bytes to be exact.

    The following provides an approximation of the maximum block size:

    • The maximum square size is 64x64, which gives us 4096 shares.
    • One share is reserved for the PFB transaction, leaving us with 4095 shares.
    • The first sparse share has 478 bytes available, and the remaining sparse shares have 482 bytes each.

    This can be calculated as follows:

    Total Bytes=(1×478bytes)+(4094×482bytes)=1,973,786bytes

    Please note that there isn't a precise upper bound on the maximum total blob size. It depends on several factors:

    • The maximum square size, which is determined by a governance parameter and a versioned constant.
    • The maximum bytes in a block, which is determined by a governance parameter and a hard-coded constant in CometBFT.
    • The number of shares occupied by the PFB transaction share.

    These factors can cause the maximum total blob size that can be included in one block to vary.

    See the code in celestia-app and celestia-node.

    Integrations

    This guide contains the relevant sections for how to connect to Mainnet Beta, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

    Here is a list of options of the types of nodes you can run in order to participate in Mainnet Beta:

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Consensus nodes

    Community consensus RPC endpoints

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs.

    • public-celestia-rpc.numia.xyz
    • celestia-rpc.mesa.newmetric.xyz
    • rpc.celestia.pops.one
    • rpc.lunaroasis.net
    • rpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com
    • celestia-rpc.spidey.services
    • rpc-celestia.contributiondao.com
    • celestia.rpc.stakin-nodes.com
    • celestia.cumulo.org.es
    • rpc-celestia.mzonder.com
    • rpc-celestia-01.stakeflow.io
    • rpc-celestia.alphab.ai
    • rpc-celestia-full.avril14th.org
    • celestia-rpc.easy2stake.com
    • celestia.rpc.kjnodes.com
    • celestia-rpc.0xcryptovestor.com
    • rpc-celestia-mainnet.trusted-point.com
    • celestia.rpc.archives.validao.xyz
    • rpc-archive.celestia.bitszn.com
    • celestia-rpc.f5nodes.com
    • celestia-rpc.chainode.tech:33373
    • rpc-celestia.staker.space
    • celestia-rpc.noders.services
    • celestia.moonli.me
    • celestia-mainnet-rpc.itrocket.net:443
    • rpc.celestia.mainnet.dteam.tech:443

    Community API endpoints

    • public-celestia-lcd.numia.xyz
    • celestia-rest.mesa.newmetric.xyz
    • api.celestia.pops.one
    • api.lunaroasis.net
    • api.celestia.nodestake.top
    • celestia-rpc.brightlystake.com/api
    • celestia-api.spidey.services
    • api-celestia.contributiondao.com
    • celestia.rest.stakin-nodes.com
    • celestia.api.cumulo.org.es
    • api-celestia.mzonder.com
    • api-celestia-01.stakeflow.io
    • api-celestia.alphab.ai
    • api-celestia-full.avril14th.org
    • celestia-lcd.easy2stake.com
    • celestia.api.kjnodes.com
    • api-celestia-mainnet.trusted-point.com
    • celestia.rest.archives.validao.xyz
    • api-archive.celestia.bitszn.com
    • celestia-api.f5nodes.com
    • celestia-api.chainode.tech
    • api-celestia.staker.space
    • celestia-api.noders.services
    • celestia.moonli.me/api
    • celestia-mainnet-api.itrocket.net:443
    • api.celestia.mainnet.dteam.tech:443

    Community gRPC endpoints

    • public-celestia-grpc.numia.xyz
    • celestia-grpc.mesa.newmetric.xyz
    • grpc.celestia.pops.one
    • grpc.lunaroasis.net:443
    • grpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com:9090
    • celestia-grpc.spidey.services
    • grpc-celestia.contributiondao.com
    • celestia.grpc.stakin-nodes.com:443
    • celestia.grpc.cumulo.org.es:443
    • grpc-celestia.mzonder.com:443
    • grpc-celestia-01.stakeflow.io:15002
    • rpc-celestia.alphab.ai:9090
    • grpc-celestia-full.avril14th.org
    • celestia.grpc.kjnodes.com:443
    • grpc-celestia-mainnet.trusted-point.com:9095
    • celestia.grpc.archives.validao.xyz:9090
    • gprc-archive.celestia.bitszn.com
    • celestia-grpc.f5nodes.com:9390
    • celestia-grpc.chainode.tech:443
    • grpc-celestia.staker.space
    • celestia-grpc.noders.services:11090
    • celestia-mainnet-grpc.itrocket.net:443
    • grpc.celestia.mainnet.dteam.tech:28090

    Community WebSocket endpoints

    • wss://celestia-ws.chainode.tech:33373/websocket
    • wss://celestia-mainnet-ws.itrocket.net:443/websocket
    • wss://rpc.celestia.mainnet.dteam.tech:443/websocket

    Data availability nodes

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    TIP

    bash
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>

    Bridge nodes

    Not all RPC endpoints guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

    RPCs for DA nodes to initialise or start your celestia-node to Mainnet Beta with:

    • public-celestia-consensus.numia.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-consensus.mesa.newmetric.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.pops.one
      • gRPC: port 9090
      • RPC: port 26657
    • consensus.lunaroasis.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc-celestia.alphab.ai
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-mainnet-consensus.itrocket.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.mainnet.dteam.tech
      • gRPC: port 28090
      • RPC: 28657
    • celestia-consensus-mainnet.noders.services
      • gRPC: port 9080
      • RPC: port 26557

    DA full and light nodes might have troubles connecting to the networks, so you can check out this Grafana dashboard to see health/uptime status of DA bootstrappers (now celestia network only).

    You can find the status of these endpoints.

    Archival DA RPC endpoints

    By default, light nodes prune recent data to save on storage space. Archival data availability (DA) nodes store the entire history of the chain without pruning any data so all data available data is retrievable. You can read more about light vs archival nodes.

    Grove archival endpoints

    You can provision your own Celestia Archival endpoint on Grove. Learn more about Celestia on Grove, or find the fully supported spec.

    There is a sandbox you can leverage for testing straight in your browser:

    grove-sandbox

    Explorers

    There are multiple explorers you can use for Mainnet Beta:

    Analytics

    The following websites provide analytics for Celestia:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mainnet Beta:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    - +

    Mainnet Beta

    Mainnet Beta

    Welcome to the guide for Celestia’s Mainnet Beta, the production network that marks the pinnacle of Celestia’s evolution since its inception in 2019. This network is where all components of the Celestia ecosystem come to life in a real-world environment.

    Mainnet Beta is the culmination of rigorous community testing, upgrades, and feedback. It serves as the platform for deploying mainnet rollups and applications.

    Network stability and upgrades

    Mainnet Beta is a stable network, but will still receive updates and improvements. Any changes or upgrades will be coordinated with node operators and the broader Celestia community to ensure seamless integration and minimal service interruptions.

    As we step into unexplored territories with groundbreaking technologies like data availability sampling, it's crucial to remember that Mainnet Beta remains experimental at this stage. While the network is live and functional, users may encounter occasional instability or reduced performance.

    Network details

    DetailValue
    Chain IDcelestia
    Genesis hash6BE39EFD10BA412A9DB5288488303F5DD32CF386707A5BEF33617F4C43301872
    Genesis file https://github.com/celestiaorg/networks/blob/master/celestia/genesis.json
    Peers file https://github.com/celestiaorg/networks/blob/master/celestia/peers.txt
    Validators 100

    Software version numbers

    SoftwareVersion
    celestia-nodev0.15.0
    celestia-appv1.13.0

    Network parameters

    Full network parameters, such as max bytes, can be found in the celestia-app specifications.

    CIP-13 has been drafted to create a living document for these parameters as a part of the CIP process.

    Maximum bytes

    There is a hard limit on the total blob size in a transaction, which is determined by the effective maximum square size. Given that the current governance maximum square size is 64, the total blob size in a transaction must be slightly less than ~2 MiB, or 1,973,786 bytes to be exact.

    The following provides an approximation of the maximum block size:

    • The maximum square size is 64x64, which gives us 4096 shares.
    • One share is reserved for the PFB transaction, leaving us with 4095 shares.
    • The first sparse share has 478 bytes available, and the remaining sparse shares have 482 bytes each.

    This can be calculated as follows:

    Total Bytes=(1×478bytes)+(4094×482bytes)=1,973,786bytes

    Please note that there isn't a precise upper bound on the maximum total blob size. It depends on several factors:

    • The maximum square size, which is determined by a governance parameter and a versioned constant.
    • The maximum bytes in a block, which is determined by a governance parameter and a hard-coded constant in CometBFT.
    • The number of shares occupied by the PFB transaction share.

    These factors can cause the maximum total blob size that can be included in one block to vary.

    See the code in celestia-app and celestia-node.

    Integrations

    This guide contains the relevant sections for how to connect to Mainnet Beta, depending on the type of node you are running. Your best approach to participating is to first determine which node you would like to run. Each node’s guide will link to the relevant network in order to show you how to connect to them. Learn about the different endpoint types in the Cosmos SDK documentation.

    Here is a list of options of the types of nodes you can run in order to participate in Mainnet Beta:

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Consensus nodes

    Community consensus RPC endpoints

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs.

    • public-celestia-rpc.numia.xyz
    • celestia-rpc.mesa.newmetric.xyz
    • rpc.celestia.pops.one
    • rpc.lunaroasis.net
    • rpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com
    • celestia-rpc.spidey.services
    • rpc-celestia.contributiondao.com
    • celestia.rpc.stakin-nodes.com
    • celestia.cumulo.org.es
    • rpc-celestia.mzonder.com
    • rpc-celestia-01.stakeflow.io
    • rpc-celestia.alphab.ai
    • rpc-celestia-full.avril14th.org
    • celestia-rpc.easy2stake.com
    • celestia.rpc.kjnodes.com
    • celestia-rpc.0xcryptovestor.com
    • rpc-celestia-mainnet.trusted-point.com
    • celestia.rpc.archives.validao.xyz
    • rpc-archive.celestia.bitszn.com
    • celestia-rpc.f5nodes.com
    • celestia-rpc.chainode.tech:33373
    • rpc-celestia.staker.space
    • celestia-rpc.noders.services
    • celestia.moonli.me
    • celestia-mainnet-rpc.itrocket.net:443
    • rpc.celestia.mainnet.dteam.tech:443

    Community API endpoints

    • public-celestia-lcd.numia.xyz
    • celestia-rest.mesa.newmetric.xyz
    • api.celestia.pops.one
    • api.lunaroasis.net
    • api.celestia.nodestake.top
    • celestia-rpc.brightlystake.com/api
    • celestia-api.spidey.services
    • api-celestia.contributiondao.com
    • celestia.rest.stakin-nodes.com
    • celestia.api.cumulo.org.es
    • api-celestia.mzonder.com
    • api-celestia-01.stakeflow.io
    • api-celestia.alphab.ai
    • api-celestia-full.avril14th.org
    • celestia-lcd.easy2stake.com
    • celestia.api.kjnodes.com
    • api-celestia-mainnet.trusted-point.com
    • celestia.rest.archives.validao.xyz
    • api-archive.celestia.bitszn.com
    • celestia-api.f5nodes.com
    • celestia-api.chainode.tech
    • api-celestia.staker.space
    • celestia-api.noders.services
    • celestia.moonli.me/api
    • celestia-mainnet-api.itrocket.net:443
    • api.celestia.mainnet.dteam.tech:443

    Community gRPC endpoints

    • public-celestia-grpc.numia.xyz
    • celestia-grpc.mesa.newmetric.xyz
    • grpc.celestia.pops.one
    • grpc.lunaroasis.net:443
    • grpc.celestia.nodestake.top
    • celestia-rpc.brightlystake.com:9090
    • celestia-grpc.spidey.services
    • grpc-celestia.contributiondao.com
    • celestia.grpc.stakin-nodes.com:443
    • celestia.grpc.cumulo.org.es:443
    • grpc-celestia.mzonder.com:443
    • grpc-celestia-01.stakeflow.io:15002
    • rpc-celestia.alphab.ai:9090
    • grpc-celestia-full.avril14th.org
    • celestia.grpc.kjnodes.com:443
    • grpc-celestia-mainnet.trusted-point.com:9095
    • celestia.grpc.archives.validao.xyz:9090
    • gprc-archive.celestia.bitszn.com
    • celestia-grpc.f5nodes.com:9390
    • celestia-grpc.chainode.tech:443
    • grpc-celestia.staker.space
    • celestia-grpc.noders.services:11090
    • celestia-mainnet-grpc.itrocket.net:443
    • grpc.celestia.mainnet.dteam.tech:28090

    Community WebSocket endpoints

    • wss://celestia-ws.chainode.tech:33373/websocket
    • wss://celestia-mainnet-ws.itrocket.net:443/websocket
    • wss://rpc.celestia.mainnet.dteam.tech:443/websocket

    Data availability nodes

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    TIP

    bash
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>
    celestia <da_type> start --core.ip <url> -–core.grpc.port <port>

    Bridge nodes

    Not all RPC endpoints guarantee the full block history. Find an archive endpoint on the community dashboard or run your own consensus node with no pruning for your bridge node.

    RPCs for DA nodes to initialise or start your celestia-node to Mainnet Beta with:

    • public-celestia-consensus.numia.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-consensus.mesa.newmetric.xyz
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.pops.one
      • gRPC: port 9090
      • RPC: port 26657
    • consensus.lunaroasis.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc-celestia.alphab.ai
      • gRPC: port 9090
      • RPC: port 26657
    • celestia-mainnet-consensus.itrocket.net
      • gRPC: port 9090
      • RPC: port 26657
    • rpc.celestia.mainnet.dteam.tech
      • gRPC: port 28090
      • RPC: 28657
    • celestia-consensus-mainnet.noders.services
      • gRPC: port 9080
      • RPC: port 26557

    DA full and light nodes might have troubles connecting to the networks, so you can check out this Grafana dashboard to see health/uptime status of DA bootstrappers (now celestia network only).

    You can find the status of these endpoints.

    Archival DA RPC endpoints

    By default, light nodes prune recent data to save on storage space. Archival data availability (DA) nodes store the entire history of the chain without pruning any data so all data available data is retrievable. You can read more about light vs archival nodes.

    Grove archival endpoints

    You can provision your own Celestia Archival endpoint on Grove. Learn more about Celestia on Grove, or find the fully supported spec.

    There is a sandbox you can leverage for testing straight in your browser:

    grove-sandbox

    Explorers

    There are multiple explorers you can use for Mainnet Beta:

    Analytics

    The following websites provide analytics for Celestia:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mainnet Beta:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    + \ No newline at end of file diff --git a/pr-1699/nodes/mocha-testnet.html b/pr-1699/nodes/mocha-testnet.html index 69f85193e8..bbceb5bb22 100644 --- a/pr-1699/nodes/mocha-testnet.html +++ b/pr-1699/nodes/mocha-testnet.html @@ -14,7 +14,7 @@ - + @@ -41,8 +41,8 @@

    Mocha testnet

    mocha-testnet

    This guide contains the relevant sections for how to connect to Mocha, depending on the type of node you are running. Mocha testnet is designed to help validators test out their infrastructure and node software. Developers are encouraged to deploy their sovereign rollups on Mocha, but we also recommend Arabica devnet for that as it is designed for development purposes.

    Mocha is a milestone in Celestia, allowing everyone to test out core functionalities on the network. Read the announcement. Your best approach to participating is to first determine which node you would like to run. Each node's guide will link to the relevant networks, to show you how to connect to them.

    You have a list of options on the types of nodes you can run to participate in Mocha:

    Consensus:

    Data Availability:

    Select the type of node you would like to run and follow the instructions on each respective page. Whenever you are asked to select the type of network you want to connect to in those guides, select Mocha to refer to the correct instructions on this page on how to connect to Mocha.

    Network details

    DetailValue
    Chain IDmocha-4
    Genesis hashB93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D
    Genesis file https://github.com/celestiaorg/networks/blob/master/mocha-4/genesis.json
    Peers file https://github.com/celestiaorg/networks/blob/master/mocha-4/peers.txt
    Validators 100

    Software version numbers

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    RPC for DA bridge, full, and light nodes

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    Bridge nodes

    Mentioned below RPC endpoints do not guarantee you the download of full blocks from them. We advise that if you are running a bridge node, that you also run a local consensus node in order to download full blocks from it.

    • public-celestia-mocha4-consensus.numia.xyz
    • mocha-4-consensus.mesa.newmetric.xyz
    • full.consensus.mocha-4.celestia-mocha.com
    • consensus-full-mocha-4.celestia-mocha.com
    • rpc-mocha.pops.one
    • celestia-testnet-consensus.itrocket.net
      • RPC port: 26657
      • gRPC port: 9090
    • rpc-celestia-testnet.cryptech.com.ua
      • gRPC: grpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443
      • gRPC: grpc.celestia.testnet.dteam.tech:27090
    • celestia-consensus-testnet.noders.services
      • RPC port: 26357
      • gRPC port: 9070

    Community RPC endpoints

    The RPC endpoint is to allow users to interact with Celestia's nodes by querying the node's state and broadcasting transactions on the Celestia network. The default port is 26657.

    • public-celestia-mocha4-consensus.numia.xyz:26657
    • mocha-4-consensus.mesa.newmetric.xyz:26657
    • rpc.celestia-mocha.com
    • celestia-testnet-rpc.f5nodes.com
    • celestia-testnet.brightlystake.com
    • rpc-celestia-mocha.architectnodes.com
    • rpc-celestia-mocha.trusted-point.com
    • rpc-celestia-testnet-01.stakeflow.io
    • mocha.celestia.rpc.cumulo.me
    • rpc-mocha-4.spidey.services
    • rpc-mocha-full.avril14th.org
    • rpc.mocha.bitszn.com
    • celestia-t-rpc.noders.services/
    • rpc-1.testnet.celestia.nodes.guru
    • rpc-2.testnet.celestia.nodes.guru
    • celestia-testnet-rpc.itrocket.net:443
    • rpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443

    Community API endpoints

    The API endpoint is to allow users to interact with the REST API in Cosmos SDK which is implemented using gRPC-gateway, which exposes gRPC endpoints as REST endpoints. This allows for communication with the node using REST calls, which can be useful if the client does not support gRPC or HTTP2. The default port is 1317.

    Community gRPC endpoints

    The gRPC endpoint is to allow users to interact with a Celestia Node using gRPC, a modern open-source and high-performance RPC framework. The default port is 9090. In the Cosmos SDK, gRPC is used to define state queries and broadcast transactions.

    • public-celestia-mocha4-consensus.numia.xyz:9090
    • mocha-4-consensus.mesa.newmetric.xyz:9090
    • grpc-mocha.pops.one
    • grpc.celestia-mocha.com:443
    • full.consensus.mocha-4.celestia-mocha.com:9090
    • consensus-full-mocha-4.celestia-mocha.com:9090
    • celestia-testnet-grpc.f5nodes.com
    • celestia-testnet.brightlystake.com:9390
    • grpc-celestia-mocha.architectnodes.com:1443
    • grpc-celestia-mocha.trusted-point.com:9099
    • grpc-celestia-testnet-01.stakeflow.io:16002
    • mocha.grpc.cumulo.me:443
    • grpc-mocha-4.spidey.services
    • grpc-mocha-full.avril14th.org
    • grpc.mocha.bitszn.com
    • celestia-grpc.noders.services:21090
    • grpc-1.testnet.celestia.nodes.guru:10790
    • grpc-2.testnet.celestia.nodes.guru:10790
    • celestia-testnet-grpc.itrocket.net:443
    • grpc-celestia-testnet.cryptech.com.ua:443
    • grpc.celestia.testnet.dteam.tech:27090

    Community bridge and full node endpoints

    The endpoints below are for bridge and full nodes only. They can be used to find bootstrapper peers in the p2p network.

    Bridge node 1:

    • da-bridge-mocha-4.celestia-mocha.com
    • bridge-mocha-4.da.celestia-mocha.com

    Bridge node 2:

    • da-bridge-mocha-4-2.celestia-mocha.com
    • bridge-mocha-4-2.da.celestia-mocha.com

    Full node 1:

    • da-full-1-mocha-4.celestia-mocha.com
    • full-1-mocha-4.da.celestia-mocha.com

    Full node 2:

    • da-full-2-mocha-4.celestia-mocha.com
    • full-2-mocha-4.da.celestia-mocha.com

    Mocha testnet faucet

    WARNING

    USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

    You can request from Mocha testnet Faucet on the #mocha-faucet channel on Celestia's Discord server with the following command:

    text
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

    NOTE

    Faucet has a limit of 10 tokens per week per address/Discord ID.

    Analytics

    The following websites provide analytics for Mocha Testnet:

    Explorers

    There are several explorers you can use for Mocha:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mocha testnet:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    - +

    Mocha testnet

    mocha-testnet

    This guide contains the relevant sections for how to connect to Mocha, depending on the type of node you are running. Mocha testnet is designed to help validators test out their infrastructure and node software. Developers are encouraged to deploy their sovereign rollups on Mocha, but we also recommend Arabica devnet for that as it is designed for development purposes.

    Mocha is a milestone in Celestia, allowing everyone to test out core functionalities on the network. Read the announcement. Your best approach to participating is to first determine which node you would like to run. Each node's guide will link to the relevant networks, to show you how to connect to them.

    You have a list of options on the types of nodes you can run to participate in Mocha:

    Consensus:

    Data Availability:

    Select the type of node you would like to run and follow the instructions on each respective page. Whenever you are asked to select the type of network you want to connect to in those guides, select Mocha to refer to the correct instructions on this page on how to connect to Mocha.

    Network details

    DetailValue
    Chain IDmocha-4
    Genesis hashB93BBE20A0FBFDF955811B6420F8433904664D45DB4BF51022BE4200C1A1680D
    Genesis file https://github.com/celestiaorg/networks/blob/master/mocha-4/genesis.json
    Peers file https://github.com/celestiaorg/networks/blob/master/mocha-4/peers.txt
    Validators 100

    Software version numbers

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    RPC for DA bridge, full, and light nodes

    Production RPC endpoints

    These RPC providers are meant to be used in production environments.

    ProviderURL
    NewMetrichttps://app.newmetric.xyz/start
    NumiaFor RPC access: https://docs.numia.xyz/overview/rpc-api-access
    NumiaFor data warehouse access: https://docs.numia.xyz/overview/sql-access/chains/celestia
    Grovehttps://www.grove.city/

    WARNING

    Do not rely on the free community endpoints listed below for production deployments. Production deployments should rely on service providers with SLAs or your own node.

    Community Data availability (DA) RPC endpoints for bridge node sync

    These RPC endpoints allow bridge nodes to sync blocks from the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default RPC port at 26657 to their respective DA node.

    Community Data availability (DA) gRPC endpoints for state access

    These gRPC endpoints for DA nodes provide state access for querying the chain’s state and broadcasting transactions (balances, blobs, etc.) to the Celestia network. For users, they will need to provide a –core.ip string from a consensus node’s URL or IP that populates a default gRPC port at 9090 to their respective DA node.

    Bridge nodes

    Mentioned below RPC endpoints do not guarantee you the download of full blocks from them. We advise that if you are running a bridge node, that you also run a local consensus node in order to download full blocks from it.

    • public-celestia-mocha4-consensus.numia.xyz
    • mocha-4-consensus.mesa.newmetric.xyz
    • full.consensus.mocha-4.celestia-mocha.com
    • consensus-full-mocha-4.celestia-mocha.com
    • rpc-mocha.pops.one
    • celestia-testnet-consensus.itrocket.net
      • RPC port: 26657
      • gRPC port: 9090
    • rpc-celestia-testnet.cryptech.com.ua
      • gRPC: grpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443
      • gRPC: grpc.celestia.testnet.dteam.tech:27090
    • celestia-consensus-testnet.noders.services
      • RPC port: 26357
      • gRPC port: 9070

    Community RPC endpoints

    The RPC endpoint is to allow users to interact with Celestia's nodes by querying the node's state and broadcasting transactions on the Celestia network. The default port is 26657.

    • public-celestia-mocha4-consensus.numia.xyz:26657
    • mocha-4-consensus.mesa.newmetric.xyz:26657
    • rpc.celestia-mocha.com
    • celestia-testnet-rpc.f5nodes.com
    • celestia-testnet.brightlystake.com
    • rpc-celestia-mocha.architectnodes.com
    • rpc-celestia-mocha.trusted-point.com
    • rpc-celestia-testnet-01.stakeflow.io
    • mocha.celestia.rpc.cumulo.me
    • rpc-mocha-4.spidey.services
    • rpc-mocha-full.avril14th.org
    • rpc.mocha.bitszn.com
    • celestia-t-rpc.noders.services/
    • rpc-1.testnet.celestia.nodes.guru
    • rpc-2.testnet.celestia.nodes.guru
    • celestia-testnet-rpc.itrocket.net:443
    • rpc-celestia-testnet.cryptech.com.ua:443
    • rpc.celestia.testnet.dteam.tech:443

    Community API endpoints

    The API endpoint is to allow users to interact with the REST API in Cosmos SDK which is implemented using gRPC-gateway, which exposes gRPC endpoints as REST endpoints. This allows for communication with the node using REST calls, which can be useful if the client does not support gRPC or HTTP2. The default port is 1317.

    Community gRPC endpoints

    The gRPC endpoint is to allow users to interact with a Celestia Node using gRPC, a modern open-source and high-performance RPC framework. The default port is 9090. In the Cosmos SDK, gRPC is used to define state queries and broadcast transactions.

    • public-celestia-mocha4-consensus.numia.xyz:9090
    • mocha-4-consensus.mesa.newmetric.xyz:9090
    • grpc-mocha.pops.one
    • grpc.celestia-mocha.com:443
    • full.consensus.mocha-4.celestia-mocha.com:9090
    • consensus-full-mocha-4.celestia-mocha.com:9090
    • celestia-testnet-grpc.f5nodes.com
    • celestia-testnet.brightlystake.com:9390
    • grpc-celestia-mocha.architectnodes.com:1443
    • grpc-celestia-mocha.trusted-point.com:9099
    • grpc-celestia-testnet-01.stakeflow.io:16002
    • mocha.grpc.cumulo.me:443
    • grpc-mocha-4.spidey.services
    • grpc-mocha-full.avril14th.org
    • grpc.mocha.bitszn.com
    • celestia-grpc.noders.services:21090
    • grpc-1.testnet.celestia.nodes.guru:10790
    • grpc-2.testnet.celestia.nodes.guru:10790
    • celestia-testnet-grpc.itrocket.net:443
    • grpc-celestia-testnet.cryptech.com.ua:443
    • grpc.celestia.testnet.dteam.tech:27090

    Community bridge and full node endpoints

    The endpoints below are for bridge and full nodes only. They can be used to find bootstrapper peers in the p2p network.

    Bridge node 1:

    • da-bridge-mocha-4.celestia-mocha.com
    • bridge-mocha-4.da.celestia-mocha.com

    Bridge node 2:

    • da-bridge-mocha-4-2.celestia-mocha.com
    • bridge-mocha-4-2.da.celestia-mocha.com

    Full node 1:

    • da-full-1-mocha-4.celestia-mocha.com
    • full-1-mocha-4.da.celestia-mocha.com

    Full node 2:

    • da-full-2-mocha-4.celestia-mocha.com
    • full-2-mocha-4.da.celestia-mocha.com

    Mocha testnet faucet

    WARNING

    USING THIS FAUCET DOES NOT ENTITLE YOU TO ANY AIRDROP OR OTHER DISTRIBUTION OF MAINNET CELESTIA TOKENS. THERE ARE NO PUBLIC SALES OF ANY MAINNET CELESTIA TOKENS.

    You can request from Mocha testnet Faucet on the #mocha-faucet channel on Celestia's Discord server with the following command:

    text
    $request <CELESTIA-ADDRESS>
    $request <CELESTIA-ADDRESS>

    Where <CELESTIA-ADDRESS> is a celestia1****** generated address.

    NOTE

    Faucet has a limit of 10 tokens per week per address/Discord ID.

    Analytics

    The following websites provide analytics for Mocha Testnet:

    Explorers

    There are several explorers you can use for Mocha:

    Network upgrades

    There are a few ways to stay informed about network upgrades on Mocha testnet:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    + \ No newline at end of file diff --git a/pr-1699/nodes/overview.html b/pr-1699/nodes/overview.html index 3a47a18fe9..fc8edde45d 100644 --- a/pr-1699/nodes/overview.html +++ b/pr-1699/nodes/overview.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Overview to running nodes on Celestia

    There are many ways you can participate in the Celestia networks.

    Celestia node operators can run several options on the network.

    Consensus:

    • Validator node: This type of node participates in consensus by producing and voting on blocks.
    • Consensus node: A celestia-app full node to sync blockchain history.

    Data Availability:

    • Bridge node: This node bridges blocks between the Data-Availability network and the Consensus network.
    • Full storage node: This node stores all the data but does not connect to Consensus.
    • Light node: Light clients conduct data availability sampling on the Data Availability network.

    You can learn more about how to set up each different node by going through each tutorial guide.

    Data availability nodes

    Node typeMemoryCPUDiskBandwidth
    Light node500 MB RAMSingle core100 GB SSD56 Kbps
    Bridge node16 GB RAM6 cores10 TB SSD1 Gbps
    Full storage node16 GB RAMQuad-core10 TB SSD1 Gbps

    Consensus nodes

    Node typeMemoryCPUDiskBandwidth
    Validator16 GB RAM8 cores2 TB SSD1 Gbps
    Consensus node16 GB RAMQuad-core2 TB SSD1 Gbps

    Please provide any feedback on the tutorials and guides. If you notice a bug or issue, feel free to make a pull request or write up a Github issue!

    - +

    Overview to running nodes on Celestia

    There are many ways you can participate in the Celestia networks.

    Celestia node operators can run several options on the network.

    Consensus:

    • Validator node: This type of node participates in consensus by producing and voting on blocks.
    • Consensus node: A celestia-app full node to sync blockchain history.

    Data Availability:

    • Bridge node: This node bridges blocks between the Data-Availability network and the Consensus network.
    • Full storage node: This node stores all the data but does not connect to Consensus.
    • Light node: Light clients conduct data availability sampling on the Data Availability network.

    You can learn more about how to set up each different node by going through each tutorial guide.

    Data availability nodes

    Node typeMemoryCPUDiskBandwidth
    Light node500 MB RAMSingle core100 GB SSD56 Kbps
    Bridge node16 GB RAM6 cores10 TB SSD1 Gbps
    Full storage node16 GB RAMQuad-core10 TB SSD1 Gbps

    Consensus nodes

    Node typeMemoryCPUDiskBandwidth
    Validator16 GB RAM8 cores2 TB SSD1 Gbps
    Consensus node16 GB RAMQuad-core2 TB SSD1 Gbps

    Please provide any feedback on the tutorials and guides. If you notice a bug or issue, feel free to make a pull request or write up a Github issue!

    + \ No newline at end of file diff --git a/pr-1699/nodes/participate.html b/pr-1699/nodes/participate.html index f90ead2290..ece1e9aa8b 100644 --- a/pr-1699/nodes/participate.html +++ b/pr-1699/nodes/participate.html @@ -18,7 +18,7 @@ - + @@ -45,8 +45,8 @@

    Participate in the Celestia networks

    Mainnet Beta

    Celestia’s Mainnet Beta is the production network for deploying mainnet rollups and applications. This marks the culmination of years of development and community testing. While the network is stable and continues to receive updates, it remains experimental and users may experience occasional instability or reduced performance.

    Compatible software versions for Mainnet Beta

    SoftwareVersion
    celestia-nodev0.15.0
    celestia-appv1.13.0

    Testnets

    Celestia currently has two existing testnets that you can participate in:

    Arabica Devnet

    Arabica devnet is a devnet focused on developers who want to deploy sovereign rollups on the latest changes from Celestia's codebase. Arabica will be updated frequently and might be unstable at times given new updates. Validators won't be able to validate on Arabica as it is not designed for validators to participate.

    Compatible software versions for Arabica devnet

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    Mocha testnet

    Mocha testnet is a testnet focused on enabling validators to test out their infrastructure by running nodes connected to the network. Developers can also deploy sovereign rollups on Mocha, it just will always be behind Arabica as Mocha upgrades are slower given they need to be done via hardforks in coordination with the validator community on Mocha.

    Compatible software versions for Mocha testnet

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    Network upgrades

    There are a few ways to stay informed about network upgrades:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    - +

    Participate in the Celestia networks

    Mainnet Beta

    Celestia’s Mainnet Beta is the production network for deploying mainnet rollups and applications. This marks the culmination of years of development and community testing. While the network is stable and continues to receive updates, it remains experimental and users may experience occasional instability or reduced performance.

    Compatible software versions for Mainnet Beta

    SoftwareVersion
    celestia-nodev0.15.0
    celestia-appv1.13.0

    Testnets

    Celestia currently has two existing testnets that you can participate in:

    Arabica Devnet

    Arabica devnet is a devnet focused on developers who want to deploy sovereign rollups on the latest changes from Celestia's codebase. Arabica will be updated frequently and might be unstable at times given new updates. Validators won't be able to validate on Arabica as it is not designed for validators to participate.

    Compatible software versions for Arabica devnet

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    Mocha testnet

    Mocha testnet is a testnet focused on enabling validators to test out their infrastructure by running nodes connected to the network. Developers can also deploy sovereign rollups on Mocha, it just will always be behind Arabica as Mocha upgrades are slower given they need to be done via hardforks in coordination with the validator community on Mocha.

    Compatible software versions for Mocha testnet

    SoftwareVersion
    celestia-nodev0.16.0
    celestia-appv2.1.2

    Network upgrades

    There are a few ways to stay informed about network upgrades:

    See the Hardfork process page to learn more about specific upgrades like the Lemongrass hardfork.

    + \ No newline at end of file diff --git a/pr-1699/nodes/quick-start.html b/pr-1699/nodes/quick-start.html index b0b4449c99..7bffa3f015 100644 --- a/pr-1699/nodes/quick-start.html +++ b/pr-1699/nodes/quick-start.html @@ -11,7 +11,7 @@ - + @@ -38,8 +38,8 @@

    Quick start guide

    In this section, we show you how to get started with installing the needed libraries and packages in Celestia to help you run a node on Celestia.

    Celestia Node

    Install celestia-node allows you to get started with running a light node and do data availability sampling.

    Light nodes are the best nodes to test out initially if you are new to participating in Celestia.

    celestia-node client also allows you to run other types of data availability (DA) nodes like bridge and full DA storage nodes, which will be covered in later sections.

    Celestia App

    Install celestia-app allows you to get started running a consensus node.

    celestia-app is the software that allows you to run validator nodes and also provide RPC endpoints.

    celestia-app covers the consensus layer, while celestia-node covers the DA layer.

    Getting started

    As covered in the previous section, Celestia offers two different test networks, Arabica devnet and Mocha testnet.

    If you are planning to run a light node, it is recommended to use Arabica, which you will find options to connecting to in the later sections.

    If you plan on running a validator, your only option is to run your node on Mocha.

    In this quick start guide, we will go over installing both of the software clients: celestia-node and celestia-app.

    NOTE

    If you just want to run a light node, you don't need to install celestia-app and can skip that part.

    Proceed to the next section in order to get started.

    - +

    Quick start guide

    In this section, we show you how to get started with installing the needed libraries and packages in Celestia to help you run a node on Celestia.

    Celestia Node

    Install celestia-node allows you to get started with running a light node and do data availability sampling.

    Light nodes are the best nodes to test out initially if you are new to participating in Celestia.

    celestia-node client also allows you to run other types of data availability (DA) nodes like bridge and full DA storage nodes, which will be covered in later sections.

    Celestia App

    Install celestia-app allows you to get started running a consensus node.

    celestia-app is the software that allows you to run validator nodes and also provide RPC endpoints.

    celestia-app covers the consensus layer, while celestia-node covers the DA layer.

    Getting started

    As covered in the previous section, Celestia offers two different test networks, Arabica devnet and Mocha testnet.

    If you are planning to run a light node, it is recommended to use Arabica, which you will find options to connecting to in the later sections.

    If you plan on running a validator, your only option is to run your node on Mocha.

    In this quick start guide, we will go over installing both of the software clients: celestia-node and celestia-app.

    NOTE

    If you just want to run a light node, you don't need to install celestia-app and can skip that part.

    Proceed to the next section in order to get started.

    + \ No newline at end of file diff --git a/pr-1699/nodes/systemd.html b/pr-1699/nodes/systemd.html index f3de71d3af..a3684ab86b 100644 --- a/pr-1699/nodes/systemd.html +++ b/pr-1699/nodes/systemd.html @@ -11,7 +11,7 @@ - + @@ -162,8 +162,8 @@ WantedBy=multi-user.target EOF

    If the file was created successfully you will be able to see its content:

    sh
    cat /etc/systemd/system/celestia-lightd.service
    cat /etc/systemd/system/celestia-lightd.service

    Enable and start celestia-lightd daemon:

    sh
    sudo systemctl enable celestia-lightd
     sudo systemctl start celestia-lightd
    sudo systemctl enable celestia-lightd
    -sudo systemctl start celestia-lightd

    Check if daemon has been started correctly:

    sh
    sudo systemctl status celestia-lightd
    sudo systemctl status celestia-lightd

    Check daemon logs in real time:

    sh
    sudo journalctl -u celestia-lightd.service -f
    sudo journalctl -u celestia-lightd.service -f

    Now, the Celestia light node will start syncing headers. After sync is finished, light node will do Data Availability Sampling (DAS) from the bridge node.

    - +sudo systemctl start celestia-lightd

    Check if daemon has been started correctly:

    sh
    sudo systemctl status celestia-lightd
    sudo systemctl status celestia-lightd

    Check daemon logs in real time:

    sh
    sudo journalctl -u celestia-lightd.service -f
    sudo journalctl -u celestia-lightd.service -f

    Now, the Celestia light node will start syncing headers. After sync is finished, light node will do Data Availability Sampling (DAS) from the bridge node.

    + \ No newline at end of file diff --git a/pr-1699/nodes/validator-node.html b/pr-1699/nodes/validator-node.html index fcf6af9b98..86b6cb33a6 100644 --- a/pr-1699/nodes/validator-node.html +++ b/pr-1699/nodes/validator-node.html @@ -12,7 +12,7 @@ - + @@ -69,7 +69,7 @@ raw_log: '[]' timestamp: "" tx: null -txhash: <tx-hash>

    You can check if the TX hash went through using the block explorer by inputting the txhash ID that was returned.

    Optional: Deploy the celestia-node

    Running a bridge node is critical to the Celestia network as it enables the data availability and consensus nodes to communicate with one another. It is recommended to support the data availability network, but is not required for celestia-app.

    If you are not running a bridge node, you can skip to run a validator node.

    This section describes part 2 of Celestia validator node setup: running a Celestia bridge node daemon.

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Initialize the bridge node

    Run the following:

    bash
    celestia bridge init --core.ip <URI>
    celestia bridge init --core.ip <URI>

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    If you need a list of RPC endpoints to connect to, you can find the list on the Mocha testnet page or list on the Arabica devnet page.

    Run the bridge node

    Run the following:

    bash
    celestia bridge start
    celestia bridge start

    Optional: start the bridge node with SystemD

    Follow the tutorial on setting up the bridge node as a background process with SystemD.

    You have successfully set up a bridge node that is syncing with the network.

    Run the validator node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    After completing all the necessary steps, you are now ready to run a validator! In order to create your validator onchain, follow the instructions below. Keep in mind that these steps are necessary ONLY if you want to participate in the consensus.

    Pick a moniker name of your choice! This is the validator name that will show up on public dashboards and explorers. VALIDATOR_WALLET must be the same you defined previously. Parameter --min-self-delegation=1000000 defines the amount of tokens that are self delegated from your validator wallet.

    Now, connect to the network of your choice.

    You have the following option of connecting to list of networks shown below:

    Continuing the validator tutorial, here are the steps to connect your validator to Mocha:

    bash
    MONIKER="your_moniker"
    +txhash: <tx-hash>

    You can check if the TX hash went through using the block explorer by inputting the txhash ID that was returned.

    Optional: Deploy the celestia-node

    Running a bridge node is critical to the Celestia network as it enables the data availability and consensus nodes to communicate with one another. It is recommended to support the data availability network, but is not required for celestia-app.

    If you are not running a bridge node, you can skip to run a validator node.

    This section describes part 2 of Celestia validator node setup: running a Celestia bridge node daemon.

    Install celestia-node

    You can follow the tutorial for installing celestia-node

    Initialize the bridge node

    Run the following:

    bash
    celestia bridge init --core.ip <URI>
    celestia bridge init --core.ip <URI>

    TIP

    Refer to the ports section of the celestia-node troubleshooting page for information on which ports are required to be open on your machine.

    If you need a list of RPC endpoints to connect to, you can find the list on the Mocha testnet page or list on the Arabica devnet page.

    Run the bridge node

    Run the following:

    bash
    celestia bridge start
    celestia bridge start

    Optional: start the bridge node with SystemD

    Follow the tutorial on setting up the bridge node as a background process with SystemD.

    You have successfully set up a bridge node that is syncing with the network.

    Run the validator node

    If you are running celestia-app v1.x.x:

    sh
    celestia-appd start
    celestia-appd start

    If you are running celestia-app >= v2.0.0: then you'll want to start the node with a --v2-upgrade-height that is dependent on the network. The --v2-upgrade-height flag is only needed during the v2 upgrade height so after your node has executed the upgrade (e.g. you see the log upgraded from app version 1 to 2), you don't need to provide this flag for future celestia-appd start invocations.

    sh
    celestia-appd start --v2-upgrade-height 2371495
    celestia-appd start --v2-upgrade-height 2371495
    sh
    celestia-appd start --v2-upgrade-height 2585031
    celestia-appd start --v2-upgrade-height 2585031
    sh
    celestia-appd start --v2-upgrade-height 1751707
    celestia-appd start --v2-upgrade-height 1751707

    After completing all the necessary steps, you are now ready to run a validator! In order to create your validator onchain, follow the instructions below. Keep in mind that these steps are necessary ONLY if you want to participate in the consensus.

    Pick a moniker name of your choice! This is the validator name that will show up on public dashboards and explorers. VALIDATOR_WALLET must be the same you defined previously. Parameter --min-self-delegation=1000000 defines the amount of tokens that are self delegated from your validator wallet.

    Now, connect to the network of your choice.

    You have the following option of connecting to list of networks shown below:

    Continuing the validator tutorial, here are the steps to connect your validator to Mocha:

    bash
    MONIKER="your_moniker"
     VALIDATOR_WALLET="validator"
     
     celestia-appd tx staking create-validator \
    @@ -121,8 +121,8 @@
     raw_log: '[]'
     timestamp: ""
     tx: null
    -txhash: <tx-hash>

    You should now be able to see your validator from a block explorer

    Submit your validator information

    After starting your node, please submit your node as a seed and peer to the networks repository.

    Optional: Transaction indexer configuration options

    Follow the instructions under transaction indexer configuration options to configure your config.toml file to select which transactions to index.

    Additional resources

    For additional resources, refer to the extra resources for consensus nodessection of the consensus node page.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    - +txhash: <tx-hash>

    You should now be able to see your validator from a block explorer

    Submit your validator information

    After starting your node, please submit your node as a seed and peer to the networks repository.

    Optional: Transaction indexer configuration options

    Follow the instructions under transaction indexer configuration options to configure your config.toml file to select which transactions to index.

    Additional resources

    For additional resources, refer to the extra resources for consensus nodessection of the consensus node page.

    FAQ

    +2/3 committed an invalid block: wrong Block.Header.Version

    If you encounter an error like:

    bash
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"
    2024-04-25 14:48:24 6:48PM ERR CONSENSUS FAILURE!!! err="+2/3 committed an invalid block: wrong Block.Header.Version. Expected {11 1}, got {11 2}" module=consensus stack="goroutine 214 [running]:\nruntime/debug.Stack()\n\t/usr/local/go/src/runtime/debug/stack.go:24 +0x64\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine.func2()\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:746 +0x44\npanic({0x1b91180?, 0x400153b240?})\n\t/usr/local/go/src/runtime/panic.go:770 +0x124\ngithub.com/tendermint/tendermint/consensus.(*State).finalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1637 +0xd30\ngithub.com/tendermint/tendermint/consensus.(*State).tryFinalizeCommit(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:1606 +0x26c\ngithub.com/tendermint/tendermint/consensus.(*State).handleCompleteProposal(0x400065ea88, 0x3)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:2001 +0x2d8\ngithub.com/tendermint/tendermint/consensus.(*State).handleMsg(0x400065ea88, {{0x2b30a00, 0x400143e048}, {0x40002a61b0, 0x28}})\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:856 +0x1c8\ngithub.com/tendermint/tendermint/consensus.(*State).receiveRoutine(0x400065ea88, 0x0)\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:782 +0x2c4\ncreated by github.com/tendermint/tendermint/consensus.(*State).OnStart in goroutine 169\n\t/go/pkg/mod/github.com/celestiaorg/celestia-core@v1.35.0-tm-v0.34.29/consensus/state.go:391 +0x110\n"

    then it is likely that the network has upgraded to a new app version but your consensus node was not prepared for the upgrade. To fix this, you'll need to update your binary to the latest version and restart your node with the relevant --v2-upgrade-height for the network you're running on. If your node still can't sync to the tip of the chain after the above steps, consider a celestia-appd tendermint reset-state to reset your node and start syncing from the genesis block.

    + \ No newline at end of file diff --git a/pr-1699/sitemap.xml b/pr-1699/sitemap.xml index cb92f7bc3f..844733c3fc 100644 --- a/pr-1699/sitemap.xml +++ b/pr-1699/sitemap.xml @@ -1 +1 @@ -https://docs.celestia.org/README2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/calendar2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/coc2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/foundation-delegation-program2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/itn-tos2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/modular-meetup-guide2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/modular-meetup-intro2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/modular-meetup-toolkit2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/overview2024-09-10T12:29:17.000Zhttps://docs.celestia.org/community/speaker-list2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-bridge2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-dapp-deploy2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-deploy2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-full-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-integration2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/arbitrum-smart-contract2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-contracts2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-offchain2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-proof-queries2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-rollups2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-x-deploy2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream-x-requesting-data-commitment-ranges2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstream2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/blobstreamx2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/bubs-testnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/build-whatever2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/celestia-node-key2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/deploy-on-bubs2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/ethereum-fallback2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/feegrant-for-blobs2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/full-stack-modular-development-guide2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/gm-portal-bubs2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/golang-client-tutorial2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/integrate-celestia2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/intro-to-op-stack2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/multiaccounts2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/node-api2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/node-tutorial2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/optimism-devnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/optimism2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/prompt-scavenger2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/rust-client-tutorial2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/sp1-blobstream-deploy2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/submit-data2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/transaction-resubmission2024-09-10T12:29:17.000Zhttps://docs.celestia.org/developers/wallets2024-09-10T12:29:17.000Zhttps://docs.celestia.org/2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-celestia-works/data-availability-faq2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-celestia-works/data-availability-layer2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-celestia-works/monolithic-vs-modular2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-celestia-works/overview2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-celestia-works/transaction-lifecycle2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/how-to-stake-tia2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/paying-for-blobspace2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/retrievability2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/staking-governance-supply2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/staking2024-09-10T12:29:17.000Zhttps://docs.celestia.org/learn/tia2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/arabica-devnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/bridge-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-commands2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-metrics2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-multisig2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-slashing2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-upgrade-monitor2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-vesting2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app-wallet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-app2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-node-custom-networks2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-node-metrics2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-node-troubleshooting2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-node-trusted-hash2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/celestia-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/config-toml2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/consensus-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/decide-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/docker-images2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/environment2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/full-storage-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/hardfork-process2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/ibc-relayer2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/instantiate-testnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/light-node2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/mainnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/mocha-testnet2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/overview2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/participate2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/quick-start2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/systemd2024-09-10T12:29:17.000Zhttps://docs.celestia.org/nodes/validator-node2024-09-10T12:29:17.000Z \ No newline at end of file +https://docs.celestia.org/README2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/calendar2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/coc2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/foundation-delegation-program2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/itn-tos2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/modular-meetup-guide2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/modular-meetup-intro2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/modular-meetup-toolkit2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/overview2024-09-10T18:13:45.000Zhttps://docs.celestia.org/community/speaker-list2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-bridge2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-dapp-deploy2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-deploy2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-full-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-integration2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/arbitrum-smart-contract2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-contracts2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-offchain2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-proof-queries2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-rollups2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-x-deploy2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream-x-requesting-data-commitment-ranges2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstream2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/blobstreamx2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/bubs-testnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/build-whatever2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/celestia-node-key2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/deploy-on-bubs2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/ethereum-fallback2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/feegrant-for-blobs2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/full-stack-modular-development-guide2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/gm-portal-bubs2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/golang-client-tutorial2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/integrate-celestia2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/intro-to-op-stack2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/multiaccounts2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/node-api2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/node-tutorial2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/optimism-devnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/optimism2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/prompt-scavenger2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/rust-client-tutorial2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/sp1-blobstream-deploy2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/submit-data2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/transaction-resubmission2024-09-10T18:13:45.000Zhttps://docs.celestia.org/developers/wallets2024-09-10T18:13:45.000Zhttps://docs.celestia.org/2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-celestia-works/data-availability-faq2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-celestia-works/data-availability-layer2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-celestia-works/monolithic-vs-modular2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-celestia-works/overview2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-celestia-works/transaction-lifecycle2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/how-to-stake-tia2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/paying-for-blobspace2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/retrievability2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/staking-governance-supply2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/staking2024-09-10T18:13:45.000Zhttps://docs.celestia.org/learn/tia2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/arabica-devnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/bridge-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-commands2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-metrics2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-multisig2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-slashing2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-upgrade-monitor2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-vesting2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app-wallet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-app2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-node-custom-networks2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-node-metrics2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-node-troubleshooting2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-node-trusted-hash2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/celestia-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/config-toml2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/consensus-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/decide-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/docker-images2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/environment2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/full-storage-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/hardfork-process2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/ibc-relayer2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/instantiate-testnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/light-node2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/mainnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/mocha-testnet2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/overview2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/participate2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/quick-start2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/systemd2024-09-10T18:13:45.000Zhttps://docs.celestia.org/nodes/validator-node2024-09-10T18:13:45.000Z \ No newline at end of file