EIP-7623: Increase Calldata Cost

Yes, though a simpler solution could be to have a variable block size limit. Block builders are capable of adding complexity to their algorithms.

The problem with block constraints is that it results in discrimination, one of the problems this change is trying to address. Gas and gas price (now priority fee) are supposed to be fair ways to evaluate whether a transaction can or should go into the block. Discrimination here means that a transaction might pay a fair priority fee but not be accepted due to outsized calldata. This isn’t fair because the transaction is being treated as if it uses more gas than it does, diluting its priority fee. If blocksizeGas is a constrained resource, there should be a market for it, similar to blobgas.

A question that I have here is how much gas is made available for the actual execution of the opcodes.

Currently, that amount is pre_7623 = tx.gas - 21000 - data_cost - create_cost - access_list_cost. If data_floor_cost is the new floor cost of call data (as per this EIP), do we now make post_7623 = tx.gas - 21000 - data_floor_cost - create_cost - access_list_cost available for execution?

If yes, would we be under-funding some transaction executions?

I imagine a scenario where we passed post_7623 gas for opcode execution but during the course of execution, the execution gas used built up enough to cross the threshold. This means that we should really have passed pre_7623 gas for opcode execution. Since post_7623 < pre_7623 we have essentially underfunded the execution in a way. This could be the difference between success vs OutOfGas in some cases.

2 Likes

The computation uses gas_used which is only known after execution. So this EIP can cause out-of-gas after execution would have otherwise succeeded, by retroactively increasing the calldata cost. While the available gas could be computed ahead of time, the spec does not currently do this.

The internal gas of the transaction is computed by taking the higher gas cost, such that 99% of transactions (those don’t reach the floor) get more refund.
We must make sure that we don’t run out of gas after execution, otherwise clear DoS.

So there’s a possibility that a transaction that ran out of gas, gets a gas refund. And that it wouldn’t have run out, if the refunded gas was available for execution.

you’re right, yes!
Though, this should be a rare exception.

This is the latest el specs implementation of the eip, would be great to have your feedback:

A high-level overview of EIP-7623 for those interested in understanding what’s involved with this proposal.

Ethereum dapp builder here, I think we shouldn’t make calldata more expensive, here is why:

  • Many L2 app builders such as us have started building on L2s like Optimism when they still sent all L2 data into Ethereum’s calldata
  • We have protested against it, but Optimism and others have then started to post data into blob storage making the data we post on L2 “data available” but not “retrievable into perpetuity.”
  • In essence chains like Optimism have pulled the rug under our application as they have gotten rid of a guarantee they priorly passed on to L2 dapp devs.
  • This is somewhat understandable as they’re NOT putting user funds at risk, since these can be settled to L1 using Ethereum’s blob storage.

But here is why a calldata cost increase is a problem for non-ERC20 type of applications on Ethereum:

Our application asks users to store delegations from a user’s regular Ethereum wallet to a delegated in-app wallet on Optimism. If you’ve ever used Farcaster, you might be aware that any interaction on there is essentially a signed Ethereum EIP-712 message. This is enabled because Farcaster delegates a signer on Optimism allowing that signer to represent your identity on the app. So Farcaster, but us as well, we falsely have relied on the L2 data to be available in perpetuity (and because L1 calldata was just too expensive)

Now, core devs and ETH researchers don’t seem to be aware of this type of application being built on Ethereum and so in the recent past a few updates have been made that end up hurting these types of non-financial apps.

Generally speaking, any app that must store any kind of data which is not directly related to settling ERC20 tokens on L1 from L2 is affected. These apps need to be able to post cheaply into L1 calldata (or another solution like it must be found). That is because when posting into L1’s calldata, this creates a timestamp whose creation isn’t controllable by users. Consumer protocol like Farcaster and Kiwi News rely on this timestamp and the data to be retrievable into perpetuity to come to our own consensus between nodes.

I want to make everyone aware that:

  • L2 data is fundamentally not exitable from L2s as blobs become non-retrievable for a regular person
  • Since we’re building a protocol on top of Ethereum/Optimism, we were relying on this timestamped and into perpetuity retrievabe data to be accessible from a regular Ethereum node.
  • Since OP’s move to EIP-4844, we’re basically reliant on the good will of the Optimism sequencer operator to allow us access to this data as we’re still allowing users to delegate their keys on L2.

Why do I think this matters for objecting increasing the calldata on L1?

