Skip to content

Commit 12b4f31

Browse files
author
lemastero
committed
[ETCM-141] merge from develop
2 parents a3363f1 + 2fb06c0 commit 12b4f31

File tree

6 files changed

+80
-29
lines changed

6 files changed

+80
-29
lines changed

src/main/scala/io/iohk/ethereum/domain/Blockchain.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ class BlockchainImpl(
486486
accountStartNonce,
487487
(number: BigInt) => getBlockHeaderByNumber(number).map(_.hash),
488488
stateRootHash,
489-
noEmptyAccounts = false,
489+
noEmptyAccounts = noEmptyAccounts,
490490
ethCompatibleStorage = ethCompatibleStorage
491491
)
492492

src/main/scala/io/iohk/ethereum/ledger/BlockPreparator.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class BlockPreparator(
3737
blockchainConfig.constantinopleBlockNumber
3838
)
3939

40-
// scalastyle:off method.length
4140
/**
4241
* This function updates the state in order to pay rewards based on YP section 11.3 and with the required
4342
* modifications due to ECIP1097:
@@ -55,7 +54,7 @@ class BlockPreparator(
5554
*
5655
* @param block the block being processed
5756
* @param worldStateProxy the initial state
58-
* @return the state after paying the apropiate reward to who corresponds
57+
* @return the state after paying the appropriate reward to who corresponds
5958
*/
6059
private[ledger] def payBlockReward(
6160
block: Block,
@@ -76,20 +75,17 @@ class BlockPreparator(
7675
val minerReward = minerRewardForOmmers + minerRewardForBlock
7776
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)
7877
log.debug(s"Paying block $blockNumber reward of $minerReward to miner with address $minerAddress")
79-
8078
worldAfterMinerReward
8179
} else if (block.header.treasuryOptOut.get) {
8280
val minerReward = minerRewardForOmmers + minerRewardForBlock * MinerRewardPercentageAfterECIP1098 / 100
8381
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)
8482
log.debug(
8583
s"Paying block $blockNumber reward of $minerReward to miner with address $minerAddress, miner opted-out of treasury"
8684
)
87-
8885
worldAfterMinerReward
8986
} else {
9087
val minerReward = minerRewardForOmmers + minerRewardForBlock * MinerRewardPercentageAfterECIP1098 / 100
9188
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)
92-
9389
val treasuryReward = minerRewardForBlock * TreasuryRewardPercentageAfterECIP1098 / 100
9490
val worldAfterTreasuryReward =
9591
increaseAccountBalance(treasuryAddress, UInt256(treasuryReward))(worldAfterMinerReward)
@@ -98,7 +94,6 @@ class BlockPreparator(
9894
s"Paying block $blockNumber reward of $minerReward to miner with address $minerAddress" +
9995
s"paying treasury reward of $treasuryReward to treasury with address $treasuryAddress"
10096
)
101-
10297
worldAfterTreasuryReward
10398
}
10499

@@ -387,7 +382,7 @@ class BlockPreparator(
387382
None,
388383
blockchainConfig.accountStartNonce,
389384
parentStateRoot,
390-
noEmptyAccounts = false,
385+
noEmptyAccounts = EvmConfig.forBlock(block.header.number, blockchainConfig).noEmptyAccounts,
391386
ethCompatibleStorage = blockchainConfig.ethCompatibleStorage
392387
)
393388
val prepared = executePreparedTransactions(block.body.transactionList, initialWorld, block.header)

src/main/scala/io/iohk/ethereum/ledger/StxLedger.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class StxLedger(blockchain: BlockchainImpl, blockchainConfig: BlockchainConfig,
1919
blockNumber = None,
2020
accountStartNonce = blockchainConfig.accountStartNonce,
2121
stateRootHash = Some(blockHeader.stateRoot),
22-
noEmptyAccounts = false,
22+
noEmptyAccounts = EvmConfig.forBlock(blockHeader.number, blockchainConfig).noEmptyAccounts,
2323
ethCompatibleStorage = blockchainConfig.ethCompatibleStorage
2424
)
2525
)

