From bebf9e40aae576bf63e25cbf5aab268f456afb75 Mon Sep 17 00:00:00 2001 From: deabreu Date: Mon, 28 May 2018 10:51:50 -0300 Subject: [PATCH 1/5] Removal of attachment references. It is compilable. Note: AssetBroadcastApiRoute.scala had two references to attachment on JSON String. Test Pending. --- .../lunes/settings/BlockchainSettings.scala | 2 +- .../scala/io/lunes/state2/StateStorage.scala | 2 +- .../transaction/TransactionFactory.scala | 8 ++--- .../assets/MassTransferTransaction.scala | 32 ++++++++--------- .../assets/TransferTransaction.scala | 36 +++++++++---------- .../http/assets/AssetsBroadcastApiRoute.scala | 4 ++- .../api/http/assets/MassTransferRequest.scala | 2 +- .../assets/SignedMassTransferRequest.scala | 12 +++---- .../http/assets/SignedTransferRequest.scala | 10 +++--- .../api/http/assets/TransferRequest.scala | 2 +- 10 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/main/scala/io/lunes/settings/BlockchainSettings.scala b/src/main/scala/io/lunes/settings/BlockchainSettings.scala index 8f8b63f08..1b63b24d4 100644 --- a/src/main/scala/io/lunes/settings/BlockchainSettings.scala +++ b/src/main/scala/io/lunes/settings/BlockchainSettings.scala @@ -8,7 +8,7 @@ import net.ceedubs.ficus.readers.EnumerationReader._ import scala.concurrent.duration._ -import io.lunes.features.BlockchainFeatures +//import io.lunes.features.BlockchainFeatures /** * diff --git a/src/main/scala/io/lunes/state2/StateStorage.scala b/src/main/scala/io/lunes/state2/StateStorage.scala index 99dbc408a..4f216a321 100644 --- a/src/main/scala/io/lunes/state2/StateStorage.scala +++ b/src/main/scala/io/lunes/state2/StateStorage.scala @@ -7,7 +7,7 @@ import io.lunes.db._ import io.lunes.utils._ import org.iq80.leveldb.{DB, WriteBatch} import scorex.account.{Address, Alias} -import scorex.serialization.Deser +//import scorex.serialization.Deser import scorex.utils.{NTP, Time} import scala.util.Try diff --git a/src/main/scala/io/lunes/transaction/TransactionFactory.scala b/src/main/scala/io/lunes/transaction/TransactionFactory.scala index 2775aafc0..1a38e000c 100644 --- a/src/main/scala/io/lunes/transaction/TransactionFactory.scala +++ b/src/main/scala/io/lunes/transaction/TransactionFactory.scala @@ -56,8 +56,8 @@ object TransactionFactory { request.amount, request.timestamp.getOrElse(time.getTimestamp()), request.feeAssetId.map(s => ByteStr.decodeBase58(s).get), - request.fee, - request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) + request.fee)//, +// request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) } yield tx /** @@ -77,8 +77,8 @@ object TransactionFactory { senderPrivateKey, transfers, request.timestamp.getOrElse(time.getTimestamp()), - request.fee, - request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) + request.fee)//, +// request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) } yield tx /** diff --git a/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala b/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala index 7bff29c46..6bb94abf3 100644 --- a/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala @@ -7,7 +7,7 @@ import io.lunes.state2._ import monix.eval.Coeval import play.api.libs.json.{Format, JsObject, JsValue, Json} import scorex.account.{AddressOrAlias, PrivateKeyAccount, PublicKeyAccount} -import scorex.crypto.encode.Base58 +//import scorex.crypto.encode.Base58 import scorex.serialization.Deser import io.lunes.transaction.TransactionParser._ import io.lunes.transaction.ValidationError.Validation @@ -24,7 +24,6 @@ import scala.util.{Either, Failure, Success, Try} * @param transfers * @param timestamp * @param fee - * @param attachment * @param proofs */ case class MassTransferTransaction private(version: Byte, @@ -33,7 +32,7 @@ case class MassTransferTransaction private(version: Byte, transfers: List[ParsedTransfer], timestamp: Long, fee: Long, - attachment: Array[Byte], +// attachment: Array[Byte], proofs: Proofs) extends ProvenTransaction with FastHashId { override val transactionType: TransactionType.Value = TransactionType.MassTransferTransaction @@ -53,14 +52,14 @@ case class MassTransferTransaction private(version: Byte, Shorts.toByteArray(transfers.size.toShort), transferBytes, Longs.toByteArray(timestamp), - Longs.toByteArray(fee), - Deser.serializeArray(attachment)) + Longs.toByteArray(fee))//, +// Deser.serializeArray(attachment)) } override def jsonBase(): JsObject = super.jsonBase() ++ Json.obj( "version" -> version, "assetId" -> assetId.map(_.base58), - "attachment" -> Base58.encode(attachment), +// "attachment" -> Base58.encode(attachment), "transferCount" -> transfers.size, "totalAmount" -> transfers.map(_.amount).sum) @@ -125,9 +124,9 @@ object MassTransferTransaction { transfers <- transfersList.map { case (ei, _) => ei }.sequence timestamp = Longs.fromByteArray(bytes.slice(s1, s1 + 8)) feeAmount = Longs.fromByteArray(bytes.slice(s1 + 8, s1 + 16)) - (attachment, attachEnd) = Deser.parseArraySize(bytes, s1 + 16) + (attachment, attachEnd) = Deser.parseArraySize(bytes, s1 + 16) // attachment kept only as ignorable variable. proofs <- Proofs.fromBytes(bytes.drop(attachEnd)) - mtt <- MassTransferTransaction.create(version, assetIdOpt.map(ByteStr(_)), sender, transfers, timestamp, feeAmount, attachment, proofs) + mtt <- MassTransferTransaction.create(version, assetIdOpt.map(ByteStr(_)), sender, transfers, timestamp, feeAmount, /*attachment,*/ proofs) } yield mtt tx.fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten @@ -139,7 +138,6 @@ object MassTransferTransaction { * @param transfers * @param timestamp * @param feeAmount - * @param attachment * @param proofs * @return */ @@ -149,7 +147,7 @@ object MassTransferTransaction { transfers: List[ParsedTransfer], timestamp: Long, feeAmount: Long, - attachment: Array[Byte], +// attachment: Array[Byte], proofs: Proofs): Either[ValidationError, MassTransferTransaction] = { Try { transfers.map(_.amount).fold(feeAmount)(Math.addExact) @@ -160,12 +158,12 @@ object MassTransferTransaction { Left(ValidationError.GenericError(s"Number of transfers is greater than $MaxTransferCount")) } else if (transfers.exists(_.amount < 0)) { Left(ValidationError.GenericError("One of the transfers has negative amount")) - } else if (attachment.length > TransferTransaction.MaxAttachmentSize) { - Left(ValidationError.TooBigArray) +// } else if (attachment.length > TransferTransaction.MaxAttachmentSize) { +// Left(ValidationError.TooBigArray) } else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(MassTransferTransaction(version, assetId, sender, transfers, timestamp, feeAmount, attachment, proofs)) + Right(MassTransferTransaction(version, assetId, sender, transfers, timestamp, feeAmount, /*attachment,*/ proofs)) } ) } @@ -178,7 +176,6 @@ object MassTransferTransaction { * @param transfers * @param timestamp * @param feeAmount - * @param attachment * @return */ def selfSigned(version: Byte, @@ -186,9 +183,10 @@ object MassTransferTransaction { sender: PrivateKeyAccount, transfers: List[ParsedTransfer], timestamp: Long, - feeAmount: Long, - attachment: Array[Byte]): Either[ValidationError, MassTransferTransaction] = { - create(version, assetId, sender, transfers, timestamp, feeAmount, attachment, Proofs.empty).right.map { unsigned => + feeAmount: Long//, +// attachment: Array[Byte] + ): Either[ValidationError, MassTransferTransaction] = { + create(version, assetId, sender, transfers, timestamp, feeAmount, /*attachment,*/ Proofs.empty).right.map { unsigned => unsigned.copy(proofs = Proofs.create(Seq(ByteStr(crypto.sign(sender, unsigned.bodyBytes())))).explicitGet()) } } diff --git a/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala b/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala index 11705ec2b..c9d014f2e 100755 --- a/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala @@ -23,7 +23,6 @@ import scala.util.{Failure, Success, Try} * @param timestamp * @param feeAssetId * @param fee - * @param attachment * @param signature */ case class TransferTransaction private(assetId: Option[AssetId], @@ -33,7 +32,7 @@ case class TransferTransaction private(assetId: Option[AssetId], timestamp: Long, feeAssetId: Option[AssetId], fee: Long, - attachment: Array[Byte], +// attachment: Array[Byte], signature: ByteStr) extends SignedTransaction with FastHashId { override val transactionType: TransactionType.Value = TransactionType.TransferTransaction @@ -54,16 +53,17 @@ case class TransferTransaction private(assetId: Option[AssetId], timestampBytes, amountBytes, feeBytes, - recipient.bytes.arr, - Deser.serializeArray(attachment)) + recipient.bytes.arr //, +// Deser.serializeArray(attachment) + ) } override val json: Coeval[JsObject] = Coeval.evalOnce(jsonBase() ++ Json.obj( "recipient" -> recipient.stringRepr, "assetId" -> assetId.map(_.base58), "amount" -> amount, - "feeAsset" -> feeAssetId.map(_.base58), - "attachment" -> Base58.encode(attachment) + "feeAsset" -> feeAssetId.map(_.base58)//, +// "attachment" -> Base58.encode(attachment) )) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(Bytes.concat(Array(transactionType.id.toByte), signature.arr, bodyBytes())) @@ -98,8 +98,8 @@ object TransferTransaction { (for { recRes <- AddressOrAlias.fromBytes(bytes, s1 + 24) (recipient, recipientEnd) = recRes - (attachment, _) = Deser.parseArraySize(bytes, recipientEnd) - tt <- TransferTransaction.create(assetIdOpt.map(ByteStr(_)), sender, recipient, amount, timestamp, feeAssetIdOpt.map(ByteStr(_)), feeAmount, attachment, signature) +// (attachment, _) = Deser.parseArraySize(bytes, recipientEnd) + tt <- TransferTransaction.create(assetIdOpt.map(ByteStr(_)), sender, recipient, amount, timestamp, feeAssetIdOpt.map(ByteStr(_)), feeAmount, /*attachment,*/ signature) } yield tt).fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten @@ -112,7 +112,6 @@ object TransferTransaction { * @param timestamp * @param feeAssetId * @param feeAmount - * @param attachment * @param signature * @return */ @@ -123,18 +122,19 @@ object TransferTransaction { timestamp: Long, feeAssetId: Option[AssetId], feeAmount: Long, - attachment: Array[Byte], +// attachment: Array[Byte], signature: ByteStr): Either[ValidationError, TransferTransaction] = { - if (attachment.length > TransferTransaction.MaxAttachmentSize) { - Left(ValidationError.TooBigArray) - } else if (amount <= 0) { +// if (attachment.length > TransferTransaction.MaxAttachmentSize) { +// Left(ValidationError.TooBigArray) +// } else + if (amount <= 0) { Left(ValidationError.NegativeAmount(amount, "lunes")) //CHECK IF AMOUNT IS POSITIVE } else if (Try(Math.addExact(amount, feeAmount)).isFailure) { Left(ValidationError.OverflowError) // CHECK THAT fee+amount won't overflow Long } else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(TransferTransaction(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, attachment, signature)) + Right(TransferTransaction(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, /*attachment,*/ signature)) } } @@ -147,7 +147,6 @@ object TransferTransaction { * @param timestamp * @param feeAssetId * @param feeAmount - * @param attachment * @return */ def create(assetId: Option[AssetId], @@ -156,9 +155,10 @@ object TransferTransaction { amount: Long, timestamp: Long, feeAssetId: Option[AssetId], - feeAmount: Long, - attachment: Array[Byte]): Either[ValidationError, TransferTransaction] = { - create(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, attachment, ByteStr.empty).right.map { unsigned => + feeAmount: Long//, +// attachment: Array[Byte] + ): Either[ValidationError, TransferTransaction] = { + create(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, /*attachment,*/ ByteStr.empty).right.map { unsigned => unsigned.copy(signature = ByteStr(crypto.sign(sender, unsigned.bodyBytes()))) } } diff --git a/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala b/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala index fb768d610..12399f395 100644 --- a/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala +++ b/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala @@ -108,7 +108,9 @@ case class AssetsBroadcastApiRoute(settings: RestAPISettings, paramType = "body", dataType = "scorex.api.http.assets.SignedTransferRequest", allowMultiple = true, - defaultValue = "[{\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n, {\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n}]" + defaultValue = "[{\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n, {\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n}]" +// Copy of original defaultValue with attachment parameter. + // defaultValue = "[{\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n, {\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n}]" ) )) def batchTransfer: Route = (path("batch-transfer") & post) { diff --git a/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala b/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala index 5f3213ea5..9a59ab395 100644 --- a/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala @@ -7,7 +7,7 @@ case class MassTransferRequest(assetId: Option[String], sender: String, transfers: List[Transfer], fee: Long, - attachment: Option[String], +// attachment: Option[String], timestamp: Option[Long] = None) object MassTransferRequest { diff --git a/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala b/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala index ed8cd999f..3da4c071c 100644 --- a/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala @@ -7,7 +7,7 @@ import play.api.libs.json._ import scorex.account.PublicKeyAccount import scorex.api.http.BroadcastRequest import io.lunes.transaction.assets.MassTransferTransaction.Transfer -import io.lunes.transaction.assets.{MassTransferTransaction, TransferTransaction} +import io.lunes.transaction.assets.MassTransferTransaction//, TransferTransaction} import io.lunes.transaction.{AssetIdStringLength, Proofs, ValidationError} object SignedMassTransferRequest { @@ -17,7 +17,7 @@ object SignedMassTransferRequest { (JsPath \ "transfers").read[List[Transfer]] and (JsPath \ "fee").read[Long] and (JsPath \ "timestamp").read[Long] and - (JsPath \ "attachment").readNullable[String] and +// (JsPath \ "attachment").readNullable[String] and (JsPath \ "proofs").read[List[String]].orElse((JsPath \ "signature").read[String].map(List(_))) )(SignedMassTransferRequest.apply _) @@ -35,8 +35,8 @@ case class SignedMassTransferRequest(@ApiModelProperty(value = "Base58 encoded s fee: Long, @ApiModelProperty(required = true) timestamp: Long, - @ApiModelProperty(value = "Base58 encoded attachment") - attachment: Option[String], +// @ApiModelProperty(value = "Base58 encoded attachment") +// attachment: Option[String], @ApiModelProperty(required = true) proofs: List[String]) extends BroadcastRequest { def toTx: Either[ValidationError, MassTransferTransaction] = for { @@ -44,8 +44,8 @@ case class SignedMassTransferRequest(@ApiModelProperty(value = "Base58 encoded s _assetId <- parseBase58ToOption(assetId.filter(_.length > 0), "invalid.assetId", AssetIdStringLength) _proofBytes <- proofs.traverse(s => parseBase58(s, "invalid proof", Proofs.MaxProofStringSize)) _proofs <- Proofs.create(_proofBytes) - _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) +// _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) _transfers <- MassTransferTransaction.parseTransfersList(transfers) - t <- MassTransferTransaction.create(Proofs.Version, _assetId, _sender, _transfers, timestamp, fee, _attachment.arr, _proofs) + t <- MassTransferTransaction.create(Proofs.Version, _assetId, _sender, _transfers, timestamp, fee, /* _attachment.arr, */ _proofs) } yield t } diff --git a/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala b/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala index 666d24261..df1089638 100644 --- a/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala @@ -18,7 +18,7 @@ object SignedTransferRequest { (JsPath \ "fee").read[Long] and (JsPath \ "feeAssetId").read[String].map(Option.apply).orElse((JsPath \ "feeAsset").readNullable[String]) and (JsPath \ "timestamp").read[Long] and - (JsPath \ "attachment").readNullable[String] and +// (JsPath \ "attachment").readNullable[String] and (JsPath \ "signature").read[String] )(SignedTransferRequest.apply _) @@ -42,8 +42,8 @@ case class SignedTransferRequest(@ApiModelProperty(value = "Base58 encoded sende feeAssetId: Option[String], @ApiModelProperty(required = true) timestamp: Long, - @ApiModelProperty(value = "Base58 encoded attachment") - attachment: Option[String], +// @ApiModelProperty(value = "Base58 encoded attachment") +// attachment: Option[String], @ApiModelProperty(required = true) signature: String) extends BroadcastRequest { def toTx: Either[ValidationError, TransferTransaction] = for { @@ -51,8 +51,8 @@ case class SignedTransferRequest(@ApiModelProperty(value = "Base58 encoded sende _assetId <- parseBase58ToOption(assetId.filter(_.length > 0), "invalid.assetId", AssetIdStringLength) _feeAssetId <- parseBase58ToOption(feeAssetId.filter(_.length > 0), "invalid.feeAssetId", AssetIdStringLength) _signature <- parseBase58(signature, "invalid.signature", SignatureStringLength) - _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) +// _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) _account <- AddressOrAlias.fromString(recipient) - t <- TransferTransaction.create(_assetId, _sender, _account, amount, timestamp, _feeAssetId, fee, _attachment.arr, _signature) + t <- TransferTransaction.create(_assetId, _sender, _account, amount, timestamp, _feeAssetId, fee, /*_attachment.arr, */ _signature) } yield t } diff --git a/src/main/scala/scorex/api/http/assets/TransferRequest.scala b/src/main/scala/scorex/api/http/assets/TransferRequest.scala index 0b3255e9b..aaf096d92 100644 --- a/src/main/scala/scorex/api/http/assets/TransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/TransferRequest.scala @@ -7,7 +7,7 @@ case class TransferRequest(assetId: Option[String], amount: Long, fee: Long, sender: String, - attachment: Option[String], +// attachment: Option[String], recipient: String, timestamp: Option[Long] = None) From 2218ff63fd573d20a1e6cecb235714b0b45e7c26 Mon Sep 17 00:00:00 2001 From: deabreu Date: Mon, 28 May 2018 12:05:54 -0300 Subject: [PATCH 2/5] Removal of attachment references and attachment comments. It is compilable. --- .../lunes/settings/BlockchainSettings.scala | 2 -- .../scala/io/lunes/state2/StateStorage.scala | 1 - .../transaction/TransactionFactory.scala | 6 ++--- .../assets/MassTransferTransaction.scala | 20 +++++------------ .../assets/TransferTransaction.scala | 22 +++++-------------- .../http/assets/AssetsBroadcastApiRoute.scala | 2 -- .../api/http/assets/MassTransferRequest.scala | 1 - .../assets/SignedMassTransferRequest.scala | 8 ++----- .../http/assets/SignedTransferRequest.scala | 6 +---- .../api/http/assets/TransferRequest.scala | 1 - 10 files changed, 17 insertions(+), 52 deletions(-) diff --git a/src/main/scala/io/lunes/settings/BlockchainSettings.scala b/src/main/scala/io/lunes/settings/BlockchainSettings.scala index 1b63b24d4..77f0df230 100644 --- a/src/main/scala/io/lunes/settings/BlockchainSettings.scala +++ b/src/main/scala/io/lunes/settings/BlockchainSettings.scala @@ -8,8 +8,6 @@ import net.ceedubs.ficus.readers.EnumerationReader._ import scala.concurrent.duration._ -//import io.lunes.features.BlockchainFeatures - /** * * @param featureCheckBlocksPeriod diff --git a/src/main/scala/io/lunes/state2/StateStorage.scala b/src/main/scala/io/lunes/state2/StateStorage.scala index 4f216a321..ddcc50d86 100644 --- a/src/main/scala/io/lunes/state2/StateStorage.scala +++ b/src/main/scala/io/lunes/state2/StateStorage.scala @@ -7,7 +7,6 @@ import io.lunes.db._ import io.lunes.utils._ import org.iq80.leveldb.{DB, WriteBatch} import scorex.account.{Address, Alias} -//import scorex.serialization.Deser import scorex.utils.{NTP, Time} import scala.util.Try diff --git a/src/main/scala/io/lunes/transaction/TransactionFactory.scala b/src/main/scala/io/lunes/transaction/TransactionFactory.scala index 1a38e000c..a2a9c7b3a 100644 --- a/src/main/scala/io/lunes/transaction/TransactionFactory.scala +++ b/src/main/scala/io/lunes/transaction/TransactionFactory.scala @@ -56,8 +56,7 @@ object TransactionFactory { request.amount, request.timestamp.getOrElse(time.getTimestamp()), request.feeAssetId.map(s => ByteStr.decodeBase58(s).get), - request.fee)//, -// request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) + request.fee) } yield tx /** @@ -77,8 +76,7 @@ object TransactionFactory { senderPrivateKey, transfers, request.timestamp.getOrElse(time.getTimestamp()), - request.fee)//, -// request.attachment.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) + request.fee) } yield tx /** diff --git a/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala b/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala index 6bb94abf3..84ce214b6 100644 --- a/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/MassTransferTransaction.scala @@ -7,7 +7,6 @@ import io.lunes.state2._ import monix.eval.Coeval import play.api.libs.json.{Format, JsObject, JsValue, Json} import scorex.account.{AddressOrAlias, PrivateKeyAccount, PublicKeyAccount} -//import scorex.crypto.encode.Base58 import scorex.serialization.Deser import io.lunes.transaction.TransactionParser._ import io.lunes.transaction.ValidationError.Validation @@ -32,7 +31,6 @@ case class MassTransferTransaction private(version: Byte, transfers: List[ParsedTransfer], timestamp: Long, fee: Long, -// attachment: Array[Byte], proofs: Proofs) extends ProvenTransaction with FastHashId { override val transactionType: TransactionType.Value = TransactionType.MassTransferTransaction @@ -52,14 +50,12 @@ case class MassTransferTransaction private(version: Byte, Shorts.toByteArray(transfers.size.toShort), transferBytes, Longs.toByteArray(timestamp), - Longs.toByteArray(fee))//, -// Deser.serializeArray(attachment)) + Longs.toByteArray(fee)) } override def jsonBase(): JsObject = super.jsonBase() ++ Json.obj( "version" -> version, "assetId" -> assetId.map(_.base58), -// "attachment" -> Base58.encode(attachment), "transferCount" -> transfers.size, "totalAmount" -> transfers.map(_.amount).sum) @@ -124,9 +120,9 @@ object MassTransferTransaction { transfers <- transfersList.map { case (ei, _) => ei }.sequence timestamp = Longs.fromByteArray(bytes.slice(s1, s1 + 8)) feeAmount = Longs.fromByteArray(bytes.slice(s1 + 8, s1 + 16)) - (attachment, attachEnd) = Deser.parseArraySize(bytes, s1 + 16) // attachment kept only as ignorable variable. + (attachment, attachEnd) = Deser.parseArraySize(bytes, s1 + 16) proofs <- Proofs.fromBytes(bytes.drop(attachEnd)) - mtt <- MassTransferTransaction.create(version, assetIdOpt.map(ByteStr(_)), sender, transfers, timestamp, feeAmount, /*attachment,*/ proofs) + mtt <- MassTransferTransaction.create(version, assetIdOpt.map(ByteStr(_)), sender, transfers, timestamp, feeAmount, proofs) } yield mtt tx.fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten @@ -147,7 +143,6 @@ object MassTransferTransaction { transfers: List[ParsedTransfer], timestamp: Long, feeAmount: Long, -// attachment: Array[Byte], proofs: Proofs): Either[ValidationError, MassTransferTransaction] = { Try { transfers.map(_.amount).fold(feeAmount)(Math.addExact) @@ -158,12 +153,10 @@ object MassTransferTransaction { Left(ValidationError.GenericError(s"Number of transfers is greater than $MaxTransferCount")) } else if (transfers.exists(_.amount < 0)) { Left(ValidationError.GenericError("One of the transfers has negative amount")) -// } else if (attachment.length > TransferTransaction.MaxAttachmentSize) { -// Left(ValidationError.TooBigArray) } else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(MassTransferTransaction(version, assetId, sender, transfers, timestamp, feeAmount, /*attachment,*/ proofs)) + Right(MassTransferTransaction(version, assetId, sender, transfers, timestamp, feeAmount, proofs)) } ) } @@ -183,10 +176,9 @@ object MassTransferTransaction { sender: PrivateKeyAccount, transfers: List[ParsedTransfer], timestamp: Long, - feeAmount: Long//, -// attachment: Array[Byte] + feeAmount: Long ): Either[ValidationError, MassTransferTransaction] = { - create(version, assetId, sender, transfers, timestamp, feeAmount, /*attachment,*/ Proofs.empty).right.map { unsigned => + create(version, assetId, sender, transfers, timestamp, feeAmount, Proofs.empty).right.map { unsigned => unsigned.copy(proofs = Proofs.create(Seq(ByteStr(crypto.sign(sender, unsigned.bodyBytes())))).explicitGet()) } } diff --git a/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala b/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala index c9d014f2e..bb716d9e6 100755 --- a/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/TransferTransaction.scala @@ -7,7 +7,6 @@ import io.lunes.utils.base58Length import monix.eval.Coeval import play.api.libs.json.{JsObject, Json} import scorex.account.{AddressOrAlias, PrivateKeyAccount, PublicKeyAccount} -import scorex.crypto.encode.Base58 import scorex.serialization.Deser import io.lunes.transaction.TransactionParser._ import io.lunes.transaction.{ValidationError, _} @@ -32,7 +31,6 @@ case class TransferTransaction private(assetId: Option[AssetId], timestamp: Long, feeAssetId: Option[AssetId], fee: Long, -// attachment: Array[Byte], signature: ByteStr) extends SignedTransaction with FastHashId { override val transactionType: TransactionType.Value = TransactionType.TransferTransaction @@ -53,8 +51,7 @@ case class TransferTransaction private(assetId: Option[AssetId], timestampBytes, amountBytes, feeBytes, - recipient.bytes.arr //, -// Deser.serializeArray(attachment) + recipient.bytes.arr ) } @@ -62,8 +59,7 @@ case class TransferTransaction private(assetId: Option[AssetId], "recipient" -> recipient.stringRepr, "assetId" -> assetId.map(_.base58), "amount" -> amount, - "feeAsset" -> feeAssetId.map(_.base58)//, -// "attachment" -> Base58.encode(attachment) + "feeAsset" -> feeAssetId.map(_.base58) )) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(Bytes.concat(Array(transactionType.id.toByte), signature.arr, bodyBytes())) @@ -98,8 +94,7 @@ object TransferTransaction { (for { recRes <- AddressOrAlias.fromBytes(bytes, s1 + 24) (recipient, recipientEnd) = recRes -// (attachment, _) = Deser.parseArraySize(bytes, recipientEnd) - tt <- TransferTransaction.create(assetIdOpt.map(ByteStr(_)), sender, recipient, amount, timestamp, feeAssetIdOpt.map(ByteStr(_)), feeAmount, /*attachment,*/ signature) + tt <- TransferTransaction.create(assetIdOpt.map(ByteStr(_)), sender, recipient, amount, timestamp, feeAssetIdOpt.map(ByteStr(_)), feeAmount, signature) } yield tt).fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten @@ -122,11 +117,7 @@ object TransferTransaction { timestamp: Long, feeAssetId: Option[AssetId], feeAmount: Long, -// attachment: Array[Byte], signature: ByteStr): Either[ValidationError, TransferTransaction] = { -// if (attachment.length > TransferTransaction.MaxAttachmentSize) { -// Left(ValidationError.TooBigArray) -// } else if (amount <= 0) { Left(ValidationError.NegativeAmount(amount, "lunes")) //CHECK IF AMOUNT IS POSITIVE } else if (Try(Math.addExact(amount, feeAmount)).isFailure) { @@ -134,7 +125,7 @@ object TransferTransaction { } else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(TransferTransaction(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, /*attachment,*/ signature)) + Right(TransferTransaction(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, signature)) } } @@ -155,10 +146,9 @@ object TransferTransaction { amount: Long, timestamp: Long, feeAssetId: Option[AssetId], - feeAmount: Long//, -// attachment: Array[Byte] + feeAmount: Long ): Either[ValidationError, TransferTransaction] = { - create(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, /*attachment,*/ ByteStr.empty).right.map { unsigned => + create(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, ByteStr.empty).right.map { unsigned => unsigned.copy(signature = ByteStr(crypto.sign(sender, unsigned.bodyBytes()))) } } diff --git a/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala b/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala index 12399f395..67425cf75 100644 --- a/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala +++ b/src/main/scala/scorex/api/http/assets/AssetsBroadcastApiRoute.scala @@ -109,8 +109,6 @@ case class AssetsBroadcastApiRoute(settings: RestAPISettings, dataType = "scorex.api.http.assets.SignedTransferRequest", allowMultiple = true, defaultValue = "[{\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n, {\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n}]" -// Copy of original defaultValue with attachment parameter. - // defaultValue = "[{\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n, {\n \"assetId\": \"E9yZC4cVhCDfbjFJCc9CqkAtkoFy5KaCe64iaxHM2adG\",\n \"senderPublicKey\": \"CRxqEuxhdZBEHX42MU4FfyJxuHmbDBTaHMhM3Uki7pLw\",\n \"recipient\": \"3Mx2afTZ2KbRrLNbytyzTtXukZvqEB8SkW7\",\n \"fee\": 100000,\n \"amount\": 5500000000,\n \"attachment\": \"BJa6cfyGUmzBFTj3vvvaew\",\n \"timestamp\": 1479222433704, \n \"signature\": \"2TyN8pNS7mS9gfCbX2ktpkWVYckoAmRmDZzKH3K35DKs6sUoXHArzukV5hvveK9t79uzT3cA8CYZ9z3Utj6CnCEo\"\n}]" ) )) def batchTransfer: Route = (path("batch-transfer") & post) { diff --git a/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala b/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala index 9a59ab395..8e1c0c0ef 100644 --- a/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/MassTransferRequest.scala @@ -7,7 +7,6 @@ case class MassTransferRequest(assetId: Option[String], sender: String, transfers: List[Transfer], fee: Long, -// attachment: Option[String], timestamp: Option[Long] = None) object MassTransferRequest { diff --git a/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala b/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala index 3da4c071c..cce841e9a 100644 --- a/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedMassTransferRequest.scala @@ -7,7 +7,7 @@ import play.api.libs.json._ import scorex.account.PublicKeyAccount import scorex.api.http.BroadcastRequest import io.lunes.transaction.assets.MassTransferTransaction.Transfer -import io.lunes.transaction.assets.MassTransferTransaction//, TransferTransaction} +import io.lunes.transaction.assets.MassTransferTransaction import io.lunes.transaction.{AssetIdStringLength, Proofs, ValidationError} object SignedMassTransferRequest { @@ -17,7 +17,6 @@ object SignedMassTransferRequest { (JsPath \ "transfers").read[List[Transfer]] and (JsPath \ "fee").read[Long] and (JsPath \ "timestamp").read[Long] and -// (JsPath \ "attachment").readNullable[String] and (JsPath \ "proofs").read[List[String]].orElse((JsPath \ "signature").read[String].map(List(_))) )(SignedMassTransferRequest.apply _) @@ -35,8 +34,6 @@ case class SignedMassTransferRequest(@ApiModelProperty(value = "Base58 encoded s fee: Long, @ApiModelProperty(required = true) timestamp: Long, -// @ApiModelProperty(value = "Base58 encoded attachment") -// attachment: Option[String], @ApiModelProperty(required = true) proofs: List[String]) extends BroadcastRequest { def toTx: Either[ValidationError, MassTransferTransaction] = for { @@ -44,8 +41,7 @@ case class SignedMassTransferRequest(@ApiModelProperty(value = "Base58 encoded s _assetId <- parseBase58ToOption(assetId.filter(_.length > 0), "invalid.assetId", AssetIdStringLength) _proofBytes <- proofs.traverse(s => parseBase58(s, "invalid proof", Proofs.MaxProofStringSize)) _proofs <- Proofs.create(_proofBytes) -// _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) _transfers <- MassTransferTransaction.parseTransfersList(transfers) - t <- MassTransferTransaction.create(Proofs.Version, _assetId, _sender, _transfers, timestamp, fee, /* _attachment.arr, */ _proofs) + t <- MassTransferTransaction.create(Proofs.Version, _assetId, _sender, _transfers, timestamp, fee, _proofs) } yield t } diff --git a/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala b/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala index df1089638..56e5549e3 100644 --- a/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedTransferRequest.scala @@ -18,7 +18,6 @@ object SignedTransferRequest { (JsPath \ "fee").read[Long] and (JsPath \ "feeAssetId").read[String].map(Option.apply).orElse((JsPath \ "feeAsset").readNullable[String]) and (JsPath \ "timestamp").read[Long] and -// (JsPath \ "attachment").readNullable[String] and (JsPath \ "signature").read[String] )(SignedTransferRequest.apply _) @@ -42,8 +41,6 @@ case class SignedTransferRequest(@ApiModelProperty(value = "Base58 encoded sende feeAssetId: Option[String], @ApiModelProperty(required = true) timestamp: Long, -// @ApiModelProperty(value = "Base58 encoded attachment") -// attachment: Option[String], @ApiModelProperty(required = true) signature: String) extends BroadcastRequest { def toTx: Either[ValidationError, TransferTransaction] = for { @@ -51,8 +48,7 @@ case class SignedTransferRequest(@ApiModelProperty(value = "Base58 encoded sende _assetId <- parseBase58ToOption(assetId.filter(_.length > 0), "invalid.assetId", AssetIdStringLength) _feeAssetId <- parseBase58ToOption(feeAssetId.filter(_.length > 0), "invalid.feeAssetId", AssetIdStringLength) _signature <- parseBase58(signature, "invalid.signature", SignatureStringLength) -// _attachment <- parseBase58(attachment.filter(_.length > 0), "invalid.attachment", TransferTransaction.MaxAttachmentStringSize) _account <- AddressOrAlias.fromString(recipient) - t <- TransferTransaction.create(_assetId, _sender, _account, amount, timestamp, _feeAssetId, fee, /*_attachment.arr, */ _signature) + t <- TransferTransaction.create(_assetId, _sender, _account, amount, timestamp, _feeAssetId, fee, _signature) } yield t } diff --git a/src/main/scala/scorex/api/http/assets/TransferRequest.scala b/src/main/scala/scorex/api/http/assets/TransferRequest.scala index aaf096d92..e5e40b7a3 100644 --- a/src/main/scala/scorex/api/http/assets/TransferRequest.scala +++ b/src/main/scala/scorex/api/http/assets/TransferRequest.scala @@ -7,7 +7,6 @@ case class TransferRequest(assetId: Option[String], amount: Long, fee: Long, sender: String, -// attachment: Option[String], recipient: String, timestamp: Option[Long] = None) From 7160e8b294ad512cb354a0ba0d3109c43789a4b9 Mon Sep 17 00:00:00 2001 From: deabreu Date: Mon, 28 May 2018 15:04:15 -0300 Subject: [PATCH 3/5] Removal of references for assetId and feeAssetId, and fixed recipient and amount for RegistryTransaction. It is compilable. --- .../lunes/state2/diffs/CommonValidation.scala | 2 +- .../diffs/RegistryTransactionDiff.scala | 29 +------ .../transaction/TransactionFactory.scala | 10 +-- .../assets/RegistryTransaction.scala | 76 ++++++++++--------- .../http/assets/SignedRegistryRequest.scala | 2 +- 5 files changed, 50 insertions(+), 69 deletions(-) diff --git a/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala b/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala index 71be36f23..5da027af1 100644 --- a/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala +++ b/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala @@ -55,7 +55,7 @@ object CommonValidation { Left(GenericError(s"Attempt to pay unavailable funds: balance " + s"${s.partialPortfolio(ptx.sender).balance} is less than ${ptx.amount + ptx.fee}")) case ttx: TransferTransaction => checkTransfer(ttx.sender, ttx.assetId, ttx.amount, ttx.feeAssetId, ttx.fee) - case rdtx: RegistryTransaction => checkTransfer(rdtx.sender, rdtx.assetId, rdtx.amount, rdtx.feeAssetId, rdtx.fee) + case rdtx: RegistryTransaction => checkTransfer(rdtx.sender, /*rdtx.assetId*/ None, rdtx.amount, /*rdtx.feeAssetId*/ None, rdtx.fee) case mtx: MassTransferTransaction => checkTransfer(mtx.sender, mtx.assetId, mtx.transfers.map(_.amount).sum, None, mtx.fee) case _ => Right(tx) } diff --git a/src/main/scala/io/lunes/state2/diffs/RegistryTransactionDiff.scala b/src/main/scala/io/lunes/state2/diffs/RegistryTransactionDiff.scala index 90d060736..bf45e1a6e 100644 --- a/src/main/scala/io/lunes/state2/diffs/RegistryTransactionDiff.scala +++ b/src/main/scala/io/lunes/state2/diffs/RegistryTransactionDiff.scala @@ -20,31 +20,10 @@ object RegistryTransactionDiff { val isInvalidEi = for { recipient <- state.resolveAliasEi(tx.recipient) - portfolios = ( - tx.assetId match { - case None => Map(sender -> Portfolio(-tx.amount, LeaseInfo.empty, Map.empty)).combine( - Map(recipient -> Portfolio(tx.amount, LeaseInfo.empty, Map.empty)) - ) - case Some(aid) => - Map(sender -> Portfolio(0, LeaseInfo.empty, Map(aid -> -tx.amount))).combine( - Map(recipient -> Portfolio(0, LeaseInfo.empty, Map(aid -> tx.amount))) - ) - }).combine( - tx.feeAssetId match { - case None => Map(sender -> Portfolio(-tx.fee, LeaseInfo.empty, Map.empty)) - case Some(aid) => - Map(sender -> Portfolio(0, LeaseInfo.empty, Map(aid -> -tx.fee))) - } - ) - assetIssued = tx.assetId match { - case None => true - case Some(aid) => state.assetInfo(aid).isDefined - } - feeAssetIssued = tx.feeAssetId match { - case None => true - case Some(aid) => state.assetInfo(aid).isDefined - } - } yield (portfolios, blockTime > s.allowUnissuedAssetsUntil && !(assetIssued && feeAssetIssued)) + portfolios = Map(sender -> Portfolio(-tx.amount, LeaseInfo.empty, Map.empty)).combine( Map(recipient -> Portfolio(tx.amount, LeaseInfo.empty, Map.empty))).combine( Map(sender -> Portfolio(-tx.fee, LeaseInfo.empty, Map.empty))) + assetIssued = true + feeAssetIssued = true + } yield (portfolios, (blockTime > s.allowUnissuedAssetsUntil && !(assetIssued && feeAssetIssued))) isInvalidEi match { case Left(e) => Left(e) diff --git a/src/main/scala/io/lunes/transaction/TransactionFactory.scala b/src/main/scala/io/lunes/transaction/TransactionFactory.scala index a2a9c7b3a..7e15ec990 100644 --- a/src/main/scala/io/lunes/transaction/TransactionFactory.scala +++ b/src/main/scala/io/lunes/transaction/TransactionFactory.scala @@ -27,13 +27,13 @@ object TransactionFactory { for { senderPrivateKey <- wallet.findWallet(request.sender) recipientAcc <- AddressOrAlias.fromString(request.recipient) - tx <- RegistryTransaction - .create(request.assetId.map(s => ByteStr.decodeBase58(s).get), + tx <- RegistryTransaction.create( + // request.assetId.map(s => ByteStr.decodeBase58(s).get), senderPrivateKey, - recipientAcc, - request.amount, +// recipientAcc, +// request.amount, request.timestamp.getOrElse(time.getTimestamp()), - request.feeAssetId.map(s => ByteStr.decodeBase58(s).get), +// request.feeAssetId.map(s => ByteStr.decodeBase58(s).get), request.fee, request.userdata.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) } yield tx diff --git a/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala b/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala index 504c126f4..0291051a7 100644 --- a/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala @@ -16,41 +16,41 @@ import scala.util.{Failure, Success, Try} /** * - * @param assetId * @param sender - * @param recipient - * @param amount * @param timestamp - * @param feeAssetId * @param fee * @param userdata * @param signature */ -case class RegistryTransaction private(assetId: Option[AssetId], +case class RegistryTransaction private( +// assetId: Option[AssetId], sender: PublicKeyAccount, - recipient: AddressOrAlias, - amount: Long, +// recipient: AddressOrAlias, +// amount: Long, timestamp: Long, - feeAssetId: Option[AssetId], +// feeAssetId: Option[AssetId], fee: Long, userdata: Array[Byte], signature: ByteStr) extends SignedTransaction with FastHashId { + + val recipient : AddressOrAlias = (AddressOrAlias.fromString("lunes")).toOption.get + val amount:Long = 1000000000 // 10 lunes override val transactionType: TransactionType.Value = TransactionType.RegistryTransaction - override val assetFee: (Option[AssetId], Long) = (feeAssetId, fee) + override val assetFee: (Option[AssetId], Long) = (None, fee) val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce { val timestampBytes = Longs.toByteArray(timestamp) - val assetIdBytes = assetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) +// val assetIdBytes = assetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) val amountBytes = Longs.toByteArray(amount) - val feeAssetIdBytes = feeAssetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) +// val feeAssetIdBytes = feeAssetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) val feeBytes = Longs.toByteArray(fee) Bytes.concat(Array(transactionType.id.toByte), sender.publicKey, - assetIdBytes, - feeAssetIdBytes, +// assetIdBytes, +// feeAssetIdBytes, timestampBytes, amountBytes, feeBytes, @@ -59,10 +59,10 @@ case class RegistryTransaction private(assetId: Option[AssetId], } override val json: Coeval[JsObject] = Coeval.evalOnce(jsonBase() ++ Json.obj( - "recipient" -> recipient.stringRepr, - "assetId" -> assetId.map(_.base58), - "amount" -> amount, - "feeAsset" -> feeAssetId.map(_.base58), + "recipient" -> recipient.stringRepr, // remover? +// "assetId" -> assetId.map(_.base58), + "amount" -> amount, // remover? +// "feeAsset" -> feeAssetId.map(_.base58), "userdata" -> Base58.encode(userdata) )) @@ -92,49 +92,50 @@ object RegistryTransaction { val (assetIdOpt, s0) = Deser.parseByteArrayOption(bytes, SignatureLength + KeyLength + 1, AssetIdLength) val (feeAssetIdOpt, s1) = Deser.parseByteArrayOption(bytes, s0, AssetIdLength) val timestamp = Longs.fromByteArray(bytes.slice(s1, s1 + 8)) - val amount = Longs.fromByteArray(bytes.slice(s1 + 8, s1 + 16)) +// val amount = Longs.fromByteArray(bytes.slice(s1 + 8, s1 + 16)) //TODO: Check if there is some impact of removing ammount from input serial data val feeAmount = Longs.fromByteArray(bytes.slice(s1 + 16, s1 + 24)) (for { recRes <- AddressOrAlias.fromBytes(bytes, s1 + 24) (recipient, recipientEnd) = recRes (userdata, _) = Deser.parseArraySize(bytes, recipientEnd) - tt <- RegistryTransaction.create(assetIdOpt.map(ByteStr(_)), sender, recipient, amount, timestamp, feeAssetIdOpt.map(ByteStr(_)), feeAmount, userdata, signature) + tt <- RegistryTransaction.create(/*assetIdOpt.map(ByteStr(_)),*/ sender, /*recipient, amount,*/ timestamp, /*feeAssetIdOpt.map(ByteStr(_)),*/ feeAmount, userdata, signature) } yield tt).fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten /** * - * @param assetId * @param sender - * @param recipient - * @param amount * @param timestamp - * @param feeAssetId * @param feeAmount * @param userdata * @param signature * @return */ - def create(assetId: Option[AssetId], + def create( +// assetId: Option[AssetId], sender: PublicKeyAccount, - recipient: AddressOrAlias, - amount: Long, +// recipient: AddressOrAlias, +// amount: Long, timestamp: Long, - feeAssetId: Option[AssetId], +// feeAssetId: Option[AssetId], feeAmount: Long, userdata: Array[Byte], signature: ByteStr): Either[ValidationError, RegistryTransaction] = { + val amount:Long = 1000000000 // 10 lunes if (userdata.length > RegistryTransaction.MaxUserdata) { Left(ValidationError.TooBigArray) - } else if (amount <= 0) { - Left(ValidationError.NegativeAmount(amount, "lunes")) //CHECK IF AMOUNT IS POSITIVE - } else if (Try(Math.addExact(amount, feeAmount)).isFailure) { + } +// else if (amount <= 0) { +// Left(ValidationError.NegativeAmount(amount, "lunes")) //CHECK IF AMOUNT IS POSITIVE +// } + else if (Try(Math.addExact(amount, feeAmount)).isFailure) { Left(ValidationError.OverflowError) // CHECK THAT fee+amount won't overflow Long - } else if (feeAmount <= 0) { + } + else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(RegistryTransaction(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, userdata, signature)) + Right(RegistryTransaction(/*assetId, */sender, /*recipient, amount, */timestamp, /*feeAssetId, */ feeAmount, userdata, signature)) } } @@ -150,15 +151,16 @@ object RegistryTransaction { * @param userdata * @return */ - def create(assetId: Option[AssetId], + def create( +// assetId: Option[AssetId], sender: PrivateKeyAccount, - recipient: AddressOrAlias, - amount: Long, +// recipient: AddressOrAlias, +// amount: Long, timestamp: Long, - feeAssetId: Option[AssetId], +// feeAssetId: Option[AssetId], feeAmount: Long, userdata: Array[Byte]): Either[ValidationError, RegistryTransaction] = { - create(assetId, sender, recipient, amount, timestamp, feeAssetId, feeAmount, userdata, ByteStr.empty).right.map { unsigned => + create(/*assetId,*/ sender, /*recipient, amount,*/ timestamp, /*feeAssetId, */feeAmount, userdata, ByteStr.empty).right.map { unsigned => unsigned.copy(signature = ByteStr(crypto.sign(sender, unsigned.bodyBytes()))) } } diff --git a/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala b/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala index 771ec4c05..5c96bd4e8 100644 --- a/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala @@ -34,6 +34,6 @@ case class SignedRegistryRequest(@ApiModelProperty(value = "Base58 encoded sende _signature <- parseBase58(signature, "invalid.signature", SignatureStringLength) _userdata <- parseBase58(userdata.filter(_.length > 0), "invalid.userdata", RegistryTransaction.MaxUserdataLength) _account <- AddressOrAlias.fromString(recipient) - t <- RegistryTransaction.create(_assetId, _sender, _account, amount, timestamp, _feeAssetId, fee, _userdata.arr, _signature) + t <- RegistryTransaction.create(/*_assetId,*/ _sender,/* _account, amount, */timestamp, /*_feeAssetId,*/ fee, _userdata.arr, _signature) } yield t } From 012a2fa94abd523b39b9ffa3ef2da19a3401b5fe Mon Sep 17 00:00:00 2001 From: deabreu Date: Tue, 29 May 2018 22:43:50 -0300 Subject: [PATCH 4/5] Removal of references for assetId and feeAssetId, and fixed recipient and amount for RegistryTransaction. It is compilable. --- .../lunes/state2/diffs/CommonValidation.scala | 2 +- .../transaction/TransactionFactory.scala | 7 +--- .../assets/RegistryTransaction.scala | 36 +++---------------- .../http/assets/SignedRegistryRequest.scala | 2 +- 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala b/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala index 5da027af1..3bd3af8b8 100644 --- a/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala +++ b/src/main/scala/io/lunes/state2/diffs/CommonValidation.scala @@ -55,7 +55,7 @@ object CommonValidation { Left(GenericError(s"Attempt to pay unavailable funds: balance " + s"${s.partialPortfolio(ptx.sender).balance} is less than ${ptx.amount + ptx.fee}")) case ttx: TransferTransaction => checkTransfer(ttx.sender, ttx.assetId, ttx.amount, ttx.feeAssetId, ttx.fee) - case rdtx: RegistryTransaction => checkTransfer(rdtx.sender, /*rdtx.assetId*/ None, rdtx.amount, /*rdtx.feeAssetId*/ None, rdtx.fee) + case rdtx: RegistryTransaction => checkTransfer(rdtx.sender, None, rdtx.amount, None, rdtx.fee) case mtx: MassTransferTransaction => checkTransfer(mtx.sender, mtx.assetId, mtx.transfers.map(_.amount).sum, None, mtx.fee) case _ => Right(tx) } diff --git a/src/main/scala/io/lunes/transaction/TransactionFactory.scala b/src/main/scala/io/lunes/transaction/TransactionFactory.scala index 7e15ec990..6808cded5 100644 --- a/src/main/scala/io/lunes/transaction/TransactionFactory.scala +++ b/src/main/scala/io/lunes/transaction/TransactionFactory.scala @@ -27,13 +27,8 @@ object TransactionFactory { for { senderPrivateKey <- wallet.findWallet(request.sender) recipientAcc <- AddressOrAlias.fromString(request.recipient) - tx <- RegistryTransaction.create( - // request.assetId.map(s => ByteStr.decodeBase58(s).get), - senderPrivateKey, -// recipientAcc, -// request.amount, + tx <- RegistryTransaction.create( senderPrivateKey, request.timestamp.getOrElse(time.getTimestamp()), -// request.feeAssetId.map(s => ByteStr.decodeBase58(s).get), request.fee, request.userdata.filter(_.nonEmpty).map(Base58.decode(_).get).getOrElse(Array.emptyByteArray)) } yield tx diff --git a/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala b/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala index 0291051a7..12382033d 100644 --- a/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala +++ b/src/main/scala/io/lunes/transaction/assets/RegistryTransaction.scala @@ -23,12 +23,8 @@ import scala.util.{Failure, Success, Try} * @param signature */ case class RegistryTransaction private( -// assetId: Option[AssetId], sender: PublicKeyAccount, -// recipient: AddressOrAlias, -// amount: Long, timestamp: Long, -// feeAssetId: Option[AssetId], fee: Long, userdata: Array[Byte], signature: ByteStr) @@ -42,15 +38,11 @@ case class RegistryTransaction private( val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce { val timestampBytes = Longs.toByteArray(timestamp) -// val assetIdBytes = assetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) val amountBytes = Longs.toByteArray(amount) -// val feeAssetIdBytes = feeAssetId.map(a => (1: Byte) +: a.arr).getOrElse(Array(0: Byte)) val feeBytes = Longs.toByteArray(fee) Bytes.concat(Array(transactionType.id.toByte), sender.publicKey, -// assetIdBytes, -// feeAssetIdBytes, timestampBytes, amountBytes, feeBytes, @@ -59,10 +51,8 @@ case class RegistryTransaction private( } override val json: Coeval[JsObject] = Coeval.evalOnce(jsonBase() ++ Json.obj( - "recipient" -> recipient.stringRepr, // remover? -// "assetId" -> assetId.map(_.base58), - "amount" -> amount, // remover? -// "feeAsset" -> feeAssetId.map(_.base58), + "recipient" -> recipient.stringRepr, + "amount" -> amount, "userdata" -> Base58.encode(userdata) )) @@ -92,14 +82,13 @@ object RegistryTransaction { val (assetIdOpt, s0) = Deser.parseByteArrayOption(bytes, SignatureLength + KeyLength + 1, AssetIdLength) val (feeAssetIdOpt, s1) = Deser.parseByteArrayOption(bytes, s0, AssetIdLength) val timestamp = Longs.fromByteArray(bytes.slice(s1, s1 + 8)) -// val amount = Longs.fromByteArray(bytes.slice(s1 + 8, s1 + 16)) //TODO: Check if there is some impact of removing ammount from input serial data val feeAmount = Longs.fromByteArray(bytes.slice(s1 + 16, s1 + 24)) (for { recRes <- AddressOrAlias.fromBytes(bytes, s1 + 24) (recipient, recipientEnd) = recRes (userdata, _) = Deser.parseArraySize(bytes, recipientEnd) - tt <- RegistryTransaction.create(/*assetIdOpt.map(ByteStr(_)),*/ sender, /*recipient, amount,*/ timestamp, /*feeAssetIdOpt.map(ByteStr(_)),*/ feeAmount, userdata, signature) + tt <- RegistryTransaction.create( sender, timestamp, feeAmount, userdata, signature) } yield tt).fold(left => Failure(new Exception(left.toString)), right => Success(right)) }.flatten @@ -113,12 +102,8 @@ object RegistryTransaction { * @return */ def create( -// assetId: Option[AssetId], sender: PublicKeyAccount, -// recipient: AddressOrAlias, -// amount: Long, timestamp: Long, -// feeAssetId: Option[AssetId], feeAmount: Long, userdata: Array[Byte], signature: ByteStr): Either[ValidationError, RegistryTransaction] = { @@ -126,41 +111,30 @@ object RegistryTransaction { if (userdata.length > RegistryTransaction.MaxUserdata) { Left(ValidationError.TooBigArray) } -// else if (amount <= 0) { -// Left(ValidationError.NegativeAmount(amount, "lunes")) //CHECK IF AMOUNT IS POSITIVE -// } else if (Try(Math.addExact(amount, feeAmount)).isFailure) { Left(ValidationError.OverflowError) // CHECK THAT fee+amount won't overflow Long } else if (feeAmount <= 0) { Left(ValidationError.InsufficientFee) } else { - Right(RegistryTransaction(/*assetId, */sender, /*recipient, amount, */timestamp, /*feeAssetId, */ feeAmount, userdata, signature)) + Right(RegistryTransaction(sender, timestamp, feeAmount, userdata, signature)) } } /** * - * @param assetId * @param sender - * @param recipient - * @param amount * @param timestamp - * @param feeAssetId * @param feeAmount * @param userdata * @return */ def create( -// assetId: Option[AssetId], sender: PrivateKeyAccount, -// recipient: AddressOrAlias, -// amount: Long, timestamp: Long, -// feeAssetId: Option[AssetId], feeAmount: Long, userdata: Array[Byte]): Either[ValidationError, RegistryTransaction] = { - create(/*assetId,*/ sender, /*recipient, amount,*/ timestamp, /*feeAssetId, */feeAmount, userdata, ByteStr.empty).right.map { unsigned => + create(sender, timestamp, feeAmount, userdata, ByteStr.empty).right.map { unsigned => unsigned.copy(signature = ByteStr(crypto.sign(sender, unsigned.bodyBytes()))) } } diff --git a/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala b/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala index 5c96bd4e8..dc0712f35 100644 --- a/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala +++ b/src/main/scala/scorex/api/http/assets/SignedRegistryRequest.scala @@ -34,6 +34,6 @@ case class SignedRegistryRequest(@ApiModelProperty(value = "Base58 encoded sende _signature <- parseBase58(signature, "invalid.signature", SignatureStringLength) _userdata <- parseBase58(userdata.filter(_.length > 0), "invalid.userdata", RegistryTransaction.MaxUserdataLength) _account <- AddressOrAlias.fromString(recipient) - t <- RegistryTransaction.create(/*_assetId,*/ _sender,/* _account, amount, */timestamp, /*_feeAssetId,*/ fee, _userdata.arr, _signature) + t <- RegistryTransaction.create(_sender, timestamp, fee, _userdata.arr, _signature) } yield t } From eb14465fd9a65b774e5850a2fcb30168401d4939 Mon Sep 17 00:00:00 2001 From: Marcos Lima Date: Tue, 5 Jun 2018 02:20:12 +0000 Subject: [PATCH 5/5] Mainnet --- build.sbt | 2 +- lunes.conf | 48 +++++-------------- .../io/lunes/features/BlockchainFeature.scala | 2 +- .../lunes/settings/BlockchainSettings.scala | 2 +- .../scala/io/lunes/settings/Constants.scala | 31 ++++++------ .../scala/io/lunes/transaction/Verifier.scala | 16 ++++++- 6 files changed, 42 insertions(+), 59 deletions(-) diff --git a/build.sbt b/build.sbt index 74b96e870..c87d56dad 100644 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ import sbtcrossproject.CrossPlugin.autoImport.crossProject enablePlugins(GitVersioning) git.useGitDescribe := true -git.baseVersion := "0.0.4" +git.baseVersion := "0.0.5" name := "LunesNode" mainClass in Compile := Some("io.lunes.LunesNode") diff --git a/lunes.conf b/lunes.conf index acbe232f5..a22d74063 100644 --- a/lunes.conf +++ b/lunes.conf @@ -1,62 +1,36 @@ -# Lunes node settings lunes { directory = "LUNES" blockchain.type = MAINNET network { - known-peers = ["35.190.160.211:5550"] - - # Network address + known-peers = ["52.6.200.147:7770", "54.164.234.204:7770"] + # declared-address = "127.0.0.1:7770" bind-address = "0.0.0.0" - - # Port number - port = 5550 + port = 7770 } - # Wallet settings wallet { - # Password to protect wallet file - password = "LunesNode" - - # Wallet seed as BASE58 string - # seed = "" + password = "LocalPasswordWallet" + seed = "" } - - - # Node's REST API settings rest-api { - # Enable/disable node's REST API enable = yes - - # Network address to bind to - bind-address = "0.0.0.0" - - # Port to listen to REST API requests + bind-address = "127.0.0.1" port = 5555 - - # Hash of API key string: "lunes_apikey" - # api-key-hash = "" + # api-key-hash = " } - upnp { - enable = yes + enable = no gateway-timeout = 47s discover-timeout = 43s } - miner { - # Enable/disable block generation - enable = no - - # Required number of connections (both incoming and outgoing) to attempt block generation. Setting this value to 0 - # enables "offline generation". + enable = yes quorum = 1 - - # Enable block generation only in the last block is not older the given period of time - interval-after-last-block-then-generation-is-allowed = 111d + interval-after-last-block-then-generation-is-allowed = 1d } - features { supported = [2] # NG } } + diff --git a/src/main/scala/io/lunes/features/BlockchainFeature.scala b/src/main/scala/io/lunes/features/BlockchainFeature.scala index b4498ecc8..56265fe0a 100644 --- a/src/main/scala/io/lunes/features/BlockchainFeature.scala +++ b/src/main/scala/io/lunes/features/BlockchainFeature.scala @@ -15,6 +15,6 @@ object BlockchainFeatures { val MassTransfer = BlockchainFeature(3) val SmartAccounts = BlockchainFeature(4) - val implemented: Set[Short] = Set(NG, MassTransfer).map(_.id) + val implemented: Set[Short] = Set(NG).map(_.id) val preActivated: Map[Short, Int] = Set(NG).map(_.id).map{case (v: Short) => (v,v.toInt)}.toMap } diff --git a/src/main/scala/io/lunes/settings/BlockchainSettings.scala b/src/main/scala/io/lunes/settings/BlockchainSettings.scala index 77f0df230..1769269fe 100644 --- a/src/main/scala/io/lunes/settings/BlockchainSettings.scala +++ b/src/main/scala/io/lunes/settings/BlockchainSettings.scala @@ -5,9 +5,9 @@ import io.lunes.state2.ByteStr import net.ceedubs.ficus.Ficus._ import net.ceedubs.ficus.readers.ArbitraryTypeReader._ import net.ceedubs.ficus.readers.EnumerationReader._ - import scala.concurrent.duration._ + /** * * @param featureCheckBlocksPeriod diff --git a/src/main/scala/io/lunes/settings/Constants.scala b/src/main/scala/io/lunes/settings/Constants.scala index 91de2feeb..ae7747f23 100644 --- a/src/main/scala/io/lunes/settings/Constants.scala +++ b/src/main/scala/io/lunes/settings/Constants.scala @@ -9,33 +9,30 @@ import scorex.utils.ScorexLogging * */ object Constants extends ScorexLogging { - val VersionStr = "0.0.4" - val VersionTuple = (0, 0, 4) - val MinimalVersion = (0, 0, 4) + val VersionStr = "0.0.5" + val VersionTuple = (0, 0, 5) + val MinimalVersion = (0, 0, 5) val ApplicationName = "lunesnode" val CoinName = "LUNES" val CoinAbr = "LNS" - val AgentName = s"Lunes v${VersionStr}" - val UnitsInLunes = 100000000L - val TotalLunes = 600000000L - val InitialBalance = TotalLunes * UnitsInLunes + val AgentName = s"lunesnode" + val InitialBalance = 15072853761500800L - val MainSchemeCharacter = '0' + val MainSchemeCharacter = '1' val MainDelay = 60 - val MainTimestamp = 1523145600000L - val MainSignature = "5UoT695i3nk3nd553QtRCkmWzRpyQ8oQNCn4Kdrrs6uN6gJKo8LLNskAiYeqYnxdipPfhXXNQkyKaKAA83dwqGqg" + val MainTimestamp = 1528077600000L + val MainSignature = "soKTPcsb5cD97jnm64zF3pVuVUqUYx3caaDvuPyM6PXPY7eWCxeHeYvKSE2aJwZwRpXdRFdW1g5BQMFpYkHcf85" val MainTransactions = List( - GenesisTransactionSettings("37cjwk5WavHeoCjNUi92vba6KsNAd1uwAso", 30000000000000000L), - GenesisTransactionSettings("37SGwubdwB1T8ri2Wh6XwcfkzhisqoLH45g", 20000000000000000L), - GenesisTransactionSettings("37cpimjxZ7kQ4akeq2pAB3rVi2eoXaze2sJ", 10000000000000000L) + GenesisTransactionSettings("37oqFHsx1cRtLWtnp6YyQpud5WJk4v79VPu", 5072853761500800L), + GenesisTransactionSettings("3826zwbgHauHXAoppU4we3hsJc9GtRCpSvz", 10000000000000000L), ) - val TestSchemeCharacter = '1' + val TestSchemeCharacter = '0' val TestDelay = 60 - val TestTimestamp = 1522368000000L - val TestSignature = "TwtrT2Q7zNNTsGSdVjZkpb3YzGBExqCuhUY4HFrFQZrQ5ZGNPKRn25QGaywgBfxVvUn132C5w5GoNf8SBA1bGsk" - val TestInitialBalance = TotalLunes * UnitsInLunes + val TestTimestamp = 1523145600000L + val TestSignature = "" + val TestTransactions = List( GenesisTransactionSettings("3825YjBosdU7g2AWZjZNF5hN7VsRZg35RcA", 30000000000000000L), GenesisTransactionSettings("37qcYthwDtBv1g9AbiWsG6o2nLE8nXxF2vr", 30000000000000000L) diff --git a/src/main/scala/io/lunes/transaction/Verifier.scala b/src/main/scala/io/lunes/transaction/Verifier.scala index 2f777026f..b1432882f 100644 --- a/src/main/scala/io/lunes/transaction/Verifier.scala +++ b/src/main/scala/io/lunes/transaction/Verifier.scala @@ -1,15 +1,27 @@ package io.lunes.transaction + +import io.lunes.crypto +import io.lunes.transaction.ValidationError.GenericError import io.lunes.state2.reader.SnapshotStateReader /** * */ object Verifier { - def apply(s: SnapshotStateReader, currentBlockHeight: Int)(tx: Transaction): Either[ValidationError, Transaction] = tx match { case _: GenesisTransaction => Right(tx) - case stx: SignedTransaction => stx.signaturesValid() + case pt: ProvenTransaction => (pt, None) match { + case (stx: SignedTransaction, None) => stx.signaturesValid() + case _ => verifyAsEllipticCurveSignature(pt) + } } + + def verifyAsEllipticCurveSignature[T <: ProvenTransaction](pt: T): Either[ValidationError, T] = + Either.cond( + crypto.verify(pt.proofs.proofs(0).arr, pt.bodyBytes(), pt.sender.publicKey), + pt, + GenericError(s"proof doesn't validate as signature for $pt")) + }