Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions arbnode/batch_poster.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ type BatchPoster struct {
parentChain *parent.ParentChain
checkEip7623 bool
useEip7623 bool

maxL2MessageSize uint64
}

type l1BlockBound int
Expand Down Expand Up @@ -321,18 +323,19 @@ var TestBatchPosterConfig = BatchPosterConfig{
}

type BatchPosterOpts struct {
DataPosterDB ethdb.Database
L1Reader *headerreader.HeaderReader
Inbox *InboxTracker
Streamer *TransactionStreamer
VersionGetter execution.ArbOSVersionGetter
SyncMonitor *SyncMonitor
Config BatchPosterConfigFetcher
DeployInfo *chaininfo.RollupAddresses
TransactOpts *bind.TransactOpts
DAPWriter daprovider.Writer
ParentChainID *big.Int
DAPReaders *daprovider.ReaderRegistry
DataPosterDB ethdb.Database
L1Reader *headerreader.HeaderReader
Inbox *InboxTracker
Streamer *TransactionStreamer
VersionGetter execution.ArbOSVersionGetter
SyncMonitor *SyncMonitor
Config BatchPosterConfigFetcher
DeployInfo *chaininfo.RollupAddresses
TransactOpts *bind.TransactOpts
DAPWriter daprovider.Writer
ParentChainID *big.Int
DAPReaders *daprovider.ReaderRegistry
MaxL2MessageSize uint64
}

