Ethereum Protocol Fellowship (EPF) Cohort 7 — Applications open until May 13

FOCIL Breakout #021

2025-10-07 Agenda: #1743 canonical JSON

Transcript

00:03:52
Jihoon:Okay, thank you. Hello everyone, welcome to Fossil Breakout 21st. Today, we have a research presentation.
00:04:01
Jihoon:Luca from L2Beat will gonna give us a talk about fossil and native roll-ups.
00:04:07
Jihoon:A native roll-up is an EVM-based roll-up using the execute precompile, so you can minimize the risk of bug, governance, and so on and so forth. For anyone interested, please take a look into this article.
00:04:23
Jihoon:Let me share it in the chat.
00:04:26
Jihoon:After the talk, we can share development updates, as usual. So, please welcome Luca from L2Bit. Luca, if you're ready, the stage is yours.
00:04:40
donnoh | L2BEAT:Thank you for inviting me. So…
00:04:44
donnoh | L2BEAT:I don't have a… I don't have slides, because I was in…
00:04:49
donnoh | L2BEAT:Singapore this week, and didn't have the time, but maybe it's even more interesting this way.
00:04:54
donnoh | L2BEAT:So, I can maybe share the, Let me see…
00:05:00
donnoh | L2BEAT:The… that website that you shared in the chat?
00:05:04
donnoh | L2BEAT:And what I want to do is to… let me say…
00:05:11
donnoh | L2BEAT:is to give you kind of a small introduction on native rollups, the idea behind native rollups, and why I think .fosale, is useful, is very useful here.
00:05:24
donnoh | L2BEAT:Especially for native roll-ups, but not only. So…
00:05:29
donnoh | L2BEAT:The idea behind native rollups is… so let's assume, first of all, that we have, statelessness on all 1, so we can…
00:05:39
donnoh | L2BEAT:we can execute transactions, we can perform the state transition function L1, without having the full state, so we just have
00:05:48
donnoh | L2BEAT:Pre-state route, we have a post-state route, and we have a list of transactions, which are possibly, you know.
00:05:55
donnoh | L2BEAT:Stateless, traces to be able to execute them statelessly.
00:06:02
donnoh | L2BEAT:And now the deal here is… if, L1…
00:06:07
donnoh | L2BEAT:pool nodes can perform a state transition function which is stateless. In principle, they can perform the state transition function on arbitrary states, not only the state of L1.
00:06:19
donnoh | L2BEAT:So, in principle, these L1 full nodes can apply the set position function.
00:06:27
donnoh | L2BEAT:With the state of the roll-ups as well, right? And…
00:06:33
donnoh | L2BEAT:If done, you know, naively, with re-execution, it doesn't bring many benefits, because you would consume the same resources.
00:06:43
donnoh | L2BEAT:But if we also assume that we have ZK on L1, this becomes much more interesting, right? So…
00:06:51
donnoh | L2BEAT:The idea behind native rollups is to reuse the same stack that is used for Ethereum itself, but for the…
00:06:59
donnoh | L2BEAT:For the… for the roll-ups as well. So… The goal of…
00:07:06
donnoh | L2BEAT:the NativeOps proposal is to implement a precompile, which is called the execute precompile, which it… what it does is basically, a recursive function to the state transition function. I have two variants in my documents, one that does a
00:07:26
donnoh | L2BEAT:recursive call just to the apply body. I assume that, you know, you are familiar with the… with what I'm talking about in the execution layer, given that, you know, post-sale touches this stuff.
00:07:39
donnoh | L2BEAT:So one variant only does a recursive call to apply body, it skips the header checks, while the other variant does, you know, it's a recursive call to the state transition function with all the header information, so this is a little bit more…
00:07:57
donnoh | L2BEAT:is a little bit longer, while the other one is a little bit shorter. And the reason why we have both, because a lot of rollups today, they skip header checks in the first place, so it's interesting to have both. In any case.
00:08:13
donnoh | L2BEAT:The idea here is… The executePrecompile takes as an input.
00:08:19
donnoh | L2BEAT:all the information that goes in the block environment, that is then used in the block environment, of course, and the transactions, right? So, an input is the list of transactions, which is ideally a link to a blob, or many blobs.
00:08:37
donnoh | L2BEAT:And then, all the information that they usually require for this, for this block environment. So, for example, the chain ID, this is specific to each roll-up, this is an input. The pre-state, this is supposed to be saved in a contract, another one, and you pass it again as an input.
00:08:54
donnoh | L2BEAT:You can have arbitrary guest limits, you can have arbitrary coin base, this could be, you know, a predefined address, it could be…
00:09:04
donnoh | L2BEAT:set to be the same as the L1 Coinbase, if you're, for example, a base roll-up.
00:09:11
donnoh | L2BEAT:And… in general, you know, all these values can be inputs.
00:09:21
donnoh | L2BEAT:And these inputs are then passed to the apply body, which does the actual transition, and checks that the…
00:09:29
donnoh | L2BEAT:transition from a pre-state, which is again a state root, and a post state, is correct, using the same execution environment that Ethereum already uses.
00:09:38
donnoh | L2BEAT:And the cool, like, a cool way to reason about native rollups is
00:09:47
donnoh | L2BEAT:The same is that… the same relation that there is between the consensus layer
00:09:54
donnoh | L2BEAT:and the execution layer for Ethereum. The same relation can be… Phones!
00:10:01
donnoh | L2BEAT:between L1 and L2, in the sense of…
00:10:05
donnoh | L2BEAT:For example, the broadcast limit
00:10:09
donnoh | L2BEAT:no, sorry. Like, the Coinbase is something that information that comes from the consensus layer, right? Like, all the information that comes from the consensus layer
00:10:21
donnoh | L2BEAT:now comes from L1, from the perspective of a native roll-up. So, another, like, obvious example is, Randall, right? This is something that comes from the consensus layer. For native roll-ups, this is an input that comes from L1.
00:10:38
donnoh | L2BEAT:And L1 can decide whether to, like, either pass the things from the consensus layer, or, like, the same things the other one already has, or do something else.
00:10:52
donnoh | L2BEAT:And this is quite cool, because now you kind of have a programmable consensus layer in the form of a smart contracts, which is… which is super interesting.
00:11:03
donnoh | L2BEAT:So this is the, like, short LDR about native rollups.
00:11:07
donnoh | L2BEAT:And… the… The important thing about this precompile is, okay, we want to do this recursive call.
00:11:20
donnoh | L2BEAT:So that, you know, the reason why we want to have this recursive call, by the way, is twofold. Our first reason is
00:11:29
donnoh | L2BEAT:we want projects to upgrade every time Ethereum upgrades, automatically, so if there's, you know, if there is a fork, this changes, because there is a new structure, a new…
00:11:38
donnoh | L2BEAT:pre-compiled, and it is also a new transaction type, let's say 7702. They would also be automatically supported on the native products as well.
00:11:49
donnoh | L2BEAT:So they… these roll-ups wouldn't need to have their own dedicated governance just to be… just to have feature pilot fever one, and the second reason is…
00:11:59
donnoh | L2BEAT:To be bug-free, because if there is a bug.
00:12:02
donnoh | L2BEAT:In a native roll-up, it also means that there is a bug on a one, and…
00:12:07
donnoh | L2BEAT:it's gonna be fixed with a fork. This is not…
00:12:11
donnoh | L2BEAT:what happens today if there is a bug in our rollout? If there is a bug, then L1 is not gonna save them.
00:12:19
donnoh | L2BEAT:So, so we want to do this recursive call, but the thing is, the L2 environment is a little bit different compared to L1.
00:12:28
donnoh | L2BEAT:It's not enough to do this, naively.
00:12:32
donnoh | L2BEAT:And that's why, like, there is… there are other things, around.
00:12:37
donnoh | L2BEAT:Not many, because, again, we can see that it's very short.
00:12:42
donnoh | L2BEAT:But we need some… some things. So, for example, one thing that needs to be supported is messaging.
00:12:48
donnoh | L2BEAT:From L122, and I have this page that describes
00:12:52
donnoh | L2BEAT:The way that current system works.
00:12:56
donnoh | L2BEAT:like, at least popular ones, or, like, our most interesting ones, or unique, like OpiStack, Lina, Type, and Obstac, how they implement L12 messaging.
00:13:06
donnoh | L2BEAT:Which is used for deposits, token deposits from L1. You deposit the token on L1, it needs to appear on the L2, and then you need to implement withdrawals, from L2 to L1, right? Messagingsystem.
00:13:20
donnoh | L2BEAT:For example, is able to burn those tokens on L2.
00:13:24
donnoh | L2BEAT:And, unlock the tokens that are locked in an escrow normal.
00:13:30
donnoh | L2BEAT:And… One of those differences?
00:13:35
donnoh | L2BEAT:from L1 execution environment and the L2 execution environment is forced transactions.
00:13:42
donnoh | L2BEAT:So… we really want rollups to have the same censorship resistance as L1, as Ethereum. And this means that
00:13:52
donnoh | L2BEAT:If, for example, you have a rollup that has a centralized sequencer, and the centralized sequencer is censoring you.
00:13:59
donnoh | L2BEAT:you should be able to send your transaction on L1, And…
00:14:03
donnoh | L2BEAT:have the guarantee that if L1 includes your transaction, then also the L2 will process such transaction.
00:14:13
donnoh | L2BEAT:And… you know, I… I work at L2Peat, and…
00:14:20
donnoh | L2BEAT:One of the most difficult things to implement for a project, is forced transactions.
00:14:26
donnoh | L2BEAT:They're very complicated. Every project kind of has a different way to implement forced transactions. For example, if you look at OP stack.
00:14:38
donnoh | L2BEAT:They have a new transaction type.
00:14:41
donnoh | L2BEAT:This transaction type is called a repository transaction, and they need to heavily modify How the derivation works?
00:14:50
donnoh | L2BEAT:I can show, maybe…
00:14:56
donnoh | L2BEAT:Like, in the derivation, if you look at the… this is the OP.
00:15:03
donnoh | L2BEAT:when they derive the transaction list, like, it's quite complicated. Of course, I will not go into the details, but they…
00:15:13
donnoh | L2BEAT:kind of… significantly modify DL1 execution environment to be able to, support first transactions.
00:15:21
donnoh | L2BEAT:If you look at Arbitrum, the way that Arbitrum implements first transactions, it is even more complicated. They have not one new transaction type, but they have many.
00:15:38
donnoh | L2BEAT:And… There are projects that try to minimize the, the diff.
00:15:47
donnoh | L2BEAT:with L1, so one example is…
00:15:50
donnoh | L2BEAT:Linear. Linear is a project that wants… To be an L2…
00:15:56
donnoh | L2BEAT:without touching the execution clients at all, right? And…
00:16:05
donnoh | L2BEAT:Because of this, they have been particularly struggling with implementing first transactions.
00:16:11
donnoh | L2BEAT:Because R1, again, doesn't have a concept of first transactions.
00:16:15
donnoh | L2BEAT:And… We talked with them for a long time. They presented us with a doc.
00:16:23
donnoh | L2BEAT:With a proposal for forced transactions.
00:16:26
donnoh | L2BEAT:And basically, you know, the simpler way you can implement first transactions today in a system is to…
00:16:35
donnoh | L2BEAT:like, with a centralized sequencer, is to have some windows some periodic windows.
00:16:43
donnoh | L2BEAT:where anyone can sequence transactions. So basically, you have…
00:16:47
donnoh | L2BEAT:These windows, where you become a base roll-up.
00:16:50
donnoh | L2BEAT:Linear called, calls this block base blocks.
00:16:55
donnoh | L2BEAT:So every now and then, there can be a base block.
00:16:58
donnoh | L2BEAT:Which is problematic, because if you… for a certain period, you're paced, you get into the… all the complexity of being paced.
00:17:07
donnoh | L2BEAT:of having base sequencing. So, for example, you have degradation for pre-confirmations.
00:17:14
donnoh | L2BEAT:And the UX is not great, in general.
00:17:17
donnoh | L2BEAT:And… We also talked with Aztec, you know, which is this privacy L2, and also for them.
00:17:25
donnoh | L2BEAT:It has been, like, they're not TBM, but also for them, it has been, like, quite challenging to implement first infrastructure mechanism, and they also are planning to…
00:17:36
donnoh | L2BEAT:Maybe use this base windows?
00:17:39
donnoh | L2BEAT:But in any case, the message that I want to send you is, implementing forced transaction is very difficult.
00:17:46
donnoh | L2BEAT:So, if we want to implement first actions for a native roll-up, what is that we would need to do?
00:17:53
donnoh | L2BEAT:Either we go with this base of Windows, but again, the UX is terrible. I don't think anyone really would want to do this if there is another way.
00:18:04
donnoh | L2BEAT:The other way is… dot…
00:18:11
donnoh | L2BEAT:So, the high-level idea of forced transactions is the sequencer is answering you, you send that transaction on all one. On all one, you have a smart contract that queues
00:18:21
donnoh | L2BEAT:These transactions, right?
00:18:24
donnoh | L2BEAT:And then, you need to have a mechanism on all one, such that…
00:18:32
donnoh | L2BEAT:You take the sequencer batches, the list of transactions, to the sequencer.
00:18:42
donnoh | L2BEAT:You take this first transaction queue.
00:18:45
donnoh | L2BEAT:all-in-one, where anyone can just push transactions to this queue, and then you need to have a mechanism to check
00:18:54
donnoh | L2BEAT:That the sequencer actually includes the transactions
00:18:59
donnoh | L2BEAT:That are in the first transactions, right?
00:19:02
donnoh | L2BEAT:So, you know, this might sound familiar. Basically, the first resuction queue is
00:19:08
donnoh | L2BEAT:Works as an inclusion list, and you want to force the inclusion list in the
00:19:14
donnoh | L2BEAT:In the sequencer botches.
00:19:17
donnoh | L2BEAT:And to do this, it is difficult, like…
00:19:23
donnoh | L2BEAT:most of the time, this is done as part of the derivation, but, like, in general, this is done as part of the state transition. This is not a check that is on L1, because checking
00:19:34
donnoh | L2BEAT:That some transactions that you have saved, let's say, in storage, on L1, are included in a blob.
00:19:41
donnoh | L2BEAT:Because the sequencer on OpenL2 posts stuff in a block.
00:19:46
donnoh | L2BEAT:probably requires a ZK verifier. And the purpose of native rollups is that, you know, we want to simplify managing
00:19:56
donnoh | L2BEAT:a roll-up at a point in which projects do not even need to think about ZK verifiers, right? So this is a problem.
00:20:04
donnoh | L2BEAT:So, I was looking at fossil, and…
00:20:10
donnoh | L2BEAT:And the cool thing about Fossil is that it implements exactly this mechanism, from an execution layer perspective. So I'm, you know, I'm not looking at the consensus layer at all, because
00:20:22
donnoh | L2BEAT:It doesn't matter for native rollups, in the sense of the consensus layer everything that L1
00:20:33
donnoh | L2BEAT:fetches from the consensus layer, and a native rollup will fetch from a contract on L1.
00:20:40
donnoh | L2BEAT:So if, you know, I looked at the spec, again, I'm not super familiar, but my understanding of the spec is
00:20:50
donnoh | L2BEAT:There is this new inclusion list that is added to the state transition, and then…
00:20:57
donnoh | L2BEAT:there is this, validate inclusion list transactions, I think, which does exactly, the thing that forced transactions are supposed to do.
00:21:06
donnoh | L2BEAT:You have the list of transactions that comes from the builder, you have the inclusion list that comes from somewhere else, and then there is this piece of code that checks that the…
00:21:18
donnoh | L2BEAT:Dot the… The transactions that come from the builder include an encryption list transactions, right?
00:21:26
donnoh | L2BEAT:So now, if we have this on L1, Aww.
00:21:35
donnoh | L2BEAT:also the execute precompile would be able to make use of it. So…
00:21:40
donnoh | L2BEAT:If we go, you know, this is the execute precompile. At some point, the execute precompile would do a say transition call.
00:21:51
donnoh | L2BEAT:with a blockchain and a block. If we have four cylinder 1, here we would add an inclusion list.
00:21:57
donnoh | L2BEAT:And… These inclusion lists would come from a smart contract. So again, the idea here is
00:22:06
donnoh | L2BEAT:there is some function that allows users to send transactions one-on-one. These transactions with the full signatures are saved in the smart contract, and then
00:22:18
donnoh | L2BEAT:the… This list is passed as an input to the execute precompile, so that the
00:22:27
donnoh | L2BEAT:State transition of the roll-up is conditioned based on these encryption lists.
00:22:33
donnoh | L2BEAT:And this would allow to have… to implement first transactions.
00:22:37
donnoh | L2BEAT:Without having to worry about a dedicated mechanism to check for inclusion.
00:22:43
donnoh | L2BEAT:So, I talked about, you know, checking inclusion in a blob.
00:22:50
donnoh | L2BEAT:This is not something that Fossil handles today, or is supposed to handle.
00:22:56
donnoh | L2BEAT:but… I'm kind of thinking in the future, because… when…
00:23:04
donnoh | L2BEAT:Ethereum will move to ZK.
00:23:07
donnoh | L2BEAT:The idea here is that L1 itself will also post It's transactions.
00:23:16
donnoh | L2BEAT:So, Fossil in a ZK ward.
00:23:20
donnoh | L2BEAT:also kind of needs to check inclusion, within blobs. This is, like, a future problem, open problem, whatever, but, like, I'm assuming
00:23:29
donnoh | L2BEAT:that's… L1 will fix for sale with blobs.
00:23:34
donnoh | L2BEAT:By itself, eventually.
00:23:37
donnoh | L2BEAT:And… Native roll-ups will be able to use the exact same mechanism.
00:23:43
donnoh | L2BEAT:For… for this.
00:23:47
donnoh | L2BEAT:So, I think I can… Stop here, if anyone has questions.
00:24:03
Jihoon:Great, thank you, Luca. So,
00:24:05
Jihoon:You've covered what native rollups are, challenges of implementing forced transactions for rollups with centralized sequencers, and how can we add forced transactions to native roll-ups.
00:24:23
Jihoon:If I understood correctly, I think the main idea is to use the inclusion list transactions field of state transition function to enforce the forced transactions, and
00:24:38
Jihoon:Those will come from a smart contract.
00:24:42
Jihoon:And any user can send and save transactions to the smart contract, whichever they want to enforce, right?
00:24:52
donnoh | L2BEAT:Yes, yeah, exactly. So, the… the thing that I still need to figure out, and that maybe, you guys can help, is…
00:25:02
donnoh | L2BEAT:how to handle the complexities of sending transactions to a smart contract compared to the mempool, right? Because it could be that you send a transaction to inclusion lists, these are used as an input to the state transition, but…
00:25:19
donnoh | L2BEAT:these transactions don't actually get in because of, you know, gas limits or whatever, right? So…
00:25:29
donnoh | L2BEAT:There is a problem of, like, resubmission, because… It could be, you know.
00:25:36
donnoh | L2BEAT:But they don't… like, we don't have a mempool that keeps the transactions. These transactions are actually consumed.
00:25:42
donnoh | L2BEAT:So this is kind of the complexity that needs to be solved, but I'm pretty confident… like, I'm pretty optimistic that they can be solved. Also because,
00:25:56
donnoh | L2BEAT:Existing roll-ups already have this problem.
00:25:59
donnoh | L2BEAT:In a way or the other, with first introductions.
00:26:04
Jihoon:So, as long as we… Somehow have the transaction included in a blog.
00:26:12
Jihoon:It's… okay, right? As long as the transaction… Has… have no problem.
00:26:22
Jihoon:when it interacts with a smart contract, like, there is no, like, revert, no whatever, that just… yeah, if that execution goes okay, then all we need to care is whether the transaction is included in the block.
00:26:38
donnoh | L2BEAT:Yeah, yeah, like, what I'm worried about is, let's say,
00:26:45
donnoh | L2BEAT:a transaction is at the tip of this queue, right? It is…
00:26:53
donnoh | L2BEAT:It is used as an input.
00:26:55
donnoh | L2BEAT:Of this transition, recursive call, like, as a… in a crucial list.
00:27:00
donnoh | L2BEAT:But then… The transaction is skipped.
00:27:05
donnoh | L2BEAT:I don't remember exactly where, this is done.
00:27:09
donnoh | L2BEAT:Like, where is it?
00:27:15
donnoh | L2BEAT:Where does this continue? In the spec?
00:27:18
donnoh | L2BEAT:What happens if a transaction is skipped? You would need to resubmit the transaction on L1 in this queue.
00:27:28
Jihoon:Yeah, the… that part is… so, you can see to continue here. The first one is to check the… if the IL transaction is not a blob transaction, because currently we don't support blob transaction. Right.
00:27:46
donnoh | L2BEAT:Yeah, that's fine.
00:27:48
Jihoon:Yes, you know, because of some possible other factor. And the second one is, actually… is…
00:27:58
Jihoon:It checks if the… Not included
00:28:02
Jihoon:IL transaction could have been appended at the end of the block.
00:28:11
Jihoon:if an IELT transaction is not included, then we are executing lines below 1,110, you know? And…
00:28:24
Jihoon:If we are hitting that line, then…
00:28:27
Jihoon:we want to see if the IL transaction cannot be appended at the end of a block. So, when we try to validate and execute a transaction at the end of a block.
00:28:41
Jihoon:if we have any kind of, you know, exception, then that's fine. That IL transaction is validly omitted.
00:28:54
Jihoon:So that's what the code is trying to achieve, and… Oh.
00:29:03
Jihoon:Right, I guess you're saying that there could be a possible case that a forced transaction can be validly omitted for some reason.
00:29:15
donnoh | L2BEAT:Yeah, yeah, exactly. Like, what happens in that case? In a fossil, a normal fossil, I think it would remain in the mempool, right, and can be, picked again.
00:29:30
donnoh | L2BEAT:In this case, you probably would need to resubmit.
00:29:35
donnoh | L2BEAT:Your transactional one.
00:29:39
Jihoon:I guess it depends if the transaction cannot be included In subsequent blocks.
00:29:48
Jihoon:For whatever reason. Then… the transaction will be evicted from the mempool. Otherwise, I think includeers will
00:30:00
Jihoon:Yeah, pick it up again in the next IL, just as Potter said.
00:30:05
donnoh | L2BEAT:Yeah, yeah, exactly. So, like, this is kind of the difference that needs to be, thought a little bit more in the context of native prolops.
00:30:16
donnoh | L2BEAT:To how to handle, like, resubmission.
00:30:20
donnoh | L2BEAT:But again, as I said, I'm pretty optimistic that there is a… there is a solution somewhere.
00:30:26
Jihoon:Do you have similar cases, today with forest transactions?
00:30:34
donnoh | L2BEAT:So… Like, the only case…
00:30:42
donnoh | L2BEAT:No, I don't think there is.
00:30:46
donnoh | L2BEAT:Because… So for optimism, the way… the way that in OP Stack works is there is…
00:30:58
donnoh | L2BEAT:Kind of always pays for forced transactions.
00:31:02
donnoh | L2BEAT:They always allocate some space.
00:31:09
donnoh | L2BEAT:So, I think there isn't the issue that…
00:31:14
donnoh | L2BEAT:There isn't enough space in the block, I think.
00:31:18
donnoh | L2BEAT:In Arbitrum, the way that it works is…
00:31:24
donnoh | L2BEAT:The sequencer decides when to include them.
00:31:28
donnoh | L2BEAT:And it has a… some time… window.
00:31:32
donnoh | L2BEAT:Which is, like, 24 hours, I think. It's pretty long.
00:31:36
donnoh | L2BEAT:And if it doesn't include this transaction in 24 hours, then the user can, force it themselves.
00:31:46
donnoh | L2BEAT:And the, like, the L2 is kind of forced to… to process this transaction. It is inserted.
00:31:53
donnoh | L2BEAT:I cannot be skipped. The only case that is kind of similar, is… Mmm…
00:32:02
donnoh | L2BEAT:No, it's not actually very similar. But basically, there is this case where you send a message, and this message fails on the L2, and you need to resubmit it. Like, it fails because maybe you specify the gas limit, but then, unexpectedly.
00:32:17
donnoh | L2BEAT:The L2 gas changed.
00:32:20
donnoh | L2BEAT:And then it fails because it goes out of gas, and you need to submit it.
00:32:25
donnoh | L2BEAT:And in that case, you need to actually send another transaction.
00:32:35
Jihoon:Got it. So, in that case, we need to… the user needs to send another transaction to force included.
00:32:42
donnoh | L2BEAT:Yeah, unless… unless there is a way to…
00:32:47
donnoh | L2BEAT:Know if a transaction was skipped or not.
00:32:53
donnoh | L2BEAT:Because if you know it… You could, like, keep those that are skipped because of… Gas limits?
00:33:06
donnoh | L2BEAT:Or… I don't know.
00:33:11
donnoh | L2BEAT:But probably, probably it's not, it's not, it's not feasible to implement this.
00:33:19
Jihoon:maybe the situation is not equivalent, but I'm also optimistic that we were gonna be able to find a solution for this case.
00:33:31
Jihoon:Yeah, great. Yeah, does anyone have any question?
00:33:36
Jihoon:For native roll-ups, or fossil native roll-ups?
00:33:43
donnoh | L2BEAT:And by the way, sorry, the thing that I… that I forgot to mention is this is, like, super relevant for native rollups, but it could also be used by existing roll-ups as well.
00:33:54
donnoh | L2BEAT:So, all major EVM rollups, like Optimism, Base, you know, Arbitrum, Scroll.
00:34:02
donnoh | L2BEAT:Tyco, Linear, and whatnot. They try to minimize the difficult one.
00:34:07
donnoh | L2BEAT:So, even if you're not native, you could… Try to minimize the diff.
00:34:15
donnoh | L2BEAT:By implementing first transactions in this way.
00:34:19
donnoh | L2BEAT:Already, without being native.
00:34:25
Jihoon:Is it okay to understand that if we implement fossil in L1, that's gonna replace forced transactions?
00:34:35
donnoh | L2BEAT:I think it is possible, because again, all the EVM rollups, what they do is that they just fork what is on L1. So if they fork L1 and POSIL is there, they have this mechanism that they can potentially use for personal transactions.
00:34:50
donnoh | L2BEAT:I don't think any of the current follow-up teams are looking into this, to be honest.
00:34:57
donnoh | L2BEAT:Because, you know, they have many things to think about, and…
00:35:04
donnoh | L2BEAT:Yeah, either they already implemented this, and changing might not be worth it.
00:35:08
donnoh | L2BEAT:But for those that haven't.
00:35:13
donnoh | L2BEAT:or for those that maybe wish to simplify their design, it might be worth it. So, I… one example is linear. As I said, linear is kind of struggling.
00:35:23
donnoh | L2BEAT:I would recommend Linea to look into this.
00:35:30
donnoh | L2BEAT:Like, well before native rollups.
00:35:47
Jihoon:So… Luca, you shared, some challenges.
00:35:55
Jihoon:to implement forced transactions, then if we somehow succeed to have fossil in L1, then…
00:36:04
Jihoon:It'll be good for them, because they don't need to worry about it anymore.
00:36:09
Jihoon:maybe there's another reason that we… why we want to have also in L1.
00:36:17
donnoh | L2BEAT:Also, like, on the other hand,
00:36:22
donnoh | L2BEAT:projects can already implement… like, L2s could already implement Force Hill, even without having a tunnel one, right? So…
00:36:30
donnoh | L2BEAT:In the sense of…
00:36:34
donnoh | L2BEAT:like, if their goal is just to have a fossil-like mechanism, they cannot implement it. If their goal is to minimize the deficit L1, which is what most projects want, then of course you need to wait, for L1 to have fossil.
00:36:47
donnoh | L2BEAT:I think that it might not be a good enough argument to say
00:36:55
donnoh | L2BEAT:we need fossil on L1, so that's a…
00:37:03
donnoh | L2BEAT:They can already do it. And this, you know, in all core devs' calls, this happened many times, that someone wanted to have something on one, just to have it on the tools as well.
00:37:14
donnoh | L2BEAT:And… My feeling is that this is not a strong enough argument for something to be included on one.
00:37:25
donnoh | L2BEAT:It is something to keep in mind. Like, in practice, my opinion is this would simplify the work for Altos.
00:37:34
Jihoon:Yeah, I get it, yeah. I guess it's,
00:37:39
Jihoon:There was an argument to have delayed execution over EPBS, because it could be more beneficial to L2
00:37:51
Jihoon:when we are considering some feature for L1, then we should prioritize L1 over L2, so… yeah, that's a good point. Patas, do you wanna share something?
00:38:02
potuz:What does it mean fossil on L2? L2 doesn't have 4 choice, so… what part of fossil, or what is fossil on L2?
00:38:11
donnoh | L2BEAT:Yeah, yeah, yeah, so the idea here is to…
00:38:15
donnoh | L2BEAT:Try to reuse the check that is done on the execution layer, where you have
00:38:21
donnoh | L2BEAT:a list of transactions that is checked against another list of transactions, which is the inclusion list, right? So the idea here is just to reuse this check on the execution layer.
00:38:31
potuz:Oh, okay, so it's just a matter of, like, using a function that is just a simple check, that is an implementation detail. It's not a mechanism.
00:38:40
potuz:It's not a mechanism design, it's not part of consensus, it's not… it's just simply reusing that part of code in the year.
00:38:48
donnoh | L2BEAT:Yeah, yeah, exactly. So, there is the need for roll-ups to have a check somewhere that
00:38:55
donnoh | L2BEAT:the centralized sequencer, the list of transactions that the centralized sequencer is sequencing, includes forced transactions. Forced transactions come from somewhere else, like, usually a different function in a contract.
00:39:09
donnoh | L2BEAT:And to implement the check, That the sequencer batches include forced transactions.
00:39:16
donnoh | L2BEAT:It is difficult, for roll-ups.
00:39:20
donnoh | L2BEAT:Without modifying
00:39:24
donnoh | L2BEAT:without heavily or, like, significantly modifiable one. And the idea here is, if the execution layer already has this check.
00:39:30
donnoh | L2BEAT:The roll-ups can…
00:39:33
potuz:reuse this. And by the way, you're assuming that the check is going to be the same. You're… you're, you're assuming…
00:39:40
potuz:one condition on rollups, that rollouts are going to be using, first of all, the engine API. So, already this drives Arbitrum out.
00:39:48
donnoh | L2BEAT:Yeah, yeah, yeah, of course, of course.
00:39:50
potuz:But, I mean, there's a bunch of conditions on Fossil itself and on the way that this will be implemented in ELS that would just drive down the number of rollouts that could use this, could reuse this code dramatically.
00:40:02
potuz:Because also, the conditions on being inclusible for L2 might be very different than being includeable for L1. They might depend on different things than just gas limits and whatever it is.
00:40:16
donnoh | L2BEAT:Yes, yeah, exactly, so… The main reason why I advocate for this L2 fossil is mainly for native roll-ups.
00:40:27
donnoh | L2BEAT:It is, I don't know if you joined, late to this call, but I discussed how Arbitrum implements first transactions, and Arbitrum implements first transactions with new transaction types. It has new transaction types.
00:40:39
donnoh | L2BEAT:And it kind of modifies derivation a little bit.
00:40:45
donnoh | L2BEAT:For native rollups, we cannot have dedicated transaction types just for first transactions. So how can we implement first transactions?
00:40:55
donnoh | L2BEAT:Without new transaction types, and without doing crazy things.
00:41:00
donnoh | L2BEAT:The simplest thing is to…
00:41:03
donnoh | L2BEAT:Like, if L1 already has a mechanism for forced transactions, more or less, on the execution layer, the native rollups that the only thing that they do is a recursive call to the situation function, they would be able to reuse.
00:41:17
donnoh | L2BEAT:the same exact mechanism. And of course, this restricts
00:41:20
donnoh | L2BEAT:The design space for forced transactions a lot.
00:41:24
donnoh | L2BEAT:If you want to implement something else, Are this different on fossil?
00:41:30
donnoh | L2BEAT:What you can do is pass an empty inclusion list to the execute precompile, And then, have a…
00:41:38
donnoh | L2BEAT:external mechanism that does this for you. You could have, for example, a ZK verifier, that does…
00:41:48
donnoh | L2BEAT:I don't know, the check in a different way. But the cool thing about the inclusion list being an input to the execute precompile is that, for example, you can implement delays.
00:41:59
donnoh | L2BEAT:Right? So, you can pass, for example, let's imagine that this inclusion list is a queue on L1 in a smart contract.
00:42:06
donnoh | L2BEAT:You can have a delay of, let's say.
00:42:09
donnoh | L2BEAT:12 hours or 24 hours before these transactions actually are feeded… are actually feeded in the execute precompile. And this would kind of… you… you kind of… you would be able to kind of implement these delays
00:42:25
donnoh | L2BEAT:that chains like Arbitrum and Optimism have for reverse transactions, not to invalidate pre-confirmations.
00:42:32
donnoh | L2BEAT:But yes, like, I agree that this limits the design space. But native roll-ups are supposed to be very, very similar to…
00:42:42
donnoh | L2BEAT:And I don't think, you know, from a user perspective, it makes lots of… A lot of difference.
00:42:59
Jihoon:Great, great. Maybe we can have one more question if anyone has… Any?
00:43:06
Jihoon:Otherwise, we can move on to the next topic, because we have only 20 minutes left.
00:43:21
Jihoon:Alright, thank you for your presentation, Luca, and thank you for all the Q&A, and if anyone
00:43:27
Jihoon:Pop up with another question, then just feel free to ask him in the chat.
00:43:41
Jihoon:For development updates, does anyone want to share some updates?
00:43:58
Jihoon:Maybe I can go first. I'm currently adding some unit tests for inclusion lates to store.
00:44:05
Jihoon:And then I'm gonna share a document that lays out test cases. Won't be exhaustive from day one, so please feel free to contribute.
00:44:15
Jihoon:I haven't started it yet, but it would be… look like this, so…
00:44:24
Jihoon:I'm not sure where to put this. I'm gonna ask Justin about this. It may be placed under Foster for Implementer Repo, or…
00:44:35
Jihoon:kinds of spec repo, if it's possible. Not sure yet, but yeah, that's what I'm working on at the moment.
00:44:46
Jihoon:Does any client… Have any development updates?
00:44:54
nflaig:I guess from last meeting we had, the update is that we can run on 6-second slots now, since we use BPS values.
00:45:04
nflaig:This is also the updated spec.
00:45:07
nflaig:And then we updated or fixed our fork choice FCU calls to also pass the EL. I think that was one other issue, that there were empty IELTS.
00:45:19
nflaig:And yeah, pretty much what I shared on the description. So all bugs should be fixed now.
00:45:32
Jihoon:Thanks for sharing! I actually haven't tried that out, but do you still see the…
00:45:40
Jihoon:What was the error? Beacon block timeout error.
00:45:46
nflaig:Yeah, I still saw that, with Geth, yeah.
00:45:51
nflaig:used to be random, even before FULU, before EIP7805 fork.
00:45:59
nflaig:So, I'm not sure. Yeah, also we run with Fulu Genesis, so maybe there's some issue related to Fusaka, I don't know.
00:46:08
nflaig:But I don't see on the CL side what's the issue.
00:46:13
Jihoon:But you don't see such error when you are working with
00:46:16
Jihoon:other features, right? Like, we don't have such, error in…
00:46:22
Jihoon:Olesky DevNet, for example, so I think.
00:46:27
Jihoon:yeah, there's something wrong with the, get prototype, I guess. So, I… I rebased it, actually, last week, but I haven't,
00:46:38
Jihoon:had any luxury to spend my time on it yet. Yeah, let me take a look into it after I'm done with this testing stuff, and yeah, thanks for the progress on the Lone Star side.
00:46:51
nflaig:Yeah, I think I… so with REF, I also didn't see the issue. There's some random inclusion list unsatisfied blocks.
00:46:59
nflaig:Which I'm not sure, where the issue is. There's one issue I know about in Lodesta, that we use the same cutoff for attestation, review, freeze, and proposal cutoff.
00:47:11
nflaig:But I don't think that matters in a local DevNet, since all IELTs should be available before the attester cutoff anyway.
00:47:21
Pelle:That should be fixed now, though. There was a bug in just some encoding for the ILs and how we were reading it from the engine API, but in recent tests, I haven't seen any missed blocks from, unsatisfied ILs. So, definitely check the newest commit.
00:47:41
nflaig:I said, do you have an image, public, from IF?
00:47:44
Pelle:And I do not have an image up right now. I can work on that, though.
00:48:00
Jihoon:That's that for Lodestar, and… Do we have… do you have more updates on Red's side?
00:48:08
Pelle:I've been working with Katya to get the metrics working. It's… there's some issues with, like, how RETH does metrics that I'm looking into right now, but we have some basic metrics up, and then we're also looking at adding the ones you suggested as well.
00:48:32
Jihoon:Great, having that said, do you… yeah, Katya, do you wanna… Add something?
00:48:40
Katya:Yeah, hi everyone. So, regarding the metrics, we, we bumped into the problem that how to count, valid and invalid,
00:48:53
Katya:transactions, because, for example, it depends on implementation. If you bump into… if you have, like, one invalid transaction.
00:49:02
Katya:For example, how it was in Wrath, they just, break the validation, all the validation process, and that means
00:49:12
Katya:They may have one invalid transaction, and others can be considered as invalid, but in fact, they are not invalid, so I wonder how other clients
00:49:24
Katya:implement this? So, do we really… can we really count invalid transactions in this case? So, we are discussing
00:49:35
Katya:This new list of transactions, like.
00:49:38
Katya:valid and invalid size bytes, gas usage limit, is it possible to count on the EL side?
00:49:48
Katya:And also these, you know, the number of invalids. For example, for consensus layer, we just consider, the inclusion list itself.
00:49:58
Katya:If it's valid or invalid. But on the yield side, we operate with transactions, and it's a little bit tricky to count invalid transactions in this case. I don't know, Jihoon, how it is implemented on the gas side? Maybe, you know.
00:50:17
Katya:Or… or we may discuss in the Discord.
00:50:22
Jihoon:Yeah, so, on the sales side, transactions are just bytes, so they don't, you know, but…
00:50:30
Jihoon:interpret what the transaction is, that's why we just care about enclosure list on the sales side, but on the EL side, we know how to handle transactions, so we can… if we want, we can look with more granularity.
00:50:45
Jihoon:So the suggestion that I've made was just an example. I don't have a strong opinion on the metrics, so if you feel like this is too much, then, yeah, we can just decide to not add
00:51:01
Jihoon:new metrics, but on the GAT end.
00:51:06
Jihoon:When… so there's a code that checks if there is a leftover enough guest left.
00:51:14
Jihoon:to add any missing IL transaction, so…
00:51:20
Jihoon:We could use the code to… Logue whether the…
00:51:28
Jihoon:missing IL transactions, was…
00:51:32
Jihoon:Left out because of gas limit or whatnot.
00:51:38
Jihoon:from your perspective, what kind of metrics do we want to have on the EL side?
00:51:45
Jihoon:Like, even on the CL side, if you feel like we have too many metrics, then we can, you know, just trim it out and leave it with only necessary ones.
00:51:58
Katya:Yeah, I don't mind, any additional transactions, just, I want to be sure that other clients… because I think for Pele, he had to change the code to count invalid transactions, so, maybe he can add as well, like.
00:52:22
Pelle:Yeah, sorry, I think there was a little bit of a misunderstanding. When we were first talking, I was thinking invalid as in transactions that make the block invalid, not, like.
00:52:31
Pelle:invalid traction, transactions because of gas and whatnot, so that should all be fixed now, so it's not really a worry, Katya.
00:52:41
Pelle:But we should be… sorry about that, yeah.
00:52:44
Katya:Yeah, yeah, and I wonder if other clients can count the number of invalid transactions, if it's not an issue, just to be sure.
00:52:53
Katya:We can also discuss in the Discord.
00:53:02
Jihoon:Yeah, sounds great. In general, do you think… we have…
00:53:06
Jihoon:Too many metrics compared to other topics.
00:53:10
Katya:No, I don't think so. It looks…
00:53:14
Katya:It looks quite good. I would think… I started to build a dashboard, like CL and DL parts separately, but now I think, you know, that it's better to combine, for example, the metrics regarding payload, it's better to combine them on one panel, maybe.
00:53:32
Katya:And to easily compare CL and EL parts, for the metrics which correlate with each other.
00:53:42
Jihoon:But… Do you think it's better to somehow separate the CL and EL In that one panel.
00:53:54
Jihoon:It's just a, you know, design choice, I guess.
00:53:57
Katya:Yeah, that's the design choice, so, I will try to mix them,
00:54:04
Katya:As the same way as I shared the screenshot, right? So, you can see both EL and CL for this email metrics. Let's say how many transactions sent and how many transactions received.
00:54:19
Katya:So, for these metrics, maybe it makes sense to put them together, but we can still discuss whenever it will be finished. On the rev side, I will share the whole dashboard, the whole picture, and we can discuss as well.
00:54:40
Katya:If it's not an issue, for example, for EL clients to see both, CL and DL metrics.
00:55:01
Jihoon:Yeah, we can, continue discussion regarding it.
00:55:05
Jihoon:Do we have any other updates?
00:55:23
Katya:I have a quick question about,
00:55:28
Katya:engine new payload, V5. So, currently, V5 is used for block-level access lists, and it will be the same V5 for… for fossil, or it depends if it will be SFI, or…
00:55:44
Katya:I just… I don't know how versions.
00:55:47
Jihoon:Yeah, so, I think it depends on whether we…
00:55:53
Jihoon:what's it? Whether we SAFI fossil or not, so if we SAFI fossil, then we…
00:56:02
Jihoon:gonna… I think we're gonna merge those two changes into one V5.
00:56:08
Jihoon:And, yeah, so if we… the bell's already there, so I think it has priority, so if we decide to not include the fossil in Glamsterdam, and somehow, let's say, we want to add it in edge fork, then we want to use V6 or something.
00:56:38
Jihoon:All right, do we have any other updates or questions?
00:56:55
Jihoon:Otherwise, we can go ahead and wrap up this call, and…
00:57:01
Jihoon:Have another car after 2 weeks?
00:57:06
Jihoon:Thanks for joining, and have a great rest of your day, and see you guys in two weeks.