Many application builders have had wrong ideas about what problems L2s are solving for them. The simple fact of the matter is that any type of data where the app builder relies on the data to be retrievable from an Ethereum node in perpetuity MUST BE L1 calldata. L1 hasn’t been a priority so for these types of app developers L1 calldata is, most likely, already considered too expensive. But making it more expensive basically kills their use cases as then building a protocol on top of Ethereum becomes much harder.

Why calldata and not blobs?

Blobs’s retrievability on nodes is only possible in the short term. I’m not aware of a workflow that would make it possible for a Farcaster or Kiwi News node operator to download all blobs ever stored on Ethereum and if I read the docs correct, then blobs will be pruned from nodes after some time. That said, I think it is also unproductive to suggest that these apps “can just load blobs from an archival service.” I’m aware that centralized blob archival services for blobs exist. But we ourselves are building a protocol, and so to make it reliant on the good will of a blob archival provider isn’t any better than being reliant on the good will of the Optimism sequencer operator. We want to base our protocol on Ethereum. Otherwise, if we base it on a centralized operator (be that the Optimism sequencer or a blob archival provider) our guarantees to users will be much worse.

The usefulness of calldata is that the data is timestamped (without the submitter being able to control the timestamp) and retrievable in perpetuity from a regular Ethereum node with a pretty good guarantee that any standard interface provider like Infura and Alchemy also provide access to the data and that we don’t have to rely on any single entity.

I think it should be prioritized creating a space where L2 users can cheaply post small amounts of metadata that can be timestamped and stored into perpetuity. We must mitigate the damage that is currently done on L2s by unaware application builders (who store data on L2s thinking it is permissionlessly retrievable in perpetuity) and we must broadly teach that L2 data isn’t as exitable from L2s as are ERC20 tokens.

I hope you can consider this feedback to make a decision. I’m happy to provide more detailed information. A disclaimer: I’ve said that Farcaster is also reliant on using this “ideal timestamped calldata, retrievable into perpetuity,” it still is.
However, from what I know, they’re now actively working on Snapchain, which is most likely going to solve this problem for them. I’d prefer to keep building Kiwi News on Ethereum, and so I think it’s important that this information gets circulated and understood to make wise decisions at the level of the core devs. Thank you.

Thank you for the feedback!

To clarify, applications that still want to post data on-chain via calldata can continue to do so—it just might become more expensive. This cost adjustment is primarily aimed at reducing worst-case limits without impacting the majority of users. It’s a trade-off between “making a small nr of tx more expensive” vs “DoS resistance”.

When data is posted as calldata, it becomes part of the history, which places a burden on every node. In contrast, blobs are pruned after approximately two weeks, offering a more scalable solution.

While pure data transactions via calldata may become costlier, there are proposals, such as EIP-7639, that could eventually enable pruning of calldata as well. Ethereum has always prioritized horizontal scaling and reducing hardware requirements, so this direction should come as no surprise.

The “timestamp” argument applies equally to blobs. Your application could choose to store data in blobs, retain all blobs locally without pruning (which I do personally, and I assume most companies can do as well), and still make the data—including timestamps—available for verification.

Yes, I understand that.

  • For our dapp, to delegate keys pre EIP-4844 a user would roughly pay 0.1 USD to delegate their key. Most users accepted this.
  • Post EIP-4844 with OP posting into blobs this cost as gone to 0.01 USD. However, I have described above why that is non-sustainable for us and what the security implications of OP posting into blobs storage are.

Now let me simulate what it’d cost on today’s mainnet (napkin math ahead):

  • We need to post 3x 32bytes into calldata. We also have to pay the transaction envelope cost of 21k gas
  • We’ve maximally optimized gas costs of our key delegation contract down to 37k gas when posting on OP. We don’t push the key into readable storage for other contracts or users, it’s plainly calldata and emitting an event (details). All this to say, there’s very little optimization potential for us to bring costs down.
    • Farcaster has a more complex identity model where they also store the delegated key in storage (so for them it’ll be much more expensive)
      - At today’s 10gwei gas rate (the post EIP-4844 average gas cost was 10gwei), putting 3x 32bytes into calldata on L1 is $1.44. That’s unacceptably expensive as a cost to just get a consumer logged into a dapp!

Why is it unacceptably expensive already?

