com.google.common.primitives.Ints Scala Examples
The following examples show how to use com.google.common.primitives.Ints.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: QueryGuardEvent.scala From gimel with Apache License 2.0 | 5 votes |
package com.paypal.gimel.common.query.guard import java.time.Instant import java.util.concurrent.{Delayed, TimeUnit} import com.google.common.base.Objects import com.google.common.primitives.Ints import org.joda.time.DateTime import com.paypal.gimel.logger.Logger private[query] sealed trait QueryGuardEvent private[query] trait QueryGuardDelayedEvent extends QueryGuardEvent with Delayed private[query] case class JobSubmitted(jobId: Int, jobType: String, startTime: Long = Instant.now().toEpochMilli, estimatedJobEndTime: Long, estimatedDelayEndTime: Long) extends QueryGuardDelayedEvent { private val logger = Logger(this.getClass.getName) override def getDelay(unit: TimeUnit): Long = { val currentInstant = Instant.now().toEpochMilli val diff = estimatedDelayEndTime - currentInstant logger.info( s"[JobSubmitted] Comparing Job with ID: $jobId diff: $diff with end time:" + s" ${new DateTime(estimatedDelayEndTime)}, and current instant:" + s" ${new DateTime(currentInstant)}" ) unit.convert(diff, TimeUnit.MILLISECONDS) } override def compareTo(o: Delayed): Int = { Ints.saturatedCast( this.estimatedDelayEndTime - o .asInstanceOf[JobSubmitted] .estimatedDelayEndTime ) } override def toString: String = Objects .toStringHelper(this) .add("jobId", jobId) .add("jobType", jobType) .add("startTime", startTime) .add("estimatedJobEndTime", estimatedJobEndTime) .add("estimatedDelayEndTime", estimatedDelayEndTime) .toString } object JobSubmitted { def apply(jobId: Int, jobType: String, startTime: Long, jobTtl: Int, delayTtl: Int): JobSubmitted = new JobSubmitted( jobId, jobType, startTime, startTime + jobTtl, startTime + delayTtl ) def apply(job: JobSubmitted, jobTtl: Int, delayTime: Long): JobSubmitted = new JobSubmitted( jobId = job.jobId, jobType = job.jobType, startTime = job.startTime, estimatedJobEndTime = job.startTime + jobTtl, estimatedDelayEndTime = delayTime ) } private[query] case class JobKill(jobId: Int, jobType: String, reason: String) extends QueryGuardEvent { override def toString: String = Objects .toStringHelper(this) .add("jobId", jobId) .add("jobType", jobType) .add("reason", reason) .toString }
Example 2
Source File: HandshakeDecoderSpec.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.network import java.nio.charset.StandardCharsets import com.google.common.primitives.{Ints, Longs} import com.wavesplatform.{NoShrink, TransactionGen} import io.netty.buffer.Unpooled import io.netty.channel.embedded.EmbeddedChannel import io.netty.channel.{ChannelHandlerContext, ChannelInboundHandlerAdapter} import org.scalacheck.{Arbitrary, Gen} import org.scalamock.scalatest.MockFactory import org.scalatest.{FreeSpec, Matchers} import org.scalatestplus.scalacheck.{ScalaCheckPropertyChecks => PropertyChecks} class HandshakeDecoderSpec extends FreeSpec with Matchers with MockFactory with PropertyChecks with TransactionGen with NoShrink { "should read a handshake and remove itself from the pipeline" in { var mayBeDecodedHandshake: Option[Handshake] = None val channel = new EmbeddedChannel( new HandshakeDecoder(PeerDatabase.NoOp), new ChannelInboundHandlerAdapter { override def channelRead(ctx: ChannelHandlerContext, msg: Any): Unit = msg match { case x: Handshake => mayBeDecodedHandshake = Some(x) case _ => } } ) val origHandshake = new Handshake( applicationName = "wavesI", applicationVersion = (1, 2, 3), nodeName = "test", nodeNonce = 4, declaredAddress = None ) val buff = Unpooled.buffer origHandshake.encode(buff) buff.writeCharSequence("foo", StandardCharsets.UTF_8) channel.writeInbound(buff) mayBeDecodedHandshake should contain(origHandshake) } private val invalidHandshakeBytes: Gen[Array[Byte]] = { // To bypass situations where the appNameLength > whole buffer and HandshakeDecoder waits for next bytes val appName = "x" * Byte.MaxValue val nodeName = "y" * Byte.MaxValue val appNameBytes = appName.getBytes(StandardCharsets.UTF_8) val versionBytes = Array(1, 2, 3).flatMap(Ints.toByteArray) val nodeNameBytes = nodeName.getBytes(StandardCharsets.UTF_8) val nonceBytes = Longs.toByteArray(1) val timestampBytes = Longs.toByteArray(System.currentTimeMillis() / 1000) val validDeclaredAddressLen = Set(0, 8, 20) val invalidBytesGen = Gen.listOfN(3, Arbitrary.arbByte.arbitrary).filter { case List(appNameLen, nodeNameLen, declaredAddressLen) => !(appNameLen == appNameBytes.size || nodeNameLen == nodeNameBytes.size || validDeclaredAddressLen.contains(declaredAddressLen)) case _ => false } invalidBytesGen.map { case List(appNameLen, nodeNameLen, declaredAddressLen) => Array(appNameLen) ++ appNameBytes ++ versionBytes ++ Array(nodeNameLen) ++ nodeNameBytes ++ nonceBytes ++ Array(declaredAddressLen) ++ timestampBytes } } "should blacklist a node sends an invalid handshake" in forAll(invalidHandshakeBytes) { bytes: Array[Byte] => val decoder = new SpiedHandshakeDecoder val channel = new EmbeddedChannel(decoder) val buff = Unpooled.buffer buff.writeBytes(bytes) channel.writeInbound(buff) decoder.blockCalls shouldBe >(0) } private class SpiedHandshakeDecoder extends HandshakeDecoder(PeerDatabase.NoOp) { var blockCalls = 0 override protected def block(ctx: ChannelHandlerContext, e: Throwable): Unit = { blockCalls += 1 } } }
Example 3
Source File: TxHelpers.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import com.google.common.primitives.Ints import com.wavesplatform.TestValues import com.wavesplatform.account.{Address, AddressOrAlias, KeyPair} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils._ import com.wavesplatform.lang.script.Script import com.wavesplatform.transaction.Asset.Waves import com.wavesplatform.transaction.assets.IssueTransaction import com.wavesplatform.transaction.assets.exchange.{AssetPair, ExchangeTransaction, Order, OrderType} import com.wavesplatform.transaction.transfer.TransferTransaction object TxHelpers { def signer(i: Int): KeyPair = KeyPair(Ints.toByteArray(i)) val defaultSigner: KeyPair = signer(0) private[this] var lastTimestamp = System.currentTimeMillis() def timestamp: Long = { lastTimestamp += 1 lastTimestamp } def genesis(address: Address, amount: Long = TestValues.OneWaves * 1000): GenesisTransaction = GenesisTransaction.create(address, amount, timestamp).explicitGet() def transfer(from: KeyPair, to: AddressOrAlias, amount: Long = TestValues.OneWaves, asset: Asset = Waves): TransferTransaction = TransferTransaction.selfSigned(TxVersion.V1, from, to, asset, amount, Waves, TestValues.fee, ByteStr.empty, timestamp).explicitGet() def issue(amount: Long = TestValues.ThousandWaves, script: Script = null): IssueTransaction = IssueTransaction .selfSigned(TxVersion.V2, defaultSigner, "test", "", amount, 0, reissuable = false, Option(script), TestValues.OneWaves, timestamp) .explicitGet() def orderV3(orderType: OrderType, asset: Asset, feeAsset: Asset): Order = { orderV3(orderType, asset, Waves, feeAsset) } def orderV3(orderType: OrderType, amountAsset: Asset, priceAsset: Asset, feeAsset: Asset): Order = { Order.selfSigned( TxVersion.V3, defaultSigner, defaultSigner.publicKey, AssetPair(amountAsset, priceAsset), orderType, 1, 1, timestamp, timestamp + 100000, 1, feeAsset ) } def exchange(order1: Order, order2: Order): ExchangeTransaction = { ExchangeTransaction .signed( TxVersion.V2, defaultSigner.privateKey, order1, order2, order1.amount, order1.price, order1.matcherFee, order2.matcherFee, TestValues.fee, timestamp ) .explicitGet() } }
Example 4
Source File: package.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.block import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.block.Block.{GenesisBlockVersion, NgBlockVersion, PlainBlockVersion, ProtoBlockVersion, RewardBlockVersion} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils._ import com.wavesplatform.protobuf.transaction.{PBTransactions, SignedTransaction} import com.wavesplatform.protobuf.utils.PBUtils import com.wavesplatform.serialization.ByteBufferOps import com.wavesplatform.transaction.{Transaction, TransactionParsers} package object serialization { private[block] def writeTransactionData(version: Byte, txs: Seq[Transaction]): Array[Byte] = { val txsBytes = txs.map(tx => if (version == ProtoBlockVersion) PBUtils.encodeDeterministic(PBTransactions.protobuf(tx)) else tx.bytes()) val txsBytesSize = txsBytes.map(_.length + Ints.BYTES).sum val txsBuf = ByteBuffer.allocate(txsBytesSize) txsBytes.foreach(tx => txsBuf.putInt(tx.length).put(tx)) Bytes.concat(mkTxsCountBytes(version, txs.size), txsBuf.array()) } private[block] def readTransactionData(version: Byte, buf: ByteBuffer): Seq[Transaction] = { val txCount = version match { case GenesisBlockVersion | PlainBlockVersion => buf.getByte case NgBlockVersion | RewardBlockVersion | ProtoBlockVersion => buf.getInt } val txs = (1 to txCount).foldLeft(List.empty[Transaction]) { case (txs, _) => val size = buf.getInt val txBytes = buf.getByteArray(size) val tx = version match { case ProtoBlockVersion => PBTransactions.vanilla(SignedTransaction.parseFrom(txBytes)).explicitGet() case _ => TransactionParsers.parseBytes(txBytes).get } tx :: txs } txs.reverse } private[block] def writeConsensusBytes(baseTarget: Long, generationSignature: ByteStr): Array[Byte] = Bytes.concat( Longs.toByteArray(baseTarget), generationSignature.arr ) def mkTxsCountBytes(version: Byte, txsCount: Int): Array[Byte] = version match { case GenesisBlockVersion | PlainBlockVersion => Array(txsCount.toByte) case NgBlockVersion | RewardBlockVersion | ProtoBlockVersion => Ints.toByteArray(txsCount) } }
Example 5
Source File: MicroBlockSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.block.serialization import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.block.{Block, MicroBlock} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto.SignatureLength import com.wavesplatform.serialization.ByteBufferOps import scala.util.Try object MicroBlockSerializer { def toBytes(microBlock: MicroBlock): Array[Byte] = { val transactionDataBytes = writeTransactionData(microBlock.version, microBlock.transactionData) Bytes.concat( Array(microBlock.version), microBlock.reference.arr, microBlock.totalResBlockSig.arr, Ints.toByteArray(transactionDataBytes.length), transactionDataBytes, microBlock.sender.arr, microBlock.signature.arr ) } def parseBytes(bytes: Array[Byte]): Try[MicroBlock] = Try { val buf = ByteBuffer.wrap(bytes).asReadOnlyBuffer() val version = buf.get val reference = ByteStr(buf.getByteArray(Block.referenceLength(version))) val totalResBlockSig = ByteStr(buf.getByteArray(SignatureLength)) buf.getInt val transactionData = readTransactionData(version, buf) val generator = buf.getPublicKey val signature = ByteStr(buf.getByteArray(SignatureLength)) MicroBlock(version, generator, transactionData, reference, totalResBlockSig, signature) } }
Example 6
Source File: BalanceDistribution.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api.common import com.google.common.collect.AbstractIterator import com.google.common.primitives.{Ints, Longs} import com.wavesplatform.account.Address import com.wavesplatform.database.{AddressId, DBExt, DBResource, Keys} import com.wavesplatform.state.Portfolio import com.wavesplatform.state.Portfolio.longSemigroup import monix.eval.Task import monix.reactive.Observable import org.iq80.leveldb.DB import scala.annotation.tailrec import scala.jdk.CollectionConverters._ trait BalanceDistribution { import BalanceDistribution._ def balanceDistribution( db: DB, height: Int, after: Option[Address], overrides: Map[Address, Portfolio], globalPrefix: Array[Byte], addressId: Array[Byte] => AddressId, balanceOf: Portfolio => Long ): Observable[(Address, Long)] = db.resourceObservable .flatMap { resource => resource.iterator.seek( globalPrefix ++ after.flatMap(address => resource.get(Keys.addressId(address))).fold(Array.emptyByteArray)(id => Longs.toByteArray(id.toLong + 1)) ) Observable.fromIterator(Task(new BalanceIterator(resource, globalPrefix, addressId, balanceOf, height, overrides).asScala.filter(_._2 > 0))) } } object BalanceDistribution { class BalanceIterator( resource: DBResource, globalPrefix: Array[Byte], addressId: Array[Byte] => AddressId, balanceOf: Portfolio => Long, height: Int, private var pendingPortfolios: Map[Address, Portfolio] ) extends AbstractIterator[(Address, Long)] { @inline private def stillSameAddress(expected: AddressId): Boolean = resource.iterator.hasNext && { val maybeNext = resource.iterator.peekNext().getKey maybeNext.startsWith(globalPrefix) && addressId(maybeNext) == expected } @tailrec private def findNextBalance(): Option[(Address, Long)] = { if (!resource.iterator.hasNext) None else { val current = resource.iterator.next() if (!current.getKey.startsWith(globalPrefix)) None else { val aid = addressId(current.getKey) val address = resource.get(Keys.idToAddress(aid)) var balance = Longs.fromByteArray(current.getValue) var currentHeight = Ints.fromByteArray(current.getKey.takeRight(4)) while (stillSameAddress(aid)) { val next = resource.iterator.next() val nextHeight = Ints.fromByteArray(next.getKey.takeRight(4)) if (nextHeight <= height) { currentHeight = nextHeight balance = Longs.fromByteArray(next.getValue) } } pendingPortfolios -= address val adjustedBalance = longSemigroup.combine(balance, pendingPortfolios.get(address).fold(0L)(balanceOf)) if (currentHeight <= height && adjustedBalance > 0) Some(address -> adjustedBalance) else findNextBalance() } } } override def computeNext(): (Address, Long) = findNextBalance() match { case Some(balance) => balance case None => if (pendingPortfolios.nonEmpty) { val (address, portfolio) = pendingPortfolios.head pendingPortfolios -= address address -> balanceOf(portfolio) } else { endOfData() } } } }
Example 7
Source File: Message.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.network.message import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.crypto import monix.eval.Coeval import scala.util.{Success, Try} case class Message[Content <: AnyRef](spec: MessageSpec[Content], input: Either[Array[Byte], Content]) { import Message.{ChecksumLength, MagicBytes} lazy val dataBytes = input match { case Left(db) => db case Right(d) => spec.serializeData(d) } lazy val data: Try[Content] = input match { case Left(db) => spec.deserializeData(db) case Right(d) => Success(d) } lazy val dataLength: Int = dataBytes.length val bytes = Coeval.evalOnce { val dataWithChecksum = if (dataLength > 0) { val checksum = crypto.fastHash(dataBytes).take(ChecksumLength) Bytes.concat(checksum, dataBytes) } else dataBytes //empty array Bytes.concat(MagicBytes, Array(spec.messageCode), Ints.toByteArray(dataLength), dataWithChecksum) } } object Message { type MessageCode = Byte val ChecksumLength = 4 val LengthFieldLength = 4 val MessageCodeLength = 1 private val MagicBytes = Array(0x12: Byte, 0x34: Byte, 0x56: Byte, 0x78: Byte) }
Example 8
Source File: GenesisTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import cats.data.Validated import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.account.Address import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.Waves import com.wavesplatform.transaction.serialization.impl.GenesisTxSerializer import com.wavesplatform.transaction.validation.{TxConstraints, TxValidator} import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class GenesisTransaction private (recipient: Address, amount: Long, timestamp: Long, signature: ByteStr, chainId: Byte) extends Transaction { override val builder = GenesisTransaction override val assetFee: (Asset, Long) = (Waves, 0) override val id: Coeval[ByteStr] = Coeval.evalOnce(signature) override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val bytes: Coeval[Array[Byte]] = bodyBytes override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) } object GenesisTransaction extends TransactionParser { type TransactionT = GenesisTransaction override val typeId: TxType = 1: Byte override val supportedVersions: Set[TxVersion] = Set(1) val serializer = GenesisTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[GenesisTransaction] = serializer.parseBytes(bytes) implicit val validator: TxValidator[GenesisTransaction] = tx => TxConstraints.seq(tx)( Validated.condNel(tx.amount >= 0, tx, TxValidationError.NegativeAmount(tx.amount, "waves")), TxConstraints.addressChainId(tx.recipient, tx.chainId) ) def generateSignature(recipient: Address, amount: Long, timestamp: Long): Array[Byte] = { val payload = Bytes.concat(Ints.toByteArray(typeId), Longs.toByteArray(timestamp), recipient.bytes, Longs.toByteArray(amount)) val hash = crypto.fastHash(payload) Bytes.concat(hash, hash) } def create(recipient: Address, amount: Long, timestamp: Long): Either[ValidationError, GenesisTransaction] = { val signature = ByteStr(GenesisTransaction.generateSignature(recipient, amount, timestamp)) GenesisTransaction(recipient, amount, timestamp, signature, recipient.chainId).validatedEither } }
Example 9
Source File: PaymentTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.serialization._ import com.wavesplatform.transaction.PaymentTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object PaymentTxSerializer { def toJson(tx: PaymentTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj("recipient" -> recipient.stringRepr, "amount" -> amount) } def hashBytes(tx: PaymentTransaction): Array[Byte] = { import tx._ Bytes.concat( Array(builder.typeId), Longs.toByteArray(timestamp), sender.arr, recipient.bytes, Longs.toByteArray(amount), Longs.toByteArray(fee) ) } def bodyBytes(tx: PaymentTransaction): Array[Byte] = { import tx._ Bytes.concat( Ints.toByteArray(builder.typeId), // 4 bytes Longs.toByteArray(timestamp), sender.arr, recipient.bytes, Longs.toByteArray(amount), Longs.toByteArray(fee) ) } def toBytes(tx: PaymentTransaction): Array[Byte] = { Bytes.concat(this.hashBytes(tx), tx.signature.arr) } def parseBytes(bytes: Array[Byte]): Try[PaymentTransaction] = Try { val buf = ByteBuffer.wrap(bytes) require(buf.getByte == PaymentTransaction.typeId, "transaction type mismatch") val timestamp = buf.getLong val sender = buf.getPublicKey val recipient = buf.getAddress val amount = buf.getLong val fee = buf.getLong val signature = buf.getSignature PaymentTransaction(sender, recipient, amount, fee, timestamp, signature, recipient.chainId) } }
Example 10
Source File: GeneratorSettings.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.generator import java.net.{InetSocketAddress, URL} import java.nio.charset.StandardCharsets import cats.Show import cats.implicits.showInterpolator import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.account.KeyPair import com.wavesplatform.generator.GeneratorSettings.NodeAddress case class GeneratorSettings( chainId: String, accounts: Seq[String], sendTo: Seq[NodeAddress], worker: Worker.Settings, mode: Mode.Value, narrow: NarrowTransactionGenerator.Settings, wide: WideTransactionGenerator.Settings, dynWide: DynamicWideTransactionGenerator.Settings, multisig: MultisigTransactionGenerator.Settings, oracle: OracleTransactionGenerator.Settings, swarm: SmartGenerator.Settings ) { val addressScheme: Char = chainId.head val privateKeyAccounts: Seq[KeyPair] = accounts.map(s => GeneratorSettings.toKeyPair(s)) } object GeneratorSettings { case class NodeAddress(networkAddress: InetSocketAddress, apiAddress: URL) implicit val toPrintable: Show[GeneratorSettings] = { x => import x._ val modeSettings: String = (mode match { case Mode.NARROW => show"$narrow" case Mode.WIDE => show"$wide" case Mode.DYN_WIDE => show"$dynWide" case Mode.MULTISIG => show"$multisig" case Mode.ORACLE => show"$oracle" case Mode.SWARM => show"$swarm" }).toString s"""network byte: $chainId |rich accounts: | ${accounts.mkString("\n ")} |recipient nodes: | ${sendTo.mkString("\n ")} |worker: | ${show"$worker".split('\n').mkString("\n ")} |mode: $mode |$mode settings: | ${modeSettings.split('\n').mkString("\n ")}""".stripMargin } def toKeyPair(seedText: String): KeyPair = { KeyPair(com.wavesplatform.crypto.secureHash(Bytes.concat(Ints.toByteArray(0), seedText.getBytes(StandardCharsets.UTF_8)))) } }
Example 11
Source File: RollbackBenchmark.scala From Waves with MIT License | 5 votes |
package com.wavesplatform import java.io.File import com.google.common.primitives.Ints import com.google.protobuf.ByteString import com.wavesplatform.account.{Address, AddressScheme, KeyPair} import com.wavesplatform.block.Block import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils._ import com.wavesplatform.database.{LevelDBWriter, openDB} import com.wavesplatform.protobuf.transaction.PBRecipients import com.wavesplatform.state.{Diff, Portfolio} import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction.assets.IssueTransaction import com.wavesplatform.transaction.{GenesisTransaction, Proofs} import com.wavesplatform.utils.{NTP, ScorexLogging} import monix.reactive.Observer object RollbackBenchmark extends ScorexLogging { def main(args: Array[String]): Unit = { val settings = Application.loadApplicationConfig(Some(new File(args(0)))) val db = openDB(settings.dbSettings.directory) val time = new NTP(settings.ntpServer) val levelDBWriter = LevelDBWriter(db, Observer.stopped, settings) val issuer = KeyPair(new Array[Byte](32)) log.info("Generating addresses") val addresses = 1 to 18000 map { i => PBRecipients.toAddress(Ints.toByteArray(i) ++ new Array[Byte](Address.HashLength - 4), AddressScheme.current.chainId).explicitGet() } log.info("Generating issued assets") val assets = 1 to 200 map { i => IssueTransaction( 1.toByte, issuer.publicKey, ByteString.copyFromUtf8("asset-" + i), ByteString.EMPTY, 100000e2.toLong, 2.toByte, false, None, 1e8.toLong, time.getTimestamp(), Proofs(ByteStr(new Array[Byte](64))), AddressScheme.current.chainId ) } log.info("Building genesis block") val genesisBlock = Block .buildAndSign( 1.toByte, time.getTimestamp(), Block.GenesisReference, 1000, Block.GenesisGenerationSignature, GenesisTransaction.create(issuer.publicKey.toAddress, 100000e8.toLong, time.getTimestamp()).explicitGet() +: assets, issuer, Seq.empty, -1 ) .explicitGet() val map = assets.map(it => IssuedAsset(it.id()) -> 1L).toMap val portfolios = for { address <- addresses } yield address -> Portfolio(assets = map) log.info("Appending genesis block") levelDBWriter.append( Diff.empty.copy(portfolios = portfolios.toMap), 0, 0, None, genesisBlock.header.generationSignature, genesisBlock ) val nextBlock = Block .buildAndSign(2.toByte, time.getTimestamp(), genesisBlock.id(), 1000, Block.GenesisGenerationSignature, Seq.empty, issuer, Seq.empty, -1) .explicitGet() val nextDiff = Diff.empty.copy(portfolios = addresses.map(_ -> Portfolio(1, assets = Map(IssuedAsset(assets.head.id()) -> 1L))).toMap) log.info("Appending next block") levelDBWriter.append(nextDiff, 0, 0, None, ByteStr.empty, nextBlock) log.info("Rolling back") val start = System.nanoTime() levelDBWriter.rollbackTo(genesisBlock.id()) val end = System.nanoTime() log.info(f"Rollback took ${(end - start) * 1e-6}%.3f ms") levelDBWriter.close() } }
Example 12
Source File: RecordWriter.scala From BigDL with Apache License 2.0 | 5 votes |
package com.intel.analytics.bigdl.visualization.tensorboard import java.io.{File, FileOutputStream} import com.google.common.primitives.{Ints, Longs} import com.intel.analytics.bigdl.utils.Crc32 import netty.Crc32c import org.apache.hadoop.fs.{FSDataOutputStream, FileSystem, Path} import org.tensorflow.util.Event private[bigdl] class RecordWriter(file: Path, fs: FileSystem) { val outputStream = if (file.toString.startsWith("hdfs://")) { // FSDataOutputStream couldn't flush data to localFileSystem in time. So reading summaries // will throw exception. fs.create(file, true, 1024) } else { // Using FileOutputStream when write to local. new FileOutputStream(new File(file.toString)) } val crc32 = new Crc32c() def write(event: Event): Unit = { val eventString = event.toByteArray val header = Longs.toByteArray(eventString.length.toLong).reverse outputStream.write(header) outputStream.write(Ints.toByteArray(Crc32.maskedCRC32(crc32, header).toInt).reverse) outputStream.write(eventString) outputStream.write(Ints.toByteArray(Crc32.maskedCRC32(crc32, eventString).toInt).reverse) if (outputStream.isInstanceOf[FSDataOutputStream]) { // Flush data to HDFS. outputStream.asInstanceOf[FSDataOutputStream].hflush() } } def close(): Unit = { outputStream.close() } }
Example 13
Source File: HistoryDBApi.scala From EncryCore with GNU General Public License v3.0 | 5 votes |
package encry.view.history import com.google.common.primitives.Ints import com.typesafe.scalalogging.StrictLogging import encry.settings.EncryAppSettings import encry.storage.VersionalStorage.StorageKey import encry.view.history.storage.HistoryStorage import org.encryfoundation.common.modifiers.history.{Block, Header, Payload} import org.encryfoundation.common.utils.Algos import org.encryfoundation.common.utils.TaggedTypes.{Height, ModifierId, ModifierTypeId} import scorex.crypto.hash.Digest32 import scala.reflect.ClassTag trait HistoryDBApi extends StrictLogging { val settings: EncryAppSettings val historyStorage: HistoryStorage lazy val BestHeaderKey: StorageKey = StorageKey @@ Array.fill(settings.constants.DigestLength)(Header.modifierTypeId.untag(ModifierTypeId)) lazy val BestBlockKey: StorageKey = StorageKey @@ Array.fill(settings.constants.DigestLength)(-1: Byte) private def getModifierById[T: ClassTag](id: ModifierId): Option[T] = historyStorage .modifierById(id) .collect { case m: T => m } def getHeightByHeaderIdDB(id: ModifierId): Option[Int] = historyStorage .get(headerHeightKey(id)) .map(Ints.fromByteArray) def getHeaderByIdDB(id: ModifierId): Option[Header] = getModifierById[Header](id) def getPayloadByIdDB(pId: ModifierId): Option[Payload] = getModifierById[Payload](pId) def getBlockByHeaderDB(header: Header): Option[Block] = getModifierById[Payload](header.payloadId) .map(payload => Block(header, payload)) def getBlockByHeaderIdDB(id: ModifierId): Option[Block] = getHeaderByIdDB(id) .flatMap(h => getModifierById[Payload](h.payloadId).map(p => Block(h, p))) def getBestHeaderId: Option[ModifierId] = historyStorage.get(BestHeaderKey).map(ModifierId @@ _) def getBestHeaderDB: Option[Header] = getBestHeaderId.flatMap(getHeaderByIdDB) def getBestHeaderHeightDB: Int = getBestHeaderId .flatMap(getHeightByHeaderIdDB) .getOrElse(settings.constants.PreGenesisHeight) def getBestBlockId: Option[ModifierId] = historyStorage.get(BestBlockKey).map(ModifierId @@ _) def getBestBlockDB: Option[Block] = getBestBlockId.flatMap(getBlockByHeaderIdDB) def getBestBlockHeightDB: Int = getBestBlockId .flatMap(getHeightByHeaderIdDB) .getOrElse(settings.constants.PreGenesisHeight) def modifierBytesByIdDB(id: ModifierId): Option[Array[Byte]] = historyStorage.modifiersBytesById(id) def isModifierDefined(id: ModifierId): Boolean = historyStorage.containsMod(id) //todo probably rewrite with indexes collection def lastBestBlockHeightRelevantToBestChain(probablyAt: Int): Option[Int] = (for { headerId <- getBestHeaderIdAtHeightDB(probablyAt) header <- getHeaderByIdDB(headerId) if isModifierDefined(header.payloadId) } yield header.height).orElse(lastBestBlockHeightRelevantToBestChain(probablyAt - 1)) def headerIdsAtHeightDB(height: Int): Option[Seq[ModifierId]] = historyStorage .get(heightIdsKey(height)) .map(_.grouped(32).map(ModifierId @@ _).toSeq) def getBestHeaderIdAtHeightDB(h: Int): Option[ModifierId] = headerIdsAtHeightDB(h).flatMap(_.headOption) def getBestHeaderAtHeightDB(h: Int): Option[Header] = getBestHeaderIdAtHeightDB(h).flatMap(getHeaderByIdDB) def isInBestChain(h: Header): Boolean = getBestHeaderIdAtHeightDB(h.height) .exists(_.sameElements(h.id)) def isInBestChain(id: ModifierId): Boolean = heightOf(id) .flatMap(getBestHeaderIdAtHeightDB) .exists(_.sameElements(id)) def getBestHeadersChainScore: BigInt = getBestHeaderId.flatMap(scoreOf).getOrElse(BigInt(0)) //todo ?.getOrElse(BigInt(0))? def scoreOf(id: ModifierId): Option[BigInt] = historyStorage .get(headerScoreKey(id)) .map(d => BigInt(d)) def heightOf(id: ModifierId): Option[Height] = historyStorage .get(headerHeightKey(id)) .map(d => Height @@ Ints.fromByteArray(d)) def heightIdsKey(height: Int): StorageKey = StorageKey @@ Algos.hash(Ints.toByteArray(height)).untag(Digest32) def headerScoreKey(id: ModifierId): StorageKey = StorageKey @@ Algos.hash("score".getBytes(Algos.charset) ++ id).untag(Digest32) def headerHeightKey(id: ModifierId): StorageKey = StorageKey @@ Algos.hash("height".getBytes(Algos.charset) ++ id).untag(Digest32) def validityKey(id: Array[Byte]): StorageKey = StorageKey @@ Algos.hash("validity".getBytes(Algos.charset) ++ id).untag(Digest32) }
Example 14
Source File: HistoryHeadersProcessor.scala From EncryCore with GNU General Public License v3.0 | 5 votes |
package encry.view.history import cats.syntax.option.none import com.google.common.primitives.Ints import encry.EncryApp.forceStopApplication import encry.consensus.ConsensusSchemeReaders import encry.consensus.HistoryConsensus.ProgressInfo import encry.storage.VersionalStorage.{ StorageKey, StorageValue } import org.encryfoundation.common.modifiers.history.Header import org.encryfoundation.common.utils.TaggedTypes.{ Difficulty, ModifierId } trait HistoryHeadersProcessor extends HistoryApi { def processHeader(h: Header): ProgressInfo = getHeaderInfoUpdate(h) match { case dataToUpdate: Seq[_] if dataToUpdate.nonEmpty => historyStorage.bulkInsert(h.id, dataToUpdate, Seq(h)) getBestHeaderId match { case Some(bestHeaderId) => ProgressInfo(none, Seq.empty, if (!bestHeaderId.sameElements(h.id)) Seq.empty else Seq(h), toDownload(h)) case _ => forceStopApplication(errorMessage = "Should always have best header after header application") } case _ => ProgressInfo(none, Seq.empty, Seq.empty, none) } private def getHeaderInfoUpdate(header: Header): Seq[(StorageKey, StorageValue)] = { addHeaderToCacheIfNecessary(header) if (header.isGenesis) { logger.info(s"Initialize header chain with genesis header ${header.encodedId}") Seq( BestHeaderKey -> StorageValue @@ header.id, heightIdsKey(settings.constants.GenesisHeight) -> StorageValue @@ header.id, headerHeightKey(header.id) -> StorageValue @@ Ints.toByteArray(settings.constants.GenesisHeight), headerScoreKey(header.id) -> StorageValue @@ header.difficulty.toByteArray ) } else scoreOf(header.parentId).map { parentScore => logger.info(s"getHeaderInfoUpdate for header $header") val score: Difficulty = Difficulty @@ (parentScore + ConsensusSchemeReaders.consensusScheme.realDifficulty(header)) val bestHeaderHeight: Int = getBestHeaderHeight val bestHeadersChainScore: BigInt = getBestHeadersChainScore val bestRow: Seq[(StorageKey, StorageValue)] = if ((header.height > bestHeaderHeight) || (header.height == bestHeaderHeight && score > bestHeadersChainScore)) Seq(BestHeaderKey -> StorageValue @@ header.id.untag(ModifierId)) else Seq.empty val scoreRow: (StorageKey, StorageValue) = headerScoreKey(header.id) -> StorageValue @@ score.toByteArray val heightRow: (StorageKey, StorageValue) = headerHeightKey(header.id) -> StorageValue @@ Ints.toByteArray(header.height) val headerIdsRow: Seq[(StorageKey, StorageValue)] = if ((header.height > bestHeaderHeight) || (header.height == bestHeaderHeight && score > bestHeadersChainScore)) bestBlockHeaderIdsRow(header, score) else orphanedBlockHeaderIdsRow(header, score) Seq(scoreRow, heightRow) ++ bestRow ++ headerIdsRow }.getOrElse(Seq.empty) } private def bestBlockHeaderIdsRow(h: Header, score: Difficulty): Seq[(StorageKey, StorageValue)] = { logger.info(s"New best header ${h.encodedId} with score: $score at height ${h.height}") val self: (StorageKey, StorageValue) = heightIdsKey(h.height) -> StorageValue @@ (Seq(h.id) ++ headerIdsAtHeight(h.height).filterNot(_ sameElements h.id)).flatten.toArray val forkHeaders: Seq[(StorageKey, StorageValue)] = getHeaderById(h.parentId).toList.view .flatMap(headerChainBack(h.height, _, h => isInBestChain(h)).headers) .filterNot(isInBestChain) .map( header => heightIdsKey(header.height) -> StorageValue @@ (Seq(header.id) ++ headerIdsAtHeight(header.height).filterNot(_ sameElements header.id)).flatten.toArray ) .toList forkHeaders :+ self } private def orphanedBlockHeaderIdsRow(h: Header, score: Difficulty): Seq[(StorageKey, StorageValue)] = { logger.info(s"New orphaned header ${h.encodedId} at height ${h.height} with score $score") Seq(heightIdsKey(h.height) -> StorageValue @@ (headerIdsAtHeight(h.height) :+ h.id).flatten.toArray) } }
Example 15
Source File: package.scala From Sidechains-SDK with MIT License | 5 votes |
package com.horizen import java.math.{BigDecimal, BigInteger, MathContext} import com.google.common.primitives.{Bytes, Ints} import com.horizen.vrf.VrfOutput import scorex.util.ModifierId import supertagged.TaggedType package object consensus { val merkleTreeHashLen: Int = 32 val sha256HashLen: Int = 32 val consensusHardcodedSaltString: Array[Byte] = "TEST".getBytes() val forgerStakePercentPrecision: BigDecimal = BigDecimal.valueOf(1000000) // where 1 / forgerStakePercentPrecision -- minimal possible forger stake percentage to be able to forge val stakeConsensusDivideMathContext: MathContext = MathContext.DECIMAL128 //shall be used during dividing, otherwise ArithmeticException is thrown in case of irrational number as division result object ConsensusEpochNumber extends TaggedType[Int] type ConsensusEpochNumber = ConsensusEpochNumber.Type def intToConsensusEpochNumber(consensusEpochNumber: Int): ConsensusEpochNumber = ConsensusEpochNumber @@ consensusEpochNumber object ConsensusEpochId extends TaggedType[String] type ConsensusEpochId = ConsensusEpochId.Type def blockIdToEpochId(blockId: ModifierId): ConsensusEpochId = ConsensusEpochId @@ blockId def lastBlockIdInEpochId(epochId: ConsensusEpochId): ModifierId = ModifierId @@ epochId.untag(ConsensusEpochId) object ConsensusSlotNumber extends TaggedType[Int] type ConsensusSlotNumber = ConsensusSlotNumber.Type def intToConsensusSlotNumber(consensusSlotNumber: Int): ConsensusSlotNumber = ConsensusSlotNumber @@ consensusSlotNumber //Slot number starting from genesis block object ConsensusAbsoluteSlotNumber extends TaggedType[Int] type ConsensusAbsoluteSlotNumber = ConsensusAbsoluteSlotNumber.Type def intToConsensusAbsoluteSlotNumber(consensusSlotNumber: Int): ConsensusAbsoluteSlotNumber = ConsensusAbsoluteSlotNumber @@ consensusSlotNumber object ConsensusNonce extends TaggedType[Array[Byte]] type ConsensusNonce = ConsensusNonce.Type def byteArrayToConsensusNonce(bytes: Array[Byte]): ConsensusNonce = ConsensusNonce @@ bytes object VrfMessage extends TaggedType[Array[Byte]] type VrfMessage = VrfMessage.Type def buildVrfMessage(slotNumber: ConsensusSlotNumber, nonce: NonceConsensusEpochInfo): VrfMessage = { val slotNumberBytes = Ints.toByteArray(slotNumber) val nonceBytes = nonce.consensusNonce val resBytes = Bytes.concat(slotNumberBytes, nonceBytes, consensusHardcodedSaltString) VrfMessage @@ resBytes } def vrfOutputToPositiveBigInteger(vrfOutput: VrfOutput): BigInteger = { new BigInteger(1, vrfOutput.bytes()) } def vrfProofCheckAgainstStake(vrfOutput: VrfOutput, actualStake: Long, totalStake: Long): Boolean = { val requiredStakePercentage: BigDecimal = vrfOutputToRequiredStakePercentage(vrfOutput) val actualStakePercentage: BigDecimal = new BigDecimal(actualStake).divide(new BigDecimal(totalStake), stakeConsensusDivideMathContext) requiredStakePercentage.compareTo(actualStakePercentage) match { case -1 => true //required percentage is less than actual case 0 => true //required percentage is equal to actual case _ => false //any other case } } // @TODO shall be changed by adding "active slots coefficient" according to Ouroboros Praos Whitepaper (page 10) def vrfOutputToRequiredStakePercentage(vrfOutput: VrfOutput): BigDecimal = { val hashAsBigDecimal: BigDecimal = new BigDecimal(vrfOutputToPositiveBigInteger(vrfOutput)) hashAsBigDecimal .remainder(forgerStakePercentPrecision) //got random number from 0 to forgerStakePercentPrecision - 1 .divide(forgerStakePercentPrecision, stakeConsensusDivideMathContext) //got random number from 0 to 0.(9) } }
Example 16
Source File: MainchainTxSidechainCreationCrosschainOutput.scala From Sidechains-SDK with MIT License | 5 votes |
package com.horizen.block import com.google.common.primitives.{Bytes, Ints} import com.horizen.cryptolibprovider.CryptoLibProvider import com.horizen.utils.{BytesUtils, Utils, VarInt} import scala.util.Try class MainchainTxSidechainCreationCrosschainOutputData(val sidechainCreationOutputBytes: Array[Byte], val withdrawalEpochLength: Int, val amount: Long, val address: Array[Byte], val customData: Array[Byte], val constant: Array[Byte], val certVk: Array[Byte]) { def size: Int = sidechainCreationOutputBytes.length } object MainchainTxSidechainCreationCrosschainOutputData { val OUTPUT_TYPE: Byte = 3.toByte def create(sidechainCreationOutputBytes: Array[Byte], offset: Int): Try[MainchainTxSidechainCreationCrosschainOutputData] = Try { var currentOffset: Int = offset val withdrawalEpochLength: Int = BytesUtils.getReversedInt(sidechainCreationOutputBytes, currentOffset) currentOffset += 4 val amount: Long = BytesUtils.getReversedLong(sidechainCreationOutputBytes, currentOffset) currentOffset += 8 val address: Array[Byte] = BytesUtils.reverseBytes(sidechainCreationOutputBytes.slice(currentOffset, currentOffset + 32)) currentOffset += 32 val customDataLength: VarInt = BytesUtils.getReversedVarInt(sidechainCreationOutputBytes, currentOffset) currentOffset += customDataLength.size() val customData: Array[Byte] = sidechainCreationOutputBytes.slice(currentOffset, currentOffset + customDataLength.value().intValue()) currentOffset += customDataLength.value().intValue() val constantLength: VarInt = BytesUtils.getReversedVarInt(sidechainCreationOutputBytes, currentOffset) currentOffset += constantLength.size() val constant: Array[Byte] = sidechainCreationOutputBytes.slice(currentOffset, currentOffset + constantLength.value().intValue()) currentOffset += constantLength.value().intValue() val certVkSize: Int = CryptoLibProvider.sigProofThresholdCircuitFunctions.certVkSize() val certVk: Array[Byte] = sidechainCreationOutputBytes.slice(currentOffset, currentOffset + certVkSize) currentOffset += certVkSize new MainchainTxSidechainCreationCrosschainOutputData(sidechainCreationOutputBytes.slice(offset, currentOffset), withdrawalEpochLength, amount, address, customData, constant, certVk) } } class MainchainTxSidechainCreationCrosschainOutput(override val sidechainId: Array[Byte], data: MainchainTxSidechainCreationCrosschainOutputData) extends MainchainTxSidechainCreationCrosschainOutputData( data.sidechainCreationOutputBytes, data.withdrawalEpochLength, data.amount, data.address, data.customData, data.constant, data.certVk ) with MainchainTxCrosschainOutput { override val outputType: Byte = MainchainTxSidechainCreationCrosschainOutput.OUTPUT_TYPE override lazy val hash: Array[Byte] = BytesUtils.reverseBytes(Utils.doubleSHA256Hash(sidechainCreationOutputBytes)) } object MainchainTxSidechainCreationCrosschainOutput { val OUTPUT_TYPE: Byte = 3.toByte def calculateSidechainId(transactionHash: Array[Byte], index: Int): Array[Byte] = { BytesUtils.reverseBytes(Utils.doubleSHA256HashOfConcatenation(BytesUtils.reverseBytes(transactionHash), BytesUtils.reverseBytes(Ints.toByteArray(index)))) } }
Example 17
Source File: Scripts.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.it.test import java.nio.charset.StandardCharsets import com.google.common.primitives.Ints import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.bytes.codec.Base64 import com.wavesplatform.dex.domain.crypto.secureHash object Scripts { val alwaysTrue: ByteStr = fromBase64("AgZ7TN8j") val alwaysFalse: ByteStr = fromBase64("AgeJ1sz7") def fromBase64(x: String): ByteStr = ByteStr.decodeBase64(x).get private def renderScriptTemplate(binaryCode: Array[Byte], rawVariable: String, by: Array[Byte]): Array[Byte] = replaceFirst(binaryCode, rawVariable.getBytes(StandardCharsets.UTF_8), by) .getOrElse(throw new RuntimeException(s"Can't replace '$rawVariable'")) private def replaceFirst(where: Array[Byte], what: Array[Byte], by: Array[Byte]): Option[Array[Byte]] = { val i = where.indexOfSlice(what) if (i == -1) None else Some( Array.concat( where.slice(0, i - 4), Ints.toByteArray(by.length), by, where.drop(i + what.length) )) } }
Example 18
Source File: Block.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.it.config.genesis import java.io.ByteArrayOutputStream import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.dex.domain.account.{KeyPair, PublicKey} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.domain.crypto.Authorized import com.wavesplatform.dex.domain.error.ValidationError.GenericError import monix.eval.Coeval case class Block(timestamp: Long, version: Byte, reference: ByteStr, signerData: SignerData, consensusData: NxtLikeConsensusBlockData, transactionData: Seq[GenesisTransaction]) extends Authorized { override val sender: PublicKey = signerData.generator private val maxLength: Int = 150 * 1024 private val transactionField: Array[Byte] = { val serTxCount = Array(transactionData.size.toByte) val byteBuffer = new ByteArrayOutputStream(transactionData.size * maxLength / 2) byteBuffer.write(serTxCount, 0, serTxCount.length) transactionData.foreach { tx => val txBytes = tx.bytes() val txSize = Bytes.ensureCapacity(Ints.toByteArray(txBytes.length), 4, 0) byteBuffer.write(txSize, 0, txSize.length) byteBuffer.write(txBytes, 0, txBytes.length) } byteBuffer.toByteArray } val bytes: Coeval[Array[Byte]] = Coeval.evalOnce { val txBytesSize = transactionField.length val txBytes = Bytes.ensureCapacity(Ints.toByteArray(txBytesSize), 4, 0) ++ transactionField val consensusField = Bytes.ensureCapacity(Longs.toByteArray(consensusData.baseTarget), 8, 0) ++ consensusData.generationSignature.arr val cBytesSize = consensusField.length val cBytes = Bytes.ensureCapacity(Ints.toByteArray(cBytesSize), 4, 0) ++ consensusField Array(version) ++ Bytes.ensureCapacity(Longs.toByteArray(timestamp), 8, 0) ++ reference.arr ++ cBytes ++ txBytes ++ signerData.generator.arr ++ signerData.signature.arr } } object Block { val MaxFeaturesInBlock: Int = 64 val GeneratorSignatureLength: Int = 32 def build(version: Byte, timestamp: Long, reference: ByteStr, consensusData: NxtLikeConsensusBlockData, transactionData: Seq[GenesisTransaction], signerData: SignerData): Either[GenericError, Block] = { (for { _ <- Either.cond(reference.arr.length == crypto.SignatureLength, (), "Incorrect reference") _ <- Either.cond(consensusData.generationSignature.arr.length == GeneratorSignatureLength, (), "Incorrect consensusData.generationSignature") _ <- Either.cond(signerData.generator.length == crypto.KeyLength, (), "Incorrect signer") } yield Block(timestamp, version, reference, signerData, consensusData, transactionData)).left.map(GenericError(_)) } def buildAndSign(version: Byte, timestamp: Long, reference: ByteStr, consensusData: NxtLikeConsensusBlockData, transactionData: Seq[GenesisTransaction], signer: KeyPair): Either[GenericError, Block] = build(version, timestamp, reference, consensusData, transactionData, SignerData(signer, ByteStr.empty)).right .map(unsigned => unsigned.copy(signerData = SignerData(signer, ByteStr(crypto.sign(signer, unsigned.bytes.value))))) }
Example 19
Source File: PredefinedAccounts.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.it.config import java.nio.charset.StandardCharsets import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.it.config.GenesisConfig.generatorConfig import scala.collection.JavaConverters._ object PredefinedAccounts extends PredefinedAccounts { def generateNewAccount(seed: Array[Byte], nonce: Int): KeyPair = KeyPair(crypto.secureHash(Bytes.concat(Ints.toByteArray(nonce), seed))) } trait PredefinedAccounts { import PredefinedAccounts._ private val accounts: Map[String, KeyPair] = { val distributionsKey = "genesis-generator.distributions" val distributions = generatorConfig.getObject(distributionsKey) distributions .keySet() .asScala .map { accountName => val prefix = s"$distributionsKey.$accountName" val seedText = generatorConfig.getString(s"$prefix.seed-text") val nonce = generatorConfig.getInt(s"$prefix.nonce") accountName -> generateNewAccount(seedText.getBytes(StandardCharsets.UTF_8), nonce) } .toMap } val matcher: KeyPair = accounts("matcher") val alice: KeyPair = accounts("alice") val bob: KeyPair = accounts("bob") }
Example 20
Source File: EntityParser.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.domain.bytes.deser import cats.data.State import com.google.common.primitives.{Ints, Longs} import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.{ByteStr, deser} import com.wavesplatform.dex.domain.crypto.{KeyLength, Proofs, SignatureLength} import com.wavesplatform.dex.domain.utils._ import scala.util.Try trait EntityParser[E] { import EntityParser._ protected def read[R: Stateful]: Stateful[R] = implicitly private[domain] def statefulParse: Stateful[E] def parseBytes(bytes: Array[Byte]): Try[E] = Try { statefulParse.runA(S(0, bytes)).value } } object EntityParser { private[domain] final case class S(offset: Int, bytes: Array[Byte]) type Stateful[T] = State[S, T] type Signature = ByteStr private def standardRead[R](f: Array[Byte] => R, size: Int): Stateful[R] = State[S, R] { s => s.copy(offset = s.offset + size) -> f(s.bytes.slice(s.offset, s.offset + size)) } implicit val readByte: Stateful[Byte] = standardRead(_.head, 1) implicit val readInt: Stateful[Int] = standardRead(Ints.fromByteArray, 4) implicit val readLong: Stateful[Long] = standardRead(Longs.fromByteArray, 8) implicit val readPublicKey: Stateful[PublicKey] = standardRead(PublicKey.apply, KeyLength) implicit val readSignature: Stateful[Signature] = standardRead(ByteStr.apply, SignatureLength) implicit val readProofs: Stateful[Proofs] = State[S, Proofs] { s => val (proofs, length) = Proofs.fromBytes(s.bytes drop s.offset).explicitGet() s.copy(offset = s.offset + length) -> proofs } implicit val readAsset: Stateful[Asset] = State[S, Asset] { s => val (maybeByteArr, resultOffset) = deser.parseByteArrayOption(s.bytes, s.offset, Asset.AssetIdLength) s.copy(offset = resultOffset) -> maybeByteArr.fold[Asset](Waves)(arr => IssuedAsset(ByteStr(arr))) } }
Example 21
Source File: AccountStorage.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.db import java.io.{File, FileInputStream, FileOutputStream} import java.nio.file.Files import java.util.Base64 import cats.syntax.either._ import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.dex.crypto.Enigma import com.wavesplatform.dex.db.AccountStorage.Settings.EncryptedFile import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.crypto import net.ceedubs.ficus.readers.ValueReader import scala.collection.mutable.ArrayBuffer case class AccountStorage(keyPair: KeyPair) object AccountStorage { sealed trait Settings object Settings { case class InMem(seed: ByteStr) extends Settings case class EncryptedFile(path: File, password: String) extends Settings implicit val valueReader: ValueReader[Settings] = ValueReader.relative[Settings] { config => config.getString("type") match { case "in-mem" => InMem(Base64.getDecoder.decode(config.getString("in-mem.seed-in-base64"))) case "encrypted-file" => EncryptedFile( path = new File(config.getString("encrypted-file.path")), password = config.getString("encrypted-file.password") ) case x => throw new IllegalArgumentException(s"The type of account storage '$x' is unknown. Please update your settings.") } } } def load(settings: Settings): Either[String, AccountStorage] = settings match { case Settings.InMem(seed) => Right(AccountStorage(KeyPair(seed))) case Settings.EncryptedFile(file, password) => if (file.isFile) { val encryptedSeedBytes = readFile(file) val key = Enigma.prepareDefaultKey(password) val decryptedBytes = Enigma.decrypt(key, encryptedSeedBytes) AccountStorage(KeyPair(decryptedBytes)).asRight } else s"A file '${file.getAbsolutePath}' doesn't exist".asLeft } def save(seed: ByteStr, to: EncryptedFile): Unit = { Files.createDirectories(to.path.getParentFile.toPath) val key = Enigma.prepareDefaultKey(to.password) val encryptedSeedBytes = Enigma.encrypt(key, seed.arr) writeFile(to.path, encryptedSeedBytes) } def getAccountSeed(baseSeed: ByteStr, nonce: Int): ByteStr = ByteStr(crypto.secureHash(Bytes.concat(Ints.toByteArray(nonce), baseSeed))) def readFile(file: File): Array[Byte] = { val reader = new FileInputStream(file) try { val buff = new Array[Byte](1024) val r = new ArrayBuffer[Byte] while (reader.available() > 0) { val read = reader.read(buff) if (read > 0) { r.appendAll(buff.iterator.take(read)) } } r.toArray } finally { reader.close() } } def writeFile(file: File, bytes: Array[Byte]): Unit = { val writer = new FileOutputStream(file, false) try writer.write(bytes) finally writer.close() } }
Example 22
Source File: OrderBookSideSnapshotCodecs.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.codecs import java.math.BigInteger import java.nio.ByteBuffer import com.google.common.primitives.{Ints, Longs} import com.wavesplatform.dex.codecs.ByteBufferCodecs.ByteBufferExt import com.wavesplatform.dex.domain.model.Price import com.wavesplatform.dex.domain.order.{Order, OrderType} import com.wavesplatform.dex.model.{BuyLimitOrder, LimitOrder, OrderBookSideSnapshot, SellLimitOrder} import scala.collection.mutable object OrderBookSideSnapshotCodecs { def encode(dest: mutable.ArrayBuilder[Byte], snapshot: OrderBookSideSnapshot): Unit = { dest ++= Ints.toByteArray(snapshot.size) snapshot.foreach { case (price, xs) => dest ++= Longs.toByteArray(price) dest ++= Ints.toByteArray(xs.size) xs.foreach(encodeLoV2(dest, _)) } } def decode(bb: ByteBuffer): OrderBookSideSnapshot = { val snapshotSize = bb.getInt val r = Map.newBuilder[Price, Seq[LimitOrder]] (1 to snapshotSize).foreach { _ => val price = bb.getLong val levelSize = bb.getInt val limitOrders = (1 to levelSize).map(_ => decodeLo(bb)) r += price -> limitOrders } r.result() } def encodeLoV1(dest: mutable.ArrayBuilder[Byte], lo: LimitOrder): Unit = { dest ++= lo.order.orderType.bytes dest ++= Longs.toByteArray(lo.amount) dest ++= Longs.toByteArray(lo.fee) dest += lo.order.version val orderBytes = lo.order.bytes() dest ++= Ints.toByteArray(orderBytes.length) dest ++= orderBytes } def encodeLoV2(dest: mutable.ArrayBuilder[Byte], lo: LimitOrder): Unit = { val avgWeighedPriceNominatorBytes = lo.avgWeighedPriceNominator.toByteArray dest += 2 encodeLoV1(dest, lo) dest ++= Ints.toByteArray(avgWeighedPriceNominatorBytes.length) dest ++= avgWeighedPriceNominatorBytes } def decodeLo(bb: ByteBuffer): LimitOrder = { val header = bb.get val version = if (header == 2) 2 else 1 val orderType = if (version == 1) header else bb.get val amount = bb.getLong val fee = bb.getLong val orderVersion = bb.get val order = Order.fromBytes(orderVersion, bb.getBytes) val avgWeighedPriceNominator = if (version == 2) new BigInteger(bb.getBytes) else { val filledAmount = order.amount - amount (BigInt(order.price) * filledAmount).bigInteger } OrderType(orderType) match { case OrderType.SELL => SellLimitOrder(amount, fee, order, avgWeighedPriceNominator) case OrderType.BUY => BuyLimitOrder(amount, fee, order, avgWeighedPriceNominator) } } }