/// <summary> /// Weryfikacja transakcji na podstawie podpisu cyfrowego /// </summary> /// <param name="TX"></param> /// <returns></returns> public static bool verifyTransaction(Transaction TX) { byte[] publicKeySender = Base58CheckEncoding.DecodePlain(TX.publicKeySender); byte[] signature = Base58CheckEncoding.DecodePlain(TX.signature); byte[] TxDataToSign = Base58CheckEncoding.DecodePlain(TX.hashTX); return verifyData(publicKeySender, signature, TxDataToSign); }
/// <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> /// Dodanie transakcji do ogólnego rejestru wszystkich transakcji /// </summary> /// <param name="transaction"></param> public void addTransaction(Transaction transaction) { transactionsInAllBlocks.Add(transaction); blocks[indexOfCurrentBlock].transactionList.Add(transaction); }
/// <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> /// Weryfikacja na podstawie klucza publicznego, podpisu i podpisanych danych /// </summary> /// <param name="TX"></param> /// <returns></returns> public static bool checkHash(Transaction TX) { return TX.getHashTX().Equals(TX.hashTX); }
/// <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ę }