From eb7fd9bec01c9f060aa204d9ac58140f0d82df2d Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 29 Jul 2024 21:00:49 +0800 Subject: [PATCH 1/6] add proposeBlocksV2 --- packages/protocol/contracts/L1/ITaikoL1.sol | 13 ++++++- packages/protocol/contracts/L1/TaikoL1.sol | 39 +++++++++++++++++++ .../contracts/L1/libs/LibProposing.sol | 19 +++++---- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/packages/protocol/contracts/L1/ITaikoL1.sol b/packages/protocol/contracts/L1/ITaikoL1.sol index b01e83131e2..6f32ba20170 100644 --- a/packages/protocol/contracts/L1/ITaikoL1.sol +++ b/packages/protocol/contracts/L1/ITaikoL1.sol @@ -20,7 +20,7 @@ interface ITaikoL1 { returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_); /// @notice Proposes a Taiko L2 block (version 2) - /// @param _params Block parameters, currently an encoded BlockParams object. + /// @param _params Block parameters, an encoded BlockParamsV2 object. /// @param _txList txList data if calldata is used for DA. /// @return meta_ The metadata of the proposed L2 block. function proposeBlockV2( @@ -30,6 +30,17 @@ interface ITaikoL1 { external returns (TaikoData.BlockMetadataV2 memory meta_); + /// @notice Proposes a Taiko L2 block (version 2) + /// @param _paramsArr A list of encoded BlockParamsV2 objects. + /// @param _txListArr A list of txList. + /// @return metaArr_ The metadata objects of the proposed L2 blocks. + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + returns (TaikoData.BlockMetadataV2[] memory metaArr_); + /// @notice Proves or contests a block transition. /// @param _blockId The index of the block to prove. This is also used to /// select the right implementation version. diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 664d18ff31b..fac975b05be 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -25,6 +25,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; error L1_FORK_ERROR(); + error L1_INVALID_PARAMS(); error L1_RECEIVE_DISABLED(); modifier whenProvingNotPaused() { @@ -37,6 +38,11 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { emit StateVariablesUpdated(state.slotB); } + modifier onlyRegisteredProposer() { + LibProposing.checkProposerPermission(this); + _; + } + /// @dev Allows for receiving Ether from Hooks receive() external payable { if (!inNonReentrant()) revert L1_RECEIVE_DISABLED(); @@ -76,6 +82,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { ) external payable + onlyRegisteredProposer whenNotPaused nonReentrant emitEventForClient @@ -96,6 +103,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { bytes calldata _txList ) external + onlyRegisteredProposer whenNotPaused nonReentrant emitEventForClient @@ -111,6 +119,37 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { } } + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + onlyRegisteredProposer + whenNotPaused + nonReentrant + emitEventForClient + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { + if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) { + revert L1_INVALID_PARAMS(); + } + + metaArr_ = new TaikoData.BlockMetadataV2[](_paramsArr.length); + TaikoData.Config memory config = getConfig(); + + for (uint256 i; i < _paramsArr.length; ++i) { + (, metaArr_[i],) = + LibProposing.proposeBlock(state, config, this, _paramsArr[i], _txListArr[i]); + } + + uint64 firstBlockId = metaArr_[0].id; + if (firstBlockId < config.ontakeForkHeight) revert L1_FORK_ERROR(); + + if (LibUtils.shouldVerifyBlocks(config, firstBlockId, true) && !state.slotB.provingPaused) { + LibVerifying.verifyBlocks(state, config, this, config.maxBlocksToVerify); + } + } + /// @inheritdoc ITaikoL1 function proveBlock( uint64 _blockId, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 6edd7187819..df332d55967 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -17,7 +17,6 @@ library LibProposing { struct Local { TaikoData.SlotB b; TaikoData.BlockParamsV2 params; - address proposerAccess; ITierProvider tierProvider; bytes32 parentMetaHash; bool postFork; @@ -82,15 +81,6 @@ library LibProposing { { // Checks proposer access. Local memory local; - - local.proposerAccess = _resolver.resolve(LibStrings.B_PROPOSER_ACCESS, true); - if ( - local.proposerAccess != address(0) - && !IProposerAccess(local.proposerAccess).isProposerEligible(msg.sender) - ) { - revert L1_INVALID_PROPOSER(); - } - local.b = _state.slotB; local.postFork = local.b.numBlocks >= _config.ontakeForkHeight; @@ -263,4 +253,13 @@ library LibProposing { }); } } + + function checkProposerPermission(IAddressResolver _resolver) internal view { + address proposerAccess = _resolver.resolve(LibStrings.B_PROPOSER_ACCESS, true); + if (proposerAccess == address(0)) return; + + if (!IProposerAccess(proposerAccess).isProposerEligible(msg.sender)) { + revert L1_INVALID_PROPOSER(); + } + } } From 74af1d5549c7f79f94917169c4068a3196c8fbb1 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 29 Jul 2024 21:20:23 +0800 Subject: [PATCH 2/6] Update LibProving.sol --- packages/protocol/contracts/L1/libs/LibProving.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 345957f440c..b894396814d 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -135,7 +135,7 @@ library LibProving { uint64 _blockId, bytes calldata _input ) - internal + public { Local memory local; From 0d0485a49ec0e586f465f5d1a46b462d9134f26c Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 30 Jul 2024 01:20:46 +0800 Subject: [PATCH 3/6] Update TaikoL1.sol --- packages/protocol/contracts/L1/TaikoL1.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index fac975b05be..d7d1a3972b0 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -140,14 +140,14 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { for (uint256 i; i < _paramsArr.length; ++i) { (, metaArr_[i],) = LibProposing.proposeBlock(state, config, this, _paramsArr[i], _txListArr[i]); - } - - uint64 firstBlockId = metaArr_[0].id; - if (firstBlockId < config.ontakeForkHeight) revert L1_FORK_ERROR(); - if (LibUtils.shouldVerifyBlocks(config, firstBlockId, true) && !state.slotB.provingPaused) { - LibVerifying.verifyBlocks(state, config, this, config.maxBlocksToVerify); + uint64 id = metaArr_[i].id; + if (LibUtils.shouldVerifyBlocks(config, id, true) && !state.slotB.provingPaused) { + LibVerifying.verifyBlocks(state, config, this, config.maxBlocksToVerify); + } } + + if (metaArr_[0].id < config.ontakeForkHeight) revert L1_FORK_ERROR(); } /// @inheritdoc ITaikoL1 From c9bb4c7fd8c5b37935cfa50ab37d3b19641e3c6c Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 30 Jul 2024 09:37:48 +0800 Subject: [PATCH 4/6] Update packages/protocol/contracts/L1/TaikoL1.sol Co-authored-by: d1onys1us <13951458+d1onys1us@users.noreply.github.com> --- packages/protocol/contracts/L1/TaikoL1.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index d7d1a3972b0..59c1134a606 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -119,6 +119,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { } } + /// @inheritdoc ITaikoL1 function proposeBlocksV2( bytes[] calldata _paramsArr, bytes[] calldata _txListArr From 63447b58030c2c0d3a19c895a1fe26f83ed34f04 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 30 Jul 2024 09:57:13 +0800 Subject: [PATCH 5/6] Update TaikoL1.sol --- packages/protocol/contracts/L1/TaikoL1.sol | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 59c1134a606..2afe70fdad7 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -109,14 +109,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { emitEventForClient returns (TaikoData.BlockMetadataV2 memory meta_) { - TaikoData.Config memory config = getConfig(); - - (, meta_,) = LibProposing.proposeBlock(state, config, this, _params, _txList); - if (meta_.id < config.ontakeForkHeight) revert L1_FORK_ERROR(); - - if (LibUtils.shouldVerifyBlocks(config, meta_.id, true) && !state.slotB.provingPaused) { - LibVerifying.verifyBlocks(state, config, this, config.maxBlocksToVerify); - } + return _proposeBlock(_params, _txList, getConfig()); } /// @inheritdoc ITaikoL1 @@ -139,16 +132,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { TaikoData.Config memory config = getConfig(); for (uint256 i; i < _paramsArr.length; ++i) { - (, metaArr_[i],) = - LibProposing.proposeBlock(state, config, this, _paramsArr[i], _txListArr[i]); - - uint64 id = metaArr_[i].id; - if (LibUtils.shouldVerifyBlocks(config, id, true) && !state.slotB.provingPaused) { - LibVerifying.verifyBlocks(state, config, this, config.maxBlocksToVerify); - } + metaArr_[i] = _proposeBlock(_paramsArr[i], _txListArr[i], config); } - - if (metaArr_[0].id < config.ontakeForkHeight) revert L1_FORK_ERROR(); } /// @inheritdoc ITaikoL1 @@ -316,6 +301,22 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { }); } + function _proposeBlock( + bytes calldata _params, + bytes calldata _txList, + TaikoData.Config memory _config + ) + internal + returns (TaikoData.BlockMetadataV2 memory meta_) + { + (, meta_,) = LibProposing.proposeBlock(state, _config, this, _params, _txList); + if (meta_.id < _config.ontakeForkHeight) revert L1_FORK_ERROR(); + + if (LibUtils.shouldVerifyBlocks(_config, meta_.id, true) && !state.slotB.provingPaused) { + LibVerifying.verifyBlocks(state, _config, this, _config.maxBlocksToVerify); + } + } + /// @dev chain_pauser is supposed to be a cold wallet. function _authorizePause( address, From f2edb6e9c8a0b42323059f28f60003e25f74eb23 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 30 Jul 2024 09:57:56 +0800 Subject: [PATCH 6/6] Update TaikoL1.sol --- packages/protocol/contracts/L1/TaikoL1.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 2afe70fdad7..a4a03717b2e 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -107,7 +107,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { whenNotPaused nonReentrant emitEventForClient - returns (TaikoData.BlockMetadataV2 memory meta_) + returns (TaikoData.BlockMetadataV2 memory) { return _proposeBlock(_params, _txList, getConfig()); }