> 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/proofs/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**:

![](https://1306347641-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhWyjkndFSkqQ8UEoWFD1%2Fuploads%2Fgit-blob-259953fa2eeb8cff778a2eae8d60250695014701%2Fmermaid_8d06f9a1.png?alt=media)

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/v3.0.2/src/chains/eth/ssz/verify_proof_types.h#L719).

```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                  : ProgList [bytes32]     # the merkle proof from the signing root to the pubkeys of the next sync committee
```
