private void HandleTransactionData(IAsyncResult ar)
        {
            var state = (StateObject)ar.AsyncState;

            try
            {
                using (var scope = _serviceProvider.CreateScope())
                {
                    Transaction transaction = state.Transaction;

                    transaction.Id       = 0;
                    transaction.Input.Id = 0;
                    transaction.Outputs.ForEach(o => o.Id = 0);

                    _transactionPoolService = scope.ServiceProvider.GetService <TransactionPoolService>();
                    _transactionPoolService.UpdateOrAddTransaction(transaction);

                    Console.WriteLine("Received Transaction : ");
                    Console.WriteLine(Encoding.UTF8.GetString(state.buffer));
                }
            }
            finally
            {
                messageManualReset.Set();
                state.workSocket.EndReceive(ar);
            }
        }
        private void BlockchainMessageHandler(Socket socket)
        {
            Task.Run(() =>
            {
                while (true)
                {
                    messageManualReset.Reset();

                    StateObject state = new StateObject
                    {
                        workSocket = socket
                    };

                    byte[] messageType = new byte[1];
                    socket.Receive(messageType);

                    AsyncCallback handler = HandleTransactionData;

                    if ((MessageType)messageType.First() == MessageType.Blockchain)
                    {
                        handler = HandleBlockchainData;
                    }
                    else if ((MessageType)messageType.First() == MessageType.Transaction)
                    {
                        handler = HandleTransactionData;
                    }
                    else if ((MessageType)messageType.First() == MessageType.ClearTransaction)
                    {
                        using (var scope = _serviceProvider.CreateScope())
                        {
                            _transactionPoolService = scope.ServiceProvider.GetService <TransactionPoolService>();
                            _transactionPoolService.ClearPool();
                            messageManualReset.Set();
                            continue;
                        }
                    }

                    byte[] bufferSize = new byte[4];
                    socket.Receive(bufferSize);

                    //Little Endian
                    state.BufferSize = BitConverter.ToInt32(bufferSize.Reverse().ToArray());

                    try
                    {
                        socket.BeginReceive(state.buffer, 0, state.BufferSize, SocketFlags.None, handler, state);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    finally
                    {
                        messageManualReset.WaitOne();
                    }
                }
            });
        }
        public async Task IterationCleanup()
        {
            await _transactionManager.RemoveTransactionsAsync(_transactionIdList);

            await TransactionPoolService.CleanByTransactionIdsAsync(_transactionIdList);

            await TransactionPoolService.UpdateTransactionPoolByBestChainAsync(_chain.BestChainHash,
                                                                               _chain.BestChainHeight);

            _transactionIdList.Clear();
        }
        public async Task MineWithTxHubAsync()
        {
            var txCount        = 0;
            var preBlockHash   = _chain.BestChainHash;
            var preBlockHeight = _chain.BestChainHeight;

            while (txCount < TransactionCount)
            {
                var blockExecutedSet = await _minerService.MineAsync(preBlockHash, preBlockHeight,
                                                                     TimestampHelper.GetUtcNow(), TimestampHelper.DurationFromMilliseconds(4000));

                txCount += blockExecutedSet.TransactionIds.Count();
                _transactionIdList.AddRange(blockExecutedSet.TransactionIds.ToList());
                await BlockchainService.SetBestChainAsync(_chain, preBlockHeight, preBlockHash);

                await TransactionPoolService.CleanByTransactionIdsAsync(blockExecutedSet.TransactionIds);

                await TransactionPoolService.UpdateTransactionPoolByBestChainAsync(preBlockHash, preBlockHeight);
            }
        }
        private void HandleTransactionData(IAsyncResult ar)
        {
            var state = (StateObject)ar.AsyncState;

            try
            {
                Transaction transaction = state.Transaction;

                _transactionPoolService = _serviceProvider.GetService <TransactionPoolService>();
                _transactionPoolService.UpdateOrAddTransaction(transaction);

                Console.WriteLine("Received Transaction : ");
                Console.WriteLine(Encoding.UTF8.GetString(state.buffer));
            }
            finally
            {
                messageManualReset.Set();
                state.workSocket.EndReceive(ar);
            }
        }
        private async Task AddTransactionsToTxHub(int txCount)
        {
            var txList = await GenerateTransferTransactionsAsync(txCount);

            await TransactionPoolService.AddTransactionsAsync(txList);
        }