From 2e4a3e03c77013bb46963a61276bb50032ce30d6 Mon Sep 17 00:00:00 2001 From: "adam.xu" Date: Wed, 22 Jan 2025 17:51:21 +0800 Subject: [PATCH] fix the oz audit issuse l-02 --- op-batcher/batcher/config.go | 8 ++++++++ op-batcher/batcher/driver_da.go | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/op-batcher/batcher/config.go b/op-batcher/batcher/config.go index 8dbc0d511..b62000479 100644 --- a/op-batcher/batcher/config.go +++ b/op-batcher/batcher/config.go @@ -22,6 +22,7 @@ import ( "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/sources" "github.com/ethereum-optimism/optimism/op-service/eigenda" + "github.com/ethereum-optimism/optimism/op-service/eth" oplog "github.com/ethereum-optimism/optimism/op-service/log" opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" oppprof "github.com/ethereum-optimism/optimism/op-service/pprof" @@ -188,6 +189,13 @@ func (c CLIConfig) Check() error { if err := c.EigenDAConfig.Check(); err != nil { return err } + + //Used to ensure that when using an Ethereum blob, a single frame is not larger than MaxBlobDataSize * MaxblobNum + //Considering that the frame needs to go through rlp. EncodeToBytes before submitting da, the maximum size after encoding cannot be accurately calculated. + //So MaxL1TxSize > MaxBlobDataSize is used here to make a rough judgment + if c.MaxL1TxSize > eth.MaxBlobDataSize { + return errors.New("MaxL1TxSize must less than MaxBlobDataSize") + } return nil } diff --git a/op-batcher/batcher/driver_da.go b/op-batcher/batcher/driver_da.go index 4d0bf3934..cf3c381cf 100644 --- a/op-batcher/batcher/driver_da.go +++ b/op-batcher/batcher/driver_da.go @@ -339,6 +339,11 @@ func (l *BatchSubmitter) blobTxCandidates(data [][]byte) ([]*txmgr.TxCandidate, } if len(nextEncodeData) > se.MaxBlobDataSize*MaxblobNum { + if len(encodeData) == 0 { + err := fmt.Errorf("single frame data size %d larger than max blob transaction maximum size", len(nextEncodeData)) + l.log.Error("empty encodeData", "err", err) + return nil, err + } blobs := []*se.Blob{} for idx := 0; idx < len(encodeData); idx += se.MaxBlobDataSize { blobData := encodeData[idx : idx+minInt(len(encodeData)-idx, se.MaxBlobDataSize)]