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); }
public async Task <bool> Verify(Block block) { if (!_consensusMethod.VerifyConsensus(block)) { return(false); } var seed = block.Header.CombineHashableElementsWithNonce(block.Header.Nonce); var hash = _hasher.ComputeHash(seed); if (!hash.SequenceEqual(block.Header.BlockId)) { return(false); } var merkleRoot = await _merkleTreeBuilder.BuildTree(block.Transactions.Select(x => x.TransactionId).ToList()); if (!merkleRoot.Value.SequenceEqual(block.Header.MerkelRoot)) { return(false); } return(true); }
public async Task <byte[]> ResolveKey(Transaction txn) { var tree = await _merkleTreeBuilder.BuildTree(txn.Instructions.Select(x => x.InstructionId).ToList()); return(tree.Value); }