diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfcb76c4d3..79c67ef5ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: '1.21' + go-version: '1.24' - name: Lint run: make lint diff --git a/core/rawdb/gen_taiko_l1_origin.go b/core/rawdb/gen_taiko_l1_origin.go index 24659f7d4c..4e7837a623 100644 --- a/core/rawdb/gen_taiko_l1_origin.go +++ b/core/rawdb/gen_taiko_l1_origin.go @@ -16,26 +16,29 @@ var _ = (*l1OriginMarshaling)(nil) // MarshalJSON marshals as JSON. func (l L1Origin) MarshalJSON() ([]byte, error) { type L1Origin struct { - BlockID *math.HexOrDecimal256 `json:"blockID" gencodec:"required"` - L2BlockHash common.Hash `json:"l2BlockHash"` - L1BlockHeight *math.HexOrDecimal256 `json:"l1BlockHeight" rlp:"optional"` - L1BlockHash common.Hash `json:"l1BlockHash" rlp:"optional"` + BlockID *math.HexOrDecimal256 `json:"blockID" gencodec:"required"` + L2BlockHash common.Hash `json:"l2BlockHash"` + L1BlockHeight *math.HexOrDecimal256 `json:"l1BlockHeight" rlp:"optional"` + L1BlockHash common.Hash `json:"l1BlockHash" rlp:"optional"` + BuildPayloadArgsID [8]byte `json:"buildPayloadArgsID" rlp:"optional"` } var enc L1Origin enc.BlockID = (*math.HexOrDecimal256)(l.BlockID) enc.L2BlockHash = l.L2BlockHash enc.L1BlockHeight = (*math.HexOrDecimal256)(l.L1BlockHeight) enc.L1BlockHash = l.L1BlockHash + enc.BuildPayloadArgsID = l.BuildPayloadArgsID return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (l *L1Origin) UnmarshalJSON(input []byte) error { type L1Origin struct { - BlockID *math.HexOrDecimal256 `json:"blockID" gencodec:"required"` - L2BlockHash *common.Hash `json:"l2BlockHash"` - L1BlockHeight *math.HexOrDecimal256 `json:"l1BlockHeight" rlp:"optional"` - L1BlockHash *common.Hash `json:"l1BlockHash" rlp:"optional"` + BlockID *math.HexOrDecimal256 `json:"blockID" gencodec:"required"` + L2BlockHash *common.Hash `json:"l2BlockHash"` + L1BlockHeight *math.HexOrDecimal256 `json:"l1BlockHeight" rlp:"optional"` + L1BlockHash *common.Hash `json:"l1BlockHash" rlp:"optional"` + BuildPayloadArgsID *[8]byte `json:"buildPayloadArgsID" rlp:"optional"` } var dec L1Origin if err := json.Unmarshal(input, &dec); err != nil { @@ -54,5 +57,8 @@ func (l *L1Origin) UnmarshalJSON(input []byte) error { if dec.L1BlockHash != nil { l.L1BlockHash = *dec.L1BlockHash } + if dec.BuildPayloadArgsID != nil { + l.BuildPayloadArgsID = *dec.BuildPayloadArgsID + } return nil } diff --git a/core/rawdb/taiko_l1_origin.go b/core/rawdb/taiko_l1_origin.go index 7204643a9f..c0cfb52d97 100644 --- a/core/rawdb/taiko_l1_origin.go +++ b/core/rawdb/taiko_l1_origin.go @@ -29,6 +29,15 @@ func l1OriginKey(blockID *big.Int) []byte { // L1Origin represents a L1Origin of a L2 block. type L1Origin struct { + BlockID *big.Int `json:"blockID" gencodec:"required"` + L2BlockHash common.Hash `json:"l2BlockHash"` + L1BlockHeight *big.Int `json:"l1BlockHeight" rlp:"optional"` + L1BlockHash common.Hash `json:"l1BlockHash" rlp:"optional"` + BuildPayloadArgsID [8]byte `json:"buildPayloadArgsID" rlp:"optional"` +} + +// L1OriginLegacy represents a legacy L1Origin of a L2 block. +type L1OriginLegacy struct { BlockID *big.Int `json:"blockID" gencodec:"required"` L2BlockHash common.Hash `json:"l2BlockHash"` L1BlockHeight *big.Int `json:"l1BlockHeight" rlp:"optional"` @@ -64,9 +73,25 @@ func ReadL1Origin(db ethdb.KeyValueReader, blockID *big.Int) (*L1Origin, error) return nil, nil } + // First try to decode the new version (with new fields). l1Origin := new(L1Origin) if err := rlp.Decode(bytes.NewReader(data), l1Origin); err != nil { - return nil, fmt.Errorf("invalid L1Origin RLP bytes: %w", err) + // If decoding the new version fails, try to decode the legacy version (without new fields). + l1OriginLegacy := new(L1OriginLegacy) + if err := rlp.Decode(bytes.NewReader(data), &l1OriginLegacy); err != nil { + return nil, fmt.Errorf("invalid legacy L1Origin RLP bytes: %w", err) + } + + // If decoding legacy version succeeds, manually + // construct the new L1Origin with default values for the new fields. + l1Origin = &L1Origin{ + BlockID: l1OriginLegacy.BlockID, + L2BlockHash: l1OriginLegacy.L2BlockHash, + L1BlockHeight: l1OriginLegacy.L1BlockHeight, + L1BlockHash: l1OriginLegacy.L1BlockHash, + // Set BuildPayloadArgsID to an empty hash as the intended default for legacy L1Origin conversions. + BuildPayloadArgsID: [8]byte{}, + } } return l1Origin, nil