Uh oh!
There was an error while loading. Please reload this page.
refactor(block): extract da logic into da client and fi retriever - #2852
Conversation
The latest Buf updates on your PR. Results from workflow CI / buf-check (pull_request).
|
Claude finished @julienrbrt's task —— View job Code Review CompleteTasks
SummaryThis PR successfully extracts DA (Data Availability) logic into well-structured, reusable components. The refactoring creates a cleaner separation of concerns between DA operations, forced inclusion retrieval, and syncing logic. The new Overall Assessment: Good refactoring with solid architecture, but test coverage needs improvement (64.55% patch coverage with 162 missing lines). 1. Code Quality & ArchitectureStrengths ✅
Issues & Recommendations 🔧Critical: Unsafe Pointer Dereferencing // block/internal/da/forced_inclusion_retriever.go:146-150func (r*ForcedInclusionRetriever) processForcedInclusionBlobs(
event*ForcedInclusionEvent,
lastProcessedHeight*uint64, // ⚠️ Pointer parameter
Moderate: Magic Numbers // block/internal/da/client.go:218batchSize:=100
Minor: Inconsistent Error Handling // block/internal/da/client.go:144-147iflen(ids) >0 {
height, _, err=coreda.SplitID(ids[0])
iferr!=nil {
c.logger.Error().Err(err).Msg("failed to split ID")
// ⚠️ Error logged but not propagated - height remains 0
}
}
Code Organization // sequencers/common/size_validation.go:3// TODO(@julienrbrt): technically we may need to check for block gas as well
2. Error Handling & ResilienceStrengths ✅
Issues & Recommendations 🔧Critical: Context Deadline vs Cancellation // block/internal/da/client.go:166-203getIDsCtx, cancel:=context.WithTimeout(ctx, c.defaultTimeout)
defercancel()
idsResult, err:=c.da.GetIDs(getIDsCtx, height, namespace)
iferr!=nil {
// String matching for error detectionifstrings.Contains(err.Error(), coreda.ErrBlobNotFound.Error()) {
Moderate: Batch Retrieval Error Handling // block/internal/da/client.go:220-238fori:=0; i<len(idsResult.IDs); i+=batchSize {
getBlobsCtx, cancel:=context.WithTimeout(ctx, c.defaultTimeout)
batchBlobs, err:=c.da.Get(getBlobsCtx, idsResult.IDs[i:end], namespace)
cancel()
iferr!=nil {
// ⚠️ Early return on first batch failurereturn coreda.ResultRetrieve{...}
}
Minor: Error Context Loss // block/internal/da/forced_inclusion_retriever.go:159returnfmt.Errorf("failed to retrieve forced inclusion blobs at height %d: %s", height, result.Message)
3. SecurityStrengths ✅
Issues & Recommendations 🔧Moderate: Empty Blob Filtering // block/internal/da/forced_inclusion_retriever.go:163-167for_, blob:=rangeresult.Data {
iflen(blob) >0 {
event.Txs=append(event.Txs, blob)
}
}
Minor: Hardcoded Size Limit // sequencers/common/size_validation.go:8AbsoluteMaxBlobSize=1.5*1024*1024// 1.5MB
4. Performance & Resource EfficiencyStrengths ✅
Issues & Recommendations 🔧Moderate: Memory Allocation Pattern // block/internal/da/client.go:219blobs:=make([][]byte, 0, len(idsResult.IDs))
Minor: Repeated Context Creation // block/internal/da/client.go:223-225getBlobsCtx, cancel:=context.WithTimeout(ctx, c.defaultTimeout)
batchBlobs, err:=c.da.Get(getBlobsCtx, idsResult.IDs[i:end], namespace)
cancel()
Concurrency Consideration // sequencers/single/sequencer.go:284-372func (c*Sequencer) processForcedInclusionTxs(event*block.ForcedInclusionEvent, maxBytesuint64) [][]byte {
5. Testing & ReliabilityStrengths ✅
Issues & Recommendations 🔧Critical: Low Coverage on Key Files From Codecov report:
Specific Missing Coverage:
Recommendations: // Add tests for:// 1. Forced inclusion with maxBytes exactly matching cumulative size// 2. Forced inclusion with pending queue overflow// 3. Mixed valid/invalid blob sizes in single epoch// 4. Multiple epochs with carry-over pending transactionsMissing Integration Tests:
Test Isolation Improvement: // sequencers/single/sequencer_test.go:44-46mockRetriever.On("RetrieveForcedIncludedTxs", mock.Anything, mock.Anything).
Return(nil, block.ErrForceInclusionNotConfigured).Maybe()
6. Documentation & Developer ExperienceStrengths ✅
Issues & Recommendations 🔧Moderate: Missing Package Documentation // block/internal/da/client.go:1package da
// ⚠️ No package-level documentation
// Package da provides reusable Data Availability layer client components.// It wraps the core DA interface with common patterns for namespace handling,// timeout management, and result processing.Minor: Incomplete Function Documentation // block/internal/da/client.go:75-76// Submit submits blobs to the DA layer with the specified options.func (c*client) Submit(ctx context.Context, data [][]byte, gasPricefloat64, namespace []byte, options []byte) coreda.ResultSubmit {
Configuration Documentation: // block/internal/da/client.go:42-50typeConfigstruct {
DA coreda.DALogger zerolog.LoggerDefaultTimeout time.DurationNamespacestringDataNamespacestringForcedInclusionNamespacestring
}
7. Architecture-Specific ObservationsExcellent Patterns ✅
Potential Improvements 🔧Consideration: Interface Granularity // block/internal/da/client.go:16-28typeClientinterface {
Submit(ctx context.Context, data [][]byte, gasPricefloat64, namespace []byte, options []byte) coreda.ResultSubmitRetrieve(ctx context.Context, heightuint64, namespace []byte) coreda.ResultRetrieveRetrieveHeaders(ctx context.Context, heightuint64) coreda.ResultRetrieveRetrieveData(ctx context.Context, heightuint64) coreda.ResultRetrieveRetrieveForcedInclusion(ctx context.Context, heightuint64) coreda.ResultRetrieve// ... namespace getters
}
8. Critical Issues SummaryMust Fix Before Merge 🚨
Should Fix Before Merge |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@## julien/fi #2852 +/- ##
=============================================
- Coverage 64.48% 64.06% -0.43%
=============================================
Files 83 84 +1 Lines 7600 7711 +111 =============================================
+ Hits 4901 4940 +39 - Misses 2141 2212 +71 - Partials 558 559 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Uh oh!
There was an error while loading. Please reload this page.
Extract basic da logic into da client and fi retriever.