Skip to content

Commit 0e7deff

Browse files
authored
Light Client - use the new consensus types (#14549)
* in progress * completed logic * var name * additional logic changes * fix createDefaultLightClientUpdate * empty fields * unused context
1 parent ffc443b commit 0e7deff

24 files changed

+956
-582
lines changed

api/server/structs/BUILD.bazel

+1-2
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ go_library(
3636
"//math:go_default_library",
3737
"//proto/engine/v1:go_default_library",
3838
"//proto/eth/v1:go_default_library",
39-
"//proto/eth/v2:go_default_library",
40-
"//proto/migration:go_default_library",
4139
"//proto/prysm/v1alpha1:go_default_library",
40+
"//runtime/version:go_default_library",
4241
"@com_github_ethereum_go_ethereum//common:go_default_library",
4342
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",
4443
"@com_github_pkg_errors//:go_default_library",

api/server/structs/conversions.go

+7
Original file line numberDiff line numberDiff line change
@@ -1546,3 +1546,10 @@ func EventChainReorgFromV1(event *ethv1.EventChainReorg) *ChainReorgEvent {
15461546
ExecutionOptimistic: event.ExecutionOptimistic,
15471547
}
15481548
}
1549+
1550+
func SyncAggregateFromConsensus(sa *eth.SyncAggregate) *SyncAggregate {
1551+
return &SyncAggregate{
1552+
SyncCommitteeBits: hexutil.Encode(sa.SyncCommitteeBits),
1553+
SyncCommitteeSignature: hexutil.Encode(sa.SyncCommitteeSignature),
1554+
}
1555+
}

api/server/structs/conversions_lightclient.go

+82-54
Original file line numberDiff line numberDiff line change
@@ -3,125 +3,153 @@ package structs
33
import (
44
"encoding/json"
55
"fmt"
6-
"strconv"
76

87
"github.com/ethereum/go-ethereum/common/hexutil"
98
"github.com/pkg/errors"
10-
v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1"
11-
v2 "github.com/prysmaticlabs/prysm/v5/proto/eth/v2"
12-
"github.com/prysmaticlabs/prysm/v5/proto/migration"
9+
"github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces"
10+
enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1"
11+
"github.com/prysmaticlabs/prysm/v5/runtime/version"
1312
)
1413

15-
func LightClientUpdateFromConsensus(update *v2.LightClientUpdate) (*LightClientUpdate, error) {
16-
attestedHeader, err := lightClientHeaderContainerToJSON(update.AttestedHeader)
14+
func LightClientUpdateFromConsensus(update interfaces.LightClientUpdate) (*LightClientUpdate, error) {
15+
attestedHeader, err := lightClientHeaderToJSON(update.AttestedHeader())
1716
if err != nil {
1817
return nil, errors.Wrap(err, "could not marshal attested light client header")
1918
}
20-
finalizedHeader, err := lightClientHeaderContainerToJSON(update.FinalizedHeader)
19+
finalizedHeader, err := lightClientHeaderToJSON(update.FinalizedHeader())
2120
if err != nil {
2221
return nil, errors.Wrap(err, "could not marshal finalized light client header")
2322
}
23+
finalityBranch := update.FinalityBranch()
24+
25+
var scBranch [][32]byte
26+
if update.Version() >= version.Electra {
27+
b, err := update.NextSyncCommitteeBranchElectra()
28+
if err != nil {
29+
return nil, err
30+
}
31+
scBranch = b[:]
32+
} else {
33+
b, err := update.NextSyncCommitteeBranch()
34+
if err != nil {
35+
return nil, err
36+
}
37+
scBranch = b[:]
38+
}
2439

2540
return &LightClientUpdate{
2641
AttestedHeader: attestedHeader,
27-
NextSyncCommittee: SyncCommitteeFromConsensus(migration.V2SyncCommitteeToV1Alpha1(update.NextSyncCommittee)),
28-
NextSyncCommitteeBranch: branchToJSON(update.NextSyncCommitteeBranch),
42+
NextSyncCommittee: SyncCommitteeFromConsensus(update.NextSyncCommittee()),
43+
NextSyncCommitteeBranch: branchToJSON(scBranch),
2944
FinalizedHeader: finalizedHeader,
30-
FinalityBranch: branchToJSON(update.FinalityBranch),
31-
SyncAggregate: syncAggregateToJSON(update.SyncAggregate),
32-
SignatureSlot: strconv.FormatUint(uint64(update.SignatureSlot), 10),
45+
FinalityBranch: branchToJSON(finalityBranch[:]),
46+
SyncAggregate: SyncAggregateFromConsensus(update.SyncAggregate()),
47+
SignatureSlot: fmt.Sprintf("%d", update.SignatureSlot()),
3348
}, nil
3449
}
3550

36-
func LightClientFinalityUpdateFromConsensus(update *v2.LightClientFinalityUpdate) (*LightClientFinalityUpdate, error) {
37-
attestedHeader, err := lightClientHeaderContainerToJSON(update.AttestedHeader)
51+
func LightClientFinalityUpdateFromConsensus(update interfaces.LightClientFinalityUpdate) (*LightClientFinalityUpdate, error) {
52+
attestedHeader, err := lightClientHeaderToJSON(update.AttestedHeader())
3853
if err != nil {
3954
return nil, errors.Wrap(err, "could not marshal attested light client header")
4055
}
41-
finalizedHeader, err := lightClientHeaderContainerToJSON(update.FinalizedHeader)
56+
finalizedHeader, err := lightClientHeaderToJSON(update.FinalizedHeader())
4257
if err != nil {
4358
return nil, errors.Wrap(err, "could not marshal finalized light client header")
4459
}
60+
finalityBranch := update.FinalityBranch()
4561

4662
return &LightClientFinalityUpdate{
4763
AttestedHeader: attestedHeader,
4864
FinalizedHeader: finalizedHeader,
49-
FinalityBranch: branchToJSON(update.FinalityBranch),
50-
SyncAggregate: syncAggregateToJSON(update.SyncAggregate),
51-
SignatureSlot: strconv.FormatUint(uint64(update.SignatureSlot), 10),
65+
FinalityBranch: branchToJSON(finalityBranch[:]),
66+
SyncAggregate: SyncAggregateFromConsensus(update.SyncAggregate()),
67+
SignatureSlot: fmt.Sprintf("%d", update.SignatureSlot()),
5268
}, nil
5369
}
5470

55-
func LightClientOptimisticUpdateFromConsensus(update *v2.LightClientOptimisticUpdate) (*LightClientOptimisticUpdate, error) {
56-
attestedHeader, err := lightClientHeaderContainerToJSON(update.AttestedHeader)
71+
func LightClientOptimisticUpdateFromConsensus(update interfaces.LightClientOptimisticUpdate) (*LightClientOptimisticUpdate, error) {
72+
attestedHeader, err := lightClientHeaderToJSON(update.AttestedHeader())
5773
if err != nil {
5874
return nil, errors.Wrap(err, "could not marshal attested light client header")
5975
}
6076

6177
return &LightClientOptimisticUpdate{
6278
AttestedHeader: attestedHeader,
63-
SyncAggregate: syncAggregateToJSON(update.SyncAggregate),
64-
SignatureSlot: strconv.FormatUint(uint64(update.SignatureSlot), 10),
79+
SyncAggregate: SyncAggregateFromConsensus(update.SyncAggregate()),
80+
SignatureSlot: fmt.Sprintf("%d", update.SignatureSlot()),
6581
}, nil
6682
}
6783

68-
func branchToJSON(branchBytes [][]byte) []string {
84+
func branchToJSON[S [][32]byte](branchBytes S) []string {
6985
if branchBytes == nil {
7086
return nil
7187
}
7288
branch := make([]string, len(branchBytes))
7389
for i, root := range branchBytes {
74-
branch[i] = hexutil.Encode(root)
90+
branch[i] = hexutil.Encode(root[:])
7591
}
7692
return branch
7793
}
7894

79-
func syncAggregateToJSON(input *v1.SyncAggregate) *SyncAggregate {
80-
return &SyncAggregate{
81-
SyncCommitteeBits: hexutil.Encode(input.SyncCommitteeBits),
82-
SyncCommitteeSignature: hexutil.Encode(input.SyncCommitteeSignature),
83-
}
84-
}
85-
86-
func lightClientHeaderContainerToJSON(container *v2.LightClientHeaderContainer) (json.RawMessage, error) {
95+
func lightClientHeaderToJSON(header interfaces.LightClientHeader) (json.RawMessage, error) {
8796
// In the case that a finalizedHeader is nil.
88-
if container == nil {
97+
if header == nil {
8998
return nil, nil
9099
}
91100

92-
beacon, err := container.GetBeacon()
93-
if err != nil {
94-
return nil, errors.Wrap(err, "could not get beacon block header")
95-
}
96-
97-
var header any
101+
var result any
98102

99-
switch t := (container.Header).(type) {
100-
case *v2.LightClientHeaderContainer_HeaderAltair:
101-
header = &LightClientHeader{Beacon: BeaconBlockHeaderFromConsensus(migration.V1HeaderToV1Alpha1(beacon))}
102-
case *v2.LightClientHeaderContainer_HeaderCapella:
103-
execution, err := ExecutionPayloadHeaderCapellaFromConsensus(t.HeaderCapella.Execution)
103+
switch v := header.Version(); v {
104+
case version.Altair:
105+
result = &LightClientHeader{Beacon: BeaconBlockHeaderFromConsensus(header.Beacon())}
106+
case version.Capella:
107+
exInterface, err := header.Execution()
104108
if err != nil {
105109
return nil, err
106110
}
107-
header = &LightClientHeaderCapella{
108-
Beacon: BeaconBlockHeaderFromConsensus(migration.V1HeaderToV1Alpha1(beacon)),
111+
ex, ok := exInterface.Proto().(*enginev1.ExecutionPayloadHeaderCapella)
112+
if !ok {
113+
return nil, fmt.Errorf("execution data is not %T", &enginev1.ExecutionPayloadHeaderCapella{})
114+
}
115+
execution, err := ExecutionPayloadHeaderCapellaFromConsensus(ex)
116+
if err != nil {
117+
return nil, err
118+
}
119+
executionBranch, err := header.ExecutionBranch()
120+
if err != nil {
121+
return nil, err
122+
}
123+
result = &LightClientHeaderCapella{
124+
Beacon: BeaconBlockHeaderFromConsensus(header.Beacon()),
109125
Execution: execution,
110-
ExecutionBranch: branchToJSON(t.HeaderCapella.ExecutionBranch),
126+
ExecutionBranch: branchToJSON(executionBranch[:]),
127+
}
128+
case version.Deneb:
129+
exInterface, err := header.Execution()
130+
if err != nil {
131+
return nil, err
132+
}
133+
ex, ok := exInterface.Proto().(*enginev1.ExecutionPayloadHeaderDeneb)
134+
if !ok {
135+
return nil, fmt.Errorf("execution data is not %T", &enginev1.ExecutionPayloadHeaderDeneb{})
136+
}
137+
execution, err := ExecutionPayloadHeaderDenebFromConsensus(ex)
138+
if err != nil {
139+
return nil, err
111140
}
112-
case *v2.LightClientHeaderContainer_HeaderDeneb:
113-
execution, err := ExecutionPayloadHeaderDenebFromConsensus(t.HeaderDeneb.Execution)
141+
executionBranch, err := header.ExecutionBranch()
114142
if err != nil {
115143
return nil, err
116144
}
117-
header = &LightClientHeaderDeneb{
118-
Beacon: BeaconBlockHeaderFromConsensus(migration.V1HeaderToV1Alpha1(beacon)),
145+
result = &LightClientHeaderDeneb{
146+
Beacon: BeaconBlockHeaderFromConsensus(header.Beacon()),
119147
Execution: execution,
120-
ExecutionBranch: branchToJSON(t.HeaderDeneb.ExecutionBranch),
148+
ExecutionBranch: branchToJSON(executionBranch[:]),
121149
}
122150
default:
123-
return nil, fmt.Errorf("unsupported header type %T", t)
151+
return nil, fmt.Errorf("unsupported header version %s", version.String(v))
124152
}
125153

126-
return json.Marshal(header)
154+
return json.Marshal(result)
127155
}

beacon-chain/blockchain/process_block_helpers.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ func (s *Service) sendLightClientFeeds(cfg *postBlockProcessConfig) {
129129
}
130130
}
131131

132-
func (s *Service) tryPublishLightClientFinalityUpdate(ctx context.Context, signed interfaces.ReadOnlySignedBeaconBlock, finalized *forkchoicetypes.Checkpoint, postState state.BeaconState) {
132+
func (s *Service) tryPublishLightClientFinalityUpdate(
133+
ctx context.Context,
134+
signed interfaces.ReadOnlySignedBeaconBlock,
135+
finalized *forkchoicetypes.Checkpoint,
136+
postState state.BeaconState,
137+
) {
133138
if finalized.Epoch <= s.lastPublishedLightClientEpoch {
134139
return
135140
}
@@ -182,23 +187,24 @@ func (s *Service) sendLightClientFinalityUpdate(ctx context.Context, signed inte
182187
}
183188
}
184189

185-
update, err := lightclient.NewLightClientFinalityUpdateFromBeaconState(
190+
_, err = lightclient.NewLightClientFinalityUpdateFromBeaconState(
186191
ctx,
192+
postState.Slot(),
187193
postState,
188194
signed,
189195
attestedState,
190196
attestedBlock,
191197
finalizedBlock,
192198
)
193-
194199
if err != nil {
195200
return 0, errors.Wrap(err, "could not create light client update")
196201
}
197202

198203
// Return the result
199204
result := &ethpbv2.LightClientFinalityUpdateWithVersion{
200205
Version: ethpbv2.Version(signed.Version()),
201-
Data: update,
206+
// TODO: Get back to this when revisiting events
207+
//Data: update,
202208
}
203209

204210
// Send event
@@ -222,22 +228,23 @@ func (s *Service) sendLightClientOptimisticUpdate(ctx context.Context, signed in
222228
return 0, errors.Wrap(err, "could not get attested state")
223229
}
224230

225-
update, err := lightclient.NewLightClientOptimisticUpdateFromBeaconState(
231+
_, err = lightclient.NewLightClientOptimisticUpdateFromBeaconState(
226232
ctx,
233+
postState.Slot(),
227234
postState,
228235
signed,
229236
attestedState,
230237
attestedBlock,
231238
)
232-
233239
if err != nil {
234240
return 0, errors.Wrap(err, "could not create light client update")
235241
}
236242

237243
// Return the result
238244
result := &ethpbv2.LightClientOptimisticUpdateWithVersion{
239245
Version: ethpbv2.Version(signed.Version()),
240-
Data: update,
246+
// TODO: Get back to this when revisiting events
247+
//Data: update,
241248
}
242249

243250
return s.cfg.StateNotifier.StateFeed().Send(&feed.Event{

beacon-chain/core/light-client/BUILD.bazel

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@ go_library(
66
importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/light-client",
77
visibility = ["//visibility:public"],
88
deps = [
9+
"//beacon-chain/execution:go_default_library",
910
"//beacon-chain/state:go_default_library",
1011
"//config/fieldparams:go_default_library",
1112
"//config/params:go_default_library",
1213
"//consensus-types:go_default_library",
1314
"//consensus-types/blocks:go_default_library",
1415
"//consensus-types/interfaces:go_default_library",
16+
"//consensus-types/light-client:go_default_library",
17+
"//consensus-types/primitives:go_default_library",
1518
"//encoding/ssz:go_default_library",
1619
"//proto/engine/v1:go_default_library",
17-
"//proto/eth/v1:go_default_library",
18-
"//proto/eth/v2:go_default_library",
20+
"//proto/prysm/v1alpha1:go_default_library",
1921
"//runtime/version:go_default_library",
2022
"//time/slots:go_default_library",
2123
"@com_github_pkg_errors//:go_default_library",
24+
"@org_golang_google_protobuf//proto:go_default_library",
2225
],
2326
)
2427

0 commit comments

Comments
 (0)