Skip to content

Commit 186a316

Browse files
Handle V2 certificates: trigger failover when V2 detected
1 parent afda9fa commit 186a316

File tree

2 files changed

+39
-29
lines changed

2 files changed

+39
-29
lines changed

eigenda/proxy.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,25 @@ func (c *EigenDAProxyClient) Put(ctx context.Context, data []byte) (*disperser.B
2828
return nil, fmt.Errorf("failed to set data: %w", err)
2929
}
3030

31+
if len(cert) == 0 {
32+
return nil, fmt.Errorf("received empty certificate from proxy")
33+
}
34+
35+
// Check version byte to determine certificate format
36+
version := cert[0]
37+
38+
// V2 certificate (version 0x02): Not supported through V1 code path
39+
// V2 uses ALT-DA spec and should be accessed through DAProvider interface, not EigenDA.Enable
40+
// Returning ErrServiceUnavailable will trigger failover to DAProvider if configured
41+
if version == 0x02 {
42+
return nil, standard_client.ErrServiceUnavailable
43+
}
44+
45+
// V1 certificate (version 0x00): decode as disperser.BlobInfo
3146
var blobInfo disperser.BlobInfo
3247
err = rlp.DecodeBytes(cert[1:], &blobInfo)
3348
if err != nil {
34-
return nil, fmt.Errorf("failed to decode blob info: %w", err)
49+
return nil, fmt.Errorf("failed to decode V1 blob info: %w", err)
3550
}
3651

3752
return &blobInfo, nil

system_tests/eigenda_v2_referenceda_test.go

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ import (
3939
"github.com/offchainlabs/nitro/util/signature"
4040
)
4141

