Beispiel #1
0
        private async Task <Block> AssembleBlock(byte[] prevBlock, uint height, uint difficulty, CancellationToken cancellationToken)
        {
            var targetTxns = _unconfirmedTransactionPool.Get;

            targetTxns.Add(await _blockbaseBuilder.Build(_builderKeys, targetTxns));
            var merkleRoot = await _merkleTreeBuilder.BuildTree(targetTxns.Select(x => x.TransactionId).ToList());

            if (cancellationToken.IsCancellationRequested)
            {
                _logger.LogDebug($"Cancelled building block {height}");
                return(null);
            }

            var result = new Block()
            {
                Transactions   = targetTxns,
                MerkleRootNode = merkleRoot,
                Header         = new BlockHeader()
                {
                    MerkelRoot    = merkleRoot.Value,
                    Status        = BlockStatus.Unconfirmed,
                    Version       = _networkParameters.HeaderVersion,
                    Height        = height,
                    PreviousBlock = prevBlock,
                    Difficulty    = difficulty
                }
            };

            _logger.LogDebug($"Building consensus for block {height}");
            await _consensusMethod.BuildConsensus(result, cancellationToken);

            if (cancellationToken.IsCancellationRequested)
            {
                _logger.LogDebug($"Cancelled building block {height}");
                return(null);
            }

            _logger.LogDebug($"Built block {height} - {BitConverter.ToString(result.Header.BlockId)}");

            return(result);
        }