src/main/scala/io/iohk/ethereum/vm/BlockchainConfigForEvm.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import io.iohk.ethereum.vm.BlockchainConfigForEvm.EthForks.{
1616
* Note that `accountStartNonce` is required for a [[WorldStateProxy]] implementation that is used
1717
* by a given VM
1818
*/
19-
// FIXME manage etc/eth forks in a more sophisticated way
19+
// FIXME manage etc/eth forks in a more sophisticated way [ETCM-249]
2020
case class BlockchainConfigForEvm(
2121
// ETH forks
2222
frontierBlockNumber: BigInt,

src/main/scala/io/iohk/ethereum/vm/EvmConfig.scala

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import EvmConfig._
77
import io.iohk.ethereum
88
import io.iohk.ethereum.vm
99

10-
// scalastyle:off number.of.methods
11-
// scalastyle:off number.of.types
1210
// scalastyle:off magic.number
1311
object EvmConfig {
1412

@@ -30,26 +28,28 @@ object EvmConfig {
3028
* returns the evm config that should be used for given block
3129
*/
3230
def forBlock(blockNumber: BigInt, blockchainConfig: BlockchainConfigForEvm): EvmConfig = {
33-
val transitionBlockToConfigMapping: Map[BigInt, EvmConfigBuilder] = Map(
34-
blockchainConfig.frontierBlockNumber -> FrontierConfigBuilder,
35-
blockchainConfig.homesteadBlockNumber -> HomesteadConfigBuilder,
36-
blockchainConfig.eip150BlockNumber -> PostEIP150ConfigBuilder,
37-
blockchainConfig.eip160BlockNumber -> PostEIP160ConfigBuilder,
38-
blockchainConfig.eip161BlockNumber -> PostEIP161ConfigBuilder,
39-
blockchainConfig.byzantiumBlockNumber -> ByzantiumConfigBuilder,
40-
blockchainConfig.constantinopleBlockNumber -> ConstantinopleConfigBuilder,
41-
blockchainConfig.istanbulBlockNumber -> IstanbulConfigBuilder,
42-
blockchainConfig.atlantisBlockNumber -> AtlantisConfigBuilder,
43-
blockchainConfig.aghartaBlockNumber -> AghartaConfigBuilder,
44-
blockchainConfig.petersburgBlockNumber -> PetersburgConfigBuilder,
45-
blockchainConfig.phoenixBlockNumber -> PhoenixConfigBuilder
31+
// FIXME manage etc/eth forks in a more sophisticated way [ETCM-249]
32+
val transitionBlockToConfigWithPriorityMapping: List[(BigInt, Int, EvmConfigBuilder)] = List(
33+
(blockchainConfig.frontierBlockNumber, 1, FrontierConfigBuilder),
34+
(blockchainConfig.homesteadBlockNumber, 2, HomesteadConfigBuilder),
35+
(blockchainConfig.eip150BlockNumber, 3, PostEIP150ConfigBuilder),
36+
(blockchainConfig.eip160BlockNumber, 4, PostEIP160ConfigBuilder),
37+
(blockchainConfig.eip161BlockNumber, 5, PostEIP161ConfigBuilder),
38+
(blockchainConfig.byzantiumBlockNumber, 6, ByzantiumConfigBuilder),
39+
(blockchainConfig.atlantisBlockNumber, 6, AtlantisConfigBuilder),
40+
(blockchainConfig.constantinopleBlockNumber, 7, ConstantinopleConfigBuilder),
41+
(blockchainConfig.aghartaBlockNumber, 7, AghartaConfigBuilder),
42+
(blockchainConfig.petersburgBlockNumber, 8, PetersburgConfigBuilder),
43+
(blockchainConfig.istanbulBlockNumber, 9, IstanbulConfigBuilder),
44+
(blockchainConfig.phoenixBlockNumber, 9, PhoenixConfigBuilder)
4645
)
4746

4847
// highest transition block that is less/equal to `blockNumber`
49-
val evmConfigBuilder = transitionBlockToConfigMapping
50-
.filterKeys(_ <= blockNumber)
51-
.maxBy(_._1)
52-
._2
48+
val evmConfigBuilder = transitionBlockToConfigWithPriorityMapping
49+
.filterNot { case (number, _, _) => number > blockNumber }
50+
.maxBy { case (number, priority, _) => (number, priority) }
51+
._3
52+
5353
evmConfigBuilder(blockchainConfig)
5454
}
5555

src/test/scala/io/iohk/ethereum/consensus/BlockGeneratorSpec.scala

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,62 @@ class BlockGeneratorSpec extends AnyFlatSpec with Matchers with ScalaCheckProper
258258
fullBlock.right.foreach(b => b.header.extraData shouldBe headerExtraData)
259259
}
260260

261+
it should "generate correct block with (without empty accounts) after EIP-161" in new TestSetup {
262+
override lazy val blockchainConfig = BlockchainConfig(
263+
frontierBlockNumber = 0,
264+
homesteadBlockNumber = 1150000,
265+
difficultyBombPauseBlockNumber = 3000000,
266+
difficultyBombContinueBlockNumber = 5000000,
267+
difficultyBombRemovalBlockNumber = 5900000,
268+
eip155BlockNumber = Long.MaxValue,
269+
eip106BlockNumber = Long.MaxValue,
270+
byzantiumBlockNumber = Long.MaxValue,
271+
constantinopleBlockNumber = Long.MaxValue,
272+
istanbulBlockNumber = Long.MaxValue,
273+
chainId = 0x3d.toByte,
274+
networkId = 1,
275+
customGenesisFileOpt = Some("test-genesis.json"),
276+
monetaryPolicyConfig =
277+
MonetaryPolicyConfig(5000000, 0.2, 5000000000000000000L, 3000000000000000000L, 2000000000000000000L),
278+
// unused
279+
maxCodeSize = None,
280+
eip160BlockNumber = Long.MaxValue,
281+
eip150BlockNumber = Long.MaxValue,
282+
eip161BlockNumber = 0,
283+
accountStartNonce = UInt256.Zero,
284+
daoForkConfig = None,
285+
bootstrapNodes = Set(),
286+
gasTieBreaker = false,
287+
ethCompatibleStorage = true,
288+
atlantisBlockNumber = Long.MaxValue,
289+
aghartaBlockNumber = Long.MaxValue,
290+
phoenixBlockNumber = Long.MaxValue,
291+
petersburgBlockNumber = Long.MaxValue,
292+
ecip1098BlockNumber = Long.MaxValue,
293+
treasuryAddress = Address(0),
294+
ecip1097BlockNumber = Long.MaxValue
295+
)
296+
297+
override lazy val blockExecution =
298+
new BlockExecution(blockchain, blockchainConfig, consensus.blockPreparator, blockValidation)
299+
300+
val transaction1 = Transaction(
301+
nonce = 0,
302+
gasPrice = 1,
303+
gasLimit = 1000000,
304+
receivingAddress = None,
305+
value = 0,
306+
payload = ByteString.empty
307+
)
308+
val generalTx = SignedTransaction.sign(transaction1, keyPair, None).tx
309+
310+
val generatedBlock: Either[BlockPreparationError, PendingBlock] =
311+
blockGenerator.generateBlock(bestBlock, Seq(generalTx), Address(testAddress), blockGenerator.emptyX)
312+
313+
generatedBlock shouldBe a[Right[_, Block]]
314+
generatedBlock.right.foreach(pb => blockExecution.executeBlock(pb.block, true) shouldBe a[Right[_, Seq[Receipt]]])
315+
}
316+
261317
it should "generate block after eip155 and allow both chain specific and general transactions" in new TestSetup {
262318
val generalTx = SignedTransaction.sign(transaction.copy(nonce = transaction.nonce + 1), keyPair, None).tx
263319

0 commit comments

Comments
 (0)