Skip to content

Commit 7f9de1e

Browse files
authored
NODE-2633 Allowed mining by light node (#3918)
1 parent 3b22ec3 commit 7f9de1e

File tree

6 files changed

+62
-43
lines changed

6 files changed

+62
-43
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.wavesplatform.it.sync.lightnode
2+
3+
import com.typesafe.config.Config
4+
import com.wavesplatform.it.api.SyncHttpApi.*
5+
import com.wavesplatform.it.{BaseFunSuite, NodeConfigs, TransferSending}
6+
7+
class LightNodeMiningSuite extends BaseFunSuite with TransferSending {
8+
override def nodeConfigs: Seq[Config] =
9+
NodeConfigs.newBuilder
10+
.overrideBase(_.lightNode)
11+
.withDefault(2)
12+
.buildNonConflicting()
13+
14+
test("nodes can mine in light mode") {
15+
val first = nodes.head
16+
val second = nodes.last
17+
18+
val tx1 = first.transfer(first.keyPair, second.address, 1, waitForTx = true)
19+
nodes.waitForHeightArise()
20+
second.transactionStatus(tx1.id).applicationStatus.get shouldBe "succeeded"
21+
22+
val tx2 = second.transfer(second.keyPair, first.address, 1, waitForTx = true)
23+
nodes.waitForHeightArise()
24+
first.transactionStatus(tx2.id).applicationStatus.get shouldBe "succeeded"
25+
}
26+
}

node/src/main/scala/com/wavesplatform/Application.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class Application(val actorSystem: ActorSystem, val settings: WavesSettings, con
140140

141141
val pos = PoSSelector(blockchainUpdater, settings.synchronizationSettings.maxBaseTarget)
142142

143-
if (settings.minerSettings.enable && !settings.enableLightMode)
143+
if (settings.minerSettings.enable)
144144
miner = new MinerImpl(
145145
allChannels,
146146
blockchainUpdater,

node/src/main/scala/com/wavesplatform/mining/Miner.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class MinerImpl(
145145
reference: ByteStr,
146146
prevStateHash: Option[ByteStr]
147147
): (Seq[Transaction], MiningConstraint, Option[ByteStr]) = {
148-
val estimators = MiningConstraints(blockchainUpdater, blockchainUpdater.height, settings.enableLightMode, Some(minerSettings))
148+
val estimators = MiningConstraints(blockchainUpdater, blockchainUpdater.height, Some(minerSettings))
149149
val keyBlockStateHash = prevStateHash.flatMap { prevHash =>
150150
BlockDiffer
151151
.createInitialBlockSnapshot(blockchainUpdater, reference, miner)

node/src/main/scala/com/wavesplatform/mining/MiningConstraints.scala

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.wavesplatform.state.Blockchain
99
case class MiningConstraints(total: MiningConstraint, keyBlock: MiningConstraint, micro: MiningConstraint)
1010

1111
object MiningConstraints {
12-
val MaxScriptRunsInBlock = 100
1312
object MaxScriptsComplexityInBlock {
1413
val BeforeRideV5 = 1000000
1514
val AfterRideV5 = 2500000
@@ -18,41 +17,37 @@ object MiningConstraints {
1817
val ClassicAmountOfTxsInBlock = 100
1918
val MaxTxsSizeInBytes = 1 * 1024 * 1024 // 1 megabyte
2019

21-
def apply(blockchain: Blockchain, height: Int, isLightNode: Boolean, minerSettings: Option[MinerSettings] = None): MiningConstraints = {
22-
if (isLightNode) {
23-
MiningConstraints(MiningConstraint.Unlimited, MiningConstraint.Unlimited, MiningConstraint.Unlimited)
24-
} else {
25-
val activatedFeatures = blockchain.activatedFeaturesAt(height)
26-
val isNgEnabled = activatedFeatures.contains(BlockchainFeatures.NG.id)
27-
val isMassTransferEnabled = activatedFeatures.contains(BlockchainFeatures.MassTransfer.id)
28-
val isDAppsEnabled = activatedFeatures.contains(BlockchainFeatures.Ride4DApps.id)
20+
def apply(blockchain: Blockchain, height: Int, minerSettings: Option[MinerSettings] = None): MiningConstraints = {
21+
val activatedFeatures = blockchain.activatedFeaturesAt(height)
22+
val isNgEnabled = activatedFeatures.contains(BlockchainFeatures.NG.id)
23+
val isMassTransferEnabled = activatedFeatures.contains(BlockchainFeatures.MassTransfer.id)
24+
val isDAppsEnabled = activatedFeatures.contains(BlockchainFeatures.Ride4DApps.id)
2925

30-
val total: MiningConstraint =
31-
if (isMassTransferEnabled) OneDimensionalMiningConstraint(MaxTxsSizeInBytes, TxEstimators.sizeInBytes, "MaxTxsSizeInBytes")
32-
else {
33-
val maxTxs = if (isNgEnabled) Block.MaxTransactionsPerBlockVer3 else ClassicAmountOfTxsInBlock
34-
OneDimensionalMiningConstraint(maxTxs, TxEstimators.one, "MaxTxs")
35-
}
26+
val total: MiningConstraint =
27+
if (isMassTransferEnabled) OneDimensionalMiningConstraint(MaxTxsSizeInBytes, TxEstimators.sizeInBytes, "MaxTxsSizeInBytes")
28+
else {
29+
val maxTxs = if (isNgEnabled) Block.MaxTransactionsPerBlockVer3 else ClassicAmountOfTxsInBlock
30+
OneDimensionalMiningConstraint(maxTxs, TxEstimators.one, "MaxTxs")
31+
}
3632

37-
new MiningConstraints(
38-
total = if (isDAppsEnabled) {
39-
val complexityLimit =
40-
if (blockchain.isFeatureActivated(BlockchainFeatures.SynchronousCalls)) MaxScriptsComplexityInBlock.AfterRideV5
41-
else MaxScriptsComplexityInBlock.BeforeRideV5
42-
MultiDimensionalMiningConstraint(
43-
NonEmptyList
44-
.of(OneDimensionalMiningConstraint(complexityLimit, TxEstimators.scriptsComplexity, "MaxScriptsComplexityInBlock"), total)
45-
)
46-
} else
47-
total,
48-
keyBlock =
49-
if (isNgEnabled) OneDimensionalMiningConstraint(0, TxEstimators.one, "MaxTxsInKeyBlock")
50-
else OneDimensionalMiningConstraint(ClassicAmountOfTxsInBlock, TxEstimators.one, "MaxTxsInKeyBlock"),
51-
micro =
52-
if (isNgEnabled && minerSettings.isDefined)
53-
OneDimensionalMiningConstraint(minerSettings.get.maxTransactionsInMicroBlock, TxEstimators.one, "MaxTxsInMicroBlock")
54-
else MiningConstraint.Unlimited
55-
)
56-
}
33+
new MiningConstraints(
34+
total = if (isDAppsEnabled) {
35+
val complexityLimit =
36+
if (blockchain.isFeatureActivated(BlockchainFeatures.SynchronousCalls)) MaxScriptsComplexityInBlock.AfterRideV5
37+
else MaxScriptsComplexityInBlock.BeforeRideV5
38+
MultiDimensionalMiningConstraint(
39+
NonEmptyList
40+
.of(OneDimensionalMiningConstraint(complexityLimit, TxEstimators.scriptsComplexity, "MaxScriptsComplexityInBlock"), total)
41+
)
42+
} else
43+
total,
44+
keyBlock =
45+
if (isNgEnabled) OneDimensionalMiningConstraint(0, TxEstimators.one, "MaxTxsInKeyBlock")
46+
else OneDimensionalMiningConstraint(ClassicAmountOfTxsInBlock, TxEstimators.one, "MaxTxsInKeyBlock"),
47+
micro =
48+
if (isNgEnabled && minerSettings.isDefined)
49+
OneDimensionalMiningConstraint(minerSettings.get.maxTransactionsInMicroBlock, TxEstimators.one, "MaxTxsInMicroBlock")
50+
else MiningConstraint.Unlimited
51+
)
5752
}
5853
}

node/src/main/scala/com/wavesplatform/state/BlockchainUpdaterImpl.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class BlockchainUpdaterImpl(
6161
private[this] var ngState: Option[NgState] = Option.empty
6262

6363
@volatile
64-
private[this] var restTotalConstraint: MiningConstraint = MiningConstraints(rocksdb, rocksdb.height, wavesSettings.enableLightMode).total
64+
private[this] var restTotalConstraint: MiningConstraint = MiningConstraints(rocksdb, rocksdb.height).total
6565

6666
private val internalLastBlockInfo = ReplaySubject.createLimited[LastBlockInfo](1)
6767

@@ -223,7 +223,7 @@ class BlockchainUpdaterImpl(
223223
Left(BlockAppendError(s"References incorrect or non-existing block: " + logDetails, block))
224224
case lastBlockId =>
225225
val height = lastBlockId.fold(0)(rocksdb.unsafeHeightOf)
226-
val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode)
226+
val miningConstraints = MiningConstraints(rocksdb, height)
227227
val reward = computeNextReward
228228

229229
val referencedBlockchain = SnapshotBlockchain(rocksdb, reward)
@@ -251,7 +251,7 @@ class BlockchainUpdaterImpl(
251251
if (ng.base.header.reference == block.header.reference) {
252252
if (block.header.timestamp < ng.base.header.timestamp) {
253253
val height = rocksdb.unsafeHeightOf(ng.base.header.reference)
254-
val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode)
254+
val miningConstraints = MiningConstraints(rocksdb, height)
255255

256256
val referencedBlockchain = SnapshotBlockchain(rocksdb, ng.reward)
257257
BlockDiffer
@@ -301,7 +301,7 @@ class BlockchainUpdaterImpl(
301301
val height = rocksdb.heightOf(referencedForgedBlock.header.reference).getOrElse(0)
302302

303303
val constraint: MiningConstraint = {
304-
val miningConstraints = MiningConstraints(rocksdb, height, wavesSettings.enableLightMode)
304+
val miningConstraints = MiningConstraints(rocksdb, height)
305305
miningConstraints.total
306306
}
307307

node/src/test/scala/com/wavesplatform/features/RideV5LimitsChangeTest.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class RideV5LimitsChangeTest extends FlatSpec with WithDomain {
3434
MiningConstraints(
3535
d.blockchain,
3636
d.blockchain.height,
37-
SettingsFromDefaultConfig.enableLightMode,
3837
Some(SettingsFromDefaultConfig.minerSettings)
3938
).total,
4039
block.header.generationSignature
@@ -65,7 +64,6 @@ class RideV5LimitsChangeTest extends FlatSpec with WithDomain {
6564
MiningConstraints(
6665
d.blockchain,
6766
d.blockchain.height,
68-
SettingsFromDefaultConfig.enableLightMode,
6967
Some(SettingsFromDefaultConfig.minerSettings)
7068
).total,
7169
block.header.generationSignature

0 commit comments

Comments
 (0)