eth_simulate Implementers' Meeting #51

eth_multicall and eth_simulate Meetings · 2 Jun 2025 · 37:05

A meeting of the developers working on eth_multicall and its successor eth_simulate, held on 2 June 2025. Client and tooling teams compare implementations and work on the specification for simulating transactions. This meeting covers a client implementation update and the spec for eth_simulateV2.

Topics

From eth_multicall and eth_simulate Meetings, hosted by Ethereum Foundation.

Transcript

Is it going to be it's going to be like a small call it seems? >> I I guess that's fine. I just read your messages like >> and I didn't is that I need to pull the hard changes and then that I I can't remember how this thing works again. >> Yeah, you just need to merge in my changes and I think that will be fine. Um, I am right now trying to sorry I have some call fix. I guess don't need

to be synced. Okay. Yeah, I'm loading the test results now on my machine. >> Do you guys want to just take a minute and check some of them? >> Yeah. >> Okay. For some >> there was some difference between red, I guess. >> Yeah. Okay. But now I don't know why it did not run and bizu. only run.

>> If you have the test suit working, then I'm not sure if I need to merge mine. We could start just using your and then try to get those merged to the actual repository, >> right? That's that's also fine with me. Yeah. [Music] And you you just were telling about the red issues but is the nethermind with the nethermind is get agreeing with nethermind now well or is there still something we haven't gotten any update from nethermind for a while so I don't know what's the >> okay so

>> these are nethermind failures >> they test there's some test messages which I usually when I if the message is different there's no it still complains about them even though it shouldn't and then there's some numbers or there's different more differences than there >> okay this one for example um never mind is reporting an error whereas get processed it transaction cost is higher than sender balance That might be about some assumption about how much they are ready to pay.

Yeah. I mean it's kind of interesting that we are processing it fine. But yeah, they need to go to look at the test since don't share what's the test. No, it's in the test is there as well. >> Um, right. Then we have block hash simple. Okay. block hash. I guess we those will anyway fail probably.

Well, I was hope hoping that those were were figured out by now already, but since at at some point we're discussing that there were some issues found for now. It seems like that kind of like transaction cost is is that the transaction cost error in the many of them denominator. >> This seems to be repeated. That's a different one. >> This is different.

Uh empty with block num set first block. >> Okay. So here we can finally see some changes in the block structure. All right. Um, excess block >> and get is not reporting with root I >> But we do traces. What is this?

We never had this. That's probably mistake because they >> they added the tracing version and maybe the in this version the tracing is just empty but when you are calling tracing API then maybe it's filled but yeah it shouldn't be there. >> Yeah, I'm guessing they use the same object for both as a problem. >> Yeah, I mean this should be also as you see here difficulty is increased for some reason. It should not be I think difficulty should stay the same. Um yeah, hash is different.

>> has this change somehow because this output looks different than it used to be >> like now it's showing it the difficulty chase in the same rhyme that it's just the minus minus and plus+ and I think >> used to print it like that. >> So I think hive is different now. Yeah, they've this is the high viewer. It's a command line that will show you the test results. >> Yeah, I have been using Yeah. >> Um, and I think it's not even the latest version. I did not build the latest. So, it's >> okay.

>> The newer one, it looks somewhat. >> I guess I'll be using even older one because the output is bit different as well. >> This size thing, we never figured this one out. Um, state root different. This is interesting kind of because it implies that something in the state is also different. >> Well, is it that the difficulty already? >> No difficulty. No, that should not influence the state. Maybe if the gas cost or something would have been different. >> Yeah. And the with travels route is not shared. So that also might be different.

We don't know it. H >> but I doubt because I I would imagine that that's just the zero or the empty robles. >> I mean I'm kind of sure that we do emit these kind of things. Um >> then it might be that you're running against older version of the get or somewhere else has broken the end points. Okay, this is something that I have to check out. But for now, I think um if we can collect a list, let me just quickly spin up a note. Um difficulty seems to be increasing that

we had the transaction cost and What was that the difficulty means nowadays? We had discussed about that but I forgot what it means. >> So the difficulty I think it should stay the same as the original. >> But what is difficulty? It's a isn't originally it was the hash or how much uh kind of in the proof of work how much how the difficult it was but then we move proof of stake and it is what changed what it means but I thought it was it was changed to be the the the