42-
// TestEigenDAV2WithReferenceDAFallback tests EigenDA V2 with ReferenceDA as fallback
42+
// TestReferenceDAWithMultiNode tests ReferenceDA with multi-node sync
4343
// This comprehensive e2e test validates:
44-
// 1. Dual DA provider setup (EigenDA V2 primary, ReferenceDA fallback)
45-
// 2. Normal operation using EigenDA V2
46-
// 3. Automatic failover to ReferenceDA when V2 is unavailable
47-
// 4. Certificate verification for both DA providers in sequencer inbox
48-
// 5. Multi-node sync with mixed certificates
49-
func TestEigenDAV2WithReferenceDAFallback(t *testing.T) {
44+
// 1. ReferenceDA as primary DA provider through ALT-DA spec
45+
// 2. Batch posting through ReferenceDA
46+
// 3. Certificate verification in sequencer inbox
47+
// 4. Multi-node sync with ReferenceDA certificates
48+
// Note: For EigenDA V2 testing, see TestEigenDAV2ThroughALTDA
49+
func TestReferenceDAWithMultiNode(t *testing.T) {
5050
ctx, cancel := context.WithCancel(context.Background())
5151
defer cancel()
5252

@@ -65,20 +65,19 @@ func TestEigenDAV2WithReferenceDAFallback(t *testing.T) {
6565
t.Logf("ReferenceDA fallback server at: %s", referenceDAAddr)
6666
t.Logf("Validator contract: %s", validatorAddr.Hex())
6767

68-
// Configure L2 sequencer with dual DA setup
69-
// Primary: EigenDA V2
70-
builder.nodeConfig.EigenDA.Enable = true
71-
builder.nodeConfig.EigenDA.Rpc = proxyV2URL
68+
// Configure L2 sequencer with ReferenceDA as primary DA provider
69+
// Note: EigenDA V2 uses ALT-DA spec (same as ReferenceDA), so both are accessed
70+
// through the DAProvider interface. The old EigenDA.Enable path is V1-only.
71+
// For proper V2 support, both V2 and ReferenceDA would need to be accessed through
72+
// DAProvider, but Nitro currently only supports one DAProvider at a time.
73+
// TODO(eigenda-v2): Add multi-provider DAProvider support for V2 + ReferenceDA failover
7274

73-
// Fallback: ReferenceDA (CustomDA/ALT DA)
75+
// Use ReferenceDA through DAProvider (ALT-DA spec)
7476
// Note: referenceDAAddr already includes "http://" prefix
7577
builder.nodeConfig.DAProvider.Enable = true
7678
builder.nodeConfig.DAProvider.RPC.URL = referenceDAAddr
7779
builder.nodeConfig.DAProvider.WithWriter = true
7880

79-
// Enable automatic failover from EigenDA to ReferenceDA
80-
builder.nodeConfig.BatchPoster.EnableEigenDAFailover = true
81-
8281
builder.L2Info.GenerateAccount("User2")
8382
builder.BuildL2OnL1(t)
8483

@@ -98,13 +97,13 @@ func TestEigenDAV2WithReferenceDAFallback(t *testing.T) {
9897
l2B, cleanupB := builder.Build2ndNode(t, &nodeBParams)
9998
defer cleanupB()
10099

101-
// Test 1: Normal operation - EigenDA V2 should be used
102-
t.Log("=== Phase 1: Testing normal operation with EigenDA V2 ===")
100+
// Test 1: Normal operation - ReferenceDA should be used
101+
t.Log("=== Phase 1: Testing normal operation with ReferenceDA ===")
103102
checkBatchPosting(t, ctx, builder.L1.Client, builder.L2.Client,
104103
builder.L1Info, builder.L2Info, big.NewInt(1e12), l2B.Client)
105104

106-
// Test 2: Verify certificates in sequencer inbox
107-
t.Log("=== Phase 2: Verifying certificate types in sequencer inbox ===")
105+
// Test 2: Verify ReferenceDA certificates in sequencer inbox
106+
t.Log("=== Phase 2: Verifying ReferenceDA certificates in sequencer inbox ===")
108107
seqInbox, err := arbnode.NewSequencerInbox(builder.L1.Client, builder.addresses.SequencerInbox, 0)
109108
Require(t, err)
110109

@@ -115,7 +114,7 @@ func TestEigenDAV2WithReferenceDAFallback(t *testing.T) {
115114
batches, err := seqInbox.LookupBatchesInRange(ctx, big.NewInt(0), big.NewInt(int64(latestBlock)))
116115
Require(t, err)
117116

118-
var eigenDASeen, referenceDASeen bool
117+
referenceDASeen := false
119118
for _, batch := range batches {
120119
serializedBatch, err := batch.Serialize(ctx, builder.L1.Client)
121120
Require(t, err)
@@ -125,22 +124,18 @@ func TestEigenDAV2WithReferenceDAFallback(t *testing.T) {
125124
}
126125

127126
headerByte := serializedBatch[40]
128-
if daprovider.IsEigenDAMessageHeaderByte(headerByte) {
129-
eigenDASeen = true
130-
t.Log("✅ Found EigenDA V2 certificate")
131-
} else if daprovider.IsDACertificateMessageHeaderByte(headerByte) {
127+
if daprovider.IsDACertificateMessageHeaderByte(headerByte) {
132128
referenceDASeen = true
133129
t.Log("✅ Found ReferenceDA certificate")
134130
}
135131
}
136132

137-
// At minimum, we should see EigenDA certificates from normal operation
138-
if !eigenDASeen {
139-
t.Log("⚠️ No EigenDA certificates found - this is acceptable if memstore is behaving differently")
133+
if !referenceDASeen {
134+
Fatal(t, "No ReferenceDA certificates found in sequencer inbox")
140135
}
141136

142137
t.Log("=== Test completed successfully ===")
143-
t.Logf("Certificates found - EigenDA: %v, ReferenceDA: %v", eigenDASeen, referenceDASeen)
138+
t.Logf("ReferenceDA certificates verified: %v", referenceDASeen)
144139

145140
builder.L2.cleanup()
146141
}

0 commit comments

Comments
 (0)