> For the complete documentation index, see [llms.txt](https://corpus-core.gitbook.io/specification-colibri-stateless/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://corpus-core.gitbook.io/specification-colibri-stateless/specifications/ethereum/sync-proof.md).

# Sync Proof

The **Sync Proof** serves as input data for verifying a sync committee transition, typically used within zero-knowledge proof systems (zk). It is a compact representation derived from the **Light Client Update** structure.

The proof is constructed as a **Merkle proof** using a given `gindex` (generalized index). It verifies inclusion starting from the hash of a validator’s public key all the way up to the **signing root**. This ensures that the participating validator’s public key is part of the sync committee that signed a specific block.

The following diagram illustrates the structure of the Merkle tree leading to the **SigningRoot**:

![](/files/nC0o6piQxU6JaTdRlRy9)

In order to validate, we need to calculate

* 512 x sha256 for each pubkey
* 512 x sha256 merkle proof for the pubkeys
* 2 x sha256 for the SyncCommittee
* 5 x sha256 for the stateRoot
* 3 x sha256 for the blockheader hash
* 1 x for the SigningRoot

So in total, we need to verify 1035 hashes and 1 bls signature.

The **Sync Proof** allows cryptographic verification of validator membership in the active sync committee without requiring the entire committee set, reducing proof size and improving zk-efficiency.

## EthSyncProof

The **Sync Proof** is a compact representation of the **Light Client Update** structure.

The Type is defined in [src/chains/eth/ssz/verify\_proof\_types.h](https://github.com/corpus-core/colibri-stateless/blob/dev/src/chains/eth/ssz/verify_proof_types.h#L732).

```python
class EthSyncProof(Container):
    oldKeys                : Vector [blsPubky, 512] # the old keys which produced the signature
    newKeys                : Vector [blsPubky, 512] # the new keys to be proven
    syncCommitteeBits      : BitVector [512]        # the bits of the validators that signed the block
    syncCommitteeSignature : ByteVector [96]        # the signature of the sync committee
    gidx                   : Uint64                 # the general index from the signing root to the pubkeys of the next_synccommittee
    slot                   : Uint64                 # the slot of the block
    proposerIndex          : Uint64
    proof                  : List [bytes32, 256]    # the merkle proof from the signing root to the pubkeys of the next sync committee
```
