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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

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