diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 9c80ff7151c0c744b384abb047561d4d60cce3f8..0000000000000000000000000000000000000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e0f15db2eb22b5d618150277e48b741f8fdd277a..0000000000000000000000000000000000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "java.configuration.updateBuildConfiguration": "automatic" -} \ No newline at end of file diff --git a/keystore.jks b/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..4113915d016bb4e87cb93f1512cc2661b45a4271 Binary files /dev/null and b/keystore.jks differ diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index fbb6cd10b24a60f472c9b06770d7b373e8fec9d2..0000000000000000000000000000000000000000 Binary files a/src/.DS_Store and /dev/null differ diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java old mode 100755 new mode 100644 index e0cad8e119eec02f02fdc838d449c085c2cef9ad..c0f367308ccf4cff9796efb8700f38f776a1c106 --- a/src/main/java/fr/miage/App.java +++ b/src/main/java/fr/miage/App.java @@ -1,65 +1,62 @@ package fr.miage; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; /** * Hello world! * */ -public class App -{ - public static void main( String[] args ) throws NoSuchAlgorithmException, InterruptedException - { +public class App { + public static void main(String[] args) throws NoSuchAlgorithmException, InterruptedException { System.out.println("Début de la blockchain"); // Création de 2 wallets Wallet bobWallet = new Wallet("jesuislacleprivedebob", "bob"); - //Wallet aliceWallet = new Wallet("je suis la clé privé de alice", "alice"); + Wallet aliceWallet = new Wallet("je suis la clé privé de alice", "alice"); - Set<Wallet> wallets = new HashSet<Wallet>() { - { - add(bobWallet); - //add(aliceWallet); - } - }; + List<Wallet> wallets = Arrays.asList(bobWallet, aliceWallet); Blockchain blockchain = new Blockchain("BloBlockchain", wallets); - + System.out.println("Wallet de bob : " + bobWallet.getUtxos()); + System.out.println("Wallet de alice : " + aliceWallet.getUtxos()); // System.out.println("Utxos du wallet de bob : " + bobWallet.getUtxos()); // System.out.println("Utxos du wallet de alice : " + aliceWallet.getUtxos()); - // Transaction transaction = new Transaction(bobWallet, aliceWallet, 2, EnumTypeTransaction.NORMAL); + // Transaction transaction = new Transaction(bobWallet, aliceWallet, 2, + // EnumTypeTransaction.NORMAL); // System.out.println("Transaction : "); // System.out.println("Bob envoie : " + transaction.getInputs()); // System.out.println("Alice reçoit : " + transaction.getOutputs()); // System.out.println(transaction); - - // int i = 1; - // while(blockchain.transactionsPool.size() <20){ - // System.out.println("Transaction n°" + i); - // blockchain.createTrasaction(); - // i++; - // } + int i = 1; + while (blockchain.transactionsPool.size() < 20) { + System.out.println("Transaction n°" + i); + blockchain.createTrasaction(); + i++; + } + System.out.println("Transactions pool count : " + blockchain.transactionsPool.size()); // // print all utxo in the utxo set // for (UTxO utxo : Blockchain.utxos) { - // System.out.println("UTXO ID: " + utxo); + // System.out.println("UTXO ID: " + utxo); // } - - //TODO : S'asurer de créer une bonne transaction avec les UTxO etc... - //TODO : Faire la signature de la transaction + + // TODO : S'asurer de créer une bonne transaction avec les UTxO etc... + // TODO : Faire la signature de la transaction // // Set<Wallet> wallets = new HashSet<Wallet>() { - // { - // add(bobWallet); - // add(aliceWallet); - // } + // { + // add(bobWallet); + // add(aliceWallet); + // } // }; // // Création de la blockchain - // // MinageManager minageManager = new MinageManager(blockchain); // // minageManager.mineABloc(); } diff --git a/src/main/java/fr/miage/Bloc.java b/src/main/java/fr/miage/Bloc.java index 00e64ee2fabb2e93597ba8f24ae55ccc2ad9cbbb..f0a5a42f26a6bea96266904a9e4ec153bcf18496 100644 --- a/src/main/java/fr/miage/Bloc.java +++ b/src/main/java/fr/miage/Bloc.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Set; +import java.util.UUID; import org.apache.commons.codec.digest.DigestUtils; @@ -46,11 +47,11 @@ public class Bloc { this.transactions = transactions; } - public static Bloc createGenuineBloc(Set<Wallet> wallets) { + public static Bloc createGenuineBloc(List<Wallet> wallets) { List<Transaction> transactions = new ArrayList<Transaction>(); for (Wallet wallet : wallets) { int amount = RandomNumberGenerator.getRandomNumber(1, 20); - UTxO utxo = new UTxO(null, amount); + UTxO utxo = new UTxO(null, wallet.getPublicKey(), amount); wallet.addUTxO(utxo); Blockchain.utxos.add(utxo); List<UTxO> utxos = new ArrayList<UTxO>() { @@ -58,10 +59,11 @@ public class Bloc { add(utxo); } }; - + Coinbase coinbase = new Coinbase(utxos, wallet.getPublicKey(), EnumTypeTransaction.COINBASE); transactions.add(coinbase); } + System.out.println("Set UTxO INITIAL " + Blockchain.utxos); BlocHeader blocHeader = new BlocHeader("", Instant.now().toEpochMilli(), 0); String header = blocHeader.toString(); @@ -88,13 +90,12 @@ public class Bloc { } } - @Override public String toString() { return "{" + - " hash='" + getHash() + "'" + - ", transactions='" + getTransactions() + "'" + - ", header='" + getHeader() + "'" + - "}"; + " hash='" + getHash() + "'" + + ", transactions='" + getTransactions() + "'" + + ", header='" + getHeader() + "'" + + "}"; } } diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java old mode 100755 new mode 100644 index 8accd917ecd4946073a443744a98e604fc2d1ff6..bab320cdeb24e7ed430b894ca1dd0506da7b7975 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -1,5 +1,7 @@ package fr.miage; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -7,13 +9,13 @@ import java.util.Random; import java.util.Set; public class Blockchain { - private String name; + private String name; private LinkedList<Bloc> blocs; - private Set<Wallet> wallets; + private List<Wallet> wallets; public static Set<UTxO> utxos = new HashSet<>(); public Set<Transaction> transactionsPool = new HashSet<>(); - public Blockchain(String name, Set<Wallet> wallets) { + public Blockchain(String name, List<Wallet> wallets) { this.name = name; this.wallets = wallets; // Création du premier bloc contenant les transactions de coinbase @@ -25,28 +27,49 @@ public class Blockchain { ; } - //Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter dans la transaction pool; - public void createTrasaction(){ - //Random wallet selection - Set<Wallet> walletsCopy = new HashSet<>(wallets); + // Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter + // dans la transaction pool; + public void createTrasaction() { + // Random wallet selection + List<Wallet> walletsCopy = new ArrayList<>(); + walletsCopy.addAll(wallets); - int walletIndexSender = new Random().nextInt(walletsCopy.size()); - Wallet walletSender = selectWallet(walletIndexSender); + Wallet walletSender = selectWallet(walletsCopy); walletsCopy.remove(walletSender); - int walletIndexReceiver = new Random().nextInt(walletsCopy.size()); - Wallet walletReceiver = selectWallet(walletIndexReceiver); + Wallet walletReceiver = selectWallet(walletsCopy); + walletsCopy.remove(walletReceiver); double amountWalletSender = walletSender.getUtxos().stream().mapToDouble(utxo -> utxo.getMontant()).sum(); - double randomAmountToSend = new Random().nextInt((int) amountWalletSender); + double randomAmountToSend = new Random().nextDouble(amountWalletSender); + System.out.println("Amount to send : " + randomAmountToSend); + System.out.println("Envoie de " + walletSender.getName() + " à " + walletReceiver.getName()); + System.out.println(); + System.out.println("Utxos de " + walletSender.getName() + " : " + walletSender.getUtxos()); + System.out.println("Utxos de " + walletReceiver.getName() + " : " + walletReceiver.getUtxos()); + System.out.println(); + if (walletSender.getUtxos().isEmpty() || walletReceiver.getUtxos().isEmpty()) { + System.out.println("Wallets vides"); + return; + } + Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL); + this.transactionsPool.add(tx); } - public Wallet selectWallet(int index){ + public Wallet selectWallet(List<Wallet> wallets) { + if (wallets.size() == 0) { + return null; + } + if (wallets.size() == 1) { + return wallets.get(0); + } + int index = new Random().nextInt(wallets.size()); + int i = 0; for (Wallet wallet : wallets) { - if(i == index){ + if (i == index) { return wallet; } i++; @@ -71,16 +94,16 @@ public class Blockchain { return this.blocs; } - public Set<Wallet> getWallets() { + public List<Wallet> getWallets() { return this.wallets; } @Override public String toString() { return "{" + - " name='" + getName() + "'" + - ", blocs='" + getBlocs() + "'" + - ", wallets='" + getWallets() + "'" + - "}"; + " name='" + getName() + "'" + + ", blocs='" + getBlocs() + "'" + + ", wallets='" + getWallets() + "'" + + "}"; } } diff --git a/src/main/java/fr/miage/Transaction.java b/src/main/java/fr/miage/Transaction.java old mode 100755 new mode 100644 index e52ca8e455eb1422b73794ea3df8a73474721c38..4835dcd305b5a68e965680b90806ae18c74699bc --- a/src/main/java/fr/miage/Transaction.java +++ b/src/main/java/fr/miage/Transaction.java @@ -13,7 +13,7 @@ public class Transaction { private Wallet sender; private Wallet receiver; private List<UTxO> inputs; - private List<UTxO> outputs; + private List<UTxO> outputs; private EnumTypeTransaction typeTransaction; public Transaction(List<UTxO> inputs, List<UTxO> outputs, String signature, EnumTypeTransaction typeTransaction) { @@ -23,36 +23,37 @@ public class Transaction { this.id = UUID.randomUUID(); } - public Transaction(Wallet sender, Wallet receiver ,double amount, EnumTypeTransaction typeTransaction) { + public Transaction(Wallet sender, Wallet receiver, double amount, EnumTypeTransaction typeTransaction) { this.inputs = sender.getUTxOsForTransaction(amount); - if (inputs != null ) { - if(isValidTransaction(inputs)){ + 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(receiver.getPublicKey(), getTotalAmountUtxoInput(inputs)); // peut etre changr par amout + UTxO utxoAmount = new UTxO(this.id, receiver.getPublicKey(), amount); // peut + // etre + // changr par + // amout this.receiver.addUTxO(utxoAmount); - UTxO utxoRest = new UTxO(sender.getPublicKey(), getTotalAmountUtxoInput(inputs) - amount); + UTxO utxoRest = new UTxO(this.id, sender.getPublicKey(), getTotalAmountUtxoInput(inputs) - amount); this.sender.addUTxO(utxoRest); this.outputs = Arrays.asList(utxoAmount, utxoRest); - updateSetUtxo(); + Blockchain.utxos.addAll(this.outputs); } else { System.err.println("Transaction invalide, utxo absent"); } } else { - System.out.println("Solde insuffisant"); + System.out.println("Solde insuffisant"); } - } - - public void updateSetUtxo(){ - Blockchain.utxos.clear(); - Blockchain.utxos.addAll(this.outputs); + Blockchain.utxos.removeAll(this.inputs); } // public void signTransaction() throws NoSuchAlgorithmException{ - // Signature signature = Signature.getInstance("SHA256withRSA"); - // signature.initSign(sender.getPrivateKey()); + // Signature signature = Signature.getInstance("SHA256withRSA"); + // signature.initSign(sender.getPrivateKey()); // } public double getTotalAmountUtxoInput(List<UTxO> inputs) { @@ -63,7 +64,7 @@ public class Transaction { return total; } - public boolean isValidTransaction( List<UTxO> inputs) { + public boolean isValidTransaction(List<UTxO> inputs) { boolean isValid = true; for (UTxO utxo : inputs) { if (!Blockchain.utxos.contains(utxo)) { @@ -77,7 +78,6 @@ public class Transaction { return this.id; } - public void setId(UUID id) { this.id = id; } @@ -90,7 +90,6 @@ public class Transaction { return this.outputs; } - public EnumTypeTransaction getTypeTransaction() { return this.typeTransaction; } @@ -98,10 +97,10 @@ public class Transaction { @Override public String toString() { return "{" + - " id='" + getId() + "'" + - ", inputs='" + getInputs() + "'" + - ", outputs='" + getOutputs() + "'" + - ", typeTransaction='" + getTypeTransaction() + "'" + - "}"; + " id='" + getId() + "'" + + ", inputs='" + getInputs() + "'" + + ", outputs='" + getOutputs() + "'" + + ", typeTransaction='" + getTypeTransaction() + "'" + + "}"; } } diff --git a/src/main/java/fr/miage/UTxO.java b/src/main/java/fr/miage/UTxO.java old mode 100755 new mode 100644 index fbdf1e6d2aea4afd56b0ffa1fa38d9fed04f0401..626101d2fc155f2bfc517bec1d1b748ae64706da --- a/src/main/java/fr/miage/UTxO.java +++ b/src/main/java/fr/miage/UTxO.java @@ -4,28 +4,32 @@ import java.util.UUID; public class UTxO implements Comparable { //UTXO : Hash qui renvoie a la transaction d'avant - private UUID uuid; // identifiant - private String transactionHash; // transaction de provenance de l'Utxo (provenance de l'argent) --> peut etre meme que le hash de la transaction + private UUID uuid; // identifiant (transaction de provenances) + private String ownerAdresss; // clé publique du wallet private double montant; - public UTxO(String transactionHash, double montant) { - this.transactionHash = transactionHash; + public UTxO(UUID provenance, String ownerAdresss, double montant) { + this.uuid = provenance; + this.ownerAdresss = ownerAdresss; this.montant = montant; } - public String getTransaction() { - return this.transactionHash; + public String ownerAdress() { + return this.ownerAdresss; } public double getMontant() { return this.montant; } + public UUID getUuid() { + return uuid; + } @Override public String toString() { - return "UTxO [uuid=" + uuid + ", transactionHash=" + transactionHash + ", montant=" + montant + "]"; + return "UTxO [uuid=" + uuid + ", ownerAdress=" + ownerAdresss + ", montant=" + montant + "]"; } @Override diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java index 9beca0ffd552fa1a8429494bfb5e0c9ad61f2f10..17f6e854f3bc2c803138e7f51a03fb196a67eb25 100644 --- a/src/main/java/fr/miage/Wallet.java +++ b/src/main/java/fr/miage/Wallet.java @@ -15,8 +15,10 @@ public class Wallet { private String privateKey; // pour la signature private double solde; private List<UTxO> utxos; + private String name; // temp public Wallet(String privateKey, String name) throws NoSuchAlgorithmException, InterruptedException { + this.name = name; this.privateKey = privateKey; initWallet(); createKeyPair(privateKey, name); @@ -27,38 +29,41 @@ public class Wallet { this.utxos = new ArrayList<>(); } - public void createKeyPair(String privateKey, String name) throws InterruptedException{ + public void createKeyPair(String privateKey, String name) throws InterruptedException { - String command = "keytool -genkeypair -alias wallet_"+name+" -keyalg RSA -keysize 2048 -dname \"CN=" + name + "\" -validity 365 -storetype JKS -keystore keystore.jks -storepass \"" + privateKey + "\""; + String command = "keytool -genkeypair -alias wallet_" + name + " -keyalg RSA -keysize 2048 -dname \"CN=" + name + + "\" -validity 365 -storetype JKS -keystore keystore.jks -storepass \"" + privateKey + "\""; System.out.println(command); ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+")); processBuilder.redirectErrorStream(true); - try { - Process process = processBuilder.start(); - OutputStream outputStream = process.getOutputStream(); - outputStream.write("\n".getBytes(StandardCharsets.UTF_8)); - outputStream.flush(); - outputStream.close(); + // try { + // // Process process = processBuilder.start(); + // // OutputStream outputStream = process.getOutputStream(); + // // outputStream.write("\n".getBytes(StandardCharsets.UTF_8)); + // // outputStream.flush(); + // // outputStream.close(); - InputStream inputStream = process.getInputStream(); - InputStream errorStream = process.getErrorStream(); + // // InputStream inputStream = process.getInputStream(); + // // InputStream errorStream = process.getErrorStream(); - byte[] buffer = new byte[1024]; - int bytesRead; + // // byte[] buffer = new byte[1024]; + // // int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - System.out.write(buffer, 0, bytesRead); - } + // // while ((bytesRead = inputStream.read(buffer)) != -1) { + // // System.out.write(buffer, 0, bytesRead); + // // } - while ((bytesRead = errorStream.read(buffer)) != -1) { - System.err.write(buffer, 0, bytesRead); - - } - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Erreur lors de la création du keypair"); - } + // // while ((bytesRead = errorStream.read(buffer)) != -1) { + // // System.err.write(buffer, 0, bytesRead); + + // } + // }catch( + + // IOException e) + // { + // e.printStackTrace(); + System.out.println("Erreur lors de la création du keypair"); System.out.println("Le wallet de " + name + " a été créé avec succès"); } @@ -69,30 +74,41 @@ public class Wallet { } public List<UTxO> getUTxOsForTransaction(double amount) { - List<UTxO> result = new ArrayList<>(); - int res = 0; - boolean stop = false; - Collections.sort(this.utxos); - for (UTxO utxo : this.utxos) { - if(res >= amount) { - stop = true; + List<UTxO> result = new ArrayList<>(); + double res = 0; + boolean stop = false; + Collections.sort(this.utxos); + for (UTxO utxo : this.utxos) { + if (res >= amount) { + stop = true; + } + if (res < amount && !stop) { + result.add(utxo); + res += utxo.getMontant(); + } } - if (res < amount && !stop) { - result.add(utxo); - res += utxo.getMontant(); - } - } + utxos.removeAll(result); + if (res < amount) { return null; } else { return result; } + } public String getPublicKey() { return this.publicKey; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public String getPrivateKey() { return this.privateKey; } @@ -104,13 +120,13 @@ public class Wallet { public void addUTxO(UTxO utxo) { this.utxos.add(utxo); } - + @Override public String toString() { return "{" + - " publicKey='" + getPublicKey() + "'" + - ", privateKey='" + getPrivateKey() + "'" + - ", utxos='" + getUtxos() + "'" + - "}"; + " publicKey='" + getPublicKey() + "'" + + ", privateKey='" + getPrivateKey() + "'" + + ", utxos='" + getUtxos() + "'" + + "}"; } } diff --git a/target/blockchain-project-1.0-SNAPSHOT.jar b/target/blockchain-project-1.0-SNAPSHOT.jar deleted file mode 100644 index f988b3b41a7cb272d887a9a6c7dcaa36582b7f2b..0000000000000000000000000000000000000000 Binary files a/target/blockchain-project-1.0-SNAPSHOT.jar and /dev/null differ diff --git a/target/classes/fr/miage/App.class b/target/classes/fr/miage/App.class deleted file mode 100644 index e1089d23ed730878e852d327dc5414686a9f68fc..0000000000000000000000000000000000000000 Binary files a/target/classes/fr/miage/App.class and /dev/null differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties deleted file mode 100644 index 976b61aa520fb2f04aeecf7a4a6be68c282208ba..0000000000000000000000000000000000000000 --- a/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.9.6 -artifactId=blockchain-project -groupId=fr.miage -version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index be281bf01b03b789780e7cc2b46bf12684a2eabe..0000000000000000000000000000000000000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,9 +0,0 @@ -fr/miage/Transaction.class -fr/miage/Bloc.class -fr/miage/UTxO.class -fr/miage/App.class -fr/miage/Blockchain.class -fr/miage/EnumTypeTransaction.class -fr/miage/MinageManager.class -fr/miage/Wallet.class -fr/miage/BlocHeader.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 1ddb5f309e514dde9bd943a2edf1123475ceac1e..0000000000000000000000000000000000000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,9 +0,0 @@ -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/EnumTypeTransaction.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/Bloc.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/Blockchain.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/App.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/MinageManager.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/Transaction.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/Wallet.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/BlocHeader.java -/Users/corentinstd/Library/CloudStorage/OneDrive-Personnel/Cours/M2_S1/Blockchain/blockchain-project/src/main/java/fr/miage/UTxO.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000