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(protocol): support backward-compatible batch-proof verification #17968

Merged
merged 112 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from 95 commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
abc509f
refactor (#17951)
dantaik Aug 20, 2024
9893214
temp revert
dantaik Aug 20, 2024
7d46f8a
Merge branch 'main' into refactor_tiers
dantaik Aug 20, 2024
070b539
make LibRollupAddressCache backward compatible
dantaik Aug 21, 2024
8113502
rename
dantaik Aug 21, 2024
487540b
Revert "rename"
dantaik Aug 21, 2024
6cd4ce9
rename
dantaik Aug 21, 2024
8995911
AddressCache
dantaik Aug 21, 2024
55474f0
AddressCache
dantaik Aug 21, 2024
82b94ac
more
dantaik Aug 21, 2024
6c92b2e
forge fmt & update contract layout table
dantaik Aug 21, 2024
61f042a
restore some changes
dantaik Aug 22, 2024
e352489
Update DevnetTierProvider.sol
dantaik Aug 22, 2024
e979665
f
dantaik Aug 22, 2024
b1069ed
Update TierProviderV2.sol
dantaik Aug 22, 2024
278d604
Update HeklaTierProvider.sol
dantaik Aug 22, 2024
108a988
Update TierProviderV2.sol
dantaik Aug 22, 2024
ab46dfe
more
dantaik Aug 22, 2024
896318c
Update LibStrings.sol
dantaik Aug 22, 2024
3e7f123
Update LibStrings.sol
dantaik Aug 22, 2024
e5d4f07
more
dantaik Aug 22, 2024
1691c1e
Update AddressResolver.t.sol
dantaik Aug 22, 2024
4225407
Update TierProviderBase.sol
dantaik Aug 22, 2024
e5dd9a5
feat(protocol): add ComposeVerifier (#17961)
dantaik Aug 22, 2024
d916381
Update AddressCache.sol
dantaik Aug 22, 2024
5331c15
Update AddressCache.sol
dantaik Aug 22, 2024
87d4c03
Update ZkAnyVerifier.sol
dantaik Aug 22, 2024
5260425
Merge branch 'main' into refactor_tiers
dantaik Aug 22, 2024
873a3ee
Update ComposeVerifier.sol
dantaik Aug 22, 2024
0d2a158
Update packages/protocol/contracts/verifiers/compose/TeeAnyVerifier.sol
dantaik Aug 22, 2024
e1c55bf
Update TierProviderBase.sol
dantaik Aug 23, 2024
c2321d5
Update SgxVerifier.sol
dantaik Aug 23, 2024
0113687
Update TierProviderBase.sol
dantaik Aug 23, 2024
09f8121
Update TierProviderBase.sol
dantaik Aug 23, 2024
b6a5f3d
Update SgxVerifier.t.sol
dantaik Aug 23, 2024
583c48c
Update ITierProvider.sol
dantaik Aug 23, 2024
194410b
Update TaikoL1.sol
dantaik Aug 23, 2024
0a29e54
Update TaikoL1.sol
dantaik Aug 23, 2024
9cdd624
more
dantaik Aug 23, 2024
f0decc3
Update LibProposing.sol
dantaik Aug 23, 2024
5eeffcb
x
dantaik Aug 23, 2024
888d61a
more
dantaik Aug 23, 2024
657e5ef
x
dantaik Aug 23, 2024
ffb2ce5
more
dantaik Aug 23, 2024
8485a27
more
dantaik Aug 23, 2024
977bcc6
Merge branch 'main' into refactor_propose_prove_block
dantaik Aug 25, 2024
45b74e1
Merge branch 'refactor_tiers' into refactor_propose_prove_block
dantaik Aug 25, 2024
0c45d91
temp
dantaik Aug 25, 2024
874bf74
more
dantaik Aug 25, 2024
e12ad75
more
dantaik Aug 25, 2024
6b42956
more
dantaik Aug 25, 2024
5fe2fa0
Update LibProving.sol
dantaik Aug 25, 2024
40548f3
Update ComposeVerifeir.t.sol
dantaik Aug 25, 2024
ad32d39
Update LibProving.sol
dantaik Aug 25, 2024
31b2248
Update LibProving.sol
dantaik Aug 25, 2024
ee36e28
Update LibProving.sol
dantaik Aug 25, 2024
3f30832
Merge branch 'main' into refactor_tiers
dantaik Aug 25, 2024
0457258
Merge branch 'refactor_tiers' into refactor_propose_prove_block
dantaik Aug 25, 2024
b11ac06
Update SgxVerifier.sol
dantaik Aug 25, 2024
12cc4e9
Update SgxVerifier.sol
dantaik Aug 25, 2024
dcd7ce3
Update Risc0Verifier.sol
dantaik Aug 25, 2024
f206780
delete
dantaik Aug 25, 2024
fc1e6c2
Update Risc0Verifier.sol
dantaik Aug 25, 2024
9dfd5ed
Merge branch 'refactor_tiers' into refactor_propose_prove_block
dantaik Aug 25, 2024
e48ebf9
Update SgxVerifier.sol
dantaik Aug 25, 2024
e78005f
fix
dantaik Aug 26, 2024
951ed1f
Update LibProving.sol
dantaik Aug 26, 2024
d7c0268
fix
dantaik Aug 26, 2024
fcaf689
Revert "delete"
dantaik Aug 26, 2024
ae801f6
Merge branch 'main' into refactor_tiers
dantaik Aug 26, 2024
98554bd
Update ComposeVerifier.sol
dantaik Aug 26, 2024
6bc568c
fix
dantaik Aug 26, 2024
50c4609
fix
dantaik Aug 26, 2024
1fb232a
Update ComposeVerifier.sol
dantaik Aug 26, 2024
8d9b9ce
Update ComposeVerifier.sol
dantaik Aug 27, 2024
e572c8a
Revert "Update ComposeVerifier.sol"
dantaik Aug 27, 2024
7303da1
Merge branch 'main' into refactor_tiers
dantaik Aug 27, 2024
9f64da6
more
dantaik Aug 27, 2024
5827a48
more
dantaik Aug 27, 2024
270cffe
more
dantaik Aug 27, 2024
8938c20
forge fmt & update contract layout table
dantaik Aug 27, 2024
3bae22d
more
dantaik Aug 27, 2024
51336e7
Update ComposeVerifeir.t.sol
dantaik Aug 27, 2024
ad4a99f
Merge branch 'refactor_tiers' into refactor_propose_prove_block
dantaik Aug 27, 2024
822983b
Update ComposeVerifier.sol
dantaik Aug 27, 2024
98063b7
Update ComposeVerifier.sol
dantaik Aug 27, 2024
38bddc5
more
dantaik Aug 27, 2024
3c76b93
Update ComposeVerifeir.t.sol
dantaik Aug 27, 2024
0aef930
fix
dantaik Aug 27, 2024
f82de8a
Update LibProving.sol
dantaik Aug 27, 2024
699edd4
Merge branch 'main' into refactor_tiers
adaki2004 Aug 27, 2024
94564b6
Update packages/protocol/contracts/L1/tiers/ITierProvider.sol
dantaik Aug 28, 2024
18ff421
more
dantaik Aug 28, 2024
c6ce77d
Merge branch 'refactor_tiers' into refactor_propose_prove_block
dantaik Aug 28, 2024
70635e3
Merge branch 'main' into refactor_propose_prove_block
dantaik Aug 28, 2024
1c349f7
fix
dantaik Aug 28, 2024
aa1dbdc
more
dantaik Aug 28, 2024
90972ef
Update gen-layouts.sh
dantaik Aug 28, 2024
a88a8e8
forge fmt & update contract layout table
dantaik Aug 28, 2024
7813c4c
comment
dantaik Aug 28, 2024
cdb7b90
Merge branch 'main' into refactor_propose_prove_block
dantaik Aug 28, 2024
03a360d
Update MainnetZkAndTeeVerifier.sol
dantaik Aug 28, 2024
9744d28
comments
dantaik Aug 28, 2024
13652c4
fix
dantaik Aug 28, 2024
af4226f
Update TaikoData.sol
dantaik Aug 28, 2024
baf1ff7
more
dantaik Aug 28, 2024
e9ddc56
Update SgxVerifier.sol
dantaik Aug 28, 2024
43cf921
Update gen-layouts.sh
dantaik Aug 28, 2024
e4e8eca
forge fmt & update contract layout table
dantaik Aug 28, 2024
2761c07
Merge branch 'main' into refactor_propose_prove_block
dantaik Aug 29, 2024
596c7a2
forge fmt & update contract layout table
dantaik Aug 29, 2024
7e5f888
Merge branch 'main' into refactor_propose_prove_block
dantaik Aug 29, 2024
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
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
71 changes: 13 additions & 58 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,30 +129,22 @@ 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
Expand Down Expand Up @@ -315,36 +300,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
19 changes: 19 additions & 0 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 Down Expand Up @@ -103,4 +104,22 @@ 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
});
}
}
96 changes: 76 additions & 20 deletions packages/protocol/contracts/L1/libs/LibProposing.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "../../libs/LibNetwork.sol";
import "./LibBonds.sol";
import "./LibData.sol";
import "./LibUtils.sol";
import "./LibVerifying.sol";

