Skip to content

[FIX] Add mocked miner validations #678

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

Merged
merged 2 commits into from
Sep 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package io.iohk.ethereum.ets.blockchain

import akka.util.ByteString
import io.iohk.ethereum.consensus.ethash.validators.EthashValidators
import io.iohk.ethereum.consensus.Protocol
import io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor
import io.iohk.ethereum.domain.{Address, UInt256}
import io.iohk.ethereum.utils.{BlockchainConfig, DaoForkConfig, MonetaryPolicyConfig}
import org.bouncycastle.util.encoders.Hex
Expand Down Expand Up @@ -290,37 +291,37 @@ object BlockchainTestConfig {
object Validators {
import BlockchainTestConfig._

val frontierValidators = EthashValidators(FrontierConfig)
val homesteadValidators = EthashValidators(HomesteadConfig)
val eip150Validators = EthashValidators(Eip150Config)
val frontierToHomesteadValidators = EthashValidators(FrontierToHomesteadAt5)
val homesteadToEipValidators = EthashValidators(HomesteadToEIP150At5)
val homesteadToDaoValidators= EthashValidators(HomesteadToDaoAt5)
val eip158Validators = EthashValidators(Eip158Config)
val byzantiumValidators = EthashValidators(ByzantiumConfig)
val constantinopleValidators = EthashValidators(ConstantinopleConfig)
val constantinopleFixValidators = EthashValidators(ConstantinopleFixConfig)
val istanbulValidators = EthashValidators(IstanbulConfig)
val eip158ToByzantiumValidators = EthashValidators(Eip158ToByzantiumAt5Config)
val byzantiumToConstantinopleAt5 = EthashValidators(ByzantiumToConstantinopleAt5)
val frontierValidators = ValidatorsExecutor(FrontierConfig, Protocol.Ethash)
val homesteadValidators = ValidatorsExecutor(HomesteadConfig, Protocol.Ethash)
val eip150Validators = ValidatorsExecutor(Eip150Config, Protocol.Ethash)
val frontierToHomesteadValidators = ValidatorsExecutor(FrontierToHomesteadAt5, Protocol.Ethash)
val homesteadToEipValidators = ValidatorsExecutor(HomesteadToEIP150At5, Protocol.Ethash)
val homesteadToDaoValidators= ValidatorsExecutor(HomesteadToDaoAt5, Protocol.Ethash)
val eip158Validators = ValidatorsExecutor(Eip158Config, Protocol.Ethash)
val byzantiumValidators = ValidatorsExecutor(ByzantiumConfig, Protocol.Ethash)
val constantinopleValidators = ValidatorsExecutor(ConstantinopleConfig, Protocol.Ethash)
val constantinopleFixValidators = ValidatorsExecutor(ConstantinopleFixConfig, Protocol.Ethash)
val istanbulValidators = ValidatorsExecutor(IstanbulConfig, Protocol.Ethash)
val eip158ToByzantiumValidators = ValidatorsExecutor(Eip158ToByzantiumAt5Config, Protocol.Ethash)
val byzantiumToConstantinopleAt5 = ValidatorsExecutor(ByzantiumToConstantinopleAt5, Protocol.Ethash)
}

// Connected with: https://github.com/ethereum/tests/issues/480
object ValidatorsWithSkippedPoW {

import BlockchainTestConfig._

val frontierValidators = EthashValidators(FrontierConfig, new EthashTestBlockHeaderValidator(FrontierConfig))
val homesteadValidators = EthashValidators(HomesteadConfig, new EthashTestBlockHeaderValidator(HomesteadConfig))
val eip150Validators = EthashValidators(Eip150Config, new EthashTestBlockHeaderValidator(Eip150Config))
val frontierToHomesteadValidators = EthashValidators(FrontierToHomesteadAt5, new EthashTestBlockHeaderValidator(FrontierToHomesteadAt5))
val homesteadToEipValidators = EthashValidators(HomesteadToEIP150At5, new EthashTestBlockHeaderValidator(HomesteadToEIP150At5))
val homesteadToDaoValidators= EthashValidators(HomesteadToDaoAt5, new EthashTestBlockHeaderValidator(HomesteadToDaoAt5))
val eip158Validators = EthashValidators(Eip158Config, new EthashTestBlockHeaderValidator(Eip158Config))
val byzantiumValidators = EthashValidators(ByzantiumConfig, new EthashTestBlockHeaderValidator(ByzantiumConfig))
val constantinopleValidators = EthashValidators(ConstantinopleConfig, new EthashTestBlockHeaderValidator(ConstantinopleConfig))
val constantinopleFixValidators = EthashValidators(ConstantinopleFixConfig, new EthashTestBlockHeaderValidator(ConstantinopleFixConfig))
val istanbulValidators = EthashValidators(IstanbulConfig, new EthashTestBlockHeaderValidator(IstanbulConfig))
val eip158ToByzantiumValidators = EthashValidators(Eip158ToByzantiumAt5Config, new EthashTestBlockHeaderValidator(Eip158ToByzantiumAt5Config))
val byzantiumToConstantinopleAt5 = EthashValidators(ByzantiumToConstantinopleAt5, new EthashTestBlockHeaderValidator(ByzantiumToConstantinopleAt5))
val frontierValidators = ValidatorsExecutor(FrontierConfig, new EthashTestBlockHeaderValidator(FrontierConfig))
val homesteadValidators = ValidatorsExecutor(HomesteadConfig, new EthashTestBlockHeaderValidator(HomesteadConfig))
val eip150Validators = ValidatorsExecutor(Eip150Config, new EthashTestBlockHeaderValidator(Eip150Config))
val frontierToHomesteadValidators = ValidatorsExecutor(FrontierToHomesteadAt5, new EthashTestBlockHeaderValidator(FrontierToHomesteadAt5))
val homesteadToEipValidators = ValidatorsExecutor(HomesteadToEIP150At5, new EthashTestBlockHeaderValidator(HomesteadToEIP150At5))
val homesteadToDaoValidators= ValidatorsExecutor(HomesteadToDaoAt5, new EthashTestBlockHeaderValidator(HomesteadToDaoAt5))
val eip158Validators = ValidatorsExecutor(Eip158Config, new EthashTestBlockHeaderValidator(Eip158Config))
val byzantiumValidators = ValidatorsExecutor(ByzantiumConfig, new EthashTestBlockHeaderValidator(ByzantiumConfig))
val constantinopleValidators = ValidatorsExecutor(ConstantinopleConfig, new EthashTestBlockHeaderValidator(ConstantinopleConfig))
val constantinopleFixValidators = ValidatorsExecutor(ConstantinopleFixConfig, new EthashTestBlockHeaderValidator(ConstantinopleFixConfig))
val istanbulValidators = ValidatorsExecutor(IstanbulConfig, new EthashTestBlockHeaderValidator(IstanbulConfig))
val eip158ToByzantiumValidators = ValidatorsExecutor(Eip158ToByzantiumAt5Config, new EthashTestBlockHeaderValidator(Eip158ToByzantiumAt5Config))
val byzantiumToConstantinopleAt5 = ValidatorsExecutor(ByzantiumToConstantinopleAt5, new EthashTestBlockHeaderValidator(ByzantiumToConstantinopleAt5))
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package io.iohk.ethereum.ets.blockchain
import java.util.concurrent.Executors

import io.iohk.ethereum.consensus.ethash.EthashConsensus
import io.iohk.ethereum.consensus.ethash.validators.EthashValidators
import io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor
import io.iohk.ethereum.consensus.{ConsensusConfig, FullConsensusConfig, TestConsensus, ethash}
import io.iohk.ethereum.db.components.Storages.PruningModeComponent
import io.iohk.ethereum.db.components.{SharedEphemDataSources, Storages}
Expand All @@ -25,7 +25,7 @@ object ScenarioSetup {
val specificConfig = ethash.EthashConfig(Config.config)
val fullConfig = FullConsensusConfig(ConsensusConfig(Config.config)(null), specificConfig)

def loadEthashConsensus(vm: VMImpl, blockchain: BlockchainImpl, blockchainConfig: BlockchainConfig, validators: EthashValidators): ethash.EthashConsensus = {
def loadEthashConsensus(vm: VMImpl, blockchain: BlockchainImpl, blockchainConfig: BlockchainConfig, validators: ValidatorsExecutor): ethash.EthashConsensus = {
val consensus = EthashConsensus(vm, blockchain, blockchainConfig, fullConfig, validators)
consensus
}
Expand Down Expand Up @@ -99,11 +99,11 @@ abstract class ScenarioSetup(_vm: VMImpl, scenario: BlockchainScenario) {
scenario.postState.map(_.map(addAcc => addAcc._1 -> blockchain.getAccount(addAcc._1, bestBlockNumber)).toList)
}

private def buildBlockchainConfig(network: String, shouldSkipPoW: Boolean): (BlockchainConfig, EthashValidators) = {
private def buildBlockchainConfig(network: String, shouldSkipPoW: Boolean): (BlockchainConfig, ValidatorsExecutor) = {
if (shouldSkipPoW) withSkippedPoWValidationBlockchainConfig(network) else baseBlockchainConfig(network)
}

private def baseBlockchainConfig(network: String): (BlockchainConfig, EthashValidators) = network match {
private def baseBlockchainConfig(network: String): (BlockchainConfig, ValidatorsExecutor) = network match {
case "EIP150" => (Eip150Config, Validators.eip150Validators)
case "Frontier" => (FrontierConfig, Validators.frontierValidators)
case "Homestead" => (HomesteadConfig, Validators.homesteadValidators)
Expand All @@ -121,7 +121,7 @@ abstract class ScenarioSetup(_vm: VMImpl, scenario: BlockchainScenario) {
case _ => (FrontierConfig, Validators.frontierValidators)
}

private def withSkippedPoWValidationBlockchainConfig(network: String): (BlockchainConfig, EthashValidators) = network match {
private def withSkippedPoWValidationBlockchainConfig(network: String): (BlockchainConfig, ValidatorsExecutor) = network match {
case "EIP150" => (Eip150Config, ValidatorsWithSkippedPoW.eip150Validators)
case "Frontier" => (FrontierConfig, ValidatorsWithSkippedPoW.frontierValidators)
case "Homestead" => (HomesteadConfig, ValidatorsWithSkippedPoW.homesteadValidators)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.iohk.ethereum.consensus

import io.iohk.ethereum.consensus.ethash.EthashConsensus
import io.iohk.ethereum.consensus.ethash.validators.EthashValidators
import io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor
import io.iohk.ethereum.nodebuilder._
import io.iohk.ethereum.utils.{Config, Logger}

Expand All @@ -27,7 +27,7 @@ trait StdConsensusBuilder extends ConsensusBuilder {
protected def buildEthashConsensus(): ethash.EthashConsensus = {
val specificConfig = ethash.EthashConfig(mantisConfig)
val fullConfig = newConfig(specificConfig)
val validators = EthashValidators(blockchainConfig)
val validators = ValidatorsExecutor(blockchainConfig, consensusConfig.protocol)
val consensus = EthashConsensus(vm, blockchain, blockchainConfig, fullConfig, validators)
consensus
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ object ConsensusConfig extends Logger {


final val AllowedProtocols = Set(
Protocol.Names.Ethash
Protocol.Names.Ethash,
Protocol.Names.MockedPow
)

final val AllowedProtocolsError = (s: String) Keys.Consensus +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import io.iohk.ethereum.consensus.Protocol.{Ethash, MockedPow}
import io.iohk.ethereum.consensus.blocks.TestBlockGenerator
import io.iohk.ethereum.consensus.ethash.MinerResponses.MinerNotExist
import io.iohk.ethereum.consensus.ethash.blocks.{EthashBlockGenerator, EthashBlockGeneratorImpl}
import io.iohk.ethereum.consensus.ethash.validators.EthashValidators
import io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor
import io.iohk.ethereum.consensus.validators.Validators
import io.iohk.ethereum.domain.BlockchainImpl
import io.iohk.ethereum.ledger.BlockPreparator
Expand All @@ -23,12 +23,12 @@ import scala.concurrent.duration._
* Implements standard Ethereum consensus (ethash PoW).
*/
class EthashConsensus private(
val vm: VMImpl,
blockchain: BlockchainImpl,
blockchainConfig: BlockchainConfig,
val config: FullConsensusConfig[EthashConfig],
val validators: EthashValidators,
val blockGenerator: EthashBlockGenerator
val vm: VMImpl,
blockchain: BlockchainImpl,
blockchainConfig: BlockchainConfig,
val config: FullConsensusConfig[EthashConfig],
val validators: ValidatorsExecutor,
val blockGenerator: EthashBlockGenerator
) extends TestConsensus with Logger {

type Config = EthashConfig
Expand Down Expand Up @@ -95,7 +95,7 @@ class EthashConsensus private(
/** Internal API, used for testing */
protected def newBlockGenerator(validators: Validators): EthashBlockGenerator = {
validators match {
case _validators: EthashValidators
case _validators: ValidatorsExecutor
val blockPreparator = new BlockPreparator(
vm = vm,
signedTxValidator = validators.signedTransactionValidator,
Expand All @@ -113,15 +113,15 @@ class EthashConsensus private(
)

case _ ⇒
wrongValidatorsArgument[EthashValidators](validators)
wrongValidatorsArgument[ValidatorsExecutor](validators)
}
}


/** Internal API, used for testing */
def withValidators(validators: Validators): EthashConsensus = {
validators match {
case _validators: EthashValidators
case _validators: ValidatorsExecutor
val blockGenerator = newBlockGenerator(validators)

new EthashConsensus(
Expand All @@ -134,7 +134,7 @@ class EthashConsensus private(
)

case _ ⇒
wrongValidatorsArgument[EthashValidators](validators)
wrongValidatorsArgument[ValidatorsExecutor](validators)
}
}

Expand Down Expand Up @@ -168,7 +168,7 @@ object EthashConsensus {
blockchain: BlockchainImpl,
blockchainConfig: BlockchainConfig,
config: FullConsensusConfig[EthashConfig],
validators: EthashValidators
validators: ValidatorsExecutor
): EthashConsensus = {

val blockPreparator = new BlockPreparator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import akka.util.ByteString
import io.iohk.ethereum.consensus.ConsensusConfig
import io.iohk.ethereum.consensus.blocks._
import io.iohk.ethereum.consensus.ethash.difficulty.EthashDifficultyCalculator
import io.iohk.ethereum.consensus.ethash.validators.EthashValidators
import io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor
import io.iohk.ethereum.crypto.kec256
import io.iohk.ethereum.domain._
import io.iohk.ethereum.ledger.{BlockPreparationError, BlockPreparator}
Expand All @@ -24,12 +24,12 @@ trait EthashBlockGenerator extends TestBlockGenerator {
}

class EthashBlockGeneratorImpl(
validators: EthashValidators,
blockchain: Blockchain,
blockchainConfig: BlockchainConfig,
consensusConfig: ConsensusConfig,
val blockPreparator: BlockPreparator,
blockTimestampProvider: BlockTimestampProvider = DefaultBlockTimestampProvider
validators: ValidatorsExecutor,
blockchain: Blockchain,
blockchainConfig: BlockchainConfig,
consensusConfig: ConsensusConfig,
val blockPreparator: BlockPreparator,
blockTimestampProvider: BlockTimestampProvider = DefaultBlockTimestampProvider
) extends BlockGeneratorSkeleton(
blockchain,
blockchainConfig,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.iohk.ethereum.consensus.ethash
package validators

import io.iohk.ethereum.consensus.difficulty.DifficultyCalculator
import io.iohk.ethereum.consensus.ethash.difficulty.EthashDifficultyCalculator
import io.iohk.ethereum.consensus.validators.{ BlockHeaderError, BlockHeaderValid, BlockHeaderValidatorSkeleton }
import io.iohk.ethereum.domain.BlockHeader
import io.iohk.ethereum.utils.BlockchainConfig

class MockedPowBlockHeaderValidator(blockchainConfig: BlockchainConfig) extends BlockHeaderValidatorSkeleton(blockchainConfig) {

protected def difficulty: DifficultyCalculator = new EthashDifficultyCalculator(blockchainConfig)

def validateEvenMore(blockHeader: BlockHeader, parentHeader: BlockHeader): Either[BlockHeaderError, BlockHeaderValid] =
Right(BlockHeaderValid)

}

Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import io.iohk.ethereum.consensus.validators.{ BlockHeaderValidator, BlockValida

/**
* Implements validators that adhere to the PoW-specific
* [[io.iohk.ethereum.consensus.ethash.validators.EthashValidators EthashValidators]]
* [[io.iohk.ethereum.consensus.ethash.validators.ValidatorsExecutor]]
* interface.
*/
final class StdEthashValidators private[validators](
final class StdValidatorsExecutor private[validators](
val blockValidator: BlockValidator,
val blockHeaderValidator: BlockHeaderValidator,
val signedTransactionValidator: SignedTransactionValidator,
val ommersValidator: OmmersValidator
) extends EthashValidators
) extends ValidatorsExecutor
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import io.iohk.ethereum.ledger.BlockExecutionError.ValidationBeforeExecError
import io.iohk.ethereum.ledger.{ BlockExecutionError, BlockExecutionSuccess }
import io.iohk.ethereum.utils.BlockchainConfig

trait EthashValidators extends Validators {
trait ValidatorsExecutor extends Validators {
def ommersValidator: OmmersValidator

def validateBlockBeforeExecution(
Expand All @@ -18,7 +18,7 @@ trait EthashValidators extends Validators {
getNBlocksBack: GetNBlocksBack
): Either[BlockExecutionError.ValidationBeforeExecError, BlockExecutionSuccess] = {

EthashValidators.validateBlockBeforeExecution(
ValidatorsExecutor.validateBlockBeforeExecution(
self = this,
block = block,
getBlockHeaderByHash = getBlockHeaderByHash,
Expand All @@ -33,7 +33,7 @@ trait EthashValidators extends Validators {
gasUsed: BigInt
): Either[BlockExecutionError, BlockExecutionSuccess] = {

EthashValidators.validateBlockAfterExecution(
ValidatorsExecutor.validateBlockAfterExecution(
self = this,
block = block,
stateRootHash = stateRootHash,
Expand All @@ -43,11 +43,14 @@ trait EthashValidators extends Validators {
}
}

object EthashValidators {
def apply(blockchainConfig: BlockchainConfig): EthashValidators = {
val blockHeaderValidator: EthashBlockHeaderValidator = new EthashBlockHeaderValidator(blockchainConfig)
object ValidatorsExecutor {
def apply(blockchainConfig: BlockchainConfig, protocol: Protocol): ValidatorsExecutor = {
val blockHeaderValidator: BlockHeaderValidator = protocol match {
case Protocol.MockedPow => new MockedPowBlockHeaderValidator(blockchainConfig)
case Protocol.Ethash => new EthashBlockHeaderValidator(blockchainConfig)
}

new StdEthashValidators(
new StdValidatorsExecutor(
StdBlockValidator,
blockHeaderValidator,
new StdSignedTransactionValidator(blockchainConfig),
Expand All @@ -57,8 +60,8 @@ object EthashValidators {

// Created only for testing purposes, shouldn't be used in production code.
// Connected with: https://github.com/ethereum/tests/issues/480
def apply(blockchainConfig: BlockchainConfig, blockHeaderValidator: BlockHeaderValidator): EthashValidators = {
new StdEthashValidators(
def apply(blockchainConfig: BlockchainConfig, blockHeaderValidator: BlockHeaderValidator): ValidatorsExecutor = {
new StdValidatorsExecutor(
StdBlockValidator,
blockHeaderValidator,
new StdSignedTransactionValidator(blockchainConfig),
Expand All @@ -67,7 +70,7 @@ object EthashValidators {
}

def validateBlockBeforeExecution(
self: EthashValidators,
self: ValidatorsExecutor,
block: Block,
getBlockHeaderByHash: GetBlockHeaderByHash,
getNBlocksBack: GetNBlocksBack
Expand All @@ -87,7 +90,7 @@ object EthashValidators {
}

def validateBlockAfterExecution(
self: EthashValidators,
self: ValidatorsExecutor,
block: Block,
stateRootHash: ByteString,
receipts: Seq[Receipt],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import org.bouncycastle.util.encoders.Hex
* Implements validators that adhere to the original [[io.iohk.ethereum.consensus.validators.Validators Validators]]
* interface.
*
* @see [[io.iohk.ethereum.consensus.ethash.validators.StdEthashValidators StdEthashValidators]]
* @see [[io.iohk.ethereum.consensus.ethash.validators.StdValidatorsExecutor StdEthashValidators]]
* for the PoW-specific counterpart.
*/
final class StdValidators(
Expand Down
Loading