# 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/v1.1.26/src/chains/eth/ssz/verify_proof_types.h#L614).

```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]    # proof merkle proof from the signing root to the pubkeys of the next_synccommittee
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://corpus-core.gitbook.io/specification-colibri-stateless/specifications/ethereum/sync-proof.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