random oracle or something like that >> but that doesn't look like very random number >> no this is not random I mean wasn't that difficult is supposed to be zero afterwards. >> Oh, then both of those look weird. It should be zero. I think we had discussed about it before, but I forgot what like mix has zero there. >> I can quickly check. >> Oh, was there a new fork and it was again repurposed something else?

Um yeah, down in this one I will check but as far as I know that we just basically take the parents difficulty and then keep it um >> like there's a total difficulty and that number also looks good. >> Yeah, total difficulty. Didn't want didn't we want to remove that? >> Yes. Well, I mean lots of people want to remove it and the problem is backwards compatibility complaints blah blah blah.

>> No, but uh I mean it's removed from the official spec now. So yeah, I think it was >> it was it was never in the official spec in the first place, right? in the a API spec. >> Oh, in the API spec. I don't know if there that's a good question. I don't know if I was thinking of consensus spec. It's never in the header. >> Um, yeah, I'm pretty sure that uh like two three months ago. Uh this this PR was merged that removes total difficulty from the responses.

>> Yeah, here it is. share it. >> So it should be removed. >> And if you're going to add the note the nether that needs to be removed. >> I don't think in our spec in the simul I don't think we are mentioning that. >> Yeah. Um okay. So this should be removed right. Okay. But uh reading this then it means that for some reason yes G is not returning withdrawals withdrawal route.

This is something that I will have to look into. And also parent beacon block route. but yeah so that's okay. Let me write that down as well. Have to check our note. Well done. I think it might be that because it's empty, we skip it. it I have the I just met Gurak about our get node and it say that vual is empty and it's there.

>> Okay. >> So it might be that you're running a test against something bro something else. or it also we are not probably we are running quite new get I think >> at least after the fork get we are running but we haven't updated after the fork >> like here there's no difference right so in >> some special case >> in some cases it's skipping it and It might be because of the chain config.

>> But why it's the chain context should be the same for all of these. >> All of the tests run against the same fork, right? >> Yeah, they should. >> We are not testing different forks. >> So then it's weird. It's if it's missing something somewhere, >> right? So in this case it's only these two. Uh then there's the hash is still different >> because but I'm sure that this is because the state root is different. >> But then why the status is different?

>> This is quite an important one. Um >> do we have cases where the state root is the same? >> Oh, this is like empty request even. >> So this should be very easy to find out. >> And the parent has his return. Yeah. So, it's alo there used to be a bug in the Nethermine that was using the wrong parent and now it should be using the same parent because the hash is the same. >> So, >> these are these are Nethermind versus guest, right?

>> Yes. >> Should we reach out to Lucas and see what's going on with Nethermine? Have they been making progress or is it kind of stalled out? >> I think so. I think that what's best is if we like go with concrete things and basically be like hey the these are the things >> I I see you're trying to find you're trying to go through this and see if any of this is a bug and guess and if not then we can say we just go to them and say fix all these.

>> Got it. >> Yeah. So this one I think it's interesting to investigate because it's a empty request. So it should be very straightforward to to know what is the correct state route. >> State route can also change um from validator withdrawals. Is that correct? >> Yeah. In this case the withdrawals are empty.

Um but it can also change because of the EIP 2935 like the history >> time stamp also used to be an issue but now the time stamp is given and it's the same as well. So that cannot be either the size is actually different as well. But >> what's the other what is the EIP that makes it so the state route can change without transactions? >> 2935 uh where the historical block hashes are taken from the states.

>> Yeah, exactly. >> Uh did that land in the most recent hard fork? >> I think it was in Peterra. >> Is this are this test against Spectra or something older? That's a good point. Well, we have >> but has this chain forked already? I don't know if the if the config has been updated for that. >> Um I believe it is against pectra but I this is easy to check actually.

>> is it about the which config is been used for the generous block? Oh, it's >> okay. So, the prog time is set. I can see it. It is in Prague. >> Then the Prague time stamp is 450. >> And is it bigger than that text?

>> Yes, it is bigger. >> this lecture block >> well that size is also interesting that that we never figure out what cause the size difference but I guess there wasn't good definition of what count as a size >> yeah that doesn't contribute to the block hash anyway so I would say that's >> um that's one is okay we can leave it for past.

