diff --git a/node-it/src/test/scala/com/wavesplatform/it/sync/lightnode/LightNodeMiningSuite.scala b/node-it/src/test/scala/com/wavesplatform/it/sync/lightnode/LightNodeMiningSuite.scala new file mode 100644 index 0000000000..c8b8ef4510 --- /dev/null +++ b/node-it/src/test/scala/com/wavesplatform/it/sync/lightnode/LightNodeMiningSuite.scala @@ -0,0 +1,26 @@ +package com.wavesplatform.it.sync.lightnode + +import com.typesafe.config.Config +import com.wavesplatform.it.api.SyncHttpApi.* +import com.wavesplatform.it.{BaseFunSuite, NodeConfigs, TransferSending} + +class LightNodeMiningSuite extends BaseFunSuite with TransferSending { + override def nodeConfigs: Seq[Config] = + NodeConfigs.newBuilder + .overrideBase(_.lightNode) + .withDefault(2) + .buildNonConflicting() + + test("nodes can mine in light mode") { + val first = nodes.head + val second = nodes.last + + val tx1 = first.transfer(first.keyPair, second.address, 1, waitForTx = true) + nodes.waitForHeightArise() + second.transactionStatus(tx1.id).applicationStatus.get shouldBe "succeeded" + + val tx2 = second.transfer(second.keyPair, first.address, 1, waitForTx = true) + nodes.waitForHeightArise() + first.transactionStatus(tx2.id).applicationStatus.get shouldBe "succeeded" + } +} diff --git a/node/src/main/scala/com/wavesplatform/Application.scala b/node/src/main/scala/com/wavesplatform/Application.scala index 74625fabfb..0f6dbd5134 100644 --- a/node/src/main/scala/com/wavesplatform/Application.scala +++ b/node/src/main/scala/com/wavesplatform/Application.scala @@ -140,7 +140,7 @@ class Application(val actorSystem: ActorSystem, val settings: WavesSettings, con val pos = PoSSelector(blockchainUpdater, settings.synchronizationSettings.maxBaseTarget) - if (settings.minerSettings.enable && !settings.enableLightMode) + if (settings.minerSettings.enable) miner = new MinerImpl( allChannels, blockchainUpdater, diff --git a/node/src/main/scala/com/wavesplatform/mining/Miner.scala b/node/src/main/scala/com/wavesplatform/mining/Miner.scala index 239fdb8d06..5ef98f4f37 100644 --- a/node/src/main/scala/com/wavesplatform/mining/Miner.scala +++ b/node/src/main/scala/com/wavesplatform/mining/Miner.scala @@ -145,7 +145,7 @@ class MinerImpl( reference: ByteStr, prevStateHash: Option[ByteStr] ): (Seq[Transaction], MiningConstraint, Option[ByteStr]) = { - val estimators = MiningConstraints(blockchainUpdater, blockchainUpdater.height, settings.enableLightMode, Some(minerSettings)) + val estimators = MiningConstraints(blockchainUpdater, blockchainUpdater.height, Some(minerSettings)) val keyBlockStateHash = prevStateHash.flatMap { prevHash => BlockDiffer .createInitialBlockSnapshot(blockchainUpdater, reference, miner) diff --git a/node/src/main/scala/com/wavesplatform/mining/MiningConstraints.scala b/node/src/main/scala/com/wavesplatform/mining/MiningConstraints.scala index b3f24f529f..77d9789750 100644 --- a/node/src/main/scala/com/wavesplatform/mining/MiningConstraints.scala +++ b/node/src/main/scala/com/wavesplatform/mining/MiningConstraints.scala @@ -9,7 +9,6 @@ import com.wavesplatform.state.Blockchain case class MiningConstraints(total: MiningConstraint, keyBlock: MiningConstraint, micro: MiningConstraint) object MiningConstraints { - val MaxScriptRunsInBlock = 100 object MaxScriptsComplexityInBlock { val BeforeRideV5 = 1000000 val AfterRideV5 = 2500000 @@ -18,41 +17,37 @@ object MiningConstraints { val ClassicAmountOfTxsInBlock = 100 val MaxTxsSizeInBytes = 1 * 1024 * 1024 // 1 megabyte - def apply(blockchain: Blockchain, height: Int, isLightNode: Boolean, minerSettings: Option[MinerSettings] = None): MiningConstraints = { - if (isLightNode) { - MiningConstraints(MiningConstraint.Unlimited, MiningConstraint.Unlimited, MiningConstraint.Unlimited) - } else { - val activatedFeatures = blockchain.activatedFeaturesAt(height) - val isNgEnabled = activatedFeatures.contains(BlockchainFeatures.NG.id) - val isMassTransferEnabled = activatedFeatures.contains(BlockchainFeatures.MassTransfer.id) - val isDAppsEnabled = activatedFeatures.contains(BlockchainFeatures.Ride4DApps.id) + def apply(blockchain: Blockchain, height: Int, minerSettings: Option[MinerSettings] = None): MiningConstraints = { + val activatedFeatures = blockchain.activatedFeaturesAt(height) + val isNgEnabled = activatedFeatures.contains(BlockchainFeatures.NG.id) + val isMassTransferEnabled = activatedFeatures.contains(BlockchainFeatures.MassTransfer.id) + val isDAppsEnabled = activatedFeatures.contains(BlockchainFeatures.Ride4DApps.id) - val total: MiningConstraint = - if (isMassTransferEnabled) OneDimensionalMiningConstraint(MaxTxsSizeInBytes, TxEstimators.sizeInBytes, "MaxTxsSizeInBytes") - else { - val maxTxs = if (isNgEnabled) Block.MaxTransactionsPerBlockVer3 else ClassicAmountOfTxsInBlock - OneDimensionalMiningConstraint(maxTxs, TxEstimators.one, "MaxTxs") - } + val total: MiningConstraint = + if (isMassTransferEnabled) OneDimensionalMiningConstraint(MaxTxsSizeInBytes, TxEstimators.sizeInBytes, "MaxTxsSizeInBytes") + else { + val maxTxs = if (isNgEnabled) Block.MaxTransactionsPerBlockVer3 else ClassicAmountOfTxsInBlock + OneDimensionalMiningConstraint(maxTxs, TxEstimators.one, "MaxTxs") + } - new MiningConstraints( - total = if (isDAppsEnabled) { - val complexityLimit = - if (blockchain.isFeatureActivated(BlockchainFeatures.SynchronousCalls)) MaxScriptsComplexityInBlock.AfterRideV5 - else MaxScriptsComplexityInBlock.BeforeRideV5 - MultiDimensionalMiningConstraint( - NonEmptyList - .of(OneDimensionalMiningConstraint(complexityLimit, TxEstimators.scriptsComplexity, "MaxScriptsComplexityInBlock"), total) - ) - } else - total, - keyBlock = - if (isNgEnabled) OneDimensionalMiningConstraint(0, TxEstimators.one, "MaxTxsInKeyBlock") - else OneDimensionalMiningConstraint(ClassicAmountOfTxsInBlock, TxEstimators.one, "MaxTxsInKeyBlock"), - micro = - if (isNgEnabled && minerSettings.isDefined) - OneDimensionalMiningConstraint(minerSettings.get.maxTransactionsInMicroBlock, TxEstimators.one, "MaxTxsInMicroBlock") - else MiningConstraint.Unlimited - ) - } + new MiningConstraints( + total = if (isDAppsEnabled) { + val complexityLimit = + if (blockchain.isFeatureActivated(BlockchainFeatures.SynchronousCalls)) MaxScriptsComplexityInBlock.AfterRideV5 + else MaxScriptsComplexityInBlock.BeforeRideV5 + MultiDimensionalMiningConstraint( + NonEmptyList + .of(OneDimensionalMiningConstraint(complexityLimit, TxEstimators.scriptsComplexity, "MaxScriptsComplexityInBlock"), total) + ) + } else + total, + keyBlock = + if (isNgEnabled) OneDimensionalMiningConstraint(0, TxEstimators.one, "MaxTxsInKeyBlock") + else OneDimensionalMiningConstraint(ClassicAmountOfTxsInBlock, TxEstimators.one, "MaxTxsInKeyBlock"), + micro = + if (isNgEnabled && minerSettings.isDefined) + OneDimensionalMiningConstraint(minerSettings.get.maxTransactionsInMicroBlock, TxEstimators.one, "MaxTxsInMicroBlock") + else MiningConstraint.Unlimited + ) } } diff --git a/node/src/main/scala/com/wavesplatform/state/BlockchainUpdaterImpl.scala b/node/src/main/scala/com/wavesplatform/state/BlockchainUpdaterImpl.scala index b7297d641e..2c8e3a3c5e 100644 --- a/node/src/main/scala/com/wavesplatform/state/BlockchainUpdaterImpl.scala +++ b/node/src/main/scala/com/wavesplatform/state/BlockchainUpdaterImpl.scala @@ -61,7 +61,7 @@ class BlockchainUpdaterImpl( private[this] var ngState: Option[NgState] = Option.empty @volatile - private[this] var restTotalConstraint: MiningConstraint = MiningConstraints(rocksdb, rocksdb.height, wavesSettings.enableLightMode).total + private[this] var restTotalConstraint: MiningConstraint = MiningConstraints(rocksdb, rocksdb.height).total private val internalLastBlockInfo = ReplaySubject.createLimited[LastBlockInfo](1) @@ -223,7 +223,7 @@ class BlockchainUpdaterImpl( Left(BlockAppendError(s"References incorrect or non-existing block: " + logDetails, block)) case lastBlockId => val height = lastBlockId.fold(0)(rocksdb.unsafeHeightOf) - val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode) + val miningConstraints = MiningConstraints(rocksdb, height) val reward = computeNextReward val referencedBlockchain = SnapshotBlockchain(rocksdb, reward) @@ -251,7 +251,7 @@ class BlockchainUpdaterImpl( if (ng.base.header.reference == block.header.reference) { if (block.header.timestamp < ng.base.header.timestamp) { val height = rocksdb.unsafeHeightOf(ng.base.header.reference) - val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode) + val miningConstraints = MiningConstraints(rocksdb, height) val referencedBlockchain = SnapshotBlockchain(rocksdb, ng.reward) BlockDiffer @@ -301,7 +301,7 @@ class BlockchainUpdaterImpl( val height = rocksdb.heightOf(referencedForgedBlock.header.reference).getOrElse(0) val constraint: MiningConstraint = { - val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode) + val miningConstraints = MiningConstraints(rocksdb, height) miningConstraints.total } diff --git a/node/src/test/scala/com/wavesplatform/features/RideV5LimitsChangeTest.scala b/node/src/test/scala/com/wavesplatform/features/RideV5LimitsChangeTest.scala index 79c3dcc7fd..f2eaa47a35 100644 --- a/node/src/test/scala/com/wavesplatform/features/RideV5LimitsChangeTest.scala +++ b/node/src/test/scala/com/wavesplatform/features/RideV5LimitsChangeTest.scala @@ -34,7 +34,6 @@ class RideV5LimitsChangeTest extends FlatSpec with WithDomain { MiningConstraints( d.blockchain, d.blockchain.height, - SettingsFromDefaultConfig.enableLightMode, Some(SettingsFromDefaultConfig.minerSettings) ).total, block.header.generationSignature @@ -65,7 +64,6 @@ class RideV5LimitsChangeTest extends FlatSpec with WithDomain { MiningConstraints( d.blockchain, d.blockchain.height, - SettingsFromDefaultConfig.enableLightMode, Some(SettingsFromDefaultConfig.minerSettings) ).total, block.header.generationSignature