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): Move proofTimeTarget to state var and adjust scripts/tests #13769

Merged
merged 7 commits into from
May 16, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
2 changes: 0 additions & 2 deletions packages/protocol/contracts/L1/TaikoConfig.sol
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ library TaikoConfig {
ethDepositGas: 21000,
ethDepositMaxFee: 1 ether / 10,
txListCacheExpiry: 0,
// 85s based on A2 testnet status, or set to 1800 for 30mins (mainnet mock)
proofTimeTarget: 1800,
adjustmentQuotient: 16,
relaySignalRoot: false
});
Expand Down
4 changes: 2 additions & 2 deletions packages/protocol/contracts/L1/TaikoData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ library TaikoData {
uint64 maxEthDepositsPerBlock;
uint96 maxEthDepositAmount;
uint96 minEthDepositAmount;
uint64 proofTimeTarget;
uint8 adjustmentQuotient;
bool relaySignalRoot;
}
Expand All @@ -40,6 +39,7 @@ library TaikoData {
uint64 genesisTimestamp;
uint64 numBlocks;
uint64 proofTimeIssued;
uint64 proofTimeTarget;
uint64 lastVerifiedBlockId;
uint64 accProposedAt;
uint64 nextEthDepositToProcess;
Expand Down Expand Up @@ -139,7 +139,7 @@ library TaikoData {
// Slot 7: never or rarely changed
uint64 genesisHeight;
uint64 genesisTimestamp;
uint64 __reserved71;
uint64 proofTimeTarget;
adaki2004 marked this conversation as resolved.
Show resolved Hide resolved
uint64 __reserved72;
// Slot 8
uint64 accProposedAt;
Expand Down
3 changes: 3 additions & 0 deletions packages/protocol/contracts/L1/TaikoL1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,15 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors
* @param _addressManager The AddressManager address.
* @param _genesisBlockHash The block hash of the genesis block.
* @param _initBlockFee Initial (reasonable) block fee value.
* @param _initProofTimeTarget Initial (reasonable) proof submission time target.
* @param _initProofTimeIssued Initial proof time issued corresponding
* with the initial block fee.
*/
function init(
address _addressManager,
bytes32 _genesisBlockHash,
uint64 _initBlockFee,
uint64 _initProofTimeTarget,
uint64 _initProofTimeIssued
) external initializer {
EssentialContract._init(_addressManager);
adaki2004 marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -53,6 +55,7 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors
config: getConfig(),
genesisBlockHash: _genesisBlockHash,
initBlockFee: _initBlockFee,
initProofTimeTarget: _initProofTimeTarget,
initProofTimeIssued: _initProofTimeIssued
});
}
Expand Down
2 changes: 1 addition & 1 deletion packages/protocol/contracts/L1/libs/LibProving.sol
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ library LibProving {
fc.prover = evidence.prover;

if (evidence.prover == address(1)) {
fc.provenAt = uint64(block.timestamp.max(blk.proposedAt + config.proofTimeTarget));
fc.provenAt = uint64(block.timestamp.max(blk.proposedAt + state.proofTimeTarget));
} else {
fc.provenAt = uint64(block.timestamp);
}
Expand Down
8 changes: 4 additions & 4 deletions packages/protocol/contracts/L1/libs/LibTokenomics.sol
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,20 @@ library LibTokenomics {
TaikoData.Config memory config,
uint64 proofTime
) internal view returns (uint64 newProofTimeIssued, uint64 blockFee) {
newProofTimeIssued = (state.proofTimeIssued > config.proofTimeTarget)
? state.proofTimeIssued - config.proofTimeTarget
newProofTimeIssued = (state.proofTimeIssued > state.proofTimeTarget)
? state.proofTimeIssued - state.proofTimeTarget
: uint64(0);
newProofTimeIssued += proofTime;

uint256 x = (newProofTimeIssued * Math.SCALING_FACTOR_1E18)
/ (config.proofTimeTarget * config.adjustmentQuotient);
/ (state.proofTimeTarget * config.adjustmentQuotient);

if (Math.MAX_EXP_INPUT <= x) {
x = Math.MAX_EXP_INPUT;
}

uint256 result = (uint256(Math.exp(int256(x))) / Math.SCALING_FACTOR_1E18)
/ (config.proofTimeTarget * config.adjustmentQuotient);
/ (state.proofTimeTarget * config.adjustmentQuotient);

blockFee = uint64(result.min(type(uint64).max));
}
Expand Down
1 change: 1 addition & 0 deletions packages/protocol/contracts/L1/libs/LibUtils.sol
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ library LibUtils {
genesisTimestamp: state.genesisTimestamp,
numBlocks: state.numBlocks,
proofTimeIssued: state.proofTimeIssued,
proofTimeTarget: state.proofTimeTarget,
lastVerifiedBlockId: state.lastVerifiedBlockId,
accProposedAt: state.accProposedAt,
nextEthDepositToProcess: state.nextEthDepositToProcess,
Expand Down
6 changes: 5 additions & 1 deletion packages/protocol/contracts/L1/libs/LibVerifying.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ library LibVerifying {
TaikoData.Config memory config,
bytes32 genesisBlockHash,
uint64 initBlockFee,
uint64 initProofTimeTarget,
uint64 initProofTimeIssued
) internal {
if (
Expand All @@ -43,14 +44,17 @@ library LibVerifying {
// EIP-4844 blob deleted after 30 days
|| config.txListCacheExpiry > 30 * 24 hours || config.ethDepositGas == 0
|| config.ethDepositMaxFee == 0 || config.ethDepositMaxFee >= type(uint96).max
|| config.proofTimeTarget == 0 || config.adjustmentQuotient == 0
|| config.adjustmentQuotient == 0 || initProofTimeTarget == 0 || initProofTimeIssued == 0
) revert L1_INVALID_CONFIG();

uint64 timeNow = uint64(block.timestamp);
state.genesisHeight = uint64(block.number);
state.genesisTimestamp = timeNow;

state.blockFee = initBlockFee;
state.proofTimeIssued = initProofTimeIssued;
// 85s based on A2 testnet status, or set to 1800 for 30mins (mainnet mock)
Brechtpd marked this conversation as resolved.
Show resolved Hide resolved
state.proofTimeTarget = initProofTimeTarget;
state.numBlocks = 1;

TaikoData.Block storage blk = state.blocks[0];
Expand Down
16 changes: 14 additions & 2 deletions packages/protocol/script/DeployOnL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,18 @@ contract DeployOnL1 is Script {

uint256 public taikoTokenPremintAmount = vm.envUint("TAIKO_TOKEN_PREMINT_AMOUNT");

// Change it based on 'consensus' / experience / expected result
// Based in seconds. Please set carefully.
// For testnet it could be somewhere 85-100s
// For mainnet it could be around 1800 s (30mins)
// Can be adjusted later with setters
uint64 public INITIAL_PROOF_TIME_TARGET = 0;
adaki2004 marked this conversation as resolved.
Show resolved Hide resolved

TaikoL1 taikoL1;
address public addressManagerProxy;

error FAILED_TO_DEPLOY_PLONK_VERIFIER(string contractPath);
error PROOF_TIME_TARGET_NOT_SET();

function run() external {
require(owner != address(0), "owner is zero");
Expand Down Expand Up @@ -107,9 +115,13 @@ contract DeployOnL1 is Script {
// Calculating it for our needs based on testnet/mainnet. We need it in
// order to make the fees on the same level - in ideal circumstences.
// See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564
if(INITIAL_PROOF_TIME_TARGET == 0) {
revert PROOF_TIME_TARGET_NOT_SET();
}

uint64 initProofTimeIssued = LibLn.calcInitProofTimeIssued(
feeBase,
uint16(taikoL1.getConfig().proofTimeTarget),
uint16(INITIAL_PROOF_TIME_TARGET),
uint8(taikoL1.getConfig().adjustmentQuotient)
);

Expand All @@ -118,7 +130,7 @@ contract DeployOnL1 is Script {
address(taikoL1),
bytes.concat(
taikoL1.init.selector,
abi.encode(addressManagerProxy, genesisHash, feeBase, initProofTimeIssued)
abi.encode(addressManagerProxy, genesisHash, feeBase, initProofTimeIssued, initProofTimeIssued)
)
);
setAddress("taiko", taikoL1Proxy);
Expand Down
22 changes: 22 additions & 0 deletions packages/protocol/script/DetermineNewProofTimeIssued.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import {LibLn} from "../test/LibLn.sol";

uint16 constant DESIRED_PROOF_TIME_TARGET = 500;
uint8 constant ADJUSTMENT_QUOTIENT = 16;

contract DetermineProofTImeIssued is Script {
adaki2004 marked this conversation as resolved.
Show resolved Hide resolved

function run() public {
uint16 proofTimeTarget = DESIRED_PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation
uint64 feeBase = 1e8; // 1 TKO
uint64 initProofTimeIssued =
LibLn.calcInitProofTimeIssued(feeBase, proofTimeTarget, ADJUSTMENT_QUOTIENT);

console2.log("The proof time target is:", proofTimeTarget);
console2.log("The associated proof time issued is:", initProofTimeIssued);
}
}
11 changes: 5 additions & 6 deletions packages/protocol/test/TaikoL1.sim.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {LibLn} from "./LibLn.sol";

/// @dev Tweak this if you iwhs to set - the config and the calculation of the proofTimeIssued
/// @dev also originates from this
uint16 constant PROOF_TIME_TARGET = 375; //sec. Approx mainnet scenario
uint16 constant INITIAL_PROOF_TIME_TARGET = 375; //sec. Approx mainnet scenario

/// @dev Warning: this test will take 7-10 minutes and require 1GB memory.
/// `pnpm sim`
Expand All @@ -25,7 +25,6 @@ contract TaikoL1_b is TaikoL1 {
config.ringBufferSize = 1200;
config.maxVerificationsPerTx = 10;
config.proofCooldownPeriod = 1 minutes;
config.proofTimeTarget = PROOF_TIME_TARGET;
config.realProofSkipSize = 0;
}
}
Expand Down Expand Up @@ -86,7 +85,7 @@ contract TaikoL1Simulation is TaikoL1TestBase {
}

function setUp() public override {
uint16 proofTimeTarget = PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation
proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation

initProofTimeIssued =
LibLn.calcInitProofTimeIssued(feeBase, proofTimeTarget, ADJUSTMENT_QUOTIENT);
Expand Down Expand Up @@ -162,7 +161,7 @@ contract TaikoL1Simulation is TaikoL1TestBase {
uint256 proposedIndex;

console2.log("Last second:", maxTime);
console2.log("Proof time target:", PROOF_TIME_TARGET);
console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET);
console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate);
console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate);
printVariableHeaders();
Expand Down Expand Up @@ -340,7 +339,7 @@ contract TaikoL1Simulation is TaikoL1TestBase {
uint256 proposedIndex;

console2.log("Last second:", maxTime);
console2.log("Proof time target:", PROOF_TIME_TARGET);
console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET);
console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate);
console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate);
printVariableHeaders();
Expand Down Expand Up @@ -523,7 +522,7 @@ contract TaikoL1Simulation is TaikoL1TestBase {
uint256 proposedIndex;

console2.log("Last second:", maxTime);
console2.log("Proof time target:", PROOF_TIME_TARGET);
console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET);
console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate);
console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate);
printVariableHeaders();
Expand Down
7 changes: 5 additions & 2 deletions packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol";
import {LibLn} from "./LibLn.sol";

/// @dev Tweak this if you iwhs to set - the config and the calculation of the proofTimeIssued
/// @dev also originates from this
uint16 constant INITIAL_PROOF_TIME_TARGET = 2160; //sec. Approx mainnet scenario

contract TaikoL1MainnetMockConfig is TaikoL1 {
function getConfig() public pure override returns (TaikoData.Config memory config) {
config = TaikoConfig.getConfig();
Expand All @@ -23,7 +27,6 @@ contract TaikoL1MainnetMockConfig is TaikoL1 {
config.maxNumProposedBlocks = 200;
config.ringBufferSize = 240;
config.proofCooldownPeriod = 0;
config.proofTimeTarget = 2160;
}
}

Expand All @@ -41,7 +44,7 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase {
}

function setUp() public override {
uint16 proofTimeTarget = 2160; // Approx. mainnet value
proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. mainnet value
// Calculating it for our needs based on testnet/mainnet proof vars.
// See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564
initProofTimeIssued =
Expand Down
5 changes: 3 additions & 2 deletions packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol";
import {LibLn} from "./LibLn.sol";

uint16 constant INITIAL_PROOF_TIME_TARGET = 120; //sec. Approx testnet scenario

contract TaikoL1WithTestnetConfig is TaikoL1 {
function getConfig() public pure override returns (TaikoData.Config memory config) {
config = TaikoConfig.getConfig();
Expand All @@ -23,7 +25,6 @@ contract TaikoL1WithTestnetConfig is TaikoL1 {
config.proofCooldownPeriod = 0;
config.maxNumProposedBlocks = 40;
config.ringBufferSize = 48;
config.proofTimeTarget = 120; // Testnet example
}
}

Expand All @@ -34,7 +35,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
}

function setUp() public override {
uint16 proofTimeTarget = 120; // Approx. testnet value
proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. testnet value
// Calculating it for our needs based on testnet/mainnet proof vars.
// See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564
initProofTimeIssued =
Expand Down
2 changes: 1 addition & 1 deletion packages/protocol/test/TaikoL1Oracle.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ contract TaikoL1OracleTest is TaikoL1TestBase {
assertEq(lastVerifiedBlockIdNow, lastVerifiedBlockId);
}

vm.warp(block.timestamp + conf.proofTimeTarget + conf.systemProofCooldownPeriod);
vm.warp(block.timestamp + L1.getStateVariables().proofTimeTarget + conf.systemProofCooldownPeriod);
verifyBlock(Carol, 1);

lastVerifiedBlockIdNow = L1.getStateVariables().lastVerifiedBlockId;
Expand Down
10 changes: 9 additions & 1 deletion packages/protocol/test/TaikoL1TestBase.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ abstract contract TaikoL1TestBase is Test {

// Calculation shall be done in derived contracts - based on testnet or mainnet expected proof time
uint64 public initProofTimeIssued;
uint16 proofTimeTarget;
uint8 public constant ADJUSTMENT_QUOTIENT = 16;

function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1);
Expand Down Expand Up @@ -81,7 +82,14 @@ abstract contract TaikoL1TestBase is Test {
registerAddress("proto_broker", address(L1));

// Lastly, init L1
L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase, initProofTimeIssued);
if( proofTimeTarget == 0 || initProofTimeIssued == 0) {
// This just means, these tests are not focusing on the tokenomics, which is fine!
// So here, with 500second proof time the initial proof time issued value shall be that below.
// Calculated with 'forge script script/DetermineNewProofTimeIssued.s.sol'
proofTimeTarget = 500;
initProofTimeIssued = 219263;
}
L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase, proofTimeTarget, initProofTimeIssued);
printVariables("init ");
}

Expand Down