diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..e0f15db2eb22b5d618150277e48b741f8fdd277a --- /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 Binary files a/keystore.jks and /dev/null differ diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java index 14560e436a32a673d974d89fe728b445650940c5..cfae966150602836bf59bb373747a055c382d3a8 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 27e640a90eb5ee6d59eecb8e82df0681062fe624..0000000000000000000000000000000000000000 --- 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 4cc5db7ef04c33473483583f2e32cd612d69f43b..488436ddea3d8c5e9b4c5b8b92f23cc554195397 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 4a8273985a9e320dc2edb365409fb7a143691d8a..fed66986c6ec42678be485f13afec9f67568c932 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 f541fe8f89d28848548052542c8bebdb4ee1f485..b2b80508aa1366c022ac1416393c58a8867e2b5a 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 fa4b91c4f226cc71e4b56b43e151d97376fcb324..22709036804fb9461d84ee47e51086883799e03a 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 c4884a3eb95e297116ab68f8ad1df44b88efa26f..4491a4c775ae18f264353ccc86cadb6627e947b9 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 034f0be84c6573a7ae8858eeb0b2ed75eb65c429..0c31fdd1054cf43ed8e395ffca9d8c708abe16ca 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 2b941f9f531778ee58adb706820133d0e8e8d79f..a55e7a42d744136e329fd4fc91e3ae211575c0ea 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 0000000000000000000000000000000000000000..847334a3cfb44ed2fad233ef31d97318b90a96ae --- /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 0000000000000000000000000000000000000000..5d930a6f8a35e4a4bc555fdfac0e778b47744596 --- /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 0000000000000000000000000000000000000000..3a88652aa31a3f1f6ccee63a0174fa536cafd9d1 --- /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 0000000000000000000000000000000000000000..2c0b7d516a19fa4b18d6b7e92a4a719deffebfc8 --- /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 Binary files /dev/null and b/target/blockchain-project-1.0-SNAPSHOT.jar differ diff --git a/target/classes/fr/miage/App.class b/target/classes/fr/miage/App.class new file mode 100644 index 0000000000000000000000000000000000000000..38de4e055820c0000e2537cd650c4726adda7d1a Binary files /dev/null and b/target/classes/fr/miage/App.class differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000000000000000000000000000000000000..976b61aa520fb2f04aeecf7a4a6be68c282208ba --- /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 0000000000000000000000000000000000000000..be281bf01b03b789780e7cc2b46bf12684a2eabe --- /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 0000000000000000000000000000000000000000..1ddb5f309e514dde9bd943a2edf1123475ceac1e --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391