Roles
-
Users:
- paying:
TXS_FEES
L2 transaction fees using the L2's native coins. The native coins can be interpreted as Ether, TAI, or potentially another ERC20 token on L1.
- receiving: nothing
-
Proposers:
- desc: they build blocks and propose them on L1.
- paying: 1)
PROPOSING_TX_FEE
ETH as L1 tx fees, 2) PROVER_FEE
block proving fees, and 3) small fiat fees for IT infrastructure (ignored in our discussion)
- receiving:
TXS_FEES
- profit =
TXS_FEES - PROPOSING_TX_FEE - PROVER_FEE
-
Provers:
- desc: they generate ZKP proofs to prove blocks are valid or invalid.
- paying: 1)
PROVING_TX_FEE
ETH as L1 tx fees, and 2) IT_COST
a considerable amount of ZKP computation hardware cost.
- receiving: 1)
PROVER_FEE
block proving fees, and potentially 2) PROVER_REWARD
a performance-based block reward in TAI.
- profit =
PROVER_FEE + PROVER_REWARD - PROVING_TX_FEE - IT_COST
Here I chose to use proposers instead of sequencers because in our rollup contract there is nothing related to ordering transactions in a block. Given that Ethereum uses PBS (proposer builder separation), we should probably also use proposers and builders for clarity. The builder-vs-proposer economics is beyond the scope of our tokenomics design.
Prover Market
The need for ZKPs will inevitably create a market where only the highest bids receive their desired proofs. Such a market will serve as a foundation for almost all ZKP projects that are fulfillable by the prover's services/hardware.
We may choose to or have to build our own prover market, and other projects may also do the same, but eventually, there will be project-independent markets that try to maximize the prover's financial return and minimize the proposer's cost. (It is very similar to DSP, or demand-side platform in web2 ads ecosystem). Such a market will most likely operate off-chain but offer on-chain verifications of off-chain deals.
INFO: A demand-side platform (DSP) is a type of software that allows an advertiser to buy advertising with the help of automation. Because they allow mobile advertisers to buy high-quality traffic at scale with minimal friction, DSPs are a powerful marketing automation tool.
It's safer to assume that there will be multiple such markets, and we want to allow our provers to choose their favorite markets and use the deals they have reached off-chain with third-party provers in our protocol. We need to support custom deal adapter, as illustrated below:
function proposeBlock(
BlockContext memory context,
bytes calldata txList,
bytes calldata zkDeal, // new field
address zkDealAgent, // new field
)
external
nonReentrant
{
// now we need to check that the agent is whitelisted by our protocol
checkDealAgent(zkDealAgent);
// then we check the deal is still valid and may do some bookkeeping
// for example, lock the penalties for XX hours.
IDealAgent(zkDealAgent).verifyDeal(zkDeal);
// Deposit proving fees
taiToken.transferFrom(…);
…
}
Once a deal is verified, a deal-prover is attached to this pending block before a deadline is reached. If the deal-prover proves the block before the deadline, the deposited proving fees will be transferred to the prover once the block is finalized, and the deal is consumed entirely or partially (a deal may serve multiple blocks).
If the deal-prover failed to prove the block before the deadline, the block is open for all provers. If another prover submits a ZKP successfully, a large amount of penalty (also specified by the deal) will be transferred out of the deal-prover's staking. These tokens will be used for 1) paying the actual prover an amount that's higher than the fair market price, and 2) putting into our DAO for other purposes.
A deal is something like this:
struct Deal {
address prover;
bytes32 contextHash;
address feeToken;
uint256 fee; // in TAI token
uint256 deadline;
uint256 penalties; // in TAI
bytes extra;
bytes signature;
}
TAI Tokenomics
TAI will be minted when:
- reward provers who submit proofs fast enough
- reward provers who finalized blocks (proposers may also finalize blocks, but we may not want to reward them)
- reward proposers when the number of pending blocks is smaller enough, or the block size is big enough
TAI will be burned when:
- we charge a percentage fee in
PROVER_FEE
, and use it to buy back TAI to burn.
- charge and burn TAI from proposers when the number of pending blocks is large enough, or the block size is small enough
- creating a new Taiko-based L2 using a given ERC20 token (on L1) as the native L2 fee token.
related to this idea: actor.createLayer2(theirOwnTokenAddressOnL1) to clone our canonical L2 to their own L2 such that the native fee token on their L2 is the given theirOwnTokenAddressOnL1 token.