From 660d59032951986cf7039bf824b805352ca78a05 Mon Sep 17 00:00:00 2001 From: capdev Date: Wed, 16 Oct 2019 13:17:44 +0500 Subject: [PATCH 01/31] fix log name --- conf/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/logback.xml b/conf/logback.xml index 7f272f4..efa89ac 100644 --- a/conf/logback.xml +++ b/conf/logback.xml @@ -1,7 +1,7 @@ - ${application.home:-.}/logs/Application.log + ${application.home:-.}/logs/application.log [%d{HH:mm:ss}] [%level] - %message%n%xException From ba9b71fb946ad0712138c42261f1ece2e21844dc Mon Sep 17 00:00:00 2001 From: capdev Date: Wed, 16 Oct 2019 16:12:36 +0500 Subject: [PATCH 02/31] akka remote ReceiverActor --- app/actors/ReceiverActor.scala | 24 ++++++++++++++++++++++++ app/controllers/SearchController.scala | 2 -- app/modules/AkkaModule.scala | 15 +++++++++++++++ app/settings/Utils.scala | 4 ++-- build.sbt | 6 +++++- conf/application.conf | 13 +++++++++++++ 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 app/actors/ReceiverActor.scala create mode 100644 app/modules/AkkaModule.scala diff --git a/app/actors/ReceiverActor.scala b/app/actors/ReceiverActor.scala new file mode 100644 index 0000000..c64e47f --- /dev/null +++ b/app/actors/ReceiverActor.scala @@ -0,0 +1,24 @@ +package actors + +import actors.ModifierMessages._ +import akka.actor.Actor +import com.typesafe.scalalogging.StrictLogging +import org.encryfoundation.common.modifiers.history.{Header, Payload} +import org.encryfoundation.common.modifiers.mempool.transaction.Transaction + +class ReceiverActor extends Actor with StrictLogging { + + logger.debug("ExplorerActor started") + + def receive: Receive = { + case ModifierTx(tx: Transaction) => println(s"tx: $tx") + case ModifierHeader(header: Header) => println(s"header: $header") + case ModifierPayload(payload: Payload) => println(s"payload: txs ${payload.txs.size}") + } +} + +object ModifierMessages { + case class ModifierTx(tx: Transaction) + case class ModifierHeader(header: Header) + case class ModifierPayload(payload: Payload) +} diff --git a/app/controllers/SearchController.scala b/app/controllers/SearchController.scala index 76be16a..06995ab 100644 --- a/app/controllers/SearchController.scala +++ b/app/controllers/SearchController.scala @@ -2,10 +2,8 @@ package controllers import models._ import javax.inject.{Inject, Singleton} -import org.encryfoundation.common.transaction.{EncryAddress, Pay2ContractHashAddress, Pay2PubKeyAddress, PubKeyLockedContract} import play.api.libs.circe.Circe import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents, Result} -import scorex.crypto.encode.Base16 import settings.Utils import scala.concurrent.{ExecutionContext, Future} diff --git a/app/modules/AkkaModule.scala b/app/modules/AkkaModule.scala new file mode 100644 index 0000000..9d4c80d --- /dev/null +++ b/app/modules/AkkaModule.scala @@ -0,0 +1,15 @@ +package modules + +import actors.ReceiverActor +import play.api.mvc._ +import akka.actor._ +import javax.inject._ + +@Singleton +class Application @Inject()(system: ActorSystem, cc: ControllerComponents) extends AbstractController(cc) { + + println(s"actorSystem ${system.name} created") + println("receiver created") + val receiver = system.actorOf(Props(new ReceiverActor()), "receiver") + +} \ No newline at end of file diff --git a/app/settings/Utils.scala b/app/settings/Utils.scala index c60b8d7..bf824d4 100644 --- a/app/settings/Utils.scala +++ b/app/settings/Utils.scala @@ -1,7 +1,7 @@ package settings -import org.encryfoundation.common.Algos -import org.encryfoundation.common.transaction.{EncryAddress, Pay2ContractHashAddress, Pay2PubKeyAddress, PubKeyLockedContract} +import org.encryfoundation.common.modifiers.mempool.transaction.{EncryAddress, Pay2ContractHashAddress, Pay2PubKeyAddress, PubKeyLockedContract} +import org.encryfoundation.common.utils.Algos import scorex.crypto.encode.Base16 object Utils { diff --git a/build.sbt b/build.sbt index 83d93b8..819c98a 100644 --- a/build.sbt +++ b/build.sbt @@ -16,6 +16,7 @@ resolvers ++= Seq("Sonatype Releases" at "https://oss.sonatype.org/content/repos "Typesafe maven releases" at "http://repo.typesafe.com/typesafe/maven-releases/", "Sonatype Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/") +val akkaVersion = "2.5.13" val akkaHttpVersion = "10.1.3" val circeVersion = "0.9.3" val doobieVersion = "0.5.2" @@ -50,7 +51,7 @@ libraryDependencies ++= (Seq( "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test, "com.google.guava" % "guava" % "21.+", "com.iheart" %% "ficus" % "1.4.2", - "org.encry" %% "encry-common" % "0.8.6", + "org.encry" %% "encry-common" % "0.9.0", //"0.8.6" "org.bouncycastle" % "bcprov-jdk15on" % "1.58", "org.whispersystems" % "curve25519-java" % "+", "org.rudogma" %% "supertagged" % "1.+", @@ -58,6 +59,9 @@ libraryDependencies ++= (Seq( "org.encry" %% "prism" % "0.2.3", "com.adrianhurt" %% "play-bootstrap" % "1.4-P26-B4-SNAPSHOT", "de.heikoseeberger" %% "akka-http-circe" % "1.20.1", + "com.typesafe.akka" %% "akka-actor" % akkaVersion, + "com.typesafe.akka" %% "akka-stream" % akkaVersion, + "com.typesafe.akka" %% "akka-remote" % akkaVersion ) ++ databaseDependencies ++ apiDependencies ++ loggingDependencies) .map(_ exclude("ch.qos.logback", "*") exclude("ch.qos.logback", "*")) diff --git a/conf/application.conf b/conf/application.conf index e856c89..2c7e8a5 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -19,3 +19,16 @@ play.assets { path = "/public" urlPrefix = "/assets" } + +akka { + actor { + provider = remote + } + remote { + enabled-transports = ["akka.remote.netty.tcp"] + netty.tcp { + hostname = "localhost" + port = 46619 + } + } +} From a25eff1d4d80c5d98bd7f41e5ddd2b6da3a8c95a Mon Sep 17 00:00:00 2001 From: capdev Date: Wed, 16 Oct 2019 18:34:17 +0500 Subject: [PATCH 03/31] Uncommited transactions - dao, web receiver inject --- app/actors/ReceiverActor.scala | 19 +- app/controllers/TransactionsController.scala | 10 +- app/models/TransactionsDao.scala | 7 +- app/models/database/DataService.scala | 22 ++ app/modules/ActorModule.scala | 11 + app/modules/AkkaModule.scala | 15 -- app/modules/ReceiverModule.scala | 10 + app/views/index.scala.html | 5 + app/views/uncomtransInfo.scala.html | 246 +++++++++++++++++++ conf/application.conf | 1 + conf/routes | 1 + 11 files changed, 327 insertions(+), 20 deletions(-) create mode 100644 app/models/database/DataService.scala create mode 100644 app/modules/ActorModule.scala delete mode 100644 app/modules/AkkaModule.scala create mode 100644 app/modules/ReceiverModule.scala create mode 100644 app/views/uncomtransInfo.scala.html diff --git a/app/actors/ReceiverActor.scala b/app/actors/ReceiverActor.scala index c64e47f..b8902b2 100644 --- a/app/actors/ReceiverActor.scala +++ b/app/actors/ReceiverActor.scala @@ -1,24 +1,39 @@ package actors import actors.ModifierMessages._ -import akka.actor.Actor +import akka.actor.{Actor, Props} import com.typesafe.scalalogging.StrictLogging import org.encryfoundation.common.modifiers.history.{Header, Payload} import org.encryfoundation.common.modifiers.mempool.transaction.Transaction +import scala.collection.mutable + class ReceiverActor extends Actor with StrictLogging { - logger.debug("ExplorerActor started") + //logger.debug("ExplorerActor started") + + var transcactions: mutable.Map[String, models.Transaction] = mutable.Map( + "qwe" -> models.Transaction("qwe", 3, "dsfdsffdsf", true, System.currentTimeMillis(), Some("Proof")) + ) def receive: Receive = { case ModifierTx(tx: Transaction) => println(s"tx: $tx") case ModifierHeader(header: Header) => println(s"header: $header") case ModifierPayload(payload: Payload) => println(s"payload: txs ${payload.txs.size}") + + case TransactionsQ() => sender ! TransactionsA(transcactions.values.toList) } } +object ReceiverActor { + def props = Props[ReceiverActor] +} + object ModifierMessages { case class ModifierTx(tx: Transaction) case class ModifierHeader(header: Header) case class ModifierPayload(payload: Payload) + + case class TransactionsQ() + case class TransactionsA(txs: List[models.Transaction]) } diff --git a/app/controllers/TransactionsController.scala b/app/controllers/TransactionsController.scala index 98cd4fe..05f9a7b 100644 --- a/app/controllers/TransactionsController.scala +++ b/app/controllers/TransactionsController.scala @@ -1,6 +1,6 @@ package controllers -import models.{Contract, FullFilledTransaction, Input, Output, TransactionsDao} +import models.{Contract, FullFilledTransaction, Input, Output, Transaction, TransactionsDao} import javax.inject.{Inject, Singleton} import play.api.libs.circe.Circe import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} @@ -33,4 +33,12 @@ class TransactionsController @Inject()(cc: ControllerComponents, case None => NotFound } } + + def getUncomTransactions: Action[AnyContent] = Action.async { + transactionsDao.uncommittedTransactions().map { + case Nil => NotFound + case txs: List[Transaction] => Ok(views.html.uncomtransInfo(txs)) + } + } + } \ No newline at end of file diff --git a/app/models/TransactionsDao.scala b/app/models/TransactionsDao.scala index b7d2fdd..4831bbf 100644 --- a/app/models/TransactionsDao.scala +++ b/app/models/TransactionsDao.scala @@ -1,11 +1,12 @@ package models import javax.inject.Inject -import models.database.DBService +import models.database.{DBService, DataService} import models.database.TransactionsQueries._ + import scala.concurrent.{ExecutionContext, Future} -class TransactionsDao @Inject()(dBService: DBService)(implicit ec: ExecutionContext) { +class TransactionsDao @Inject()(dBService: DBService, dataService: DataService)(implicit ec: ExecutionContext) { def transactionsByBlock(id: String): Future[List[Transaction]] = dBService.runAsync(getTransactionsByBlockId(id)) @@ -18,4 +19,6 @@ class TransactionsDao @Inject()(dBService: DBService)(implicit ec: ExecutionCont def outputById(id: String): Future[Option[Output]] = dBService.runAsync(getOutput(id)) def contractByTransaction(id: String): Future[List[Contract]] = dBService.runAsync(getContract(id)) + + def uncommittedTransactions(): Future[List[Transaction]] = dataService.getUncommittedTransactions } diff --git a/app/models/database/DataService.scala b/app/models/database/DataService.scala new file mode 100644 index 0000000..3154d7b --- /dev/null +++ b/app/models/database/DataService.scala @@ -0,0 +1,22 @@ +package models.database + +import actors.ModifierMessages.{TransactionsA, TransactionsQ} +import akka.actor.ActorRef +import akka.util.Timeout +import javax.inject._ +import play.api.Configuration +import play.api.mvc._ +import settings.ExplorerSettings +import akka.pattern.ask + +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future +import scala.concurrent.duration._ + +class DataService @Inject()(config: Configuration, settings: ExplorerSettings, @Named("receiver") receiver: ActorRef, components: ControllerComponents) { + implicit val timeout: Timeout = 5 seconds + + def getUncommittedTransactions: Future[List[models.Transaction]] = + (receiver ? TransactionsQ()).mapTo[TransactionsA].map(_.txs) + +} diff --git a/app/modules/ActorModule.scala b/app/modules/ActorModule.scala new file mode 100644 index 0000000..8cb3b15 --- /dev/null +++ b/app/modules/ActorModule.scala @@ -0,0 +1,11 @@ +package modules + +import actors.ReceiverActor +import play.api.mvc._ +import akka.actor._ +import javax.inject._ + +@Singleton +class ActorModule @Inject()(system: ActorSystem, cc: ControllerComponents) extends AbstractController(cc) { + //val receiver = system.actorOf(ReceiverActor.props, "receiver") +} \ No newline at end of file diff --git a/app/modules/AkkaModule.scala b/app/modules/AkkaModule.scala deleted file mode 100644 index 9d4c80d..0000000 --- a/app/modules/AkkaModule.scala +++ /dev/null @@ -1,15 +0,0 @@ -package modules - -import actors.ReceiverActor -import play.api.mvc._ -import akka.actor._ -import javax.inject._ - -@Singleton -class Application @Inject()(system: ActorSystem, cc: ControllerComponents) extends AbstractController(cc) { - - println(s"actorSystem ${system.name} created") - println("receiver created") - val receiver = system.actorOf(Props(new ReceiverActor()), "receiver") - -} \ No newline at end of file diff --git a/app/modules/ReceiverModule.scala b/app/modules/ReceiverModule.scala new file mode 100644 index 0000000..c963901 --- /dev/null +++ b/app/modules/ReceiverModule.scala @@ -0,0 +1,10 @@ +package modules +import actors.ReceiverActor +import com.google.inject.AbstractModule +import play.api.libs.concurrent.AkkaGuiceSupport + +class ReceiverModule extends AbstractModule with AkkaGuiceSupport { + override def configure = { + bindActor[ReceiverActor]("receiver") + } +} diff --git a/app/views/index.scala.html b/app/views/index.scala.html index ac67b63..b5b7662 100644 --- a/app/views/index.scala.html +++ b/app/views/index.scala.html @@ -91,6 +91,11 @@