public bool IsChainValid() { Dictionary <string, TransactionOutput> tempUnspentTransactionOutputList = new Dictionary <string, TransactionOutput>(); //a temporary working list of unspent transactions at a given block state. tempUnspentTransactionOutputList.Add(BlockChain[0].TransactionData[0].OutputList[0].Id, BlockChain[0].TransactionData[0].OutputList[0]); for (int i = 1; i < BlockChain.Count; i++) { Block currentBlock = BlockChain[i]; Block previousBlock = BlockChain[i - 1]; if (currentBlock.CurrentBlockHash != currentBlock.CalculateHash()) { Console.WriteLine("#Block Hash is not equal : Block(" + i + ")"); return(false); } if (currentBlock.PreviousBlockHash != previousBlock.CurrentBlockHash) { Console.WriteLine("#Block Previous Hash is not equal : Block(" + i + ")"); return(false); } TransactionOutput tempOutput; for (int t = 0; t < currentBlock.TransactionData.Count; t++) { Transaction currentTransaction = currentBlock.TransactionData[t]; if (!currentTransaction.VerifiySignature()) { Console.WriteLine("!!! - Signature on Transaction(" + t + ") is Invalid"); return(false); } if (currentTransaction.GetInputsValue() != currentTransaction.GetOutputsValue()) { Console.WriteLine("!!! - Inputs are note equal to outputs on Transaction(" + t + ")"); return(false); } foreach (TransactionInput input in currentTransaction.InputList) { tempOutput = tempUnspentTransactionOutputList[input.TransactionOutputId]; if (tempOutput == null) { Console.WriteLine("!!! - Referenced input on Transaction(" + t + ") is Missing"); return(false); } if (input.UnspentTxOutput.Amount != tempOutput.Amount) { Console.WriteLine("!!! - Referenced input Transaction(" + t + ") value is Invalid"); return(false); } tempUnspentTransactionOutputList.Remove(input.TransactionOutputId); } foreach (TransactionOutput output in currentTransaction.OutputList) { tempUnspentTransactionOutputList.Add(output.Id, output); } if (currentTransaction.OutputList[0].Receiver != currentTransaction.Receiver) { Console.WriteLine("!!! - Transaction(" + t + ") output receiver is not who it should be"); return(false); } if (currentTransaction.OutputList[1].Receiver != currentTransaction.Sender) { Console.WriteLine("!!! - Transaction(" + t + ") output 'change' is not sender."); return(false); } } } return(true); }