Skip to content
Open
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
11 changes: 11 additions & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
maxColumn = 120
align = most
continuationIndent.defnSite = 2
assumeStandardLibraryStripMargin = true
docstrings = JavaDoc
lineEndings = preserve
includeCurlyBraceInSelectChains = false
danglingParentheses = true
spaces { inImportCurlyBraces = true }
optIn.annotationNewlines = true
rewrite.rules = [SortImports, RedundantBraces]
72 changes: 34 additions & 38 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,47 +1,43 @@
name := "TransactionsGenerator"
version := "0.8.3"
name := "TransactionsGenerator"
version := "0.8.3"
organization := "org.encryFoundation"

val logbackVersion = "1.2.3"
val catsVersion = "1.0.1"
val akkaHttpVersion = "10.0.9"
val akkaVersion = "2.5.13"
val akkaHttpVersion = "10.1.10"
val akkaVersion = "2.6.0"

scalaVersion := "2.12.6"
val catsVersion = "2.0.0"
val fs2Version = "2.0.0"
val http4sVersion = "0.20.12"

val loggingDependencies = Seq(
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.0",
"ch.qos.logback" % "logback-classic" % logbackVersion,
"ch.qos.logback" % "logback-core" % logbackVersion
)

val testingDependencies = Seq(
"com.typesafe.akka" %% "akka-testkit" % "2.4.+" % Test,
"com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion % Test,
"org.scalatest" %% "scalatest" % "3.0.3" % Test,
"org.scalacheck" %% "scalacheck" % "1.13.+" % Test,
"org.mockito" % "mockito-core" % "2.19.1" % Test
)
scalaVersion := "2.12.10"

libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
"com.typesafe.akka" %% "akka-stream" % akkaVersion,
"org.influxdb" % "influxdb-java" % "2.10",
"com.iheart" %% "ficus" % "1.4.3",
"org.encry" %% "encry-common" % "0.8.9",
"org.typelevel" % "cats-core_2.12" % "1.0.1",
"org.typelevel" % "cats-kernel_2.12" % "1.0.1",
"org.typelevel" % "cats-macros_2.12" % "1.0.1",
"com.google.guava" % "guava" % "27.1-jre",
"com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf",
"commons-net" % "commons-net" % "3.3"
) ++ loggingDependencies ++ testingDependencies

scalacOptions += "-Ypartial-unification"

scalacOptions += "-language:higherKinds"
"org.typelevel" %% "cats-core" % catsVersion,
"co.fs2" %% "fs2-io" % fs2Version,
"org.scodec" %% "scodec-stream" % "2.0.0",
"org.http4s" %% "http4s-blaze-client" % http4sVersion,
"org.http4s" %% "http4s-circe" % http4sVersion,
"org.http4s" %% "http4s-dsl" % http4sVersion,
"io.chrisdavenport" %% "log4cats-slf4j" % "0.4.0-M2",
// "org.scalameta" %% "semanticdb-scalac" % "4.2.5",
"com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
"com.typesafe.akka" %% "akka-stream" % akkaVersion,
"org.influxdb" % "influxdb-java" % "2.10",
"com.iheart" %% "ficus" % "1.4.7",
"org.encry" %% "encry-common" % "0.9.2",
"com.google.guava" % "guava" % "27.1-jre",
"com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf",
"commons-net" % "commons-net" % "3.3"
)

scalacOptions ++= List(
"-feature",
"-language:higherKinds",
"-Xlint",
"-Yrangepos"
//"-Ywarn-unused"
)