Um but yeah, so anyway, anyway, this one was easy. >> Now the traces should be returned. Never mind. >> Yeah, this one we have way more differences. It doesn't set everything.

>> So it's a simple value transfer. >> Yeah, it's sending an ET transfer and then the ET logs is not disabled, >> right? But why is the gas use then different? Like what gas use should not be zero, right? >> Left side left side or left side never mind. The the minus signs is for nethermind plus sign is for guest. >> Can you open the truncated ones? >> Is there anything else?

>> Yeah. And the transaction there's alo disagreement on what was the transaction. So the transaction hash is >> and the traces is weird because the traces look like that should be the call. what's in the calls. But I think the diff generated by the hive is wrong here. And I think that's not I would imagine that's not actually what's been returned. >> H >> like there's the the gas used which is equals to what what Gab is returning. It's just in the kind of wrong place. >> No, I mean the gas used here doesn't match the gas used here. I don't get it.

Like I mean I I >> that is the what? Yeah, the nether mind is in the trace says that but yeah the gas used in the plug is different than in the >> exactly I think this is probably something that has to be fixed. I don't I don't why it can be >> when you score higher there's the calls and yeah there's the both are agreeing that there was a goal with that gas used and it's not in the block it's not even >> I wonder if the gas used is always zero or not never mind >> yeah um so let's jot this No, when I'm making call to net the gas

is not always zero. I'm getting actually the block for block it's always zero. So they're missing the so the blocks cashio seems to be always zero. >> And then we have the transaction hash which is different. But in this case, we don't have the full body, so we can't tell. >> Yeah, somewhat it iterative approach is good that those would be fixed and then we run the test again and then we see again how they changed and then I can

run again. So the gas zero here again. >> Yeah, I just made a cure against Nethermind and I'm I was also getting zero. I would imagine it's always zero for the block. >> Yeah, basically. So what I'm seeing is that I for some reason I thought that we're in a better place and it's mostly matching, but um seems like there's quite a few differences. Although I hope that they are mostly small and we can iron them out.

Yeah, I was hoping that when the nether mind was working on this that they would be running this test suit and then they would be uh kind of checking those things but that's that's not really what happened and also before it was bit annoy that I had all the time read this and then re report what's wrong and what's different and then um I many times did do that all the time. So, funnily enough, we have the opposite case here where GU thinks that there's no not enough fund and nether mind happily obliges.

calls from C12. >> Yeah, there I'm setting the GA gas zero in the transaction. And that should fails. But then Netherminded to be gas limit or gold something else than gas. >> Oh, right. Right. So there's no gas provided. So it should fail.

>> Gasless transactions it work. And for some reason the nether mind is not obeying that gas zero. >> It might it might be I think it's an edge case that I'm testing here that that when you're setting zero then the nether mind assuming that that means that it's not set even though it's set to zero. Okay, get block properties.

Oh, we have a different return data. >> What's the test? >> It says um get block property. That's that's a contract that returns all the all the kind of extra information that you can get in the solidity like block hash and block number and that kind of stuff and then they appended together. So if any block has a block number or time or something is >> this makes sense that it doesn't work.

It's like the transaction hash is already different. >> Oh, so the they put the logs in the trace. uh >> they also >> I think they're just using the same object there for the tracing and this >> ah but this then transaction index one uh it should start from zero I think I mean all in zero okay so let me should be able to verify that by looking

at an actual block, right? Get get block with transactions. I mean, I'm 99% certain that it should start with zero. Here we even have the log index. It cannot give me that value.

Yeah. Okay. So for this one, one of the clients reporting an error and one no error. >> That's a call without any data. I think there empty calls. >> Empty call. right so I guess maybe they are taking it as an error that also returning status that like it's generating that there's a call even

though there shouldn't be a be a call and it's also consuming gas and returning success. So it sounds weird. It's it's reverting. It's consuming the whole gas. >> I don't understand why why the boat both are returning very weird for that because there's no calls. Oh, there's actually there's one call that is empty. Yeah. So, it's so that I guess that that means it's a contract creating transaction.

So it tries to create >> a contract that has no data and I'm not sure if that's allowed but but there's no one pay paying the gas for it. >> Wait, why? No, because the zero account is paying the gas for it >> but from parameters. Yeah, but it from defaults to zero, I think. but yeah, it's a it's a bit bizarre test

