Skip to content

Commit

Permalink
feat: Recursion in public kernels and rollup circuits (#6425)
Browse files Browse the repository at this point in the history
This PR introduces recursion throughout the server side protocol
circuits.

1. Public kernel circuits are now recursive.
2. Rollup circuits are now recursive.
3. Private kernel proofs are recursively verified in first server
protocol circuit.
4. Some cleanup of old `Aggregation Object` code.
5. An e2e test and benchmarks for full transaction proving.
Closes #5241 #5245 #5984 #5985 #5986 #5989 #5990 #5991

---------

Co-authored-by: Alex Gherghisan <[email protected]>
  • Loading branch information
PhilWindle and alexghr authored May 22, 2024
1 parent fd74b06 commit 86fb999
Show file tree
Hide file tree
Showing 166 changed files with 2,487 additions and 1,854 deletions.
2 changes: 0 additions & 2 deletions docs/docs/protocol-specs/rollup-circuits/base-rollup.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ class PublicDataRead {
}
class CombinedAccumulatedData {
aggregation_object: AggregationObject
read_requests: List~Fr~
pending_read_requests: List~Fr~
note_hashes: List~Fr~
Expand Down Expand Up @@ -218,7 +217,6 @@ BaseRollupInputs *-- ConstantRollupData : constants
class BaseOrMergeRollupPublicInputs {
type: Fr
height_in_block_tree: Fr
aggregation_object: AggregationObject
txs_hash: Fr[2]
out_hash: Fr[2]
constants: ConstantRollupData
Expand Down
4 changes: 0 additions & 4 deletions docs/docs/protocol-specs/rollup-circuits/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,6 @@ class PublicDataRead {
}
class CombinedAccumulatedData {
aggregation_object: AggregationObject
read_requests: List~Fr~
pending_read_requests: List~Fr~
note_hashes: List~Fr~
Expand Down Expand Up @@ -341,7 +340,6 @@ BaseRollupInputs *-- ConstantRollupData : constants
class BaseOrMergeRollupPublicInputs {
type: Fr
height_in_block_tree: Fr
aggregation_object: AggregationObject
txs_hash: Fr[2]
out_hash: Fr[2]
constants: ConstantRollupData
Expand Down Expand Up @@ -370,7 +368,6 @@ class BaseParityInputs {
}
class ParityPublicInputs {
aggregation_object: AggregationObject
sha_root: Fr[2]
converted_root: Fr
}
Expand Down Expand Up @@ -401,7 +398,6 @@ RootRollupInputs *-- ChildRollupData: right
RootRollupInputs *-- Header : parent
class RootRollupPublicInputs {
aggregation_object: AggregationObject
archive: Snapshot
header: Header
}
Expand Down
2 changes: 0 additions & 2 deletions docs/docs/protocol-specs/rollup-circuits/merge-rollup.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ ConstantRollupData *-- GlobalVariables : global_variables
class BaseOrMergeRollupPublicInputs {
type: Fr
height_in_block_tree: Fr
aggregation_object: AggregationObject
txs_hash: Fr[2]
out_hash: Fr[2]
constants: ConstantRollupData
Expand Down Expand Up @@ -89,7 +88,6 @@ def MergeRollupCircuit(
return BaseOrMergeRollupPublicInputs(
type=1,
height_in_block_tree=left.public_inputs.height_in_block_tree + 1,
aggregation_object=AggregationObject(left.proof, right.proof),
txs_hash=SHA256(left.public_inputs.txs_hash | right.public_inputs.txs_hash),
out_hash=SHA256(left.public_inputs.out_hash | right.public_inputs.out_hash),
start=left.public_inputs.start,
Expand Down
3 changes: 0 additions & 3 deletions docs/docs/protocol-specs/rollup-circuits/root-rollup.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ ConstantRollupData *-- GlobalVariables : global_variables
class BaseOrMergeRollupPublicInputs {
type: Fr
height_in_block_tree: Fr
aggregation_object: AggregationObject
txs_hash: Fr[2]
out_hash: Fr[2]
constants: ConstantRollupData
Expand All @@ -131,7 +130,6 @@ class BaseParityInputs {
}
class ParityPublicInputs {
aggregation_object: AggregationObject
sha_root: Fr[2]
converted_root: Fr
}
Expand Down Expand Up @@ -161,7 +159,6 @@ RootRollupInputs *-- ChildRollupData: right
RootRollupInputs *-- Header : parent
class RootRollupPublicInputs {
aggregation_object: AggregationObject
archive: Snapshot
header: Header
}
Expand Down
51 changes: 40 additions & 11 deletions l1-contracts/src/core/Rollup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {IAvailabilityOracle} from "./interfaces/IAvailabilityOracle.sol";
import {IInbox} from "./interfaces/messagebridge/IInbox.sol";
import {IOutbox} from "./interfaces/messagebridge/IOutbox.sol";
import {IRegistry} from "./interfaces/messagebridge/IRegistry.sol";
import {IVerifier} from "./interfaces/IVerifier.sol";
import {IERC20} from "@oz/token/ERC20/IERC20.sol";

// Libraries
Expand All @@ -28,7 +29,7 @@ import {Outbox} from "./messagebridge/Outbox.sol";
* not giving a damn about gas costs.
*/
contract Rollup is IRollup {
MockVerifier public immutable VERIFIER;
IVerifier public verifier;
IRegistry public immutable REGISTRY;
IAvailabilityOracle public immutable AVAILABILITY_ORACLE;
IInbox public immutable INBOX;
Expand All @@ -43,7 +44,7 @@ contract Rollup is IRollup {
uint256 public lastWarpedBlockTs;

constructor(IRegistry _registry, IAvailabilityOracle _availabilityOracle, IERC20 _gasToken) {
VERIFIER = new MockVerifier();
verifier = new MockVerifier();
REGISTRY = _registry;
AVAILABILITY_ORACLE = _availabilityOracle;
GAS_TOKEN = _gasToken;
Expand All @@ -52,16 +53,23 @@ contract Rollup is IRollup {
VERSION = 1;
}

function setVerifier(address _verifier) external override(IRollup) {
// TODO remove, only needed for testing
verifier = IVerifier(_verifier);
}

/**
* @notice Process an incoming L2 block and progress the state
* @param _header - The L2 block header
* @param _archive - A root of the archive tree after the L2 block is applied
* @param _proof - The proof of correct execution
*/
function process(bytes calldata _header, bytes32 _archive, bytes memory _proof)
external
override(IRollup)
{
function process(
bytes calldata _header,
bytes32 _archive,
bytes calldata _aggregationObject,
bytes calldata _proof
) external override(IRollup) {
// Decode and validate header
HeaderLib.Header memory header = HeaderLib.decode(_header);
HeaderLib.validate(header, VERSION, lastBlockTs, archive);
Expand All @@ -71,12 +79,33 @@ contract Rollup is IRollup {
revert Errors.Rollup__UnavailableTxs(header.contentCommitment.txsEffectsHash);
}

bytes32[] memory publicInputs = new bytes32[](1);
publicInputs[0] = _computePublicInputHash(_header, _archive);
bytes32[] memory publicInputs =
new bytes32[](2 + Constants.HEADER_LENGTH + Constants.AGGREGATION_OBJECT_LENGTH);
// the archive tree root
publicInputs[0] = _archive;
// this is the _next_ available leaf in the archive tree
// normally this should be equal to the block number (since leaves are 0-indexed and blocks 1-indexed)
// but in yarn-project/merkle-tree/src/new_tree.ts we prefill the tree so that block N is in leaf N
publicInputs[1] = bytes32(header.globalVariables.blockNumber + 1);

bytes32[] memory headerFields = HeaderLib.toFields(header);
for (uint256 i = 0; i < headerFields.length; i++) {
publicInputs[i + 2] = headerFields[i];
}

// the block proof is recursive, which means it comes with an aggregation object
// this snippet copies it into the public inputs needed for verification
// it also guards against empty _aggregationObject used with mocked proofs
uint256 aggregationLength = _aggregationObject.length / 32;
for (uint256 i = 0; i < Constants.AGGREGATION_OBJECT_LENGTH && i < aggregationLength; i++) {
bytes32 part;
assembly {
part := calldataload(add(_aggregationObject.offset, mul(i, 32)))
}
publicInputs[i + 2 + Constants.HEADER_LENGTH] = part;
}

// @todo @benesjan We will need `nextAvailableLeafIndex` of archive to verify the proof. This value is equal to
// current block number which is stored in the header (header.globalVariables.blockNumber).
if (!VERIFIER.verify(_proof, publicInputs)) {
if (!verifier.verify(_proof, publicInputs)) {
revert Errors.Rollup__InvalidProof();
}

Expand Down
9 changes: 8 additions & 1 deletion l1-contracts/src/core/interfaces/IRollup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,12 @@ pragma solidity >=0.8.18;
interface IRollup {
event L2BlockProcessed(uint256 indexed blockNumber);

function process(bytes calldata _header, bytes32 _archive, bytes memory _proof) external;
function process(
bytes calldata _header,
bytes32 _archive,
bytes calldata _aggregationObject,
bytes memory _proof
) external;

function setVerifier(address _verifier) external;
}
1 change: 1 addition & 0 deletions l1-contracts/src/core/libraries/ConstantsGen.sol
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ library Constants {
AZTEC_ADDRESS_LENGTH + FUNCTION_DATA_LENGTH + PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH;
uint256 internal constant PUBLIC_CONTEXT_INPUTS_LENGTH =
CALL_CONTEXT_LENGTH + HEADER_LENGTH + GLOBAL_VARIABLES_LENGTH + GAS_LENGTH + 2;
uint256 internal constant AGGREGATION_OBJECT_LENGTH = 16;
uint256 internal constant SCOPED_READ_REQUEST_LEN = READ_REQUEST_LENGTH + 1;
uint256 internal constant PUBLIC_DATA_READ_LENGTH = 2;
uint256 internal constant VALIDATION_REQUESTS_LENGTH = ROLLUP_VALIDATION_REQUESTS_LENGTH
Expand Down
40 changes: 40 additions & 0 deletions l1-contracts/src/core/libraries/HeaderLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -197,4 +197,44 @@ library HeaderLib {

return header;
}

function toFields(Header memory _header) internal pure returns (bytes32[] memory) {
bytes32[] memory fields = new bytes32[](23);

// must match the order in the Header.getFields
fields[0] = _header.lastArchive.root;
fields[1] = bytes32(uint256(_header.lastArchive.nextAvailableLeafIndex));
fields[2] = bytes32(_header.contentCommitment.txTreeHeight);
fields[3] = _header.contentCommitment.txsEffectsHash;
fields[4] = _header.contentCommitment.inHash;
fields[5] = _header.contentCommitment.outHash;
fields[6] = _header.stateReference.l1ToL2MessageTree.root;
fields[7] = bytes32(uint256(_header.stateReference.l1ToL2MessageTree.nextAvailableLeafIndex));
fields[8] = _header.stateReference.partialStateReference.noteHashTree.root;
fields[9] = bytes32(
uint256(_header.stateReference.partialStateReference.noteHashTree.nextAvailableLeafIndex)
);
fields[10] = _header.stateReference.partialStateReference.nullifierTree.root;
fields[11] = bytes32(
uint256(_header.stateReference.partialStateReference.nullifierTree.nextAvailableLeafIndex)
);
fields[12] = _header.stateReference.partialStateReference.publicDataTree.root;
fields[13] = bytes32(
uint256(_header.stateReference.partialStateReference.publicDataTree.nextAvailableLeafIndex)
);
fields[14] = bytes32(_header.globalVariables.chainId);
fields[15] = bytes32(_header.globalVariables.version);
fields[16] = bytes32(_header.globalVariables.blockNumber);
fields[17] = bytes32(_header.globalVariables.timestamp);
fields[18] = bytes32(uint256(uint160(_header.globalVariables.coinbase)));
fields[19] = bytes32(_header.globalVariables.feeRecipient);
fields[20] = bytes32(_header.globalVariables.gasFees.feePerDaGas);
fields[21] = bytes32(_header.globalVariables.gasFees.feePerL2Gas);
fields[22] = bytes32(_header.totalFees);

// fail if the header structure has changed without updating this function
assert(fields.length == Constants.HEADER_LENGTH);

return fields;
}
}
2 changes: 1 addition & 1 deletion l1-contracts/src/mock/MockVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
pragma solidity >=0.8.18;

// Interfaces
import {IVerifier} from "./interfaces/IVerifier.sol";
import {IVerifier} from "../core/interfaces/IVerifier.sol";

/**
* @title Mock verifier
Expand Down
12 changes: 6 additions & 6 deletions l1-contracts/test/Rollup.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ contract RollupTest is DecoderBase {
availabilityOracle.publish(body);

vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidChainId.selector, 0x420, 31337));
rollup.process(header, archive, bytes(""));
rollup.process(header, archive, bytes(""), bytes(""));
}

function testRevertInvalidVersion() public {
Expand All @@ -101,7 +101,7 @@ contract RollupTest is DecoderBase {
availabilityOracle.publish(body);

vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidVersion.selector, 0x420, 1));
rollup.process(header, archive, bytes(""));
rollup.process(header, archive, bytes(""), bytes(""));
}

function testRevertTimestampInFuture() public {
Expand All @@ -118,7 +118,7 @@ contract RollupTest is DecoderBase {
availabilityOracle.publish(body);

vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__TimestampInFuture.selector));
rollup.process(header, archive, bytes(""));
rollup.process(header, archive, bytes(""), bytes(""));
}

function testRevertTimestampTooOld() public {
Expand All @@ -128,12 +128,12 @@ contract RollupTest is DecoderBase {
bytes memory body = data.body;

// Overwrite in the rollup contract
vm.store(address(rollup), bytes32(uint256(1)), bytes32(uint256(block.timestamp)));
vm.store(address(rollup), bytes32(uint256(2)), bytes32(uint256(block.timestamp)));

availabilityOracle.publish(body);

vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__TimestampTooOld.selector));
rollup.process(header, archive, bytes(""));
rollup.process(header, archive, bytes(""), bytes(""));
}

function _testBlock(string memory name) public {
Expand All @@ -153,7 +153,7 @@ contract RollupTest is DecoderBase {
uint256 toConsume = inbox.toConsume();

vm.record();
rollup.process(header, archive, bytes(""));
rollup.process(header, archive, bytes(""), bytes(""));

assertEq(inbox.toConsume(), toConsume + 1, "Message subtree not consumed");

Expand Down
10 changes: 5 additions & 5 deletions l1-contracts/test/fixtures/empty_block_0.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"l2ToL1Messages": []
},
"block": {
"archive": "0x00c76b04132325d0761761f93eb621b83bf17758b0906d90af1a70f00f245eed",
"archive": "0x0e6bf55468b3b0ae46e74c2b1ba5c23c086daa58a6416919223c4705af95a2d0",
"body": "0x00000000",
"txsEffectsHash": "0x002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef1",
"decodedHeader": {
Expand All @@ -23,8 +23,8 @@
"chainId": 31337,
"timestamp": 0,
"version": 1,
"coinbase": "0x4f961af4a21d095b3e1e2b2dcbd20fe87d85829e",
"feeRecipient": "0x05efb7db99defbcd31446a9e7a3f8324813ad25858b3d24cdbc8618975331f51",
"coinbase": "0x8a97a49b5435b0e2035f123a281dac63be8a95e4",
"feeRecipient": "0x1053a95aeeb3161f27999fa785f91f51d03aed4b513b0dc9321a111c35092f40",
"gasFees": {
"feePerDaGas": 0,
"feePerL2Gas": 0
Expand Down Expand Up @@ -55,8 +55,8 @@
}
}
},
"header": "0x05b0b6df52f1d47d0406318558052c89a174fbc9d615def82b3cc9ccc1937db8000000010000000000000000000000000000000000000000000000000000000000000001002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000800bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004f961af4a21d095b3e1e2b2dcbd20fe87d85829e05efb7db99defbcd31446a9e7a3f8324813ad25858b3d24cdbc8618975331f51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"publicInputsHash": "0x00d0453b6a869371c9078c6d519ffd57ebe2a9570da740bf817ace7ea6eceb28",
"header": "0x05b0b6df52f1d47d0406318558052c89a174fbc9d615def82b3cc9ccc1937db8000000010000000000000000000000000000000000000000000000000000000000000001002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000001016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000000800bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001000572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008a97a49b5435b0e2035f123a281dac63be8a95e41053a95aeeb3161f27999fa785f91f51d03aed4b513b0dc9321a111c35092f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"publicInputsHash": "0x008dd1cb8201dbbf886d61890f9b13d5cd6795c4d5d015f8bd2ae2b23c86e528",
"numTxs": 0
}
}
14 changes: 7 additions & 7 deletions l1-contracts/test/fixtures/empty_block_1.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"l2ToL1Messages": []
},
"block": {
"archive": "0x0970a2c16190f68f7f2c451bd948112c4915c37ec65921a302c80a3da8a623a4",
"archive": "0x05c8cf89d93cf6e31f4ffabf0213d4572da57e7742edd55733ed140deb4458c3",
"body": "0x00000000",
"txsEffectsHash": "0x002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef1",
"decodedHeader": {
Expand All @@ -21,18 +21,18 @@
"globalVariables": {
"blockNumber": 2,
"chainId": 31337,
"timestamp": 1716292563,
"timestamp": 1716376597,
"version": 1,
"coinbase": "0x4f961af4a21d095b3e1e2b2dcbd20fe87d85829e",
"feeRecipient": "0x05efb7db99defbcd31446a9e7a3f8324813ad25858b3d24cdbc8618975331f51",
"coinbase": "0x8a97a49b5435b0e2035f123a281dac63be8a95e4",
"feeRecipient": "0x1053a95aeeb3161f27999fa785f91f51d03aed4b513b0dc9321a111c35092f40",
"gasFees": {
"feePerDaGas": 0,
"feePerL2Gas": 0
}
},
"lastArchive": {
"nextAvailableLeafIndex": 2,
"root": "0x00c76b04132325d0761761f93eb621b83bf17758b0906d90af1a70f00f245eed"
"root": "0x0e6bf55468b3b0ae46e74c2b1ba5c23c086daa58a6416919223c4705af95a2d0"
},
"stateReference": {
"l1ToL2MessageTree": {
Expand All @@ -55,8 +55,8 @@
}
}
},
"header": "0x00c76b04132325d0761761f93eb621b83bf17758b0906d90af1a70f00f245eed000000020000000000000000000000000000000000000000000000000000000000000001002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000664c8bd34f961af4a21d095b3e1e2b2dcbd20fe87d85829e05efb7db99defbcd31446a9e7a3f8324813ad25858b3d24cdbc8618975331f51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"publicInputsHash": "0x0059db9ca714c965a0032673d3972c030cc63363d7a5638352f79e77f2e1569f",
"header": "0x0e6bf55468b3b0ae46e74c2b1ba5c23c086daa58a6416919223c4705af95a2d0000000020000000000000000000000000000000000000000000000000000000000000001002676dbd818b1ba16e11597cb5c07b06aa7771127b02a77d0c3a6039bb9fef100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000002016642d9ccd8346c403aa4c3fa451178b22534a27035cdaa6ec34ae53b29c50cb000001000bcfa3e9f1a8922ee92c6dc964d6595907c1804a86753774322b468f69d4f278000001800572c8db882674dd026b8877fbba1b700a4407da3ae9ce5fa43215a28163362b000000c00000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000664dd4158a97a49b5435b0e2035f123a281dac63be8a95e41053a95aeeb3161f27999fa785f91f51d03aed4b513b0dc9321a111c35092f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"publicInputsHash": "0x00f5a0b8bbc3a7c371e7b2e6f278ed0c43509849c16eea934bad6134b75241f1",
"numTxs": 0
}
}
10 changes: 5 additions & 5 deletions l1-contracts/test/fixtures/mixed_block_0.json

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions l1-contracts/test/fixtures/mixed_block_1.json

Large diffs are not rendered by default.

Loading

0 comments on commit 86fb999

Please sign in to comment.