Skip to content

Commit 5127a4f

Browse files
committed
don't burn part of the rewards that would go to treasury
1 parent c38c2c2 commit 5127a4f

File tree

6 files changed

+43
-17
lines changed

6 files changed

+43
-17
lines changed

src/main/scala/io/iohk/ethereum/consensus/ConsensusConfig.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ object ConsensusConfig extends Logger {
3131
final val HeaderExtraData = "header-extra-data"
3232
final val BlockCacheSize = "block-cashe-size"
3333
final val MiningEnabled = "mining-enabled"
34-
final val TreasuryOptOut = "treasury-opt-out"
3534
}
3635

3736
final val AllowedProtocols = Set(
@@ -69,15 +68,16 @@ object ConsensusConfig extends Logger {
6968
.take(BlockHeaderValidator.MaxExtraDataSize)
7069
val blockCacheSize = config.getInt(Keys.BlockCacheSize)
7170
val miningEnabled = config.getBoolean(Keys.MiningEnabled)
72-
val optOut = config.getBoolean(Keys.TreasuryOptOut)
71+
// treasuryOptOut should always be false(no funds burned), keep for backwards compatibility
72+
val treasuryOptOut = false
7373

7474
new ConsensusConfig(
7575
protocol = protocol,
7676
coinbase = coinbase,
7777
headerExtraData = headerExtraData,
7878
blockCacheSize = blockCacheSize,
7979
miningEnabled = miningEnabled,
80-
treasuryOptOut = optOut
80+
treasuryOptOut = treasuryOptOut
8181
)
8282
}
8383
}

src/main/scala/io/iohk/ethereum/consensus/validators/BlockHeaderValidator.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ object BlockHeaderError {
4949
case class HeaderFieldNotEmptyError(msg: String) extends BlockHeaderError
5050
case class HeaderNotMatchParentError(msg: String) extends BlockHeaderError
5151
case object CheckpointHeaderTreasuryOptOutError extends BlockHeaderError
52+
case object BlockHeaderTreasuryOptOutError extends BlockHeaderError
5253

5354
case class HeaderUnexpectedError(msg: String) extends BlockHeaderError
5455
}

src/main/scala/io/iohk/ethereum/consensus/validators/BlockHeaderValidatorSkeleton.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ abstract class BlockHeaderValidatorSkeleton(blockchainConfig: BlockchainConfig)
8585
_ <- validateNumber(blockHeader, parentHeader)
8686
_ <- validateExtraFields(blockHeader)
8787
_ <- validateEvenMore(blockHeader)
88+
_ <- validateExtraFieldsTreasuryOptOut(blockHeader)
8889
} yield BlockHeaderValid
8990
}
9091

@@ -239,6 +240,24 @@ abstract class BlockHeaderValidatorSkeleton(blockchainConfig: BlockchainConfig)
239240
}
240241
}
241242