case in a way. >> This is a bizarre test case. Yeah. I think there's an agreement there just the extra fields. No, the transaction hash is still different. There's some different assumption for native mod and get are different for the transaction. I think that's the case.

simple no fonts. >> Yeah, there the No, that's the error code is different but both diagn it's a error. Yeah, error code and that's we are not returning a date like data field because it's empty and the other one is invalid transaction index uh transaction cost. Okay. Yeah. So this is something that

I mean should this fail is higher than sender balance. Sender balance is assumed to be zero. Uh who is the sender? It's C 0. But we are so the state override is not working because it's clearly setting a high Oh, but at index one. Oh, >> should that be at the index zero?

But there's probably two is that two transaction or one transaction? >> There's there's two transactions. Uh but this one is not spending all of the funds. This is 10 billion. One trillion. Yeah. So there should be some funds remaining after this.

I think there's something in the state override. >> Yeah. Um, anyhow, I think we have quite a few list now. >> Yeah. But many of those things were kind of edge cases except there's couple bigger ones.

>> There is a few there's a few things that like the state override if it's not really working then it can be causing a lot of the errors. >> Yeah. Do you know have you run this against red and what's the differences there? Um, I was planning to uh, so some of the ones that I reported in the chats, those ones I found, uh, but I will, yeah, I I will run it against Reth and Bizu.

>> But yeah, I guess they haven't commented on those changes. >> No, not yet. I just posted it last night. So what do you think about merging these test cases to the to the test suit? I think that we first need to figure out that they all are correct. Is that needed? Because they in a way conscious tests that's what they're testing against that we are not in a way claiming that the get is who is wrong in a way. We just kind of are claiming that there's some difference between these two things

and then it's either get or nethermind or or better who's wrong. Yeah, I I would think that it's better if we have figured it out and then we can merge it >> and not have to like submit then fixes to the test later on and and we have to do the >> Sorry, >> should I reach out to Lucas and see what status is if they're working on it. Is it?

Yep. I can I can give you the list if you want to write to him. Michael, if you're speaking, I can't hear you. >> Yeah, I couldn't hear him either. But yeah, Michael went used to be muted and not muted anymore, but we still cannot hear.

Did I get disconnected? >> Yeah, I can hear. Have you seen him? I can hear you again. But can you hear Cena? You still hear Cena? >> I'm here. I was muted. >> Yeah, you are audio. You are audio. >> Did you hear Sid's question that if you want his list of those things?

>> Oh yeah. So can you export that page somehow like in in its interactable form? >> Oh um I will have to yeah I can move it to HackMD. >> Okay that something that makes it easy to just kind of review and something we can link them ideally not just like a CSV file that's just giant wall of text would be nice. Um, if you can get something like that, that' be great. Or if you can publish that page somewhere that you were just looking at. Um, whatever is easiest.

>> I think hacking DM will make it kind of huge wall of text if you can export HTML. I think you can export HTML. >> Oh, you want the hive this the output that I was showing or just the >> Yes. Yeah, the output you were showing. I mean, if you have the findings you guys found written down, that might be also useful. >> I would just think you just give them give Lucas that page and say, "Hey, >> yeah, >> here's bunch of red. We went over them. Most of them seem to be in their mind."

>> Um, yeah, sure. That works too. Just wanted to make their job easier by processing them a bit. >> Yeah, if you if you have notes that you took during that, I think that would definitely make it easier and encourage them to get it done. So we should give that to I didn't realize you're writing stuff down. >> That that's the work I used to do that I but reading through those and then aggregated what I think was wrong and then I sent them to Netmind and then then they said that they are fixed and then I run the tests again and then identified if they are fixed or not and >> but that's a while ago.

>> What made you stop Kimmy? They they changed the who working on on it. >> Oleg used to work on it and then Oleg left. It was a lot back and forth when they were claiming that something was fixed and then I checked it wasn't fixed and it was somewhat tedious. Do we have anything else?

>> Uh, not from my side. >> Okay, I'll post a message in the and if you can share uh either of those things we talked about afterwards that otherwise I don't have anything Yep. See you next week, Tim. Yeah. Talk to you. Bye. See you later.