diff --git a/src/it/scala/io/iohk/ethereum/txExecTest/ECIP1017Test.scala b/src/it/scala/io/iohk/ethereum/txExecTest/ECIP1017Test.scala index 2573ff8a43..1197fa3247 100644 --- a/src/it/scala/io/iohk/ethereum/txExecTest/ECIP1017Test.scala +++ b/src/it/scala/io/iohk/ethereum/txExecTest/ECIP1017Test.scala @@ -29,29 +29,12 @@ class ECIP1017Test extends AnyFlatSpec with Matchers { maxCodeSize = None, chainId = 0x3d.toByte, networkId = 1, - forkBlockNumbers = ForkBlockNumbers( + forkBlockNumbers = ForkBlockNumbers.Empty.copy( frontierBlockNumber = 0, homesteadBlockNumber = 1150000, - difficultyBombPauseBlockNumber = Long.MaxValue, - difficultyBombContinueBlockNumber = Long.MaxValue, - difficultyBombRemovalBlockNumber = Long.MaxValue, - eip106BlockNumber = Long.MaxValue, eip150BlockNumber = 2500000, eip160BlockNumber = 3000000, - eip155BlockNumber = 3000000, - eip161BlockNumber = Long.MaxValue, - byzantiumBlockNumber = Long.MaxValue, - constantinopleBlockNumber = Long.MaxValue, - istanbulBlockNumber = Long.MaxValue, - atlantisBlockNumber = Long.MaxValue, - aghartaBlockNumber = Long.MaxValue, - phoenixBlockNumber = Long.MaxValue, - petersburgBlockNumber = Long.MaxValue, - ecip1098BlockNumber = Long.MaxValue, - ecip1097BlockNumber = Long.MaxValue, - ecip1099BlockNumber = Long.MaxValue, - ecip1049BlockNumber = None, - magnetoBlockNumber = Long.MaxValue + eip155BlockNumber = 3000000 ), customGenesisFileOpt = None, customGenesisJsonOpt = None, diff --git a/src/main/resources/conf/chains/etc-chain.conf b/src/main/resources/conf/chains/etc-chain.conf index 0d5d387be4..8c128d63dd 100644 --- a/src/main/resources/conf/chains/etc-chain.conf +++ b/src/main/resources/conf/chains/etc-chain.conf @@ -101,6 +101,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "11700000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "1000000000000000000" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "13189133" diff --git a/src/main/resources/conf/chains/eth-chain.conf b/src/main/resources/conf/chains/eth-chain.conf index af7a98d2c3..45f22bda4b 100644 --- a/src/main/resources/conf/chains/eth-chain.conf +++ b/src/main/resources/conf/chains/eth-chain.conf @@ -98,6 +98,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "1000000000000000000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "9200000" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "1000000000000000000" diff --git a/src/main/resources/conf/chains/mordor-chain.conf b/src/main/resources/conf/chains/mordor-chain.conf index 84970b5e54..55081f18b4 100644 --- a/src/main/resources/conf/chains/mordor-chain.conf +++ b/src/main/resources/conf/chains/mordor-chain.conf @@ -99,6 +99,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "2520000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "1000000000000000000" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "3985893" diff --git a/src/main/resources/conf/chains/ropsten-chain.conf b/src/main/resources/conf/chains/ropsten-chain.conf index 2749003391..f77786fdff 100644 --- a/src/main/resources/conf/chains/ropsten-chain.conf +++ b/src/main/resources/conf/chains/ropsten-chain.conf @@ -102,6 +102,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "1000000000000000000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "7117117" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "1000000000000000000" diff --git a/src/main/resources/conf/chains/test-chain.conf b/src/main/resources/conf/chains/test-chain.conf index afd3d1e728..1ff2b7672a 100644 --- a/src/main/resources/conf/chains/test-chain.conf +++ b/src/main/resources/conf/chains/test-chain.conf @@ -99,6 +99,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "1000000000000000000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "1000000000000000000" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "1000000000000000000" diff --git a/src/main/resources/conf/chains/testnet-internal-nomad-chain.conf b/src/main/resources/conf/chains/testnet-internal-nomad-chain.conf index 9b9bf9bdee..7bb5ebb098 100644 --- a/src/main/resources/conf/chains/testnet-internal-nomad-chain.conf +++ b/src/main/resources/conf/chains/testnet-internal-nomad-chain.conf @@ -98,6 +98,10 @@ # https://ecips.ethereumclassic.org/ECIPs/ecip-1099 ecip1099-block-number = "1000000000000000000" + # Muir Glacier fork block number + # https://eips.ethereum.org/EIPS/eip-2387 + muir-glacier-block-number = "1000000000000000000" + # Magneto EVM and Protocol Upgrades # https://ecips.ethereumclassic.org/ECIPs/ecip-1103 magneto-block-number = "1000000000000000000" diff --git a/src/main/scala/io/iohk/ethereum/consensus/pow/difficulty/EthashDifficultyCalculator.scala b/src/main/scala/io/iohk/ethereum/consensus/pow/difficulty/EthashDifficultyCalculator.scala index e7a3d5ca17..c43512f60d 100644 --- a/src/main/scala/io/iohk/ethereum/consensus/pow/difficulty/EthashDifficultyCalculator.scala +++ b/src/main/scala/io/iohk/ethereum/consensus/pow/difficulty/EthashDifficultyCalculator.scala @@ -6,9 +6,10 @@ import io.iohk.ethereum.utils.BlockchainConfig object EthashDifficultyCalculator extends DifficultyCalculator { import DifficultyCalculator._ - private val ExpDifficultyPeriod: Int = 100000 - private val ByzantiumRelaxDifficulty: BigInt = 3000000 - private val ConstantinopleRelaxDifficulty: BigInt = 5000000 + private val ExpDifficultyPeriod: Int = 100_000 + private val ByzantiumRelaxDifficulty: BigInt = 3_000_000 + private val ConstantinopleRelaxDifficulty: BigInt = 5_000_000 + private val MuirGlacierRelaxDifficulty: BigInt = 9_000_000 def calculateDifficulty(blockNumber: BigInt, blockTimestamp: Long, parentHeader: BlockHeader)(implicit blockchainConfig: BlockchainConfig @@ -32,8 +33,10 @@ object EthashDifficultyCalculator extends DifficultyCalculator { if (blockNumber < difficultyBombRemovalBlockNumber) { // calculate a fake block number for the ice-age delay val fakeBlockNumber: BigInt = + // https://eips.ethereum.org/EIPS/eip-2384 + if (blockNumber >= muirGlacierBlockNumber) (blockNumber - MuirGlacierRelaxDifficulty).max(0) // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1234.md - if (blockNumber >= constantinopleBlockNumber) (blockNumber - ConstantinopleRelaxDifficulty).max(0) + else if (blockNumber >= constantinopleBlockNumber) (blockNumber - ConstantinopleRelaxDifficulty).max(0) // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-649.md else if (blockNumber >= byzantiumBlockNumber) (blockNumber - ByzantiumRelaxDifficulty).max(0) else blockNumber diff --git a/src/main/scala/io/iohk/ethereum/utils/BlockchainConfig.scala b/src/main/scala/io/iohk/ethereum/utils/BlockchainConfig.scala index b2705f6c4a..615f971e66 100644 --- a/src/main/scala/io/iohk/ethereum/utils/BlockchainConfig.scala +++ b/src/main/scala/io/iohk/ethereum/utils/BlockchainConfig.scala @@ -60,6 +60,7 @@ case class ForkBlockNumbers( ecip1097BlockNumber: BigInt, ecip1049BlockNumber: Option[BigInt], ecip1099BlockNumber: BigInt, + muirGlacierBlockNumber: BigInt, magnetoBlockNumber: BigInt ) { def all: List[BigInt] = this.productIterator.toList.flatMap { @@ -96,6 +97,7 @@ object ForkBlockNumbers { ecip1097BlockNumber = Long.MaxValue, ecip1099BlockNumber = Long.MaxValue, ecip1049BlockNumber = None, + muirGlacierBlockNumber = Long.MaxValue, magnetoBlockNumber = Long.MaxValue ) } @@ -167,6 +169,7 @@ object BlockchainConfig { val allowedMinersPublicKeys = readPubKeySet(blockchainConfig, "allowed-miners") val ecip1099BlockNumber: BigInt = BigInt(blockchainConfig.getString("ecip1099-block-number")) + val muirGlacierBlockNumber: BigInt = BigInt(blockchainConfig.getString("muir-glacier-block-number")) val magnetoBlockNumber: BigInt = BigInt(blockchainConfig.getString("magneto-block-number")) val capabilities: List[Capability] = @@ -196,6 +199,7 @@ object BlockchainConfig { ecip1097BlockNumber = ecip1097BlockNumber, ecip1049BlockNumber = ecip1049BlockNumber, ecip1099BlockNumber = ecip1099BlockNumber, + muirGlacierBlockNumber = muirGlacierBlockNumber, magnetoBlockNumber = magnetoBlockNumber ), treasuryAddress = treasuryAddress, diff --git a/src/test/scala/io/iohk/ethereum/consensus/pow/validators/EthashBlockHeaderValidatorSpec.scala b/src/test/scala/io/iohk/ethereum/consensus/pow/validators/EthashBlockHeaderValidatorSpec.scala index 83b84d49e3..e2f7625c88 100644 --- a/src/test/scala/io/iohk/ethereum/consensus/pow/validators/EthashBlockHeaderValidatorSpec.scala +++ b/src/test/scala/io/iohk/ethereum/consensus/pow/validators/EthashBlockHeaderValidatorSpec.scala @@ -254,6 +254,36 @@ class EthashBlockHeaderValidatorSpec difficulty shouldBe afterRewardReductionBlockHeader.difficulty } + it should "properly calculate the difficulty after muir glacier delay" in new EphemBlockchainTestSetup { + val blockchainConfigWithoutDifficultyBombRemoval: BlockchainConfig = + blockchainConfig.withUpdatedForkBlocks( + _.copy( + difficultyBombRemovalBlockNumber = BigInt("1000000000000"), + difficultyBombPauseBlockNumber = 0, + difficultyBombContinueBlockNumber = 0, + muirGlacierBlockNumber = 9200000 + ) + ) + + val parentHeader: BlockHeader = + validParentBlockHeader.copy( + number = 9200000 - 1, + unixTimestamp = 1525176000, + difficulty = BigInt("22627021745803") + ) + val parent = Block(parentHeader, parentBody) + + val blockNumber: BigInt = parentHeader.number + 1 + val blockTimestamp: Long = parentHeader.unixTimestamp + 6 + + val difficulty: BigInt = EthashDifficultyCalculator.calculateDifficulty(blockNumber, blockTimestamp, parent.header)( + blockchainConfigWithoutDifficultyBombRemoval + ) + val blockDifficultyWihtoutBomb = BigInt("22638070096265") + + difficulty shouldBe blockDifficultyWihtoutBomb + } + // FIXME: Replace with mocked miner validators once we have them object BlockValidatorWithPowMocked extends BlockHeaderValidatorSkeleton() { @@ -388,6 +418,7 @@ class EthashBlockHeaderValidatorSpec byzantiumBlockNumber = 4370000, constantinopleBlockNumber = 7280000, istanbulBlockNumber = 9069000, + muirGlacierBlockNumber = 9200000, eip106BlockNumber = 0 ), daoForkConfig = Some(new DaoForkConfig { diff --git a/src/test/scala/io/iohk/ethereum/forkid/ForkIdSpec.scala b/src/test/scala/io/iohk/ethereum/forkid/ForkIdSpec.scala index 94d00404b0..e699abb48f 100644 --- a/src/test/scala/io/iohk/ethereum/forkid/ForkIdSpec.scala +++ b/src/test/scala/io/iohk/ethereum/forkid/ForkIdSpec.scala @@ -26,7 +26,7 @@ class ForkIdSpec extends AnyWordSpec with Matchers { "gatherForks for the eth chain correctly" in { val res = config.blockchains.map { case (name, conf) => (name, gatherForks(conf)) } - res("eth") shouldBe List(1150000, 1920000, 2463000, 2675000, 4370000, 7280000, 9069000) + res("eth") shouldBe List(1150000, 1920000, 2463000, 2675000, 4370000, 7280000, 9069000, 9200000) } "create correct ForkId for ETH mainnet blocks" in { @@ -51,9 +51,11 @@ class ForkIdSpec extends AnyWordSpec with Matchers { Some(9069000) ) // First and last Constantinople, first Petersburg block create(9068999) shouldBe ForkId(0x668db0afL, Some(9069000)) // Last Petersburg block - // TODO: Add Muir Glacier and Berlin - create(9069000) shouldBe ForkId(0x879d6e30L, None) // First Istanbul block - create(12644529) shouldBe ForkId(0x879d6e30L, None) // Today Istanbul block + create(9069000) shouldBe ForkId(0x879d6e30L, Some(9200000)) // First Istanbul block + create(9200000 - 1) shouldBe ForkId(0x879d6e30L, Some(9200000)) // Last Istanbul block + create(9200000) shouldBe ForkId(0xe029e991L, None) // First Muir Glacier block + create(12644529) shouldBe ForkId(0xe029e991L, None) // Today Muir Glacier block + // TODO: Add Berlin } "create correct ForkId for ETC mainnet blocks" in {