Skip to content

Commit c0fe95e

Browse files
gligneuleljobe
andauthored
Toggle rpc endpoint used on errors (3.7.x backport) (#3836)
* Toggle rpc endpoint used on errors When there is a failure fetching blobs from `blob_sidecars` switch to `blobs` (and vice-versa.) This makes sense because a node can start syncing before the fusaka fork, and we can automatically switch to the new `blobs` endpoint when the legacy endpoint fails (because it was strongly deprecated and removed in 2 clients.) * Also, add a dangerous flag to skip blob proof verification --------- Co-authored-by: Pepper Lebeck-Jobe <[email protected]>
1 parent 91ebb83 commit c0fe95e

File tree

1 file changed

+39
-16
lines changed

1 file changed

+39
-16
lines changed

util/headerreader/blob_client.go

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,26 @@ type BlobClient struct {
4343

4444
// Directory to save the fetched blobs
4545
blobDirectory string
46+
47+
// Dangerous options
48+
skipBlobProofVerification bool
49+
}
50+
51+
type BlobClientDangerousConfig struct {
52+
SkipBlobProofVerification bool `koanf:"skip-blob-proof-verification"`
4653
}
4754

4855
type BlobClientConfig struct {
49-
BeaconUrl string `koanf:"beacon-url"`
50-
SecondaryBeaconUrl string `koanf:"secondary-beacon-url"`
51-
BlobDirectory string `koanf:"blob-directory"`
52-
Authorization string `koanf:"authorization"`
53-
UseLegacyEndpoint bool `koanf:"use-legacy-endpoint"`
56+
BeaconUrl string `koanf:"beacon-url"`
57+
SecondaryBeaconUrl string `koanf:"secondary-beacon-url"`
58+
BlobDirectory string `koanf:"blob-directory"`
59+
Authorization string `koanf:"authorization"`
60+
UseLegacyEndpoint bool `koanf:"use-legacy-endpoint"`
61+
Dangerous BlobClientDangerousConfig `koanf:"dangerous"`
62+
}
63+
64+
var DefaultDangerousConfig = BlobClientDangerousConfig{
65+
SkipBlobProofVerification: false,
5466
}
5567

5668
var DefaultBlobClientConfig = BlobClientConfig{
@@ -59,6 +71,7 @@ var DefaultBlobClientConfig = BlobClientConfig{
5971
BlobDirectory: "",
6072
Authorization: "",
6173
UseLegacyEndpoint: false,
74+
Dangerous: DefaultDangerousConfig,
6275
}
6376

6477
func BlobClientAddOptions(prefix string, f *pflag.FlagSet) {
@@ -67,6 +80,11 @@ func BlobClientAddOptions(prefix string, f *pflag.FlagSet) {
6780
f.String(prefix+".blob-directory", DefaultBlobClientConfig.BlobDirectory, "Full path of the directory to save fetched blobs")
6881
f.String(prefix+".authorization", DefaultBlobClientConfig.Authorization, "Value to send with the HTTP Authorization: header for Beacon REST requests, must include both scheme and scheme parameters")
6982
f.Bool(prefix+".use-legacy-endpoint", DefaultBlobClientConfig.UseLegacyEndpoint, "Use the legacy blob_sidecars endpoint instead of the blobs endpoint")
83+
BlobClientDangerousAddOptions(prefix+".dangerous", f)
84+
}
85+
86+
func BlobClientDangerousAddOptions(prefix string, f *pflag.FlagSet) {
87+
f.Bool(prefix+".skip-blob-proof-verification", DefaultDangerousConfig.SkipBlobProofVerification, "DANGEROUS! Skips verification of KZG proofs for blobs fetched from the beacon node.")
7088
}
7189

7290
func NewBlobClient(config BlobClientConfig, ec *ethclient.Client) (*BlobClient, error) {
@@ -92,12 +110,13 @@ func NewBlobClient(config BlobClientConfig, ec *ethclient.Client) (*BlobClient,
92110
}
93111
}
94112
blobClient := &BlobClient{
95-
ec: ec,
96-
beaconUrl: beaconUrl,
97-
secondaryBeaconUrl: secondaryBeaconUrl,
98-
authorization: config.Authorization,
99-
useLegacyEndpoint: config.UseLegacyEndpoint,
100-
blobDirectory: config.BlobDirectory,
113+
ec: ec,
114+
beaconUrl: beaconUrl,
115+
secondaryBeaconUrl: secondaryBeaconUrl,
116+
authorization: config.Authorization,
117+
useLegacyEndpoint: config.UseLegacyEndpoint,
118+
blobDirectory: config.BlobDirectory,
119+
skipBlobProofVerification: config.Dangerous.SkipBlobProofVerification,
101120
}
102121
blobClient.httpClient.Store(&http.Client{})
103122
return blobClient, nil
@@ -200,6 +219,8 @@ func (b *BlobClient) GetBlobsBySlot(ctx context.Context, slot uint64, versionedH
200219
// we can potentially connect to a different, and healthy, beacon chain node in the next request.
201220
b.httpClient.Store(&http.Client{})
202221

222+
b.useLegacyEndpoint = !b.useLegacyEndpoint
223+
203224
return nil, fmt.Errorf("error fetching blobs for slot %d: %w", slot, err)
204225
}
205226
return blobs, nil
@@ -319,12 +340,14 @@ func (b *BlobClient) blobSidecars(ctx context.Context, slot uint64, versionedHas
319340

320341
copy(output[outputIdx][:], blobItem.Blob)
321342

322-
var proof kzg4844.Proof
323-
copy(proof[:], blobItem.KzgProof)
343+
if !b.skipBlobProofVerification {
344+
var proof kzg4844.Proof
345+
copy(proof[:], blobItem.KzgProof)
324346

325-
err = kzg4844.VerifyBlobProof(&output[outputIdx], commitment, proof)
326-
if err != nil {
327-
return nil, fmt.Errorf("failed to verify blob proof for blob at slot(%d) at index(%d), blob(%s)", slot, blobItem.Index, pretty.FirstFewChars(blobItem.Blob.String()))
347+
err = kzg4844.VerifyBlobProof(&output[outputIdx], commitment, proof)
348+
if err != nil {
349+
return nil, fmt.Errorf("failed to verify blob proof for blob at slot(%d) at index(%d), blob(%s)", slot, blobItem.Index, pretty.FirstFewChars(blobItem.Blob.String()))
350+
}
328351
}
329352
}
330353

0 commit comments

Comments
 (0)