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

BAL Breakout #003

2025-09-24 Agenda: #1738 canonical JSON

Transcript

00:00:13
Toni Wahrstaetter:Great, thank you. Hello everyone, welcome to today's EAP7928 breakout call. It's the third breakout call today, and we have three things on the agenda.
00:00:26
Toni Wahrstaetter:The first thing we want to discuss, which was already kind of a little bit discussed last week, but today we wanted to decide upon it, is are we going for a block-level access list hash in the header, or do we want to switch it out for a block-level access list root, which would then, yeah.
00:00:45
Toni Wahrstaetter:Mirror the existing tri structure we already use for receipts and transactions and so on.
00:00:50
Toni Wahrstaetter:But of course, at the moment, we use the hash, so the default might be we just stick to that, but very open to discuss that.
00:00:59
Toni Wahrstaetter:The second point is, how do we want to handle transaction self-destruct?
00:01:06
Toni Wahrstaetter:There are basically two ways how to handle them. Either we include them and make it explicit that self-destruct in the same transaction is happening, or if you followed the last messages from Jared in the Discord.
00:01:19
Toni Wahrstaetter:Basically, he's arguing for just including the address of the self-destructed account, And not including anything else.
00:01:30
Toni Wahrstaetter:And, last thing we can discuss today is…
00:01:35
Toni Wahrstaetter:an idea that Jared brought up, or Gary brought up, which is including intermediate storage account… including account storage routes into the block level access lists to speed up the hashing.
00:01:51
Toni Wahrstaetter:Those are basically the three points, and then we can go into client updates as usual.
00:01:59
Toni Wahrstaetter:Great, let's start with the first topic on the agenda, which is block-level access list hash versus block-level access list.
00:02:08
Toni Wahrstaetter:try, or root, and putting everything into a try, and let's see, would be great, Jason, it would be great if you could give us a quick, intro into
00:02:20
Toni Wahrstaetter:Why it would matter for pre-coms, and what do you actually expect getting from… from this change, from moving from the hash to a root.
00:02:32
Jason Vranek:Yeah, absolutely. So…
00:02:34
Jason Vranek:I guess in the world of pre-confs, there's different flavors. Like, we start with the basic being inclusion, which are pretty trivial to prove today using the existing tries, but as we move towards execution, there's different ways to do it.
00:02:52
Jason Vranek:But really, an execution preconf would be a guarantee on the post state. And…
00:02:58
Jason Vranek:You can do that technically today using the existing tries, like, and what I mean by that is.
00:03:06
Jason Vranek:What we care about is being able to slash The proposer on-chain?
00:03:11
Jason Vranek:And by proving that they broke their promise. And when we're using the existing tries today for execution, precomps, it's a very disorganized and scattered proof. Like…
00:03:26
Jason Vranek:If your transaction that you're committing to affects many accounts, across these different trees, or tries…
00:03:33
Jason Vranek:then it's… there's a lot more margin for error. There's kind of data availability issues if… if the proposer isn't committing to every single thing that was touched. And for all of these reasons.
00:03:48
Jason Vranek:Actually, sorry, one other important reason is a lot of the times we care about the… what we really care about is post-transaction state routes, and not, like, post-block, routes.
00:03:59
Jason Vranek:So… I think there's some…
00:04:03
Jason Vranek:information that's lost if we're only trying to prove against the final state after the block executes. So, for all these reasons.
00:04:11
Jason Vranek:Execution precoms are really done through…
00:04:15
Jason Vranek:intent-style programming, and that's, like, a burden on developers, kind of adds friction. And the proposal of using roots, instead of hashes for the BALs is that it would be pretty trivial to prove
00:04:29
Jason Vranek:From the smart contract. And the way that you'd organized it, Tony, would be…
00:04:35
Jason Vranek:A pretty straightforward commitment to a route, to cover, like, every piece of state that's touched.
00:04:47
Toni Wahrstaetter:Awesome, thank you. So, just to summarize, it feels like there are three points. It would… if we move from a block of accesses hash to a try, we would make the life of pre-conf providers easier, because the proof would,
00:05:04
Toni Wahrstaetter:would not depend on transactions touching the exact same state in the meantime, but we can get more granular and prove against a certain state at a certain transaction index. Then the proof would become cheaper, because
00:05:20
Toni Wahrstaetter:You don't… you wouldn't need to input that much data anymore.
00:05:27
Toni Wahrstaetter:And also easier, because it would just be one single proof against one object that we have.
00:05:36
Toni Wahrstaetter:So, I totally get… I can totally see those advantages. What would you say against the counter-argument that, the block of access list might be already enough, because
00:05:48
Toni Wahrstaetter:In… in case you want to slash a proposal, you would just… you would just need to input the, the entire block of access list as call data.
00:06:00
Jason Vranek:So, I mean, I definitely see…
00:06:02
Jason Vranek:that possible, because you only have to slash them in the worst case if they did break the commitment. Maybe I'm just not as clear on, like, the size of this, like, guest-wise. Are we… is that reasonable to be able to do?
00:06:18
Toni Wahrstaetter:Yeah, I think it would be, yeah, because the Block 5 accesses seems like it's around…
00:06:22
Toni Wahrstaetter:50 kilobytes to 60 kilobytes compressed. I think that's already on the upper end.
00:06:28
Toni Wahrstaetter:And, let's say 2X for uncompressed, 100 kilobytes currently would support around 900 kilobytes per block.
00:06:36
Toni Wahrstaetter:Compressed, no, call data, so this would be something that would still easily fit into the block.
00:06:47
Jason Vranek:Yeah, then in that case, I mean,
00:06:51
Jason Vranek:as long as it continues to be scalable, like, if the block size increases and the BAL also increases, if it's still able to fit in call data, I think that's definitely a good backup option, but…
00:07:03
Toni Wahrstaetter:Yeah, it's not only fitting into call data, we also need to fit in the computations needed to eventually prove it on-chain.
00:07:11
Toni Wahrstaetter:This would not be that much, we would just hash everything.
00:07:15
Toni Wahrstaetter:And compare the hashes, and then prove it against the parent, block hash.
00:07:20
Toni Wahrstaetter:But yeah, I'm curious to hear of other clients what you think about this? Another point I heard from Vitalik was
00:07:30
Toni Wahrstaetter:Putting it into a try would be a good idea for partial stateless nodes.
00:07:35
Toni Wahrstaetter:Because imagine you're a partial stateless node, and you only care about, yeah, a certain segment of the state, for example, specific addresses.
00:07:45
Toni Wahrstaetter:and you don't want to download the entire block level access list, then someone could give you
00:07:52
Toni Wahrstaetter:Parts of the block line access lists that you care about, together with a proof against the parent hash.
00:07:59
Toni Wahrstaetter:So, this might be another use case where, yeah, a try versus a hash might be, better suited.
00:08:21
Toni Wahrstaetter:Yeah, so I'm curious, do client teams have an opinion on it, especially, since it would mean introducing yet another try, which was one of the arguments I've heard.
00:08:33
Jared Wasinger:Yeah, I… I wouldn't say I'm, like, strongly against it, but I… I…
00:08:40
Jared Wasinger:I can't say I fully understand the purported benefits, and yeah, it…
00:08:49
Jared Wasinger:the added complexity is also… I mean…
00:08:53
Jared Wasinger:The… the… the proposal is already, like, done.
00:08:59
Jared Wasinger:Turning out to be complex to performantly implement and comprehensively test, so…
00:09:08
Jared Wasinger:Yeah, I mean, I want to learn more, but yeah, kind of lukewarm about it right now, personally.
00:09:25
Toni Wahrstaetter:Yeah, progress.
00:09:27
Jared Wasinger:Sorry, just… I guess one more thing we could… there's nothing stopping us from updating the BAL format in the future to support this. I mean, it's not easy, but we don't have to…
00:09:37
Jared Wasinger:package everything, all the bells and whistles in a single hard fork? No.
00:09:43
Toni Wahrstaetter:This is true, yeah.
00:09:47
draganrakita:wanted to say… wanted to say same thing. Yeah, I think ball should be minimal, and it feels that the introducing tree inside with the same fork, with the ball, seems like additional optimization that we can do later.
00:10:03
draganrakita:So I would opt in with some simpler solution right now, and then decide if we need a tree, what kind of tree, maybe it's going to be binary tree, maybe some else tree.
00:10:16
draganrakita:It seems, unnecessary to edit in this work.
00:10:26
Toni Wahrstaetter:I'm also, relaying what Marius is saying in the chat. He's also weakly against it.
00:10:38
Toni Wahrstaetter:Yeah, just to summarize, it very much feels like the trade-off here is, complexity versus this additional
00:10:45
Toni Wahrstaetter:Use case, or… What it enables, making certain things cheaper and easier.
00:10:52
Toni Wahrstaetter:Of course, at the cost of adding protocol complexity. Also, Karim is saying here in the chat that he also prefers
00:11:01
Toni Wahrstaetter:To keep it as is.
00:11:04
Toni Wahrstaetter:Anyone else, an opinion on that?
00:11:25
Toni Wahrstaetter:Then, I would say let's keep it for now as it is. I will also reach out to
00:11:31
Toni Wahrstaetter:Vitalik to… maybe he can clarify his points further on the testing call, because we have a section on updates on block of access list on the testing call anyway, so it might make sense to get his input, since he's not on the call today.
00:11:46
Toni Wahrstaetter:And it would be great, Jason, if you could publish, your post somewhere, so that devs have some
00:11:54
Toni Wahrstaetter:Opportunity to get into the topic of pre-coms, and…
00:11:58
Toni Wahrstaetter:Yeah, determine how important it would be.
00:12:07
Toni Wahrstaetter:Yeah, no worries, Lukasht.
00:12:10
Toni Wahrstaetter:The thing we just talked about is the first point of the agenda, the block that access is hash versus the root.
00:12:16
Toni Wahrstaetter:But in this case, if there is nothing else, I would suggest we move on to the second point on the agenda.
00:12:25
Toni Wahrstaetter:It's the last opportunity for anyone to…
00:12:28
Toni Wahrstaetter:Voice and opinion on the hash versus root topic.
00:12:42
Toni Wahrstaetter:Great, then let's move on to a second topic, which is how we want to handle self-destruct.
00:12:49
Toni Wahrstaetter:So, as you might have seen in the… in the last few days, I've changed… I've modified the specs a bit, because there were some bugs around edge cases, and one of those edge cases were,
00:13:03
Toni Wahrstaetter:self-destruct happening in the same transaction, so not send-all, but a real self-destruct. And…
00:13:11
Toni Wahrstaetter:In the test cases, we planned to explicitly handle self-destructs by having a post nonce in the block level access list.
00:13:21
Toni Wahrstaetter:That is set to zero.
00:13:24
Toni Wahrstaetter:So usually, you would never see, in the block level access list, a post non-soft zero.
00:13:29
Toni Wahrstaetter:But Rahul and me were thinking, okay, it might make sense to signal that a self-destruct happened by having post non-zero. What Charent was today saying in the… in the Discord chat is.
00:13:41
Toni Wahrstaetter:that sims self-destructs in the same transaction are basically no ops, and they don't change any state, we should just only include them as if they were a read, so we include the address with no changes in the blocker access list.
00:13:57
Toni Wahrstaetter:Of course, we include the balance changes if something was sent through the self-destruct.
00:14:01
Toni Wahrstaetter:But we would not include nonce changes or code changes.
00:14:06
Toni Wahrstaetter:And I wanted to double-check what clients think about it, and what would be the best way to handle a self-destruct.
00:14:12
Toni Wahrstaetter:Maybe, Jared, you could also give us your rational behind.
00:14:19
Jared Wasinger:just wanted to point out, also, that I don't think there would be a balance change in this case, because…
00:14:30
Jared Wasinger:Yeah, it has to be non-existent in order for it to be deleted, created and deleted in the same transaction.
00:14:37
Jared Wasinger:Yeah, I think you,
00:14:39
Jared Wasinger:summarize my main point well, er, well, also, another thing that I was saying is that I feel like…
00:14:48
Jared Wasinger:every other… In every other instance where we…
00:14:55
Jared Wasinger:have account fields in the BAL, other… other than for storage reads. It, it's for…
00:15:06
Jared Wasinger:A situation where the post state is different than the pre-state.
00:15:10
Jared Wasinger:And so… Having this special case, for, for self-destructs.
00:15:20
Jared Wasinger:Kind of breaks this… It's sort of just not consistent with the rest of the…
00:15:29
Jared Wasinger:of the design for BALs,
00:15:34
Jared Wasinger:Yeah, I'm not sure what direct effects that would have, but it's just kind of another…
00:15:40
Jared Wasinger:Just seems kind of… Yeah.
00:15:46
Toni Wahrstaetter:Yeah, you're totally right.
00:15:48
Toni Wahrstaetter:Yeah, the question, the underlying question, maybe, would be, do we want to differentiate by just looking at the block access list, do we want to be able to differentiate between an account that is, for example.
00:16:00
Toni Wahrstaetter:Accessed through balance opcode, or call opcode?
00:16:04
Toni Wahrstaetter:Versus an account that is involved in a self-destruct. So, it is deployed in self-destruct.
00:16:10
Toni Wahrstaetter:And it feels like there's no…
00:16:14
Toni Wahrstaetter:we don't really need it, right? Because what we care about in Block Live Exorcist is really, like, what is the difference between the pre and the post state, or what actually changed, and what is the post state.
00:16:25
Toni Wahrstaetter:And since there is no change involved, it might just make sense to treat it just like a read.
00:16:33
Toni Wahrstaetter:Without any special meaning.
00:16:42
Toni Wahrstaetter:Also, also, jargon to answer the question that you raised in the chat, why do we need special case for self-destruct?
00:16:49
Toni Wahrstaetter:It does not remove the storage,
00:16:53
Toni Wahrstaetter:the self-destruct that happens in the same transaction does remove the storage, right? It removes the storage that
00:17:00
Toni Wahrstaetter:was there after the deployment, that you wrote to it after deployment, but compared to the pre-state, it would be the same. I guess that's what you're up to.
00:17:11
Toni Wahrstaetter:If you have a self-destruct in the same transaction, then the pre-state and the post state would be the same, because the account is eventfully deleted.
00:17:19
Toni Wahrstaetter:And the nonce would be reset to zero, which it was before the transaction.
00:17:33
Toni Wahrstaetter:Yeah, it feels like this is, like, the cleanest way to go.
00:17:37
Toni Wahrstaetter:But just to flag it.
00:17:41
Toni Wahrstaetter:just reading the chat, what Philippe is saying, I guess the argument is to save space, yeah. Yeah, go ahead.
00:17:48
Jared Wasinger:I guess we should also, include, like, so we should determine when you create a… an account.
00:17:56
Jared Wasinger:within the same tran- and destroy it within the same transaction, but it reads storage. That kind of seems like it might be an edge case worth addressing in the specs.
00:18:10
Jared Wasinger:So, an account that is deployed, and then it reads from another account, for example, the balance, and then it is… I mean, like, an account… account that is created in the transaction, it… it does something… it either writes or reads its own, storage…
00:18:28
Jared Wasinger:and… and then self-destructs, like…
00:18:35
Toni Wahrstaetter:Yeah, this is interesting. Yeah, go ahead.
00:18:39
Marius van der Wijden:Those streets and rights would not end up in the tri anywhere, right?
00:18:44
draganrakita:That's a good question.
00:18:45
draganrakita:That's the questions I wanted to ask.
00:18:48
Jared Wasinger:They wouldn't… I'm saying, test coverage, it's worth it to have that case be.
00:18:55
Marius van der Wijden:Yeah, definitely, we need to find that.
00:18:59
draganrakita:The question is, if account is created, and some storages are accessed.
00:19:05
draganrakita:Does those stages get included in the bowl?
00:19:14
Marius van der Wijden:If the account is not self-destructed, then yes. If the account is self-destructed, then the same… Transaction, then no.
00:19:25
draganrakita:So that will be a difference.
00:19:27
draganrakita:That would be a big difference, because if you just… but what if you, like…
00:19:32
draganrakita:Create account, then access some… just load the storage.
00:19:38
draganrakita:You still want to have it in the reads.
00:19:40
draganrakita:But if you create an account.
00:19:43
draganrakita:check some storage, then self-destruct. You don't want to have that storage.
00:19:52
Jared Wasinger:Honestly, I think it's… it probably is such a rare enough occurrence that it… it should just be included in the BAL, and we shouldn't have a special case.
00:20:04
Toni Wahrstaetter:Yeah, I tend to agree with that. So there… it feels like there are two cases. We deploy an account that then accesses something from a different account. For example, I deploy a contract that then accesses, I don't know, USDC, and then I self-destruct. Versus, I have a contract that is deployed.
00:20:24
Toni Wahrstaetter:It accesses its own storage, or writes to its own storage, And then self-destruct.
00:20:32
Toni Wahrstaetter:Because for the first case, if we change some… if we change something in a different account.
00:20:37
Toni Wahrstaetter:we still want to include it in the block lab access list, even though
00:20:42
Toni Wahrstaetter:The account that is calling is self-destructed.
00:20:45
Toni Wahrstaetter:It's more about what do we do about the account that is, in the end, self-destructed.
00:20:51
Toni Wahrstaetter:And there it feels, like what Jared just said, we just include everything that is accessed along the way.
00:20:57
Toni Wahrstaetter:in the block lab access list as a read.
00:21:11
Toni Wahrstaetter:Okay, great. Currently the specs are off on that.
00:21:15
Toni Wahrstaetter:on that front, because we, I just pushed something to the specs, like, yesterday, so you might see those, commits with fixed self-destruct logic or something. I will revert those so that the specs actually match what we… match the ERP again, and I might also clarify that further in the ERP.
00:21:35
Toni Wahrstaetter:To make sure that we include all state
00:21:40
Toni Wahrstaetter:Including addresses and storage keys that are accessed during, until the self destruct in the block lab access list.
00:21:48
Toni Wahrstaetter:Is there any other edge case,
00:21:51
Toni Wahrstaetter:We should, think about when…
00:21:54
Toni Wahrstaetter:changing the EAP or the specs that I forgot.
00:22:00
Jared Wasinger:I think you mentioned it earlier, but there was the other…
00:22:03
Jared Wasinger:Just the stuff about the precompiles.
00:22:08
Jared Wasinger:Calling a pre-compiled address would be included as a read.
00:22:16
Toni Wahrstaetter:Yeah, this is another thing that is underspecified in the AP. Yeah, I agree.
00:22:20
Toni Wahrstaetter:And it will probably be specified, like, all the precompiled addresses that are accessed.
00:22:28
Toni Wahrstaetter:in a transaction must be included as a read.
00:22:34
Toni Wahrstaetter:Which would mean including only the account with all MTA changes.
00:22:43
Toni Wahrstaetter:The question is, do we really need it? Because, for example, we assume precompiles are warm by default, for example.
00:22:51
Toni Wahrstaetter:Do we really need to know, which pre-compiles are accessed?
00:22:57
Toni Wahrstaetter:Because it's different for every other part of the state that actually
00:23:02
Toni Wahrstaetter:Has something on disk behind it.
00:23:15
Jared Wasinger:to be honest, I'm… I'm not actually sure in Geth if we…
00:23:19
Jared Wasinger:if the code path for executing precompiles would result in them being included in the BAL as a read currently. I mean, I could see…
00:23:29
Jared Wasinger:The justification for… omitting them.
00:23:33
Jared Wasinger:I don't… I personally don't really lean strongly either way, as long as it's… specified.
00:23:44
draganrakita:What about if we transfer some value, it, to the… We compiled.
00:23:52
Toni Wahrstaetter:Yeah, this is different. In that case, you must include it. So if you… if you send to the precompile, we always have the balanced diff of that precompile.
00:24:03
Toni Wahrstaetter:In the block file access list.
00:24:05
Toni Wahrstaetter:It's more like… Should we include the precompile?
00:24:11
Toni Wahrstaetter:For example, if a storage key is red, then we have the storage read change in the account changes object.
00:24:19
Toni Wahrstaetter:If an account is read, for example, through the call-up code, or static call, or balance, and so on.
00:24:25
Toni Wahrstaetter:Then, we have an account in the block club access list with all empty changes.
00:24:30
Toni Wahrstaetter:And what I would think is if we… so we don't have a mapping to a transaction index for REITs, right? This is important to, note here.
00:24:40
Toni Wahrstaetter:So we don't have a mapping from reads in the block of exorcists to the
00:24:45
Toni Wahrstaetter:Transaction indices, which would mean for precompiles.
00:24:49
Toni Wahrstaetter:we would know, okay, this precompile will be accessed in this block, but we would not be able to map it to a transaction, just like
00:24:57
Toni Wahrstaetter:we cannot map any read in the block level access list to transactions. So, I lean towards omitting the precompiles from the reads.
00:25:12
Toni Wahrstaetter:But I'm happy if it's, like, simpler to just add them, I'm also happy to do that.
00:25:18
draganrakita:Just imagine if we have balance of code that targets pre-compiled.
00:25:23
draganrakita:So, in that case, we'll have something different.
00:25:27
draganrakita:Where we need to omit pre-compilers to get that case, yeah. For the calls, that's more specific to precompiles, because there is some different path, other than executing the contract.
00:25:41
draganrakita:To be honest, I would… yeah, I would include it, but I don't have strong stance here.
00:25:49
Toni Wahrstaetter:Thank you very much, Lucas.
00:25:51
Łukasz Rozmej:I'm for omitting it, because we don't even track it internally. I know that GEF tracks it internally, but we have a simple if in code, and we can just not track them, which…
00:26:02
Łukasz Rozmej:It's just also an additional optimization.
00:26:05
Łukasz Rozmej:So I would, I would admit that it's worthless information, in my opinion.
00:26:14
Toni Wahrstaetter:Yeah, I agree with that, but it feels like it would be an edge case
00:26:19
Toni Wahrstaetter:Compared to how we track all other calls.
00:26:22
Toni Wahrstaetter:Because suddenly we would be like, okay, now a precompile is called, so we don't care.
00:26:33
Łukasz Rozmej:Okay, but what's the purpose? Just completeness?
00:26:38
Toni Wahrstaetter:Yeah, or using existing code. For example, if you put the tracking function on top of the call.
00:26:47
Toni Wahrstaetter:Then you don't need any edge cases to handle a call to a pre-compile differently to a call to any other contract.
00:26:58
Toni Wahrstaetter:At least in the specs, I think in the specs it's tracked right now, because in the specs, there is basically a tracker that wraps around all the state changes.
00:27:09
Toni Wahrstaetter:And it doesn't differentiate between a pre-compiled being called or any other contract. If I remember correctly, I would also need to double-check that.
00:27:22
draganrakita:And if we compare this behavior with access list, we are including only the accounts from… not all accounts from Axis, but only accounts that got, accessed.
00:27:35
draganrakita:It's a slightly different version, but… Yeah.
00:27:44
draganrakita:Yeah, you can argue that you can remove all the accounts that are found inside access list.
00:27:52
draganrakita:I don't think that nobody wants that, but just for the argument's sake.
00:27:57
Toni Wahrstaetter:Yeah, currently we treat, for example, no matter if a balance opcode happens or a call opcode, we treat it exactly the same.
00:28:04
Toni Wahrstaetter:And here, for example, if a transaction calls the balance of a precompile, then we would need to add it, right? No matter if we decide to omit the precompile reads or not, we would need to add it, because we do want to know that this contract is going to be read.
00:28:22
Toni Wahrstaetter:But on the other hand, if a precompile is called, Doing some computation.
00:28:27
Toni Wahrstaetter:Then we would need to manually omit it.
00:28:31
Toni Wahrstaetter:And to me, right now, it feels like it would be cleaner To just keep them.
00:28:37
Toni Wahrstaetter:in there, but I can see the argument why this might just be unnecessary data, if this precompile is, like, called.
00:28:48
Toni Wahrstaetter:Yeah, with something like call or static call.
00:28:56
Marc:I mean, it seems like it would be…
00:28:58
Marc:Relatively easier to, if you are tracking it, just have an exception and not log the precompiles than to…
00:29:06
Marc:Like, for… on our side to change stuff.
00:29:09
Marc:So that we are tracing these accesses.
00:29:15
Marc:Yeah, it just seems easier to… the other way around, I guess, and also the data isn't really useful.
00:29:24
Toni Wahrstaetter:So, you would also say we should omit the reads. So, every time when a precompile is,
00:29:32
Toni Wahrstaetter:Access through call or static call.
00:29:35
Toni Wahrstaetter:it should not be included in the popular access list, but if it is accessed through balance, or Xcode size, or something, then we should include it.
00:30:00
Toni Wahrstaetter:Any other opinions on that?
00:30:12
draganrakita:Yeah, well, I'm not sure if this is to type, but yeah.
00:30:17
draganrakita:In that case, we'll have, like, the different behaviors, depending on if it's call opcode, or it's balance opcode, or some else, by the opcode.
00:30:28
Toni Wahrstaetter:Yeah, I have no insight into client code, but I can definitely tell in the specs and the execution specs, this will make things a little dirtier.
00:30:36
Toni Wahrstaetter:I guess there will be a simple way to change it, but this is the first time I really have to… I would really have to differentiate between call and balance, for example.
00:30:56
Marc:I guess I don't have a super strong opinion, like, maybe if I could…
00:31:01
Marc:Kind of look at the code a bit more, and if it turns out to be, like.
00:31:06
Marc:A lot more com- complex, and…
00:31:09
Marc:Yeah, I just need to review it, really, to kind of determine.
00:31:16
Toni Wahrstaetter:Yeah, sounds good.
00:31:17
Toni Wahrstaetter:I would say we, for now, we just keep it as is. Right now, it's kind of underspecified in the EUP, but
00:31:26
Toni Wahrstaetter:I will add some proper specifications on that, but right now it would be tracked.
00:31:32
Toni Wahrstaetter:So, if it's accessed through a call, it's in the block of access list, and if it's accessed through a balance, opcode, it's also in there. And if… if the precompiler even sees a balance change, it's even in there with a balance change.
00:31:49
Toni Wahrstaetter:Map to the transaction index.
00:31:53
Toni Wahrstaetter:We can still, re-evaluate that decision in, like, in two weeks. I think it's good that we brought it up, and clients have,
00:32:02
Toni Wahrstaetter:Clients know that this is something we should look into and get some clearance on it.
00:32:07
Toni Wahrstaetter:But then I would say, let's just, yeah, keep it as is, and if we decide in two weeks that
00:32:14
Toni Wahrstaetter:Yeah, we were wrong, and we should actually do it differently, we can still do it.
00:32:33
Toni Wahrstaetter:Yeah, this was, the last, topic we had on the agenda. Last thing would be just client updates. Should we directly start with Jared Gaffigan?
00:32:48
Jared Wasinger:Yeah, sure. I… I think we had one more thing we wanted to talk about, actually.
00:32:58
Jared Wasinger:Well, I brought it up in the chat today, so there was this idea in the BAL
00:33:06
Jared Wasinger:to… there's this idea to commit in the BAL to the, the post…
00:33:15
Jared Wasinger:state, try root for, storage tries, and essentially what that would enable us to do is fully parallelize the account try and storage try, hashing.
00:33:29
Jared Wasinger:And I had brought that up as a… because that was a suggestion from Gary on our team, but,
00:33:37
Jared Wasinger:Just wanted to say that,
00:33:42
Jared Wasinger:It's not clear from the guest side whether… what the benefit of that change would potentially bring.
00:33:49
Jared Wasinger:But the reason I brought it up in the channel was to, to,
00:33:58
Jared Wasinger:Just try and put it on people's radars as something to explore.
00:34:04
Jared Wasinger:And we will definitely be doing that, yeah.
00:34:13
Toni Wahrstaetter:Okay, yeah, this is interesting. Just to summarize, this would mean the block of access list would additionally
00:34:20
Toni Wahrstaetter:Contain, for each account, The post-storage route of that account.
00:34:27
Jared Wasinger:So, yeah, so if the account had modified storage, we would include the root. I mean, we could, of course, include the root for every account, but we could also… it could be limited to ones with modified storage.
00:34:42
Toni Wahrstaetter:Okay, and it will be the post…
00:34:45
Toni Wahrstaetter:State of the post, the state after the block, and not,
00:34:50
Toni Wahrstaetter:Each transaction, right? Okay.
00:34:54
Toni Wahrstaetter:Yeah, this is definitely interesting. Curious if other clients… we don't need to decide upon that today, and I think Gary even said he wants to keep that on client-level optimization.
00:35:06
Toni Wahrstaetter:But they are curious if other clients…
00:35:09
Toni Wahrstaetter:Clients have an opinion on that, or thought about it.
00:35:14
Toni Wahrstaetter:I see Karim advocating Even for putting it into the popular access list, I guess?
00:35:27
Karim T.:is for computation, I think it would be nice to…
00:35:30
Jared Wasinger:I guess I'll just say that my impression right now is that most of our bottleneck with the state root update is in loading the intermediate nodes, so…
00:35:40
Jared Wasinger:It's not clear in the end how much this… how much being able to fully parallelize the updates between the account try and the storage tries will bring, but…
00:35:51
Karim T.:I think in Bezoo, we have this kind of preloading, so we can preload,
00:35:57
Karim T.:Intermediate node, and today the main part is doing the… Okay, check computation of intermediates.
00:36:06
Karim T.:And mainly also for the account part, because the storage are done in parallel.
00:36:11
Karim T.:So I think if we can, at the same time…
00:36:15
Karim T.:compute the state root of the tree account. I think it will help for performance, but I'm not completely sure.
00:36:29
Toni Wahrstaetter:Yeah, this is definitely an interesting change. I think we should…
00:36:33
Toni Wahrstaetter:Proceed with it, you know, and then we first get some more data, how much we would actually get from that.
00:36:41
Toni Wahrstaetter:keep the design of blocker access list as it is right now, and just keep it in our… yeah, in our mind that this is, a simple optimization, because
00:36:52
Toni Wahrstaetter:Just in terms of additional data footprint, it wouldn't add that much.
00:36:57
Toni Wahrstaetter:So it's, it would only be, like, 32 bytes per changed account, so this would not be the problem.
00:37:04
Toni Wahrstaetter:But yeah, let's keep it as it is for now, and…
00:37:09
Toni Wahrstaetter:In case we ever, need to speed up, the hashing.
00:37:16
Toni Wahrstaetter:Then we can still edit.
00:37:29
Toni Wahrstaetter:Great, yeah, thanks for reminding me, almost forgot that point. Any other opinion on that?
00:37:43
Toni Wahrstaetter:If not, I would just suggest we continue with the client updates.
00:37:50
Jared Wasinger:Yeah, sure, I can give a brief update,
00:37:53
Jared Wasinger:there's not too much that has changed from our side to report here. We're still… we're working on improving the performance right now, and…
00:38:07
Jared Wasinger:assisting where possible with the DevNet work. So right now, most of the bottleneck for us is in Geth is the…
00:38:18
Jared Wasinger:state route update, so that's where…
00:38:23
Jared Wasinger:That's where we have and will be focusing on in the immediate future.
00:38:29
Jared Wasinger:And, yeah, that's it.
00:38:34
Toni Wahrstaetter:And what about Millamide?
00:38:40
Marc:On my side, just, trying to get our implementation to pass the execution spec tests, just debugging a few differences in the, encoding format.
00:39:00
Toni Wahrstaetter:Thanks, yeah, and just to add on that, also one of the execution spec tests is now wrong, the one affecting self-destruct, so ignore.
00:39:08
Toni Wahrstaetter:this one for now, Rahul will fix that, as sooner.
00:39:13
Toni Wahrstaetter:As I fix the spec.
00:39:16
Toni Wahrstaetter:Just as a notice. Let's continue with Bezo.
00:39:21
Karim T.:Yeah, so today we implemented the engine API, we are passing the reference test. We are trying to run a local devnet with Git and Bizu.
00:39:32
Karim T.:But for the moment, we can see that the blocks created by Bezo are refused by GET, so we are trying to investigate why.
00:39:42
Karim T.:But I'm not completely sure, but it seems that the block created by GET are accepted by Viso.
00:39:49
Karim T.:So… so the next step is to debug and understand why our block access is not valid.
00:40:00
Toni Wahrstaetter:Interesting. So you… this might be something we didn't…
00:40:04
Toni Wahrstaetter:Catch, we didn't call with the… With the test yet?
00:40:10
Karim T.:I think yes, but for the moment, we just saw that before the meeting, so we didn't have time to… to check more.
00:40:17
Karim T.:But, I feel that, yeah, maybe we are missing something in the testing.
00:40:24
Toni Wahrstaetter:Okay, thank you.
00:40:34
Toni Wahrstaetter:Is someone from Aragon here?
00:40:39
Toni Wahrstaetter:Otherwise, let's continue with ref.
00:40:51
Ishika:Yes, not, much we got to do.
00:40:55
Ishika:Concerning the changes, we were running the new sets of the, tests, and, like, it works pretty well with the consume RLP, but we have some blockers concerning the consumer engine. We are currently looking into the locks and trying to investigate the causes. We'll come to a conclusion soon, I believe. Yeah.
00:41:18
felipe:I'd like to… Yep. About the test, too. The latest release, so if it's for Consume Engine.
00:41:28
felipe:We do have updates there. We were using V4 instead of V5.
00:41:33
felipe:And so, I'd like to get a new release out, that has all of the updates, and I'm planning on
00:41:41
felipe:Getting this out by today.
00:41:44
felipe:So look out for a new release of the tests.
00:41:53
Toni Wahrstaetter:Awesome. Thank you very much.
00:42:00
Toni Wahrstaetter:Great. Is there anything else we should discuss on this call? Something we should bring up?
00:42:16
Toni Wahrstaetter:If not… I would suggest we can end the call at this point.
00:42:28
Toni Wahrstaetter:Dan, thank you very much, Erwin.
00:42:31
Toni Wahrstaetter:And see you on the next one.
00:42:32
Toni Wahrstaetter:Call in 2 weeks.

