Skip to content

Commit

Permalink
feat(protocol): support backward-compatible batch-proof verification (#…
Browse files Browse the repository at this point in the history
…17968)

Co-authored-by: dantaik <[email protected]>
Co-authored-by: D <[email protected]>
  • Loading branch information
3 people authored Aug 29, 2024
1 parent 5707a08 commit c476aab
Show file tree
Hide file tree
Showing 43 changed files with 593 additions and 303 deletions.
76 changes: 76 additions & 0 deletions packages/protocol/contract_layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,25 @@
| __gap | uint256[50] | 251 | 0 | 1600 | contracts/verifiers/compose/ZkAnyVerifier.sol:ZkAnyVerifier |
| __gap | uint256[50] | 301 | 0 | 1600 | contracts/verifiers/compose/ZkAnyVerifier.sol:ZkAnyVerifier |

## ZkAndTeeVerifier
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|-------------|------|--------|-------|-------------------------------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| _initializing | bool | 0 | 1 | 1 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[50] | 1 | 0 | 1600 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| _owner | address | 51 | 0 | 20 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[49] | 52 | 0 | 1568 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| _pendingOwner | address | 101 | 0 | 20 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[49] | 102 | 0 | 1568 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| addressManager | address | 151 | 0 | 20 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[49] | 152 | 0 | 1568 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __reentry | uint8 | 201 | 0 | 1 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __paused | uint8 | 201 | 1 | 1 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[49] | 202 | 0 | 1568 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[50] | 251 | 0 | 1600 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |
| __gap | uint256[50] | 301 | 0 | 1600 | contracts/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier |

## HeklaTaikoL1
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|------------------------|------|--------|-------|-----------------------------------------------|
Expand Down Expand Up @@ -834,6 +853,63 @@
| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | contracts/mainnet/rollup/verifiers/MainnetSgxVerifier.sol:MainnetSgxVerifier |
| __gap | uint256[47] | 254 | 0 | 1504 | contracts/mainnet/rollup/verifiers/MainnetSgxVerifier.sol:MainnetSgxVerifier |

## MainnetTeeAnyVerifier
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|-------------|------|--------|-------|------------------------------------------------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| _initializing | bool | 0 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[50] | 1 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| _owner | address | 51 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[49] | 52 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| _pendingOwner | address | 101 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[49] | 102 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| addressManager | address | 151 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[49] | 152 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __reentry | uint8 | 201 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __paused | uint8 | 201 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[49] | 202 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[50] | 251 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |
| __gap | uint256[50] | 301 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier |

## MainnetZkAnyVerifier
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|-------------|------|--------|-------|----------------------------------------------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| _initializing | bool | 0 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[50] | 1 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| _owner | address | 51 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[49] | 52 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| _pendingOwner | address | 101 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[49] | 102 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| addressManager | address | 151 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[49] | 152 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __reentry | uint8 | 201 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __paused | uint8 | 201 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[49] | 202 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[50] | 251 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |
| __gap | uint256[50] | 301 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier |

## MainnetZkAndTeeVerifier
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|-------------|------|--------|-------|----------------------------------------------------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| _initializing | bool | 0 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[50] | 1 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| _owner | address | 51 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[49] | 52 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| _pendingOwner | address | 101 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[49] | 102 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| addressManager | address | 151 | 0 | 20 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[49] | 152 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __reentry | uint8 | 201 | 0 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __paused | uint8 | 201 | 1 | 1 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[49] | 202 | 0 | 1568 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[50] | 251 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |
| __gap | uint256[50] | 301 | 0 | 1600 | contracts/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier |

