From ccf085c7c53d88f878f7098c487f0398297bb052 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 12:04:23 +0800 Subject: [PATCH 1/6] allow only one proposer for alpha-2 testnet --- packages/protocol/contracts/L1/TaikoL1.sol | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 580137155e4..b29bbae531f 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -80,6 +80,17 @@ contract TaikoL1 is EssentialContract, IHeaderSync, TaikoEvents { * transactions in the L2 block. */ function proposeBlock(bytes[] calldata inputs) external nonReentrant { + // For alpha-2 testnet, he network only allows an special address + // to propose but anyone to prove. This is the first step of testing + // the tokenomics. + + // TODO(daniel): remove this special address. + address authorized = resolve("proposer"); + require( + authorized == address(0) || authorized == msg.sender, + "L1:unauthorized" + ); + TaikoData.Config memory config = getConfig(); LibProposing.proposeBlock({ state: state, From 48764a71564bf83332fddbd7803dd7ada994d1b2 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 12:08:48 +0800 Subject: [PATCH 2/6] more --- packages/protocol/contracts/L1/TaikoL1.sol | 11 ------- .../contracts/L1/libs/LibProposing.sol | 11 +++++++ .../protocol/contracts/L1/libs/LibProving.sol | 30 +++++++++++-------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index b29bbae531f..580137155e4 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -80,17 +80,6 @@ contract TaikoL1 is EssentialContract, IHeaderSync, TaikoEvents { * transactions in the L2 block. */ function proposeBlock(bytes[] calldata inputs) external nonReentrant { - // For alpha-2 testnet, he network only allows an special address - // to propose but anyone to prove. This is the first step of testing - // the tokenomics. - - // TODO(daniel): remove this special address. - address authorized = resolve("proposer"); - require( - authorized == address(0) || authorized == msg.sender, - "L1:unauthorized" - ); - TaikoData.Config memory config = getConfig(); LibProposing.proposeBlock({ state: state, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 124d0969310..97c606e1b0d 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -57,6 +57,17 @@ library LibProposing { AddressResolver resolver, bytes[] calldata inputs ) public { + // For alpha-2 testnet, he network only allows an special address + // to propose but anyone to prove. This is the first step of testing + // the tokenomics. + + // TODO(daniel): remove this special address. + address specialProposer = resolver.resolve("special_proposer"); + require( + specialProposer == address(0) || specialProposer == msg.sender, + "L1:specialProposer" + ); + assert(!LibUtils.isHalted(state)); require(inputs.length == 2, "L1:inputs:size"); diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 34cc5962779..73da9b41864 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -246,19 +246,25 @@ library LibProving { bytes32 blockHash = evidence.header.hashBlockHeader(); + address specialProver = resolve.resolve("special_prover"); + for (uint256 i = 0; i < config.zkProofsPerBlock; ++i) { - require( - proofVerifier.verifyZKP({ - verificationKey: ConfigManager( - resolver.resolve("config_manager", false) - ).getValue(string(abi.encodePacked("zk_vkey_", i))), - zkproof: evidence.proofs[i], - blockHash: blockHash, - prover: evidence.prover, - txListHash: evidence.meta.txListHash - }), - "L1:zkp" - ); + if (msg.sender == specialProver && evidence.proofs[i].length == 0) { + // The special prover can skip a ZKP verification if the proof is empty. + } else { + require( + proofVerifier.verifyZKP({ + verificationKey: ConfigManager( + resolver.resolve("config_manager", false) + ).getValue(string(abi.encodePacked("zk_vkey_", i))), + zkproof: evidence.proofs[i], + blockHash: blockHash, + prover: evidence.prover, + txListHash: evidence.meta.txListHash + }), + "L1:zkp" + ); + } } _markBlockProven({ From 36a8e594d36eafd96496d2c31e8cfaebb126402e Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 12:11:27 +0800 Subject: [PATCH 3/6] more --- packages/protocol/contracts/L1/libs/LibProposing.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 97c606e1b0d..496a43b901e 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -57,7 +57,7 @@ library LibProposing { AddressResolver resolver, bytes[] calldata inputs ) public { - // For alpha-2 testnet, he network only allows an special address + // For alpha-2 testnet, the network only allows an special address // to propose but anyone to prove. This is the first step of testing // the tokenomics. diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 73da9b41864..2126bf24c9b 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -246,11 +246,15 @@ library LibProving { bytes32 blockHash = evidence.header.hashBlockHeader(); + // For alpha-2 testnet, the network allows any address to submit ZKP, + // but a special prover can skip ZKP verification if the ZKP is empty. + + // TODO(daniel): remove this special address. address specialProver = resolve.resolve("special_prover"); for (uint256 i = 0; i < config.zkProofsPerBlock; ++i) { if (msg.sender == specialProver && evidence.proofs[i].length == 0) { - // The special prover can skip a ZKP verification if the proof is empty. + // Skip ZKP verification } else { require( proofVerifier.verifyZKP({ From 6c7beacf9e7a1b3fed960f22d61339a0abd87e94 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 12:15:14 +0800 Subject: [PATCH 4/6] fix --- packages/protocol/contracts/L1/libs/LibProposing.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 496a43b901e..35cdd86baf1 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -62,7 +62,7 @@ library LibProposing { // the tokenomics. // TODO(daniel): remove this special address. - address specialProposer = resolver.resolve("special_proposer"); + address specialProposer = resolver.resolve("special_proposer", true); require( specialProposer == address(0) || specialProposer == msg.sender, "L1:specialProposer" diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 2126bf24c9b..3001cf23e3c 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -250,7 +250,7 @@ library LibProving { // but a special prover can skip ZKP verification if the ZKP is empty. // TODO(daniel): remove this special address. - address specialProver = resolve.resolve("special_prover"); + address specialProver = resolver.resolve("special_prover", true); for (uint256 i = 0; i < config.zkProofsPerBlock; ++i) { if (msg.sender == specialProver && evidence.proofs[i].length == 0) { From 4133a51bc0568ab893d2426ebe025e646f9fed7e Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 13:39:56 +0800 Subject: [PATCH 5/6] Update TkoToken.sol --- packages/protocol/contracts/L1/TkoToken.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/TkoToken.sol b/packages/protocol/contracts/L1/TkoToken.sol index 966ff684d7c..8edeec6239b 100644 --- a/packages/protocol/contracts/L1/TkoToken.sol +++ b/packages/protocol/contracts/L1/TkoToken.sol @@ -43,8 +43,8 @@ contract TkoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { function init(address _addressManager) external initializer { EssentialContract._init(_addressManager); ERC20Upgradeable.__ERC20_init({ - name_: "Taiko Test Token", - symbol_: "tTKO", + name_: "Taiko USD Stablecoin Token", + symbol_: "tkUSD", decimals_: 18 }); } From f643d2d4ac4f77ee4532f884a263136defdbba9d Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 19 Jan 2023 13:41:58 +0800 Subject: [PATCH 6/6] Update TkoToken.sol --- packages/protocol/contracts/L1/TkoToken.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/TkoToken.sol b/packages/protocol/contracts/L1/TkoToken.sol index 8edeec6239b..d7fb272a5d3 100644 --- a/packages/protocol/contracts/L1/TkoToken.sol +++ b/packages/protocol/contracts/L1/TkoToken.sol @@ -45,7 +45,7 @@ contract TkoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { ERC20Upgradeable.__ERC20_init({ name_: "Taiko USD Stablecoin Token", symbol_: "tkUSD", - decimals_: 18 + decimals_: 6 }); }