Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EIP2384 - Ice Age Adustment around Istanbul #211

Merged
merged 10 commits into from
Dec 4, 2019
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ jobs:
- capture_test_results

integrationTests:
executor: besu_executor_med
executor: besu_executor_xl
steps:
- prepare
- attach_workspace:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ public interface GenesisConfigOptions {

OptionalLong getIstanbulBlockNumber();

OptionalLong getMuirGlacierBlockNumber();

/**
* Block number for the Dao Fork, this value is used to tell node to connect with peer that did
* NOT accept the Dao Fork and instead continued as what is now called the classic network
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@ public OptionalLong getIstanbulBlockNumber() {
return getOptionalLong("istanbulblock");
}

@Override
public OptionalLong getMuirGlacierBlockNumber() {
return getOptionalLong("muirglacierblock");
}

@Override
public OptionalLong getClassicForkBlock() {
return getOptionalLong("classicforkblock");
Expand Down Expand Up @@ -273,6 +278,7 @@ public Map<String, Object> asMap() {
getConstantinopleBlockNumber().ifPresent(l -> builder.put("constantinopleBlock", l));
getConstantinopleFixBlockNumber().ifPresent(l -> builder.put("constantinopleFixBlock", l));
getIstanbulBlockNumber().ifPresent(l -> builder.put("istanbulBlock", l));
getMuirGlacierBlockNumber().ifPresent(l -> builder.put("muirGlacierBlock", l));
getContractSizeLimit().ifPresent(l -> builder.put("contractSizeLimit", l));
getEvmStackSize().ifPresent(l -> builder.put("evmstacksize", l));
if (isClique()) {
Expand Down
4 changes: 2 additions & 2 deletions config/src/main/resources/mainnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
"byzantiumBlock": 4370000,
"constantinopleBlock": 7280000,
"constantinopleFixBlock": 7280000,
"istanbulBlock": 9069000,
"istanbulBlock": 9069000,
"muirGlacierBlock": 9200000,
"ethash": {

}
},
"nonce": "0x42",
Expand Down
1 change: 1 addition & 0 deletions config/src/main/resources/ropsten.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"constantinopleBlock": 4230000,
"constantinopleFixBlock": 4939394,
"istanbulBlock": 6485846,
"muirGlacierBlock": 7117117,
"ethash": {
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,14 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions {
private OptionalLong constantinopleBlockNumber = OptionalLong.empty();
private OptionalLong constantinopleFixBlockNumber = OptionalLong.empty();
private OptionalLong istanbulBlockNumber = OptionalLong.empty();
private OptionalLong classicForkBlock = OptionalLong.empty();
private OptionalLong ecip1015BlockNumber = OptionalLong.empty();
private OptionalLong diehardBlockNumber = OptionalLong.empty();
private OptionalLong gothamBlockNumber = OptionalLong.empty();
private OptionalLong defuseDifficultyBombBlockNumber = OptionalLong.empty();
private OptionalLong atlantisBlockNumber = OptionalLong.empty();
private OptionalLong aghartaBlockNumber = OptionalLong.empty();
private OptionalLong muirGlacierBlockNumber = OptionalLong.empty();
private final OptionalLong classicForkBlock = OptionalLong.empty();
private final OptionalLong ecip1015BlockNumber = OptionalLong.empty();
private final OptionalLong diehardBlockNumber = OptionalLong.empty();
private final OptionalLong gothamBlockNumber = OptionalLong.empty();
private final OptionalLong defuseDifficultyBombBlockNumber = OptionalLong.empty();
private final OptionalLong atlantisBlockNumber = OptionalLong.empty();
private final OptionalLong aghartaBlockNumber = OptionalLong.empty();
private Optional<BigInteger> chainId = Optional.empty();
private OptionalInt contractSizeLimit = OptionalInt.empty();
private OptionalInt stackSizeLimit = OptionalInt.empty();
Expand Down Expand Up @@ -128,6 +129,11 @@ public OptionalLong getIstanbulBlockNumber() {
return istanbulBlockNumber;
}

@Override
public OptionalLong getMuirGlacierBlockNumber() {
return muirGlacierBlockNumber;
}

@Override
public OptionalLong getClassicForkBlock() {
return classicForkBlock;
Expand Down Expand Up @@ -200,6 +206,7 @@ public Map<String, Object> asMap() {
getConstantinopleBlockNumber().ifPresent(l -> builder.put("constantinopleBlock", l));
getConstantinopleFixBlockNumber().ifPresent(l -> builder.put("constantinopleFixBlock", l));
getIstanbulBlockNumber().ifPresent(l -> builder.put("istanbulBlock", l));
getMuirGlacierBlockNumber().ifPresent(l -> builder.put("muirGlacierBlock", l));
getContractSizeLimit().ifPresent(l -> builder.put("contractSizeLimit", l));
getEvmStackSize().ifPresent(l -> builder.put("evmStackSize", l));
if (isClique()) {
Expand Down Expand Up @@ -262,6 +269,11 @@ public StubGenesisConfigOptions istanbulBlock(final long blockNumber) {
return this;
}

public StubGenesisConfigOptions muirGlacierBlock(final long blockNumber) {
muirGlacierBlockNumber = OptionalLong.of(blockNumber);
return this;
}
RatanRSur marked this conversation as resolved.
Show resolved Hide resolved

public StubGenesisConfigOptions chainId(final BigInteger chainId) {
this.chainId = Optional.ofNullable(chainId);
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ public void shouldGetIstanbulBlockNumber() {
assertThat(config.getIstanbulBlockNumber()).hasValue(1000);
}

@Test
public void shouldGetMuirGlacierBlockNumber() {
final GenesisConfigOptions config = fromConfigOptions(singletonMap("muirGlacierBlock", 1000));
assertThat(config.getMuirGlacierBlockNumber()).hasValue(1000);
}

@Test
public void shouldNotReturnEmptyOptionalWhenBlockNumberNotSpecified() {
final GenesisConfigOptions config = fromConfigOptions(emptyMap());
Expand All @@ -144,6 +150,7 @@ public void shouldNotReturnEmptyOptionalWhenBlockNumberNotSpecified() {
assertThat(config.getConstantinopleBlockNumber()).isEmpty();
assertThat(config.getConstantinopleFixBlockNumber()).isEmpty();
assertThat(config.getIstanbulBlockNumber()).isEmpty();
assertThat(config.getMuirGlacierBlockNumber()).isEmpty();
}

@Test
Expand Down
6 changes: 4 additions & 2 deletions ethereum/core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,11 @@ task testJar (type: Jar) {
}

test {
exclude 'org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.class'
exclude 'org/hyperledger/besu/ethereum/core/TransactionTest.class'
exclude 'org/hyperledger/besu/ethereum/vm/**ReferenceTest.class'
exclude 'org/hyperledger/besu/ethereum/vm/blockchain/**.class'
exclude 'org/hyperledger/besu/ethereum/vm/generalstate/**.class'
exclude 'org/hyperledger/besu/ethereum/core/TransactionTest.class'
}

def generateTestFiles(FileTree jsonPath, File templateFile, String pathstrip, String destination, String namePrefix) {
Expand Down Expand Up @@ -185,10 +186,11 @@ task referenceTests(type: Test, dependsOn: [
}
scanForTestClasses = false
enableAssertions = true
include 'org/hyperledger/besu/ethereum/core/TransactionTest.class'
include 'org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.class'
include 'org/hyperledger/besu/ethereum/vm/**ReferenceTest.class'
include 'org/hyperledger/besu/ethereum/vm/blockchain/**.class'
include 'org/hyperledger/besu/ethereum/vm/generalstate/**.class'
include 'org/hyperledger/besu/ethereum/core/TransactionTest.class'
}

artifacts {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import java.math.BigInteger;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.primitives.Ints;

/** Provides the various difficultly calculates used on mainnet hard forks. */
Expand All @@ -37,6 +38,7 @@ public abstract class MainnetDifficultyCalculators {

private static final long BYZANTIUM_FAKE_BLOCK_OFFSET = 2_999_999L;
private static final long CONSTANTINOPLE_FAKE_BLOCK_OFFSET = 4_999_999L;
private static final long MUIR_GLACIER_FAKE_BLOCK_OFFSET = 8_999_999L;

private MainnetDifficultyCalculators() {}

Expand Down Expand Up @@ -67,15 +69,20 @@ private MainnetDifficultyCalculators() {}
return periodCount > 1 ? adjustForPeriod(periodCount, difficulty) : difficulty;
};

@VisibleForTesting
public static DifficultyCalculator<Void> BYZANTIUM =
(time, parent, protocolContext) ->
calculateByzantiumDifficulty(time, parent, BYZANTIUM_FAKE_BLOCK_OFFSET);
calculateThawedDifficulty(time, parent, BYZANTIUM_FAKE_BLOCK_OFFSET);

public static DifficultyCalculator<Void> CONSTANTINOPLE =
static DifficultyCalculator<Void> CONSTANTINOPLE =
(time, parent, protocolContext) ->
calculateByzantiumDifficulty(time, parent, CONSTANTINOPLE_FAKE_BLOCK_OFFSET);
calculateThawedDifficulty(time, parent, CONSTANTINOPLE_FAKE_BLOCK_OFFSET);

private static BigInteger calculateByzantiumDifficulty(
static DifficultyCalculator<Void> MUIR_GLACIER =
(time, parent, protocolContext) ->
calculateThawedDifficulty(time, parent, MUIR_GLACIER_FAKE_BLOCK_OFFSET);
RatanRSur marked this conversation as resolved.
Show resolved Hide resolved

private static BigInteger calculateThawedDifficulty(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this be calculateMuirGlacierDifficulty? As it is it seems like it reduces code discoverability if you're searching for instances of the hard fork, like you could have when it was Byzantium?

Copy link
Contributor Author

@shemnon shemnon Dec 4, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's used in 3 different places, Byzantium, Constantinople, and now MuirGlacier. Before it was calculageByzantiumDifficulty.

final long time, final BlockHeader parent, final long fakeBlockOffset) {
final BigInteger parentDifficulty = difficulty(parent.getDifficulty());
final boolean hasOmmers = !parent.getOmmersHash().equals(Hash.EMPTY_LIST_HASH);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,16 @@ public static ProtocolSpecBuilder<Void> istanbulDefinition(
.name("Istanbul");
}

static ProtocolSpecBuilder<Void> muirGlacierDefinition(
final Optional<BigInteger> chainId,
final OptionalInt contractSizeLimit,
final OptionalInt configStackSizeLimit,
final boolean enableRevertReason) {
return istanbulDefinition(chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason)
.difficultyCalculator(MainnetDifficultyCalculators.MUIR_GLACIER)
.name("MuirGlacier");
}

private static TransactionReceipt frontierTransactionReceiptFactory(
final TransactionProcessor.Result result, final WorldState worldState, final long gasUsed) {
return new TransactionReceipt(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,14 @@ public ProtocolSchedule<C> createProtocolSchedule() {
config.getContractSizeLimit(),
config.getEvmStackSize(),
isRevertReasonEnabled));
addProtocolSpec(
protocolSchedule,
config.getMuirGlacierBlockNumber(),
MainnetProtocolSpecs.muirGlacierDefinition(
chainId,
config.getContractSizeLimit(),
config.getEvmStackSize(),
isRevertReasonEnabled));

// specs for classic network
config
Expand Down Expand Up @@ -260,6 +268,8 @@ private void validateEthereumForkOrdering() {
validateForkOrder(
"ConstantinopleFix", config.getConstantinopleFixBlockNumber(), lastForkBlock);
lastForkBlock = validateForkOrder("Istanbul", config.getIstanbulBlockNumber(), lastForkBlock);
lastForkBlock =
validateForkOrder("MuirGlacier", config.getMuirGlacierBlockNumber(), lastForkBlock);
assert (lastForkBlock >= 0);
}

Expand Down
Loading