Skip to content

Commit 1b43ee9

Browse files
committed
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 53f1f11 commit 1b43ee9

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
@@ -130,7 +130,12 @@ func (s *Service) sendLightClientFeeds(cfg *postBlockProcessConfig) {
130130
}
131131
}
132132

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

186-
update, err := lightclient.NewLightClientFinalityUpdateFromBeaconState(
191+
_, err = lightclient.NewLightClientFinalityUpdateFromBeaconState(
187192
ctx,
193+
postState.Slot(),
188194
postState,
189195
signed,
190196
attestedState,
191197
attestedBlock,
192198
finalizedBlock,
193199
)
194-
195200
if err != nil {
196201
return 0, errors.Wrap(err, "could not create light client update")
197202
}
198203

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

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

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

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

244251
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)