diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 8b08b699a1..d2729e062d 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -72,7 +72,6 @@ library TaikoData { struct BlockParamsV2 { address coinbase; - bytes32 extraData; bytes32 parentMetaHash; uint64 anchorBlockId; // NEW uint64 timestamp; // NEW @@ -125,7 +124,6 @@ library TaikoData { uint32 blobTxListLength; uint8 blobIndex; uint8 basefeeAdjustmentQuotient; - uint8 basefeeSharingPctg; uint32 gasIssuancePerSecond; } diff --git a/packages/protocol/contracts/L1/libs/LibData.sol b/packages/protocol/contracts/L1/libs/LibData.sol index f497b7fa0a..f25a26a8fc 100644 --- a/packages/protocol/contracts/L1/libs/LibData.sol +++ b/packages/protocol/contracts/L1/libs/LibData.sol @@ -18,7 +18,6 @@ library LibData { { return TaikoData.BlockParamsV2({ coinbase: _v1.coinbase, - extraData: _v1.extraData, parentMetaHash: _v1.parentMetaHash, anchorBlockId: 0, timestamp: 0, @@ -77,7 +76,6 @@ library LibData { blobTxListLength: 0, blobIndex: 0, basefeeAdjustmentQuotient: 0, - basefeeSharingPctg: 0, gasIssuancePerSecond: 0 }); } diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 14afcf4f5c..7dda7cdf3f 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -20,6 +20,7 @@ library LibProposing { ITierProvider tierProvider; bytes32 parentMetaHash; bool postFork; + bytes32 extraData; } /// @notice Emitted when a block is proposed. @@ -96,7 +97,9 @@ library LibProposing { // otherwise use a default BlockParamsV2 with 0 values } } else { - local.params = LibData.blockParamsV1ToV2(abi.decode(_data, (TaikoData.BlockParams))); + TaikoData.BlockParams memory paramsV1 = abi.decode(_data, (TaikoData.BlockParams)); + local.params = LibData.blockParamsV1ToV2(paramsV1); + local.extraData = paramsV1.extraData; } if (local.params.coinbase == address(0)) { @@ -158,7 +161,12 @@ library LibProposing { anchorBlockHash: blockhash(local.params.anchorBlockId), difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), blobHash: 0, // to be initialized below - extraData: local.params.extraData, + // To make sure each L2 block can be exexucated deterministiclly by the client + // without referering to its metadata on Ethereum, we need to encode + // config.basefeeSharingPctg into the extraData. + extraData: local.postFork + ? _encodeGasConfigs(_config.basefeeSharingPctg) + : local.extraData, coinbase: local.params.coinbase, id: local.b.numBlocks, gasLimit: _config.blockMaxGasLimit, @@ -175,7 +183,6 @@ library LibProposing { blobTxListLength: local.params.blobTxListLength, blobIndex: local.params.blobIndex, basefeeAdjustmentQuotient: _config.basefeeAdjustmentQuotient, - basefeeSharingPctg: _config.basefeeSharingPctg, gasIssuancePerSecond: _config.gasIssuancePerSecond }); } @@ -262,4 +269,8 @@ library LibProposing { revert L1_INVALID_PROPOSER(); } } + + function _encodeGasConfigs(uint8 _basefeeSharingPctg) private pure returns (bytes32) { + return bytes32(uint256(_basefeeSharingPctg)); + } } diff --git a/packages/protocol/test/L1/TaikoL1testGroupA2.t.sol b/packages/protocol/test/L1/TaikoL1testGroupA2.t.sol index a872e25185..49c9a78a27 100644 --- a/packages/protocol/test/L1/TaikoL1testGroupA2.t.sol +++ b/packages/protocol/test/L1/TaikoL1testGroupA2.t.sol @@ -50,7 +50,6 @@ contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { assertEq(meta.anchorBlockHash, blockhash(block.number - 1)); assertEq(meta.livenessBond, config.livenessBond); assertEq(meta.coinbase, Alice); - assertEq(meta.extraData, params.extraData); TaikoData.Block memory blk = L1.getBlock(i); assertEq(blk.blockId, i); @@ -104,7 +103,6 @@ contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { // Propose the first block with default parameters TaikoData.BlockParamsV2 memory params = TaikoData.BlockParamsV2({ coinbase: address(0), - extraData: 0, parentMetaHash: 0, anchorBlockId: 0, timestamp: 0, @@ -125,7 +123,6 @@ contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { assertEq(meta.livenessBond, config.livenessBond); assertEq(meta.coinbase, Alice); assertEq(meta.parentMetaHash, bytes32(uint256(1))); - assertEq(meta.extraData, params.extraData); TaikoData.Block memory blk = L1.getBlock(1); assertEq(blk.blockId, 1); @@ -145,7 +142,6 @@ contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { params = TaikoData.BlockParamsV2({ coinbase: Bob, - extraData: bytes32(uint256(123)), parentMetaHash: 0, anchorBlockId: 90, timestamp: uint64(block.timestamp - 100), @@ -165,7 +161,6 @@ contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { assertEq(meta.livenessBond, config.livenessBond); assertEq(meta.coinbase, Bob); assertEq(meta.parentMetaHash, blk.metaHash); - assertEq(meta.extraData, params.extraData); blk = L1.getBlock(2); assertEq(blk.blockId, 2);