Farcaster has already implemented a model where the user has to pay up to 1 USD when they want to login to another app using their Warpcast-internal delegation.

  • Many users on Warpcast have specifically complained about this being too costly for the use case. There are ways to look up the complaints using Warpcast’s search or even asking someone from the Merkle Manufactory team. I’m sure they’ll confirm that this is an issue, if they haven’t yet said publicly anyways.
  • Farcaster developers are moving away from Ethereum Optimism through the Snapchain proposal. Since in the Snapchain message timestamping is also harder to user-control this will allow them to put the delegations on the Snapchain, leaving Ethereum.
  • With Kiwi News, we also don’t know were to go frankly. But Ethereum or the L2s don’t seem to serve our use case at all. I however have the impression that we’re very Ethereum aligned. Why is Ethereum not serving us? We (consumer apps like FC and us) have a lot of growth potential through onboarding consumers. And our architectures are very aligned with Ethereum’s vision of decentralization. Putting on my Ethereum investor hat, it’s suboptimal that we seem to want to just ignore this use case

I want to stress here that I think Ethereum’s treatment of users who need to store small amounts of metadata into calldata is what’s most likely leading them to implement alternatives, not the other way around. Mind you, the 1.44 USD that is shown on the Metamask screenshot is the cost today, at LOW gas fees. Your proposal wants to increase this.

I’m aware that it puts a burden on everyone. But there’s also a benefit to it. E.g. we and Farcaster are creating a new online space for people to curate and publish content. Do you want to continue to post on X? I don’t.

If you read my original response you’ll find that blobs are not a functionally perfect substitute of calldata for us. Blobs are only a perfect functional substitute for rollups who can settle their balance before blobs are pruned on the nodes. Obviously the Ethereum community has set a blobs pruning target that fits rollups. Blob space was custom made for rollups. Also, us and comparable projects have never been contacted about a prune duration we would prefer.
That said, our and Farcaster’s delegation keys live on people’s apps, so alternatives to the Warpcast and the Kiwi News client. Those keys have a long lifetime: Basically they keys that have been delegated for Kiwi News to upvote a story 1.5 years ago today still have to be retrievable through Ethereum calldata. That’s why I’ve been saying “in perpetuity.”

But I want to stress this again, our keys in our users’ app live way beyond the duration that blobs are stored on Ethereum nodes. Hence we cannot use blobs. I’ve also argued extensively for other reasons why blobs cannot be used, e.g. that they’re not easily permissionlessly retrievable after pruning.

The practical requirements of application builders suggest we may need to reconsider this approach.

I have been using Ethereum since 2018-2019 as an application builder and up until very recently the invariant that all data will stick around and be retrievable with an archive node has been solid (maybe not in ETH researcher circles, that may be).

I’ve never been a fan of EIP-4444 and state expiry proposals etc. When I talk to other builders I often get approval with that opinion. Dapp builders have informed opinions as we have to work with the actual system in the trenches and make it work for users!

If we were building an application, maybe. But we’re not building an application, we’ve built a protocol using set reconciliation over a patricia merkle tree. So has Farcaster. If we want our nodes to come to a deterministic eventual consistency over who has posted what then they’ll have to have all the same source of truth of which key is allowed to post on behalf of which root key and during what time intervals (again: Happy to provide even more details here). That’s why us and Farcaster have been leveraging Ethereum to store key delegations. The key delegations must be stored in perpetuity retrievable for all Farcaster and Kiwi News nodes and they must be timestamped such that the user cannot back date their delegations. If this isn’t the case then all sorts of bad things happen in our protocol. E.g. someone could claim to have casted a message in 2021 etc.

Again, you cannot suggest to use blobs here:

We’re actually talking about the proper functioning of the p2p set reconciliation algorithm that reconciles messages on Farcaster and Kiwi News nodes.

  • E.g. my Kiwi News node has been running since 1.5 years.
  • A new Kiwi News node might come online today. It’ll want to download all messages from the last 1.5 years from my node.
  • If we were to look up key delegations in blobs, then my node would have received all blob related key delegations and could have retained them after they were pruned. No problem so far.
  • However, that new Kiwi News node which just came online CANNOT trust my node to understand who has delegated their keys. They can also not look up long gone key delegations in a permissionlessly decentralized way because blobs archives are only provisioned by centralized actors. And additionally, you have to consider that today all a new node operator has to do is enter a Alchemy or Infura RPC URL to the .env file. If you actually want people to download blobs from centralized actors this comes with all sorts of problems for us.

If you look at Farcaster’s Snapchain proposal over their original architecture, you’ll find that the Snapchain which moves away from eventual consistency is much more complex than their earlier version.

