mirror of
https://github.com/vacp2p/status-linea-besu.git
synced 2026-01-08 21:38:15 -05:00
Fix and restore disabled block creation unit tests (#7331)
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
This commit is contained in:
@@ -26,8 +26,9 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import org.hyperledger.besu.config.GenesisConfigFile;
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.config.GenesisConfigOptions;
|
|
||||||
import org.hyperledger.besu.crypto.KeyPair;
|
import org.hyperledger.besu.crypto.KeyPair;
|
||||||
|
import org.hyperledger.besu.crypto.SECPPrivateKey;
|
||||||
|
import org.hyperledger.besu.crypto.SignatureAlgorithm;
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
||||||
import org.hyperledger.besu.datatypes.Address;
|
import org.hyperledger.besu.datatypes.Address;
|
||||||
import org.hyperledger.besu.datatypes.BLSPublicKey;
|
import org.hyperledger.besu.datatypes.BLSPublicKey;
|
||||||
@@ -73,13 +74,18 @@ import org.hyperledger.besu.ethereum.mainnet.BodyValidation;
|
|||||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder;
|
import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters;
|
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters;
|
||||||
|
import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams;
|
||||||
|
import org.hyperledger.besu.ethereum.mainnet.TransactionValidator;
|
||||||
|
import org.hyperledger.besu.ethereum.mainnet.TransactionValidatorFactory;
|
||||||
|
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor;
|
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket;
|
|
||||||
import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor;
|
import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator;
|
import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext;
|
import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
|
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
|
||||||
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator;
|
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator;
|
||||||
|
import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason;
|
||||||
|
import org.hyperledger.besu.evm.account.Account;
|
||||||
import org.hyperledger.besu.evm.internal.EvmConfiguration;
|
import org.hyperledger.besu.evm.internal.EvmConfiguration;
|
||||||
import org.hyperledger.besu.evm.log.Log;
|
import org.hyperledger.besu.evm.log.Log;
|
||||||
import org.hyperledger.besu.evm.log.LogTopic;
|
import org.hyperledger.besu.evm.log.LogTopic;
|
||||||
@@ -89,13 +95,13 @@ import org.hyperledger.besu.testutil.DeterministicEthScheduler;
|
|||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.time.Clock;
|
import java.time.Clock;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Suppliers;
|
||||||
import org.apache.tuweni.bytes.Bytes;
|
import org.apache.tuweni.bytes.Bytes;
|
||||||
import org.apache.tuweni.bytes.Bytes32;
|
import org.apache.tuweni.bytes.Bytes32;
|
||||||
import org.apache.tuweni.units.bigints.UInt64;
|
import org.apache.tuweni.units.bigints.UInt64;
|
||||||
import org.junit.jupiter.api.Disabled;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
@@ -103,6 +109,17 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
|||||||
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
abstract class AbstractBlockCreatorTest {
|
abstract class AbstractBlockCreatorTest {
|
||||||
|
private static final Supplier<SignatureAlgorithm> SIGNATURE_ALGORITHM =
|
||||||
|
Suppliers.memoize(SignatureAlgorithmFactory::getInstance);
|
||||||
|
private static final SECPPrivateKey PRIVATE_KEY1 =
|
||||||
|
SIGNATURE_ALGORITHM
|
||||||
|
.get()
|
||||||
|
.createPrivateKey(
|
||||||
|
Bytes32.fromHexString(
|
||||||
|
"8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"));
|
||||||
|
private static final KeyPair KEYS1 =
|
||||||
|
new KeyPair(PRIVATE_KEY1, SIGNATURE_ALGORITHM.get().createPublicKey(PRIVATE_KEY1));
|
||||||
|
|
||||||
@Mock private WithdrawalsProcessor withdrawalsProcessor;
|
@Mock private WithdrawalsProcessor withdrawalsProcessor;
|
||||||
protected EthScheduler ethScheduler = new DeterministicEthScheduler();
|
protected EthScheduler ethScheduler = new DeterministicEthScheduler();
|
||||||
|
|
||||||
@@ -301,10 +318,8 @@ abstract class AbstractBlockCreatorTest {
|
|||||||
assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty();
|
assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Disabled
|
|
||||||
@Test
|
@Test
|
||||||
public void computesGasUsageFromIncludedTransactions() {
|
public void computesGasUsageFromIncludedTransactions() {
|
||||||
final KeyPair senderKeys = SignatureAlgorithmFactory.getInstance().generateKeyPair();
|
|
||||||
final AbstractBlockCreator blockCreator = blockCreatorWithBlobGasSupport();
|
final AbstractBlockCreator blockCreator = blockCreatorWithBlobGasSupport();
|
||||||
BlobTestFixture blobTestFixture = new BlobTestFixture();
|
BlobTestFixture blobTestFixture = new BlobTestFixture();
|
||||||
BlobsWithCommitments bwc = blobTestFixture.createBlobsWithCommitments(6);
|
BlobsWithCommitments bwc = blobTestFixture.createBlobsWithCommitments(6);
|
||||||
@@ -313,13 +328,14 @@ abstract class AbstractBlockCreatorTest {
|
|||||||
ttf.to(Optional.of(Address.ZERO))
|
ttf.to(Optional.of(Address.ZERO))
|
||||||
.type(TransactionType.BLOB)
|
.type(TransactionType.BLOB)
|
||||||
.chainId(Optional.of(BigInteger.valueOf(42)))
|
.chainId(Optional.of(BigInteger.valueOf(42)))
|
||||||
|
.gasLimit(21000)
|
||||||
.maxFeePerGas(Optional.of(Wei.of(15)))
|
.maxFeePerGas(Optional.of(Wei.of(15)))
|
||||||
.maxFeePerBlobGas(Optional.of(Wei.of(128)))
|
.maxFeePerBlobGas(Optional.of(Wei.of(128)))
|
||||||
.maxPriorityFeePerGas(Optional.of(Wei.of(1)))
|
.maxPriorityFeePerGas(Optional.of(Wei.of(1)))
|
||||||
.versionedHashes(Optional.of(bwc.getVersionedHashes()))
|
.versionedHashes(Optional.of(bwc.getVersionedHashes()))
|
||||||
.createTransaction(senderKeys);
|
.blobsWithCommitments(Optional.of(bwc))
|
||||||
|
.createTransaction(KEYS1);
|
||||||
|
|
||||||
ttf.blobsWithCommitments(Optional.of(bwc));
|
|
||||||
final BlockCreationResult blockCreationResult =
|
final BlockCreationResult blockCreationResult =
|
||||||
blockCreator.createBlock(
|
blockCreator.createBlock(
|
||||||
Optional.of(List.of(fullOfBlobs)),
|
Optional.of(List.of(fullOfBlobs)),
|
||||||
@@ -336,13 +352,17 @@ abstract class AbstractBlockCreatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private AbstractBlockCreator blockCreatorWithBlobGasSupport() {
|
private AbstractBlockCreator blockCreatorWithBlobGasSupport() {
|
||||||
|
final var alwaysValidTransactionValidatorFactory = mock(TransactionValidatorFactory.class);
|
||||||
|
when(alwaysValidTransactionValidatorFactory.get())
|
||||||
|
.thenReturn(new AlwaysValidTransactionValidator());
|
||||||
final ProtocolSpecAdapters protocolSpecAdapters =
|
final ProtocolSpecAdapters protocolSpecAdapters =
|
||||||
ProtocolSpecAdapters.create(
|
ProtocolSpecAdapters.create(
|
||||||
0,
|
0,
|
||||||
specBuilder -> {
|
specBuilder -> {
|
||||||
specBuilder.feeMarket(new CancunFeeMarket(0, Optional.empty()));
|
|
||||||
specBuilder.isReplayProtectionSupported(true);
|
specBuilder.isReplayProtectionSupported(true);
|
||||||
specBuilder.withdrawalsProcessor(withdrawalsProcessor);
|
specBuilder.withdrawalsProcessor(withdrawalsProcessor);
|
||||||
|
specBuilder.transactionValidatorFactoryBuilder(
|
||||||
|
(evm, gasLimitCalculator, feeMarket) -> alwaysValidTransactionValidatorFactory);
|
||||||
return specBuilder;
|
return specBuilder;
|
||||||
});
|
});
|
||||||
return createBlockCreator(protocolSpecAdapters);
|
return createBlockCreator(protocolSpecAdapters);
|
||||||
@@ -356,16 +376,19 @@ abstract class AbstractBlockCreatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private AbstractBlockCreator blockCreatorWithoutWithdrawalsProcessor() {
|
private AbstractBlockCreator blockCreatorWithoutWithdrawalsProcessor() {
|
||||||
return createBlockCreator(new ProtocolSpecAdapters(Map.of()));
|
final ProtocolSpecAdapters protocolSpecAdapters =
|
||||||
|
ProtocolSpecAdapters.create(0, specBuilder -> specBuilder.withdrawalsProcessor(null));
|
||||||
|
return createBlockCreator(protocolSpecAdapters);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbstractBlockCreator createBlockCreator(final ProtocolSpecAdapters protocolSpecAdapters) {
|
private AbstractBlockCreator createBlockCreator(final ProtocolSpecAdapters protocolSpecAdapters) {
|
||||||
final GenesisConfigOptions genesisConfigOptions = GenesisConfigFile.DEFAULT.getConfigOptions();
|
|
||||||
|
final var genesisConfigFile = GenesisConfigFile.fromResource("/block-creation-genesis.json");
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder()
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
.protocolSchedule(
|
.protocolSchedule(
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
genesisConfigOptions,
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
protocolSpecAdapters,
|
protocolSpecAdapters,
|
||||||
PrivacyParameters.DEFAULT,
|
PrivacyParameters.DEFAULT,
|
||||||
@@ -452,4 +475,24 @@ abstract class AbstractBlockCreatorTest {
|
|||||||
.buildBlockHeader();
|
.buildBlockHeader();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class AlwaysValidTransactionValidator implements TransactionValidator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValidationResult<TransactionInvalidReason> validate(
|
||||||
|
final Transaction transaction,
|
||||||
|
final Optional<Wei> baseFee,
|
||||||
|
final Optional<Wei> blobBaseFee,
|
||||||
|
final TransactionValidationParams transactionValidationParams) {
|
||||||
|
return ValidationResult.valid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValidationResult<TransactionInvalidReason> validateForSender(
|
||||||
|
final Transaction transaction,
|
||||||
|
final Account sender,
|
||||||
|
final TransactionValidationParams validationParams) {
|
||||||
|
return ValidationResult.valid();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,10 +42,6 @@ import org.hyperledger.besu.util.number.Fraction;
|
|||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Disabled;
|
|
||||||
|
|
||||||
@Disabled(
|
|
||||||
"disabled since it's flaky with a timeout see https://github.com/hyperledger/besu/issues/6850")
|
|
||||||
public class LegacyFeeMarketBlockTransactionSelectorTest
|
public class LegacyFeeMarketBlockTransactionSelectorTest
|
||||||
extends AbstractBlockTransactionSelectorTest {
|
extends AbstractBlockTransactionSelectorTest {
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import static org.mockito.Mockito.mock;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import org.hyperledger.besu.config.GenesisConfigFile;
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.config.GenesisConfigOptions;
|
|
||||||
import org.hyperledger.besu.datatypes.Address;
|
import org.hyperledger.besu.datatypes.Address;
|
||||||
import org.hyperledger.besu.datatypes.Hash;
|
import org.hyperledger.besu.datatypes.Hash;
|
||||||
import org.hyperledger.besu.datatypes.Wei;
|
import org.hyperledger.besu.datatypes.Wei;
|
||||||
@@ -38,6 +37,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters;
|
|||||||
import org.hyperledger.besu.ethereum.core.MutableWorldState;
|
import org.hyperledger.besu.ethereum.core.MutableWorldState;
|
||||||
import org.hyperledger.besu.ethereum.core.PrivacyParameters;
|
import org.hyperledger.besu.ethereum.core.PrivacyParameters;
|
||||||
import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader;
|
import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader;
|
||||||
|
import org.hyperledger.besu.ethereum.difficulty.fixed.FixedDifficultyCalculators;
|
||||||
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
|
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
|
||||||
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
|
import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration;
|
||||||
import org.hyperledger.besu.ethereum.eth.transactions.TransactionBroadcaster;
|
import org.hyperledger.besu.ethereum.eth.transactions.TransactionBroadcaster;
|
||||||
@@ -75,6 +75,7 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
private static final long BLOCK_1_TIMESTAMP = Long.parseUnsignedLong("55ba4224", 16);
|
private static final long BLOCK_1_TIMESTAMP = Long.parseUnsignedLong("55ba4224", 16);
|
||||||
|
|
||||||
private static final long BLOCK_1_NONCE = Long.parseLong("539bd4979fef1ec4", 16);
|
private static final long BLOCK_1_NONCE = Long.parseLong("539bd4979fef1ec4", 16);
|
||||||
|
private static final long FIXED_DIFFICULTY_NONCE = 26;
|
||||||
|
|
||||||
private static final Bytes BLOCK_1_EXTRA_DATA =
|
private static final Bytes BLOCK_1_EXTRA_DATA =
|
||||||
Bytes.fromHexString("0x476574682f76312e302e302f6c696e75782f676f312e342e32");
|
Bytes.fromHexString("0x476574682f76312e302e302f6c696e75782f676f312e342e32");
|
||||||
@@ -82,24 +83,25 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void createMainnetBlock1() throws IOException {
|
void createMainnetBlock1() throws IOException {
|
||||||
final GenesisConfigOptions genesisConfigOptions = GenesisConfigFile.DEFAULT.getConfigOptions();
|
final var genesisConfigFile = GenesisConfigFile.mainnet();
|
||||||
|
|
||||||
|
final MiningParameters miningParameters = createMiningParameters(BLOCK_1_NONCE);
|
||||||
|
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder()
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
.protocolSchedule(
|
.protocolSchedule(
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
genesisConfigOptions,
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(0, Function.identity()),
|
||||||
PrivacyParameters.DEFAULT,
|
PrivacyParameters.DEFAULT,
|
||||||
false,
|
false,
|
||||||
EvmConfiguration.DEFAULT,
|
EvmConfiguration.DEFAULT,
|
||||||
MiningParameters.MINING_DISABLED,
|
miningParameters,
|
||||||
new BadBlockManager())
|
new BadBlockManager())
|
||||||
.createProtocolSchedule())
|
.createProtocolSchedule())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final MiningParameters miningParameters = createMiningParameters();
|
|
||||||
|
|
||||||
final PoWSolver solver =
|
final PoWSolver solver =
|
||||||
new PoWSolver(
|
new PoWSolver(
|
||||||
miningParameters,
|
miningParameters,
|
||||||
@@ -136,26 +138,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void createMainnetBlock1_fixedDifficulty1() {
|
void createMainnetBlock1_fixedDifficulty1() {
|
||||||
final GenesisConfigOptions genesisConfigOptions =
|
final var genesisConfigFile =
|
||||||
GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}")
|
GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json");
|
||||||
.getConfigOptions();
|
|
||||||
|
final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE);
|
||||||
|
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder()
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
.protocolSchedule(
|
.protocolSchedule(
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
genesisConfigOptions,
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(
|
||||||
|
0,
|
||||||
|
specBuilder ->
|
||||||
|
specBuilder.difficultyCalculator(
|
||||||
|
FixedDifficultyCalculators.calculator(
|
||||||
|
genesisConfigFile.getConfigOptions()))),
|
||||||
PrivacyParameters.DEFAULT,
|
PrivacyParameters.DEFAULT,
|
||||||
false,
|
false,
|
||||||
EvmConfiguration.DEFAULT,
|
EvmConfiguration.DEFAULT,
|
||||||
MiningParameters.MINING_DISABLED,
|
miningParameters,
|
||||||
new BadBlockManager())
|
new BadBlockManager())
|
||||||
.createProtocolSchedule())
|
.createProtocolSchedule())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final MiningParameters miningParameters = createMiningParameters();
|
|
||||||
|
|
||||||
final PoWSolver solver =
|
final PoWSolver solver =
|
||||||
new PoWSolver(
|
new PoWSolver(
|
||||||
miningParameters,
|
miningParameters,
|
||||||
@@ -184,24 +191,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rewardBeneficiary_zeroReward_skipZeroRewardsFalse() {
|
void rewardBeneficiary_zeroReward_skipZeroRewardsFalse() {
|
||||||
final GenesisConfigOptions genesisConfigOptions =
|
final var genesisConfigFile =
|
||||||
GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}")
|
GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json");
|
||||||
.getConfigOptions();
|
|
||||||
|
final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE);
|
||||||
|
|
||||||
ProtocolSchedule protocolSchedule =
|
ProtocolSchedule protocolSchedule =
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
genesisConfigOptions,
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(
|
||||||
|
0,
|
||||||
|
specBuilder ->
|
||||||
|
specBuilder.difficultyCalculator(
|
||||||
|
FixedDifficultyCalculators.calculator(
|
||||||
|
genesisConfigFile.getConfigOptions()))),
|
||||||
PrivacyParameters.DEFAULT,
|
PrivacyParameters.DEFAULT,
|
||||||
false,
|
false,
|
||||||
EvmConfiguration.DEFAULT,
|
EvmConfiguration.DEFAULT,
|
||||||
MiningParameters.MINING_DISABLED,
|
miningParameters,
|
||||||
new BadBlockManager())
|
new BadBlockManager())
|
||||||
.createProtocolSchedule();
|
.createProtocolSchedule();
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build();
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
|
.protocolSchedule(protocolSchedule)
|
||||||
final MiningParameters miningParameters = createMiningParameters();
|
.build();
|
||||||
|
|
||||||
final PoWSolver solver =
|
final PoWSolver solver =
|
||||||
new PoWSolver(
|
new PoWSolver(
|
||||||
@@ -253,24 +267,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rewardBeneficiary_zeroReward_skipZeroRewardsTrue() {
|
void rewardBeneficiary_zeroReward_skipZeroRewardsTrue() {
|
||||||
final GenesisConfigOptions genesisConfigOptions =
|
final var genesisConfigFile =
|
||||||
GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}")
|
GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json");
|
||||||
.getConfigOptions();
|
|
||||||
|
final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE);
|
||||||
|
|
||||||
ProtocolSchedule protocolSchedule =
|
ProtocolSchedule protocolSchedule =
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
genesisConfigOptions,
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(
|
||||||
|
0,
|
||||||
|
specBuilder ->
|
||||||
|
specBuilder.difficultyCalculator(
|
||||||
|
FixedDifficultyCalculators.calculator(
|
||||||
|
genesisConfigFile.getConfigOptions()))),
|
||||||
PrivacyParameters.DEFAULT,
|
PrivacyParameters.DEFAULT,
|
||||||
false,
|
false,
|
||||||
EvmConfiguration.DEFAULT,
|
EvmConfiguration.DEFAULT,
|
||||||
MiningParameters.MINING_DISABLED,
|
miningParameters,
|
||||||
new BadBlockManager())
|
new BadBlockManager())
|
||||||
.createProtocolSchedule();
|
.createProtocolSchedule();
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build();
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
|
.protocolSchedule(protocolSchedule)
|
||||||
final MiningParameters miningParameters = createMiningParameters();
|
.build();
|
||||||
|
|
||||||
final PoWSolver solver =
|
final PoWSolver solver =
|
||||||
new PoWSolver(
|
new PoWSolver(
|
||||||
@@ -348,11 +369,12 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest {
|
|||||||
return transactionPool;
|
return transactionPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MiningParameters createMiningParameters() {
|
private MiningParameters createMiningParameters(final long nonce) {
|
||||||
return ImmutableMiningParameters.builder()
|
return ImmutableMiningParameters.builder()
|
||||||
.mutableInitValues(
|
.mutableInitValues(
|
||||||
MutableInitValues.builder()
|
MutableInitValues.builder()
|
||||||
.nonceGenerator(Lists.newArrayList(BLOCK_1_NONCE))
|
.nonceGenerator(Lists.newArrayList(nonce))
|
||||||
|
// .nonceGenerator(new IncrementingNonceGenerator(0))
|
||||||
.extraData(BLOCK_1_EXTRA_DATA)
|
.extraData(BLOCK_1_EXTRA_DATA)
|
||||||
.minTransactionGasPrice(Wei.ONE)
|
.minTransactionGasPrice(Wei.ONE)
|
||||||
.coinbase(BLOCK_1_COINBASE)
|
.coinbase(BLOCK_1_COINBASE)
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"chainId": 42,
|
||||||
|
"frontierBlock": 0,
|
||||||
|
"ethash": {
|
||||||
|
"fixeddifficulty":10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nonce": "0x42",
|
||||||
|
"timestamp": "0x0",
|
||||||
|
"extraData": "",
|
||||||
|
"gasLimit": "0x1fffffffffffff",
|
||||||
|
"difficulty": "0x1",
|
||||||
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||||
|
"baseFeePerGas": "0x7",
|
||||||
|
"alloc": {
|
||||||
|
"fe3b557e8fb62b89f4916b721be55ceb828dbd73": {
|
||||||
|
"privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "0xad78ebc5ac6200000"
|
||||||
|
},
|
||||||
|
"627306090abaB3A6e1400e9345bC60c78a8BEf57": {
|
||||||
|
"privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "90000000000000000000000"
|
||||||
|
},
|
||||||
|
"f17f52151EbEF6C7334FAD080c5704D77216b732": {
|
||||||
|
"privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "90000000000000000000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"chainId": 42,
|
||||||
|
"cancunTime": 0,
|
||||||
|
"terminalTotalDifficulty": 0
|
||||||
|
},
|
||||||
|
"nonce": "0x42",
|
||||||
|
"timestamp": "0x0",
|
||||||
|
"extraData": "",
|
||||||
|
"gasLimit": "0x1fffffffffffff",
|
||||||
|
"difficulty": "0x10000",
|
||||||
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||||
|
"baseFeePerGas": "0x7",
|
||||||
|
"alloc": {
|
||||||
|
"fe3b557e8fb62b89f4916b721be55ceb828dbd73": {
|
||||||
|
"privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "0xad78ebc5ac6200000"
|
||||||
|
},
|
||||||
|
"627306090abaB3A6e1400e9345bC60c78a8BEf57": {
|
||||||
|
"privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "90000000000000000000000"
|
||||||
|
},
|
||||||
|
"f17f52151EbEF6C7334FAD080c5704D77216b732": {
|
||||||
|
"privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f",
|
||||||
|
"comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored",
|
||||||
|
"balance": "90000000000000000000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.assertj.core.api.Assertions.entry;
|
import static org.assertj.core.api.Assertions.entry;
|
||||||
import static org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup;
|
import static org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup;
|
||||||
|
|
||||||
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.crypto.KeyPair;
|
import org.hyperledger.besu.crypto.KeyPair;
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
||||||
import org.hyperledger.besu.datatypes.TransactionType;
|
import org.hyperledger.besu.datatypes.TransactionType;
|
||||||
@@ -68,7 +69,9 @@ public class TraceTransactionIntegrationTest {
|
|||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
final ExecutionContextTestFixture contextTestFixture = ExecutionContextTestFixture.create();
|
final ExecutionContextTestFixture contextTestFixture =
|
||||||
|
ExecutionContextTestFixture.builder(GenesisConfigFile.fromResource("/genesis-it.json"))
|
||||||
|
.build();
|
||||||
genesisBlock = contextTestFixture.getGenesis();
|
genesisBlock = contextTestFixture.getGenesis();
|
||||||
blockchain = contextTestFixture.getBlockchain();
|
blockchain = contextTestFixture.getBlockchain();
|
||||||
worldStateArchive = contextTestFixture.getStateArchive();
|
worldStateArchive = contextTestFixture.getStateArchive();
|
||||||
|
|||||||
13
ethereum/core/src/integration-test/resources/genesis-it.json
Normal file
13
ethereum/core/src/integration-test/resources/genesis-it.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"petersburgBlock": 0
|
||||||
|
},
|
||||||
|
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||||
|
"difficulty": "0x0000001",
|
||||||
|
"extraData": "",
|
||||||
|
"gasLimit": "0x2fefd8",
|
||||||
|
"nonce": "0x0000000000000107",
|
||||||
|
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"timestamp": "0x00"
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.vm.operations;
|
|||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.ethereum.chain.Blockchain;
|
import org.hyperledger.besu.ethereum.chain.Blockchain;
|
||||||
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
|
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
|
||||||
import org.hyperledger.besu.ethereum.core.Block;
|
import org.hyperledger.besu.ethereum.core.Block;
|
||||||
@@ -74,7 +75,9 @@ public class OperationBenchmarkHelper {
|
|||||||
KeyValueSegmentIdentifier.BLOCKCHAIN, optimisticRocksDBColumnarKeyValueStorage);
|
KeyValueSegmentIdentifier.BLOCKCHAIN, optimisticRocksDBColumnarKeyValueStorage);
|
||||||
|
|
||||||
final ExecutionContextTestFixture executionContext =
|
final ExecutionContextTestFixture executionContext =
|
||||||
ExecutionContextTestFixture.builder().blockchainKeyValueStorage(keyValueStorage).build();
|
ExecutionContextTestFixture.builder(GenesisConfigFile.fromResource("/genesis-jmh.json"))
|
||||||
|
.blockchainKeyValueStorage(keyValueStorage)
|
||||||
|
.build();
|
||||||
final MutableBlockchain blockchain = executionContext.getBlockchain();
|
final MutableBlockchain blockchain = executionContext.getBlockchain();
|
||||||
|
|
||||||
for (int i = 1; i < 256; i++) {
|
for (int i = 1; i < 256; i++) {
|
||||||
|
|||||||
13
ethereum/core/src/jmh/resources/genesis-jmh.json
Normal file
13
ethereum/core/src/jmh/resources/genesis-jmh.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"petersburgBlock": 0
|
||||||
|
},
|
||||||
|
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||||
|
"difficulty": "0x0000001",
|
||||||
|
"extraData": "",
|
||||||
|
"gasLimit": "0x2fefd8",
|
||||||
|
"nonce": "0x0000000000000107",
|
||||||
|
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"timestamp": "0x00"
|
||||||
|
}
|
||||||
@@ -17,7 +17,6 @@ package org.hyperledger.besu.ethereum.core;
|
|||||||
import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive;
|
import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive;
|
||||||
|
|
||||||
import org.hyperledger.besu.config.GenesisConfigFile;
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.config.StubGenesisConfigOptions;
|
|
||||||
import org.hyperledger.besu.ethereum.ProtocolContext;
|
import org.hyperledger.besu.ethereum.ProtocolContext;
|
||||||
import org.hyperledger.besu.ethereum.chain.BadBlockManager;
|
import org.hyperledger.besu.ethereum.chain.BadBlockManager;
|
||||||
import org.hyperledger.besu.ethereum.chain.DefaultBlockchain;
|
import org.hyperledger.besu.ethereum.chain.DefaultBlockchain;
|
||||||
@@ -48,9 +47,9 @@ public class ExecutionContextTestFixture {
|
|||||||
|
|
||||||
private final ProtocolSchedule protocolSchedule;
|
private final ProtocolSchedule protocolSchedule;
|
||||||
private final ProtocolContext protocolContext;
|
private final ProtocolContext protocolContext;
|
||||||
private static final GenesisConfigFile genesisConfigFile = GenesisConfigFile.mainnet();
|
|
||||||
|
|
||||||
private ExecutionContextTestFixture(
|
private ExecutionContextTestFixture(
|
||||||
|
final GenesisConfigFile genesisConfigFile,
|
||||||
final ProtocolSchedule protocolSchedule,
|
final ProtocolSchedule protocolSchedule,
|
||||||
final KeyValueStorage blockchainKeyValueStorage,
|
final KeyValueStorage blockchainKeyValueStorage,
|
||||||
final KeyValueStorage variablesKeyValueStorage) {
|
final KeyValueStorage variablesKeyValueStorage) {
|
||||||
@@ -76,11 +75,11 @@ public class ExecutionContextTestFixture {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static ExecutionContextTestFixture create() {
|
public static ExecutionContextTestFixture create() {
|
||||||
return new Builder().build();
|
return new Builder(GenesisConfigFile.mainnet()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder builder() {
|
public static Builder builder(final GenesisConfigFile genesisConfigFile) {
|
||||||
return new Builder();
|
return new Builder(genesisConfigFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Block getGenesis() {
|
public Block getGenesis() {
|
||||||
@@ -112,10 +111,15 @@ public class ExecutionContextTestFixture {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
private final GenesisConfigFile genesisConfigFile;
|
||||||
private KeyValueStorage variablesKeyValueStorage;
|
private KeyValueStorage variablesKeyValueStorage;
|
||||||
private KeyValueStorage blockchainKeyValueStorage;
|
private KeyValueStorage blockchainKeyValueStorage;
|
||||||
private ProtocolSchedule protocolSchedule;
|
private ProtocolSchedule protocolSchedule;
|
||||||
|
|
||||||
|
public Builder(final GenesisConfigFile genesisConfigFile) {
|
||||||
|
this.genesisConfigFile = genesisConfigFile;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder variablesKeyValueStorage(final KeyValueStorage keyValueStorage) {
|
public Builder variablesKeyValueStorage(final KeyValueStorage keyValueStorage) {
|
||||||
this.variablesKeyValueStorage = keyValueStorage;
|
this.variablesKeyValueStorage = keyValueStorage;
|
||||||
return this;
|
return this;
|
||||||
@@ -135,7 +139,7 @@ public class ExecutionContextTestFixture {
|
|||||||
if (protocolSchedule == null) {
|
if (protocolSchedule == null) {
|
||||||
protocolSchedule =
|
protocolSchedule =
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
new StubGenesisConfigOptions().petersburgBlock(0),
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(42),
|
BigInteger.valueOf(42),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(0, Function.identity()),
|
||||||
new PrivacyParameters(),
|
new PrivacyParameters(),
|
||||||
@@ -152,7 +156,7 @@ public class ExecutionContextTestFixture {
|
|||||||
variablesKeyValueStorage = new InMemoryKeyValueStorage();
|
variablesKeyValueStorage = new InMemoryKeyValueStorage();
|
||||||
}
|
}
|
||||||
return new ExecutionContextTestFixture(
|
return new ExecutionContextTestFixture(
|
||||||
protocolSchedule, variablesKeyValueStorage, blockchainKeyValueStorage);
|
genesisConfigFile, protocolSchedule, variablesKeyValueStorage, blockchainKeyValueStorage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.mockito.quality.Strictness.LENIENT;
|
import static org.mockito.quality.Strictness.LENIENT;
|
||||||
|
|
||||||
import org.hyperledger.besu.config.StubGenesisConfigOptions;
|
import org.hyperledger.besu.config.GenesisConfigFile;
|
||||||
import org.hyperledger.besu.crypto.KeyPair;
|
import org.hyperledger.besu.crypto.KeyPair;
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
|
||||||
import org.hyperledger.besu.datatypes.Address;
|
import org.hyperledger.besu.datatypes.Address;
|
||||||
@@ -191,9 +191,10 @@ public abstract class AbstractTransactionPoolTest {
|
|||||||
protected abstract ExecutionContextTestFixture createExecutionContextTestFixture();
|
protected abstract ExecutionContextTestFixture createExecutionContextTestFixture();
|
||||||
|
|
||||||
protected static ExecutionContextTestFixture createExecutionContextTestFixtureBaseFeeMarket() {
|
protected static ExecutionContextTestFixture createExecutionContextTestFixtureBaseFeeMarket() {
|
||||||
|
final var genesisConfigFile = GenesisConfigFile.fromResource("/txpool-test-genesis.json");
|
||||||
final ProtocolSchedule protocolSchedule =
|
final ProtocolSchedule protocolSchedule =
|
||||||
new ProtocolScheduleBuilder(
|
new ProtocolScheduleBuilder(
|
||||||
new StubGenesisConfigOptions().londonBlock(0L).baseFeePerGas(10L),
|
genesisConfigFile.getConfigOptions(),
|
||||||
BigInteger.valueOf(1),
|
BigInteger.valueOf(1),
|
||||||
ProtocolSpecAdapters.create(0, Function.identity()),
|
ProtocolSpecAdapters.create(0, Function.identity()),
|
||||||
new PrivacyParameters(),
|
new PrivacyParameters(),
|
||||||
@@ -203,7 +204,9 @@ public abstract class AbstractTransactionPoolTest {
|
|||||||
new BadBlockManager())
|
new BadBlockManager())
|
||||||
.createProtocolSchedule();
|
.createProtocolSchedule();
|
||||||
final ExecutionContextTestFixture executionContextTestFixture =
|
final ExecutionContextTestFixture executionContextTestFixture =
|
||||||
ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build();
|
ExecutionContextTestFixture.builder(genesisConfigFile)
|
||||||
|
.protocolSchedule(protocolSchedule)
|
||||||
|
.build();
|
||||||
|
|
||||||
final Block block =
|
final Block block =
|
||||||
new Block(
|
new Block(
|
||||||
|
|||||||
15
ethereum/eth/src/test/resources/txpool-test-genesis.json
Normal file
15
ethereum/eth/src/test/resources/txpool-test-genesis.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"chainId": 1,
|
||||||
|
"cancunTime": 0,
|
||||||
|
"terminalTotalDifficulty": 0
|
||||||
|
},
|
||||||
|
"nonce": "0x42",
|
||||||
|
"timestamp": "0x0",
|
||||||
|
"extraData": "",
|
||||||
|
"gasLimit": "0x1fffffffffffff",
|
||||||
|
"difficulty": "0x10000",
|
||||||
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||||
|
"baseFeePerGas": "0xA"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user