## MainnetSharedAddressManager
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------------------|
Expand Down
13 changes: 10 additions & 3 deletions packages/protocol/contracts/L1/ITaikoL1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,18 @@ interface ITaikoL1 {
/// TaikoData.TierProof) tuple.
function proveBlock(uint64 _blockId, bytes calldata _input) external;

/// @notice Proves or contests multiple block transitions.
/// @notice Proves or contests multiple block transitions (version 2)
/// @param _blockIds The indices of the blocks to prove.
/// @param _inputArr An list of abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition,
/// @param _inputs An list of abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition,
/// TaikoData.TierProof) tuples.
function proveBlocks(uint64[] calldata _blockIds, bytes[] calldata _inputArr) external;
/// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated
/// proof for the given blocks.
function proveBlocks(
uint64[] calldata _blockIds,
bytes[] calldata _inputs,
bytes calldata _batchProof
)
external;

/// @notice Verifies up to a certain number of blocks.
/// @param _maxBlocksToVerify Max number of blocks to verify.
Expand Down
2 changes: 1 addition & 1 deletion packages/protocol/contracts/L1/TaikoData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ pragma solidity 0.8.24;
/// protocol.
/// @custom:security-contact [email protected]
library TaikoData {
/// @dev Struct that represneds L2 basefee configurations
/// @dev Struct that represents L2 basefee configurations
struct BaseFeeConfig {
uint8 adjustmentQuotient;
uint8 sharingPctg;
Expand Down
75 changes: 14 additions & 61 deletions packages/protocol/contracts/L1/TaikoL1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,9 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents {
returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_)
{
TaikoData.Config memory config = getConfig();

(meta_,, deposits_) = LibProposing.proposeBlock(state, config, this, _params, _txList);
(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);
}
deposits_ = new TaikoData.EthDeposit[](0);
}

function proposeBlockV2(
Expand All @@ -96,9 +92,11 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents {
whenNotPaused
nonReentrant
emitEventForClient
returns (TaikoData.BlockMetadataV2 memory)
returns (TaikoData.BlockMetadataV2 memory meta_)
{
return _proposeBlock(_params, _txList, getConfig());
TaikoData.Config memory config = getConfig();
(, meta_) = LibProposing.proposeBlock(state, config, this, _params, _txList);
if (meta_.id < config.ontakeForkHeight) revert L1_FORK_ERROR();
}

/// @inheritdoc ITaikoL1
Expand All @@ -113,15 +111,10 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents {
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] = _proposeBlock(_paramsArr[i], _txListArr[i], config);
(, metaArr_) = LibProposing.proposeBlocks(state, config, this, _paramsArr, _txListArr);
for (uint256 i; i < metaArr_.length; ++i) {
if (metaArr_[i].id < config.ontakeForkHeight) revert L1_FORK_ERROR();
}
}

Expand All @@ -136,36 +129,26 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents {
nonReentrant
emitEventForClient
{
TaikoData.Config memory config = getConfig();
_proveBlock(_blockId, _input, config);
LibProving.proveBlock(state, getConfig(), this, _blockId, _input);
}

/// @inheritdoc ITaikoL1
function proveBlocks(
uint64[] calldata _blockIds,
bytes[] calldata _inputArr
bytes[] calldata _inputs,
bytes calldata _batchProof
)
external
whenNotPaused
whenProvingNotPaused
nonReentrant
emitEventForClient
{
if (_blockIds.length == 0 || _blockIds.length != _inputArr.length) {
revert L1_INVALID_PARAMS();
}

TaikoData.Config memory config = getConfig();

for (uint256 i; i < _blockIds.length; ++i) {
_proveBlock(_blockIds[i], _inputArr[i], config);
}
LibProving.proveBlocks(state, getConfig(), this, _blockIds, _inputs, _batchProof);
}

/// @inheritdoc ITaikoL1
function verifyBlocks(
uint64 _maxBlocksToVerify
)
function verifyBlocks(uint64 _maxBlocksToVerify)
external
whenNotPaused
whenProvingNotPaused
Expand Down Expand Up @@ -315,36 +298,6 @@ 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);
}
}

function _proveBlock(
uint64 _blockId,
bytes calldata _input,
TaikoData.Config memory _config
)
internal
{
LibProving.proveBlock(state, _config, this, _blockId, _input);

if (LibUtils.shouldVerifyBlocks(_config, _blockId, false)) {
LibVerifying.verifyBlocks(state, _config, this, _config.maxBlocksToVerify);
}
}

/// @dev chain_pauser is supposed to be a cold wallet.
function _authorizePause(
address,
Expand Down
33 changes: 21 additions & 12 deletions packages/protocol/contracts/L1/libs/LibData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
pragma solidity 0.8.24;

import "../TaikoData.sol";
import "../../verifiers/IVerifier.sol";

/// @title LibData
/// @notice A library that offers helper functions.
Expand All @@ -11,9 +12,7 @@ library LibData {
bytes32 internal constant EMPTY_ETH_DEPOSIT_HASH =
0x569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd;

function blockParamsV1ToV2(
TaikoData.BlockParams memory _v1
)
function blockParamsV1ToV2(TaikoData.BlockParams memory _v1)
internal
pure
returns (TaikoData.BlockParamsV2 memory)
Expand All @@ -29,9 +28,7 @@ library LibData {
});
}

function blockMetadataV2toV1(
TaikoData.BlockMetadataV2 memory _v2
)
function blockMetadataV2toV1(TaikoData.BlockMetadataV2 memory _v2)
internal
pure
returns (TaikoData.BlockMetadata memory)
Expand All @@ -54,9 +51,7 @@ library LibData {
});
}

function blockMetadataV1toV2(
TaikoData.BlockMetadata memory _v1
)
function blockMetadataV1toV2(TaikoData.BlockMetadata memory _v1)
internal
pure
returns (TaikoData.BlockMetadataV2 memory)
Expand Down Expand Up @@ -85,9 +80,7 @@ library LibData {
});
}

function blockV2toV1(
TaikoData.BlockV2 memory _v2
)
function blockV2toV1(TaikoData.BlockV2 memory _v2)
internal
pure
returns (TaikoData.Block memory)
Expand All @@ -103,4 +96,20 @@ library LibData {
verifiedTransitionId: _v2.verifiedTransitionId
});
}

function verifierContextV2toV1(IVerifier.ContextV2 memory _v2)
internal
pure
returns (IVerifier.Context memory)
{
return IVerifier.Context({
metaHash: _v2.metaHash,
blobHash: _v2.blobHash,
prover: _v2.prover,
blockId: _v2.blockId,
isContesting: _v2.isContesting,
blobUsed: _v2.blobUsed,
msgSender: _v2.msgSender
});
}
}
Loading

0 comments on commit c476aab

Please sign in to comment.