The first time I saw FC’s architecture I was amazed by it as I had looked for a scalable dapp architecture that would also allow to scale the metadata that usually accumulates in dapps. I truly think that a generalization of the FC set reconciliation (including a few tweaks here and there) can get us really far towards the goal of a scalable dapp infrastructure for data.

Think about it. We’ve created the equivalent to rollups for data. All we have to store are key delegations. It’s highly efficient for how much data you can store on these networks. And rollups cannot be used for data as I’ve already mentioned (because rollups cannot exit data). So why would you hinder this use case by increasing calldata costs? This type of architecture should be promoted and Ethereum should serve it, as it has served rollups! We should not let Farcaster escape into building their own thing! We should serve them

If you combine this sentiment with a proposal to increase costs, then this is Bitcoiner-style zero sum thinking.

When I worked at ascribe.io in 2015, the Bitcoiners also wanted to shut us down for storing art on the blockchain. Exactly the same argument. “It burdens everyone.” This was right before the blocksize wars.

In either case, Bitcoin was ill-equipped to handle Ascribe, and it was sometimes met with outright hostility in the crypto community. On a technical level, Ascribe capitalized on a standardized function called OP_RETURN, which enables a user-defined sequence of up to 40 bytes to be written onto the blockchain. This allowed for things like links – pointing to images and longer texts living off-chain – to be stored in Bitcoin transactions. Daubenschütz wrote about the project in a recent newsletter for NFT curation protocol JPG.space: “Ascribe was built on Bitcoin … by signing up via email and password, a hierarchical deterministic wallet was derived from the federation wallet; all ownership transactions were stored in an inventive protocol called SPOOL, the “Secure Public Online Ownership Ledger”(12). Similar to the well-known ERC721 NFT standard, the SPOOL encodes ownership information on-chain(13); but it was a hell of a mess as Bitcoin really wasn’t meant for any of this.(14)” Indeed, issues occasionally arose with Bitcoin validator nodes rejecting the transactions for containing too much data; some hardcore Bitcoin purists even called OP_RETURN transactions “spammy” or blamed them for bloating the network (15). As their anxieties attest, Ascribe was a critical intervention for attempting to broaden the blockchain’s functionality beyond straight-up financial exchange.

I’m excited about Ethereum’s potential to scale beyond rollups! We already went from zero to one
What Ethereum’s implementation of the rollup roadmap has shown is that if we can identify a use case that clogs up L1 mainnet, and we design a better, cheaper, alternative solution, we scale Ethereum, bring down costs to many users and developers, allow more people to use the technology, and we broaden its appeal. That’s amazing! Meanwhile we have managed to leave Ethereum L1 largely unaffected. AND we have scaled DeFi and tokens and while we have preserved all L1 guarantees (as of now).