func NewBatchPoster(ctx context.Context, opts *BatchPosterOpts) (*BatchPoster, error) {
Expand Down Expand Up @@ -392,6 +395,7 @@ func NewBatchPoster(ctx context.Context, opts *BatchPosterOpts) (*BatchPoster, e
parentChain: &parent.ParentChain{ChainID: opts.ParentChainID, L1Reader: opts.L1Reader},
checkEip7623: checkEip7623,
useEip7623: useEip7623,
maxL2MessageSize: opts.MaxL2MessageSize,
}
b.messagesPerBatch, err = arbmath.NewMovingAverage[uint64](20)
if err != nil {
Expand Down Expand Up @@ -1843,7 +1847,7 @@ func (b *BatchPoster) MaybePostSequencerBatch(ctx context.Context) (bool, error)
b.building.muxBackend.seqMsg = seqMsg
b.building.muxBackend.delayedInboxStart = batchPosition.DelayedMessageCount
b.building.muxBackend.SetPositionWithinMessage(0)
simMux := arbstate.NewInboxMultiplexer(b.building.muxBackend, batchPosition.DelayedMessageCount, dapReaders, daprovider.KeysetValidate)
simMux := arbstate.NewInboxMultiplexer(b.building.muxBackend, batchPosition.DelayedMessageCount, dapReaders, daprovider.KeysetValidate, b.maxL2MessageSize)
log.Debug("Begin checking the correctness of batch against inbox multiplexer", "startMsgSeqNum", batchPosition.MessageCount, "endMsgSeqNum", b.building.msgCount-1)
for i := batchPosition.MessageCount; i < b.building.msgCount; i++ {
msg, err := simMux.Pop(ctx)
Expand Down
5 changes: 3 additions & 2 deletions arbnode/delayed_seq_reorg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/params"

"github.com/offchainlabs/nitro/arbos/arbostypes"
"github.com/offchainlabs/nitro/solgen/go/bridgegen"
Expand All @@ -20,7 +21,7 @@ func TestSequencerReorgFromDelayed(t *testing.T) {
defer cancel()

exec, streamer, db, _ := NewTransactionStreamerForTest(t, ctx, common.Address{})
tracker, err := NewInboxTracker(db, streamer, nil, DefaultSnapSyncConfig)
tracker, err := NewInboxTracker(db, streamer, nil, DefaultSnapSyncConfig, params.DefaultMaxL2MessageSize)
Require(t, err)

err = streamer.Start(ctx)
Expand Down Expand Up @@ -220,7 +221,7 @@ func TestSequencerReorgFromLastDelayedMsg(t *testing.T) {
defer cancel()

exec, streamer, db, _ := NewTransactionStreamerForTest(t, ctx, common.Address{})
tracker, err := NewInboxTracker(db, streamer, nil, DefaultSnapSyncConfig)
tracker, err := NewInboxTracker(db, streamer, nil, DefaultSnapSyncConfig, params.MaxL2MessageSize)
Require(t, err)

err = streamer.Start(ctx)
Expand Down
20 changes: 11 additions & 9 deletions arbnode/inbox_tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,19 @@ type InboxTracker struct {
dapReaders *daprovider.ReaderRegistry
snapSyncConfig SnapSyncConfig

batchMetaMutex sync.Mutex
batchMeta *containers.LruCache[uint64, BatchMetadata]
batchMetaMutex sync.Mutex
batchMeta *containers.LruCache[uint64, BatchMetadata]
maxL2MessageSize uint64
}

func NewInboxTracker(db ethdb.Database, txStreamer *TransactionStreamer, dapReaders *daprovider.ReaderRegistry, snapSyncConfig SnapSyncConfig) (*InboxTracker, error) {
func NewInboxTracker(db ethdb.Database, txStreamer *TransactionStreamer, dapReaders *daprovider.ReaderRegistry, snapSyncConfig SnapSyncConfig, maxL2MessageSize uint64) (*InboxTracker, error) {
tracker := &InboxTracker{
db: db,
txStreamer: txStreamer,
dapReaders: dapReaders,
batchMeta: containers.NewLruCache[uint64, BatchMetadata](1000),
snapSyncConfig: snapSyncConfig,
db: db,
txStreamer: txStreamer,
dapReaders: dapReaders,
batchMeta: containers.NewLruCache[uint64, BatchMetadata](1000),
snapSyncConfig: snapSyncConfig,
maxL2MessageSize: maxL2MessageSize,
}
return tracker, nil
}
Expand Down Expand Up @@ -768,7 +770,7 @@ func (t *InboxTracker) AddSequencerBatches(ctx context.Context, client *ethclien
ctx: ctx,
client: client,
}
multiplexer := arbstate.NewInboxMultiplexer(backend, prevbatchmeta.DelayedMessageCount, t.dapReaders, daprovider.KeysetValidate)
multiplexer := arbstate.NewInboxMultiplexer(backend, prevbatchmeta.DelayedMessageCount, t.dapReaders, daprovider.KeysetValidate, t.maxL2MessageSize)
batchMessageCounts := make(map[uint64]arbutil.MessageIndex)
currentPos := prevbatchmeta.MessageCount + 1
for {
Expand Down
33 changes: 18 additions & 15 deletions arbnode/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -692,8 +692,9 @@ func getInboxTrackerAndReader(
delayedBridge *DelayedBridge,
sequencerInbox *SequencerInbox,
exec execution.ExecutionSequencer,
maxL2MessageSize uint64,
) (*InboxTracker, *InboxReader, error) {
inboxTracker, err := NewInboxTracker(arbDb, txStreamer, dapReaders, config.SnapSyncTest)
inboxTracker, err := NewInboxTracker(arbDb, txStreamer, dapReaders, config.SnapSyncTest, maxL2MessageSize)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -955,6 +956,7 @@ func getBatchPoster(
parentChainID *big.Int,
dapReaders *daprovider.ReaderRegistry,
stakerAddr common.Address,
maxL2MessageSize uint64,
) (*BatchPoster, error) {
var batchPoster *BatchPoster
if config.BatchPoster.Enable {
Expand All @@ -970,18 +972,19 @@ func getBatchPoster(
}
var err error
batchPoster, err = NewBatchPoster(ctx, &BatchPosterOpts{
DataPosterDB: rawdb.NewTable(arbDb, storage.BatchPosterPrefix),
L1Reader: l1Reader,
Inbox: inboxTracker,
Streamer: txStreamer,
VersionGetter: arbOSVersionGetter,
SyncMonitor: syncMonitor,
Config: func() *BatchPosterConfig { return &configFetcher.Get().BatchPoster },
DeployInfo: deployInfo,
TransactOpts: txOptsBatchPoster,
DAPWriter: dapWriter,
ParentChainID: parentChainID,
DAPReaders: dapReaders,
DataPosterDB: rawdb.NewTable(arbDb, storage.BatchPosterPrefix),
L1Reader: l1Reader,
Inbox: inboxTracker,
Streamer: txStreamer,
VersionGetter: arbOSVersionGetter,
SyncMonitor: syncMonitor,
Config: func() *BatchPosterConfig { return &configFetcher.Get().BatchPoster },
DeployInfo: deployInfo,
TransactOpts: txOptsBatchPoster,
DAPWriter: dapWriter,
ParentChainID: parentChainID,
DAPReaders: dapReaders,
MaxL2MessageSize: maxL2MessageSize,
})
if err != nil {
return nil, err
Expand Down Expand Up @@ -1158,7 +1161,7 @@ func createNodeImpl(
return nil, err
}

inboxTracker, inboxReader, err := getInboxTrackerAndReader(ctx, arbDb, txStreamer, dapReaders, config, configFetcher, l1client, l1Reader, deployInfo, delayedBridge, sequencerInbox, executionSequencer)
inboxTracker, inboxReader, err := getInboxTrackerAndReader(ctx, arbDb, txStreamer, dapReaders, config, configFetcher, l1client, l1Reader, deployInfo, delayedBridge, sequencerInbox, executionSequencer, l2Config.MaxL2MessageSize())
if err != nil {
return nil, err
}
Expand All @@ -1178,7 +1181,7 @@ func createNodeImpl(
return nil, err
}

batchPoster, err := getBatchPoster(ctx, config, configFetcher, txOptsBatchPoster, dapWriter, l1Reader, inboxTracker, txStreamer, arbOSVersionGetter, arbDb, syncMonitor, deployInfo, parentChainID, dapReaders, stakerAddr)
batchPoster, err := getBatchPoster(ctx, config, configFetcher, txOptsBatchPoster, dapWriter, l1Reader, inboxTracker, txStreamer, arbOSVersionGetter, arbDb, syncMonitor, deployInfo, parentChainID, dapReaders, stakerAddr, l2Config.MaxL2MessageSize())
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion arbos/block_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func ProduceBlock(
) (*types.Block, types.Receipts, error) {
chainConfig := chainContext.Config()
lastArbosVersion := types.DeserializeHeaderExtraInformation(lastBlockHeader).ArbOSFormatVersion
txes, err := ParseL2Transactions(message, chainConfig.ChainID, lastArbosVersion)
txes, err := ParseL2Transactions(message, chainConfig.ChainID, chainConfig.MaxL2MessageSize(), lastArbosVersion)
if err != nil {
log.Warn("error parsing incoming message", "err", err)
txes = types.Transactions{}
Expand Down
2 changes: 1 addition & 1 deletion arbos/incomingmessage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func TestSerializeAndParseL1Message(t *testing.T) {
if err != nil {
t.Error(err)
}
txes, err := ParseL2Transactions(newMsg, chainId, params.MaxDebugArbosVersionSupported)
txes, err := ParseL2Transactions(newMsg, chainId, params.DefaultMaxL2MessageSize, params.MaxDebugArbosVersionSupported)
if err != nil {
t.Error(err)
}
Expand Down
18 changes: 9 additions & 9 deletions arbos/parse_l2.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ import (
)

// note: lastArbosVersion is arbos version in previous block, not current!
func ParseL2Transactions(msg *arbostypes.L1IncomingMessage, chainId *big.Int, lastArbosVersion uint64) (types.Transactions, error) {
if len(msg.L2msg) > arbostypes.MaxL2MessageSize {
func ParseL2Transactions(msg *arbostypes.L1IncomingMessage, chainId *big.Int, maxL2MessageSize uint64, lastArbosVersion uint64) (types.Transactions, error) {
if uint64(len(msg.L2msg)) > maxL2MessageSize {
// ignore the message if l2msg is too large
return nil, errors.New("message too large")
}
switch msg.Header.Kind {
case arbostypes.L1MessageType_L2Message:
return parseL2Message(bytes.NewReader(msg.L2msg), msg.Header.Poster, msg.Header.Timestamp, msg.Header.RequestId, chainId, 0)
return parseL2Message(bytes.NewReader(msg.L2msg), msg.Header.Poster, msg.Header.Timestamp, msg.Header.RequestId, chainId, maxL2MessageSize, 0)
case arbostypes.L1MessageType_Initialize:
return nil, errors.New("ParseL2Transactions encountered initialize message (should've been handled explicitly at genesis)")
case arbostypes.L1MessageType_EndOfBlock:
Expand Down Expand Up @@ -55,7 +55,7 @@ func ParseL2Transactions(msg *arbostypes.L1IncomingMessage, chainId *big.Int, la
})
return types.Transactions{deposit, tx}, nil
case arbostypes.L1MessageType_SubmitRetryable:
tx, err := parseSubmitRetryableMessage(bytes.NewReader(msg.L2msg), msg.Header, chainId)
tx, err := parseSubmitRetryableMessage(bytes.NewReader(msg.L2msg), msg.Header, chainId, maxL2MessageSize)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -109,7 +109,7 @@ func parseTimeOrPanic(format string, value string) time.Time {

var HeartbeatsDisabledAt = uint64(parseTimeOrPanic(time.RFC1123, "Mon, 08 Aug 2022 16:00:00 GMT").Unix())

func parseL2Message(rd io.Reader, poster common.Address, timestamp uint64, requestId *common.Hash, chainId *big.Int, depth int) (types.Transactions, error) {
func parseL2Message(rd io.Reader, poster common.Address, timestamp uint64, requestId *common.Hash, chainId *big.Int, maxL2MessageSize uint64, depth int) (types.Transactions, error) {
var l2KindBuf [1]byte
if _, err := rd.Read(l2KindBuf[:]); err != nil {
return nil, err
Expand Down Expand Up @@ -137,7 +137,7 @@ func parseL2Message(rd io.Reader, poster common.Address, timestamp uint64, reque
segments := make(types.Transactions, 0)
index := big.NewInt(0)
for {
nextMsg, err := util.BytestringFromReader(rd, arbostypes.MaxL2MessageSize)
nextMsg, err := util.BytestringFromReader(rd, maxL2MessageSize)
if err != nil {
// an error here means there are no further messages in the batch
// nolint:nilerr
Expand All @@ -149,7 +149,7 @@ func parseL2Message(rd io.Reader, poster common.Address, timestamp uint64, reque
subRequestId := crypto.Keccak256Hash(requestId[:], arbmath.U256Bytes(index))
nextRequestId = &subRequestId
}
nestedSegments, err := parseL2Message(bytes.NewReader(nextMsg), poster, timestamp, nextRequestId, chainId, depth+1)
nestedSegments, err := parseL2Message(bytes.NewReader(nextMsg), poster, timestamp, nextRequestId, chainId, maxL2MessageSize, depth+1)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -294,7 +294,7 @@ func parseEthDepositMessage(rd io.Reader, header *arbostypes.L1IncomingMessageHe
return types.NewTx(tx), nil
}

func parseSubmitRetryableMessage(rd io.Reader, header *arbostypes.L1IncomingMessageHeader, chainId *big.Int) (*types.Transaction, error) {
func parseSubmitRetryableMessage(rd io.Reader, header *arbostypes.L1IncomingMessageHeader, chainId *big.Int, maxL2MessageSize uint64) (*types.Transaction, error) {
retryTo, err := util.AddressFrom256FromReader(rd)
if err != nil {
return nil, err
Expand Down Expand Up @@ -344,7 +344,7 @@ func parseSubmitRetryableMessage(rd io.Reader, header *arbostypes.L1IncomingMess
return nil, errors.New("data length field too large")
}
dataLength := dataLengthBig.Uint64()
if dataLength > arbostypes.MaxL2MessageSize {
if dataLength > maxL2MessageSize {
return nil, errors.New("retryable data too large")
}
retryData := make([]byte, dataLength)
Expand Down
11 changes: 9 additions & 2 deletions arbstate/inbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"errors"
"fmt"
"io"
"math"
"math/big"
"strings"

Expand Down Expand Up @@ -178,9 +179,10 @@ type inboxMultiplexer struct {
// but ParseSequencerMessage still needs this to decide whether to panic or log on validation errors.
// In replay mode, this allows proper error handling based on the position within the message.
keysetValidationMode daprovider.KeysetValidationMode
maxL2MessageSize uint64
}

func NewInboxMultiplexer(backend InboxBackend, delayedMessagesRead uint64, dapReaders *daprovider.ReaderRegistry, keysetValidationMode daprovider.KeysetValidationMode) arbostypes.InboxMultiplexer {
func NewInboxMultiplexer(backend InboxBackend, delayedMessagesRead uint64, dapReaders *daprovider.ReaderRegistry, keysetValidationMode daprovider.KeysetValidationMode, maxL2MessageSize uint64) arbostypes.InboxMultiplexer {
return &inboxMultiplexer{
backend: backend,
delayedMessagesRead: delayedMessagesRead,
Expand All @@ -192,6 +194,7 @@ func NewInboxMultiplexer(backend InboxBackend, delayedMessagesRead uint64, dapRe
cachedSegmentBlockNumber: 0,
cachedSubMessageNumber: 0,
keysetValidationMode: keysetValidationMode,
maxL2MessageSize: maxL2MessageSize,
}
}

Expand Down Expand Up @@ -346,7 +349,11 @@ func (r *inboxMultiplexer) getNextMsg() (*arbostypes.MessageWithMetadata, error)
if kind == BatchSegmentKindL2Message || kind == BatchSegmentKindL2MessageBrotli {

if kind == BatchSegmentKindL2MessageBrotli {
decompressed, err := arbcompress.Decompress(segment, arbostypes.MaxL2MessageSize)
if r.maxL2MessageSize > math.MaxInt {
// TODO make sur
panic("max l2 message size overflows math.MaxInt")
}
decompressed, err := arbcompress.Decompress(segment, int(r.maxL2MessageSize))
if err != nil {
log.Info("dropping compressed message", "err", err, "delayedMsg", r.delayedMessagesRead)
return nil, nil
Expand Down
3 changes: 2 additions & 1 deletion cmd/chaininfo/arbitrum_chain_info.json
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@
"DataAvailabilityCommittee": false,
"InitialArbOSVersion": 51,
"InitialChainOwner": "0x0000000000000000000000000000000000000000",
"GenesisBlockNum": 0
"GenesisBlockNum": 0,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: revert this change

"MaxL2MessageSize": 1000000000
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion cmd/pruning/pruning.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func findImportantRoots(ctx context.Context, chainDb ethdb.Database, stack *node
return nil, fmt.Errorf("failed to get finalized block: %w", err)
}
l1BlockNum := l1Block.NumberU64()
tracker, err := arbnode.NewInboxTracker(arbDb, nil, nil, arbnode.DefaultSnapSyncConfig)
tracker, err := arbnode.NewInboxTracker(arbDb, nil, nil, arbnode.DefaultSnapSyncConfig, chainConfig.MaxL2MessageSize())
if err != nil {
return nil, err
}
Expand Down
11 changes: 9 additions & 2 deletions execution/gethexec/executionengine.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ type ExecutionEngine struct {

exposeMultiGas bool

maxL2MessageSize int

runningMaintenance atomic.Bool
}

Expand Down Expand Up @@ -425,12 +427,13 @@ func (s *ExecutionEngine) resequenceReorgedMessages(messages []*arbostypes.Messa
continue
}
lastArbosVersion := types.DeserializeHeaderExtraInformation(lastBlockHeader).ArbOSFormatVersion
txes, err := arbos.ParseL2Transactions(msg.Message, s.bc.Config().ChainID, lastArbosVersion)
chainConfig := s.bc.Config()
txes, err := arbos.ParseL2Transactions(msg.Message, chainConfig.ChainID, chainConfig.MaxL2MessageSize(), lastArbosVersion)
if err != nil {
log.Warn("failed to parse sequencer message found from reorg", "err", err)
continue
}
hooks := MakeZeroTxSizeSequencingHooksForTesting(txes, nil, nil, nil)
hooks := MakeZeroTxSizeSequencingHooksForTesting(txes, nil, nil, nil, chainConfig.MaxL2MessageSize())
block, err := s.sequenceTransactionsWithBlockMutex(msg.Message.Header, hooks, nil)
if err != nil {
log.Error("failed to re-sequence old user message removed by reorg", "err", err)
Expand Down Expand Up @@ -1128,3 +1131,7 @@ func (s *ExecutionEngine) MaintenanceStatus() *execution.MaintenanceStatus {
IsRunning: s.runningMaintenance.Load(),
}
}

func (s *ExecutionEngine) MaxL2MessageSize() uint64 {
return s.bc.Config().MaxL2MessageSize()
}
Loading