@@ -418,7 +418,7 @@ func (s *DriverTestSuite) TestInsertPreconfBlocks() {
418
418
s .True (res .IsSuccess ())
419
419
420
420
// Try to insert two preconfirmation blocks
421
- s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 1 ).IsSuccess ())
421
+ s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 1 , l1Head1 . Time ).IsSuccess ())
422
422
l2Head3 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
423
423
s .Nil (err )
424
424
@@ -431,7 +431,7 @@ func (s *DriverTestSuite) TestInsertPreconfBlocks() {
431
431
s .Equal (common.Hash {}, l1Origin .L1BlockHash )
432
432
s .True (l1Origin .IsPreconfBlock ())
433
433
434
- s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 2 ).IsSuccess ())
434
+ s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 2 , l1Head1 . Time ).IsSuccess ())
435
435
l2Head4 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
436
436
s .Nil (err )
437
437
@@ -502,7 +502,7 @@ func (s *DriverTestSuite) TestInsertPreconfBlocksNotReorg() {
502
502
s .True (res .IsSuccess ())
503
503
504
504
// Try to insert two preconfirmation blocks
505
- s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 1 ).IsSuccess ())
505
+ s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 1 , l1Head1 . Time ).IsSuccess ())
506
506
l2Head3 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
507
507
s .Nil (err )
508
508
@@ -515,14 +515,18 @@ func (s *DriverTestSuite) TestInsertPreconfBlocksNotReorg() {
515
515
s .Equal (common.Hash {}, l1Origin .L1BlockHash )
516
516
s .True (l1Origin .IsPreconfBlock ())
517
517
518
- s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 2 ).IsSuccess ())
518
+ s .True (s .insertPreconfBlock (s .preconfServerURL , l1Head1 , l2Head2 .Number .Uint64 ()+ 2 , l1Head1 . Time ).IsSuccess ())
519
519
l2Head4 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
520
520
s .Nil (err )
521
521
s .Equal (l2Head3 .Number ().Uint64 ()+ 1 , l2Head4 .Number ().Uint64 ())
522
522
s .Equal (2 , len (l2Head4 .Transactions ()))
523
523
524
524
// Propose two same L2 blocks in a batch
525
- s .proposePreconfBatch ([]* types.Block {l2Head3 , l2Head4 }, []* types.Header {l1Head1 , l1Head1 })
525
+ s .proposePreconfBatch (
526
+ []* types.Block {l2Head3 , l2Head4 },
527
+ []* types.Header {l1Head1 , l1Head1 },
528
+ []uint8 {0 , 0 },
529
+ )
526
530
527
531
l2Head5 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
528
532
s .Nil (err )
@@ -607,6 +611,93 @@ func (s *DriverTestSuite) TestOnUnsafeL2Payload() {
607
611
s .Equal (anchorTx .Hash (), l2Head2 .Transactions ()[0 ].Hash ())
608
612
}
609
613
614
+ func (s * DriverTestSuite ) TestInsertPreconfBlocksWithReorg () {
615
+ l2Head1 , err := s .d .rpc .L2 .HeaderByNumber (context .Background (), nil )
616
+ s .Nil (err )
617
+
618
+ s .Nil (s .d .ChainSyncer ().BlobSyncer ().ProcessL1Blocks (context .Background ()))
619
+
620
+ // Propose valid L2 blocks to make the L2 fork into Pacaya fork.
621
+ s .ForkIntoPacaya (s .p , s .d .ChainSyncer ().BlobSyncer ())
622
+
623
+ l2Head2 , err := s .d .rpc .L2 .HeaderByNumber (context .Background (), nil )
624
+ s .Nil (err )
625
+
626
+ l1Head1 , err := s .d .rpc .L1 .HeaderByNumber (context .Background (), nil )
627
+ s .Nil (err )
628
+
629
+ s .GreaterOrEqual (l2Head2 .Number .Uint64 (), l2Head1 .Number .Uint64 ())
630
+
631
+ res , err := resty .New ().R ().Get (s .preconfServerURL .String () + "/healthz" )
632
+ s .Nil (err )
633
+ s .True (res .IsSuccess ())
634
+
635
+ // Try to insert four preconfirmation blocks
636
+ var (
637
+ preconfBlocksNum = 4
638
+ preconfBlocks = make ([]* types.Block , preconfBlocksNum )
639
+ )
640
+ for i := 0 ; i < preconfBlocksNum ; i ++ {
641
+ s .True (s .insertPreconfBlock (
642
+ s .preconfServerURL ,
643
+ l1Head1 ,
644
+ l2Head2 .Number .Uint64 ()+ 1 + uint64 (i ),
645
+ l1Head1 .Time + uint64 (preconfBlocksNum ),
646
+ ).IsSuccess ())
647
+ head , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
648
+ s .Nil (err )
649
+
650
+ s .Equal (2 , len (head .Transactions ()))
651
+ preconfBlocks [i ] = head
652
+
653
+ l1Origin , err := s .RPCClient .L2 .L1OriginByID (
654
+ context .Background (),
655
+ new (big.Int ).SetUint64 (l2Head2 .Number .Uint64 ()+ 1 + uint64 (i )),
656
+ )
657
+ s .Nil (err )
658
+ s .Equal (head .Number ().Uint64 (), l1Origin .BlockID .Uint64 ())
659
+ s .Equal (head .Hash (), l1Origin .L2BlockHash )
660
+ s .Equal (common.Hash {}, l1Origin .L1BlockHash )
661
+ s .True (l1Origin .IsPreconfBlock ())
662
+
663
+ headL1Origin , err := s .RPCClient .L2 .HeadL1Origin (context .Background ())
664
+ s .Nil (err )
665
+ s .Equal (l2Head2 .Number , headL1Origin .BlockID )
666
+ s .Equal (l2Head2 .Hash (), headL1Origin .L2BlockHash )
667
+ s .False (headL1Origin .IsPreconfBlock ())
668
+ }
669
+
670
+ // Propose three same L2 blocks in a batch
671
+ s .proposePreconfBatch (
672
+ preconfBlocks ,
673
+ []* types.Header {l1Head1 , l1Head1 , l1Head1 , l1Head1 },
674
+ []uint8 {0 , 1 , 0 , 0 },
675
+ )
676
+
677
+ l2Head3 , err := s .d .rpc .L2 .BlockByNumber (context .Background (), nil )
678
+ s .Nil (err )
679
+ s .Equal (l2Head3 .Number ().Uint64 (), preconfBlocks [len (preconfBlocks )- 1 ].Number ().Uint64 ())
680
+ s .NotEqual (l2Head3 .Hash (), preconfBlocks [len (preconfBlocks )- 1 ].Hash ())
681
+ s .Equal (2 , len (l2Head3 .Transactions ()))
682
+
683
+ l1Origin2 , err := s .RPCClient .L2 .L1OriginByID (
684
+ context .Background (),
685
+ new (big.Int ).SetUint64 (l2Head2 .Number .Uint64 ()+ uint64 (preconfBlocksNum )),
686
+ )
687
+ s .Nil (err )
688
+ s .Equal (l2Head3 .Number ().Uint64 (), l1Origin2 .BlockID .Uint64 ())
689
+ s .Equal (l2Head3 .Hash (), l1Origin2 .L2BlockHash )
690
+ s .Equal (l2Head3 .Hash (), l1Origin2 .L2BlockHash )
691
+ s .NotEqual (common.Hash {}, l1Origin2 .L1BlockHash )
692
+ s .False (l1Origin2 .IsPreconfBlock ())
693
+
694
+ canonicalL1Origin , err := s .RPCClient .L2 .HeadL1Origin (context .Background ())
695
+ s .Nil (err )
696
+ s .Equal (l1Origin2 , canonicalL1Origin )
697
+ s .Equal (l2Head3 .Number ().Uint64 (), canonicalL1Origin .BlockID .Uint64 ())
698
+ s .Equal (l2Head3 .Hash (), canonicalL1Origin .L2BlockHash )
699
+ }
700
+
610
701
func (s * DriverTestSuite ) TestOnUnsafeL2PayloadWithInvalidPayload () {
611
702
s .ForkIntoPacaya (s .p , s .d .ChainSyncer ().BlobSyncer ())
612
703
// Propose some valid L2 blocks
@@ -934,7 +1025,11 @@ func (s *DriverTestSuite) TestOnUnsafeL2PayloadWithMissingAncients() {
934
1025
s .Equal (l2Head2 .Number .Uint64 (), l2Head5 .Number ().Uint64 ())
935
1026
}
936
1027
937
- func (s * DriverTestSuite ) proposePreconfBatch (blocks []* types.Block , anchoredL1Blocks []* types.Header ) {
1028
+ func (s * DriverTestSuite ) proposePreconfBatch (
1029
+ blocks []* types.Block ,
1030
+ anchoredL1Blocks []* types.Header ,
1031
+ timeShifts []uint8 ,
1032
+ ) {
938
1033
var (
939
1034
to = & s .p .TaikoL1Address
940
1035
proposer = crypto .PubkeyToAddress (s .p .L1ProposerPrivKey .PublicKey )
@@ -950,12 +1045,13 @@ func (s *DriverTestSuite) proposePreconfBatch(blocks []*types.Block, anchoredL1B
950
1045
951
1046
s .NotZero (len (blocks ))
952
1047
s .Equal (len (blocks ), len (anchoredL1Blocks ))
1048
+ s .Equal (len (blocks ), len (timeShifts ))
953
1049
954
- for _ , b := range blocks {
1050
+ for i , b := range blocks {
955
1051
allTxs = append (allTxs , b .Transactions ()[1 :]... )
956
1052
blockParams = append (blockParams , pacayaBindings.ITaikoInboxBlockParams {
957
1053
NumTransactions : uint16 (b .Transactions ()[1 :].Len ()),
958
- TimeShift : 0 ,
1054
+ TimeShift : timeShifts [ i ] ,
959
1055
})
960
1056
}
961
1057
@@ -1070,6 +1166,7 @@ func (s *DriverTestSuite) insertPreconfBlock(
1070
1166
url * url.URL ,
1071
1167
anchoredL1Block * types.Header ,
1072
1168
l2BlockID uint64 ,
1169
+ timestamp uint64 ,
1073
1170
) * resty.Response {
1074
1171
preconferPrivKey , err := crypto .ToECDSA (common .FromHex (os .Getenv ("L1_PROPOSER_PRIVATE_KEY" )))
1075
1172
s .Nil (err )
@@ -1104,7 +1201,7 @@ func (s *DriverTestSuite) insertPreconfBlock(
1104
1201
parent ,
1105
1202
true ,
1106
1203
s .d .protocolConfig .BaseFeeConfig (),
1107
- anchoredL1Block . Time ,
1204
+ timestamp ,
1108
1205
)
1109
1206
s .Nil (err )
1110
1207
@@ -1136,7 +1233,7 @@ func (s *DriverTestSuite) insertPreconfBlock(
1136
1233
Number : l2BlockID ,
1137
1234
GasLimit : uint64 (s .d .protocolConfig .BlockMaxGasLimit () + uint32 (consensus .AnchorV3GasLimit )),
1138
1235
ExtraData : hexutil .Bytes (extraData [:]),
1139
- Timestamp : anchoredL1Block . Time ,
1236
+ Timestamp : timestamp ,
1140
1237
Transactions : b ,
1141
1238
BaseFeePerGas : baseFee .Uint64 (),
1142
1239
},
0 commit comments