/// @title LibProposing
/// @notice A library for handling block proposals in the Taiko protocol.
Expand Down Expand Up @@ -50,34 +51,91 @@ library LibProposing {
error L1_BLOB_NOT_AVAILABLE();
error L1_BLOB_NOT_FOUND();
error L1_INVALID_ANCHOR_BLOCK();
error L1_INVALID_PARAMS();
error L1_INVALID_PROPOSER();
error L1_INVALID_TIMESTAMP();
error L1_LIVENESS_BOND_NOT_RECEIVED();
error L1_TOO_MANY_BLOCKS();
error L1_UNEXPECTED_PARENT();

/// @dev Proposes a Taiko L2 block.
/// @param _state Current TaikoData.State.
/// @param _config Actual TaikoData.Config.
/// @param _resolver Address resolver interface.
/// @param _data Encoded data bytes containing the block params.
/// @notice Proposes multiple Taiko L2 blocks.
/// @param _state The current state of the Taiko protocol.
/// @param _config The configuration parameters for the Taiko protocol.
/// @param _resolver The address resolver interface.
/// @param _paramsArr An array of encoded data bytes containing the block parameters.
/// @param _txListArr An array of transaction list bytes (if not blob).
/// @return metaV1s_ An array of metadata objects for the proposed L2 blocks (version 1).
/// @return metas_ An array of metadata objects for the proposed L2 blocks (version 2).
function proposeBlocks(
TaikoData.State storage _state,
TaikoData.Config memory _config,
IAddressResolver _resolver,
bytes[] calldata _paramsArr,
bytes[] calldata _txListArr
)
public
returns (
TaikoData.BlockMetadata[] memory metaV1s_,
TaikoData.BlockMetadataV2[] memory metas_
)
{
if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) {
revert L1_INVALID_PARAMS();
}

metaV1s_ = new TaikoData.BlockMetadata[](_paramsArr.length);
metas_ = new TaikoData.BlockMetadataV2[](_paramsArr.length);

for (uint256 i; i < _paramsArr.length; ++i) {
(metaV1s_[i], metas_[i]) =
_proposeBlock(_state, _config, _resolver, _paramsArr[i], _txListArr[i]);
}

if (!_state.slotB.provingPaused) {
for (uint256 i; i < _paramsArr.length; ++i) {
if (LibUtils.shouldVerifyBlocks(_config, metas_[i].id, false)) {
LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify);
}
}
}
}

