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)]