/// <summary> /// Powórzona transakcja w bloku /// </summary> /// <param name="blockChain"></param> /// <param name="TX"></param> /// <returns></returns> public static bool transactionAlreadyInBlock(BlockChain blockChain, Transaction TX) { foreach (Transaction transaction in blockChain.transactionsInAllBlocks) if( transaction.hashTX.Equals(TX.hashTX)) return true; return false; }
/// <summary> /// Sprawdzamy, czy którykolwiek z inputów został już wydany, tzn czy znajduje się w inputTXhash, w jakiejkolwiek innej transakcji /// </summary> /// <param name="blockChain"></param> /// <param name="TX"></param> /// <returns></returns> public static bool doubleSpending(BlockChain blockChain, Transaction TX) { //Sprawdzamy, czy którykolwiek z inputów został już wydany, tzn czy znajduje się w inputTXhash, w jakiejkolwiek innej transakcji List<String> inputTransactionHashes = TX.inputTXhash; foreach (String inputHash in inputTransactionHashes) foreach(Transaction transaction in blockChain.transactionsInAllBlocks) if (transaction.inputTXhash.Contains(inputHash)) if(transaction.addressBTC_Sender.Equals(TX.addressBTC_Sender)) return true; return false; }
/// <summary> /// Poprawna liczba BTC w transakcji /// </summary> /// <param name="blockChain"></param> /// <param name="TX"></param> /// <returns></returns> public static bool correctAmountOfBTC(BlockChain blockChain, Transaction TX) { if (TX.inputBTC == (TX.outputBTC_Receiver + TX.outputBTC_Sender)) return true; else return false; }
/// <summary> /// Aktualizacja bloku niewydanych transakcji dla węzła o podanych adresie. /// </summary> /// <param name="blockChain"></param> /// <param name="nodeAddress"></param> /// <returns></returns> public static List<Transaction> updateTransactionList(BlockChain blockChain, String nodeAddress) { //Znajdź wszystkie transakcje, które w outputAddress mają adres Węzła proszącego o UpdateBlock (otrzymujemy listę transakcji, które zasiliły dany Wezeł) List<Transaction> outputTransactions = blockChain.transactionsInAllBlocks.FindAll(transaction => transaction.addressBTC_Receiver.Equals(nodeAddress) || transaction.addressBTC_Sender.Equals(nodeAddress)); List<Transaction> alreadySpentTransactions = new List<Transaction>(); // Wyklucz z list outputTransaction wszystkie transakcje, które zostały już wydane - hashe wydanych transakcji znajdują się w inputTxhash foreach (Transaction outputTX in outputTransactions) foreach (Transaction allTX in blockChain.transactionsInAllBlocks) foreach (string inputHash in allTX.inputTXhash) if (outputTX.hashTX.Equals(inputHash)) if (allTX.addressBTC_Sender.Equals(nodeAddress)) alreadySpentTransactions.Add(outputTX); return outputTransactions.Except(alreadySpentTransactions).ToList(); }
/// <summary> /// Sprawdzamy poprawność wejściowych transakcji. /// </summary> /// <param name="blockChain"></param> /// <param name="TX"></param> /// <returns></returns> public static bool validInputTransactions(BlockChain blockChain, Transaction TX) { //Wydobywamy, na podstawie hashy, listę wejściowych transakcji z blockchain List<Transaction> inputTransactions = new List<Transaction>(); int inputBTC = 0; foreach (String inputHash in TX.inputTXhash) { Transaction foundTX = (blockChain.transactionsInAllBlocks.Find(transaction => transaction.hashTX.Equals(inputHash))); if(foundTX != null) inputTransactions.Add(foundTX); } if (inputTransactions.Count == 0) return false; // Sprawdzamy, czy hajs się zgadza foreach (Transaction transaction in inputTransactions) { if (transaction.addressBTC_Receiver.Equals(TX.addressBTC_Sender)) inputBTC += transaction.outputBTC_Receiver; if (transaction.addressBTC_Sender.Equals(TX.addressBTC_Sender)) inputBTC += transaction.outputBTC_Sender; } if (inputBTC == (TX.outputBTC_Receiver + TX.outputBTC_Sender)) return true; //Zgadza się return false; //Nie zgadza się }