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); } }
/// <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)); }
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); }
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); }
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); }
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()); }
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); }
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"); }