Sync Proof

Proof as input data for the sync committee transition used by zk. This is a very compact proof mostly taken from the light client update. the proof itself is a merkle proof using the given gindex to verify from the hash of the pubkey all the way down to the signing root.

The following diagram shows the Structure of the Merkle Tree leading to the SigningRoot:

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.

EthSyncProof

The Type is defined in src/chains/eth/ssz/verify_proof_types.h.

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

Last updated