Пример #1
0
 private void ProcessTranferFunds(TransferFundsBlock transferFundsBlock, ulong registryCombinedBlockHeight)
 {
     if (!_clientState.IsConfidential() && _clientState.GetPublicKeyHash().Equals32(transferFundsBlock.TargetOriginalHash))
     {
         _dataAccessService.StoreIncomingTransactionalBlock(transferFundsBlock.SyncBlockHeight, registryCombinedBlockHeight, transferFundsBlock.BlockHeight,
                                                            transferFundsBlock.BlockType, transferFundsBlock.Signer.Value.Span, transferFundsBlock.TagId, transferFundsBlock.RawData.Span, transferFundsBlock.TargetOriginalHash);
     }
 }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public bool SendFunds(uint amount, Account receiver)
        {
            //1. create block of type funds
            //2. create serializer for it
            //3. send block
            TransferFundsBlock block         = (TransferFundsBlock)CreateFundsBlock(amount, receiver);
            BlockBase          registerBlock = CreateRegisterBlock(block, block.TargetOriginalHash);

            return(_networkAdapter.SendTransaction(block, registerBlock));
        }
Пример #3
0
        public void TransferFundsBlockSerializerTests()
        {
            ulong tagId           = 113;
            ulong syncBlockHeight = 1;
            uint  nonce           = 4;

            byte[] powHash     = BinaryBuilder.GetPowHash(1234);
            ushort version     = 1;
            ulong  blockHeight = 9;

            byte[] prevHash = BinaryBuilder.GetDefaultHash(1234);
            byte[] body;

            ulong uptodateFunds = 10001;

            byte[] targetHash = BinaryBuilder.GetDefaultHash(1235);

            using (MemoryStream ms = new MemoryStream())
            {
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    bw.Write(tagId);
                    bw.Write(uptodateFunds);
                    bw.Write((uint)0);
                    bw.Write(targetHash);
                }

                body = ms.ToArray();
            }

            byte[] expectedPacket = BinaryBuilder.GetSignedPacket(PacketType.Transactional, syncBlockHeight, nonce, powHash, version,
                                                                  BlockTypes.Transaction_TransferFunds, blockHeight, prevHash, body, _privateKey, out byte[] expectedSignature);

            TransferFundsBlock block = new TransferFundsBlock
            {
                SyncBlockHeight    = syncBlockHeight,
                Nonce              = nonce,
                PowHash            = powHash,
                BlockHeight        = blockHeight,
                HashPrev           = prevHash,
                TagId              = tagId,
                UptodateFunds      = uptodateFunds,
                TargetOriginalHash = targetHash
            };

            TransferFundsBlockSerializer serializer = new TransferFundsBlockSerializer(_cryptoService, _identityKeyProvidersRegistry, _hashCalculationRepository);

            serializer.Initialize(block);

            byte[] actualPacket = serializer.GetBytes();

            Assert.Equal(expectedPacket, actualPacket);
        }
Пример #4
0
        private BlockBase CreateFundsBlock(ulong amount, Account receiver)
        {
            TransferFundsBlock fundsBlock = (TransferFundsBlock)_blockCreator.GetInstance(BlockTypes.Transaction_TransferFunds);

            fundsBlock.UptodateFunds      = 0;// transactionalBlockEssense.UpToDateFunds > 0 ? transactionalBlockEssense.UpToDateFunds - amount : 100000
            fundsBlock.TargetOriginalHash = receiver.PublicKey;

            FillHeightInfo(fundsBlock);
            FillSyncData(fundsBlock);
            FillRawData(fundsBlock);

            return(fundsBlock);
        }
Пример #5
0
        public void TransferFundsBlockSerializerTests()
        {
            ulong syncBlockHeight = 1;
            uint  nonce           = 4;

            byte[] powHash     = BinaryHelper.GetPowHash(1234);
            ushort version     = 1;
            ulong  blockHeight = 9;

            byte[] body;

            ulong uptodateFunds = 10001;

            byte[] targetHash = BinaryHelper.GetDefaultHash(1235);

            using (MemoryStream ms = new MemoryStream())
            {
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    bw.Write(uptodateFunds);
                    bw.Write(targetHash);
                }

                body = ms.ToArray();
            }

            byte[] expectedPacket = BinaryHelper.GetSignedPacket(PacketType.Transactional, syncBlockHeight, nonce, powHash, version,
                                                                 BlockTypes.Transaction_TransferFunds, blockHeight, null, body, _privateKey, out byte[] expectedSignature);

            TransferFundsBlock block = new TransferFundsBlock
            {
                SyncBlockHeight    = syncBlockHeight,
                Nonce              = nonce,
                PowHash            = powHash,
                BlockHeight        = blockHeight,
                UptodateFunds      = uptodateFunds,
                TargetOriginalHash = targetHash
            };

            TransferFundsBlockSerializer serializer = new TransferFundsBlockSerializer();

            serializer.Initialize(block);
            serializer.SerializeBody();
            _signingService.Sign(block);

            byte[] actualPacket = serializer.GetBytes();

            Assert.Equal(expectedPacket, actualPacket);
        }
