*Forward the Original Title:Exploring Eclipse’s Canonical Ethereum Bridge and Proving System
Eclipse is composed of three layers:
The diagram below illustrates how these modules interact:
The rest of this article will focus on Eclipse’s Ethereum bridge, as shown in the diagram. Blobstream will relay attestations signed by Celestia’s validator set to certify to Ethereum that the data for a batch of Eclipse’s slots was published correctly. This allows Eclipse’s bridge to verify the data provided for fraud proofs against the signed data roots from Celestia. In the rest of this section, we will outline the processes by which:
The flow when a user deposits onto Eclipse via the native Ethereum bridge is summarized as follows:
The diagram below shows the interactions between Ethereum, Celestia, and the SVM Executor during the deposit flow described above:
The flow for publishing batches of Eclipse’s slots to Celestia as data blobs is summarized below:
The diagram below from Celestia explains how the commitment of the data within a given Celestia block is stored in the block header:
Similarly to other L2s that use fraud proofs (Arbitrum, Fuel, and many others), withdrawals from Eclipse require a challenge period during which verifiers can submit fraud proofs in the case of an invalid state transition:
In this final section, we will detail Eclipse’s fraud proof system design, inspired by Anatoly Yakovenko and John Adler. Generally, for any fraud proof, a verifier must:
In Eclipse’s case, (1) Celestia merklizes blobs of batches of blocks that Eclipse’s SVM executor posts, allowing transaction inclusion proofs via Merkle witnesses. For (2), unlike EVM-based L2s, which post a Merkle root to the global state tree, for performance reasons Eclipse does not update a global state tree on a transaction-by-transaction basis, but we will explain how we ensure the correctness of inputs in more detail below. Finally, in the case of (3), Eclipse’s verifier generates a zk-proof of the output(s) for a given transaction, unlike the interactive verification game approach common across EVM-based L2s.
All Eclipse transactions can be represented as taking a list of input accounts, executing a transaction, and producing a list of resultant output accounts:
The critical observation for our fraud proof design is that for transaction execution, it is always the case that any S_InputAccount must have been the S_OutputAccount of some previous transaction. This allows us to reference the last transaction in the chain that produced a given input account instead of providing a Merkle witness to a global state tree. As a result of our design, we introduce additional fraud accusation types, such as a reference to the previous transaction not being valid or the input account already being “spent” by some later transaction. We describe this process in more detail below:
In addition, the batches of transaction data posted to Celestia have their commitments relayed to the Ethereum contract. The commitments consist of:
As explained above, there are several ways a batch can be found to be incorrect:
If any commitment batch is found to be incorrect, the Eclipse bridge contract will roll back the bridge to that of the last provably correct batch commitment. Note that transactions are never removed from the chain, even in the case of fraud, so only the commitment needs to be re-computed.
This article aimed to give a high-level guide to Eclipse’s trust-minimized bridge on Ethereum and explain some details about our fraud proof design. Given the modular nature of our L2 and the nascence of our technology stack, we will continue to release articles and documentation about various aspects of Eclipse in the coming weeks.
To get involved with Eclipse Testnet, please follow our instructions here. You can contact us on Twitter or Discord with specific inquiries about our Testnet, bridge, or technical questions.
[1]: The node which computes the results of SVM transactions and applies the eventual output to Eclipse’s new state
[2]: An operator which passes on-chain events between Ethereum and Eclipse
[3]: Note that the executor, not the sequencer, posts this. If it were included in the data posted by the sequencer, it would add the complication that the sequencer could skip over a count, making it impossible for the executor to do their job correctly. This could be compensated for in the fraud proof design, but it would add extra complexity. A second advantage of having only the executor post the count is that it makes it easy to allow transaction overrides to be posted to Celestia, if desired.
[4]: SVM accounts can be represented with a unique hash. The only way this hash is modified is via a transaction.
[5]: To do this without an excessive amount of hashing, we will run a trace on each executed program to see which parts of each used sysvar are actually accessed. This is possible, but will require modifying Solana’s BPF interpreter.
[6]: This includes data for attempted transactions that failed to execute.
*Forward the Original Title:Exploring Eclipse’s Canonical Ethereum Bridge and Proving System
Eclipse is composed of three layers:
The diagram below illustrates how these modules interact:
The rest of this article will focus on Eclipse’s Ethereum bridge, as shown in the diagram. Blobstream will relay attestations signed by Celestia’s validator set to certify to Ethereum that the data for a batch of Eclipse’s slots was published correctly. This allows Eclipse’s bridge to verify the data provided for fraud proofs against the signed data roots from Celestia. In the rest of this section, we will outline the processes by which:
The flow when a user deposits onto Eclipse via the native Ethereum bridge is summarized as follows:
The diagram below shows the interactions between Ethereum, Celestia, and the SVM Executor during the deposit flow described above:
The flow for publishing batches of Eclipse’s slots to Celestia as data blobs is summarized below:
The diagram below from Celestia explains how the commitment of the data within a given Celestia block is stored in the block header:
Similarly to other L2s that use fraud proofs (Arbitrum, Fuel, and many others), withdrawals from Eclipse require a challenge period during which verifiers can submit fraud proofs in the case of an invalid state transition:
In this final section, we will detail Eclipse’s fraud proof system design, inspired by Anatoly Yakovenko and John Adler. Generally, for any fraud proof, a verifier must:
In Eclipse’s case, (1) Celestia merklizes blobs of batches of blocks that Eclipse’s SVM executor posts, allowing transaction inclusion proofs via Merkle witnesses. For (2), unlike EVM-based L2s, which post a Merkle root to the global state tree, for performance reasons Eclipse does not update a global state tree on a transaction-by-transaction basis, but we will explain how we ensure the correctness of inputs in more detail below. Finally, in the case of (3), Eclipse’s verifier generates a zk-proof of the output(s) for a given transaction, unlike the interactive verification game approach common across EVM-based L2s.
All Eclipse transactions can be represented as taking a list of input accounts, executing a transaction, and producing a list of resultant output accounts:
The critical observation for our fraud proof design is that for transaction execution, it is always the case that any S_InputAccount must have been the S_OutputAccount of some previous transaction. This allows us to reference the last transaction in the chain that produced a given input account instead of providing a Merkle witness to a global state tree. As a result of our design, we introduce additional fraud accusation types, such as a reference to the previous transaction not being valid or the input account already being “spent” by some later transaction. We describe this process in more detail below:
In addition, the batches of transaction data posted to Celestia have their commitments relayed to the Ethereum contract. The commitments consist of:
As explained above, there are several ways a batch can be found to be incorrect:
If any commitment batch is found to be incorrect, the Eclipse bridge contract will roll back the bridge to that of the last provably correct batch commitment. Note that transactions are never removed from the chain, even in the case of fraud, so only the commitment needs to be re-computed.
This article aimed to give a high-level guide to Eclipse’s trust-minimized bridge on Ethereum and explain some details about our fraud proof design. Given the modular nature of our L2 and the nascence of our technology stack, we will continue to release articles and documentation about various aspects of Eclipse in the coming weeks.
To get involved with Eclipse Testnet, please follow our instructions here. You can contact us on Twitter or Discord with specific inquiries about our Testnet, bridge, or technical questions.
[1]: The node which computes the results of SVM transactions and applies the eventual output to Eclipse’s new state
[2]: An operator which passes on-chain events between Ethereum and Eclipse
[3]: Note that the executor, not the sequencer, posts this. If it were included in the data posted by the sequencer, it would add the complication that the sequencer could skip over a count, making it impossible for the executor to do their job correctly. This could be compensated for in the fraud proof design, but it would add extra complexity. A second advantage of having only the executor post the count is that it makes it easy to allow transaction overrides to be posted to Celestia, if desired.
[4]: SVM accounts can be represented with a unique hash. The only way this hash is modified is via a transaction.
[5]: To do this without an excessive amount of hashing, we will run a trace on each executed program to see which parts of each used sysvar are actually accessed. This is possible, but will require modifying Solana’s BPF interpreter.
[6]: This includes data for attempted transactions that failed to execute.