An Ethereum prover/verifier implementation of a light client that employs the Sync Committee protocol of Ethereum to bridge events from Ethereum to Axelar.
More on the Light Client Architecture
This repo is a collection of modules that work together to implement a light client.
- Relayer/Feeder: The core off-chain component, responsible for consuming the events from the queue, generating the the necessary proofs, and providing them to the verifier along with the event. It also includes an off-chain component that will feed the light client with Update messages to keep up with the latest sync-committee.
- Light Client: The core source of the verifier.
- Types: Common types used across the different modules.
- Eth An auxiliary package for querying the Ethereum beacon and execution APIs.
More details about the packages are in their corresponding READMEs.
The relayer module consumes events from a rabbitMQ instance that is implemented
in Axelar and submits them to the on-chain verifier that exists in the
light-client package. To set up the relayer the following steps are
required.
- Set up an instance of the state prover.
- Obtain an Ethereum Beacon and Execution API URLs, the gateway address and the Wasm URL.
- Deploy the light client verifier by following the instructions in the
contractspackage. - Go to the
relayerpackage and follow the instructions mentioned there for running both the feeder and the relayer.
Along with the README files, code documentation is also available using the cargo doc --open command.
This project uses open-source code from the following projects. We are deeply grateful for all the work they've put into developing this software, their commitment to open-source software, and for licensing the work using a permissive license which allowed us to incorporate their work:
- Helios for a major part of the light client verification/processing.
- Polytope's sync_committee_primitives for the Goerli and mainnet constants as well as some primitive beacon types.
- ethers.rs and alloy.rs for communicating with Ethereum and for encoding/decoding execution messages.
- ssz_rs for SSZ serialization/deserialization.