@@ -12,10 +12,10 @@ import com.wavesplatform.network.ChannelGroupExt
1212import com .wavesplatform .state .diffs .FeeValidation .{FeeConstants , FeeUnit , ScriptExtraFee }
1313import com .wavesplatform .state .diffs .TransactionDiffer .TransactionValidationError
1414import com .wavesplatform .state .{Blockchain , BooleanDataEntry }
15+ import com .wavesplatform .transaction .*
1516import com .wavesplatform .transaction .TxValidationError .InvokeRejectError
1617import com .wavesplatform .transaction .smart .InvokeScriptTransaction
1718import com .wavesplatform .transaction .smart .script .trace .TracedResult
18- import com .wavesplatform .transaction .*
1919import com .wavesplatform .utils .{Time , UnsupportedFeature , forceStopApplication }
2020import com .wavesplatform .wallet .Wallet
2121import io .netty .channel .Channel
@@ -189,7 +189,7 @@ class ELUpdater(
189189 val startC2ETransferIndex = lastC2ETransferIndex + 1
190190
191191 val rewardWithdrawal = prevEpochMinerRewardAddress
192- .map(Withdrawal (startElWithdrawalIndex, _, chainContractOptions.miningReward))
192+ .map(Withdrawal (startElWithdrawalIndex, _, chainContractOptions.miningReward.valueAtEpoch(epochInfo.number) ))
193193 .toVector
194194
195195 val strictC2ETransfersActivated = epochInfo.number >= chainContractClient.getStrictC2ETransfersActivationEpoch
@@ -301,7 +301,7 @@ class ELUpdater(
301301 lastEcBlock <- engineApiClient.getLastExecutionBlock()
302302 willSimulateBlock = lastEcBlock.hash != parentBlock.hash
303303 currentUnixTs = time.correctedTime() / 1000
304- nextBlockUnixTs = (parentBlock.timestamp + config.blockDelay.toSeconds ).max(
304+ nextBlockUnixTs = (parentBlock.timestamp + prevState.options.blockDelayInSeconds.valueAtEpoch(epochInfo.number) ).max(
305305 currentUnixTs +
306306 // We don't collect transactions for simulated payload, thus we don't need to wait for firstBlockMinDelay
307307 (if (willSimulateBlock) 0 else config.firstBlockMinDelay.toSeconds)
@@ -390,8 +390,9 @@ class ELUpdater(
390390 getAndApplyPayloadResult match {
391391 case Left (err) => logger.error(s " Failed to forge block at epoch ${epochInfo.number}: ${err.message}" )
392392 case Right (networkBlock) =>
393- val ecBlock = networkBlock.toEcBlock
394- val nextBlockUnixTs = (ecBlock.timestamp + config.blockDelay.toSeconds).max(time.correctedTime() / 1000 )
393+ val ecBlock = networkBlock.toEcBlock
394+ val nextBlockUnixTs =
395+ (ecBlock.timestamp + chainContractOptions.blockDelayInSeconds.valueAtEpoch(epochInfo.number)).max(time.correctedTime() / 1000 )
395396 val nextMiningDataE = updateHeadAndStartBuildingPayload(
396397 epochInfo,
397398 ecBlock,
@@ -1004,28 +1005,23 @@ class ELUpdater(
10041005 }
10051006
10061007 // Of a current epoch miner
1007- private def validateBlockSignature (block : NetworkL2Block , epochInfo : Option [EpochInfo ]): JobResult [Unit ] = {
1008- epochInfo match {
1009- case Some (epochMeta) =>
1010- for {
1011- _ <- Either .raiseUnless(block.minerRewardL2Address == epochMeta.rewardAddress) {
1012- ClientError (s " block miner ${block.minerRewardL2Address} doesn't equal to ${epochMeta.rewardAddress}" )
1013- }
1014- signature <- Either .fromOption(block.signature, ClientError (s " signature not found " ))
1015- publicKey <- Either .fromOption(
1016- chainContractClient.getMinerPublicKey(block.minerRewardL2Address),
1017- ClientError (s " public key for block miner ${block.minerRewardL2Address} not found " )
1018- )
1019- _ <- Either .raiseUnless(crypto.verify(signature, Json .toBytes(block.payload), publicKey, checkWeakPk = true )) {
1020- ClientError (s " invalid signature " )
1021- }
1022- } yield ()
1023- case _ => Either .unit
1024- }
1025- }
1008+ private def validateBlockSignature (block : NetworkL2Block , epochInfo : EpochInfo ): JobResult [Unit ] =
1009+ for {
1010+ _ <- Either .raiseUnless(block.minerRewardL2Address == epochInfo.rewardAddress) {
1011+ ClientError (s " block miner ${block.minerRewardL2Address} doesn't equal to ${epochInfo.rewardAddress}" )
1012+ }
1013+ signature <- Either .fromOption(block.signature, ClientError (s " signature not found " ))
1014+ publicKey <- Either .fromOption(
1015+ chainContractClient.getMinerPublicKey(block.minerRewardL2Address),
1016+ ClientError (s " public key for block miner ${block.minerRewardL2Address} not found " )
1017+ )
1018+ _ <- Either .raiseUnless(crypto.verify(signature, Json .toBytes(block.payload), publicKey, checkWeakPk = true )) {
1019+ ClientError (s " invalid signature " )
1020+ }
1021+ } yield ()
10261022
1027- private def validateTimestamp (newNetworkBlock : NetworkL2Block , parentEcBlock : EcBlock ): JobResult [Unit ] = {
1028- val minAppendTs = parentEcBlock.timestamp + config.blockDelay.toSeconds
1023+ private def validateTimestamp (newNetworkBlock : NetworkL2Block , parentEcBlock : EcBlock , epoch : Int ): JobResult [Unit ] = {
1024+ val minAppendTs = parentEcBlock.timestamp + chainContractClient.getOptions.blockDelayInSeconds.valueAtEpoch(epoch)
10291025 Either .raiseUnless(newNetworkBlock.timestamp >= minAppendTs) {
10301026 ClientError (
10311027 s " timestamp ( ${newNetworkBlock.timestamp}) of appended block must be greater or equal $minAppendTs, " +
@@ -1034,11 +1030,6 @@ class ELUpdater(
10341030 }
10351031 }
10361032
1037- private def preValidateBlock (networkBlock : NetworkL2Block , parentBlock : EcBlock , epochInfo : Option [EpochInfo ]): JobResult [Unit ] = for {
1038- _ <- validateTimestamp(networkBlock, parentBlock)
1039- _ <- validateBlockSignature(networkBlock, epochInfo)
1040- } yield ()
1041-
10421033 private def getAltChainReferenceBlock (nodeChainInfo : ChainInfo , lastContractBlock : ContractBlock ): JobResult [ContractBlock ] = {
10431034 if (nodeChainInfo.isMain) {
10441035 for {
@@ -1104,9 +1095,8 @@ class ELUpdater(
11041095 processInvalidBlock(contractBlock, prevState, Some (nodeChainInfo))
11051096 }
11061097 case contractBlock =>
1107- // We should check block signature based on epochInfo if block is not at contract yet
1108- val epochInfo = Option .when(contractBlock.isEmpty)(prevState.epochInfo)
1109- applyBlock(networkBlock, parentBlock, epochInfo) match {
1098+ (if (contractBlock.isEmpty) validateBlockSignature(networkBlock, prevState.epochInfo) else ().asRight[ClientError ])
1099+ .flatMap(_ => applyBlock(networkBlock, parentBlock, prevState.epochInfo)) match {
11101100 case Right (_) =>
11111101 logger.debug(s " Block ${networkBlock.hash} successfully applied " )
11121102 broadcastAndConfirmBlock(networkBlock, ch, prevState, nodeChainInfo, returnToMainChainInfo)
@@ -1577,13 +1567,13 @@ class ELUpdater(
15771567 ): JobResult [Working [ChainStatus ]] = {
15781568 logger.trace(s " Trying to apply and do a full validation of block ${networkBlock.hash}" )
15791569 for {
1580- _ <- applyBlock(networkBlock, parentBlock, epochInfo = None ) // epochInfo is empty, because we don't need to validate a block signature
1570+ _ <- applyBlock(networkBlock, parentBlock, prevState.epochInfo)
15811571 updatedState <- validateAppliedBlock(contractBlock, networkBlock.toEcBlock, prevState)
15821572 } yield updatedState
15831573 }
15841574
1585- private def applyBlock (networkBlock : NetworkL2Block , parentBlock : EcBlock , epochInfo : Option [ EpochInfo ] ): JobResult [Unit ] = for {
1586- _ <- preValidateBlock (networkBlock, parentBlock, epochInfo)
1575+ private def applyBlock (networkBlock : NetworkL2Block , parentBlock : EcBlock , epochInfo : EpochInfo ): JobResult [Unit ] = for {
1576+ _ <- validateTimestamp (networkBlock, parentBlock, epochInfo.number )
15871577 _ <- engineApiClient.newPayload(networkBlock.payload)
15881578 } yield ()
15891579
@@ -1611,7 +1601,9 @@ class ELUpdater(
16111601 _ <- validateE2CTransfers(contractBlock, ecBlockLogs)
16121602 _ <- validateAssetRegistryUpdate(ecBlockLogs, contractBlock, parentContractBlock, prevState.options)
16131603 _ <- validateRandao(ecBlock, contractBlock.epoch)
1614- miningReward = getMinerRewardAddress(contractBlock, parentContractBlock).map(MiningReward (_, prevState.options.miningReward))
1604+ miningReward = getMinerRewardAddress(contractBlock, parentContractBlock).map(
1605+ MiningReward (_, prevState.options.miningReward.valueAtEpoch(contractBlock.epoch))
1606+ )
16151607 updatedLastElWithdrawalIndex <- validateC2E(
16161608 contractBlock,
16171609 ecBlock,
0 commit comments