Chat Logs

00:04:27
Jihoon:https://native-rollups.l2beat.com/
00:18:59
Peter:You could fall back to permissionless sequencing if the centralized sequencer does not relay forced transactions. (Deterrent with permissionless fallback instead of "based windows”.)
00:29:24
potuz:includers will reinclude it in the next IL
00:35:22
potuz:we have weakly calls about all the subtleties of FOCIL
00:36:59
Jihoon:Replying to "we have weakly calls..." Do you want to share more about it?
00:44:01
potuz:Replying to "we have weakly calls..." it's mostly about censorship assumptions on L1, FOCIL doesn't remove the main problems
00:44:23
Jihoon:https://github.com/ethereum/execution-spec-tests/blob/main/tests/amsterdam/eip7928_block_level_access_lists/test_cases.md
00:49:33
Jihoon:Replying to "we have weakly calls..." Interesting, could you elaborate more?
00:49:35
Katya:https://github.com/ethereum/execution-metrics/pull/4#discussion_r2406702189
00:50:48
Katya:Example - execution_inclusion_list_transactions_invalid_total
00:51:44
potuz:Replying to "we have weakly calls..." yes: one assumption that rollups *do not make* on L1 is that an attacker holds < 50% of the stake. And it makes sense not to make this assumption because the rollup bridge may contain more than that value. FOCIL would be fantastic to guarantee censor resistance in less than a challenge period without this assumption, but unfortunately it needs it

Summary

11 highlights · 2 action itemsExperimental

native rollups and focil

  • Luca presents native rollups: EVM rollups using execute precompile for bug-free, auto-upgrading L2s00:04:38
  • Forced transactions difficult for rollups; most require heavy EL modifications or new transaction types00:14:10
  • FOCIL's inclusion list mechanism can implement forced transactions for native rollups without modifications00:21:17
  • Existing rollups could adopt FOCIL-based forced transactions to minimize L1 diff00:33:54

implementation challenges

  • Transaction resubmission complexity: validly omitted IL transactions need manual resubmission to contract queue00:26:29
  • FOCIL reuse assumes Engine API usage and L1-compatible validity conditions; limits design space00:39:16

client updates

  • Lodestar: 6-second slots working with BPS values; empty IELTs in FCU calls fixed00:44:54
  • Reth: IL encoding bug fixed; no unsatisfied blocks in recent tests00:47:11
  • Metrics: Reth and Lodestar working on FOCIL-specific metrics; issue counting invalid transactions00:48:40

testing and documentation

  • Jihoon: IL store unit tests in progress; test cases document to be published00:44:05
  • Geth beacon block timeout error persists in local devnets; not seen with Reth00:45:50

Decisions

  • Engine API version (V5 vs V6) for FOCIL depends on Glamsterdam inclusion timing00:53:53

Action Items

  • Jihoon: Publish test cases document for inclusion list validation00:44:05
  • EL client teams: Discuss invalid transaction counting methodology for EL metrics in Discord00:51:44

Targets

  • Next FOCIL breakout call in two weeks (October 21, 2025)00:57:04