Overview
| Parameter | Type | Default | Recommended | Units |
|---|---|---|---|---|
| Number | 0 (400) | 400 | gas per byte |
DA Footprint Calculation
For all non-deposit transactions processed by an OP Stack chain, a DA Footprint value is recorded alongside the transaction’s gas usage. The DA Footprint can be configured via thedaFootprintGasScalar variable in the SystemConfig contract on the L1 chain.
The DA Footprint is automatically calculated for every transaction first by calculating a daUsageEstimate for that transaction:
minTransactionSize, intercept, fastlzCoef, and tx.fastlzSize are as specified in the Fjord specs.
Then the daUsageEstimate is then multiplied by the daFootprintGasScalar to get the daFootprint for that individual transaction.
daFootprint for all the transactions in a block are then added together to calculate that block’s total daFootprint.
With the block’s total daFootprint calculated:
- The block’s total
daFootprintmust stay below itsgasLimit. - The
blobGasUsedproperty of each block header is set to that block’sdaFootprint. - The base fee update calculation then uses
gasMetered := max(gasUsed, blobGasUsed)as a replacement for thegasUsedvariable.
blobGasUsed field, as well as the block’s daFootprintGasScalar in a new field with the same name.
The DA Footprint Gas Scalar
The DA footprint gas scalar scales the estimated DA usage in bytes to the gas dimension, and this scaled estimate of the DA usage is what we call the DA footprint. This allows us to limit the estimated DA usage using the block’sgasLimit: the effective limit of estimated DA usage per block is gasLimit / daFootprintGasScalar bytes.
So increasing this scalar makes DA usage more gas-heavy, so decreases the limit, and vice versa.
This is closely related to how the calldata (floor) cost of 40 gas per non-zero byte limits the total amount of calldata in a block.
A DA footprint gas scalar of 400 effectively limits incompressible calldata by a factor of 10 compared to its limit without a DA footprint block limit.
As such, the feature can be seen as an extension of the existing calldata limit.
But instead of repricing the calldata (floor) gas cost, the limit is accounted in parallel to EVM execution gas, and is based on the more relevant FastLZ-based DA usage estimate instead of simply counting zero and non-zero bytes.
Default Value 400
The default scalar of 400 was chosen so that it protects chains in worst-case DA spam scenarios, but has negligible to no impact during normal operation.
Careful analyses have been done to estimate the impact on current OP Stack chains and pick the right default.
Only high-throughput chains would occasionally even see a small impact from the resulting DA footprint limit (as slightly faster rising base fees). The DA footprint limit is mostly invisible.
On mid to low-throughput chains, the feature is expected to have no impact under normal usage conditions.
It acts more like an insurance to protect against worst-case incompressible DA spam.
How to Update the daFootprintGasScalar
The steps below explain how to update the daFootprintGasScalar parameter on-chain using the SystemConfig contract.
1
Find your SystemConfig contract address
The SystemConfig contract stores configurable protocol parameters such as gas limits and fee settings.
You can find its proxy address in the state.json generated by op-deployer.
You can find its proxy address in the state.json generated by op-deployer.
2
Call the setDAFootprintGasScalar() method
The SystemConfig owner is the only address that can make these changes.
daFootprintGasScalar, call the following method on the SystemConfig contract:setDAFootprintGasScalar(uint16 daFootprintGasScalar) external onlyOwner;Example (using cast) to double the scalar, so lower the effective DA usage limit by half:Cast
3
Verify the new value
After the transaction confirms, verify the current value by calling the following getter method on the And on your L2 chain you can query the scalar at the L1Block predeploy to confirm the new scalar has been propagated to the chain:
SystemConfig contract:function daFootprintGasScalar() external view returns (uint16);Example (using cast):cast
cast