Esempio n. 1
0
 private BlockVm GenerateBlock(object @object)
 {
     try
     {
         BlockVm       block = (BlockVm)@object;
         Task <byte[]> hashGenerationProcess = new Task <byte[]>((obj) => BlockHashing.ComputeBlockHashPoW((BlockVm)obj), block);
         hashGenerationProcess.Start();
         while (!hashGenerationProcess.IsCompleted)
         {
             blockGenerationCancellToken.ThrowIfCancellationRequested();
             Task.Delay(250).Wait();
         }
         block.Header.Hash      = hashGenerationProcess.Result;
         block.Header.Sign      = Encryptor.GetSign(BlockHashing.GetBlockBytes(block), NodeData.Instance.NodeKeys.SignPrivateKey, NodeData.Instance.NodeKeys.Password);
         block.Header.SignKeyId = NodeData.Instance.NodeKeys.KeyId;
         using (BlockchainDbContext context = new BlockchainDbContext())
         {
             var resultBlock = context.Add(BlockBuilder.GetBlock(block));
             context.SaveChanges();
             return(BlockBuilder.GetBlockVm(resultBlock.Entity));
         }
     }
     catch (Exception ex)
     {
         throw new BlockGenerationException("An error occurred while generating the block.", ex);
     }
 }
 public async Task SaveBlockDataAsync(BlockVm block)
 {
     foreach (var segment in block.BlockSegments.OrderBy(opt => opt.SegmentHeader.BlockSegmentType))
     {
         await SaveBlockSegmentDataAsync(segment).ConfigureAwait(false);
     }
 }
Esempio n. 3
0
 public void HandleNewBlock(BlockVm block)
 {
     if (blockGenerationTask != null && !blockGenerationTask.IsCompleted)
     {
         blockGenerationCancellToken.Register(BlockGenerationCancelledHandleDelegate, block);
         cancellationTokenSource.Cancel();
     }
 }
Esempio n. 4
0
		/// <summary>
		/// Creates a report for the given block, fills all process reports
		/// </summary>
		/// <param name="block"></param>
		public BlockReportVm(BlockVm vm)
		{
			_parent = vm;
			UOW = new Dal.SoheilEdmContext();
			TaskDataService = new DataServices.TaskDataService(UOW);
			ProcessReportDataService = new DataServices.ProcessReportDataService(UOW);
			entity = new DataServices.BlockDataService(UOW).GetSingle(vm.Id);

			ReloadReports();
		}
Esempio n. 5
0
        private void BlockGenerationCancelledHandleDelegate(object blockObject)
        {
            BlockVm block = (BlockVm)blockObject;
            List <BlockSegmentVm> uniqueBlockSegments = currentSegments.Where(segment => !block.BlockSegments.Any(opt => opt.SegmentHash.SequenceEqual(segment.SegmentHash))).ToList();

            if (uniqueBlockSegments.Any())
            {
                AddSegments(uniqueBlockSegments);
            }
        }
Esempio n. 6
0
 public async void SendNewBlockNodeNoticeAsync(BlockVm block)
 {
     try
     {
         BlocksNodeNotice notice = new BlocksNodeNotice(Enums.NodeNoticeCode.NewBlocks, block);
         await SendNoticeToNodesAsync(notice).ConfigureAwait(false);
     }
     catch (Exception ex)
     {
         Logger.WriteLog(ex);
     }
 }
Esempio n. 7
0
        private async Task BeginBlockGenerationAsync()
        {
            if (blockGenerationTask == null || blockGenerationTask.IsCompleted)
            {
                IEnumerable <BlockSegmentVm> blockSegments;
                List <BlockSegmentVm>        resultBlockSegments = new List <BlockSegmentVm>();
                blockSegments = await cacheService.GetBlockSegments(MAX_BLOCK_SEGMENTS_COUNT).ConfigureAwait(false);

                resultBlockSegments.AddRange(await BlockSegmentsService.Instance.GetNonExistingSemgentsAsync(blockSegments).ConfigureAwait(false));
                var block = await BlocksService.FormFullBlockAsync(resultBlockSegments, NodeSettings.Configs.Node.Id).ConfigureAwait(false);

                currentSegments     = resultBlockSegments;
                blockGenerationTask = Task <BlockVm> .Factory.StartNew(GenerateBlock, block, blockGenerationCancellToken);

                try
                {
                    BlockVm generatedBlock = await blockGenerationTask.ConfigureAwait(true);

                    NodeNoticeService.SendNewBlockNodeNoticeAsync(generatedBlock);
                    await LicensorClient.Instance.AddNewBlockAsync(generatedBlock).ConfigureAwait(false);
                }
                catch (BlockGenerationException)
                {
                    blockGenerationTask.Dispose();
                    cancellationTokenSource     = new CancellationTokenSource();
                    blockGenerationCancellToken = cancellationTokenSource.Token;
                }
                catch (TaskCanceledException)
                {
                    blockGenerationTask.Dispose();
                    cancellationTokenSource     = new CancellationTokenSource();
                    blockGenerationCancellToken = cancellationTokenSource.Token;
                }
                catch (Exception ex)
                {
                    Logger.WriteLog(ex);
                }
                finally
                {
                    blockGenerationTask = null;
                }
            }
        }
Esempio n. 8
0
        public async Task AddNewBlockAsync(BlockVm block)
        {
            if (!await TryConnectAsync().ConfigureAwait(false))
            {
                return;
            }
            AddNewBlockRequest request = new AddNewBlockRequest(block);

            await SendRequestAsync(request).ConfigureAwait(false);

            var response = await GetResponseAsync(request).ConfigureAwait(false);

            if (response is ResultResponse resultResponse)
            {
                if (!string.IsNullOrWhiteSpace(resultResponse.ErrorMessage))
                {
                    BlockchainSynchronizationService synchronizationService = new BlockchainSynchronizationService();
                    await synchronizationService.CheckAndSyncBlockchainAsync().ConfigureAwait(false);
                }
            }
        }
Esempio n. 9
0
 public BlocksNodeNotice(NodeNoticeCode noticeCode, BlockVm block)
 {
     Block      = block;
     NoticeCode = noticeCode;
 }
 public void HandleNewBlock(BlockVm block)
 {
     _blockGenerationHelper.HandleNewBlock(block);
 }