I’d hence propose that if we want to scale L1 throughput, instead of curbing economic activity with restrictive policy proposals, we should come up with solutions that make it economically unviable to still use the L1 resource because there’s a better alternative. A great example of this is rollups using blobs, which have produced a 91% cost benefit over storing their data in perpetuity in calldata (https://dune.com/0xRob/blobs).

So to unclog L1, I generally propose the following method to develop Ethereum:

  • Analyze what causes L1 clogging
  • Design an economically more viable solution and adjust it until developers use it
  • When developers move, L1 un-clogging happens
  • repeat

I think scaling this type of thinking in the culture of Ethereum developers could also lead to a broad enthusiasm about its culture. Maybe you know: https://www.solanaroadmap.com/
I’d be excited if we could do this our own way too! Investors would love it too probably

And just to make sure: blobs != calldata for all use cases of calldata, so please don’t suggest again to use blobs, thank you.

1 Like

The rationale behind this EIP goes beyond simply saying, “it’s a burden for everyone, so we’re making it more expensive.” Large blocks pose a significant DoS risk, and ensuring the network’s security is of utmost importance. It’s a delicate balance between allowing larger blocks to enable certain types of applications and safeguarding the network, and this decision is far from black and white. For instance, storing HD videos directly on-chain is already impractical. While making calldata extremely cheap could make it feasible, doing so would drastically increase hardware requirements for nodes or require longer block times. In most cases, it’s more sensible for blockchains to host large datasets externally (e.g., via IPFS) and only store timestamped proofs on-chain.

With the gradual increase in gas limits, we’ve seen how vulnerable the network can be to large blocks, and EIP-7623 addresses this by mitigating that risk. The vast majority of users won’t notice any difference. Among those affected, most are only writing small amounts of data into calldata, so they’ll see only a slight increase in costs (=negligible since 100 more gas is nothing in perspective of paying 21000 gas already).

Here are two recent instances where large blocks caused issues:

1 Like

PEEPanEIP #140: EIP-7623: Increase calldata with @Nerolation

The comparison to “storing HD Video” is a strawman argument, no one is proposing to do that.

Blobs are for ensuring the availability w.r.t. the fraud proof window, they are not for legit calldata use cases.

Additionally, this requires changes to the gas pricing API’s, of which I do not know one provider who is even working on this (I would assume there are some at least). With EIP1559 there was a readiness checklist for downstream services signalling readiness for the new changes (e.g. Wallet providers supporting the usage). Do you have such a check list? I maintain a Gas Reporting Registry, GitHub - sambacha/gas-reporting: Reference documentation on every gas price API and all the different formats so this would be helpful to know and to provide additional information regarding the changes!

Thanks @Nerolation for responding to all these questions, I can appreciate both sides of the argument.

2 Likes

I agree, this is crazy. We just want our 3x 32 byte calldata to be preserved to do onchain delegations of Ethereum addresses, and at the same time we need to make this transaction consumer friendly. I have been pretty clear about this in earlier posts already. Not HD videos. Blobs are fundamentally not a consumer grade transaction anyways.

Blobs are for ensuring the availability w.r.t. the fraud proof window, they are not for legit calldata use cases.

Sorry for the accusation but it is my assessment that ETH researchers are pretty clueless or willfully against other use cases but token trading. I‘ve brought this issue up many times already. There are many use cases of Ethereum beside cheap token swaps, but nobody seems to care. At the end of the day this is probably a failure from us who rely on long-term retrievability of data etc. The DeFi lobby on Ethereum is very strong, for good reasons

You’re right—storing HD videos was a poor example, as it pushes the argument to the extreme.

Ultimately, though, it’s a trade-off between allowing larger blocks and enabling messaging through calldata.

This is just gaslighting, and it doesn’t help in being taken seriously—which, to be clear, I have and still do. We both know that large blocks pose a significant DoS risk. On top of that, until we implement regular history pruning, every full node has to store it on disk, further driving up hardware requirements.

1 Like

Nobody wants regular history pruning but token swap applications

This is just gaslighting, and it doesn’t help in being taken seriously

You didn‘t give a shit about my concerns and the proposal has been moved further in the Pectra approval process. I have been pretty respectful so far. Also in person at Devconflict where my concerns were cast aside too. Why should I now care about an etiquette that you impose? Maybe take people‘s concerns seriously next time before they start to violate your etiquette

I take others’ concerns seriously, but there’s another perspective in this discussion: some advocate for making calldata more expensive to mitigate the growing DoS risk that comes with increasing gas limits.

History expiry shouldn’t come as a surprise—it has been under consideration for years. For instance, Vitalik’s well-known roadmap diagram highlighted it years ago.

There will never be complete consensus on any topic. At some point, after weighing the pros and cons and going through the ACD process, a decision has to be made.

I‘m not surprised by state expiry. I‘ve always been against it. As you can read from my above remarks, I have already built applications with data retrievability in perpetuity in mind since 2015, so I‘m quite aware that there are plans for history expiry, and I‘m still against it today. Vitalik is just one person. He‘s our leader but I don‘t agree with everything he proposes.

There will never be complete consensus on any topic. At some point, after weighing the pros and cons and going through the ACD process, a decision has to be made.

You should consider projecting the minority by eliciting their use cases. Many people will just stop building on Ethereum without a complaint beforehand. L2s are already useless to my application so I have moved off of Ethereum. Everyone sleepwalked into this. DeFi has a much stronger lobby. But people who want to etch stuff in the chain arguably don‘t have a strong lobby or billion dollar companies who can commission research and influence.

I’m wondering how will that play in the mid-term with STARK/PQ-secure proofs verification.
All of the proving systems known atm that are PQ-secure depend on having large proofs.

See for example this post on WHIR Solidity verifier or this post on lattice-based signature solidity verifiers.

If we blow-up CALLDATA cost, how do we anticipate verifying these proofs when we don’t need any sort of DA solution (we just need to verify the proof to trigger certain SC function). So basically, no blob-related stuff to solve this.
It will become unreasonable to have apps as we have today that rely on G16 verification being “decently cheap”.