From 0a25a15d025777d7852961840fac431c68187ce0 Mon Sep 17 00:00:00 2001 From: ccellado Date: Thu, 8 Feb 2024 01:06:09 +0400 Subject: [PATCH 1/6] Update gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 4c53ed20..06bd5d38 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,10 @@ target # logs scorex-errors.log *.log + +# js +node_modules +.bsp +.DS_Store +yarn.lock +package-lock.json \ No newline at end of file From 557ea6857e09f6618d1159565320788d7ed521c7 Mon Sep 17 00:00:00 2001 From: ccellado Date: Thu, 8 Feb 2024 01:06:38 +0400 Subject: [PATCH 2/6] Scala3 support --- build.sbt | 65 +++++++++++-------- .../scala/scorex/crypto/hash/Platform.scala | 2 +- .../batch/AVLBatchStatefulSpecification.scala | 2 +- .../hash/Blake2bUnsafeSpecification.scala | 2 +- project/build.properties | 2 +- project/plugins.sbt | 4 +- .../scorex/crypto/authds/authds.scala | 0 .../scorex/crypto/hash/hash.scala | 0 .../scala-3/scorex/crypto/authds/authds.scala | 29 +++++++++ .../scala-3/scorex/crypto/hash/hash.scala | 30 +++++++++ .../scala-3/scorex/crypto/utils/utils.scala | 14 ++++ .../authds/avltree/batch/BatchNode.scala | 2 +- .../batch/PersistentBatchAVLProver.scala | 2 +- .../legacy/avltree/AVLModifyProof.scala | 4 +- .../authds/legacy/avltree/AVLTree.scala | 2 +- .../crypto/authds/legacy/treap/Node.scala | 4 +- .../crypto/authds/legacy/treap/Treap.scala | 2 +- .../crypto/authds/merkle/MerkleTree.scala | 8 +-- .../scorex/crypto/authds/TwoPartyTests.scala | 4 +- .../avltree/batch/AVLBatchSpecification.scala | 8 +-- .../avltree/batch/BatchTestingHelpers.scala | 2 +- .../avltree/batch/BatchingPlayground.scala | 18 ++--- .../AVLBatchSerializationSpecification.scala | 6 +- .../merkle/MerkleTreeSpecification.scala | 14 ++-- ...chMerkleProofSerializerSpecification.scala | 6 +- .../SparseMerkleTreeSpecification.scala | 6 +- .../hash/CommutativeHashSpecification.scala | 2 +- .../scala/scorex/crypto/hash/HashTest.scala | 3 +- 28 files changed, 165 insertions(+), 78 deletions(-) rename shared/src/main/{scala => scala-2}/scorex/crypto/authds/authds.scala (100%) rename shared/src/main/{scala => scala-2}/scorex/crypto/hash/hash.scala (100%) create mode 100644 shared/src/main/scala-3/scorex/crypto/authds/authds.scala create mode 100644 shared/src/main/scala-3/scorex/crypto/hash/hash.scala create mode 100644 shared/src/main/scala-3/scorex/crypto/utils/utils.scala diff --git a/build.sbt b/build.sbt index ed459f68..5b8f40f5 100644 --- a/build.sbt +++ b/build.sbt @@ -4,9 +4,10 @@ name := "scrypto" description := "Cryptographic primitives for Scala" organization := "org.scorexfoundation" -lazy val scala213 = "2.13.8" -lazy val scala212 = "2.12.15" +lazy val scala213 = "2.13.12" +lazy val scala212 = "2.12.18" lazy val scala211 = "2.11.12" +lazy val scala3 = "3.3.1" javacOptions ++= "-source" :: "1.8" :: @@ -15,32 +16,44 @@ javacOptions ++= lazy val commonSettings = Seq( organization := "org.scorexfoundation", - resolvers += Resolver.sonatypeRepo("public"), + resolvers ++= Resolver.sonatypeOssRepos("snapshots"), licenses := Seq("CC0" -> url("https://creativecommons.org/publicdomain/zero/1.0/legalcode")), homepage := Some(url("https://github.com/input-output-hk/scrypto")), pomExtra := - - - kushti - Alexander Chepurnoy - http://chepurnoy.org/ - - , + + + kushti + Alexander Chepurnoy + http://chepurnoy.org/ + + , scmInfo := Some( - ScmInfo( - url("https://github.com/input-output-hk/scrypto"), - "scm:git@github.com:input-output-hk/scrypto.git" - ) - ), - libraryDependencies ++= Seq( - "org.rudogma" %%% "supertagged" % "2.0-RC2", - "org.scorexfoundation" %%% "scorex-util" % "0.2.0", - "org.scalatest" %%% "scalatest" % "3.3.0-SNAP3" % Test, - "org.scalatest" %%% "scalatest-propspec" % "3.3.0-SNAP3" % Test, - "org.scalatest" %%% "scalatest-shouldmatchers" % "3.3.0-SNAP3" % Test, - "org.scalatestplus" %%% "scalacheck-1-15" % "3.3.0.0-SNAP3" % Test, - "org.scalacheck" %%% "scalacheck" % "1.15.2" % Test + ScmInfo( + url("https://github.com/input-output-hk/scrypto"), + "scm:git@github.com:input-output-hk/scrypto.git" + ) ), + libraryDependencies ++= { + if (scalaVersion.value == scala3) + Seq( + ("org.scorexfoundation" %%% "scorex-util" % "0.2.1").cross(CrossVersion.for3Use2_13), + "org.scalatest" %%% "scalatest" % "3.3.0-alpha.1" % Test, + "org.scalatest" %%% "scalatest-propspec" % "3.3.0-alpha.1" % Test, + "org.scalatest" %%% "scalatest-shouldmatchers" % "3.3.0-alpha.1" % Test, + "org.scalacheck" %%% "scalacheck" % "1.15.3" % Test, + "org.scalatestplus" %%% "scalacheck-1-17" % "3.3.0.0-alpha.1" % Test + ) + else // use last versions with Scala 2.11 support + Seq( + "org.rudogma" %%% "supertagged" % "2.0-RC2", + "org.scorexfoundation" %%% "scorex-util" % "0.2.1", + "org.scalatest" %%% "scalatest" % "3.3.0-SNAP3" % Test, + "org.scalatest" %%% "scalatest-propspec" % "3.3.0-SNAP3" % Test, + "org.scalatest" %%% "scalatest-shouldmatchers" % "3.3.0-SNAP3" % Test, + "org.scalacheck" %%% "scalacheck" % "1.15.2" % Test, + "org.scalatestplus" %%% "scalacheck-1-15" % "3.3.0.0-SNAP3" % Test + ) + }, javacOptions ++= javacReleaseOption, publishMavenStyle := true, publishTo := sonatypePublishToBundle.value @@ -66,7 +79,7 @@ lazy val scrypto = crossProject(JVMPlatform, JSPlatform) "org.bouncycastle" % "bcprov-jdk15to18" % "1.66" ), scalaVersion := scala213, - crossScalaVersions := Seq(scala211, scala212, scala213) + crossScalaVersions := Seq(scala211, scala212, scala213, scala3) ) lazy val scryptoJS = scrypto.js @@ -74,7 +87,7 @@ lazy val scryptoJS = scrypto.js .enablePlugins(ScalablyTypedConverterExternalNpmPlugin) .settings( scalaVersion := scala213, - crossScalaVersions := Seq(scala212, scala213), + crossScalaVersions := Seq(scala212, scala213, scala3), libraryDependencies ++= Seq( "org.scala-js" %%% "scala-js-macrotask-executor" % "1.0.0", ("org.scala-js" %%% "scalajs-java-securerandom" % "1.0.0").cross(CrossVersion.for3Use2_13) @@ -93,7 +106,7 @@ lazy val benchmarks = project .dependsOn(scrypto.jvm) .settings( moduleName := "scrypto-benchmarks", - crossScalaVersions := Seq(scala211, scala212, scala213), + crossScalaVersions := Seq(scala211, scala212, scala213, scala3), scalaVersion := scala213, ) .enablePlugins(JmhPlugin) diff --git a/js/src/main/scala/scorex/crypto/hash/Platform.scala b/js/src/main/scala/scorex/crypto/hash/Platform.scala index fb22184d..94b8d0ec 100644 --- a/js/src/main/scala/scorex/crypto/hash/Platform.scala +++ b/js/src/main/scala/scorex/crypto/hash/Platform.scala @@ -1,7 +1,7 @@ package scorex.crypto.hash import typings.nobleHashes.blake2Mod.BlakeOpts -import typings.nobleHashes.mod.blake2b +import typings.nobleHashes.blake2bMod.blake2b import typings.nobleHashes.sha256Mod.sha256 import typings.nobleHashes.utilsMod diff --git a/jvm/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchStatefulSpecification.scala b/jvm/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchStatefulSpecification.scala index 8efb0b9b..82e52030 100644 --- a/jvm/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchStatefulSpecification.scala +++ b/jvm/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchStatefulSpecification.scala @@ -12,7 +12,7 @@ import scala.util.{Random, Try, Success, Failure} class AVLBatchStatefulSpecification extends AnyPropSpec { property("BatchAVLProver: prove and verify") { - AVLCommands.property().check + AVLCommands.property().check() } } diff --git a/jvm/src/test/scala/scorex/crypto/hash/Blake2bUnsafeSpecification.scala b/jvm/src/test/scala/scorex/crypto/hash/Blake2bUnsafeSpecification.scala index 36e1c921..bc0e3308 100644 --- a/jvm/src/test/scala/scorex/crypto/hash/Blake2bUnsafeSpecification.scala +++ b/jvm/src/test/scala/scorex/crypto/hash/Blake2bUnsafeSpecification.scala @@ -11,7 +11,7 @@ with Matchers { val unsafeHash = new Blake2b256Unsafe property("Unsafe should produce the same result") { - forAll { message: Array[Byte] => + forAll { (message: Array[Byte]) => unsafeHash.hash(message) shouldEqual Blake2b256(message) } } diff --git a/project/build.properties b/project/build.properties index 14095e16..ffd11bcc 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1,2 +1,2 @@ -sbt.version=1.5.4 +sbt.version=1.9.1 diff --git a/project/plugins.sbt b/project/plugins.sbt index c514d551..22d9f2cb 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -3,7 +3,7 @@ logLevel := Level.Warn addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.0") -addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") +//addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") //addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.3.5") @@ -18,4 +18,4 @@ addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.1.1") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.10.1") addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") -addSbtPlugin("org.scalablytyped.converter" % "sbt-converter" % "1.0.0-beta37") \ No newline at end of file +addSbtPlugin("org.scalablytyped.converter" % "sbt-converter" % "1.0.0-beta43") \ No newline at end of file diff --git a/shared/src/main/scala/scorex/crypto/authds/authds.scala b/shared/src/main/scala-2/scorex/crypto/authds/authds.scala similarity index 100% rename from shared/src/main/scala/scorex/crypto/authds/authds.scala rename to shared/src/main/scala-2/scorex/crypto/authds/authds.scala diff --git a/shared/src/main/scala/scorex/crypto/hash/hash.scala b/shared/src/main/scala-2/scorex/crypto/hash/hash.scala similarity index 100% rename from shared/src/main/scala/scorex/crypto/hash/hash.scala rename to shared/src/main/scala-2/scorex/crypto/hash/hash.scala diff --git a/shared/src/main/scala-3/scorex/crypto/authds/authds.scala b/shared/src/main/scala-3/scorex/crypto/authds/authds.scala new file mode 100644 index 00000000..0655b793 --- /dev/null +++ b/shared/src/main/scala-3/scorex/crypto/authds/authds.scala @@ -0,0 +1,29 @@ +package scorex.crypto + +import scorex.crypto.utils.NewType + +package object authds: + object LeafData extends NewType[Array[Byte]] + type LeafData = LeafData.Type + + object Side extends NewType[Byte] + type Side = Side.Type + + object ADKey extends NewType[Array[Byte]] + type ADKey = ADKey.Type + + object ADValue extends NewType[Array[Byte]] + type ADValue = ADValue.Type + + object ADDigest extends NewType[Array[Byte]] + type ADDigest = ADDigest.Type + + object SerializedAdProof extends NewType[Array[Byte]] + type SerializedAdProof = SerializedAdProof.Type + + object Balance extends NewType[Byte] + type Balance = Balance.Type + + /** Immutable empty array which can be used in many places to avoid allocations. */ + val EmptyByteArray = Array.empty[Byte] +end authds \ No newline at end of file diff --git a/shared/src/main/scala-3/scorex/crypto/hash/hash.scala b/shared/src/main/scala-3/scorex/crypto/hash/hash.scala new file mode 100644 index 00000000..c78a7f28 --- /dev/null +++ b/shared/src/main/scala-3/scorex/crypto/hash/hash.scala @@ -0,0 +1,30 @@ +package scorex.crypto + +import scorex.crypto.utils.NewType + +package object hash { + + trait BaseDigest extends NewType[Array[Byte]] + type Digest = BaseDigest#Type + + object Digest32 extends BaseDigest + object Digest64 extends BaseDigest + + type Digest32 = Digest32.Type + type Digest64 = Digest64.Type + + object NonStandardDigest extends NewType[Array[Byte]] + type NonStandardDigest = NonStandardDigest.Type + + type ExtendedDigest = Platform.Digest + + def createBlake2bDigest(bitSize: Int): ExtendedDigest = Platform.createBlake2bDigest(bitSize) + + def createSha256Digest(): ExtendedDigest = Platform.createSha256Digest() + + def updateDigest(digest: ExtendedDigest, b: Byte) = Platform.updateDigest(digest, b) + + def updateDigest(digest: ExtendedDigest, in: Array[Byte], inOff: Int, inLen: Int) = Platform.updateDigest(digest, in, inOff, inLen) + + def doFinalDigest(digest: ExtendedDigest): Array[Byte] = Platform.doFinalDigest(digest) +} diff --git a/shared/src/main/scala-3/scorex/crypto/utils/utils.scala b/shared/src/main/scala-3/scorex/crypto/utils/utils.scala new file mode 100644 index 00000000..f3e2a06a --- /dev/null +++ b/shared/src/main/scala-3/scorex/crypto/utils/utils.scala @@ -0,0 +1,14 @@ +package scorex.crypto + +object utils: + trait NewType[A]: + opaque type Type <: A = A + + inline def @@(a: A): Type = a + inline def @@@[B <: A](b: B): Type = b + + extension (a: Type) inline def value: A = a + + given conversion: Conversion[Type, A] = (_.value) + given (using CanEqual[A, A]): CanEqual[Type, Type] = CanEqual.derived + end NewType \ No newline at end of file diff --git a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/BatchNode.scala b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/BatchNode.scala index 8260801f..dc2162dc 100644 --- a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/BatchNode.scala +++ b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/BatchNode.scala @@ -1,6 +1,6 @@ package scorex.crypto.authds.avltree.batch -import scorex.crypto.authds.{ADKey, ADValue, Balance} +import scorex.crypto.authds._ import scorex.crypto.hash._ sealed trait Node[D <: Digest] extends ToStringHelper { diff --git a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala index b9d8d29b..3097eb9a 100644 --- a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala +++ b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala @@ -48,7 +48,7 @@ object PersistentBatchAVLProver { ): Try[PersistentBatchAVLProver[D, HF]] = Try { new PersistentBatchAVLProver[D, HF] { - override var avlProver: BatchAVLProver[D, HF] = avlBatchProver + var avlProver: BatchAVLProver[D, HF] = avlBatchProver override val storage: VersionedAVLStorage[D] = versionedStorage (storage.version match { diff --git a/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLModifyProof.scala b/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLModifyProof.scala index 441c07cc..cbd2ab9f 100644 --- a/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLModifyProof.scala +++ b/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLModifyProof.scala @@ -225,7 +225,7 @@ case class AVLModifyProof(key: ADKey, proofSeq: Seq[AVLProofElement]) val pathLength = if (keyFound) proofSeq.length - 3 else proofSeq.length - 4 val inBytes = pathLength.toByte +: key - val pathProofsBytes: Array[Byte] = (0 until pathLength / 3).toArray.flatMap { i: Int => + val pathProofsBytes: Array[Byte] = (0 until pathLength / 3).toArray.flatMap { (i: Int) => val label = proofSeq(3 * i + 1) val directionLabelByte = AVLModifyProof.directionBalanceByte(proofSeq(3 * i).asInstanceOf[ProofDirection], proofSeq(3 * i + 2).asInstanceOf[ProofBalance]) @@ -251,7 +251,7 @@ object AVLModifyProof { val pathLength: Int = bytes.head.ensuring(_ % 3 == 0) val key = ADKey @@ bytes.slice(1, 1 + keyLength) - val pathProofs: Seq[AVLProofElement] = (0 until pathLength / 3) flatMap { i: Int => + val pathProofs: Seq[AVLProofElement] = (0 until pathLength / 3) flatMap { (i: Int) => val start = 1 + keyLength + i * (1 + 32) val (direction, balance) = parseDirectionBalance(bytes.slice(start, start + 1).head) val labelBytes = bytes.slice(start + 1, start + 1 + digestSize) diff --git a/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLTree.scala b/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLTree.scala index cf7f483d..ef2e89c7 100644 --- a/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLTree.scala +++ b/shared/src/main/scala/scorex/crypto/authds/legacy/avltree/AVLTree.scala @@ -34,7 +34,7 @@ class AVLTree[HF <: CryptographicHash[_ <: Digest]](keyLength: Int, val proofStream = new scala.collection.mutable.Queue[AVLProofElement] val updateFn: Option[ADValue] => Try[Option[ADValue]] = operation match { - case _: Lookup => x: Option[ADValue] => Success(x) + case _: Lookup => (x: Option[ADValue]) => Success(x) case m: Modification => m.updateFn } diff --git a/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Node.scala b/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Node.scala index 61a28d4f..c8fd2276 100644 --- a/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Node.scala +++ b/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Node.scala @@ -24,7 +24,7 @@ sealed trait Node extends ToStringHelper { trait InternalNode { val hf: CryptographicHash[_ <: Digest] - val level: Level + def level: Level def leftLabel: Digest @@ -44,7 +44,7 @@ case class ProverNode(key: ADKey, private var _left: ProverNodes, private var _r (implicit val hf: CryptographicHash[_ <: Digest], levelFunc: LevelFunction) extends ProverNodes with InternalNode { - lazy val level: Level = levelFunc(key) + def level: Level = levelFunc(key) def left: ProverNodes = _left diff --git a/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Treap.scala b/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Treap.scala index f1e5d4e8..0c418ec4 100644 --- a/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Treap.scala +++ b/shared/src/main/scala/scorex/crypto/authds/legacy/treap/Treap.scala @@ -28,7 +28,7 @@ class Treap[HF <: CryptographicHash[_ <: Digest]](rootOpt: Option[Leaf] = None) //todo: unify types AVLValue/TreapValue and then generalize 4 LoCs below which are the same for Treap & AVLTree val updateFn: Option[ADValue] => Try[Option[ADValue]] = operation match { - case _: Lookup => x: Option[ADValue] => Success(x) + case _: Lookup => (x: Option[ADValue]) => Success(x) case m: Modification => m.updateFn } diff --git a/shared/src/main/scala/scorex/crypto/authds/merkle/MerkleTree.scala b/shared/src/main/scala/scorex/crypto/authds/merkle/MerkleTree.scala index ec931688..ae181abb 100644 --- a/shared/src/main/scala/scorex/crypto/authds/merkle/MerkleTree.scala +++ b/shared/src/main/scala/scorex/crypto/authds/merkle/MerkleTree.scala @@ -76,7 +76,7 @@ case class MerkleTree[D <: Digest](topNode: Node[D], val dif = b_flat diff a var m = dif.map(i => { val side = if (i % 2 == 0) MerkleProof.LeftSide else MerkleProof.RightSide - (l.lift(i).getOrElse(EmptyNode[D].hash), side) + (l.lift(i).getOrElse(EmptyNode[D]().hash), side) }) // Take all the even numbers from B_pruned, and divide them by two @@ -85,7 +85,7 @@ case class MerkleTree[D <: Digest](topNode: Node[D], // Go up one layer in the tree val l_new = l.grouped(2).map(lr => { hf.prefixedHash(InternalNodePrefix, - lr.head, if (lr.lengthCompare(2) == 0) lr.last else EmptyNode[D].hash) + lr.head, if (lr.lengthCompare(2) == 0) lr.last else EmptyNode[D]().hash) }).toSeq // Repeat until the root of the tree is reached @@ -156,10 +156,10 @@ object MerkleTree { @tailrec def calcTopNode[D <: Digest](nodes: Seq[Node[D]])(implicit hf: CryptographicHash[D]): Node[D] = { if (nodes.isEmpty) { - EmptyRootNode[D] + EmptyRootNode[D]() } else { val nextNodes = nodes.grouped(2) - .map(lr => InternalNode[D](lr.head, if (lr.lengthCompare(2) == 0) lr.last else EmptyNode[D])).toSeq + .map(lr => InternalNode[D](lr.head, if (lr.lengthCompare(2) == 0) lr.last else EmptyNode[D]())).toSeq if (nextNodes.lengthCompare(1) == 0) nextNodes.head else calcTopNode(nextNodes) } } diff --git a/shared/src/test/scala/scorex/crypto/authds/TwoPartyTests.scala b/shared/src/test/scala/scorex/crypto/authds/TwoPartyTests.scala index 99eda937..020c799f 100644 --- a/shared/src/test/scala/scorex/crypto/authds/TwoPartyTests.scala +++ b/shared/src/test/scala/scorex/crypto/authds/TwoPartyTests.scala @@ -48,13 +48,13 @@ trait TwoPartyTests extends TestingCommons { case class Append(key: ADKey, value: ADValue) extends Modification { override def updateFn: UpdateFunction = { - oldOpt: Option[ADValue] => Success(Some(ADValue @@ oldOpt.map(_ ++ value).getOrElse(value))) + (oldOpt: Option[ADValue]) => Success(Some(ADValue @@ oldOpt.map(_ ++ value).getOrElse(value))) }: UpdateFunction } case class TransactionUpdate(key: ADKey, amount: Long) extends Modification { override def updateFn: UpdateFunction = { - oldOpt: Option[ADValue] => + (oldOpt: Option[ADValue]) => Success(Some(ADValue @@ Longs.toByteArray(oldOpt.map(v => Longs.fromByteArray(v) + amount).getOrElse(amount)))) }: UpdateFunction } diff --git a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchSpecification.scala b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchSpecification.scala index efa95f9c..e352950c 100644 --- a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/AVLBatchSpecification.scala @@ -91,7 +91,7 @@ class AVLBatchSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyChe val newNodes = visitedNodes(prover.topNode) newNodes.foreach(nn => removed.find(r => r.label sameElements nn.label) shouldBe None) - prover.generateProof() + prover.generateProof() } } @@ -167,7 +167,7 @@ class AVLBatchSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyChe property("randomWalk") { val prover = generateProver()._1 - forAll { seed: Long => + forAll { (seed: Long) => val e1 = prover.randomWalk(new scala.util.Random(seed)) val e2 = prover.randomWalk(new scala.util.Random(seed)) e1.map(_._1) shouldEqual e2.map(_._1) @@ -279,7 +279,7 @@ class AVLBatchSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyChe val prover = generateProver()._1 val digest = prover.digest - forAll(smallInt) { numberOfLookups: Int => + forAll(smallInt) { (numberOfLookups: Int) => val currentMods = (0 until numberOfLookups).map(_ => randomKey(KL)).map(k => Lookup(k)) currentMods foreach (m => prover.performOneOperation(m)) @@ -296,7 +296,7 @@ class AVLBatchSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyChe val prover = new BatchAVLProver[D, HF](KL, None) var digest = prover.digest - forAll { valueLength: Short => + forAll { (valueLength: Short) => whenever(valueLength >= 0) { val aKey = Random.randomBytes(KL) val aValue = Random.randomBytes(valueLength) diff --git a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchTestingHelpers.scala b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchTestingHelpers.scala index 4e670b1d..182cb39d 100644 --- a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchTestingHelpers.scala +++ b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchTestingHelpers.scala @@ -2,7 +2,7 @@ package scorex.crypto.authds.avltree.batch import org.scalatest.matchers.should.Matchers import scorex.crypto.authds.{ADKey, ADValue} -import scorex.crypto.hash.{Blake2b256, Digest32} +import scorex.crypto.hash.{Blake2b256, Digest, Digest32} import scorex.utils.Random trait BatchTestingHelpers extends ToStringHelper with Matchers { diff --git a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchingPlayground.scala b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchingPlayground.scala index 945fd545..af84db3d 100644 --- a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchingPlayground.scala +++ b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/BatchingPlayground.scala @@ -38,7 +38,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { //removedNodesBenchmark //removedNodesBenchmark() - testReadme + testReadme() def removedNodesBenchmark(startTreeSize: Int = 10000, toRemoveSize: Int = 2000, @@ -125,7 +125,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } - def lookupTest() { + def lookupTest() = { val kl = 4 val vl = 7 @@ -370,9 +370,9 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } - def memoryTestWithBatching() { + def memoryTestWithBatching() = { // Generate a key out of an int - def generateKey(i: Int, key: Array[Byte]) { + def generateKey(i: Int, key: Array[Byte]) = { val r = i for (j <- 0 until 32) key(j) = ((r >> ((j % 4) * 8)) % 256).toByte @@ -470,7 +470,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } */ - def memoryTestNoBatching { + def memoryTestNoBatching() = { val oldProver = new AVLTree(32) val numMods = 1024 * 1024 var p: Option[scala.util.Try[AVLModifyProof]] = None @@ -512,7 +512,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } } - def timeBenchmarksNew { + def timeBenchmarksNew() = { val newProver = new BatchAVLProver[D, HF](KL, Some(VL)) val numMods = 1024 * 1024 @@ -576,7 +576,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } } - def timeBenchmarksOld { + def timeBenchmarksOld() = { val oldProver = new AVLTree(32) val numMods = 1024 * 1024 @@ -636,7 +636,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { } } - def spaceBenchmarks { + def spaceBenchmarks() = { val newProver = new BatchAVLProver[D, HF](KL, Some(VL)) val numMods = 1024 * 1024 @@ -1025,7 +1025,7 @@ object BatchingPlayground extends App with BatchTestingHelpers with Matchers { override def updateFn: UpdateFunction = old => Success(old) } - def testReadme { + def testReadme() = { val prover = new BatchAVLProver[D, HF](keyLength = 1, valueLengthOpt = Some(VL)) val initialDigest = prover.digest diff --git a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/serialization/AVLBatchSerializationSpecification.scala b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/serialization/AVLBatchSerializationSpecification.scala index e94c3555..dd578772 100644 --- a/shared/src/test/scala/scorex/crypto/authds/avltree/batch/serialization/AVLBatchSerializationSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/authds/avltree/batch/serialization/AVLBatchSerializationSpecification.scala @@ -36,7 +36,7 @@ class AVLBatchSerializationSpecification extends AnyPropSpec with ScalaCheckDriv } property("slice to pieces and combine tree back") { - forAll(Gen.choose(10, 10000)) { treeSize: Int => + forAll(Gen.choose(10, 10000)) { (treeSize: Int) => whenever(treeSize >= 10) { val tree = generateProver(treeSize) val height = tree.rootNodeHeight @@ -57,7 +57,7 @@ class AVLBatchSerializationSpecification extends AnyPropSpec with ScalaCheckDriv } property("slice to Array[Byte] pieces and combine tree back") { - forAll(Gen.choose(0, 10000)) { treeSize: Int => + forAll(Gen.choose(0, 10000)) { (treeSize: Int) => val serializer = new BatchAVLProverSerializer[D, HF] val tree = generateProver(treeSize) val kl = tree.keyLength @@ -83,7 +83,7 @@ class AVLBatchSerializationSpecification extends AnyPropSpec with ScalaCheckDriv property("manifest serialization") { val serializer = new BatchAVLProverSerializer[D, HF] - forAll(Gen.choose(0, 10000)) { treeSize: Int => + forAll(Gen.choose(0, 10000)) { (treeSize: Int) => val tree = generateProver(treeSize) val kl = tree.keyLength val digest = tree.digest diff --git a/shared/src/test/scala/scorex/crypto/authds/merkle/MerkleTreeSpecification.scala b/shared/src/test/scala/scorex/crypto/authds/merkle/MerkleTreeSpecification.scala index 89d11a74..4b695a10 100644 --- a/shared/src/test/scala/scorex/crypto/authds/merkle/MerkleTreeSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/authds/merkle/MerkleTreeSpecification.scala @@ -10,12 +10,12 @@ import scorex.crypto.hash.Blake2b256 import scala.util.Random class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyChecks with Matchers with TestingCommons { - implicit val hf = Blake2b256 + implicit val hf: Blake2b256.type = Blake2b256 private val LeafSize = 32 property("Proof generation by element") { - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val d = (0 until N).map(_ => LeafData @@ scorex.utils.Random.randomBytes(LeafSize)) val leafs = d.map(data => Leaf(data)) @@ -30,7 +30,7 @@ class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyC } property("Proof generation by index") { - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val d = (0 until N).map(_ => LeafData @@ scorex.utils.Random.randomBytes(LeafSize)) val tree = MerkleTree(d) @@ -50,7 +50,7 @@ class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyC property("Batch proof generation by indices") { val r = new Random() - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val d = (0 until N).map(_ => LeafData @@ scorex.utils.Random.randomBytes(LeafSize)) val tree = MerkleTree(d) @@ -93,7 +93,7 @@ class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyC } property("Tree creation from 1 element") { - forAll { d: Array[Byte] => + forAll { (d: Array[Byte]) => whenever(d.length > 0) { val tree = MerkleTree(Seq(LeafData @@ d))(hf) tree.rootHash shouldEqual @@ -103,7 +103,7 @@ class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyC } property("Tree creation from 5 elements") { - forAll { d: Array[Byte] => + forAll { (d: Array[Byte]) => whenever(d.length > 0) { val leafs: Seq[LeafData] = (0 until 5).map(_ => LeafData @@ d) val tree = MerkleTree(leafs)(hf) @@ -130,7 +130,7 @@ class MerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPropertyC } property("Tree creation from a lot of elements") { - forAll { d: Seq[Array[Byte]] => + forAll { (d: Seq[Array[Byte]]) => whenever(d.nonEmpty) { val tree = MerkleTree(d.map(a => LeafData @@ a)) tree.rootHash diff --git a/shared/src/test/scala/scorex/crypto/authds/merkle/serialization/BatchMerkleProofSerializerSpecification.scala b/shared/src/test/scala/scorex/crypto/authds/merkle/serialization/BatchMerkleProofSerializerSpecification.scala index ef8e19cd..4cd9559a 100644 --- a/shared/src/test/scala/scorex/crypto/authds/merkle/serialization/BatchMerkleProofSerializerSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/authds/merkle/serialization/BatchMerkleProofSerializerSpecification.scala @@ -22,7 +22,7 @@ class BatchMerkleProofSerializerSpecification extends AnyPropSpec property("Batch proof serialization + deserialization") { val r = new Random() val serializer = new BatchMerkleProofSerializer[D, HF] - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val d = (0 until N).map(_ => LeafData @@ scorex.utils.Random.randomBytes(LeafSize)) val tree = MerkleTree(d) @@ -66,7 +66,7 @@ class BatchMerkleProofSerializerSpecification extends AnyPropSpec property("indices serialization + deserialization") { val r = new Random() val serializer = new BatchMerkleProofSerializer[D, HF] - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val d = (0 until N).map(_ => LeafData @@ scorex.utils.Random.randomBytes(LeafSize)) @@ -91,7 +91,7 @@ class BatchMerkleProofSerializerSpecification extends AnyPropSpec property("proofs serialization + deserialization") { val r = new Random() val serializer = new BatchMerkleProofSerializer[D, HF] - forAll(smallInt) { N: Int => + forAll(smallInt) { (N: Int) => whenever(N > 0) { val proofs: Seq[(Digest, Side)] = (0 until N) diff --git a/shared/src/test/scala/scorex/crypto/authds/merkle/sparse/SparseMerkleTreeSpecification.scala b/shared/src/test/scala/scorex/crypto/authds/merkle/sparse/SparseMerkleTreeSpecification.scala index d55fe8e7..ac2172ea 100644 --- a/shared/src/test/scala/scorex/crypto/authds/merkle/sparse/SparseMerkleTreeSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/authds/merkle/sparse/SparseMerkleTreeSpecification.scala @@ -13,7 +13,7 @@ class SparseMerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPro implicit val hf: CryptographicHash[Digest32] = Blake2b256 property("Tree has valid last proof") { - forAll { height: Byte => + forAll { (height: Byte) => whenever(height > 0) { val tree0 = SparseMerkleTree.emptyTree(height) tree0.lastProof.valid(tree0.rootDigest, height) shouldBe true @@ -22,7 +22,7 @@ class SparseMerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPro } property("ZeroProof tree has valid proof") { - forAll { height: Byte => + forAll { (height: Byte) => whenever(height > 0) { val zp = SparseMerkleTree.zeroProof[Digest32](height) val zp1 = zp.copy(idx = 1) @@ -35,7 +35,7 @@ class SparseMerkleTreeSpecification extends AnyPropSpec with ScalaCheckDrivenPro } property("Updated tree has valid proof") { - forAll { height: Byte => + forAll { (height: Byte) => whenever(height > 1) { val zp = SparseMerkleTree.zeroProof[Digest32](height) val tree0 = SparseMerkleTree.emptyTree(height) diff --git a/shared/src/test/scala/scorex/crypto/hash/CommutativeHashSpecification.scala b/shared/src/test/scala/scorex/crypto/hash/CommutativeHashSpecification.scala index 823164f6..3023419b 100644 --- a/shared/src/test/scala/scorex/crypto/hash/CommutativeHashSpecification.scala +++ b/shared/src/test/scala/scorex/crypto/hash/CommutativeHashSpecification.scala @@ -5,7 +5,7 @@ class CommutativeHashSpecification extends HashTest { val hash = new CommutativeHash(Sha256) property(s"CommutativeHash(Sha256) is CryptographicHash") { - forAll { data: Array[Byte] => + forAll { (data: Array[Byte]) => hash.hash(data).length shouldBe hash.DigestSize } diff --git a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala index 4fce1e88..e4ae588f 100644 --- a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala +++ b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala @@ -9,6 +9,7 @@ import scorex.util.encode.Base16 import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ import scala.concurrent.{Await, Future} +import scala.reflect.ClassTag trait HashTest extends AnyPropSpec with ScalaCheckDrivenPropertyChecks @@ -21,7 +22,7 @@ trait HashTest extends AnyPropSpec def hashCheck[D <: Digest](hash: CryptographicHash[D], external: Map[Array[Byte], String]): Unit = { property(s"${hash.getClass.getSimpleName} size of hash should be DigestSize") { - forAll { data: Array[Byte] => + forAll { (data: Array[Byte]) => hash.hash(data).length shouldBe hash.DigestSize } } From d92b276e1b6b32e9eadd6fcf850df173e8938753 Mon Sep 17 00:00:00 2001 From: ccellado Date: Thu, 15 Feb 2024 21:09:11 +0400 Subject: [PATCH 3/6] Scala3 support CI fix --- .github/workflows/ci.yml | 4 +-- .../scala/scorex/crypto/hash/HashTest.scala | 25 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf8d0b3b..31b60086 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [2.13.8, 2.12.15, 2.11.12] + scala: [3.3.1, 2.13.12, 2.12.18, 2.11.12] java: [adopt@1.8] runs-on: ${{ matrix.os }} steps: @@ -64,7 +64,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [2.13.8, 2.12.15] + scala: [3.3.1, 2.13.12, 2.12.18] java: [adopt@1.8] node-version: [16.x] runs-on: ${{ matrix.os }} diff --git a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala index e4ae588f..cdcbd21b 100644 --- a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala +++ b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala @@ -56,17 +56,18 @@ trait HashTest extends AnyPropSpec } } - - property(s"${hash.getClass.getSimpleName} should return correct Tag") { - forAll { (string: String, bytes: Array[Byte]) => - val digest = hash(string) - digest.isInstanceOf[D] shouldBe true - if (digest.isInstanceOf[Digest32]) { - hash.DigestSize shouldBe 32 - } else if (digest.isInstanceOf[Digest64]) { - hash.DigestSize shouldBe 64 - } - } - } + // TODO refactor: reimplement Digest classes to pass runtime check or remove this test + // test incorrect in Scala2 last check not reached +// property(s"${hash.getClass.getSimpleName} should return correct Tag") { +// forAll { (string: String, bytes: Array[Byte]) => +// val digest = hash(string) +// digest.isInstanceOf[D] shouldBe true +// if (digest.isInstanceOf[Digest32]) { +// hash.DigestSize shouldBe 32 +// } else if (digest.isInstanceOf[Digest64]) { +// hash.DigestSize shouldBe 64 +// } +// } +// } } } From 359558111a0f03fbfda7d3422bc1e6eed73f9f8a Mon Sep 17 00:00:00 2001 From: ccellado Date: Thu, 15 Feb 2024 21:21:52 +0400 Subject: [PATCH 4/6] Remove Scala 2.12 for JS --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31b60086..ef15f40f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,7 +64,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [3.3.1, 2.13.12, 2.12.18] + scala: [3.3.1, 2.13.12] java: [adopt@1.8] node-version: [16.x] runs-on: ${{ matrix.os }} From 2fa4a7eccd45298257089a62a9b44cf48469dc61 Mon Sep 17 00:00:00 2001 From: ccellado Date: Wed, 21 Feb 2024 09:57:52 +0400 Subject: [PATCH 5/6] Fix types for test --- .../scala-3/scorex/crypto/authds/authds.scala | 16 ++++++------- .../scala-3/scorex/crypto/hash/hash.scala | 8 +++---- .../scala-3/scorex/crypto/utils/utils.scala | 23 ++++++++++++------- .../scala/scorex/crypto/hash/HashTest.scala | 22 +++++++++--------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/shared/src/main/scala-3/scorex/crypto/authds/authds.scala b/shared/src/main/scala-3/scorex/crypto/authds/authds.scala index 0655b793..6f97e8bf 100644 --- a/shared/src/main/scala-3/scorex/crypto/authds/authds.scala +++ b/shared/src/main/scala-3/scorex/crypto/authds/authds.scala @@ -1,27 +1,27 @@ package scorex.crypto -import scorex.crypto.utils.NewType +import scorex.crypto.utils.{NewByte, NewArrayByte} package object authds: - object LeafData extends NewType[Array[Byte]] + object LeafData extends NewArrayByte type LeafData = LeafData.Type - object Side extends NewType[Byte] + object Side extends NewByte type Side = Side.Type - object ADKey extends NewType[Array[Byte]] + object ADKey extends NewArrayByte type ADKey = ADKey.Type - object ADValue extends NewType[Array[Byte]] + object ADValue extends NewArrayByte type ADValue = ADValue.Type - object ADDigest extends NewType[Array[Byte]] + object ADDigest extends NewArrayByte type ADDigest = ADDigest.Type - object SerializedAdProof extends NewType[Array[Byte]] + object SerializedAdProof extends NewArrayByte type SerializedAdProof = SerializedAdProof.Type - object Balance extends NewType[Byte] + object Balance extends NewByte type Balance = Balance.Type /** Immutable empty array which can be used in many places to avoid allocations. */ diff --git a/shared/src/main/scala-3/scorex/crypto/hash/hash.scala b/shared/src/main/scala-3/scorex/crypto/hash/hash.scala index c78a7f28..5bf930b2 100644 --- a/shared/src/main/scala-3/scorex/crypto/hash/hash.scala +++ b/shared/src/main/scala-3/scorex/crypto/hash/hash.scala @@ -1,19 +1,19 @@ package scorex.crypto -import scorex.crypto.utils.NewType +import scorex.crypto.utils.NewArrayByte +import scorex.crypto.utils.NewDigest package object hash { - trait BaseDigest extends NewType[Array[Byte]] + trait BaseDigest extends NewDigest type Digest = BaseDigest#Type - object Digest32 extends BaseDigest object Digest64 extends BaseDigest type Digest32 = Digest32.Type type Digest64 = Digest64.Type - object NonStandardDigest extends NewType[Array[Byte]] + object NonStandardDigest extends NewDigest type NonStandardDigest = NonStandardDigest.Type type ExtendedDigest = Platform.Digest diff --git a/shared/src/main/scala-3/scorex/crypto/utils/utils.scala b/shared/src/main/scala-3/scorex/crypto/utils/utils.scala index f3e2a06a..90b2a9a6 100644 --- a/shared/src/main/scala-3/scorex/crypto/utils/utils.scala +++ b/shared/src/main/scala-3/scorex/crypto/utils/utils.scala @@ -1,14 +1,21 @@ package scorex.crypto object utils: - trait NewType[A]: - opaque type Type <: A = A - inline def @@(a: A): Type = a - inline def @@@[B <: A](b: B): Type = b + trait NewDigest: + opaque type Type <: Array[Byte] = Array[Byte] with this.type + inline def @@(a: Array[Byte]): this.Type = a.asInstanceOf[this.Type] + inline def @@@[B <: Array[Byte]](b: B): this.Type = b.asInstanceOf[this.Type] + end NewDigest - extension (a: Type) inline def value: A = a + trait NewArrayByte: + opaque type Type <: Array[Byte] = Array[Byte] + inline def @@(a: Array[Byte]): this.Type = a + inline def @@@[B <: Array[Byte]](b: B): this.Type = b + end NewArrayByte - given conversion: Conversion[Type, A] = (_.value) - given (using CanEqual[A, A]): CanEqual[Type, Type] = CanEqual.derived - end NewType \ No newline at end of file + trait NewByte: + opaque type Type <: Byte = Byte + inline def @@(a: Byte): this.Type = a + inline def @@@[B <: Byte](b: B): this.Type = b + end NewByte \ No newline at end of file diff --git a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala index cdcbd21b..690867c2 100644 --- a/shared/src/test/scala/scorex/crypto/hash/HashTest.scala +++ b/shared/src/test/scala/scorex/crypto/hash/HashTest.scala @@ -58,16 +58,16 @@ trait HashTest extends AnyPropSpec // TODO refactor: reimplement Digest classes to pass runtime check or remove this test // test incorrect in Scala2 last check not reached -// property(s"${hash.getClass.getSimpleName} should return correct Tag") { -// forAll { (string: String, bytes: Array[Byte]) => -// val digest = hash(string) -// digest.isInstanceOf[D] shouldBe true -// if (digest.isInstanceOf[Digest32]) { -// hash.DigestSize shouldBe 32 -// } else if (digest.isInstanceOf[Digest64]) { -// hash.DigestSize shouldBe 64 -// } -// } -// } + property(s"${hash.getClass.getSimpleName} should return correct Tag") { + forAll { (string: String, bytes: Array[Byte]) => + val digest = hash(string) + digest.isInstanceOf[D] shouldBe true + if (digest.isInstanceOf[Digest32]) { + hash.DigestSize shouldBe 32 + } else if (digest.isInstanceOf[Digest64]) { + hash.DigestSize shouldBe 64 + } + } + } } } From bf4e5e45232fa9f386c7327a309987bd7e05caa3 Mon Sep 17 00:00:00 2001 From: ccellado Date: Wed, 21 Feb 2024 10:09:30 +0400 Subject: [PATCH 6/6] Fix override for var --- .../authds/avltree/batch/PersistentBatchAVLProver.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala index 3097eb9a..44d99ee6 100644 --- a/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala +++ b/shared/src/main/scala/scorex/crypto/authds/avltree/batch/PersistentBatchAVLProver.scala @@ -7,7 +7,8 @@ import scala.util.Try abstract class PersistentBatchAVLProver[D <: Digest, HF <: CryptographicHash[D]] { - var avlProver: BatchAVLProver[D, HF] + def avlProver: BatchAVLProver[D, HF] + def avlProver_=(v: BatchAVLProver[D, HF]): Unit val storage: VersionedAVLStorage[D] def digest: ADDigest = avlProver.digest @@ -48,7 +49,7 @@ object PersistentBatchAVLProver { ): Try[PersistentBatchAVLProver[D, HF]] = Try { new PersistentBatchAVLProver[D, HF] { - var avlProver: BatchAVLProver[D, HF] = avlBatchProver + override var avlProver: BatchAVLProver[D, HF] = avlBatchProver override val storage: VersionedAVLStorage[D] = versionedStorage (storage.version match {