diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java index b5a5b0a5158a48bfcf3daabb3863106a9f558879..d9cda316c1c764bd2e89c3206c7f8121d011544a 100644 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -45,7 +45,7 @@ public class Blockchain { // Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter // dans la transaction pool; - public void createTransaction() { + public void createTransaction() throws InterruptedException { List<Wallet> walletsCopy = new ArrayList<>(); walletsCopy.addAll(wallets); Wallet walletSender = selectWallet(walletsCopy); @@ -58,21 +58,33 @@ public class Blockchain { System.out.println("Wallets vides"); return; } - System.out.println("[TRANSACTION] --- Création d'une transaction =========================================\n"); System.out.println(" " + walletSender.getName() + " envoie " + randomAmountToSend + " à " + walletReceiver.getName() + "\n"); - Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL); + + Transaction tx = new Transaction(walletSender, walletReceiver, EnumTypeTransaction.NORMAL); + tx.putUTxO(walletSender, walletReceiver, randomAmountToSend); + + Blockchain.utxos.addAll(tx.getOutputs()); + Blockchain.utxos.removeAll(tx.getInputs()); String transactionData = getTransactionData(tx); + try { - byte[] signature = sign(transactionData, walletSender.getKeyPair().getPrivate()); - System.out.println("[SIGNATURE] --- Signature de la transaction : " + signature); - tx.setSignature(signature); - if (verifySignature(transactionData, signature, walletSender.getKeyPair().getPublic())) { + if (makeFakeSign()) { + Wallet fakeWallet = new Wallet("FakeWallet"); + tx.sign(transactionData, fakeWallet.getKeyPair().getPrivate()); + } else { + tx.sign(transactionData, walletSender.getKeyPair().getPrivate()); + } + System.out.println("[SIGNATURE] --- Signature de la transaction : " + tx.getSignature()); + if (tx.verifySignature(transactionData, walletSender.getKeyPair().getPublic())) { System.out.println("[SIGNATURE] --- Signature vérifiée"); Blockchain.transactionsPool.add(tx); } else { System.out.println("[SIGNATURE] --- Signature non valide : TRANSACTION REJETEE"); + Blockchain.utxos.removeAll(tx.getOutputs()); + Blockchain.utxos.addAll(tx.getInputs()); + return; } } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { e.printStackTrace(); @@ -84,21 +96,10 @@ public class Blockchain { return tx.getInputs().toString() + tx.getOutputs().toString() + tx.getId(); } - public byte[] sign(String data, PrivateKey privateKey) - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { - Signature signature = Signature.getInstance("SHA256withRSA"); - signature.initSign(privateKey); - signature.update(data.getBytes()); - return signature.sign(); - } - - public boolean verifySignature(String data, byte[] signature, PublicKey publicKey) - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { - Signature sign = Signature.getInstance("SHA256withRSA"); - sign.initVerify(publicKey); - sign.update(data.getBytes()); - System.out.println("[SIGNATURE] --- Vérification de la signature : " + signature.toString()); - return sign.verify(signature); + public boolean makeFakeSign() { + int num1 = (int) (Math.random() * 5) + 1; + int num2 = (int) (Math.random() * 5) + 1; + return num1 == num2; } public Wallet selectWallet(List<Wallet> wallets) { @@ -118,7 +119,6 @@ public class Blockchain { i++; } return null; - } public void addBloc(Bloc bloc) { diff --git a/src/main/java/fr/miage/Transaction.java b/src/main/java/fr/miage/Transaction.java index 10cfdd3cd6f372495fc8b9362abe7e44a8c42e19..e25078855e038561cf420f444adda42654b5847f 100644 --- a/src/main/java/fr/miage/Transaction.java +++ b/src/main/java/fr/miage/Transaction.java @@ -1,6 +1,11 @@ package fr.miage; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; import java.security.PublicKey; +import java.security.Signature; +import java.security.SignatureException; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -22,35 +27,44 @@ public class Transaction { this.id = UUID.randomUUID(); } - public Transaction(Wallet sender, Wallet receiver, double amount, EnumTypeTransaction typeTransaction) { + public Transaction(Wallet sender, Wallet receiver, EnumTypeTransaction typeTransaction) { + this.sender = sender; + this.receiver = receiver; + this.typeTransaction = typeTransaction.NORMAL; + this.id = UUID.randomUUID(); + } + + public void putUTxO(Wallet sender, Wallet receiver, double amount) { this.inputs = sender.getUTxOsForTransaction(amount); - // System.out.println("Inputs : " + this.inputs); - // System.out.println("Set UTxO : " + Blockchain.utxos); - if (inputs != null) { - if (isValidTransaction(inputs)) { - this.sender = sender; - this.receiver = receiver; - this.typeTransaction = typeTransaction.NORMAL; - this.id = UUID.randomUUID(); - UTxO utxoAmount = new UTxO(this.id, UUID.randomUUID(), receiver.getKeyPair().getPublic(), amount); - - this.receiver.addUTxO(utxoAmount); - UTxO utxoRest = new UTxO(this.id, UUID.randomUUID(), sender.getKeyPair().getPublic(), - getTotalAmountUtxoInput(inputs) - amount); - this.sender.addUTxO(utxoRest); - this.outputs = Arrays.asList(utxoAmount, utxoRest); - for (UTxO utxo : this.inputs) { - Blockchain.utxos.add(utxo); - } - Blockchain.utxos.addAll(this.outputs); - printUtxoDetails(inputs, outputs); - } else { - System.err.println("Transaction invalide, utxo absent"); - } - } else { - System.out.println("Solde insuffisant"); + UTxO utxoAmount = new UTxO(this.id, UUID.randomUUID(), receiver.getKeyPair().getPublic(), amount); + this.receiver.addUTxO(utxoAmount); + UTxO utxoRest = new UTxO(this.id, UUID.randomUUID(), sender.getKeyPair().getPublic(), + getTotalAmountUtxoInput(inputs) - amount); + this.sender.addUTxO(utxoRest); + this.outputs = Arrays.asList(utxoAmount, utxoRest); + for (UTxO utxo : this.inputs) { + Blockchain.utxos.add(utxo); } - Blockchain.utxos.removeAll(this.inputs); + + printUtxoDetails(inputs, outputs); + + } + + public void sign(String data, PrivateKey privateKey) + throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(data.getBytes()); + this.signature = signature.sign(); + } + + public boolean verifySignature(String data, PublicKey publicKey) + throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { + Signature sign = Signature.getInstance("SHA256withRSA"); + sign.initVerify(publicKey); + sign.update(data.getBytes()); + System.out.println("[SIGNATURE] --- Vérification de la signature : " + signature.toString()); + return sign.verify(signature); } public void printUtxoDetails(List<UTxO> inputs, List<UTxO> outputs) { diff --git a/src/main/java/fr/miage/threads/TransactionCreator.java b/src/main/java/fr/miage/threads/TransactionCreator.java index 0a81c840242c79d5fe4d9404eb2d2dfd97a60e5a..bff9b62e9c5c44674050da1f84574ae971a6bce2 100644 --- a/src/main/java/fr/miage/threads/TransactionCreator.java +++ b/src/main/java/fr/miage/threads/TransactionCreator.java @@ -15,7 +15,12 @@ public class TransactionCreator extends Thread { public void run() { while (true) { - blockchain.createTransaction(); + try { + blockchain.createTransaction(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } System.out.println( "[POOL] Nombre de transaction dans la pool : " + Blockchain.transactionsPool.size() + "\n"); try {