diff --git a/op-batcher/batcher/channel_builder_test.go b/op-batcher/batcher/channel_builder_test.go index d15b7944c439cf4b84f43ca25ffe079eddf00add..7fef5346f9af2c8cf57e1f82f92aacf4915b69ac 100644 --- a/op-batcher/batcher/channel_builder_test.go +++ b/op-batcher/batcher/channel_builder_test.go @@ -419,6 +419,9 @@ func TestOutputFramesHappy(t *testing.T) { // There should be many frames in the channel builder now require.Greater(t, cb.NumFrames(), 1) + for _, frame := range cb.frames { + require.Len(t, frame.data, int(channelConfig.MaxFrameSize)) + } } // TestMaxRLPBytesPerChannel tests the [channelBuilder.OutputFrames] diff --git a/op-batcher/batcher/channel_manager_test.go b/op-batcher/batcher/channel_manager_test.go index b17b3792b5d58cd29e4d5641ca707fe0c80808b3..ec04fb1f9dd0025d3c8b5479545d820a712f1351 100644 --- a/op-batcher/batcher/channel_manager_test.go +++ b/op-batcher/batcher/channel_manager_test.go @@ -156,8 +156,10 @@ func TestChannelManagerNextTxData(t *testing.T) { require.Equal(t, expectedTxData, m.pendingTransactions[expectedChannelID]) } -// TestClearChannelManager tests clearing the channel manager. -func TestClearChannelManager(t *testing.T) { +// TestChannelManager_Clear tests clearing the channel manager. +func TestChannelManager_Clear(t *testing.T) { + require := require.New(t) + // Create a channel manager log := testlog.Logger(t, log.LvlCrit) rng := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -174,11 +176,11 @@ func TestClearChannelManager(t *testing.T) { }) // Channel Manager state should be empty by default - require.Empty(t, m.blocks) - require.Equal(t, common.Hash{}, m.tip) - require.Nil(t, m.pendingChannel) - require.Empty(t, m.pendingTransactions) - require.Empty(t, m.confirmedTransactions) + require.Empty(m.blocks) + require.Equal(common.Hash{}, m.tip) + require.Nil(m.pendingChannel) + require.Empty(m.pendingTransactions) + require.Empty(m.confirmedTransactions) // Add a block to the channel manager a, _ := derivetest.RandomL2Block(rng, 4) @@ -187,25 +189,25 @@ func TestClearChannelManager(t *testing.T) { Hash: a.Hash(), Number: a.NumberU64(), } - require.NoError(t, m.AddL2Block(a)) + require.NoError(m.AddL2Block(a)) // Make sure there is a channel builder - require.NoError(t, m.ensurePendingChannel(l1BlockID)) - require.NotNil(t, m.pendingChannel) - require.Equal(t, 0, len(m.confirmedTransactions)) + require.NoError(m.ensurePendingChannel(l1BlockID)) + require.NotNil(m.pendingChannel) + require.Len(m.confirmedTransactions, 0) // Process the blocks // We should have a pending channel with 1 frame // and no more blocks since processBlocks consumes // the list - require.NoError(t, m.processBlocks()) - require.NoError(t, m.pendingChannel.co.Flush()) - require.NoError(t, m.pendingChannel.OutputFrames()) + require.NoError(m.processBlocks()) + require.NoError(m.pendingChannel.co.Flush()) + require.NoError(m.pendingChannel.OutputFrames()) _, err := m.nextTxData() - require.NoError(t, err) - require.Equal(t, 0, len(m.blocks)) - require.Equal(t, newL1Tip, m.tip) - require.Equal(t, 1, len(m.pendingTransactions)) + require.NoError(err) + require.Len(m.blocks, 0) + require.Equal(newL1Tip, m.tip) + require.Len(m.pendingTransactions, 1) // Add a new block so we can test clearing // the channel manager with a full state @@ -213,19 +215,19 @@ func TestClearChannelManager(t *testing.T) { Number: big.NewInt(1), ParentHash: a.Hash(), }, nil, nil, nil, nil) - require.NoError(t, m.AddL2Block(b)) - require.Equal(t, 1, len(m.blocks)) - require.Equal(t, b.Hash(), m.tip) + require.NoError(m.AddL2Block(b)) + require.Len(m.blocks, 1) + require.Equal(b.Hash(), m.tip) // Clear the channel manager m.Clear() // Check that the entire channel manager state cleared - require.Empty(t, m.blocks) - require.Equal(t, common.Hash{}, m.tip) - require.Nil(t, m.pendingChannel) - require.Empty(t, m.pendingTransactions) - require.Empty(t, m.confirmedTransactions) + require.Empty(m.blocks) + require.Equal(common.Hash{}, m.tip) + require.Nil(m.pendingChannel) + require.Empty(m.pendingTransactions) + require.Empty(m.confirmedTransactions) } // TestChannelManagerTxConfirmed checks the [ChannelManager.TxConfirmed] function. @@ -259,7 +261,7 @@ func TestChannelManagerTxConfirmed(t *testing.T) { require.Equal(t, expectedTxData, returnedTxData) require.Equal(t, 0, m.pendingChannel.NumFrames()) require.Equal(t, expectedTxData, m.pendingTransactions[expectedChannelID]) - require.Equal(t, 1, len(m.pendingTransactions)) + require.Len(t, m.pendingTransactions, 1) // An unknown pending transaction should not be marked as confirmed // and should not be removed from the pending transactions map @@ -270,14 +272,14 @@ func TestChannelManagerTxConfirmed(t *testing.T) { blockID := eth.BlockID{Number: 0, Hash: common.Hash{0x69}} m.TxConfirmed(unknownTxID, blockID) require.Empty(t, m.confirmedTransactions) - require.Equal(t, 1, len(m.pendingTransactions)) + require.Len(t, m.pendingTransactions, 1) // Now let's mark the pending transaction as confirmed // and check that it is removed from the pending transactions map // and added to the confirmed transactions map m.TxConfirmed(expectedChannelID, blockID) require.Empty(t, m.pendingTransactions) - require.Equal(t, 1, len(m.confirmedTransactions)) + require.Len(t, m.confirmedTransactions, 1) require.Equal(t, blockID, m.confirmedTransactions[expectedChannelID]) } @@ -307,7 +309,7 @@ func TestChannelManagerTxFailed(t *testing.T) { require.Equal(t, expectedTxData, returnedTxData) require.Equal(t, 0, m.pendingChannel.NumFrames()) require.Equal(t, expectedTxData, m.pendingTransactions[expectedChannelID]) - require.Equal(t, 1, len(m.pendingTransactions)) + require.Len(t, m.pendingTransactions, 1) // Trying to mark an unknown pending transaction as failed // shouldn't modify state diff --git a/op-node/rollup/derive/channel_out.go b/op-node/rollup/derive/channel_out.go index a5416fd51b5beec181c6c1ccf038764e4bbe8d7c..90614a81d687b261c5b48a5afa1625c25872b8a8 100644 --- a/op-node/rollup/derive/channel_out.go +++ b/op-node/rollup/derive/channel_out.go @@ -19,8 +19,10 @@ var ErrNotDepositTx = errors.New("first transaction in block is not a deposit tx var ErrTooManyRLPBytes = errors.New("batch would cause RLP bytes to go over limit") // FrameV0OverHeadSize is the absolute minimum size of a frame. -// This is the fixed overhead frame size, -// calculated as follows: 16 + 2 + 4 + 1 = 23 bytes. +// This is the fixed overhead frame size, calculated as specified +// in the [Frame Format] specs: 16 + 2 + 4 + 1 = 23 bytes. +// +// [Frame Format]: https://github.com/ethereum-optimism/optimism/blob/develop/specs/derivation.md#frame-format const FrameV0OverHeadSize = 23 type ChannelOut struct {