From f4017c231f4e441ee62c2a91f9b700534c6f8126 Mon Sep 17 00:00:00 2001 From: saintdi25u <corentinstd@gmail.com> Date: Tue, 5 Mar 2024 23:05:08 +0100 Subject: [PATCH] ajout des prints --- .vscode/settings.json | 3 + keystore.jks | Bin 2063 -> 0 bytes src/main/java/fr/miage/App.java | 45 +++++++--- src/main/java/fr/miage/BlocHeader.java | 60 -------------- src/main/java/fr/miage/Blockchain.java | 34 +++++--- src/main/java/fr/miage/Coinbase.java | 4 + src/main/java/fr/miage/MinageManager.java | 70 ++++++++++++---- src/main/java/fr/miage/Transaction.java | 53 +++++------- src/main/java/fr/miage/UTxO.java | 2 +- src/main/java/fr/miage/Wallet.java | 17 ++-- src/main/java/fr/miage/{ => blocs}/Bloc.java | 58 +++++++++++-- src/main/java/fr/miage/blocs/BlocHeader.java | 65 +++++++++++++++ src/main/java/fr/miage/threads/Mineur.java | 78 ++++++++++++++++++ .../fr/miage/threads/TransactionCreator.java | 29 +++++++ .../transactions/EnumTypeTransaction.java | 5 ++ target/blockchain-project-1.0-SNAPSHOT.jar | Bin 0 -> 7175 bytes target/classes/fr/miage/App.class | Bin 0 -> 1786 bytes target/maven-archiver/pom.properties | 4 + .../compile/default-compile/createdFiles.lst | 9 ++ .../compile/default-compile/inputFiles.lst | 9 ++ .../default-testCompile/inputFiles.lst | 0 21 files changed, 402 insertions(+), 143 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 keystore.jks delete mode 100644 src/main/java/fr/miage/BlocHeader.java rename src/main/java/fr/miage/{ => blocs}/Bloc.java (63%) create mode 100644 src/main/java/fr/miage/blocs/BlocHeader.java create mode 100644 src/main/java/fr/miage/threads/Mineur.java create mode 100644 src/main/java/fr/miage/threads/TransactionCreator.java create mode 100644 src/main/java/fr/miage/transactions/EnumTypeTransaction.java create mode 100644 target/blockchain-project-1.0-SNAPSHOT.jar create mode 100644 target/classes/fr/miage/App.class create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e0f15db --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/keystore.jks b/keystore.jks deleted file mode 100644 index 82d03eec604254def7822df5a4565c03e67b1a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2063 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 diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java index 14560e4..cfae966 100644 --- a/src/main/java/fr/miage/App.java +++ b/src/main/java/fr/miage/App.java @@ -7,19 +7,40 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import fr.miage.threads.Mineur; +import fr.miage.threads.TransactionCreator; + /** * Hello world! - * */ public class App { - public static void main(String[] args) throws NoSuchAlgorithmException, InterruptedException { + public static synchronized void main(String[] args) throws NoSuchAlgorithmException, InterruptedException { System.out.println("Début de la blockchain"); // Création de 2 wallets Wallet bobWallet = new Wallet("bob"); Wallet aliceWallet = new Wallet("alice"); + Wallet charlieWallet = new Wallet("charlie"); + Wallet daveWallet = new Wallet("dave"); + Wallet eveWallet = new Wallet("eve"); + + List<Wallet> wallets = new ArrayList<Wallet>(); + wallets.add(bobWallet); + wallets.add(aliceWallet); + wallets.add(charlieWallet); + wallets.add(daveWallet); + wallets.add(eveWallet); + + Blockchain blockchain = new Blockchain("Blockchain de Jérémy BRODIER et Corentin SAINT-DIZIER", wallets); - List<Wallet> wallets = Arrays.asList(bobWallet, aliceWallet); - Blockchain blockchain = new Blockchain("BloBlockchain", wallets); + // wallets.add(mineur.getWallet()); + + System.out.println("Liste des wallets de la blockchain : \n"); + + // Thread du créateur de transaction + TransactionCreator transactionCreator = new TransactionCreator(blockchain); + Mineur mineur = new Mineur(blockchain); + transactionCreator.start(); + mineur.start(); // System.out.println("Wallet de bob : " + bobWallet.getUtxos()); // System.out.println("Wallet de alice : " + aliceWallet.getUtxos()); @@ -32,14 +53,14 @@ public class App { // 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++; - } - System.out.println("Transactions pool count : " + - blockchain.transactionsPool.size()); + // 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) { diff --git a/src/main/java/fr/miage/BlocHeader.java b/src/main/java/fr/miage/BlocHeader.java deleted file mode 100644 index 27e640a..0000000 --- a/src/main/java/fr/miage/BlocHeader.java +++ /dev/null @@ -1,60 +0,0 @@ -package fr.miage; - -public class BlocHeader { - private String previousHash; - private long time; - private long nonce; -// private long size; -// public static final int DIFFICULTY = 27; - - public BlocHeader(String previousHash, long time, long nonce) { -// this.hash = hash; - this.previousHash = previousHash; - this.time = time; - this.nonce = nonce; -// this.size = size; - } - -// public String getHash() { -// return hash; -// } - -// public void setHash(String hash) { -// this.hash = hash; -// } - - public String getPreviousHash() { - return previousHash; - } - -// public void setPreviousHash(String previousHash) { -// this.previousHash = previousHash; -// } - - public long getTime() { - return time; - } - -// public void setTime(long time) { -// this.time = time; -// } - - public long getNonce() { - return nonce; - } - -// public void setNonce(long nonce) { -// this.nonce = nonce; -// } - -// public long getSize() { -// return size; -// } - -// public void setSize(long size) { -// this.size = size; -// } - - - -} diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java index 4cc5db7..488436d 100644 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -14,12 +14,14 @@ import java.util.List; import java.util.Random; import java.util.Set; +import fr.miage.blocs.Bloc; + public class Blockchain { private String name; private LinkedList<Bloc> blocs; private List<Wallet> wallets; public static Set<UTxO> utxos = new HashSet<>(); - public Set<Transaction> transactionsPool = new HashSet<>(); + public static Set<Transaction> transactionsPool = new HashSet<>(); public Blockchain(String name, List<Wallet> wallets) { this.name = name; @@ -31,6 +33,7 @@ public class Blockchain { } }; ; + System.out.println("[BLOC] --- Hash du genesis bloc : " + this.blocs.getFirst().getHash()); } // Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter @@ -39,15 +42,13 @@ public class Blockchain { // Random wallet selection List<Wallet> walletsCopy = new ArrayList<>(); walletsCopy.addAll(wallets); - Wallet walletSender = selectWallet(walletsCopy); walletsCopy.remove(walletSender); - Wallet walletReceiver = selectWallet(walletsCopy); walletsCopy.remove(walletReceiver); - double amountWalletSender = walletSender.getUtxos().stream().mapToDouble(utxo -> utxo.getMontant()).sum(); double randomAmountToSend = new Random().nextDouble(amountWalletSender); + // System.out.println("Amount to send : " + randomAmountToSend); // System.out.println("Envoie de " + walletSender.getName() + " à " + // walletReceiver.getName()); @@ -61,21 +62,28 @@ public class Blockchain { System.out.println("Wallets vides"); return; } + System.out.println("[TRANSACTION] --- Création d'une transaction ========================================="); + System.out.println(" " + walletSender.getName() + " envoie " + randomAmountToSend + " à " + + walletReceiver.getName() + "\n"); Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL); + 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())) { - System.out.println("Signature vérifiée"); + System.out.println("[SIGNATURE] --- Signature vérifiée"); + Blockchain.transactionsPool.add(tx); } else { - System.out.println("Signature non vérifiée"); + System.out.println("[SIGNATURE] --- Signature non valide : TRANSACTION REJETEE"); } } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { e.printStackTrace(); } - this.transactionsPool.add(tx); + } public String getTransactionData(Transaction tx) { @@ -95,6 +103,7 @@ public class Blockchain { 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); } @@ -140,10 +149,11 @@ public class Blockchain { @Override public String toString() { - return "{" + - " name='" + getName() + "'" + - ", blocs='" + getBlocs() + "'" + - ", wallets='" + getWallets() + "'" + - "}"; + StringBuilder sb = new StringBuilder(); + for (int i = 1; i < this.blocs.size(); i++) { + sb.append("Bloc n° : " + i + this.blocs.get(i).getHash() + "\n"); + } + return sb.toString(); } + } diff --git a/src/main/java/fr/miage/Coinbase.java b/src/main/java/fr/miage/Coinbase.java index 4a82739..fed6698 100644 --- a/src/main/java/fr/miage/Coinbase.java +++ b/src/main/java/fr/miage/Coinbase.java @@ -12,4 +12,8 @@ public class Coinbase extends Transaction { public Coinbase(List<UTxO> outputs, PublicKey signature, EnumTypeTransaction typeTransaction) { super(new ArrayList<UTxO>(), outputs, signature, EnumTypeTransaction.COINBASE); } + + public Coinbase() { + super(new ArrayList<UTxO>(), new ArrayList<UTxO>(), null, EnumTypeTransaction.COINBASE); + } } diff --git a/src/main/java/fr/miage/MinageManager.java b/src/main/java/fr/miage/MinageManager.java index f541fe8..b2b8050 100644 --- a/src/main/java/fr/miage/MinageManager.java +++ b/src/main/java/fr/miage/MinageManager.java @@ -1,40 +1,80 @@ package fr.miage; import java.math.BigInteger; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.OptionalDouble; +import java.util.UUID; import java.util.stream.DoubleStream; import org.apache.commons.codec.digest.DigestUtils; +import fr.miage.blocs.Bloc; +import fr.miage.blocs.BlocHeader; +import fr.miage.threads.Mineur; + public class MinageManager { - private static final int DIFFICULTY = 27; + private static final int DIFFICULTY = 21; + private static double MAX_NONCE = Math.pow(2, 32); private Blockchain blockchain; public MinageManager(Blockchain blockchain) { this.blockchain = blockchain; } - public Bloc mineABloc() { - Bloc previousBloc = blockchain.getLastBloc(); - return mineABloc(previousBloc); + // public Bloc mineABloc() { + // Bloc previousBloc = blockchain.getLastBloc(); + // return mineABloc(previousBloc); + // } + + public static Bloc mineABloc(Bloc previousBloc, List<Transaction> transactions) { + Bloc bloc = new Bloc(); + String hashGenerate = ""; + bloc.setCoinbase(addCoinbaseTransaction()); + BlocHeader blocHeader = new BlocHeader(transactions.toString(), previousBloc.getHash(), + Instant.now().toEpochMilli()); + + String header = blocHeader.toString(); + double target = MinageManager.computeTarget(header); + OptionalDouble result = MinageManager.findNonce(header, target); // Difficulty + if (result.isPresent()) { + NumberFormat formatter = new DecimalFormat("#0"); + System.out.println("Nonce trouvé : " + formatter.format(result.getAsDouble())); + hashGenerate = generateHash(header, result.getAsDouble()); + bloc.setHash(hashGenerate); + bloc.setTransactions(transactions); + } else { + System.out.println("Aucun nonce trouvé"); + hashGenerate = generateHash("", MAX_NONCE); + bloc.setHash(hashGenerate); + bloc.setTransactions(transactions); + } + return bloc; + } + + public static Coinbase addCoinbaseTransaction() { + Coinbase coinbase = new Coinbase(); + List<UTxO> outputs = Arrays.asList(new UTxO(coinbase.getId(), null, 5.0)); + return new Coinbase(outputs, null, EnumTypeTransaction.COINBASE); } - public Bloc mineABloc(Bloc previousBloc) { - String header = previousBloc.getHeader(); - double target = computeTarget(header); - int nonce = findNonce(header, target); - String hash = DigestUtils.sha256Hex(header + nonce + previousBloc.getTransactionsString()); - return new Bloc(hash, previousBloc.getTransactions()); + public static double computeTarget(String header) { + return Math.pow(2, (256 - DIFFICULTY)); } - private static double computeTarget(String header) { - return new BigInteger(header, 16).doubleValue() / Math.pow(2, DIFFICULTY); + public static String generateHash(String header, Double nonce) { + return DigestUtils.sha256Hex(header + nonce); } - private static int findNonce(String header, double target) { - return (int) DoubleStream.iterate(0, i -> i + 1).limit((long) Math.pow(2, DIFFICULTY)) + public static OptionalDouble findNonce(String header, double target) { + return (OptionalDouble) DoubleStream.iterate(0, i -> i + 1).limit((long) Math.pow(2, DIFFICULTY)) .filter(nonce -> new BigInteger(DigestUtils.sha256Hex(header + nonce), 16).doubleValue() < target) - .findFirst().orElseThrow(); + .findFirst(); } record Result(String hash, double nonce) { diff --git a/src/main/java/fr/miage/Transaction.java b/src/main/java/fr/miage/Transaction.java index fa4b91c..2270903 100644 --- a/src/main/java/fr/miage/Transaction.java +++ b/src/main/java/fr/miage/Transaction.java @@ -28,24 +28,26 @@ public class Transaction { public Transaction(Wallet sender, Wallet receiver, double amount, EnumTypeTransaction typeTransaction) { this.inputs = sender.getUTxOsForTransaction(amount); - System.out.println("Inputs : " + this.inputs); - System.out.println("Set UTxO : " + Blockchain.utxos); + // 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, receiver.getKeyPair().getPublic(), amount); // peut - // etre - // changr par - // amout + UTxO utxoAmount = new UTxO(this.id, receiver.getKeyPair().getPublic(), amount); + this.receiver.addUTxO(utxoAmount); UTxO utxoRest = new UTxO(this.id, 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"); } @@ -55,6 +57,17 @@ public class Transaction { Blockchain.utxos.removeAll(this.inputs); } + public void printUtxoDetails(List<UTxO> inputs, List<UTxO> outputs) { + System.out.println(" UTxO inputs : \n"); + for (UTxO utxo : inputs) { + System.out.println(" " + utxo.getUuid() + " : " + utxo.getMontant()); + } + System.out.println(" UTxO outputs : "); + for (UTxO utxo : outputs) { + System.out.println(" " + utxo.getUuid() + " : " + utxo.getMontant()); + } + } + // public void signTransaction() throws NoSuchAlgorithmException{ // Signature signature = Signature.getInstance("SHA256withRSA"); // signature.initSign(sender.getPrivateKey()); @@ -94,33 +107,11 @@ public class Transaction { return this.outputs; } - public EnumTypeTransaction getTypeTransaction() { - return this.typeTransaction; - } - - public Wallet getReceiver() { - return receiver; - } - - public Wallet getSender() { - return sender; - } - - public byte[] getSignature() { - return signature; - } - public void setSignature(byte[] signature) { this.signature = signature; } - @Override - public String toString() { - return "{" + - " id='" + getId() + "'" + - ", inputs='" + getInputs() + "'" + - ", outputs='" + getOutputs() + "'" + - ", typeTransaction='" + getTypeTransaction() + "'" + - "}"; + public byte[] getSignature() { + return signature; } -} +} \ No newline at end of file diff --git a/src/main/java/fr/miage/UTxO.java b/src/main/java/fr/miage/UTxO.java index c4884a3..4491a4c 100644 --- a/src/main/java/fr/miage/UTxO.java +++ b/src/main/java/fr/miage/UTxO.java @@ -29,7 +29,7 @@ public class UTxO implements Comparable { @Override public String toString() { - return "UTxO [uuid=" + uuid + ", ownerAdress=" + ownerAdresss + ", montant=" + montant + "]"; + return "UTxO [uuid=" + uuid + ", montant=" + montant + "]"; } @Override diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java index 034f0be..0c31fdd 100644 --- a/src/main/java/fr/miage/Wallet.java +++ b/src/main/java/fr/miage/Wallet.java @@ -114,13 +114,16 @@ public class Wallet { } - public void loadPrivateKey() throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, - CertificateException, FileNotFoundException, IOException { - KeyStore keyStore = KeyStore.getInstance("JKS"); - keyStore.load(new FileInputStream("keystore.jks"), null); // replace null by privateKey - PrivateKey privateKey = (PrivateKey) keyStore.getKey("wallet_" + this.name, null); // replace null by // - // privateKey// // (password) - } + // public void loadPrivateKey() throws UnrecoverableKeyException, + // KeyStoreException, NoSuchAlgorithmException, + // CertificateException, FileNotFoundException, IOException { + // KeyStore keyStore = KeyStore.getInstance("JKS"); + // keyStore.load(new FileInputStream("keystore.jks"), null); // replace null by + // privateKey + // PrivateKey privateKey = (PrivateKey) keyStore.getKey("wallet_" + this.name, + // null); // replace null by // + // // privateKey// // (password) + // } // public void publishPublicKey() { // String command = "keytool -exportcert -alias wallet_" + name diff --git a/src/main/java/fr/miage/Bloc.java b/src/main/java/fr/miage/blocs/Bloc.java similarity index 63% rename from src/main/java/fr/miage/Bloc.java rename to src/main/java/fr/miage/blocs/Bloc.java index 2b941f9..a55e7a4 100644 --- a/src/main/java/fr/miage/Bloc.java +++ b/src/main/java/fr/miage/blocs/Bloc.java @@ -1,24 +1,46 @@ -package fr.miage; +package fr.miage.blocs; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.OptionalDouble; import java.util.Random; import java.util.Set; import java.util.UUID; import org.apache.commons.codec.digest.DigestUtils; +import fr.miage.Blockchain; +import fr.miage.Coinbase; +import fr.miage.EnumTypeTransaction; +import fr.miage.MinageManager; +import fr.miage.Transaction; +import fr.miage.UTxO; +import fr.miage.Wallet; + +import fr.miage.Blockchain; +import fr.miage.Coinbase; +import fr.miage.EnumTypeTransaction; +import fr.miage.Transaction; +import fr.miage.UTxO; + public class Bloc { private String hash; - private List<Transaction> transactions; + private List<Transaction> transactions; // transaction à insérer dans le bloc private String header; // Contient le nonce et le hash du bloc précédent + private Coinbase coinbase; + public Bloc(String hash, List<Transaction> transactions) { this.hash = hash; this.transactions = transactions; } + public Bloc() { + } + public String getHash() { return hash; } @@ -48,6 +70,7 @@ public class Bloc { } public static Bloc createGenuineBloc(List<Wallet> wallets) { + System.out.println("Création du Genuine Bloc..."); List<Transaction> transactions = new ArrayList<Transaction>(); for (Wallet wallet : wallets) { int amount = RandomNumberGenerator.getRandomNumber(1, 20); @@ -64,13 +87,26 @@ public class Bloc { transactions.add(coinbase); } // System.out.println("Set UTxO INITIAL " + Blockchain.utxos); - - BlocHeader blocHeader = new BlocHeader("", Instant.now().toEpochMilli(), 0); + BlocHeader blocHeader = new BlocHeader("", "", Instant.now().toEpochMilli()); String header = blocHeader.toString(); - String hash = generateHash(header, transactions); + String hash = MinageManager.generateHash(header, 0.0); return new Bloc(hash, transactions); } + // BlocHeader blocHeader = new BlocHeader("", Instant.now().toEpochMilli(), 0); + // String header = blocHeader.toString(); + // String hash = generateHash(header, transactions);return new + // Bloc(hash,transactions); + + // public static Bloc createBloc(List<Transaction> transactions, String + // previousHash) { + // BlocHeader blocHeader = new BlocHeader(previousHash, + // Instant.now().toEpochMilli(), 0); + // String header = blocHeader.toString(); + // String hash = generateHash(header, transactions); + // return new Bloc(hash, transactions); + // } + private static String generateHash(String header, List<Transaction> transactions) { return DigestUtils.sha256Hex(header + transactions.toString()); } @@ -90,6 +126,18 @@ public class Bloc { } } + public Coinbase getCoinbaseTransaction() { + return coinbase; + } + + public void setCoinbase(Coinbase coinbase) { + this.coinbase = coinbase; + } + + public Coinbase getCoinbase() { + return coinbase; + } + @Override public String toString() { return "{" + diff --git a/src/main/java/fr/miage/blocs/BlocHeader.java b/src/main/java/fr/miage/blocs/BlocHeader.java new file mode 100644 index 0000000..847334a --- /dev/null +++ b/src/main/java/fr/miage/blocs/BlocHeader.java @@ -0,0 +1,65 @@ +package fr.miage.blocs; + +public class BlocHeader { + private String previousHash; + private long time; + private String transactions; + // private long nonce; + // private long size; + // public static final int DIFFICULTY = 27; + + public BlocHeader(String transactions, String previousHash, long time) { + // this.hash = hash; + this.previousHash = previousHash; + this.time = time; + this.transactions = transactions; + // this.nonce = nonce; + // this.size = size; + } + + // public String getHash() { + // return hash; + // } + + // public void setHash(String hash) { + // this.hash = hash; + // } + + public String getPreviousHash() { + return previousHash; + } + + // public void setPreviousHash(String previousHash) { + // this.previousHash = previousHash; + // } + + public long getTime() { + return time; + } + + @Override + public String toString() { + return "BlocHeader [previousHash=" + previousHash + ", time=" + time + ", transactions=" + transactions + "]"; + } + + // public void setTime(long time) { + // this.time = time; + // } + + // public long getNonce() { + // return nonce; + // } + + // public void setNonce(long nonce) { + // this.nonce = nonce; + // } + + // public long getSize() { + // return size; + // } + + // public void setSize(long size) { + // this.size = size; + // } + +} diff --git a/src/main/java/fr/miage/threads/Mineur.java b/src/main/java/fr/miage/threads/Mineur.java new file mode 100644 index 0000000..5d930a6 --- /dev/null +++ b/src/main/java/fr/miage/threads/Mineur.java @@ -0,0 +1,78 @@ +package fr.miage.threads; + +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import fr.miage.Blockchain; +import fr.miage.MinageManager; +import fr.miage.Transaction; +import fr.miage.Wallet; +import fr.miage.blocs.Bloc; + +public class Mineur extends Thread { + private Blockchain blockchain; + private MinageManager minageManager = new MinageManager(blockchain); + + private Wallet wallet; + + List<Transaction> transactions = new ArrayList<>(); + + public Mineur(Blockchain blockchain) throws NoSuchAlgorithmException, InterruptedException { + this.blockchain = blockchain; + this.wallet = new Wallet("Mineur"); + } + + public void run() { + System.out.println("Attente de transactions pour minage...."); + while (true) { + try { + if (Blockchain.transactionsPool.size() >= 20) { + System.out.println(" [MINAGE] -- Récupération du dernier bloc de la blockchain...."); + Bloc previousBloc = blockchain.getLastBloc(); + System.out.println("[MINAGE] -- Dernier bloc de la blockchain : " + previousBloc.getHash()); + this.transactions = getLastTransactions(); + + System.out.println("[MINAGE] -- Minage du bloc...."); + Bloc bloc = MinageManager.mineABloc(previousBloc, transactions); + Blockchain.transactionsPool.removeAll(transactions); + transactions.clear(); + if (bloc != null) { + blockchain.addBloc(bloc); + System.out.println("[MINAGE] --- Bloc miné : " + bloc.getHash()); + System.out.println("[MINAGE] --- Gain du mineur : " + + bloc.getCoinbase().getOutputs().getFirst().getMontant()); + this.wallet.addUTxO(bloc.getCoinbase().getOutputs().getFirst()); + } + // remove the transactions from the pool + } + Thread.sleep(1000); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public synchronized List<Transaction> getLastTransactions() { + System.out.println("[MINAGE] -- Récupération des dernières transactions...."); + Iterator<Transaction> it = Blockchain.transactionsPool.iterator(); + while (transactions.size() < 20) { + Transaction tx = it.next(); + transactions.add(tx); + } + System.out.println(transactions.size()); + System.out.println("[COINBAE] --- Ajout de la coinbase transaction dans la liste de transaction"); + return transactions; + } + + public Wallet getWallet() { + return wallet; + } + + public void setWallet(Wallet wallet) { + this.wallet = wallet; + } + +} diff --git a/src/main/java/fr/miage/threads/TransactionCreator.java b/src/main/java/fr/miage/threads/TransactionCreator.java new file mode 100644 index 0000000..3a88652 --- /dev/null +++ b/src/main/java/fr/miage/threads/TransactionCreator.java @@ -0,0 +1,29 @@ +package fr.miage.threads; + +import java.util.List; + +import fr.miage.Blockchain; +import fr.miage.Transaction; +import fr.miage.blocs.Bloc; + +public class TransactionCreator extends Thread { + private Blockchain blockchain; + + public TransactionCreator(Blockchain blockchain) { + this.blockchain = blockchain; + } + + public void run() { + while (true) { + blockchain.createTrasaction(); + System.out.println("[POOL] Nombre de transaction dans la pool : " + Blockchain.transactionsPool.size()); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } +} diff --git a/src/main/java/fr/miage/transactions/EnumTypeTransaction.java b/src/main/java/fr/miage/transactions/EnumTypeTransaction.java new file mode 100644 index 0000000..2c0b7d5 --- /dev/null +++ b/src/main/java/fr/miage/transactions/EnumTypeTransaction.java @@ -0,0 +1,5 @@ +package fr.miage.transactions; + +public enum EnumTypeTransaction { + NORMAL, COINBASE; +} diff --git a/target/blockchain-project-1.0-SNAPSHOT.jar b/target/blockchain-project-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..f988b3b41a7cb272d887a9a6c7dcaa36582b7f2b GIT binary patch literal 7175 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𝔦QLvL`AmwO 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 literal 0 HcmV?d00001 diff --git a/target/classes/fr/miage/App.class b/target/classes/fr/miage/App.class new file mode 100644 index 0000000000000000000000000000000000000000..38de4e055820c0000e2537cd650c4726adda7d1a GIT binary patch literal 1786 zcmX^0Z`VEs1_nolWOfE7Mh2d=BK_RV#Pn2s$ASWO1{OvJfvm)`ME#t^ymWp4q^#8B z5=I6#o6Nk-5<5l)W)00SMg|t={FGEK24)6M9tKthHbw@1pUk{eztY^K)S{5Yq?}Yn z1|gsP<iwn?#G*_PA1cUFl95@=$iU}=Y^OCN150jVW*#Ghm`1b@!tUUbqRhN>Ymj|h zt`*6t1tppJdByAuLW~S*U{%Gb$)!b^C6)Sq`N5^h8IC#W`9+x}8M$!9><l7|402$# zVBdJ=m82FGl@^qwroh#3GKeuqurr9GcssbVxFj`~he47-ijjdizqEvrK@{S$%zXWT zqRhOK;F6-$#9V6*1{p>MahJm@lS)ezQc@Li5*3ni@{_ZZGZHiNxESOZ6xbQ$85xAZ zZa~$`!=T8Z#K^#205UEokC8!C17Zc(sc_G;GpH~!@WaC^JTWIHwS<E~jgf&lDL;ve zL771V6bDKi3|fo~tcf|9$*CL+I*bhL$r*`7Ihm;(40?<VEGda)sT>Rjj10`FWvT28 zMldIpmSpDWI~ElsR{CTXmvAu{GH`M;m@=5NGng?l@PS<oRsxdcVX$DZWMp7YOi4j= zEF_g!Yeum%STiyR!yW4c4+;(jTSf+R1RoSuUWZo}9bTDRso)gk@8aniq>x&o;GAES znpcvUrx5Ju=@+8w;u+=X8pOq5#b6Keqyr;^DwaTk1RLC))|z1)3{H#;Y9L3aDx{<q zE0lvntr%o0N(?DjDR8kfxG*v(!`)nxQIwjPQmh|Rl$ckXm<&pD&PAz-CHX~M49*O0 zAZNHUGDv73k}$$o)|z4L44#Y(;uxm+X6B`q7I86nFt~w?@!?_c1!Wu7;*!Lo5|FSD zBLhofQF<{WgD{pnz{tRvl%E8NdqxI9gxwG!YeoicaLhxvj10Wc$cOQ{K=BXbaHf`} z!r1K4kYQvHKo3Pm1};QW2Bm+vr;t3%$RJdL5m1Z_st6b24o_=F2DV&qxG*wEVrqZ{ znKdJW7-~sUS&#}XO_b4`Y=bZa;y-IUYeojH;QZ2}<W#pzP^rY>SWut`O4baD42%rS z3?RV7zz8bD7#JDY85kJ!85kKD85kH?wYD>GY-C_yU}E56U|?Va3kooBGcYjlfZ41J zJPf=H3=EnKd<^^yObh~GRZI+m48kCT7&{nPz&clLVh|OQ-o_xin?X5JNOe1dx(}G8 zxt&4X7tGS$&Y<oGX6bHcP`6?MGxb4C*4+$-k=q%Jt=J^lw0AO?FfoKnvgyDWx-f<$ z3!KFYVeMwHiWIVuWZTYQXT=V3fFsxe&XJPr+ZkM~ICe95fSF!aoRS>d7`!Dpw=wvE ze9H`Wvmb*n0|SE)0|$c$gAju#gA9WhgBpW4gCT<igAIcegDZnHgCBzoLpXyhLjr>w zLl%QPLkWW-LnDJKLnng<!xRQhhWQLy3`-ca8CEicfI}?}Z1O4we}(|C*)tdd8G;xX z8Dtpx7=jss7?>E;7+M%Y7=jp>84MXJ8A2I?7+4r=81fjx7=jpB8C)4s8NwMN7}yvZ v88jIp8KM~28Ky9ZF+?-OFmN!;XW(XtWr$<oWQd2x5JY_fIOY<;@t6bvx8k~d literal 0 HcmV?d00001 diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..976b61a --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,4 @@ +#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 new file mode 100644 index 0000000..be281bf --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..1ddb5f3 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,9 @@ +/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 new file mode 100644 index 0000000..e69de29 -- GitLab