Пример #6
0
        public void TransferFundsBlockParserTest()
        {
            ulong tagId           = 147;
            ulong syncBlockHeight = 1;
            uint  nonce           = 4;

            byte[] powHash     = BinaryBuilder.GetPowHash(1234);
            ushort version     = 1;
            ulong  blockHeight = 9;

            byte[] prevHash = BinaryBuilder.GetDefaultHash(1234);
            byte[] body;

            ulong uptodateFunds = 10001;

            byte[] targetOriginalHash = BinaryBuilder.GetDefaultHash(112233);

            using (MemoryStream ms = new MemoryStream())
            {
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    bw.Write(tagId);
                    bw.Write(uptodateFunds);
                    bw.Write((uint)0);
                    bw.Write(targetOriginalHash);
                }

                body = ms.ToArray();
            }

            byte[] packet = BinaryBuilder.GetSignedPacket(PacketType.Transactional, syncBlockHeight, nonce, powHash, version,
                                                          BlockTypes.Transaction_TransferFunds, blockHeight, prevHash, body, _privateKey, out byte[] expectedSignature);

            TransferFundsBlockParser parser = new TransferFundsBlockParser(_hashCalculationRepository, _identityKeyProvidersRegistry);
            TransferFundsBlock       block  = (TransferFundsBlock)parser.Parse(packet);

            Assert.Equal(syncBlockHeight, block.SyncBlockHeight);
            Assert.Equal(nonce, block.Nonce);
            Assert.Equal(powHash, block.PowHash);
            Assert.Equal(version, block.Version);
            Assert.Equal(blockHeight, block.BlockHeight);
            Assert.Equal(prevHash, block.HashPrev);
            Assert.Equal(uptodateFunds, block.UptodateFunds);
            Assert.Equal(targetOriginalHash, block.TargetOriginalHash);

            Assert.Equal(_publicKey, block.Signer.Value.ToArray());
            Assert.Equal(expectedSignature, block.Signature.ToArray());
        }
Пример #7
0
        protected override Memory <byte> ParseTransactional(ushort version, Memory <byte> spanBody, uint assetsCount, out TransactionalBlockBase transactionalBlockBase)
        {
            TransactionalBlockBase block = null;

            if (version == 1)
            {
                byte[] target = spanBody.Slice(0, Globals.DEFAULT_HASH_SIZE).ToArray();

                block = new TransferFundsBlock
                {
                    TargetOriginalHash = target
                };

                transactionalBlockBase = block;

                return(spanBody.Slice(Globals.DEFAULT_HASH_SIZE));
            }

            throw new BlockVersionNotSupportedException(version, BlockType);
        }
Пример #8
0
        public override void Start()
        {
            string  cmd     = null;
            Channel channel = new Channel("127.0.0.1", 5050, ChannelCredentials.Insecure);

            SyncManager.SyncManagerClient syncManagerClient = new SyncManager.SyncManagerClient(channel);
            TransactionalChainManager.TransactionalChainManagerClient transactionalChainManagerClient = new TransactionalChainManager.TransactionalChainManagerClient(channel);
            TransactionalBlockEssense transactionalBlockEssense = transactionalChainManagerClient.GetLastTransactionalBlock(
                new TransactionalBlockRequest {
                PublicKey = ByteString.CopyFrom(_key.Value.ToArray())
            });

            byte[] hashPrev      = transactionalBlockEssense.Hash.ToByteArray();
            ulong  blockHeight   = transactionalBlockEssense.Height + 1;
            ulong  uptodateFunds = transactionalBlockEssense.UpToDateFunds > 0 ? transactionalBlockEssense.UpToDateFunds : 100000;

            do
            {
                SyncBlockDescriptor lastSyncBlock = syncManagerClient.GetLastSyncBlock(new Empty());
                uptodateFunds -= 10;
                byte[] syncHash      = lastSyncBlock.Hash.ToByteArray();
                uint   nonce         = 1111;
                byte[] powHash       = GetPowHash(syncHash, nonce);
                byte[] targetAddress = GetRandomTargetAddress();

                TransferFundsBlock transferFundsBlock = new TransferFundsBlock
                {
                    SyncBlockHeight    = lastSyncBlock.Height,
                    BlockHeight        = blockHeight,
                    Nonce              = nonce,
                    PowHash            = powHash,
                    HashPrev           = hashPrev,
                    TargetOriginalHash = targetAddress,
                    UptodateFunds      = uptodateFunds
                };

                ISerializer transferFundsSerializer = _signatureSupportSerializersFactory.Create(transferFundsBlock);
                transferFundsSerializer.FillBodyAndRowBytes();

                RegistryRegisterBlock transactionRegisterBlock = new RegistryRegisterBlock
                {
                    SyncBlockHeight      = lastSyncBlock.Height,
                    BlockHeight          = blockHeight,
                    Nonce                = nonce,
                    PowHash              = powHash,
                    ReferencedPacketType = PacketType.Transactional,
                    ReferencedBlockType  = BlockTypes.Transaction_TransferFunds,
                    ReferencedBodyHash   = _hashCalculation.CalculateHash(transferFundsBlock.RawData),
                    ReferencedTarget     = targetAddress
                };

                ISerializer transactionRegisterBlockSerializer = _signatureSupportSerializersFactory.Create(transactionRegisterBlock);

                _log.Info($"Sending message: {transactionRegisterBlockSerializer.GetBytes().ToHexString()}");

                _communicationService.PostMessage(_keyTarget, transactionRegisterBlockSerializer);
                _communicationService.PostMessage(_keyTarget, transferFundsSerializer);

                Console.WriteLine("Block sent. Press <Enter> for next or type 'exit' and press <Enter> for exit...");
                cmd = Console.ReadLine();

                blockHeight++;
                hashPrev = transactionRegisterBlock.ReferencedBodyHash;
            } while (!_cancellationToken.IsCancellationRequested && cmd != "exit");
        }