예제 #1
0
 /// <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);
 }
예제 #2
0
 /// <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;
 }
예제 #3
0
 /// <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;
 }
예제 #4
0
 /// <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);
 }
예제 #5
0
 /// <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;
 }
예제 #6
0
 /// <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);
 }
예제 #7
0
 /// <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ę
 }