From f343bb74e61dbe3a1d2ac7c4eeea8c66f3e76b0e Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 13 Jun 2024 14:46:39 +0200 Subject: [PATCH] Evaluation of L2 rollups --- evaluations/rollups.md | 219 ++++++++++++++++++++++++++++++++++++++++ evaluations/rollups.ods | Bin 0 -> 31154 bytes 2 files changed, 219 insertions(+) create mode 100644 evaluations/rollups.md create mode 100644 evaluations/rollups.ods diff --git a/evaluations/rollups.md b/evaluations/rollups.md new file mode 100644 index 0000000..3c28b35 --- /dev/null +++ b/evaluations/rollups.md @@ -0,0 +1,219 @@ +Ethereum L2 Rollups +=================== + +A quick and dirty overview of existing rollups and their suitability for hosting +the Codex marketplace smart contracts. To interact with these contracts, the +participants in the network create blockchain transactions for purchasing and +selling storage, and for providing storage proofs that are then checked +on-chain. It would be too costly for these transactions to happen on Ethereum +main net, which is why this document explores L2 rollups as an alternative. + +Main sources used: +- individual websites of the rollup projects +- https://l2beat.com +- https://blog.kroma.network/l2-scaling-landscape-fees-and-max-tps-fe6087d3f690 + +Requirements +------------ + +For the storage marketplace to work, we have the following requirements for a +rollup: +1. Low gas costs; if gas is too costly then the business case of storage + providers disappears +2. EVM compatibility; this shortens our time to market because we already have + Solidity contracts +3. Support for BN254 elliptic curve precompiles (ecAdd, ecMul, ecPairing) for + the proof system +4. High throughput; our current proof system that checks all proofs separately + on chain requires a large number of transactions per second +5. Censorship resistant; an L2 operator should not have the power to exclude + transactions from certain people or apps + +Note that low latency is not a requirement; it's ok to have latency equivalent +to L1, which is in the order of tens of seconds. + +Main flavours +------------- + +Although there are many L2 rollups, there is a limited number of technical +stacks that underly them. + +There is the family of purely optimistic rollups, that rely on fraud proofs to +ensure that they are kept honest: +- Arbitrum +- Optimism / OP Stack +- Fuel + +And there are the rollups that rely on zero-knowledge proofs to prove that they +act honestly: +- Polygon zkEVM / CDK +- Linea +- zkSync +- Scroll + +And there's Taiko, which uses a combination of zero-knowledge proofs and fraud +proofs to keep the network honest: +- Taiko + +Gas costs +--------- + +A rough approximation of average gas costs for submitting a Codex storage proof +for each rollup: + +| Rollup | Average proof costs | Potential profit | +| ------------------- | ------------------ | ---------------- | +| Mantle | $0.0000062723 | $2.58 | +| Boba network | $0.0016726250 | -$2.54 | +| Immutable zkEVM | $0.0073595500 | -$20.01 | +| Arbitrum | $0.0083631250 | -$23.09 | +| zkSync Era | $0.0209078125 | -$61.63 | +| Base | $0.0418156250 | -$125.86 | +| Optimism | $0.0836312500 | -$254.32 | +| Polygon zkEVM | $0.1254468750 | -$382.77 | +| Blast | $0.1672625000 | -$511.23 | +| Scroll | $0.2090781250 | -$639.69 | +| Taiko | $0.2508937500 | -$768.15 | +| Metis | $0.4014300000 | -$1,230.59 | +| Linea | $0.8363125000 | -$2,566.55 | + +This table was created by eyeballing the gas cost and token price graphs for +each L2, and [calculating the USD costs](rollups.ods) for a proof from that. We +did not include rollups that are not EVM compatible. + +Potential profit (per month per TB) is calculated by assuming operational costs +of $1.40 and revenue of $4.00 per TB per month, an average slot size of 10 GB, +and an average of 1 proof per slot per day. + +EVM compatibility +----------------- + +This shows which rollups are EVM compatible, and whether they support the BN254 +elliptic curve precompiles that we require for verification of our storage +proofs (ecAdd, ecMul, ecPairing). + +| Rollup | EVM compatible | Elliptic Curve operations | +| --------------------- | -------------- | ------------------------- | +| Arbitrum | Yes | Yes | +| Base | Yes | Yes | +| Blast | Yes | Yes | +| Boba network | Yes | Yes | +| Immutable zkEVM | Yes | Yes | +| Linea | Yes | Yes | +| Mantle | Yes | Yes | +| Metis | Yes | Yes | +| Optimism | Yes | Yes | +| Polygon zkEVM | Yes | Yes | +| Scroll | Yes | Yes | +| Taiko | Yes | Yes | +| zkSync Era | Yes | No | +| Fuel L2 V1 | No | N/A | +| Fuel Rollup OS | No | N/A | +| Immutable X | No | N/A | +| Polygon Miden | No | N/A | +| Starknet | No | N/A | +| zkSync lite | No | N/A | + + +Throughput +---------- + +A rough approximation of the maximum number of transactions that a rollup can +handle, and the maximum size of the storage network that it might support: + +| Rollup | Maximum TPS | Maximum storage | +| --------------------- | ----------- | --------------- | +| zkSync Era | 750 | 1236 PB | +| Starknet | 484 | 798 PB | +| Optimism | 455 | 750 PB | +| Base | 455 | 733 PB | +| Mantle | 400 | 659 PB | +| Metis | 357 | 588 PB | +| Polygon zkEVM | 237 | 391 PB | +| Arbitrum | 226 | 372 PB | +| Boba network | 205 | 338 PB | +| Scroll | 50 | 82 PB | +| Taiko | 33 | 54 PB | +| Blast | ? | ? | +| Immutable zkEVM | ? | ? | +| Linea | ? | ? | +| Fuel L2 V1 | ? | ? | +| Fuel Rollup OS | ? | ? | +| Immutable X | ? | ? | +| Polygon Miden | ? | ? | +| zkSync lite | ? | ? | + +Maximum size of the storage network is [calculated](rollups.ods) assuming an +average 1 proof per 24 hours per slot, average slot size 10 GB, and average +erasure coding rate of 1/2. In practice the calculated maximum storage is going +to be less, because we can't use up the entirety of the rollup capacity. + +Maximum TPS figures are taken from an [overview document by +Kroma](https://blog.kroma.network/l2-scaling-landscape-fees-and-max-tps-fe6087d3f690) + +Censorship resistance +--------------------- + +Censorship resistance can be achieved by having a decentralized architecture, +where anyone is allowed to propose blocks and there are are no admin rights that +allow a rollup operator to change the rules in their favour. + +Only Fuel L2 V1 has all these properties, the others don't. And because Fuel L2 +V1 is a payment network without smart contracts it is not suitable for the Codex +marketplace. This means that at this moment there is no censorship resistant +rollup that can host the Codex marketplace. + +Taiko is one of the few rollups that has a decentralized architecture, and it's +committed to becoming permissionless. However, at the moment it is not. + +| Rollup | Decentralized | Permissionless | Adminless | +| --------------------- | ------------- | --------------- | ------------ | +| Fuel L2 V1 | Yes | Yes | Yes | +| Metis | Yes | No | No | +| Taiko | Yes | No | No | +| Arbitrum | No | N/A | N/A | +| Base | No | N/A | N/A | +| Blast | No | N/A | N/A | +| Boba network | No | N/A | N/A | +| Fuel Rollup OS | No | N/A | N/A | +| Immutable X | No | N/A | N/A | +| Immutable zkEVM | No | N/A | N/A | +| Linea | No | N/A | N/A | +| Mantle | No | N/A | N/A | +| Optimism | No | N/A | N/A | +| Polygon zkEVM | No | N/A | N/A | +| Polygon Miden | No | N/A | N/A | +| Scroll | No | N/A | N/A | +| Starknet | No | N/A | N/A | +| zkSync lite | No | N/A | N/A | +| zkSync Era | No | N/A | N/A | + +Conclusion +---------- + +There seems to be no rollup that matches all the requirements that we listed in +the beginning of the document. The most pressing problem is that only Mantle +seems to be cheap enough to allow storage providers to turn a profit, given the +assumptions of an average 10 GB slot size and 1 proof per 24 hours. It is +unclear whether these low prices are sustainable in the long run. If we want to +have more choice on where to deploy, then we either need to reduce the number of +on-chain proofs in Codex drastically, or we need to find a way to reduce rollup +transaction costs. + +Luckily we're already working on reducing the number of proofs by introducing +proof aggregation, but the analysis in this document shows that we might not be +able to launch a storage network without it. Reducing the number of proofs also +ensures that the network can grow to a larger total size. + +When we look at reducing the transaction costs, then the best thing to focus on +is getting rid of the need to post transactions on L1 in blobs. This is by far +the most expensive part of running a rollup, and this is most likely also why +Mantle is the only rollup in this overview that is cheap enough; it uses EigenDA +instead of posting to L1. In this respect, it might also be interesting to look +at Arbitrum AnyTrust, which has a similar design. We could also consider +creating a fork of an existing rollup and use Codex as the DA layer. Some of the +new modular architectures for creating rollups, such as +[Espresso](https://www.espressosys.com/), [Astria](https://www.astria.org/), +[Radius](https://www.theradius.xyz/), [Altlayer](https://www.altlayer.io/) and +[NodeKit](https://www.nodekit.xyz/) could also make it easier to experiment with +different rollup designs. diff --git a/evaluations/rollups.ods b/evaluations/rollups.ods new file mode 100644 index 0000000000000000000000000000000000000000..fca9bbae0873a05012a0d9066c3b087c25d82e2a GIT binary patch literal 31154 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 G|NB3%nBFk} literal 0 HcmV?d00001