-
Notifications
You must be signed in to change notification settings - Fork 238
refactor(block): extract da logic into da client and fi retriever #2852
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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-150
func (r *ForcedInclusionRetriever) processForcedInclusionBlobs(
event *ForcedInclusionEvent,
lastProcessedHeight *uint64, // ⚠️ Pointer parameter
Moderate: Magic Numbers // block/internal/da/client.go:218
batchSize := 100
Minor: Inconsistent Error Handling // block/internal/da/client.go:144-147
if len(ids) > 0 {
height, _, err = coreda.SplitID(ids[0])
if err != 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-203
getIDsCtx, cancel := context.WithTimeout(ctx, c.defaultTimeout)
defer cancel()
idsResult, err := c.da.GetIDs(getIDsCtx, height, namespace)
if err != nil {
// String matching for error detection
if strings.Contains(err.Error(), coreda.ErrBlobNotFound.Error()) {
Moderate: Batch Retrieval Error Handling // block/internal/da/client.go:220-238
for i := 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()
if err != nil {
// ⚠️ Early return on first batch failure
return coreda.ResultRetrieve{...}
}
Minor: Error Context Loss // block/internal/da/forced_inclusion_retriever.go:159
return fmt.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-167
for _, blob := range result.Data {
if len(blob) > 0 {
event.Txs = append(event.Txs, blob)
}
}
Minor: Hardcoded Size Limit // sequencers/common/size_validation.go:8
AbsoluteMaxBlobSize = 1.5 * 1024 * 1024 // 1.5MB
4. Performance & Resource EfficiencyStrengths ✅
Issues & Recommendations 🔧Moderate: Memory Allocation Pattern // block/internal/da/client.go:219
blobs := make([][]byte, 0, len(idsResult.IDs))
Minor: Repeated Context Creation // block/internal/da/client.go:223-225
getBlobsCtx, 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-372
func (c *Sequencer) processForcedInclusionTxs(event *block.ForcedInclusionEvent, maxBytes uint64) [][]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-46
mockRetriever.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:1
package 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, gasPrice float64, namespace []byte, options []byte) coreda.ResultSubmit {
Configuration Documentation: // block/internal/da/client.go:42-50
type Config struct {
DA coreda.DA
Logger zerolog.Logger
DefaultTimeout time.Duration
Namespace string
DataNamespace string
ForcedInclusionNamespace string
}
7. Architecture-Specific ObservationsExcellent Patterns ✅
Potential Improvements 🔧Consideration: Interface Granularity // block/internal/da/client.go:16-28
type Client interface {
Submit(ctx context.Context, data [][]byte, gasPrice float64, namespace []byte, options []byte) coreda.ResultSubmit
Retrieve(ctx context.Context, height uint64, namespace []byte) coreda.ResultRetrieve
RetrieveHeaders(ctx context.Context, height uint64) coreda.ResultRetrieve
RetrieveData(ctx context.Context, height uint64) coreda.ResultRetrieve
RetrieveForcedInclusion(ctx context.Context, height uint64) 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:
|
Extract basic da logic into da client and fi retriever.