From fee567d147dd2ba37cb26e18c5f84b34bb1ec19a Mon Sep 17 00:00:00 2001 From: Pedro Novais <1478752+jpnovais@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:34:25 +0100 Subject: [PATCH 1/3] smart-contract: small tweak on validation and consistent naming on params --- contracts/contracts/LineaRollup.sol | 23 +++++++++++-------- .../contracts/interfaces/l1/ILineaRollup.sol | 8 +++---- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/contracts/contracts/LineaRollup.sol b/contracts/contracts/LineaRollup.sol index 4fdaae747..8da77a346 100644 --- a/contracts/contracts/LineaRollup.sol +++ b/contracts/contracts/LineaRollup.sol @@ -233,6 +233,13 @@ contract LineaRollup is uint256 blobFinalBlockNumber = shnarfFinalBlockNumbers[computedShnarf]; + if (_blobSubmissionData[0].submissionData.firstBlockInData <= lastFinalizedBlockNumber) { + revert FirstBlockLessThanOrEqualToLastFinalizedBlock( + _blobSubmissionData[0].submissionData.firstBlockInData, + lastFinalizedBlockNumber + ); + } + for (uint256 i; i < blobSubmissionLength; i++) { blobSubmissionData = _blobSubmissionData[i]; @@ -242,7 +249,7 @@ contract LineaRollup is revert EmptyBlobDataAtIndex(i); } - _validateSubmissionData(blobSubmissionData.submissionData, blobFinalBlockNumber, lastFinalizedBlockNumber); + _validateSubmissionData(blobSubmissionData.submissionData, blobFinalBlockNumber); currentDataEvaluationPoint = Utils._efficientKeccak(blobSubmissionData.submissionData.snarkHash, currentDataHash); @@ -315,7 +322,11 @@ contract LineaRollup is bytes32 currentDataHash = keccak256(_submissionData.compressedData); - _validateSubmissionData(submissionData, shnarfFinalBlockNumbers[_parentShnarf], currentL2BlockNumber); + if (_submissionData.firstBlockInData <= currentL2BlockNumber) { + revert FirstBlockLessThanOrEqualToLastFinalizedBlock(_submissionData.firstBlockInData, currentL2BlockNumber); + } + + _validateSubmissionData(submissionData, shnarfFinalBlockNumbers[_parentShnarf]); bytes32 dataEvaluationPoint = Utils._efficientKeccak(_submissionData.snarkHash, currentDataHash); bytes32 computedShnarf = _computeShnarf( @@ -349,12 +360,10 @@ contract LineaRollup is * @notice Internal function to validate submission data. * @param _submissionData The supporting data for compressed data submission excluding compressed data. * @param _parentFinalBlockNumber The final block number for the parent blob. - * @param _lastFinalizedBlockNumber The last finalized block number. */ function _validateSubmissionData( SupportingSubmissionDataV2 memory _submissionData, - uint256 _parentFinalBlockNumber, - uint256 _lastFinalizedBlockNumber + uint256 _parentFinalBlockNumber ) internal pure { if (_submissionData.finalStateRootHash == EMPTY_HASH) { revert FinalBlockStateEqualsZeroHash(); @@ -371,10 +380,6 @@ contract LineaRollup is } } - if (_submissionData.firstBlockInData <= _lastFinalizedBlockNumber) { - revert FirstBlockLessThanOrEqualToLastFinalizedBlock(_submissionData.firstBlockInData, _lastFinalizedBlockNumber); - } - if (_submissionData.firstBlockInData > _submissionData.finalBlockInData) { revert FirstBlockGreaterThanFinalBlock(_submissionData.firstBlockInData, _submissionData.finalBlockInData); } diff --git a/contracts/contracts/interfaces/l1/ILineaRollup.sol b/contracts/contracts/interfaces/l1/ILineaRollup.sol index 2d434eb96..d61603c0f 100644 --- a/contracts/contracts/interfaces/l1/ILineaRollup.sol +++ b/contracts/contracts/interfaces/l1/ILineaRollup.sol @@ -172,15 +172,15 @@ interface ILineaRollup { /** * @notice Emitted when compressed data is being submitted and verified succesfully on L1. * @dev The block range is indexed and parent shnarf included for state reconstruction simplicity. - * @param startBlock The indexed L2 block number indicating which block the data starts from. - * @param endBlock The indexed L2 block number indicating which block the data ends on. + * @param startBlockNumber The indexed L2 block number indicating which block the data starts from. + * @param endBlockNumber The indexed L2 block number indicating which block the data ends on. * @param parentShnarf The parent shnarf for the data being submitted. * @param shnarf The indexed shnarf for the data being submitted. * @param finalStateRootHash The L2 state root hash that the current blob submission ends on. NB: The last blob in the collection. */ event DataSubmittedV3( - uint256 indexed startBlock, - uint256 indexed endBlock, + uint256 indexed startBlockNumber, + uint256 indexed endBlockNumber, bytes32 parentShnarf, bytes32 indexed shnarf, bytes32 finalStateRootHash From 7e33834de2d2a9ba8d8b7b641bc853dc5ad2f442 Mon Sep 17 00:00:00 2001 From: thedarkjester Date: Fri, 18 Oct 2024 09:09:40 +0100 Subject: [PATCH 2/3] use currentL2BlockNumber vs. memory --- contracts/contracts/LineaRollup.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/contracts/LineaRollup.sol b/contracts/contracts/LineaRollup.sol index 8da77a346..82d3818fa 100644 --- a/contracts/contracts/LineaRollup.sol +++ b/contracts/contracts/LineaRollup.sol @@ -224,7 +224,6 @@ contract LineaRollup is bytes32 currentDataEvaluationPoint; bytes32 currentDataHash; - uint256 lastFinalizedBlockNumber = currentL2BlockNumber; /// @dev Assigning in memory saves a lot of gas vs. calldata reading. BlobSubmissionData memory blobSubmissionData; @@ -233,10 +232,10 @@ contract LineaRollup is uint256 blobFinalBlockNumber = shnarfFinalBlockNumbers[computedShnarf]; - if (_blobSubmissionData[0].submissionData.firstBlockInData <= lastFinalizedBlockNumber) { + if (_blobSubmissionData[0].submissionData.firstBlockInData <= currentL2BlockNumber) { revert FirstBlockLessThanOrEqualToLastFinalizedBlock( _blobSubmissionData[0].submissionData.firstBlockInData, - lastFinalizedBlockNumber + currentL2BlockNumber ); } From c475447d25f9d9e79d8e959953a47243b95c2dc9 Mon Sep 17 00:00:00 2001 From: thedarkjester Date: Fri, 18 Oct 2024 09:19:11 +0100 Subject: [PATCH 3/3] cache blobFirstBlockNumber --- contracts/contracts/LineaRollup.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/contracts/LineaRollup.sol b/contracts/contracts/LineaRollup.sol index 82d3818fa..88d44ef8b 100644 --- a/contracts/contracts/LineaRollup.sol +++ b/contracts/contracts/LineaRollup.sol @@ -230,11 +230,12 @@ contract LineaRollup is bytes32 computedShnarf = _parentShnarf; + uint256 blobFirstBlockNumber = _blobSubmissionData[0].submissionData.firstBlockInData; uint256 blobFinalBlockNumber = shnarfFinalBlockNumbers[computedShnarf]; - if (_blobSubmissionData[0].submissionData.firstBlockInData <= currentL2BlockNumber) { + if (blobFirstBlockNumber <= currentL2BlockNumber) { revert FirstBlockLessThanOrEqualToLastFinalizedBlock( - _blobSubmissionData[0].submissionData.firstBlockInData, + blobFirstBlockNumber, currentL2BlockNumber ); } @@ -288,7 +289,7 @@ contract LineaRollup is shnarfFinalBlockNumbers[computedShnarf] = blobFinalBlockNumber; emit DataSubmittedV3( - _blobSubmissionData[0].submissionData.firstBlockInData, + blobFirstBlockNumber, blobFinalBlockNumber, _parentShnarf, computedShnarf,