/// @notice Proposes a single Taiko L2 block.
/// @param _state The current state of the Taiko protocol.
/// @param _config The configuration parameters for the Taiko protocol.
/// @param _resolver The address resolver interface.
/// @param _params Encoded data bytes containing the block parameters.
/// @param _txList Transaction list bytes (if not blob).
/// @return metaV1_ The constructed block's metadata v1.
/// @return meta_ The constructed block's metadata v2.
/// @return deposits_ An empty ETH deposit array.
/// @return metaV1_ The metadata of the proposed block (version 1).
/// @return meta_ The metadata of the proposed block (version 2).
function proposeBlock(
TaikoData.State storage _state,
TaikoData.Config memory _config,
IAddressResolver _resolver,
bytes calldata _data,
bytes calldata _params,
bytes calldata _txList
)
public
returns (
TaikoData.BlockMetadata memory metaV1_,
TaikoData.BlockMetadataV2 memory meta_,
TaikoData.EthDeposit[] memory deposits_
)
returns (TaikoData.BlockMetadata memory metaV1_, TaikoData.BlockMetadataV2 memory meta_)
{
(metaV1_, meta_) = _proposeBlock(_state, _config, _resolver, _params, _txList);

if (!_state.slotB.provingPaused) {
if (LibUtils.shouldVerifyBlocks(_config, meta_.id, false)) {
LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify);
}
}
}

function _proposeBlock(
TaikoData.State storage _state,
TaikoData.Config memory _config,
IAddressResolver _resolver,
bytes calldata _params,
bytes calldata _txList
)
private
returns (TaikoData.BlockMetadata memory metaV1_, TaikoData.BlockMetadataV2 memory meta_)
{
// Checks proposer access.
Local memory local;
Expand All @@ -91,12 +149,12 @@ library LibProposing {
}

if (local.postFork) {
if (_data.length != 0) {
local.params = abi.decode(_data, (TaikoData.BlockParamsV2));
if (_params.length != 0) {
local.params = abi.decode(_params, (TaikoData.BlockParamsV2));
// otherwise use a default BlockParamsV2 with 0 values
}
} else {
TaikoData.BlockParams memory paramsV1 = abi.decode(_data, (TaikoData.BlockParams));
TaikoData.BlockParams memory paramsV1 = abi.decode(_params, (TaikoData.BlockParams));
local.params = LibData.blockParamsV1ToV2(paramsV1);
local.extraData = paramsV1.extraData;
}
Expand Down Expand Up @@ -244,8 +302,6 @@ library LibProposing {
address(block.coinbase).sendEtherAndVerify(msg.value);
}

deposits_ = new TaikoData.EthDeposit[](0);

if (local.postFork) {
emit BlockProposedV2(meta_.id, meta_);
} else {
Expand All @@ -254,7 +310,7 @@ library LibProposing {
assignedProver: msg.sender,
livenessBond: _config.livenessBond,
meta: metaV1_,
depositsProcessed: deposits_
depositsProcessed: new TaikoData.EthDeposit[](0)
});
}
}
Expand Down
Loading
Loading