resolvers ++= Seq(
"Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases/",
Expand All @@ -52,4 +48,4 @@ resolvers ++= Seq(

PB.targets in Compile := Seq(
scalapb.gen() -> (sourceManaged in Compile).value / "protobuf"
)
)
4 changes: 2 additions & 2 deletions project/scalapb.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.19")
addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.23")

libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.8.2"
libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.9.4"
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import net.ceedubs.ficus.readers.ArbitraryTypeReader._
import org.encryfoundation.generator.network.NetworkServer
import scala.concurrent.ExecutionContextExecutor

object GeneratorApp extends App with StrictLogging {
object GeneratorApp extends StrictLogging {

implicit lazy val system: ActorSystem = ActorSystem()
implicit lazy val materializer: ActorMaterializer = ActorMaterializer()
Expand Down
31 changes: 31 additions & 0 deletions src/main/scala/org/encryfoundation/generator/Http4sApp.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.encryfoundation.generator

import cats.effect.{ ExitCode, IO, IOApp }
import fs2.Stream
import cats.syntax.functor._
import io.chrisdavenport.log4cats.slf4j.Slf4jLogger
import org.encryfoundation.generator.processors.{ HttpApiBoxesProcessor, TransactionGenerator }
import org.http4s.client.blaze.BlazeClientBuilder
import org.encryfoundation.generator.storage.{ BatchesStorage, ContractHashStorage, TransactionsStorage }
import scala.concurrent.ExecutionContext.Implicits.global

object Http4sApp extends IOApp {
override def run(args: List[String]): IO[ExitCode] = {

val streamF: Stream[IO, Unit] = for {
logger <- Stream.eval(Slf4jLogger.create[IO])
_ <- Stream.eval(logger.info("Generator app started"))
service <- Stream.resource(BlazeClientBuilder[IO](global).resource)
batchesStorage <- Stream.eval(BatchesStorage.apply[IO](logger))
keysStorage <- Stream.eval(ContractHashStorage.apply[IO](logger))
transactionsStorage <- Stream.eval(TransactionsStorage.apply[IO])
boxesProcessor <- Stream.eval(
TransactionGenerator.apply[IO](logger, batchesStorage, keysStorage, transactionsStorage)
)
_ <- Stream.eval(keysStorage.init)
httpClient <- Stream.eval(HttpApiBoxesProcessor.apply[IO](service, logger, batchesStorage, keysStorage))
_ <- httpClient.run concurrently boxesProcessor.run
} yield ()
streamF.compile.drain.as(ExitCode.Success)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.encryfoundation.generator.actors

import org.encryfoundation.common.modifiers.state.box.{EncryBaseBox, MonetaryBox}

final case class BoxesBatch(boxes: List[MonetaryBox])

object BoxesBatch { def empty: BoxesBatch = BoxesBatch(List.empty[MonetaryBox]) }
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import akka.actor.{Actor, ActorRef, Cancellable, Props}
import com.typesafe.scalalogging.StrictLogging
import org.encryfoundation.generator.actors.BoxesHolder._
import org.encryfoundation.generator.actors.InfluxActor._
import org.encryfoundation.generator.modifiers.box.AssetBox
import org.encryfoundation.generator.utils.{NetworkService, Node, Settings}
import com.google.common.base.Charsets
import com.google.common.hash.{BloomFilter, Funnels}
import org.encryfoundation.common.modifiers.state.box.AssetBox
import org.encryfoundation.common.utils.Algos

import scala.concurrent.ExecutionContext.Implicits.global
Expand Down Expand Up @@ -84,7 +84,7 @@ class BoxesHolder(settings: Settings,
case RequestForNewBoxesFromApi =>
if (pool.size < settings.boxesHolderSettings.poolSize) {
logger.info(s"Current pool size is: ${pool.size}. Asking new boxes from api!")
getBoxes(0, settings.boxesHolderSettings.rangeForAskingBoxes)
//getBoxes(0, settings.boxesHolderSettings.rangeForAskingBoxes)
}
else logger.info(s"Current pool is: ${pool.size}. We won't ask new boxes from api!")
}
Expand Down Expand Up @@ -117,20 +117,20 @@ class BoxesHolder(settings: Settings,
(newBoxes.values.toList, usedBoxes)
}

def getBoxes(from: Int, to: Int): Future[Unit] =
NetworkService.requestUtxos(peer, from, to).map { request =>
logger.debug(s"Boxes from API: ${request.size}")
if (request.nonEmpty && to < settings.boxesHolderSettings.maxPoolSize) {
val newFrom: Int = from + settings.boxesHolderSettings.rangeForAskingBoxes
val newTo: Int = to + settings.boxesHolderSettings.rangeForAskingBoxes
getBoxes(newFrom, newTo)
logger.debug(s"Asking new boxes in range: $newFrom -> $newTo.")
}
request.collect { case mb: AssetBox if mb.tokenIdOpt.isEmpty && !bloomFilter.mightContain(Algos.encode(mb.id)) =>
bloomFilter.put(Algos.encode(mb.id))
mb
}
}.map(boxes => self ! BoxesFromApi(boxes))
// def getBoxes(from: Int, to: Int): Future[Unit] =
// NetworkService.requestUtxos(peer, from, to).map { request =>
// logger.debug(s"Boxes from API: ${request.size}")
// if (request.nonEmpty && to < settings.boxesHolderSettings.maxPoolSize) {
// val newFrom: Int = from + settings.boxesHolderSettings.rangeForAskingBoxes
// val newTo: Int = to + settings.boxesHolderSettings.rangeForAskingBoxes
// //getBoxes(newFrom, newTo)
// logger.debug(s"Asking new boxes in range: $newFrom -> $newTo.")
// }
// request.collect { case mb: AssetBox if mb.tokenIdOpt.isEmpty && !bloomFilter.mightContain(Algos.encode(mb.id)) =>
// bloomFilter.put(Algos.encode(mb.id))
// mb
// }
// }.map(boxes => self ! BoxesFromApi(boxes))

def initBloomFilter: BloomFilter[String] = BloomFilter.create(
Funnels.stringFunnel(Charsets.UTF_8),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ package org.encryfoundation.generator.actors
import akka.actor.{Actor, ActorRef, Props}
import com.typesafe.scalalogging.StrictLogging
import org.encryfoundation.common.crypto.PrivateKey25519
import org.encryfoundation.common.modifiers.mempool.transaction.{Proof, PubKeyLockedContract}
import org.encryfoundation.common.modifiers.mempool.transaction.{Proof, PubKeyLockedContract, Transaction}
import org.encryfoundation.common.modifiers.state.box.{AssetBox, Box, EncryBaseBox, MonetaryBox}
import org.encryfoundation.common.utils.Algos
import org.encryfoundation.generator.actors.BlockchainListener.{CheckTxMined, MultisigTxsInBlockchain}
import org.encryfoundation.generator.actors.BoxesHolder._
import org.encryfoundation.generator.actors.Generator.TransactionForCommit
import org.encryfoundation.generator.modifiers.box.{AssetBox, Box, MonetaryBox}
import org.encryfoundation.generator.modifiers.{Transaction, TransactionsFactory}
import org.encryfoundation.generator.modifiers.TransactionsFactory
import org.encryfoundation.generator.transaction.Contracts
import org.encryfoundation.generator.utils.{Mnemonic, Node, Settings}
import org.encryfoundation.generator.utils.{Node, Settings}
import org.encryfoundation.prismlang.compiler.CompiledContract
import org.encryfoundation.prismlang.core.wrapped.BoxedValue.MultiSignatureValue
import scorex.crypto.hash.Blake2b256
Expand Down Expand Up @@ -41,16 +41,19 @@ class Generator(settings: Settings,
settings.multisig.mnemonicKeys
.take(3)
.map(Some(_))
.map(Mnemonic.createPrivKey)
.map(Mnemonic.createPrivateKey)
else
(1 to 3)
.map(_ => Curve25519.createKeyPair(rBytes()))
.map(pair => PrivateKey25519(pair._1, pair._2))

var multisigBoxes: Map[String, Seq[Box]] = Map.empty
var multisigBoxes: Map[String, Seq[EncryBaseBox]] = Map.empty
val blockchainListener: ActorRef =
context.actorOf(Props(classOf[BlockchainListener], settings), "blockchainListener")

override def receive: Receive = {
case _ =>
}
override def receive: Receive = {
case BoxesForGenerator(boxes, txType, None) if boxes.nonEmpty =>
generateAndSendTransaction(boxes, txType)
Expand Down Expand Up @@ -136,7 +139,7 @@ class Generator(settings: Settings,
}
if (txsType == 3) {
blockchainListener ! CheckTxMined(Algos.encode(transaction.id))
multisigBoxes = multisigBoxes.updated(Algos.encode(transaction.id), transaction.newBoxes)
multisigBoxes = multisigBoxes.updated(Algos.encode(transaction.id), transaction.newBoxes.toSeq)
}
if (txsType == 4) {
blockchainListener ! CheckTxMined(Algos.encode(transaction.id))
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package org.encryfoundation.generator.modifiers
import com.google.common.primitives.{Bytes, Longs}
import com.typesafe.scalalogging.StrictLogging
import org.encryfoundation.common.crypto.{PrivateKey25519, PublicKey25519, Signature25519}
import org.encryfoundation.common.modifiers.mempool.transaction.{Input, Proof, PubKeyLockedContract}
import org.encryfoundation.common.modifiers.mempool.directive.{AssetIssuingDirective, DataDirective, Directive, ScriptedAssetDirective, TransferDirective}
import org.encryfoundation.common.modifiers.mempool.transaction.{Input, Proof, PubKeyLockedContract, Transaction}
import org.encryfoundation.common.modifiers.state.box.MonetaryBox
import org.encryfoundation.prismlang.compiler.CompiledContract
import org.encryfoundation.prismlang.core.wrapped.BoxedValue
import scorex.crypto.hash.{Blake2b256, Digest32}
import org.encryfoundation.generator.modifiers.directives._
import org.encryfoundation.common.utils.TaggedTypes.ADKey
import org.encryfoundation.generator.modifiers.box.MonetaryBox

import scala.util.Random

Expand Down
Loading