Exemple #1
0
        /// <summary>
        /// Add new item to blockchain
        /// Block will be created and be mined
        /// </summary>
        /// <param name="blockChain">Instance of blockchain class</param>
        /// <param name="data">Data of block</param>
        /// <param name="target">Target of block, will be saved as bits in blockheader</param>
        /// <param name="token">CancellationToken to stop mining. Use (CancellationTokenSource).Token</param>
        public static async Task Add <T>(this BlockChain <T> blockChain, T data, Target target = null, CancellationToken token = new CancellationToken())
            where T : IBlockData, new()
        {
            var prevBlock = blockChain.First();

            target ??= prevBlock.GetBlockHeader().GetTarget();
            var block = Block <T> .Create(prevBlock.Hash(blockChain.GetHashingAlgorithm()), data, target, blockChain.GetHashingAlgorithm());

            block = await block.Mine(token);

            if (block != null)
            {
                blockChain.Add(block);
            }
        }
Exemple #2
0
        private static bool _Verify <T>(BlockChain <T> blockChain) where T : IBlockData, new()
        {
            var sha256 = blockChain.GetHashingAlgorithm();
            var block  = blockChain.First();

            foreach (var prevBlock in blockChain.Skip(1))
            {
                if (!block.IsValid(prevBlock.Hash(sha256), sha256))
                {
                    return(false);
                }
                block = prevBlock;
            }

            return(true);
        }