Chat Logs

00:07:46
Marc:is there analysis of how large the BAL would be with much higher gas limits?
00:09:06
Toni Wahrstaetter:Replying to "is there analysis of..." they scale quite linearly, there's an size analysis on blockaccesslist.xyz, if you scroll down to the post of Maria
00:09:15
Karim T.:It will not impact performance to compute this new trie also ? All the hashes of the intermediate node
00:09:49
jochem-brouwer:All the BALs and whistles :)
00:09:51
Jason Vranek:tried to summarize the argument for preconfs here https://hackmd.io/rY776_v6T8u9vqzzJCtGPg?view
00:10:09
Marius van der Wijden:Replying to "It will not impact..." Its pretty small, so not really important
00:10:23
Marius van der Wijden:I also lean weakly against it
00:10:48
Karim T.:I will prefer something simple also
00:12:01
Łukasz Rozmej:I'm late to the party, reading the proposal….
00:16:31
draganrakita:Why do we need special case for selfdestruct, it does not remove the storage?
00:17:09
draganrakita:Yeah forgot about it
00:17:30
draganrakita:Just having read of account makes sense
00:17:38
felipe:I guess the argument is to save space in the BAL then? If there is no use for distinguishing between these cases, I think this makes sense.
00:18:45
raxhvl:The state changes for self destruct will be at cache layer and doesn't really write to state.
00:20:04
Karim T.:Why not adding this slot as a read ?
00:22:14
felipe:We have a PR for [self-destruct] open too. We will wait for spec changes and add these expectations to the tests before merging.
00:22:41
Łukasz Rozmej:On prev topic: I like the BAL root in header, but to have final opinion about it I would have to see some more detailed spec. I agree that it increases complexity, but not sure how much. We could ship it later, but depending on the final complexity could be shipped now.
00:23:28
Łukasz Rozmej:we don't need precompiles in BALs
00:24:16
Łukasz Rozmej:Geth tracks precompiles access internally, but Nethermind currently doesn't
00:25:34
Jared Wasinger:Replying to "On prev topic: I lik..." Without linking it via the hash in the header, you have no guarantee that a MiTM doesn’t modify the BAL and make the block invalid
00:26:36
draganrakita:For BALANCE opcode you would be missing precompile
00:26:56
draganrakita:Or any opcode that fetched this from account
00:30:00
Łukasz Rozmej:ah to be honest not that much difference
00:30:10
draganrakita:I don’t like two types of behavior like that
00:33:10
Łukasz Rozmej:Replying to "On prev topic: I lik..." yeah but that should be cheap?
00:34:00
Toni Wahrstaetter:I guess you'd need that on eht block-level (with the post-storage roots of accounts after that block) instead of the tx-level?
00:35:02
Karim T.:I think it’s a good idea to have the modified storage root
00:40:13
Jared Wasinger:Replying to "On prev topic: I lik..." true
00:40:40
Jared Wasinger:Replying to "On prev topic: I lik..." Also, the BAL should be committed to in the block hash. So having it in the header seems natural to me
00:41:55
Ishika:thanks that will be helpful

Summary

6 highlights · 3 action itemsExperimental

bal design decisions

  • Keep BAL hash vs root structure as-is; defer trie complexity00:00:03
  • Self-destruct in same transaction: treat as read only, no special handling00:12:46
  • Precompiles included in BAL for all opcodes; no call-type differentiation00:29:57

client updates

  • Geth focusing on state root update performance bottlenecks00:37:53
  • Besu blocks rejected by Geth in local devnet; investigating validation issues00:39:15

testing progress

  • New test release (v5) for Consume Engine coming today00:40:48

Decisions

  • Keep BAL as hash in header; defer trie structure optimization00:09:34
  • Same-transaction self-destruct treated as read with no state changes in BAL00:17:30
  • Include precompiles in BAL for all access types; re-evaluate in 2 weeks00:31:53
  • Defer post-storage root optimization; keep current BAL design00:35:53

Action Items

  • Toni: Reach out to Vitalik for input on BAL root vs hash for testing call00:11:14
  • Jason: Publish preconfs analysis for developer review00:11:54
  • Toni: Update EIP-7928 specs: clarify self-destruct handling and precompile inclusion00:34:22