From 129fde69007441a587676317e7584ea7c0a0130e Mon Sep 17 00:00:00 2001 From: Nazarii Denha Date: Wed, 12 Jun 2024 18:12:59 +0200 Subject: [PATCH] add tests for codecv0 and ccodecv1 --- encoding/bitmap.go | 3 ++ encoding/codecv0/codecv0.go | 1 + encoding/codecv0/codecv0_test.go | 45 ++++++++++++++++++++++++++ encoding/codecv1/codecv1.go | 1 + encoding/codecv1/codecv1_test.go | 55 ++++++++++++++++++++++++++++++++ encoding/codecv2/codecv2.go | 1 + 6 files changed, 106 insertions(+) diff --git a/encoding/bitmap.go b/encoding/bitmap.go index f1a67cb..5631983 100644 --- a/encoding/bitmap.go +++ b/encoding/bitmap.go @@ -83,6 +83,9 @@ func DecodeBitmap(skippedL1MessageBitmap []byte, totalL1MessagePopped int) ([]*b // IsL1MessageSkipped checks if index is skipped in bitmap func IsL1MessageSkipped(skippedBitmap []*big.Int, index uint64) bool { + if index > uint64(len(skippedBitmap))*256 { + return false + } quo := index / 256 rem := index % 256 return skippedBitmap[quo].Bit(int(rem)) != 0 diff --git a/encoding/codecv0/codecv0.go b/encoding/codecv0/codecv0.go index e69c26e..38f0ecd 100644 --- a/encoding/codecv0/codecv0.go +++ b/encoding/codecv0/codecv0.go @@ -196,6 +196,7 @@ func DecodeDAChunksRawTx(bytes [][]byte) ([]*DAChunkRawTx, error) { for i := 0; i < numBlocks; i++ { startIdx := 1 + i*BlockContextByteSize // add 1 to skip numBlocks byte endIdx := startIdx + BlockContextByteSize + blocks[i] = &DABlock{} err := blocks[i].Decode(chunk[startIdx:endIdx]) if err != nil { return nil, err diff --git a/encoding/codecv0/codecv0_test.go b/encoding/codecv0/codecv0_test.go index 330a826..72d58a2 100644 --- a/encoding/codecv0/codecv0_test.go +++ b/encoding/codecv0/codecv0_test.go @@ -264,6 +264,38 @@ func TestCodecV0(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 61, len(chunkBytes2)) + daChunksRawTx, err := DecodeDAChunksRawTx([][]byte{chunkBytes1, chunkBytes2}) + assert.NoError(t, err) + // assert number of chunks + assert.Equal(t, 2, len(daChunksRawTx)) + + // assert block in first chunk + assert.Equal(t, 3, len(daChunksRawTx[0].Blocks)) + assert.Equal(t, daChunk1.Blocks[0], daChunksRawTx[0].Blocks[0]) + assert.Equal(t, daChunk1.Blocks[1], daChunksRawTx[0].Blocks[1]) + daChunksRawTx[0].Blocks[2].BaseFee = nil + assert.Equal(t, daChunk1.Blocks[2], daChunksRawTx[0].Blocks[2]) + + // assert block in second chunk + assert.Equal(t, 1, len(daChunksRawTx[1].Blocks)) + daChunksRawTx[1].Blocks[0].BaseFee = nil + assert.Equal(t, daChunk2.Blocks[0], daChunksRawTx[1].Blocks[0]) + + // assert transactions in first chunk + assert.Equal(t, 3, len(daChunksRawTx[0].Transactions)) + // here number of transactions in encoded and decoded chunks may be different, because decodec chunks doesn't contain l1msgs + assert.Equal(t, 2, len(daChunksRawTx[0].Transactions[0])) + assert.Equal(t, 1, len(daChunksRawTx[0].Transactions[1])) + assert.Equal(t, 1, len(daChunksRawTx[0].Transactions[2])) + + assert.EqualValues(t, daChunk1.Transactions[0][0].TxHash, daChunksRawTx[0].Transactions[0][0].Hash().String()) + assert.EqualValues(t, daChunk1.Transactions[0][1].TxHash, daChunksRawTx[0].Transactions[0][1].Hash().String()) + + // assert transactions in second chunk + assert.Equal(t, 1, len(daChunksRawTx[1].Transactions)) + // here number of transactions in encoded and decoded chunks may be different, because decodec chunks doesn't contain l1msgs + assert.Equal(t, 0, len(daChunksRawTx[1].Transactions[0])) + batch = &encoding.Batch{ Index: 1, TotalL1MessagePoppedBefore: 0, @@ -297,6 +329,19 @@ func TestCodecV0(t *testing.T) { decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) assert.Equal(t, batchHexString, decodedBatchHexString) + decodedBitmap, err := encoding.DecodeBitmap(decodedDABatch.SkippedL1MessageBitmap, int(decodedDABatch.L1MessagePopped)) + assert.NoError(t, err) + assert.True(t, encoding.IsL1MessageSkipped(decodedBitmap, 0)) + assert.True(t, encoding.IsL1MessageSkipped(decodedBitmap, 9)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 10)) + assert.True(t, encoding.IsL1MessageSkipped(decodedBitmap, 11)) + assert.True(t, encoding.IsL1MessageSkipped(decodedBitmap, 36)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 37)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 38)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 39)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 40)) + assert.False(t, encoding.IsL1MessageSkipped(decodedBitmap, 41)) + // Test case: many consecutive L1 Msgs in 1 bitmap, no leading skipped msgs. chunk = &encoding.Chunk{ Blocks: []*encoding.Block{block4}, diff --git a/encoding/codecv1/codecv1.go b/encoding/codecv1/codecv1.go index c0158da..a63dc4a 100644 --- a/encoding/codecv1/codecv1.go +++ b/encoding/codecv1/codecv1.go @@ -181,6 +181,7 @@ func DecodeDAChunksRawTx(bytes [][]byte) ([]*DAChunkRawTx, error) { for i := 0; i < numBlocks; i++ { startIdx := 1 + i*BlockContextByteSize // add 1 to skip numBlocks byte endIdx := startIdx + BlockContextByteSize + blocks[i] = &DABlock{} err := blocks[i].Decode(chunk[startIdx:endIdx]) if err != nil { return nil, err diff --git a/encoding/codecv1/codecv1_test.go b/encoding/codecv1/codecv1_test.go index b914ed6..6a6fcf8 100644 --- a/encoding/codecv1/codecv1_test.go +++ b/encoding/codecv1/codecv1_test.go @@ -473,6 +473,61 @@ func TestCodecV1BatchBlob(t *testing.T) { assert.Equal(t, "0x01b63f87bdd2caa8d43500d47ee59204f61af95339483c62ff436c6beabf47bf", batch.BlobVersionedHash.Hex()) } +func TestCodecV1Decode(t *testing.T) { + trace0 := readBlockFromJSON(t, "../testdata/blockTrace_02.json") + trace1 := readBlockFromJSON(t, "../testdata/blockTrace_03.json") + chunk0 := &encoding.Chunk{Blocks: []*encoding.Block{trace0, trace1}} + daChunk0, err := NewDAChunk(chunk0, 0) + assert.NoError(t, err) + chunkBytes0 := daChunk0.Encode() + + trace2 := readBlockFromJSON(t, "../testdata/blockTrace_04.json") + trace3 := readBlockFromJSON(t, "../testdata/blockTrace_05.json") + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3}} + daChunk1, err := NewDAChunk(chunk1, 0) + assert.NoError(t, err) + chunkBytes1 := daChunk1.Encode() + + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk0, chunk1}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + + daChunksRawTx, err := DecodeDAChunksRawTx([][]byte{chunkBytes0, chunkBytes1}) + assert.NoError(t, err) + // assert number of chunks + assert.Equal(t, 2, len(daChunksRawTx)) + + // assert block in first chunk + assert.Equal(t, 2, len(daChunksRawTx[0].Blocks)) + assert.Equal(t, daChunk0.Blocks[0], daChunksRawTx[0].Blocks[0]) + assert.Equal(t, daChunk0.Blocks[1], daChunksRawTx[0].Blocks[1]) + + // assert block in second chunk + assert.Equal(t, 2, len(daChunksRawTx[1].Blocks)) + daChunksRawTx[1].Blocks[0].BaseFee = nil + assert.Equal(t, daChunk1.Blocks[0], daChunksRawTx[1].Blocks[0]) + daChunksRawTx[1].Blocks[1].BaseFee = nil + assert.Equal(t, daChunk1.Blocks[1], daChunksRawTx[1].Blocks[1]) + + blob := batch.Blob() + DecodeTxsFromBlob(blob, daChunksRawTx) + + // assert transactions in first chunk + assert.Equal(t, 2, len(daChunksRawTx[0].Transactions)) + // here number of transactions in encoded and decoded chunks may be different, because decodec chunks doesn't contain l1msgs + assert.Equal(t, 2, len(daChunksRawTx[0].Transactions[0])) + assert.Equal(t, 1, len(daChunksRawTx[0].Transactions[1])) + + assert.EqualValues(t, daChunk0.Transactions[0][0].TxHash, daChunksRawTx[0].Transactions[0][0].Hash().String()) + assert.EqualValues(t, daChunk0.Transactions[0][1].TxHash, daChunksRawTx[0].Transactions[0][1].Hash().String()) + + // assert transactions in second chunk + assert.Equal(t, 2, len(daChunksRawTx[1].Transactions)) + // here number of transactions in encoded and decoded chunks may be different, because decodec chunks doesn't contain l1msgs + assert.Equal(t, 1, len(daChunksRawTx[1].Transactions[0])) + assert.Equal(t, 0, len(daChunksRawTx[1].Transactions[1])) +} + func TestCodecV1BatchChallenge(t *testing.T) { trace2 := readBlockFromJSON(t, "../testdata/blockTrace_02.json") chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} diff --git a/encoding/codecv2/codecv2.go b/encoding/codecv2/codecv2.go index d0fae47..a18acae 100644 --- a/encoding/codecv2/codecv2.go +++ b/encoding/codecv2/codecv2.go @@ -184,6 +184,7 @@ func DecodeDAChunksRawTx(bytes [][]byte) ([]*DAChunkRawTx, error) { for i := 0; i < numBlocks; i++ { startIdx := 1 + i*BlockContextByteSize // add 1 to skip numBlocks byte endIdx := startIdx + BlockContextByteSize + blocks[i] = &DABlock{} err := blocks[i].Decode(chunk[startIdx:endIdx]) if err != nil { return nil, err