243+
/**
244+
* Validates [[io.iohk.ethereum.domain.BlockHeader.extraFields]] match extrafields - treasuryOptOut when enabled always to false(not burning rewards)
245+
*
246+
* @param blockHeader BlockHeader to validate.
247+
* @return BlockHeader if valid, an [[BlockHeaderTreasuryOptOutError]] otherwise
248+
*/
249+
private def validateExtraFieldsTreasuryOptOut(
250+
blockHeader: BlockHeader
251+
): Either[BlockHeaderError, BlockHeaderValid] = {
252+
253+
blockHeader.extraFields match {
254+
case HefPostEcip1097(treasuryOptOut, _) if !treasuryOptOut => Right(BlockHeaderValid)
255+
case HefPostEcip1098(treasuryOptOut) if !treasuryOptOut => Right(BlockHeaderValid)
256+
case HefEmpty => Right(BlockHeaderValid)
257+
case _ => Left(BlockHeaderTreasuryOptOutError)
258+
}
259+
}
260+
242261
override def validateHeaderOnly(blockHeader: BlockHeader): Either[BlockHeaderError, BlockHeaderValid] = {
243262
for {
244263
_ <- validateExtraData(blockHeader)

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ class BlockPreparator(
4343
* 1. Reward for block is distributed as:
4444
* a. If treasury is disabled or it's has been selfdestructed:
4545
* Pay 100% of it to the miner
46-
* b. If a. isn't true and the miner opted out:
47-
* Pay 80% of it to the miner
48-
* Never generate the 20% else
49-
* c. If a. isn't true and the miner opted in:
46+
* b. If a. isn't true:
5047
* Pay 80% of it to the miner
5148
* Pay 20% of it to the treasury contract
5249
* 2. Miner is payed a reward for the inclusion of ommers
@@ -75,13 +72,6 @@ class BlockPreparator(
7572
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)
7673
log.debug(s"Paying block $blockNumber reward of $minerReward to miner with address $minerAddress")
7774
worldAfterMinerReward
78-
} else if (block.header.treasuryOptOut.get) {
79-
val minerReward = minerRewardForOmmers + minerRewardForBlock * MinerRewardPercentageAfterECIP1098 / 100
80-
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)
81-
log.debug(
82-
s"Paying block $blockNumber reward of $minerReward to miner with address $minerAddress, miner opted-out of treasury"
83-
)
84-
worldAfterMinerReward
8575
} else {
8676
val minerReward = minerRewardForOmmers + minerRewardForBlock * MinerRewardPercentageAfterECIP1098 / 100
8777
val worldAfterMinerReward = increaseAccountBalance(minerAddress, UInt256(minerReward))(worldStateProxy)

src/test/scala/io/iohk/ethereum/consensus/pow/validators/EthashBlockHeaderValidatorSpec.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,26 @@ class EthashBlockHeaderValidatorSpec
188188
res shouldBe Right(BlockHeaderValid)
189189
}
190190

191-
it should "mark as valid a post ecip1098 block opt-out with opt out defined" in new EphemBlockchainTestSetup {
191+
it should "mark as invalid a post ecip1098 block opt-out with opt out defined" in new EphemBlockchainTestSetup {
192192
val ecip1098BlockNumber = validBlockHeader.number / 2
193193
val blockchainConfigWithECIP1098Enabled: BlockchainConfig =
194194
blockchainConfig.copy(ecip1098BlockNumber = ecip1098BlockNumber)
195195
val blockHeaderValidator = new BlockValidatorWithPowMocked(blockchainConfigWithECIP1098Enabled)
196196

197197
val validHeader = validBlockHeader.copy(extraFields = HefPostEcip1098(treasuryOptOut = true))
198198

199+
val validationResult = blockHeaderValidator.validate(validHeader, validParentBlockHeader)
200+
validationResult shouldBe Left(BlockHeaderTreasuryOptOutError)
201+
}
202+
203+
it should "mark as valid a post ecip1098 block opt-out with opt out undefined" in new EphemBlockchainTestSetup {
204+
val ecip1098BlockNumber = validBlockHeader.number / 2
205+
val blockchainConfigWithECIP1098Enabled: BlockchainConfig =
206+
blockchainConfig.copy(ecip1098BlockNumber = ecip1098BlockNumber)
207+
val blockHeaderValidator = new BlockValidatorWithPowMocked(blockchainConfigWithECIP1098Enabled)
208+
209+
val validHeader = validBlockHeader.copy(extraFields = HefPostEcip1098(treasuryOptOut = false))
210+
199211
val validationResult = blockHeaderValidator.validate(validHeader, validParentBlockHeader)
200212
validationResult shouldBe Right(BlockHeaderValid)
201213
}

src/test/scala/io/iohk/ethereum/ledger/BlockRewardSpec.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,17 @@ class BlockRewardSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyC
130130
MinerRewardPercentageAfterECIP1098 * blockReward / 100,
131131
TreasuryRewardPercentageAfterECIP1098 * blockReward / 100
132132
),
133-
(Some(true), true, MinerRewardPercentageAfterECIP1098 * blockReward / 100, 0)
133+
(
134+
Some(true),
135+
true,
136+
MinerRewardPercentageAfterECIP1098 * blockReward / 100,
137+
TreasuryRewardPercentageAfterECIP1098 * blockReward / 100
138+
)
134139
)
135140

136141
forAll(table) { case (minerOptsOut, contractDeployed, minerReward, treasuryReward) =>
137142
val minerAddress = validAccountAddress
138143
val block = sampleBlock(minerAddress, Nil, minerOptsOut)
139-
140144
val worldBeforeExecution =
141145
if (contractDeployed) worldState
142146
else {

0 commit comments

Comments
 (0)