mirror of
https://github.com/vacp2p/linea-besu.git
synced 2026-01-08 15:13:58 -05:00
Add baseFeeUpdateFraction to blobSchedule genesis config (#8128)
* Add baseFeeUpdateFraction to blobSchedule genesis config Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * added genesis file for CodeDelegationTransactionAcceptanceTest Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * remove hard coded baseFeeUpdateFraction from CancunFeeMarket & PragueFeeMarket Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * make FeeMarket constructors package private Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> --------- Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net>
This commit is contained in:
@@ -18,15 +18,18 @@
|
||||
"blobSchedule": {
|
||||
"cancun": {
|
||||
"target": 3,
|
||||
"max": 6
|
||||
"max": 6,
|
||||
"baseFeeUpdateFraction": 3338477
|
||||
},
|
||||
"prague": {
|
||||
"target": 6,
|
||||
"max": 9
|
||||
"max": 9,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
},
|
||||
"osaka": {
|
||||
"target": 9,
|
||||
"max": 12
|
||||
"max": 12,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
}
|
||||
},
|
||||
"clique": {
|
||||
|
||||
@@ -49,7 +49,7 @@ import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration;
|
||||
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
|
||||
import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration;
|
||||
import org.hyperledger.besu.ethereum.storage.StorageProvider;
|
||||
import org.hyperledger.besu.ethereum.storage.keyvalue.KeyValueStoragePrefixedKeyBlockchainStorage;
|
||||
@@ -106,7 +106,7 @@ public class MergeBesuControllerBuilderTest {
|
||||
|
||||
BigInteger networkId = BigInteger.ONE;
|
||||
private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture();
|
||||
private final BaseFeeMarket feeMarket = new LondonFeeMarket(0, Optional.of(Wei.of(42)));
|
||||
private final BaseFeeMarket feeMarket = FeeMarket.london(0, Optional.of(Wei.of(42)));
|
||||
private final TransactionPoolConfiguration poolConfiguration =
|
||||
TransactionPoolConfiguration.DEFAULT;
|
||||
private final ObservableMetricsSystem observableMetricsSystem = new NoOpMetricsSystem();
|
||||
|
||||
@@ -82,15 +82,16 @@ public class BlobScheduleOptions {
|
||||
public static class BlobSchedule {
|
||||
private final int target;
|
||||
private final int max;
|
||||
private final int baseFeeUpdateFraction;
|
||||
|
||||
/** The constant CANCUN_DEFAULT. */
|
||||
public static final BlobSchedule CANCUN_DEFAULT = new BlobSchedule(3, 6);
|
||||
public static final BlobSchedule CANCUN_DEFAULT = new BlobSchedule(3, 6, 3338477);
|
||||
|
||||
/** The constant PRAGUE_DEFAULT. */
|
||||
public static final BlobSchedule PRAGUE_DEFAULT = new BlobSchedule(6, 9);
|
||||
public static final BlobSchedule PRAGUE_DEFAULT = new BlobSchedule(6, 9, 5007716);
|
||||
|
||||
/** The constant OSAKA_DEFAULT. */
|
||||
public static final BlobSchedule OSAKA_DEFAULT = new BlobSchedule(9, 12);
|
||||
public static final BlobSchedule OSAKA_DEFAULT = new BlobSchedule(9, 12, 5007716);
|
||||
|
||||
/**
|
||||
* Instantiates a new Blob schedule.
|
||||
@@ -100,11 +101,14 @@ public class BlobScheduleOptions {
|
||||
public BlobSchedule(final ObjectNode blobScheduleConfigRoot) {
|
||||
this.target = JsonUtil.getInt(blobScheduleConfigRoot, "target").orElseThrow();
|
||||
this.max = JsonUtil.getInt(blobScheduleConfigRoot, "max").orElseThrow();
|
||||
this.baseFeeUpdateFraction =
|
||||
JsonUtil.getInt(blobScheduleConfigRoot, "basefeeupdatefraction").orElseThrow();
|
||||
}
|
||||
|
||||
private BlobSchedule(final int target, final int max) {
|
||||
private BlobSchedule(final int target, final int max, final int baseFeeUpdateFraction) {
|
||||
this.target = target;
|
||||
this.max = max;
|
||||
this.baseFeeUpdateFraction = baseFeeUpdateFraction;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,13 +129,22 @@ public class BlobScheduleOptions {
|
||||
return max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets base fee update fraction.
|
||||
*
|
||||
* @return the base fee update fraction
|
||||
*/
|
||||
public int getBaseFeeUpdateFraction() {
|
||||
return baseFeeUpdateFraction;
|
||||
}
|
||||
|
||||
/**
|
||||
* As map.
|
||||
*
|
||||
* @return the map
|
||||
*/
|
||||
Map<String, Object> asMap() {
|
||||
return Map.of("target", target, "max", max);
|
||||
return Map.of("target", target, "max", max, "baseFeeUpdateFraction", baseFeeUpdateFraction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,18 @@
|
||||
"terminalTotalDifficulty": 0,
|
||||
"shanghaiTime": 1696000704,
|
||||
"cancunTime": 1707305664,
|
||||
"blobSchedule": {
|
||||
"cancun": {
|
||||
"target": 3,
|
||||
"max": 6,
|
||||
"baseFeeUpdateFraction": 3338477
|
||||
},
|
||||
"prague": {
|
||||
"target": 6,
|
||||
"max": 9,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
}
|
||||
},
|
||||
"ethash": {},
|
||||
"discovery": {
|
||||
"dns": "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.holesky.ethdisco.net",
|
||||
|
||||
@@ -19,11 +19,13 @@
|
||||
"blobSchedule": {
|
||||
"cancun": {
|
||||
"target": 3,
|
||||
"max": 6
|
||||
"max": 6,
|
||||
"baseFeeUpdateFraction": 3338477
|
||||
},
|
||||
"prague": {
|
||||
"target": 6,
|
||||
"max": 9
|
||||
"max": 9,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
}
|
||||
},
|
||||
"ethash": {
|
||||
|
||||
@@ -15,6 +15,18 @@
|
||||
"terminalTotalDifficulty": 17000000000000000,
|
||||
"shanghaiTime": 1677557088,
|
||||
"cancunTime": 1706655072,
|
||||
"blobSchedule": {
|
||||
"cancun": {
|
||||
"target": 3,
|
||||
"max": 6,
|
||||
"baseFeeUpdateFraction": 3338477
|
||||
},
|
||||
"prague": {
|
||||
"target": 6,
|
||||
"max": 9,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
}
|
||||
},
|
||||
"ethash":{},
|
||||
"discovery": {
|
||||
"dns": "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.sepolia.ethdisco.net",
|
||||
|
||||
@@ -31,11 +31,14 @@ public class BlobScheduleOptionsTest {
|
||||
assertThat(blobScheduleOptions.getCancun()).isNotEmpty();
|
||||
assertThat(blobScheduleOptions.getCancun().get().getTarget()).isEqualTo(4);
|
||||
assertThat(blobScheduleOptions.getCancun().get().getMax()).isEqualTo(7);
|
||||
assertThat(blobScheduleOptions.getCancun().get().getBaseFeeUpdateFraction()).isEqualTo(3338477);
|
||||
assertThat(blobScheduleOptions.getPrague()).isNotEmpty();
|
||||
assertThat(blobScheduleOptions.getPrague().get().getTarget()).isEqualTo(7);
|
||||
assertThat(blobScheduleOptions.getPrague().get().getMax()).isEqualTo(10);
|
||||
assertThat(blobScheduleOptions.getPrague().get().getBaseFeeUpdateFraction()).isEqualTo(5007716);
|
||||
assertThat(blobScheduleOptions.getOsaka()).isNotEmpty();
|
||||
assertThat(blobScheduleOptions.getOsaka().get().getTarget()).isEqualTo(10);
|
||||
assertThat(blobScheduleOptions.getOsaka().get().getMax()).isEqualTo(13);
|
||||
assertThat(blobScheduleOptions.getOsaka().get().getBaseFeeUpdateFraction()).isEqualTo(5007716);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -418,15 +418,18 @@ class GenesisConfigOptionsTest {
|
||||
+ " \"blobSchedule\": {\n"
|
||||
+ " \"cancun\": {\n"
|
||||
+ " \"target\": 1,\n"
|
||||
+ " \"max\": 2\n"
|
||||
+ " \"max\": 2,\n"
|
||||
+ " \"baseFeeUpdateFraction\": 3\n"
|
||||
+ " },\n"
|
||||
+ " \"prague\": {\n"
|
||||
+ " \"target\": 3,\n"
|
||||
+ " \"max\": 4\n"
|
||||
+ " \"target\": 4,\n"
|
||||
+ " \"max\": 5,\n"
|
||||
+ " \"baseFeeUpdateFraction\": 6\n"
|
||||
+ " },\n"
|
||||
+ " \"osaka\": {\n"
|
||||
+ " \"target\": 4,\n"
|
||||
+ " \"max\": 5\n"
|
||||
+ " \"target\": 7,\n"
|
||||
+ " \"max\": 8,\n"
|
||||
+ " \"baseFeeUpdateFraction\": 9\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
@@ -438,14 +441,14 @@ class GenesisConfigOptionsTest {
|
||||
final Map<String, Object> blobSchedule = (Map<String, Object>) map.get("blobSchedule");
|
||||
assertThat(blobSchedule).containsOnlyKeys("cancun", "prague", "osaka");
|
||||
assertThat((Map<String, Object>) blobSchedule.get("cancun"))
|
||||
.containsOnlyKeys("target", "max")
|
||||
.containsValues(1, 2);
|
||||
.containsOnlyKeys("target", "max", "baseFeeUpdateFraction")
|
||||
.containsValues(1, 2, 3);
|
||||
assertThat((Map<String, Object>) blobSchedule.get("prague"))
|
||||
.containsOnlyKeys("target", "max")
|
||||
.containsValues(3, 4);
|
||||
.containsOnlyKeys("target", "max", "baseFeeUpdateFraction")
|
||||
.containsValues(4, 5, 6);
|
||||
assertThat((Map<String, Object>) blobSchedule.get("osaka"))
|
||||
.containsOnlyKeys("target", "max")
|
||||
.containsValues(4, 5);
|
||||
.containsOnlyKeys("target", "max", "baseFeeUpdateFraction")
|
||||
.containsValues(7, 8, 9);
|
||||
}
|
||||
|
||||
private GenesisConfigOptions fromConfigOptions(final Map<String, Object> configOptions) {
|
||||
|
||||
@@ -19,15 +19,18 @@
|
||||
"blobSchedule": {
|
||||
"cancun": {
|
||||
"target": 4,
|
||||
"max": 7
|
||||
"max": 7,
|
||||
"baseFeeUpdateFraction": 3338477
|
||||
},
|
||||
"prague": {
|
||||
"target": 7,
|
||||
"max": 10
|
||||
"max": 10,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
},
|
||||
"osaka": {
|
||||
"target": 10,
|
||||
"max": 13
|
||||
"max": 13,
|
||||
"baseFeeUpdateFraction": 5007716
|
||||
}
|
||||
},
|
||||
"depositContractAddress": "0x4242424242424242424242424242424242424242",
|
||||
|
||||
@@ -73,7 +73,7 @@ import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolMetrics;
|
||||
import org.hyperledger.besu.ethereum.eth.transactions.sorter.BaseFeePendingTransactionsSorter;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.trie.MerkleTrieException;
|
||||
import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive;
|
||||
import org.hyperledger.besu.metrics.StubMetricsSystem;
|
||||
@@ -158,7 +158,7 @@ public class MergeCoordinatorTest implements MergeGenesisConfigHelper {
|
||||
private final Address suggestedFeeRecipient = Address.ZERO;
|
||||
private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture();
|
||||
private final BaseFeeMarket feeMarket =
|
||||
new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee());
|
||||
FeeMarket.london(0, genesisState.getBlock().getHeader().getBaseFee());
|
||||
|
||||
private final org.hyperledger.besu.metrics.StubMetricsSystem metricsSystem =
|
||||
new StubMetricsSystem();
|
||||
|
||||
@@ -42,7 +42,7 @@ import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
|
||||
import org.hyperledger.besu.ethereum.mainnet.BlockHeaderValidator;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive;
|
||||
import org.hyperledger.besu.testutil.DeterministicEthScheduler;
|
||||
import org.hyperledger.besu.util.LogConfigurator;
|
||||
@@ -81,7 +81,7 @@ public class MergeReorgTest implements MergeGenesisConfigHelper {
|
||||
private final Address coinbase = genesisAllocations(getPowGenesisConfig()).findFirst().get();
|
||||
private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture();
|
||||
private final BaseFeeMarket feeMarket =
|
||||
new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee());
|
||||
FeeMarket.london(0, genesisState.getBlock().getHeader().getBaseFee());
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
|
||||
@@ -43,10 +43,7 @@ import org.hyperledger.besu.ethereum.core.MiningConfiguration;
|
||||
import org.hyperledger.besu.ethereum.core.Transaction;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LegacyFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
import org.hyperledger.besu.evm.log.LogsBloomFilter;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -289,11 +286,11 @@ public class EthGasPriceTest {
|
||||
}
|
||||
|
||||
private void mockBaseFeeMarket() {
|
||||
mockFeeMarket(new LondonFeeMarket(0));
|
||||
mockFeeMarket(FeeMarket.london(0));
|
||||
}
|
||||
|
||||
private void mockGasPriceMarket() {
|
||||
mockFeeMarket(new LegacyFeeMarket());
|
||||
mockFeeMarket(FeeMarket.legacy());
|
||||
}
|
||||
|
||||
private void mockFeeMarket(final FeeMarket feeMarket) {
|
||||
@@ -313,7 +310,7 @@ public class EthGasPriceTest {
|
||||
final var genesisBlock = createFakeBlock(0, 0, genesisBaseFee);
|
||||
blocksByNumber.put(0L, genesisBlock);
|
||||
|
||||
final var baseFeeMarket = new CancunFeeMarket(0, Optional.empty());
|
||||
final var baseFeeMarket = FeeMarket.cancun(0, Optional.empty());
|
||||
|
||||
var baseFee = genesisBaseFee;
|
||||
for (long i = 1; i <= chainHeadBlockNumber; i++) {
|
||||
|
||||
@@ -48,7 +48,6 @@ import org.hyperledger.besu.ethereum.mainnet.PoWHasher;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
|
||||
import org.hyperledger.besu.ethereum.mainnet.blockhash.FrontierBlockHashProcessor;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive;
|
||||
import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator;
|
||||
@@ -322,7 +321,7 @@ public class EthGetTransactionReceiptTest {
|
||||
}
|
||||
|
||||
private void mockProtocolSpec(final BlockHeader blockHeader) {
|
||||
FeeMarket feeMarket = new CancunFeeMarket(0, Optional.empty());
|
||||
FeeMarket feeMarket = FeeMarket.cancun(0, Optional.empty());
|
||||
ProtocolSpec spec = mock(ProtocolSpec.class);
|
||||
when(spec.getFeeMarket()).thenReturn(feeMarket);
|
||||
when(spec.getGasCalculator()).thenReturn(new CancunGasCalculator());
|
||||
|
||||
@@ -38,7 +38,7 @@ import org.hyperledger.besu.ethereum.core.Difficulty;
|
||||
import org.hyperledger.besu.ethereum.core.MiningConfiguration;
|
||||
import org.hyperledger.besu.ethereum.core.Transaction;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.evm.log.LogsBloomFilter;
|
||||
|
||||
import java.math.BigInteger;
|
||||
@@ -148,7 +148,7 @@ public class EthMaxPriorityFeePerGasTest {
|
||||
final var genesisBlock = createFakeBlock(0, 0, genesisBaseFee);
|
||||
blocksByNumber.put(0L, genesisBlock);
|
||||
|
||||
final var baseFeeMarket = new CancunFeeMarket(0, Optional.empty());
|
||||
final var baseFeeMarket = FeeMarket.cancun(0, Optional.empty());
|
||||
|
||||
var baseFee = genesisBaseFee;
|
||||
for (long i = 1; i <= chainHeadBlockNumber; i++) {
|
||||
|
||||
@@ -677,6 +677,13 @@ public abstract class MainnetProtocolSpecs {
|
||||
final boolean isParallelTxProcessingEnabled,
|
||||
final MetricsSystem metricsSystem) {
|
||||
final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L);
|
||||
|
||||
final var cancunBlobSchedule =
|
||||
genesisConfigOptions
|
||||
.getBlobScheduleOptions()
|
||||
.flatMap(BlobScheduleOptions::getCancun)
|
||||
.orElse(BlobScheduleOptions.BlobSchedule.CANCUN_DEFAULT);
|
||||
|
||||
final BaseFeeMarket cancunFeeMarket;
|
||||
if (genesisConfigOptions.isZeroBaseFee()) {
|
||||
cancunFeeMarket = FeeMarket.zeroBaseFee(londonForkBlockNumber);
|
||||
@@ -686,15 +693,12 @@ public abstract class MainnetProtocolSpecs {
|
||||
londonForkBlockNumber, miningConfiguration.getMinTransactionGasPrice());
|
||||
} else {
|
||||
cancunFeeMarket =
|
||||
FeeMarket.cancun(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas());
|
||||
FeeMarket.cancun(
|
||||
londonForkBlockNumber,
|
||||
genesisConfigOptions.getBaseFeePerGas(),
|
||||
cancunBlobSchedule.getBaseFeeUpdateFraction());
|
||||
}
|
||||
|
||||
final var cancunBlobSchedule =
|
||||
genesisConfigOptions
|
||||
.getBlobScheduleOptions()
|
||||
.flatMap(BlobScheduleOptions::getCancun)
|
||||
.orElse(BlobScheduleOptions.BlobSchedule.CANCUN_DEFAULT);
|
||||
|
||||
final java.util.function.Supplier<GasCalculator> cancunGasCalcSupplier =
|
||||
() -> new CancunGasCalculator(cancunBlobSchedule.getTarget());
|
||||
|
||||
@@ -830,7 +834,10 @@ public abstract class MainnetProtocolSpecs {
|
||||
londonForkBlockNumber, miningConfiguration.getMinTransactionGasPrice());
|
||||
} else {
|
||||
pragueFeeMarket =
|
||||
FeeMarket.prague(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas());
|
||||
FeeMarket.prague(
|
||||
londonForkBlockNumber,
|
||||
genesisConfigOptions.getBaseFeePerGas(),
|
||||
pragueBlobSchedule.getBaseFeeUpdateFraction());
|
||||
}
|
||||
|
||||
return cancunDefinition(
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
package org.hyperledger.besu.ethereum.mainnet.feemarket;
|
||||
|
||||
import org.hyperledger.besu.config.BlobScheduleOptions;
|
||||
import org.hyperledger.besu.datatypes.BlobGas;
|
||||
import org.hyperledger.besu.datatypes.Wei;
|
||||
|
||||
@@ -26,11 +27,23 @@ import org.slf4j.LoggerFactory;
|
||||
public class CancunFeeMarket extends LondonFeeMarket {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CancunFeeMarket.class);
|
||||
protected static final BigInteger BLOB_GAS_PRICE = BigInteger.ONE;
|
||||
private static final BigInteger BLOB_GAS_PRICE_UPDATE_FRACTION = BigInteger.valueOf(3338477);
|
||||
|
||||
public CancunFeeMarket(
|
||||
final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
private final BigInteger baseFeeUpdateFraction;
|
||||
|
||||
CancunFeeMarket(
|
||||
final long londonForkBlockNumber,
|
||||
final Optional<Wei> baseFeePerGasOverride,
|
||||
final long baseFeeUpdateFraction) {
|
||||
super(londonForkBlockNumber, baseFeePerGasOverride);
|
||||
|
||||
this.baseFeeUpdateFraction = BigInteger.valueOf(baseFeeUpdateFraction);
|
||||
}
|
||||
|
||||
CancunFeeMarket(final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
this(
|
||||
londonForkBlockNumber,
|
||||
baseFeePerGasOverride,
|
||||
BlobScheduleOptions.BlobSchedule.CANCUN_DEFAULT.getBaseFeeUpdateFraction());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -42,8 +55,7 @@ public class CancunFeeMarket extends LondonFeeMarket {
|
||||
public Wei blobGasPricePerGas(final BlobGas excessBlobGas) {
|
||||
final var blobGasPrice =
|
||||
Wei.of(
|
||||
fakeExponential(
|
||||
BLOB_GAS_PRICE, excessBlobGas.toBigInteger(), BLOB_GAS_PRICE_UPDATE_FRACTION));
|
||||
fakeExponential(BLOB_GAS_PRICE, excessBlobGas.toBigInteger(), baseFeeUpdateFraction));
|
||||
LOG.atTrace()
|
||||
.setMessage("parentExcessBlobGas: {} blobGasPrice: {}")
|
||||
.addArgument(excessBlobGas::toShortHexString)
|
||||
@@ -67,4 +79,8 @@ public class CancunFeeMarket extends LondonFeeMarket {
|
||||
}
|
||||
return output.divide(denominator);
|
||||
}
|
||||
|
||||
protected BigInteger getBaseFeeUpdateFraction() {
|
||||
return baseFeeUpdateFraction;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,11 +49,25 @@ public interface FeeMarket {
|
||||
return new CancunFeeMarket(londonForkBlockNumber, baseFeePerGasOverride);
|
||||
}
|
||||
|
||||
static BaseFeeMarket cancun(
|
||||
final long londonForkBlockNumber,
|
||||
final Optional<Wei> baseFeePerGasOverride,
|
||||
final long baseFeeUpdateFraction) {
|
||||
return new CancunFeeMarket(londonForkBlockNumber, baseFeePerGasOverride, baseFeeUpdateFraction);
|
||||
}
|
||||
|
||||
static BaseFeeMarket prague(
|
||||
final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
return new PragueFeeMarket(londonForkBlockNumber, baseFeePerGasOverride);
|
||||
}
|
||||
|
||||
static BaseFeeMarket prague(
|
||||
final long londonForkBlockNumber,
|
||||
final Optional<Wei> baseFeePerGasOverride,
|
||||
final long baseFeeUpdateFraction) {
|
||||
return new PragueFeeMarket(londonForkBlockNumber, baseFeePerGasOverride, baseFeeUpdateFraction);
|
||||
}
|
||||
|
||||
static BaseFeeMarket zeroBaseFee(final long londonForkBlockNumber) {
|
||||
return new ZeroBaseFeeMarket(londonForkBlockNumber);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ import java.util.Optional;
|
||||
|
||||
public class FixedBaseFeeMarket extends LondonFeeMarket {
|
||||
|
||||
public FixedBaseFeeMarket(final long londonForkBlockNumber, final Wei fixedBaseFee) {
|
||||
FixedBaseFeeMarket(final long londonForkBlockNumber, final Wei fixedBaseFee) {
|
||||
super(londonForkBlockNumber, Optional.of(fixedBaseFee));
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ public class LegacyFeeMarket implements FeeMarket {
|
||||
|
||||
private final TransactionPriceCalculator txPriceCalculator;
|
||||
|
||||
public LegacyFeeMarket() {
|
||||
LegacyFeeMarket() {
|
||||
this.txPriceCalculator = TransactionPriceCalculator.frontier();
|
||||
}
|
||||
|
||||
|
||||
@@ -39,16 +39,15 @@ public class LondonFeeMarket implements BaseFeeMarket {
|
||||
private final TransactionPriceCalculator txPriceCalculator;
|
||||
private final Wei baseFeeFloor;
|
||||
|
||||
public LondonFeeMarket(final long londonForkBlockNumber) {
|
||||
LondonFeeMarket(final long londonForkBlockNumber) {
|
||||
this(londonForkBlockNumber, Optional.empty());
|
||||
}
|
||||
|
||||
public LondonFeeMarket(
|
||||
final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
LondonFeeMarket(final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
this(TransactionPriceCalculator.eip1559(), londonForkBlockNumber, baseFeePerGasOverride);
|
||||
}
|
||||
|
||||
protected LondonFeeMarket(
|
||||
LondonFeeMarket(
|
||||
final TransactionPriceCalculator txPriceCalculator,
|
||||
final long londonForkBlockNumber,
|
||||
final Optional<Wei> baseFeePerGasOverride) {
|
||||
|
||||
@@ -14,23 +14,30 @@
|
||||
*/
|
||||
package org.hyperledger.besu.ethereum.mainnet.feemarket;
|
||||
|
||||
import org.hyperledger.besu.config.BlobScheduleOptions;
|
||||
import org.hyperledger.besu.datatypes.BlobGas;
|
||||
import org.hyperledger.besu.datatypes.Wei;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class PragueFeeMarket extends CancunFeeMarket {
|
||||
private static final BigInteger BLOB_BASE_FEE_UPDATE_FRACTION_ELECTRA =
|
||||
BigInteger.valueOf(5007716);
|
||||
private static final Logger LOG = LoggerFactory.getLogger(PragueFeeMarket.class);
|
||||
|
||||
public PragueFeeMarket(
|
||||
final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
super(londonForkBlockNumber, baseFeePerGasOverride);
|
||||
PragueFeeMarket(
|
||||
final long londonForkBlockNumber,
|
||||
final Optional<Wei> baseFeePerGasOverride,
|
||||
final long baseFeeUpdateFraction) {
|
||||
super(londonForkBlockNumber, baseFeePerGasOverride, baseFeeUpdateFraction);
|
||||
}
|
||||
|
||||
PragueFeeMarket(final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) {
|
||||
this(
|
||||
londonForkBlockNumber,
|
||||
baseFeePerGasOverride,
|
||||
BlobScheduleOptions.BlobSchedule.PRAGUE_DEFAULT.getBaseFeeUpdateFraction());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -38,9 +45,7 @@ public class PragueFeeMarket extends CancunFeeMarket {
|
||||
final var blobGasPrice =
|
||||
Wei.of(
|
||||
fakeExponential(
|
||||
BLOB_GAS_PRICE,
|
||||
excessBlobGas.toBigInteger(),
|
||||
BLOB_BASE_FEE_UPDATE_FRACTION_ELECTRA));
|
||||
BLOB_GAS_PRICE, excessBlobGas.toBigInteger(), getBaseFeeUpdateFraction()));
|
||||
LOG.atTrace()
|
||||
.setMessage("parentExcessBlobGas: {} blobGasPrice: {}")
|
||||
.addArgument(excessBlobGas::toShortHexString)
|
||||
|
||||
@@ -18,7 +18,7 @@ import org.hyperledger.besu.datatypes.Wei;
|
||||
|
||||
public class ZeroBaseFeeMarket extends FixedBaseFeeMarket {
|
||||
|
||||
public ZeroBaseFeeMarket(final long londonForkBlockNumber) {
|
||||
ZeroBaseFeeMarket(final long londonForkBlockNumber) {
|
||||
super(londonForkBlockNumber, Wei.ZERO);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ class CancunFeeMarketTest {
|
||||
|
||||
@Test
|
||||
void dataPricePerGas() {
|
||||
CancunFeeMarket cancunFeeMarket = new CancunFeeMarket(0, Optional.empty());
|
||||
final BaseFeeMarket cancunFeeMarket = FeeMarket.cancun(0, Optional.empty());
|
||||
// when no excess blob gas, data price per gas is 1
|
||||
assertEquals(1, cancunFeeMarket.blobGasPricePerGas(BlobGas.ZERO).getAsBigInteger().intValue());
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ public class LondonFeeMarketTest {
|
||||
.gasPrice(Wei.of(7))
|
||||
.createTransaction(KEY_PAIR1);
|
||||
|
||||
final LondonFeeMarket londonFeeMarket = new LondonFeeMarket(0);
|
||||
final BaseFeeMarket londonFeeMarket = FeeMarket.london(0);
|
||||
assertThat(londonFeeMarket.satisfiesFloorTxFee(transaction)).isTrue();
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public class LondonFeeMarketTest {
|
||||
.gasPrice(null)
|
||||
.createTransaction(KEY_PAIR1);
|
||||
|
||||
final LondonFeeMarket londonFeeMarket = new LondonFeeMarket(0);
|
||||
final BaseFeeMarket londonFeeMarket = FeeMarket.london(0);
|
||||
assertThat(londonFeeMarket.satisfiesFloorTxFee(transaction)).isFalse();
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class LondonFeeMarketTest {
|
||||
.gasPrice(null)
|
||||
.createTransaction(KEY_PAIR1);
|
||||
|
||||
final LondonFeeMarket londonFeeMarket = new LondonFeeMarket(0, Optional.of(Wei.ZERO));
|
||||
final BaseFeeMarket londonFeeMarket = FeeMarket.london(0, Optional.of(Wei.ZERO));
|
||||
assertThat(londonFeeMarket.satisfiesFloorTxFee(transaction)).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import static org.hyperledger.besu.ethereum.mainnet.headervalidationrules.EIP155
|
||||
import org.hyperledger.besu.datatypes.Wei;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -30,7 +29,7 @@ import org.junit.jupiter.api.Test;
|
||||
public class BaseFeeMarketBlockHeaderGasPriceValidationRuleTest {
|
||||
|
||||
private static final long FORK_BLOCK = 800L;
|
||||
private final BaseFeeMarket baseFeeMarket = new LondonFeeMarket(FORK_BLOCK);
|
||||
private final BaseFeeMarket baseFeeMarket = FeeMarket.london(FORK_BLOCK);
|
||||
private BaseFeeMarketBlockHeaderGasPriceValidationRule validationRule;
|
||||
private final BaseFeeMarket feeMarket = FeeMarket.london(FORK_BLOCK);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import org.hyperledger.besu.datatypes.Wei;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeader;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FixedBaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -32,7 +32,7 @@ import org.junit.jupiter.params.provider.CsvSource;
|
||||
public class GasLimitElasticityValidationRuleFixedBaseFeeMarketTest {
|
||||
|
||||
private static final Optional<BaseFeeMarket> fixedBaseFeeMarket =
|
||||
Optional.of(new FixedBaseFeeMarket(10, Wei.ONE));
|
||||
Optional.of(FeeMarket.fixedBaseFee(10, Wei.ONE));
|
||||
|
||||
public GasLimitRangeAndDeltaValidationRule uut =
|
||||
new GasLimitRangeAndDeltaValidationRule(5000, MAX_VALUE, fixedBaseFeeMarket);
|
||||
|
||||
@@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeader;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -30,7 +30,7 @@ import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class GasLimitElasticityValidationRuleTest {
|
||||
|
||||
private static final Optional<BaseFeeMarket> baseFeeMarket = Optional.of(new LondonFeeMarket(10));
|
||||
private static final Optional<BaseFeeMarket> baseFeeMarket = Optional.of(FeeMarket.london(10));
|
||||
|
||||
public GasLimitRangeAndDeltaValidationRule uut =
|
||||
new GasLimitRangeAndDeltaValidationRule(5000, MAX_VALUE, baseFeeMarket);
|
||||
|
||||
@@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeader;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.ZeroBaseFeeMarket;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -31,7 +31,7 @@ import org.junit.jupiter.params.provider.CsvSource;
|
||||
public class GasLimitElasticityValidationRuleZeroBaseFeeMarketTest {
|
||||
|
||||
private static final Optional<BaseFeeMarket> zeroBaseFeeMarket =
|
||||
Optional.of(new ZeroBaseFeeMarket(10));
|
||||
Optional.of(FeeMarket.zeroBaseFee(10));
|
||||
|
||||
public GasLimitRangeAndDeltaValidationRule uut =
|
||||
new GasLimitRangeAndDeltaValidationRule(5000, MAX_VALUE, zeroBaseFeeMarket);
|
||||
|
||||
Reference in New Issue
Block a user