Skip to content

Commit f8b07ba

Browse files
zsfelfoldifjl
authored andcommitted
beacon: fixed issues with electra light sync
1 parent 4da69b3 commit f8b07ba

File tree

7 files changed

+65
-29
lines changed

7 files changed

+65
-29
lines changed

beacon/blsync/engineclient.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func (ec *engineClient) callForkchoiceUpdated(fork string, event types.ChainHead
140140

141141
var method string
142142
switch fork {
143-
case "deneb":
143+
case "deneb", "electra":
144144
method = "engine_forkchoiceUpdatedV3"
145145
case "capella":
146146
method = "engine_forkchoiceUpdatedV2"

beacon/light/api/light_api.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ var (
4343
)
4444

4545
type CommitteeUpdate struct {
46-
Version string
4746
Update types.LightClientUpdate
4847
NextSyncCommittee types.SerializedSyncCommittee
4948
}
@@ -81,9 +80,9 @@ func (u *CommitteeUpdate) UnmarshalJSON(input []byte) error {
8180
if err := json.Unmarshal(input, &dec); err != nil {
8281
return err
8382
}
84-
u.Version = dec.Version
8583
u.NextSyncCommittee = dec.Data.NextSyncCommittee
8684
u.Update = types.LightClientUpdate{
85+
Version: dec.Version,
8786
AttestedHeader: types.SignedHeader{
8887
Header: dec.Data.Header.Beacon,
8988
Signature: dec.Data.SyncAggregate,
@@ -206,7 +205,7 @@ func (api *BeaconLightApi) GetOptimisticUpdate() (types.OptimisticUpdate, error)
206205

207206
func decodeOptimisticUpdate(enc []byte) (types.OptimisticUpdate, error) {
208207
var data struct {
209-
Version string
208+
Version string `json:"version"`
210209
Data struct {
211210
Attested jsonHeaderWithExecProof `json:"attested_header"`
212211
Aggregate types.SyncAggregate `json:"sync_aggregate"`
@@ -259,7 +258,7 @@ func (api *BeaconLightApi) GetFinalityUpdate() (types.FinalityUpdate, error) {
259258

260259
func decodeFinalityUpdate(enc []byte) (types.FinalityUpdate, error) {
261260
var data struct {
262-
Version string
261+
Version string `json:"version"`
263262
Data struct {
264263
Attested jsonHeaderWithExecProof `json:"attested_header"`
265264
Finalized jsonHeaderWithExecProof `json:"finalized_header"`
@@ -289,6 +288,7 @@ func decodeFinalityUpdate(enc []byte) (types.FinalityUpdate, error) {
289288
}
290289

291290
return types.FinalityUpdate{
291+
Version: data.Version,
292292
Attested: types.HeaderWithExecProof{
293293
Header: data.Data.Attested.Beacon,
294294
PayloadHeader: attestedExecHeader,
@@ -355,7 +355,8 @@ func (api *BeaconLightApi) GetCheckpointData(checkpointHash common.Hash) (*types
355355
// See data structure definition here:
356356
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientbootstrap
357357
type bootstrapData struct {
358-
Data struct {
358+
Version string `json:"version"`
359+
Data struct {
359360
Header jsonBeaconHeader `json:"header"`
360361
Committee *types.SerializedSyncCommittee `json:"current_sync_committee"`
361362
CommitteeBranch merkle.Values `json:"current_sync_committee_branch"`
@@ -374,6 +375,7 @@ func (api *BeaconLightApi) GetCheckpointData(checkpointHash common.Hash) (*types
374375
return nil, fmt.Errorf("invalid checkpoint block header, have %v want %v", header.Hash(), checkpointHash)
375376
}
376377
checkpoint := &types.BootstrapData{
378+
Version: data.Version,
377379
Header: header,
378380
CommitteeBranch: data.Data.CommitteeBranch,
379381
CommitteeRoot: data.Data.Committee.Root(),
@@ -395,7 +397,7 @@ func (api *BeaconLightApi) GetBeaconBlock(blockRoot common.Hash) (*types.BeaconB
395397
}
396398

397399
var beaconBlockMessage struct {
398-
Version string
400+
Version string `json:"version"`
399401
Data struct {
400402
Message json.RawMessage `json:"message"`
401403
}

beacon/light/test_helpers.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ func GenerateTestUpdate(config *params.ChainConfig, period uint64, committee, ne
3939
var attestedHeader types.Header
4040
if finalizedHeader {
4141
update.FinalizedHeader = new(types.Header)
42-
*update.FinalizedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+100, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
43-
attestedHeader, update.FinalityBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexFinalBlock, merkle.Value(update.FinalizedHeader.Hash()))
42+
*update.FinalizedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+100, params.StateIndexNextSyncCommittee(""), merkle.Value(update.NextSyncCommitteeRoot))
43+
attestedHeader, update.FinalityBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexFinalBlock(""), merkle.Value(update.FinalizedHeader.Hash()))
4444
} else {
45-
attestedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+2000, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
45+
attestedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+2000, params.StateIndexNextSyncCommittee(""), merkle.Value(update.NextSyncCommitteeRoot))
4646
}
4747
update.AttestedHeader = GenerateTestSignedHeader(attestedHeader, config, committee, attestedHeader.Slot+1, signerCount)
4848
return update
@@ -63,7 +63,7 @@ func GenerateTestSignedHeader(header types.Header, config *params.ChainConfig, c
6363
}
6464

6565
func GenerateTestCheckpoint(period uint64, committee *types.SerializedSyncCommittee) *types.BootstrapData {
66-
header, branch := makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexSyncCommittee, merkle.Value(committee.Root()))
66+
header, branch := makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexSyncCommittee(""), merkle.Value(committee.Root()))
6767
return &types.BootstrapData{
6868
Header: header,
6969
Committee: committee,

beacon/params/networks.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ var (
4141
AddFork("ALTAIR", 50, []byte{144, 0, 0, 112}).
4242
AddFork("BELLATRIX", 100, []byte{144, 0, 0, 113}).
4343
AddFork("CAPELLA", 56832, []byte{144, 0, 0, 114}).
44-
AddFork("DENEB", 132608, []byte{144, 0, 0, 115})
44+
AddFork("DENEB", 132608, []byte{144, 0, 0, 115}).
45+
AddFork("ELECTRA", 222464, []byte{144, 0, 0, 116})
4546

4647
HoleskyLightConfig = (&ChainConfig{
4748
GenesisValidatorsRoot: common.HexToHash("0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1"),
@@ -52,5 +53,6 @@ var (
5253
AddFork("ALTAIR", 0, []byte{2, 1, 112, 0}).
5354
AddFork("BELLATRIX", 0, []byte{3, 1, 112, 0}).
5455
AddFork("CAPELLA", 256, []byte{4, 1, 112, 0}).
55-
AddFork("DENEB", 29696, []byte{5, 1, 112, 0})
56+
AddFork("DENEB", 29696, []byte{5, 1, 112, 0}).
57+
AddFork("ELECTRA", 115968, []byte{6, 1, 112, 0})
5658
)

beacon/params/params.go

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,46 @@ const (
2929
)
3030

3131
const (
32-
StateIndexGenesisTime = 32
33-
StateIndexGenesisValidators = 33
34-
StateIndexForkVersion = 141
35-
StateIndexLatestHeader = 36
36-
StateIndexBlockRoots = 37
37-
StateIndexStateRoots = 38
38-
StateIndexHistoricRoots = 39
39-
StateIndexFinalBlock = 105
40-
StateIndexSyncCommittee = 54
41-
StateIndexNextSyncCommittee = 55
42-
StateIndexExecPayload = 56
43-
StateIndexExecHead = 908
32+
StateIndexGenesisTime = 32
33+
StateIndexGenesisValidators = 33
34+
StateIndexForkVersion = 141
35+
StateIndexLatestHeader = 36
36+
StateIndexBlockRoots = 37
37+
StateIndexStateRoots = 38
38+
StateIndexHistoricRoots = 39
39+
StateIndexFinalBlockOld = 105
40+
StateIndexFinalBlockElectra = 169
41+
StateIndexSyncCommitteeOld = 54
42+
StateIndexSyncCommitteeElectra = 86
43+
StateIndexNextSyncCommitteeOld = 55
44+
StateIndexNextSyncCommitteeElectra = 87
45+
StateIndexExecPayload = 56
46+
StateIndexExecHead = 908
4447

4548
BodyIndexExecPayload = 25
4649
)
50+
51+
func StateIndexFinalBlock(forkName string) uint64 {
52+
switch forkName {
53+
case "bellatrix", "capella", "deneb":
54+
return StateIndexFinalBlockOld
55+
default:
56+
return StateIndexFinalBlockElectra
57+
}
58+
}
59+
func StateIndexSyncCommittee(forkName string) uint64 {
60+
switch forkName {
61+
case "bellatrix", "capella", "deneb":
62+
return StateIndexSyncCommitteeOld
63+
default:
64+
return StateIndexSyncCommitteeElectra
65+
}
66+
}
67+
func StateIndexNextSyncCommittee(forkName string) uint64 {
68+
switch forkName {
69+
case "bellatrix", "capella", "deneb":
70+
return StateIndexNextSyncCommitteeOld
71+
default:
72+
return StateIndexNextSyncCommitteeElectra
73+
}
74+
}

beacon/types/beacon_block.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ func (b *BeaconBlock) ExecutionRequestsList() [][]byte {
144144

145145
func marshalRequests(spec *zrntcommon.Spec, items ...zrntcommon.SpecObj) (list [][]byte) {
146146
var buf bytes.Buffer
147+
list = [][]byte{}
147148
for typ, data := range items {
148149
buf.Reset()
149150
buf.WriteByte(byte(typ))

beacon/types/light_sync.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type HeadInfo struct {
3636
// together with a proof through a beacon header and corresponding state.
3737
// Note: BootstrapData is fetched from a server based on a known checkpoint hash.
3838
type BootstrapData struct {
39+
Version string
3940
Header Header
4041
CommitteeRoot common.Hash
4142
Committee *SerializedSyncCommittee `rlp:"-"`
@@ -47,7 +48,7 @@ func (c *BootstrapData) Validate() error {
4748
if c.CommitteeRoot != c.Committee.Root() {
4849
return errors.New("wrong committee root")
4950
}
50-
return merkle.VerifyProof(c.Header.StateRoot, params.StateIndexSyncCommittee, c.CommitteeBranch, merkle.Value(c.CommitteeRoot))
51+
return merkle.VerifyProof(c.Header.StateRoot, params.StateIndexSyncCommittee(c.Version), c.CommitteeBranch, merkle.Value(c.CommitteeRoot))
5152
}
5253

5354
// LightClientUpdate is a proof of the next sync committee root based on a header
@@ -59,6 +60,7 @@ func (c *BootstrapData) Validate() error {
5960
// See data structure definition here:
6061
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientupdate
6162
type LightClientUpdate struct {
63+
Version string
6264
AttestedHeader SignedHeader // Arbitrary header out of the period signed by the sync committee
6365
NextSyncCommitteeRoot common.Hash // Sync committee of the next period advertised in the current one
6466
NextSyncCommitteeBranch merkle.Values // Proof for the next period's sync committee
@@ -79,11 +81,11 @@ func (update *LightClientUpdate) Validate() error {
7981
if update.FinalizedHeader.SyncPeriod() != period {
8082
return errors.New("finalized header is from different period")
8183
}
82-
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexFinalBlock, update.FinalityBranch, merkle.Value(update.FinalizedHeader.Hash())); err != nil {
84+
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexFinalBlock(update.Version), update.FinalityBranch, merkle.Value(update.FinalizedHeader.Hash())); err != nil {
8385
return fmt.Errorf("invalid finalized header proof: %w", err)
8486
}
8587
}
86-
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexNextSyncCommittee, update.NextSyncCommitteeBranch, merkle.Value(update.NextSyncCommitteeRoot)); err != nil {
88+
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexNextSyncCommittee(update.Version), update.NextSyncCommitteeBranch, merkle.Value(update.NextSyncCommitteeRoot)); err != nil {
8789
return fmt.Errorf("invalid next sync committee proof: %w", err)
8890
}
8991
return nil
@@ -194,6 +196,7 @@ func (u *OptimisticUpdate) Validate() error {
194196
// See data structure definition here:
195197
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate
196198
type FinalityUpdate struct {
199+
Version string
197200
Attested, Finalized HeaderWithExecProof
198201
FinalityBranch merkle.Values
199202
// Sync committee BLS signature aggregate
@@ -223,7 +226,7 @@ func (u *FinalityUpdate) Validate() error {
223226
if err := u.Finalized.Validate(); err != nil {
224227
return err
225228
}
226-
return merkle.VerifyProof(u.Attested.StateRoot, params.StateIndexFinalBlock, u.FinalityBranch, merkle.Value(u.Finalized.Hash()))
229+
return merkle.VerifyProof(u.Attested.StateRoot, params.StateIndexFinalBlock(u.Version), u.FinalityBranch, merkle.Value(u.Finalized.Hash()))
227230
}
228231

229232
// ChainHeadEvent returns an authenticated execution payload associated with the

0 commit comments

Comments
 (0)