From 1979639c0d5905e35e23519cb9a4c59d837f2076 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 17:39:30 +0800 Subject: [PATCH 01/14] IVerifier --- packages/protocol/contracts/L1/IVerifier.sol | 39 +++++++ packages/protocol/contracts/L1/TaikoData.sol | 2 +- packages/protocol/contracts/L1/TaikoL1.sol | 2 + .../protocol/contracts/L1/libs/LibProving.sol | 103 +++++++++--------- .../contracts/L1/libs/LibVerifying.sol | 4 + .../contracts/libs/LibSharedConfig.sol | 3 +- packages/protocol/contracts/libs/LibZKP.sol | 25 ----- .../contracts/test/L1/TestTaikoL1.sol | 1 - 8 files changed, 101 insertions(+), 78 deletions(-) create mode 100644 packages/protocol/contracts/L1/IVerifier.sol delete mode 100644 packages/protocol/contracts/libs/LibZKP.sol diff --git a/packages/protocol/contracts/L1/IVerifier.sol b/packages/protocol/contracts/L1/IVerifier.sol new file mode 100644 index 0000000000..5ff4691904 --- /dev/null +++ b/packages/protocol/contracts/L1/IVerifier.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +// +// ╭━━━━╮╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮ +// ┃╭╮╭╮┃╱╱┃┃╱╱╱╱╱┃┃╱╱╱╱╱┃┃ +// ╰╯┃┃┣┻━┳┫┃╭┳━━╮┃┃╱╱╭━━┫╰━┳━━╮ +// ╱╱┃┃┃╭╮┣┫╰╯┫╭╮┃┃┃╱╭┫╭╮┃╭╮┃━━┫ +// ╱╱┃┃┃╭╮┃┃╭╮┫╰╯┃┃╰━╯┃╭╮┃╰╯┣━━┃ +// ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ +pragma solidity ^0.8.9; + +/// @author dantaik +interface IVerifier { + function verifyZKP( + bytes memory verificationKey, + bytes calldata zkproof, + bytes32 blockHash, + address prover, + bytes32 txListHash + ) external pure returns (bool verified); + + /** + * @notice Verifies a proof that a given key/value pair is present in the + * Merkle trie. + * @param key Key of the node to search for, as a hex string. + * @param value Value of the node to search for, as a hex string. + * @param proof Merkle trie inclusion proof for the desired node. Unlike + * traditional Merkle trees, this proof is executed top-down and consists + * of a list of RLP-encoded nodes that make a path down to the target node. + * @param root Known root of the Merkle trie. Used to verify that the + * included proof is correctly constructed. + * @return verified `true` if the k/v pair exists in the trie, `false` otherwise. + */ + function verifyInclusionProof( + bytes memory key, + bytes memory value, + bytes memory proof, + bytes32 root + ) external pure returns (bool verified); +} diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 66c01c1c79..afe3d62e9a 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -41,7 +41,6 @@ library TaikoData { uint64 boostrapDiscountHalvingPeriod; uint64 initialUncleDelay; bool enableTokenomics; - bool skipProofValidation; } struct BlockMetadata { @@ -83,6 +82,7 @@ library TaikoData { mapping(uint256 => mapping(bytes32 => ForkChoice)) forkChoices; // proposer => commitSlot => hash(commitHash, commitHeight) mapping(address => mapping(uint256 => bytes32)) commits; + mapping(string => address) lookups; // Never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 2305a40abc..2ae2f503ce 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -30,12 +30,14 @@ contract TaikoL1 is EssentialContract, IHeaderSync, TaikoEvents { function init( address _addressManager, + address _verifier, bytes32 _genesisBlockHash, uint256 _feeBase ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, + verifier: _verifier, genesisBlockHash: _genesisBlockHash, feeBase: _feeBase }); diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 87d601e4b6..8115a3b56e 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -15,10 +15,9 @@ import "../../libs/LibBlockHeader.sol"; import "../../libs/LibReceiptDecoder.sol"; import "../../libs/LibTxDecoder.sol"; import "../../libs/LibTxUtils.sol"; -import "../../libs/LibZKP.sol"; import "../../thirdparty/LibBytesUtils.sol"; -import "../../thirdparty/LibMerkleTrie.sol"; import "../../thirdparty/LibRLPWriter.sol"; +import "../IVerifier.sol"; import "./LibUtils.sol"; /// @author dantaik @@ -107,40 +106,41 @@ library LibProving { ); } - if (!config.skipProofValidation) { - // Check anchor tx is the 1st tx in the block - require( - LibMerkleTrie.verifyInclusionProof({ - _key: LibRLPWriter.writeUint(0), - _value: anchorTx, - _proof: evidence.proofs[zkProofsPerBlock], - _root: evidence.header.transactionsRoot - }), - "L1:tx:proof" - ); + IVerifier verifier = IVerifier(state.lookups["verifier"]); - // Check anchor tx does not throw + // Check anchor tx is the 1st tx in the block + require( + verifier.verifyInclusionProof({ + key: LibRLPWriter.writeUint(0), + value: anchorTx, + proof: evidence.proofs[zkProofsPerBlock], + root: evidence.header.transactionsRoot + }), + "L1:tx:proof" + ); - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(anchorReceipt); + // Check anchor tx does not throw - require(receipt.status == 1, "L1:receipt:status"); - require( - LibMerkleTrie.verifyInclusionProof({ - _key: LibRLPWriter.writeUint(0), - _value: anchorReceipt, - _proof: evidence.proofs[zkProofsPerBlock + 1], - _root: evidence.header.receiptsRoot - }), - "L1:receipt:proof" - ); - } + LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder + .decodeReceipt(anchorReceipt); + + require(receipt.status == 1, "L1:receipt:status"); + require( + verifier.verifyInclusionProof({ + key: LibRLPWriter.writeUint(0), + value: anchorReceipt, + proof: evidence.proofs[zkProofsPerBlock + 1], + root: evidence.header.receiptsRoot + }), + "L1:receipt:proof" + ); // ZK-prove block and mark block proven to be valid. _proveBlock({ state: state, config: config, resolver: resolver, + verifier: verifier, evidence: evidence, target: evidence.meta, blockHashOverride: 0 @@ -172,14 +172,27 @@ library LibProving { "L1:proof:size" ); - if (!config.skipProofValidation) { - // Check the 1st receipt is for an InvalidateBlock tx with - // a BlockInvalidated event - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(invalidateBlockReceipt); - require(receipt.status == 1, "L1:receipt:status"); - require(receipt.logs.length == 1, "L1:receipt:logsize"); + IVerifier verifier = IVerifier(state.lookups["verifier"]); + // Check the event is the first one in the throw-away block + require( + verifier.verifyInclusionProof({ + key: LibRLPWriter.writeUint(0), + value: invalidateBlockReceipt, + proof: evidence.proofs[config.zkProofsPerBlock], + root: evidence.header.receiptsRoot + }), + "L1:receipt:proof" + ); + + // Check the 1st receipt is for an InvalidateBlock tx with + // a BlockInvalidated event + LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder + .decodeReceipt(invalidateBlockReceipt); + require(receipt.status == 1, "L1:receipt:status"); + require(receipt.logs.length == 1, "L1:receipt:logsize"); + + { LibReceiptDecoder.Log memory log = receipt.logs[0]; require( log.contractAddress == @@ -193,17 +206,6 @@ library LibProving { log.topics[1] == target.txListHash, "L1:receipt:topics" ); - - // Check the event is the first one in the throw-away block - require( - LibMerkleTrie.verifyInclusionProof({ - _key: LibRLPWriter.writeUint(0), - _value: invalidateBlockReceipt, - _proof: evidence.proofs[config.zkProofsPerBlock], - _root: evidence.header.receiptsRoot - }), - "L1:receipt:proof" - ); } // ZK-prove block and mark block proven as invalid. @@ -211,6 +213,7 @@ library LibProving { state: state, config: config, resolver: resolver, + verifier: verifier, evidence: evidence, target: target, blockHashOverride: LibUtils.BLOCK_DEADEND_HASH @@ -221,6 +224,7 @@ library LibProving { TaikoData.State storage state, TaikoData.Config memory config, AddressResolver resolver, + IVerifier verifier, Evidence memory evidence, TaikoData.BlockMetadata memory target, bytes32 blockHashOverride @@ -238,8 +242,8 @@ library LibProving { bytes32 blockHash = evidence.header.hashBlockHeader(); for (uint256 i = 0; i < config.zkProofsPerBlock; i++) { - if (!config.skipProofValidation) { - LibZKP.verify({ + require( + verifier.verifyZKP({ verificationKey: ConfigManager( resolver.resolve("config_manager") ).getValue(string(abi.encodePacked("zk_vkey_", i))), @@ -247,8 +251,9 @@ library LibProving { blockHash: blockHash, prover: evidence.prover, txListHash: evidence.meta.txListHash - }); - } + }), + "L1:zkp" + ); } _markBlockProven({ diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index b4dfaaaf45..03317d167b 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -27,6 +27,7 @@ library LibVerifying { function init( TaikoData.State storage state, + address verifier, bytes32 genesisBlockHash, uint256 feeBase ) public { @@ -39,6 +40,9 @@ library LibVerifying { state.lastProposedAt = uint64(block.timestamp); state.l2Hashes[0] = genesisBlockHash; + require(verifier != address(0), "L1:verifier"); + state.lookups["verifier"] = verifier; + emit BlockVerified(0, genesisBlockHash); emit HeaderSynced(block.number, 0, genesisBlockHash); } diff --git a/packages/protocol/contracts/libs/LibSharedConfig.sol b/packages/protocol/contracts/libs/LibSharedConfig.sol index bfd693cca5..80e83fcf61 100644 --- a/packages/protocol/contracts/libs/LibSharedConfig.sol +++ b/packages/protocol/contracts/libs/LibSharedConfig.sol @@ -43,8 +43,7 @@ library LibSharedConfig { proofTimeCap: 60 minutes, boostrapDiscountHalvingPeriod: 180 days, initialUncleDelay: 60 minutes, - enableTokenomics: false, - skipProofValidation: false + enableTokenomics: false }); } } diff --git a/packages/protocol/contracts/libs/LibZKP.sol b/packages/protocol/contracts/libs/LibZKP.sol deleted file mode 100644 index de3ef16318..0000000000 --- a/packages/protocol/contracts/libs/LibZKP.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// ╭━━━━╮╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮ -// ┃╭╮╭╮┃╱╱┃┃╱╱╱╱╱┃┃╱╱╱╱╱┃┃ -// ╰╯┃┃┣┻━┳┫┃╭┳━━╮┃┃╱╱╭━━┫╰━┳━━╮ -// ╱╱┃┃┃╭╮┣┫╰╯┫╭╮┃┃┃╱╭┫╭╮┃╭╮┃━━┫ -// ╱╱┃┃┃╭╮┃┃╭╮┫╰╯┃┃╰━╯┃╭╮┃╰╯┣━━┃ -// ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ -pragma solidity ^0.8.9; - -library LibZKP { - /********************* - * Public Functions * - *********************/ - - function verify( - bytes memory verificationKey, - bytes calldata zkproof, - bytes32 blockHash, - address prover, - bytes32 txListHash - ) public pure { - // TODO - } -} diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index c4ae8b8b29..323ac6dc56 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -49,6 +49,5 @@ contract TestTaikoL1NoTokenomicsNoProofValidation is TaikoL1 { config.boostrapDiscountHalvingPeriod = 180 days; config.initialUncleDelay = 1 minutes; config.enableTokenomics = false; - config.skipProofValidation = true; } } From e2be7f6ab95855e780482558806bd945bb963247 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:35:46 +0800 Subject: [PATCH 02/14] Verifier --- packages/protocol/contracts/L1/IVerifier.sol | 5 +- packages/protocol/contracts/L1/Verifier.sol | 48 +++++++++++++++++++ packages/protocol/contracts/libs/LibZKP.sol | 25 ++++++++++ .../contracts/test/L1/TestTaikoL1.sol | 22 ++++++++- packages/protocol/tasks/deploy_L1.ts | 2 - packages/protocol/test/L1/TaikoL1.test.ts | 11 ++--- 6 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 packages/protocol/contracts/L1/Verifier.sol create mode 100644 packages/protocol/contracts/libs/LibZKP.sol diff --git a/packages/protocol/contracts/L1/IVerifier.sol b/packages/protocol/contracts/L1/IVerifier.sol index 5ff4691904..18883aa0b8 100644 --- a/packages/protocol/contracts/L1/IVerifier.sol +++ b/packages/protocol/contracts/L1/IVerifier.sol @@ -27,8 +27,9 @@ interface IVerifier { * traditional Merkle trees, this proof is executed top-down and consists * of a list of RLP-encoded nodes that make a path down to the target node. * @param root Known root of the Merkle trie. Used to verify that the - * included proof is correctly constructed. - * @return verified `true` if the k/v pair exists in the trie, `false` otherwise. + * included proof is correctly constructed. + * @return verified `true` if the k/v pair exists in the trie, + * `false` otherwise. */ function verifyInclusionProof( bytes memory key, diff --git a/packages/protocol/contracts/L1/Verifier.sol b/packages/protocol/contracts/L1/Verifier.sol new file mode 100644 index 0000000000..624753dc1d --- /dev/null +++ b/packages/protocol/contracts/L1/Verifier.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +// +// ╭━━━━╮╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮ +// ┃╭╮╭╮┃╱╱┃┃╱╱╱╱╱┃┃╱╱╱╱╱┃┃ +// ╰╯┃┃┣┻━┳┫┃╭┳━━╮┃┃╱╱╭━━┫╰━┳━━╮ +// ╱╱┃┃┃╭╮┣┫╰╯┫╭╮┃┃┃╱╭┫╭╮┃╭╮┃━━┫ +// ╱╱┃┃┃╭╮┃┃╭╮┫╰╯┃┃╰━╯┃╭╮┃╰╯┣━━┃ +// ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ +pragma solidity ^0.8.9; + +import "../thirdparty/LibMerkleTrie.sol"; +import "../libs/LibZKP.sol"; +import "./IVerifier.sol"; + +/// @author dantaik +contract Verifier is IVerifier { + function verifyZKP( + bytes memory verificationKey, + bytes calldata zkproof, + bytes32 blockHash, + address prover, + bytes32 txListHash + ) external pure returns (bool verified) { + return + LibZKP.verify({ + verificationKey: verificationKey, + zkproof: zkproof, + blockHash: blockHash, + prover: prover, + txListHash: txListHash + }); + } + + function verifyInclusionProof( + bytes memory key, + bytes memory value, + bytes memory proof, + bytes32 root + ) external pure returns (bool verified) { + return + LibMerkleTrie.verifyInclusionProof({ + _key: key, + _value: value, + _proof: proof, + _root: root + }); + } +} diff --git a/packages/protocol/contracts/libs/LibZKP.sol b/packages/protocol/contracts/libs/LibZKP.sol new file mode 100644 index 0000000000..4f09edc226 --- /dev/null +++ b/packages/protocol/contracts/libs/LibZKP.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +// +// ╭━━━━╮╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮ +// ┃╭╮╭╮┃╱╱┃┃╱╱╱╱╱┃┃╱╱╱╱╱┃┃ +// ╰╯┃┃┣┻━┳┫┃╭┳━━╮┃┃╱╱╭━━┫╰━┳━━╮ +// ╱╱┃┃┃╭╮┣┫╰╯┫╭╮┃┃┃╱╭┫╭╮┃╭╮┃━━┫ +// ╱╱┃┃┃╭╮┃┃╭╮┫╰╯┃┃╰━╯┃╭╮┃╰╯┣━━┃ +// ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ +pragma solidity ^0.8.9; + +library LibZKP { + /********************* + * Public Functions * + *********************/ + + function verify( + bytes memory verificationKey, + bytes calldata zkproof, + bytes32 blockHash, + address prover, + bytes32 txListHash + ) public pure returns (bool verified) { + // TODO + } +} diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 323ac6dc56..0563a37416 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -8,9 +8,10 @@ // ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ pragma solidity ^0.8.9; +import "../../L1/IVerifier.sol"; import "../../L1/TaikoL1.sol"; -contract TestTaikoL1NoTokenomicsNoProofValidation is TaikoL1 { +contract TestTaikoL1 is TaikoL1, IVerifier { function getConfig() public pure @@ -50,4 +51,23 @@ contract TestTaikoL1NoTokenomicsNoProofValidation is TaikoL1 { config.initialUncleDelay = 1 minutes; config.enableTokenomics = false; } + + function verifyZKP( + bytes memory /*verificationKey*/, + bytes calldata /*zkproof*/, + bytes32 /*blockHash*/, + address /*prover*/, + bytes32 /*txListHash*/ + ) public pure override returns (bool) { + return true; + } + + function verifyInclusionProof( + bytes memory /*key*/, + bytes memory /*value*/, + bytes memory /*proof*/, + bytes32 /*root*/ + ) public pure override returns (bool) { + return true; + } } diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index 06fe2a836e..3ced9f786c 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -195,7 +195,6 @@ export async function deployContracts(hre: any) { } async function deployBaseLibs(hre: any) { - const libZKP = await utils.deployContract(hre, "LibZKP"); const libReceiptDecoder = await utils.deployContract( hre, "LibReceiptDecoder" @@ -206,7 +205,6 @@ async function deployBaseLibs(hre: any) { const libProposing = await utils.deployContract(hre, "LibProposing", {}); const libProving = await utils.deployContract(hre, "LibProving", { - LibZKP: libZKP.address, LibReceiptDecoder: libReceiptDecoder.address, LibTxDecoder: libTxDecoder.address, }); diff --git a/packages/protocol/test/L1/TaikoL1.test.ts b/packages/protocol/test/L1/TaikoL1.test.ts index 18763fc237..92006f5f12 100644 --- a/packages/protocol/test/L1/TaikoL1.test.ts +++ b/packages/protocol/test/L1/TaikoL1.test.ts @@ -21,10 +21,6 @@ describe("TaikoL1", function () { await ethers.getContractFactory("LibTxDecoder") ).deploy(); - const libZKP = await ( - await ethers.getContractFactory("LibZKP") - ).deploy(); - const libProposing = await ( await ethers.getContractFactory("LibProposing") ).deploy(); @@ -33,8 +29,7 @@ describe("TaikoL1", function () { await ethers.getContractFactory("LibProving", { libraries: { LibReceiptDecoder: libReceiptDecoder.address, - LibTxDecoder: libTxDecoder.address, - LibZKP: libZKP.address, + LibTxDecoder: libTxDecoder.address }, }) ).deploy(); @@ -47,7 +42,7 @@ describe("TaikoL1", function () { const feeBase = BigNumber.from(10).pow(18); taikoL1 = await ( await ethers.getContractFactory( - "TestTaikoL1NoTokenomicsNoProofValidation", + "TestTaikoL1", { libraries: { LibVerifying: libVerifying.address, @@ -57,7 +52,7 @@ describe("TaikoL1", function () { } ) ).deploy(); - await taikoL1.init(addressManager.address, genesisHash, feeBase); + await taikoL1.init(taikoL1.address, addressManager.address, genesisHash, feeBase); }); describe("getLatestSyncedHeader()", async function () { From 7adb9491803d345feff2bc7aed5930b927686dfa Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:39:44 +0800 Subject: [PATCH 03/14] Update Verifier.sol --- packages/protocol/contracts/L1/Verifier.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/Verifier.sol b/packages/protocol/contracts/L1/Verifier.sol index 624753dc1d..de8d885430 100644 --- a/packages/protocol/contracts/L1/Verifier.sol +++ b/packages/protocol/contracts/L1/Verifier.sol @@ -20,7 +20,7 @@ contract Verifier is IVerifier { bytes32 blockHash, address prover, bytes32 txListHash - ) external pure returns (bool verified) { + ) external pure returns (bool) { return LibZKP.verify({ verificationKey: verificationKey, @@ -36,7 +36,7 @@ contract Verifier is IVerifier { bytes memory value, bytes memory proof, bytes32 root - ) external pure returns (bool verified) { + ) external pure returns (bool) { return LibMerkleTrie.verifyInclusionProof({ _key: key, From f7608339b91c5bba6c7151ecea2fb7acbd0bef71 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:42:43 +0800 Subject: [PATCH 04/14] more --- packages/protocol/contracts/L1/IVerifier.sol | 2 +- packages/protocol/contracts/L1/Verifier.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 6 +++--- packages/protocol/contracts/test/L1/TestTaikoL1.sol | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/IVerifier.sol b/packages/protocol/contracts/L1/IVerifier.sol index 18883aa0b8..908cc56c4a 100644 --- a/packages/protocol/contracts/L1/IVerifier.sol +++ b/packages/protocol/contracts/L1/IVerifier.sol @@ -31,7 +31,7 @@ interface IVerifier { * @return verified `true` if the k/v pair exists in the trie, * `false` otherwise. */ - function verifyInclusionProof( + function verifyMKP( bytes memory key, bytes memory value, bytes memory proof, diff --git a/packages/protocol/contracts/L1/Verifier.sol b/packages/protocol/contracts/L1/Verifier.sol index de8d885430..d7b5fd9fc2 100644 --- a/packages/protocol/contracts/L1/Verifier.sol +++ b/packages/protocol/contracts/L1/Verifier.sol @@ -31,7 +31,7 @@ contract Verifier is IVerifier { }); } - function verifyInclusionProof( + function verifyMKP( bytes memory key, bytes memory value, bytes memory proof, diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 8115a3b56e..2daa47a374 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -110,7 +110,7 @@ library LibProving { // Check anchor tx is the 1st tx in the block require( - verifier.verifyInclusionProof({ + verifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: anchorTx, proof: evidence.proofs[zkProofsPerBlock], @@ -126,7 +126,7 @@ library LibProving { require(receipt.status == 1, "L1:receipt:status"); require( - verifier.verifyInclusionProof({ + verifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: anchorReceipt, proof: evidence.proofs[zkProofsPerBlock + 1], @@ -176,7 +176,7 @@ library LibProving { // Check the event is the first one in the throw-away block require( - verifier.verifyInclusionProof({ + verifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: invalidateBlockReceipt, proof: evidence.proofs[config.zkProofsPerBlock], diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 0563a37416..57ebb278ae 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -62,7 +62,7 @@ contract TestTaikoL1 is TaikoL1, IVerifier { return true; } - function verifyInclusionProof( + function verifyMKP( bytes memory /*key*/, bytes memory /*value*/, bytes memory /*proof*/, From a05ce9d9260350b4499e1eec4b0320b4d52b02d3 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:49:45 +0800 Subject: [PATCH 05/14] rename and fix bug --- .../L1/{IVerifier.sol => IProofVerifier.sol} | 2 +- packages/protocol/contracts/L1/TaikoL1.sol | 4 ++-- packages/protocol/contracts/L1/Verifier.sol | 4 ++-- .../protocol/contracts/L1/libs/LibProving.sol | 20 +++++++++---------- .../contracts/L1/libs/LibVerifying.sol | 6 +++--- .../contracts/test/L1/TestTaikoL1.sol | 4 ++-- packages/protocol/tasks/deploy_L1.ts | 3 ++- 7 files changed, 22 insertions(+), 21 deletions(-) rename packages/protocol/contracts/L1/{IVerifier.sol => IProofVerifier.sol} (98%) diff --git a/packages/protocol/contracts/L1/IVerifier.sol b/packages/protocol/contracts/L1/IProofVerifier.sol similarity index 98% rename from packages/protocol/contracts/L1/IVerifier.sol rename to packages/protocol/contracts/L1/IProofVerifier.sol index 908cc56c4a..15224630e3 100644 --- a/packages/protocol/contracts/L1/IVerifier.sol +++ b/packages/protocol/contracts/L1/IProofVerifier.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.9; /// @author dantaik -interface IVerifier { +interface IProofVerifier { function verifyZKP( bytes memory verificationKey, bytes calldata zkproof, diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 2ae2f503ce..bbaf83712e 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -30,14 +30,14 @@ contract TaikoL1 is EssentialContract, IHeaderSync, TaikoEvents { function init( address _addressManager, - address _verifier, + address _proofVerifier, bytes32 _genesisBlockHash, uint256 _feeBase ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, - verifier: _verifier, + proofVerifier: _proofVerifier, genesisBlockHash: _genesisBlockHash, feeBase: _feeBase }); diff --git a/packages/protocol/contracts/L1/Verifier.sol b/packages/protocol/contracts/L1/Verifier.sol index d7b5fd9fc2..50e9db0353 100644 --- a/packages/protocol/contracts/L1/Verifier.sol +++ b/packages/protocol/contracts/L1/Verifier.sol @@ -10,10 +10,10 @@ pragma solidity ^0.8.9; import "../thirdparty/LibMerkleTrie.sol"; import "../libs/LibZKP.sol"; -import "./IVerifier.sol"; +import "./IProofVerifier.sol"; /// @author dantaik -contract Verifier is IVerifier { +contract ProofVerifier is IProofVerifier { function verifyZKP( bytes memory verificationKey, bytes calldata zkproof, diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 2daa47a374..39cd83d09a 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -17,7 +17,7 @@ import "../../libs/LibTxDecoder.sol"; import "../../libs/LibTxUtils.sol"; import "../../thirdparty/LibBytesUtils.sol"; import "../../thirdparty/LibRLPWriter.sol"; -import "../IVerifier.sol"; +import "../IProofVerifier.sol"; import "./LibUtils.sol"; /// @author dantaik @@ -106,11 +106,11 @@ library LibProving { ); } - IVerifier verifier = IVerifier(state.lookups["verifier"]); + IProofVerifier proofVerifier = IProofVerifier(state.lookups["proofVerifier"]); // Check anchor tx is the 1st tx in the block require( - verifier.verifyMKP({ + proofVerifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: anchorTx, proof: evidence.proofs[zkProofsPerBlock], @@ -126,7 +126,7 @@ library LibProving { require(receipt.status == 1, "L1:receipt:status"); require( - verifier.verifyMKP({ + proofVerifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: anchorReceipt, proof: evidence.proofs[zkProofsPerBlock + 1], @@ -140,7 +140,7 @@ library LibProving { state: state, config: config, resolver: resolver, - verifier: verifier, + proofVerifier: proofVerifier, evidence: evidence, target: evidence.meta, blockHashOverride: 0 @@ -172,11 +172,11 @@ library LibProving { "L1:proof:size" ); - IVerifier verifier = IVerifier(state.lookups["verifier"]); + IProofVerifier proofVerifier = IProofVerifier(state.lookups["proofVerifier"]); // Check the event is the first one in the throw-away block require( - verifier.verifyMKP({ + proofVerifier.verifyMKP({ key: LibRLPWriter.writeUint(0), value: invalidateBlockReceipt, proof: evidence.proofs[config.zkProofsPerBlock], @@ -213,7 +213,7 @@ library LibProving { state: state, config: config, resolver: resolver, - verifier: verifier, + proofVerifier: proofVerifier, evidence: evidence, target: target, blockHashOverride: LibUtils.BLOCK_DEADEND_HASH @@ -224,7 +224,7 @@ library LibProving { TaikoData.State storage state, TaikoData.Config memory config, AddressResolver resolver, - IVerifier verifier, + IProofVerifier proofVerifier, Evidence memory evidence, TaikoData.BlockMetadata memory target, bytes32 blockHashOverride @@ -243,7 +243,7 @@ library LibProving { for (uint256 i = 0; i < config.zkProofsPerBlock; i++) { require( - verifier.verifyZKP({ + proofVerifier.verifyZKP({ verificationKey: ConfigManager( resolver.resolve("config_manager") ).getValue(string(abi.encodePacked("zk_vkey_", i))), diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 03317d167b..198df0b760 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -27,7 +27,7 @@ library LibVerifying { function init( TaikoData.State storage state, - address verifier, + address proofVerifier, bytes32 genesisBlockHash, uint256 feeBase ) public { @@ -40,8 +40,8 @@ library LibVerifying { state.lastProposedAt = uint64(block.timestamp); state.l2Hashes[0] = genesisBlockHash; - require(verifier != address(0), "L1:verifier"); - state.lookups["verifier"] = verifier; + require(proofVerifier != address(0), "L1:verifier"); + state.lookups["proofVerifier"] = proofVerifier; emit BlockVerified(0, genesisBlockHash); emit HeaderSynced(block.number, 0, genesisBlockHash); diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 57ebb278ae..d222542187 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -8,10 +8,10 @@ // ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ pragma solidity ^0.8.9; -import "../../L1/IVerifier.sol"; +import "../../L1/IProofVerifier.sol"; import "../../L1/TaikoL1.sol"; -contract TestTaikoL1 is TaikoL1, IVerifier { +contract TestTaikoL1 is TaikoL1, IProofVerifier { function getConfig() public pure diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index 3ced9f786c..d59da4f987 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -79,6 +79,7 @@ export async function deployContracts(hre: any) { log.debug(); // AddressManager + const ProofVerifier = await untils.deployContract(hre, "ProofVerifier"); const AddressManager = await utils.deployContract(hre, "AddressManager"); await utils.waitTx(hre, await AddressManager.init()); await utils.waitTx( @@ -128,7 +129,7 @@ export async function deployContracts(hre: any) { await utils.waitTx( hre, - await TaikoL1.init(AddressManager.address, l2GenesisBlockHash, feeBase) + await TaikoL1.init(ProofVerifier.address, AddressManager.address, l2GenesisBlockHash, feeBase) ); // Used by LibBridgeRead From e2b9da6cdc01b758283b07a8bef698a3900abca9 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:57:09 +0800 Subject: [PATCH 06/14] more --- .../protocol/contracts/L1/IProofVerifier.sol | 40 ------------------- .../L1/{Verifier.sol => ProofVerifier.sol} | 23 ++++++++++- .../protocol/contracts/L1/libs/LibProving.sol | 2 +- .../contracts/test/L1/TestTaikoL1.sol | 2 +- packages/protocol/tasks/deploy_L1.ts | 2 +- 5 files changed, 24 insertions(+), 45 deletions(-) delete mode 100644 packages/protocol/contracts/L1/IProofVerifier.sol rename packages/protocol/contracts/L1/{Verifier.sol => ProofVerifier.sol} (77%) diff --git a/packages/protocol/contracts/L1/IProofVerifier.sol b/packages/protocol/contracts/L1/IProofVerifier.sol deleted file mode 100644 index 15224630e3..0000000000 --- a/packages/protocol/contracts/L1/IProofVerifier.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// ╭━━━━╮╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮ -// ┃╭╮╭╮┃╱╱┃┃╱╱╱╱╱┃┃╱╱╱╱╱┃┃ -// ╰╯┃┃┣┻━┳┫┃╭┳━━╮┃┃╱╱╭━━┫╰━┳━━╮ -// ╱╱┃┃┃╭╮┣┫╰╯┫╭╮┃┃┃╱╭┫╭╮┃╭╮┃━━┫ -// ╱╱┃┃┃╭╮┃┃╭╮┫╰╯┃┃╰━╯┃╭╮┃╰╯┣━━┃ -// ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ -pragma solidity ^0.8.9; - -/// @author dantaik -interface IProofVerifier { - function verifyZKP( - bytes memory verificationKey, - bytes calldata zkproof, - bytes32 blockHash, - address prover, - bytes32 txListHash - ) external pure returns (bool verified); - - /** - * @notice Verifies a proof that a given key/value pair is present in the - * Merkle trie. - * @param key Key of the node to search for, as a hex string. - * @param value Value of the node to search for, as a hex string. - * @param proof Merkle trie inclusion proof for the desired node. Unlike - * traditional Merkle trees, this proof is executed top-down and consists - * of a list of RLP-encoded nodes that make a path down to the target node. - * @param root Known root of the Merkle trie. Used to verify that the - * included proof is correctly constructed. - * @return verified `true` if the k/v pair exists in the trie, - * `false` otherwise. - */ - function verifyMKP( - bytes memory key, - bytes memory value, - bytes memory proof, - bytes32 root - ) external pure returns (bool verified); -} diff --git a/packages/protocol/contracts/L1/Verifier.sol b/packages/protocol/contracts/L1/ProofVerifier.sol similarity index 77% rename from packages/protocol/contracts/L1/Verifier.sol rename to packages/protocol/contracts/L1/ProofVerifier.sol index 50e9db0353..91af09d369 100644 --- a/packages/protocol/contracts/L1/Verifier.sol +++ b/packages/protocol/contracts/L1/ProofVerifier.sol @@ -10,7 +10,26 @@ pragma solidity ^0.8.9; import "../thirdparty/LibMerkleTrie.sol"; import "../libs/LibZKP.sol"; -import "./IProofVerifier.sol"; + + +/// @author dantaik +interface IProofVerifier { + function verifyZKP( + bytes memory verificationKey, + bytes calldata zkproof, + bytes32 blockHash, + address prover, + bytes32 txListHash + ) external pure returns (bool verified); + + function verifyMKP( + bytes memory key, + bytes memory value, + bytes memory proof, + bytes32 root + ) external pure returns (bool verified); +} + /// @author dantaik contract ProofVerifier is IProofVerifier { @@ -45,4 +64,4 @@ contract ProofVerifier is IProofVerifier { _root: root }); } -} +} \ No newline at end of file diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 39cd83d09a..6549ba64ce 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -17,7 +17,7 @@ import "../../libs/LibTxDecoder.sol"; import "../../libs/LibTxUtils.sol"; import "../../thirdparty/LibBytesUtils.sol"; import "../../thirdparty/LibRLPWriter.sol"; -import "../IProofVerifier.sol"; +import "../ProofVerifier.sol"; import "./LibUtils.sol"; /// @author dantaik diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index d222542187..41e8e8925d 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -8,7 +8,7 @@ // ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ pragma solidity ^0.8.9; -import "../../L1/IProofVerifier.sol"; +import "../../L1/ProofVerifier.sol"; import "../../L1/TaikoL1.sol"; contract TestTaikoL1 is TaikoL1, IProofVerifier { diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index d59da4f987..a68fdfa964 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -79,7 +79,7 @@ export async function deployContracts(hre: any) { log.debug(); // AddressManager - const ProofVerifier = await untils.deployContract(hre, "ProofVerifier"); + const ProofVerifier = await utils.deployContract(hre, "ProofVerifier"); const AddressManager = await utils.deployContract(hre, "AddressManager"); await utils.waitTx(hre, await AddressManager.init()); await utils.waitTx( From 048b2ad8b5ce769102504374d8e01759496a8db3 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 19:58:51 +0800 Subject: [PATCH 07/14] Update LibZKP.sol --- packages/protocol/contracts/libs/LibZKP.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/libs/LibZKP.sol b/packages/protocol/contracts/libs/LibZKP.sol index 4f09edc226..6486b19f21 100644 --- a/packages/protocol/contracts/libs/LibZKP.sol +++ b/packages/protocol/contracts/libs/LibZKP.sol @@ -19,7 +19,7 @@ library LibZKP { bytes32 blockHash, address prover, bytes32 txListHash - ) public pure returns (bool verified) { + ) internal pure returns (bool verified) { // TODO } } From 4b623f6f5bcc3cd24b6f171dcdae2b7022bc6aaa Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 20:03:45 +0800 Subject: [PATCH 08/14] more --- packages/protocol/contracts/L1/libs/LibProving.sol | 2 +- packages/protocol/contracts/test/L1/TestTaikoL1.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 6549ba64ce..72dc1f2647 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -8,6 +8,7 @@ // ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ pragma solidity ^0.8.9; +import {IProofVerifier} from "../ProofVerifier.sol"; import "../../common/AddressResolver.sol"; import "../../common/ConfigManager.sol"; import "../../libs/LibAnchorSignature.sol"; @@ -17,7 +18,6 @@ import "../../libs/LibTxDecoder.sol"; import "../../libs/LibTxUtils.sol"; import "../../thirdparty/LibBytesUtils.sol"; import "../../thirdparty/LibRLPWriter.sol"; -import "../ProofVerifier.sol"; import "./LibUtils.sol"; /// @author dantaik diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 41e8e8925d..3df5886ad2 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -8,7 +8,7 @@ // ╱╱╰╯╰╯╰┻┻╯╰┻━━╯╰━━━┻╯╰┻━━┻━━╯ pragma solidity ^0.8.9; -import "../../L1/ProofVerifier.sol"; +import {IProofVerifier} from "../../L1/ProofVerifier.sol"; import "../../L1/TaikoL1.sol"; contract TestTaikoL1 is TaikoL1, IProofVerifier { From a38d02d915b15e013464cb4c5ba024f7e65d6a84 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 20:04:01 +0800 Subject: [PATCH 09/14] more --- packages/protocol/contracts/L1/ProofVerifier.sol | 4 +--- packages/protocol/contracts/L1/libs/LibProving.sol | 8 ++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/protocol/contracts/L1/ProofVerifier.sol b/packages/protocol/contracts/L1/ProofVerifier.sol index 91af09d369..494096c2d2 100644 --- a/packages/protocol/contracts/L1/ProofVerifier.sol +++ b/packages/protocol/contracts/L1/ProofVerifier.sol @@ -11,7 +11,6 @@ pragma solidity ^0.8.9; import "../thirdparty/LibMerkleTrie.sol"; import "../libs/LibZKP.sol"; - /// @author dantaik interface IProofVerifier { function verifyZKP( @@ -30,7 +29,6 @@ interface IProofVerifier { ) external pure returns (bool verified); } - /// @author dantaik contract ProofVerifier is IProofVerifier { function verifyZKP( @@ -64,4 +62,4 @@ contract ProofVerifier is IProofVerifier { _root: root }); } -} \ No newline at end of file +} diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 72dc1f2647..5bf0e42bf7 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -106,7 +106,9 @@ library LibProving { ); } - IProofVerifier proofVerifier = IProofVerifier(state.lookups["proofVerifier"]); + IProofVerifier proofVerifier = IProofVerifier( + state.lookups["proofVerifier"] + ); // Check anchor tx is the 1st tx in the block require( @@ -172,7 +174,9 @@ library LibProving { "L1:proof:size" ); - IProofVerifier proofVerifier = IProofVerifier(state.lookups["proofVerifier"]); + IProofVerifier proofVerifier = IProofVerifier( + state.lookups["proofVerifier"] + ); // Check the event is the first one in the throw-away block require( From 8d3255ca8448111022b0dca8b837108398bc175a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 20:08:12 +0800 Subject: [PATCH 10/14] more --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 4 ++-- packages/protocol/contracts/L1/libs/LibVerifying.sol | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index afe3d62e9a..2ab0e1b874 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -82,7 +82,7 @@ library TaikoData { mapping(uint256 => mapping(bytes32 => ForkChoice)) forkChoices; // proposer => commitSlot => hash(commitHash, commitHeight) mapping(address => mapping(uint256 => bytes32)) commits; - mapping(string => address) lookups; + mapping(string => uint256) lookups; // Never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 5bf0e42bf7..9ad89ace2f 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -107,7 +107,7 @@ library LibProving { } IProofVerifier proofVerifier = IProofVerifier( - state.lookups["proofVerifier"] + address(uint160(state.lookups["proofVerifier"])) ); // Check anchor tx is the 1st tx in the block @@ -175,7 +175,7 @@ library LibProving { ); IProofVerifier proofVerifier = IProofVerifier( - state.lookups["proofVerifier"] + address(uint160(state.lookups["proofVerifier"])) ); // Check the event is the first one in the throw-away block diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 198df0b760..075e78d886 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -41,7 +41,7 @@ library LibVerifying { state.l2Hashes[0] = genesisBlockHash; require(proofVerifier != address(0), "L1:verifier"); - state.lookups["proofVerifier"] = proofVerifier; + state.lookups["proofVerifier"] = uint256(uint160(proofVerifier)); emit BlockVerified(0, genesisBlockHash); emit HeaderSynced(block.number, 0, genesisBlockHash); From b6478af097070f8cc51f7e6f9cf900c98c046455 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 20:09:50 +0800 Subject: [PATCH 11/14] rename --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 4 ++-- packages/protocol/contracts/L1/libs/LibVerifying.sol | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 2ab0e1b874..80c7eb561f 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -82,7 +82,7 @@ library TaikoData { mapping(uint256 => mapping(bytes32 => ForkChoice)) forkChoices; // proposer => commitSlot => hash(commitHash, commitHeight) mapping(address => mapping(uint256 => bytes32)) commits; - mapping(string => uint256) lookups; + mapping(string => bytes32) lookups; // Never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 9ad89ace2f..03933d06df 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -107,7 +107,7 @@ library LibProving { } IProofVerifier proofVerifier = IProofVerifier( - address(uint160(state.lookups["proofVerifier"])) + address(uint160(uint256(state.lookups["proofVerifier"]))) ); // Check anchor tx is the 1st tx in the block @@ -175,7 +175,7 @@ library LibProving { ); IProofVerifier proofVerifier = IProofVerifier( - address(uint160(state.lookups["proofVerifier"])) + address(uint160(uint256(state.lookups["proofVerifier"]))) ); // Check the event is the first one in the throw-away block diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 075e78d886..503e7ec67f 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -41,7 +41,9 @@ library LibVerifying { state.l2Hashes[0] = genesisBlockHash; require(proofVerifier != address(0), "L1:verifier"); - state.lookups["proofVerifier"] = uint256(uint160(proofVerifier)); + state.lookups["proofVerifier"] = bytes32( + uint256(uint160(proofVerifier)) + ); emit BlockVerified(0, genesisBlockHash); emit HeaderSynced(block.number, 0, genesisBlockHash); From 3a9e82d6cad942250acd5e695dbd61a1d0ff4ea3 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 20:11:38 +0800 Subject: [PATCH 12/14] more --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- packages/protocol/contracts/L1/libs/LibVerifying.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 80c7eb561f..31828db9ec 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -103,6 +103,6 @@ library TaikoData { uint64 avgProofTime; uint64 __reservedC1; // Reserved - uint256[42] __gap; + uint256[41] __gap; } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 503e7ec67f..b9652aabf4 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -40,7 +40,7 @@ library LibVerifying { state.lastProposedAt = uint64(block.timestamp); state.l2Hashes[0] = genesisBlockHash; - require(proofVerifier != address(0), "L1:verifier"); + require(proofVerifier != address(0), "L1:proofVerifier"); state.lookups["proofVerifier"] = bytes32( uint256(uint160(proofVerifier)) ); From b590d69ca2e71f6b7edad0342502e4bb901e97b1 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 3 Jan 2023 20:59:16 +0800 Subject: [PATCH 13/14] Update ProofVerifier.sol --- packages/protocol/contracts/L1/ProofVerifier.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/protocol/contracts/L1/ProofVerifier.sol b/packages/protocol/contracts/L1/ProofVerifier.sol index 494096c2d2..cc8bbc8e9d 100644 --- a/packages/protocol/contracts/L1/ProofVerifier.sol +++ b/packages/protocol/contracts/L1/ProofVerifier.sol @@ -29,7 +29,6 @@ interface IProofVerifier { ) external pure returns (bool verified); } -/// @author dantaik contract ProofVerifier is IProofVerifier { function verifyZKP( bytes memory verificationKey, From 55344411d9c3e111f78e17d32700af67c8b7a9a6 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 3 Jan 2023 23:07:42 +0800 Subject: [PATCH 14/14] fix --- packages/protocol/contracts/L1/TaikoData.sol | 3 +-- packages/protocol/contracts/L1/TaikoL1.sol | 2 -- packages/protocol/contracts/L1/libs/LibProving.sol | 4 ++-- packages/protocol/contracts/L1/libs/LibVerifying.sol | 6 ------ packages/protocol/tasks/deploy_L1.ts | 10 ++++++++-- packages/protocol/test/L1/TaikoL1.test.ts | 2 +- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 31828db9ec..795a3380b9 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -82,7 +82,6 @@ library TaikoData { mapping(uint256 => mapping(bytes32 => ForkChoice)) forkChoices; // proposer => commitSlot => hash(commitHash, commitHeight) mapping(address => mapping(uint256 => bytes32)) commits; - mapping(string => bytes32) lookups; // Never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; @@ -103,6 +102,6 @@ library TaikoData { uint64 avgProofTime; uint64 __reservedC1; // Reserved - uint256[41] __gap; + uint256[42] __gap; } } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index bbaf83712e..2305a40abc 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -30,14 +30,12 @@ contract TaikoL1 is EssentialContract, IHeaderSync, TaikoEvents { function init( address _addressManager, - address _proofVerifier, bytes32 _genesisBlockHash, uint256 _feeBase ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, - proofVerifier: _proofVerifier, genesisBlockHash: _genesisBlockHash, feeBase: _feeBase }); diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 03933d06df..6ec22f6034 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -107,7 +107,7 @@ library LibProving { } IProofVerifier proofVerifier = IProofVerifier( - address(uint160(uint256(state.lookups["proofVerifier"]))) + resolver.resolve("proof_verifier") ); // Check anchor tx is the 1st tx in the block @@ -175,7 +175,7 @@ library LibProving { ); IProofVerifier proofVerifier = IProofVerifier( - address(uint160(uint256(state.lookups["proofVerifier"]))) + resolver.resolve("proof_verifier") ); // Check the event is the first one in the throw-away block diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index b9652aabf4..b4dfaaaf45 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -27,7 +27,6 @@ library LibVerifying { function init( TaikoData.State storage state, - address proofVerifier, bytes32 genesisBlockHash, uint256 feeBase ) public { @@ -40,11 +39,6 @@ library LibVerifying { state.lastProposedAt = uint64(block.timestamp); state.l2Hashes[0] = genesisBlockHash; - require(proofVerifier != address(0), "L1:proofVerifier"); - state.lookups["proofVerifier"] = bytes32( - uint256(uint160(proofVerifier)) - ); - emit BlockVerified(0, genesisBlockHash); emit HeaderSynced(block.number, 0, genesisBlockHash); } diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index a68fdfa964..3a4aab593e 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -79,9 +79,15 @@ export async function deployContracts(hre: any) { log.debug(); // AddressManager - const ProofVerifier = await utils.deployContract(hre, "ProofVerifier"); const AddressManager = await utils.deployContract(hre, "AddressManager"); await utils.waitTx(hre, await AddressManager.init()); + + const ProofVerifier = await utils.deployContract(hre, "ProofVerifier"); + await utils.waitTx( + hre, + await AddressManager.setAddress(`${chainId}.proof_verifier`, ProofVerifier.address) + ); + await utils.waitTx( hre, await AddressManager.setAddress(`${chainId}.dao_vault`, daoVault) @@ -129,7 +135,7 @@ export async function deployContracts(hre: any) { await utils.waitTx( hre, - await TaikoL1.init(ProofVerifier.address, AddressManager.address, l2GenesisBlockHash, feeBase) + await TaikoL1.init(AddressManager.address, l2GenesisBlockHash, feeBase) ); // Used by LibBridgeRead diff --git a/packages/protocol/test/L1/TaikoL1.test.ts b/packages/protocol/test/L1/TaikoL1.test.ts index 92006f5f12..402f9d91f7 100644 --- a/packages/protocol/test/L1/TaikoL1.test.ts +++ b/packages/protocol/test/L1/TaikoL1.test.ts @@ -52,7 +52,7 @@ describe("TaikoL1", function () { } ) ).deploy(); - await taikoL1.init(taikoL1.address, addressManager.address, genesisHash, feeBase); + await taikoL1.init(addressManager.address, genesisHash, feeBase); }); describe("getLatestSyncedHeader()", async function () {