Ngokuye, amakhasimende we-consensus ayikwazi kulula ukunikezela izinhlayiya ezithile zebhizinisi kusuka ku-BeaconState kanye nezidingo zokubonisa. I-Ethereum Light Client uhlelo ikakhulukazi izindlela ezithile zokubonisa, kodwa akukho indlela ephelele noma ephakeme kumakhasimende ukukhiqiza noma inikeza lezi zibhizinisi. kungekho realist - umoya for Ukubalwa , okuyinto eningi kakhulu ukuhambisa ngokushesha kwi-network futhi ivumela ukucindezeleka okungagunyaziwe kumasebenzisi kanye ne-node. I-specific ngisho ibonisa ukuthi ama-endpoints ye-debug eyenziwe kokufaka izimo ezingenalutho zihlanganisa kuphela ukuze ku-diagnostics, noma ukusetshenziswa kwelinye. Ukubuyekezwa isikhunta 12,145,344 271 MB Isisombululo esihle kakhulu usebenzisa , okuvumela umphakeli ukulayisha kuphela ingxenye encane, enokutholakalayo ye-state. Lokhu kubalulekile ikakhulukazi ngoba iningi le ububanzi we-state iyatholakala kusuka ku-validators (~232 MB) ne-balances (~15 MB); amanye amaphakheji angama ~24 MB. Uma umsebenzisi unemfuno eminyakeni encane kuphela, kubaluleke ukulayisha yonke i-state 271 MB. Ngokuba, i-Merkel proof inokuthumela kuphela iphepha elithathwe kanye nenkqubo yayo yokubhalisa – ngokuvamile kuphela ama-kilobytes amancane. Merkle proofs or multiproofs Ngenxa yalokhu, sincoma indlela ephelele futhi ephakeme ukuze amakhasimende ukhangela Kuyinto ukunciphisa bandwidth, ukunciphisa CPU ukupholisa, futhi ukuguqulwa izicelo ezidlulile futhi ezihlangene (isib. Ukusebenza Special Ngathi kuphela idatha eyenza, I-Nimbus historical_summaries Ukusebenza lokhu kubaluleke kwelanga le-Ethereum. I-SSZ ikhiqizwa kakhulu ku-protocol: inikeza ukuguqulwa kwe-RLP nge-SSZ, futhi (Ngokuqhathaniswa ngokuthi i (NgoLwesihlanu) I-SSZ yi-serialization format kuphela yayo. Ngakho ukwakhiwa kwe-method clean, efficient, kanye ne-standard ye-proof-based data access kuyinto isinyathelo esiyingqayizivele ku-upgrades ye-protocol elandelayo. I-Pureth (I-EIP-7919) beam chain lean chain Waze Proposed Solution: Introducing the SSZ Query Language (SSZ-QL) Isisombululo esithakazelisayo: Ukuvumelana ne-SSZ Query Language (SSZ-QL) Umqondo we-SSZ-QL yasungulwa ekuqaleni Umbuzo wayo yokuqala wayengumfihlo kodwa enhle: U-Ethan Kissling “What if we had a standard way to request SSZ field — together with a Merkle proof — directly from any consensus client?” any Waze Ngokuye, amakhasimende we-consensus akwazi ukunikezela indlela ephelele noma ephakeme yokufaka idatha e-SSZ ezithile nge-proofs. Ezinye izixazululo ze-ad-hoc zihlanganisa (isib. I-Nimbus' basic queries eyenziwe ngu-verifying ), kodwa akukho elilodwa, i-SSZ isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo isixazululo. web3ukubhalisa Umphumela we-Etan ibonisa ukuthi isilinganiso se-SSZ Query should allow: Ukubiza isithombe ye-subtree ku-object ye-SSZ Ukukhetha ukuthi ibhande kufanele ifakwe ngokugcwele noma ukuguqulwa kuphela njenge hash_tree_root Ukuhlobisa (isib. Ukuhlola i-transaction nge-root eyodwa) Ukusetshenziswa kwe-back-references (isib. Ukusetshenziswa kwe-receive ku-index efanayo ne-transaction esifanayo) Ukucacisa lapho isitifiketi kufanele ifakwe Ukusekela ukuxhumana kwangaphambili ukuze amakhasimende angakwazi ukujabulela ngempumelelo izindlu ezingaziwayo Uhlobo le-API ingasetshenziswa kumakhasimende we-consensus ne-execution. Nge-types ye-SSZ e-forward-compatible (njenge-types e-SSZ). ), isakhiwo se-request kanye ne-response kungenziwa kwenziwa ngokuvamile. I-EIP-7495 Ngokusekelwe kuleli khosi, , okuyinto ukuvelisa lokhu njengoba ingxenye yayo EPF project e prysm, kuyinto ukongeza entsha Beacon API endpoint elawula SSZ Query Language (SSZ-QL). Le endpoint ivumela abasebenzisi ukuthatha ngokufanele SSZ idatha akufunayo - akukho okwengeziwe, noma okungenani - kanye Merkle isibuyekezo ukuthi ukulawula ngokufanele. Isilinganiso yokuqala ngeke inikeze isakhiwo esincinane kodwa esebenzayo, okuyinto xa kuhlanganisa izicelo ezininzi zokusebenza. (I-Draft API specification iyatholakala ukubuyekeza.) the proposed solution by and Waze UFERNANDO Waze UFERNANDO Ngaphezu kwesi-minimum version, futhi zihlanganisa ukwenza SSZ-QL umugqa ephelele. Lesi-version ephakeme uzokuthumela izici ezihlangene njenge-filtration, ukubiza izigaba idatha, kanye nokukhetha ama-anchor points ezihlangene, konke kuhlanganise ama-proofs e-Merkel. Zihlanganisa ukunikeza le umugqa enhle ukuze ifakwe ku-official consensus specifications, futhi iphrojekthi yokuqala iyatholakala ukuhlolwa. Ukuphathwa kwe-Generalized Indexes (GI) ngaphambi kokufika ku-SSZ-QL Ku-SSZ, zonke izimo — kuhlanganise wonke – ifakwe njenge a . A inombolo eyodwa okuvumela kuphela Ngaphandle kweTree BeaconState binary Merkle tree generalized index (GI) any node Izinsizakalo ezinhle kakhulu: I-root node ine-index eyenziwe:GI = 1 Ukuze wonke umgogodla we-index i:left child = 2*i, right child = 2*i + 1 Ngiyaxolisa yonke ingcindezi njengoba: GI:1 / \ GI:2 GI:3 / \ / \ GI:4 GI:5 GI:6 GI:7 ... Ukulinganiswa okuhlobisa i-Merkel proofs kulula. Uma unayo , wena uyazi ngokufanele lapho ibekwe embhedeni futhi okuyiziphi i-hashes embhedeni kufanele ifakwe ukuze uyifake. generalized index of a leaf Example with Beacon State: 0 GenesisTime string 1 GenesisValidatorsRoot string 2 Slot string 3 Fork *Fork 4 LatestBlockHeader *BeaconBlockHeader 5 BlockRoots []string 6 StateRoots []string 7 HistoricalRoots []string 8 Eth1Data *Eth1Data 9 Eth1DataVotes []*Eth1Data 10 Eth1DepositIndex string 11 Validators []*Validator ← (p = 11) 12 Balances []string 13 RandaoMixes []string 14 Slashings []string 15 PreviousEpochAttestations []*pendingAttestation 16 CurrentEpochAttestations []*pedningAttestation 17 JustificationBits string 18 PreviousJustifiedCheckpoint *Checkpoint 19 CurrentJustifiedCheckpoint *Checkpoint 20 FinalizedCheckpoint *Checkpoint Kukho 21 izindawo ezingeni eliphezulu (i-indexed 0..20). Ukubeka lezi ku-Merkel Tree, i-SSZ i-pads ku-power elilandelayo ye-2 (32). 32 izibani → ububanzi = 5. Izikhwama ze-top-level zihlanganisa isigaba se-GI: 32 ... 63 Ukubalwa i-GI ye-top-level field usebenzisa: Ukubuyekezwa: GI_top = 2^depth + field_index Ukuze , Field Index = Ukuphakama .validators 11 Ngena ngemvume GI_validators = 2^5 + 11 = 32 + 11 = 43. Imininingwane ( ) I-leaf commitment ye-total Ngaphandle kweGlobal Ukuhlobisa 43 validator’s subtree BeaconState Multi-Level Proof: Example With validators[42].withdrawal_credentials Ngiyazi, sicela siphinde isitifiketi: BeaconState.validators[42].withdrawal_credentials Kuyinto kufuneka : two levels of proof Prove that the entire validator’s subtree is included in the BeaconState root We already know: Top-level GI for validators = 43 Using GI 43, the consensus client collects the sibling hashes on the path from leaf 43 up to root (e.g., ). GI 43 → 21 → 10 → 5 → 2 → 1 This gives the proof: validators_root ---> BeaconState_root Prove that is inside the validator’s subtree validator[42].withdrawal_credentials Now treat the . validators list as its own Merkle tree Inside this subtree: Validator is the 42-nd element → it maps to some leaf index (e.g. chunk ) inside this subtree. 42 k Withdrawal credentials lives inside one of the 32-byte SSZ chunks of validator #42 (for example chunk — number doesn’t matter, just concept). k = 128 We now generate: leaf (withdrawal_credentials chunk) ---> validators_root by collecting sibling hashes inside the local validator-subtree. Final Combined Proof You end up with: 1. Local Level Proof Proves withdrawal_credentials --> validator_root 2. Top-level branch proof Proves validator_root --> BeaconState_root A verifier can now reconstruct the BeaconState root from only: the requested leaf the two lists of sibling nodes the known BeaconState root No full state download needed. ┌───────────────────────────────┐ │ BeaconState Root │ └───────────────────────────────┘ ▲ │ (Top-level Merkle Proof) │ Sibling hashes for GI = 43 │ ┌─────────────────────────────────────────┐ │ validators_root (GI = 43) │ └─────────────────────────────────────────┘ ▲ │ (Local Subtree Proof) │ Proof inside validators list │ for index = 42 │ ┌─────────────────────────────────────────────────────────┐ │ Validator[42] Subtree (list element #42) │ └─────────────────────────────────────────────────────────┘ ▲ │ (Field-level Merkle Proof) │ Sibling hashes inside the │ validator struct │ ┌──────────────────────────────────────────┐ │ validator[42].withdrawal_credentials │ ← requested field └──────────────────────────────────────────┘ Understanding SSZ Serialization Before Computing Generalized Indices Ukubuyekezwa kwe-SSZ Serialization ngaphambi kokubuyekezwa kwe-Indices Generalized Ukubuyekezwa kwe-correct , kuqala kufanele ufunde kanjani i-SSZ Waze Uhlobo lwekhompyutha I-indices ye-generalized ayikho ngaphandle kwe-isolation – zihlanganisa kusuka ku-indices , and the shape of the tree depends entirely on how SSZ interprets the underlying Go struct fields. generalized index Ukubuyekezwa Ukuhlobisa Umbala we-Merkel Tree Ku-SSZ, isigaba se-field angakwazi kuphela omunye kwezigaba ezimbini: Base Types (fixed-size values) , , , etc. These are straightforward — they always serialize into a fixed number of bytes. uint64 Bytes32 Bytes20 uint256 Composite Types (like BeaconState), (fixed length), (variable length), , And each of them is serialized in a slightly different way. Container Vector[T, N] List[T, N] Bitvector[N] Bitlist[N] To compute a for any field inside a state, the SSZ tree must first know . This is why the generated files include tags such as: generalized index (g-index) how that field is serialized *.pb.go ssz-size:"8192,32" → Vector ssz-max:"16" → List ssz-size:"?,32" → List of Vector Ukubalwa i-index eyenziwe ngalinye, kuqala kuqinisekisa ukuthi Kusukela ku-object SSZ structure Izindawo ezifakwe, noma wonke ibhande kuyinto List noma Vector, Izingane izindandatho zihlanganisa ngamunye, and how nested types should be traversed. Kuyinto kahle ukuthi i- Function does in Prysm, itholakala ku AnalyzeObject encoding/ssz/query/analyzer.go // AnalyzeObject analyzes given object and returns its SSZ information. func AnalyzeObject(obj SSZObject) (*SszInfo, error) { value := reflect.ValueOf(obj) info, err := analyzeType(value, nil) if err != nil { return nil, fmt.Errorf("could not analyze type %s: %w", value.Type().Name(), err) } // Populate variable-length information using the actual value. err = PopulateVariableLengthInfo(info, value) if err != nil { return nil, fmt.Errorf("could not populate variable length info for type %s: %w", value.Type().Name(), err) } return info, nil } What analyzeType Does Kuyinto umsebenzi ukuthi Izindaba ze-Out it is. It is a - Ukusebenza kulingana nezindleko zokushesha, kuphela ku-Go type kanye ne-struct tags. analyzeType examines a Go value using reflection what kind of SSZ type I-Pure Type-Analysis Isinyathelo not Uma uthathe indawo noma isakhiwo, it: Ukubuyekeza uhlobo le-Go (uint, struct, slice, pointer, njll) Ukubala ama-struct tags ezihambelana ne-SSZ ezifana ne-ssz-size ne-ssz-max Decides : whether this field is a basic SSZ type ( , , ) uint64 uint32 bool a Vector ( ) ssz-size:"N" a List ( ) ssz-max:"N" a Bitvector / Bitlist a Container (struct) Builds an that describes: SszInfo record the SSZ type (List, Vector, Container...) whether it is fixed-sized or variable-sized offsets of fields (for Containers) nested SSZ information for child fields Thola Njengoba umsebenzi okuyinto Ukukhiqiza A Ukuze lokhu uhlobo. analyzeType scans the type definition static SSZ layout blueprint What PopulateVariableLengthInfo Does Nokho izifundo ze , some SSZ objects cannot be fully described without the . analyzeType Uhlobo Imininingwane Izibonelo: Izincazelo ([]T) kufanele ufunde ubude wayo Izindlu ze-containers ze-variable-size kufanele zihlanganisa Nested lists need each element’s actual size fills in this missing runtime information. PopulateVariableLengthInfo Yini: Ukubonisa blueprint ye-SszInfo eyenziwe ngu-analyzeType Ukubonisa ixabiso rhoqo le-object eyenziwe Computes values that can only be known at runtime: length of Lists sizes of nested variable elements offsets of variable-sized fields inside Containers bitlist length from bytes It processes konke — isibonelo, I-Container nge-List ebandayo i-Structures nge-Lists iyahlekile. recursively Thola Njengoba umsebenzi okuyinto futhi ithatha izinga lokuphelelwa ngokufanelekileyo ngokuvumelana ne-value yayo yokuthumela. PopulateVariableLengthInfo takes the blueprint from analyzeType Example: Sishayele lokhu umsebenzi nge-BeaconState Struct type BeaconState struct { state protoimpl.MessageState `protogen:"open.v1"` GenesisTime uint64 `protobuf:"varint,1001,opt,name=genesis_time,json=genesisTime,proto3" json:"genesis_time,omitempty"` GenesisValidatorsRoot []byte `protobuf:"bytes,1002,opt,name=genesis_validators_root,json=genesisValidatorsRoot,proto3" json:"genesis_validators_root,omitempty" ssz-size:"32"` Slot github_com_OffchainLabs_prysm_v7_consensus_types_primitives.Slot `protobuf:"varint,1003,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/OffchainLabs/prysm/v7/consensus-types/primitives.Slot"` Fork *Fork `protobuf:"bytes,1004,opt,name=fork,proto3" json:"fork,omitempty"` LatestBlockHeader *BeaconBlockHeader `protobuf:"bytes,2001,opt,name=latest_block_header,json=latestBlockHeader,proto3" json:"latest_block_header,omitempty"` BlockRoots [][]byte `protobuf:"bytes,2002,rep,name=block_roots,json=blockRoots,proto3" json:"block_roots,omitempty" ssz-size:"8192,32"` StateRoots [][]byte `protobuf:"bytes,2003,rep,name=state_roots,json=stateRoots,proto3" json:"state_roots,omitempty" ssz-size:"8192,32"` HistoricalRoots [][]byte `protobuf:"bytes,2004,rep,name=historical_roots,json=historicalRoots,proto3" json:"historical_roots,omitempty" ssz-max:"16777216" ssz-size:"?,32"` Eth1Data *Eth1Data `protobuf:"bytes,3001,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` Eth1DataVotes []*Eth1Data `protobuf:"bytes,3002,rep,name=eth1_data_votes,json=eth1DataVotes,proto3" json:"eth1_data_votes,omitempty" ssz-max:"2048"` Eth1DepositIndex uint64 `protobuf:"varint,3003,opt,name=eth1_deposit_index,json=eth1DepositIndex,proto3" json:"eth1_deposit_index,omitempty"` Validators []*Validator `protobuf:"bytes,4001,rep,name=validators,proto3" json:"validators,omitempty" ssz-max:"1099511627776"` Balances []uint64 `protobuf:"varint,4002,rep,packed,name=balances,proto3" json:"balances,omitempty" ssz-max:"1099511627776"` RandaoMixes [][]byte `protobuf:"bytes,5001,rep,name=randao_mixes,json=randaoMixes,proto3" json:"randao_mixes,omitempty" ssz-size:"65536,32"` Slashings []uint64 `protobuf:"varint,6001,rep,packed,name=slashings,proto3" json:"slashings,omitempty" ssz-size:"8192"` PreviousEpochAttestations []*PendingAttestation `protobuf:"bytes,7001,rep,name=previous_epoch_attestations,json=previousEpochAttestations,proto3" json:"previous_epoch_attestations,omitempty" ssz-max:"4096"` CurrentEpochAttestations []*PendingAttestation `protobuf:"bytes,7002,rep,name=current_epoch_attestations,json=currentEpochAttestations,proto3" json:"current_epoch_attestations,omitempty" ssz-max:"4096"` JustificationBits github_com_OffchainLabs_go_bitfield.Bitvector4 `protobuf:"bytes,8001,opt,name=justification_bits,json=justificationBits,proto3" json:"justification_bits,omitempty" cast-type:"github.com/OffchainLabs/go-bitfield.Bitvector4" ssz-size:"1"` PreviousJustifiedCheckpoint *Checkpoint `protobuf:"bytes,8002,opt,name=previous_justified_checkpoint,json=previousJustifiedCheckpoint,proto3" json:"previous_justified_checkpoint,omitempty"` CurrentJustifiedCheckpoint *Checkpoint `protobuf:"bytes,8003,opt,name=current_justified_checkpoint,json=currentJustifiedCheckpoint,proto3" json:"current_justified_checkpoint,omitempty"` FinalizedCheckpoint *Checkpoint `protobuf:"bytes,8004,opt,name=finalized_checkpoint,json=finalizedCheckpoint,proto3" json:"finalized_checkpoint,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } package main import ( "fmt" "github.com/OffchainLabs/prysm/v7/encoding/ssz/query" eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1" ) func main() { v := &eth.BeaconState{} // Analyze it with Prysm’s existing SSZ analyzer info, _ := query.AnalyzeObject(v) fmt.Println(info.Print()) } Ukusebenza: BeaconState (Variable-size / size: 2687377) ├─ genesis_time (offset: 0) uint64 (Fixed-size / size: 8) ├─ genesis_validators_root (offset: 8) Bytes32 (Fixed-size / size: 32) ├─ slot (offset: 40) Slot (Fixed-size / size: 8) ├─ fork (offset: 48) Fork (Fixed-size / size: 16) │ ├─ previous_version (offset: 0) Bytes4 (Fixed-size / size: 4) │ ├─ current_version (offset: 4) Bytes4 (Fixed-size / size: 4) │ └─ epoch (offset: 8) Epoch (Fixed-size / size: 8) ├─ latest_block_header (offset: 64) BeaconBlockHeader (Fixed-size / size: 112) │ ├─ slot (offset: 0) Slot (Fixed-size / size: 8) │ ├─ proposer_index (offset: 8) ValidatorIndex (Fixed-size / size: 8) │ ├─ parent_root (offset: 16) Bytes32 (Fixed-size / size: 32) │ ├─ state_root (offset: 48) Bytes32 (Fixed-size / size: 32) │ └─ body_root (offset: 80) Bytes32 (Fixed-size / size: 32) ├─ block_roots (offset: 176) Vector[Bytes32, 8192] (Fixed-size / size: 262144) ├─ state_roots (offset: 262320) Vector[Bytes32, 8192] (Fixed-size / size: 262144) ├─ historical_roots (offset: 2687377) List[Bytes32, 16777216] (Variable-size / length: 0, size: 0) ├─ eth1_data (offset: 524468) Eth1Data (Fixed-size / size: 72) │ ├─ deposit_root (offset: 0) Bytes32 (Fixed-size / size: 32) │ ├─ deposit_count (offset: 32) uint64 (Fixed-size / size: 8) │ └─ block_hash (offset: 40) Bytes32 (Fixed-size / size: 32) ├─ eth1_data_votes (offset: 2687377) List[Eth1Data, 2048] (Variable-size / length: 0, size: 0) ├─ eth1_deposit_index (offset: 524544) uint64 (Fixed-size / size: 8) ├─ validators (offset: 2687377) List[Validator, 1099511627776] (Variable-size / length: 0, size: 0) ├─ balances (offset: 2687377) List[uint64, 1099511627776] (Variable-size / length: 0, size: 0) ├─ randao_mixes (offset: 524560) Vector[Bytes32, 65536] (Fixed-size / size: 2097152) ├─ slashings (offset: 2621712) Vector[uint64, 8192] (Fixed-size / size: 65536) ├─ previous_epoch_attestations (offset: 2687377) List[PendingAttestation, 4096] (Variable-size / length: 0, size: 0) ├─ current_epoch_attestations (offset: 2687377) List[PendingAttestation, 4096] (Variable-size / length: 0, size: 0) ├─ justification_bits (offset: 2687256) Bitvector[8] (Fixed-size / size: 1) ├─ previous_justified_checkpoint (offset: 2687257) Checkpoint (Fixed-size / size: 40) │ ├─ epoch (offset: 0) Epoch (Fixed-size / size: 8) │ └─ root (offset: 8) Bytes32 (Fixed-size / size: 32) ├─ current_justified_checkpoint (offset: 2687297) Checkpoint (Fixed-size / size: 40) │ ├─ epoch (offset: 0) Epoch (Fixed-size / size: 8) │ └─ root (offset: 8) Bytes32 (Fixed-size / size: 32) └─ finalized_checkpoint (offset: 2687337) Checkpoint (Fixed-size / size: 40) ├─ epoch (offset: 0) Epoch (Fixed-size / size: 8) └─ root (offset: 8) Bytes32 (Fixed-size / size: 32) Ngo-SSZ analyzer output, i- Ukubonisa yonke ibhizinisi inikeza indawo esifanele ye-byte lapho ibhizinisi elizayo lapho yonke i-struct yakhelwe ngokuvumelana nezinsizakalo ze-SSZ. , zihlanganisa ngokugqithiselwe, futhi i-offset ibonisa lapho ngamunye le ibhayisikili ivule ngaphakathi kwelinye ibhayisikili esihlanganisiwe. Ngokwesibonelo, ku-line Ukuphakama is a 32-byte fixed-size value, futhi its serialized bytes kuqala isikhundla in the SSZ-encoded byte array. I Ukubonisa inani le-byte ebonakalayo ekukhiqizeni kwe-serialized output (i-byte 32 kulesi). Kwi-type ye-fixed-size, usayizi asekelwe ngaphambi kokubili, kanti ku-type ye-variable-size, i-analyzer ilawula usayizi ngokuvumelana ne-value efanayo. Ngezinye, i-offset ne-size ibonisa ngokufanele indlela yokuhlanganisa kwe-SSZ ku-memory lapho i-struct iyahambisana. offset fixed-size fields first root (offset: 8) Bytes32 (Fixed-size / size: 32) root 8 size Example: Finding the Merkle Leaf for a Field Using the Offset Umzekelo: Ukukhola i-Merkel le-leaf ye-field usebenzisa i-offset Thola uchungechunge esiyingqayizivele kusuka ku-SSZ Analyzer Output: ├─ fork (offset: 48) Fork (Fixed-size / size: 16) │ ├─ previous_version (offset: 0) Bytes4 (Fixed-size / size: 4) │ ├─ current_version (offset: 4) Bytes4 (Fixed-size / size: 4) │ └─ epoch (offset: 8) Epoch (Fixed-size / size: 8) Thola ukubonisa indawo: fork.epoch The “fork” indawo ku Ukuqala ku ku-Serialized Byte Stream. BeaconState offset 48 Ngaphandle I-The isikhunta kuqala at (Kuhlanganisa ekuqaleni kwe-Fork) fork epoch offset 8 Ngena ngemvume absolute_offset = base_offset_of_fork + offset_of_epoch_inside_fork absolute_offset = 48 + 8 = 56 bytes kuqala ku-byte 56 ye-BeaconState ephelele. fork.epoch SSZ usihlanganisa serialization ku : 32-byte chunks Chunk 0 → ama-byte 0–31 Chunk 1 → ama-byte 32-63 Chunk 2 → ama-byte 64-95 … Ngiyazi ukuthi chunk iqukethe byte : 56 chunk_index = floor(56 / 32) = 1 Ngena ngemvume Umbala obandayo is Leaf / Chunk 1. fork.epoch Yini Ngena ngemvume fork.epoch 8-byte ngaphakathi chunk 1 (i-byte 32-63): local_offset = 56 - 32 = 24 Ngakho ngaphakathi 32-byte isikhwama, ama-byte kubonakala: [ 0 … 23 ] → unrelated fields [ 24 … 31 ] → fork.epoch (8 bytes) To prove this value, you: Thola chunk 1 → Kuyinto i-leaf yakho. When hashing up the tree, at each level: If chunk is a left child → record the right sibling hash. If chunk is a right child → record the left sibling hash. Thola kuze kufinyelela ku-Merkel root. I-hashes yama-sister eyenziwe ku-your: Yini? SSZ Merkle proof branch for fork.epoch Anyone can verify this by recomputing: hash_tree_root(leaf + all_siblings) == state_root This introduces two new endpoints that expose the initial version of Ukuze Prysm: SSZ Query Language (SSZ-QL) /prysm/v1/beacon/states/{state_id}/query /prysm/v1/beacon/blocks/{block_id}/query Zonke ama-endpoints zihlanganisa isifundo se-endpoint ye-SSZ-QL futhi zihlanganisa amakhasimende ukuhlola izindlu ezithile ngaphakathi kwe-BeaconState noma i-BeaconBlock ngokusebenzisa isinyathelo se-query. I-server ivumela ifolda se-SSZ esithathwe njenge-SSZ-byte esithambile. Kwangathi, ngesikhathi sokushicilela lokhu, i-feature inikeza kuphela isinyathelo esisodwa ngamakhasimende, futhi I-flag iyahlekile - i-PR ivumela imibuzo ngaphandle kwe-Merkel. include_proof Isakhiwo se-request kuyinto: type SSZQueryRequest struct { Query string `json:"query"` IncludeProof bool `json:"include_proof,omitempty"` } Futhi amabili amaphuzu endpoints return a SSZ-encoded impendulo of this form: type SSZQueryResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Root []byte `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty" ssz-size:"32"` Result []byte `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty" ssz-max:"1073741824"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } Ukuze isifinyezo ephelele kanye nezibonelo, ungakwazi ukuqondisa lokhu ikhaya Waze ulwazi kusuka ku-SSZ analyzer, ngaphandle kokusebenzisa i-index eyahlukile. For now, the implementation locates the requested field using the computed offset size Ukuze uthole ulwazi oluthile, ungakwazi ukuyifaka umsebenzi we-Jun Song - eyenziwe ngokubambisana ne-Fernando njenge-part of their EPF project in prysm. For more information, you can check out ’s work — implemented together with as part of their EPF project in prysm. Jun Song Fernando Umculo UFERNANDO