Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: remove total logs len from pre tail kernels + add to L1 #6466

Merged
merged 7 commits into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,15 @@ const size_t PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH =
MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL + MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL + 1 +
(L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2 +
(NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_CALL) + (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_CALL) +
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + 2 + HEADER_LENGTH + TX_CONTEXT_LENGTH;
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + HEADER_LENGTH + TX_CONTEXT_LENGTH;
const size_t PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH =
CALL_CONTEXT_LENGTH + 2 + (READ_REQUEST_LENGTH * MAX_NULLIFIER_READ_REQUESTS_PER_CALL) +
(READ_REQUEST_LENGTH * MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL) +
(CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH * MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL) +
(CONTRACT_STORAGE_READ_LENGTH * MAX_PUBLIC_DATA_READS_PER_CALL) + MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL +
(NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_CALL) + (NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_CALL) +
(L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2 + (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) +
1 + HEADER_LENGTH + GLOBAL_VARIABLES_LENGTH + AZTEC_ADDRESS_LENGTH + /* revert_code */ 1 + 2 * GAS_LENGTH +
HEADER_LENGTH + GLOBAL_VARIABLES_LENGTH + AZTEC_ADDRESS_LENGTH + /* revert_code */ 1 + 2 * GAS_LENGTH +
/* transaction_fee */ 1;
const size_t PRIVATE_CALL_STACK_ITEM_LENGTH =
AZTEC_ADDRESS_LENGTH + FUNCTION_DATA_LENGTH + PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH;
Expand All @@ -149,15 +149,15 @@ const size_t PRIVATE_ACCUMULATED_DATA_LENGTH =
(SCOPED_NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_TX) + (SCOPED_NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_TX) +
(MAX_NEW_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH) +
(NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX) + (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_TX) +
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX) + 2 + (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX) +
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX) + (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX) +
(CALL_REQUEST_LENGTH * MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX);
const size_t PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH =
1 + VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH +
CALL_REQUEST_LENGTH + AZTEC_ADDRESS_LENGTH;
const size_t PUBLIC_ACCUMULATED_DATA_LENGTH =
(MAX_NEW_NOTE_HASHES_PER_TX * NOTE_HASH_LENGTH) + (MAX_NEW_NULLIFIERS_PER_TX * NULLIFIER_LENGTH) +
(MAX_NEW_L2_TO_L1_MSGS_PER_TX * 1) + (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX) +
(MAX_ENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH) + (MAX_UNENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH) + 2 +
(MAX_ENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH) + (MAX_UNENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH) +
(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH) +
(MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX * CALL_REQUEST_LENGTH) + GAS_LENGTH;
const size_t PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH =
Expand Down
8 changes: 4 additions & 4 deletions l1-contracts/src/core/libraries/ConstantsGen.sol
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ library Constants {
+ (L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2
+ (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_CALL)
+ (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_CALL)
+ (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + 2 + HEADER_LENGTH + TX_CONTEXT_LENGTH;
+ (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + HEADER_LENGTH + TX_CONTEXT_LENGTH;
uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = CALL_CONTEXT_LENGTH + 2
+ (READ_REQUEST_LENGTH * MAX_NULLIFIER_READ_REQUESTS_PER_CALL)
+ (READ_REQUEST_LENGTH * MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL)
Expand All @@ -157,7 +157,7 @@ library Constants {
+ MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL + (NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_CALL)
+ (NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_CALL)
+ (L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2
+ (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + 1 + HEADER_LENGTH + GLOBAL_VARIABLES_LENGTH
+ (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + HEADER_LENGTH + GLOBAL_VARIABLES_LENGTH
+ AZTEC_ADDRESS_LENGTH /* revert_code */ + 1 + 2 * GAS_LENGTH /* transaction_fee */ + 1;
uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH =
AZTEC_ADDRESS_LENGTH + FUNCTION_DATA_LENGTH + PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH;
Expand Down Expand Up @@ -186,7 +186,7 @@ library Constants {
+ (MAX_NEW_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
+ (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX)
+ (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_TX) + (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX)
+ 2 + (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX)
+ (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX)
+ (CALL_REQUEST_LENGTH * MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX);
uint256 internal constant PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1
+ VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH
Expand All @@ -196,7 +196,7 @@ library Constants {
) + (MAX_NEW_NULLIFIERS_PER_TX * NULLIFIER_LENGTH) + (MAX_NEW_L2_TO_L1_MSGS_PER_TX * 1)
+ (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX)
+ (MAX_ENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH) + (MAX_UNENCRYPTED_LOGS_PER_TX * LOG_HASH_LENGTH)
+ 2 + (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH)
+ (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH)
+ (MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX * CALL_REQUEST_LENGTH) + GAS_LENGTH;
uint256 internal constant PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = VALIDATION_REQUESTS_LENGTH
+ PUBLIC_ACCUMULATED_DATA_LENGTH + PUBLIC_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH
Expand Down
3 changes: 3 additions & 0 deletions l1-contracts/src/core/libraries/Errors.sol
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ library Errors {
error Registry__RollupNotRegistered(address rollup); // 0xa1fee4cf
error Registry__RollupAlreadyRegistered(address rollup); // 0x3c34eabf

//TxsDecoder
error TxsDecoder__InvalidLogsLength(uint256 expected, uint256 actual); // 0x829ca981

// HeaderLib
error HeaderLib__InvalidHeaderSize(uint256 expected, uint256 actual); // 0xf3ccb247

Expand Down
67 changes: 56 additions & 11 deletions l1-contracts/src/core/libraries/decoders/TxsDecoder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
pragma solidity >=0.8.18;

// Libraries
import {Errors} from "../Errors.sol";
import {Constants} from "../ConstantsGen.sol";
import {Hash} from "../Hash.sol";

Expand Down Expand Up @@ -53,6 +54,8 @@ library TxsDecoder {
uint256 nullifier;
uint256 l2ToL1Msgs;
uint256 publicData;
uint256 encryptedLogsLength;
uint256 unencryptedLogsLength;
}

struct Counts {
Expand All @@ -66,6 +69,9 @@ library TxsDecoder {
struct ConsumablesVars {
bytes32[] baseLeaves;
bytes baseLeaf;
uint256 kernelNoteEncryptedLogsLength;
uint256 kernelEncryptedLogsLength;
uint256 kernelUnencryptedLogsLength;
bytes32 noteEncryptedLogsHash;
bytes32 encryptedLogsHash;
bytes32 unencryptedLogsHash;
Expand Down Expand Up @@ -148,9 +154,38 @@ library TxsDecoder {
* Compute encrypted and unencrypted logs hashes corresponding to the current leaf.
* Note: will advance offsets by the number of bytes processed.
*/
(vars.noteEncryptedLogsHash, offset) = computeKernelLogsHash(offset, _body, true);
(vars.encryptedLogsHash, offset) = computeKernelLogsHash(offset, _body, false);
(vars.unencryptedLogsHash, offset) = computeKernelLogsHash(offset, _body, false);
offsets.encryptedLogsLength = offset;
offset += 0x20;
offsets.unencryptedLogsLength = offset;
offset += 0x20;

(vars.noteEncryptedLogsHash, offset, vars.kernelNoteEncryptedLogsLength) =
computeKernelLogsHash(offset, _body, true);
(vars.encryptedLogsHash, offset, vars.kernelEncryptedLogsLength) =
computeKernelLogsHash(offset, _body, false);
(vars.unencryptedLogsHash, offset, vars.kernelUnencryptedLogsLength) =
computeKernelLogsHash(offset, _body, false);

// We throw to ensure that the byte len we charge for DA gas in the kernels matches the actual chargable log byte len
// Without this check, the user may provide the kernels with a lower log len than reality
if (
uint256(bytes32(slice(_body, offsets.encryptedLogsLength, 0x20)))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not having a separate length for note logs or combine all 3 together?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to avoid having a new variable to track in rollup circuits/txs! I can combine all 3 if there's nothing keeping us from separating enc/unc lengths?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't think of any reason that will require 3 lengths. But let's have a length for each type of log to begin with. It's easier to read. And we can probably refactor some repeated code and treat them as the same type { hash, length }.
Don't have to change it now if you want to merge this one today :)

!= vars.kernelNoteEncryptedLogsLength + vars.kernelEncryptedLogsLength
) {
revert Errors.TxsDecoder__InvalidLogsLength(
uint256(bytes32(slice(_body, offsets.encryptedLogsLength, 0x20))),
vars.kernelNoteEncryptedLogsLength + vars.kernelEncryptedLogsLength
);
}
if (
uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20)))
!= vars.kernelUnencryptedLogsLength
) {
revert Errors.TxsDecoder__InvalidLogsLength(
uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20))),
vars.kernelUnencryptedLogsLength
);
}

// Insertions are split into multiple `bytes.concat` to work around stack too deep.
vars.baseLeaf = bytes.concat(
Expand Down Expand Up @@ -185,6 +220,10 @@ library TxsDecoder {
Constants.PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP
)
),
bytes.concat(
slice(_body, offsets.encryptedLogsLength, 0x20),
slice(_body, offsets.unencryptedLogsLength, 0x20)
),
bytes.concat(vars.noteEncryptedLogsHash, vars.encryptedLogsHash, vars.unencryptedLogsHash)
);

Expand All @@ -194,7 +233,7 @@ library TxsDecoder {
// We pad base leaves with hashes of empty tx effect.
for (uint256 i = numTxEffects; i < vars.baseLeaves.length; i++) {
// Value taken from tx_effect.test.ts "hash of empty tx effect matches snapshot" test case
vars.baseLeaves[i] = hex"00543e0a6642ffeb8039296861765a53407bba62bd1c97ca43374de950bbe0a7";
vars.baseLeaves[i] = hex"009f12fb98ebbf4e5deef4cf51ade63094a795b891880217958b226707c95f43";
}
}

Expand All @@ -207,13 +246,12 @@ library TxsDecoder {
* @param _body - The L2 block calldata.
* @return The hash of the logs and offset in a block after processing the logs.
* @dev We have logs preimages on the input and we need to perform the same hashing process as is done in the app
* circuit (hashing the logs) and in the kernel circuit (accumulating the logs hashes). In each iteration of
* kernel, the kernel computes a hash of the previous iteration's logs hash (the hash in the previous kernel's
* public inputs) and the current iteration private circuit public inputs logs hash.
* circuit (hashing the logs) and in the kernel circuit (accumulating the logs hashes). The tail kernel
* circuit flat hashes all the app log hashes.
*
* E.g. for resulting logs hash of a kernel with 3 iterations would be computed as:
*
* kernelPublicInputsLogsHash = sha256(sha256(sha256(I1_LOGS), sha256(I2_LOGS)), sha256(I3_LOGS))
* kernelPublicInputsLogsHash = sha256((sha256(I1_LOGS), sha256(I2_LOGS)), sha256(I3_LOGS))
*
* where I1_LOGS, I2_LOGS and I3_LOGS are logs emitted in the first, second and third function call.
*
Expand All @@ -229,17 +267,22 @@ library TxsDecoder {
* I1_LOGS_LEN (i) is the length of the logs in the first iteration.
* I1_LOGS are all the logs emitted in the first iteration.
* I2_LOGS_LEN (j) ...
* @dev The circuit outputs a total logs len based on the byte length that the user pays DA gas for.
* In terms of the encoding above, this is the raw log length (i, j, or k) + 4 for each log.
* For the example above, kernelLogsLength = (i + 4) + (j + 4) + (k + 4). Since we already track
* the total remainingLogsLength, we just remove the bytes holding function logs length.
*
* @dev Link to a relevant discussion:
* https://discourse.aztec.network/t/proposal-forcing-the-sequencer-to-actually-submit-data-to-l1/426/9
*/
function computeKernelLogsHash(uint256 _offsetInBlock, bytes calldata _body, bool noteLogs)
internal
pure
returns (bytes32, uint256)
returns (bytes32, uint256, uint256)
{
uint256 offset = _offsetInBlock;
uint256 remainingLogsLength = read4(_body, offset);
uint256 kernelLogsLength = remainingLogsLength;
offset += 0x4;

bytes memory flattenedLogHashes; // The hash input
Expand All @@ -253,6 +296,8 @@ library TxsDecoder {
// Decrease remaining logs length by this privateCircuitPublicInputsLogs's length (len(I?_LOGS)) and 4 bytes for I?_LOGS_LEN
remainingLogsLength -= (privateCircuitPublicInputLogsLength + 0x4);

kernelLogsLength -= 0x4;

while (privateCircuitPublicInputLogsLength > 0) {
uint256 singleCallLogsLength = read4(_body, offset);
offset += 0x4;
Expand All @@ -268,7 +313,7 @@ library TxsDecoder {

// Not having a 0 value hash for empty logs causes issues with empty txs used for padding.
if (flattenedLogHashes.length == 0) {
return (0, offset);
return (0, offset, 0);
}

// padded to MAX_LOGS * 32 bytes
Expand All @@ -284,7 +329,7 @@ library TxsDecoder {

bytes32 kernelPublicInputsLogsHash = Hash.sha256ToField(flattenedLogHashes);

return (kernelPublicInputsLogsHash, offset);
return (kernelPublicInputsLogsHash, offset, kernelLogsLength);
}

/**
Expand Down
20 changes: 16 additions & 4 deletions l1-contracts/test/decoders/Decoders.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,11 @@ contract DecodersTest is DecoderBase {
bytes memory iterationLogsLength = hex"00000000"; // 4 empty bytes indicating that length of this iteration's logs is 0
bytes memory encodedLogs = abi.encodePacked(kernelLogsLength, iterationLogsLength);

(bytes32 logsHash, uint256 bytesAdvanced) = txsHelper.computeKernelLogsHash(encodedLogs);
(bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) =
txsHelper.computeKernelLogsHash(encodedLogs);

assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes");
assertEq(logsLength, 0, "Incorrect logs length");
assertEq(logsHash, bytes32(0), "Incorrect logs hash");
}

Expand All @@ -190,7 +192,8 @@ contract DecodersTest is DecoderBase {
// Note: 00000004 is the length of 1 log within function logs
bytes memory encodedLogs =
abi.encodePacked(hex"0000000c00000008", hex"00000004", firstFunctionCallLogs);
(bytes32 logsHash, uint256 bytesAdvanced) = txsHelper.computeKernelLogsHash(encodedLogs);
(bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) =
txsHelper.computeKernelLogsHash(encodedLogs);

bytes32 privateCircuitPublicInputsLogsHashFirstCall = Hash.sha256ToField(firstFunctionCallLogs);

Expand All @@ -202,6 +205,8 @@ contract DecodersTest is DecoderBase {
);

assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes");
// We take 8 as the user does not pay for the gas of the overall len (hex"0000002400000008")
assertEq(logsLength, encodedLogs.length - 8, "Incorrect logs length");
assertEq(logsHash, referenceLogsHash, "Incorrect logs hash");
}

Expand All @@ -222,7 +227,8 @@ contract DecodersTest is DecoderBase {
hex"00000010",
secondFunctionCallLogs
);
(bytes32 logsHash, uint256 bytesAdvanced) = txsHelper.computeKernelLogsHash(encodedLogs);
(bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) =
txsHelper.computeKernelLogsHash(encodedLogs);

bytes32 referenceLogsHashFromIteration1 = Hash.sha256ToField(firstFunctionCallLogs);

Expand All @@ -238,6 +244,8 @@ contract DecodersTest is DecoderBase {
);

assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes");
// We take 12 as the user does not pay for the gas of the function logs len bytes (hex"00000014") or overall len (hex"0000002400000008")
assertEq(logsLength, encodedLogs.length - 12, "Incorrect logs length");
assertEq(logsHash, referenceLogsHashFromIteration2, "Incorrect logs hash");
}

Expand All @@ -263,7 +271,8 @@ contract DecodersTest is DecoderBase {
hex"00000010",
thirdFunctionCallLogs
);
(bytes32 logsHash, uint256 bytesAdvanced) = txsHelper.computeKernelLogsHash(encodedLogs);
(bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) =
txsHelper.computeKernelLogsHash(encodedLogs);

bytes32 referenceLogsHashFromIteration1 = Hash.sha256ToField(firstFunctionCallLogs);

Expand All @@ -281,6 +290,9 @@ contract DecodersTest is DecoderBase {
);

assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes");
// We take 16 as the user does not pay for the gas of the function logs len bytes (hex"00000014"),
// empty logs len bytes (hex"00000000") or overall len (hex"0000002400000008")
assertEq(logsLength, encodedLogs.length - 16, "Incorrect logs length");
assertEq(logsHash, referenceLogsHashFromIteration3, "Incorrect logs hash");
}

Expand Down
2 changes: 1 addition & 1 deletion l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ contract TxsDecoderHelper {
function computeKernelLogsHash(bytes calldata _kernelLogs)
external
pure
returns (bytes32, uint256)
returns (bytes32, uint256, uint256)
{
return TxsDecoder.computeKernelLogsHash(0, _kernelLogs, false);
}
Expand Down
Loading
Loading