diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java index 80202106d714ce432056a15935a629d5e802fd71..0b47048992d8ac7a168402e96777981a19ccbeec 100644 --- a/src/main/java/fr/miage/App.java +++ b/src/main/java/fr/miage/App.java @@ -1,12 +1,6 @@ package fr.miage; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import fr.miage.threads.Mineur; import fr.miage.threads.TransactionCreator; @@ -15,72 +9,13 @@ import fr.miage.threads.TransactionCreator; */ public class App { 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); - - // wallets.add(mineur.getWallet()); - System.out.println("Liste des wallets de la blockchain : \n"); + Blockchain blockchain = new Blockchain("Blockchain de Jérémy BRODIER et Corentin SAINT-DIZIER"); - // 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()); - // System.out.println("Utxos du wallet de bob : " + bobWallet.getUtxos()); - // System.out.println("Utxos du wallet de alice : " + aliceWallet.getUtxos()); - // Transaction transaction = new Transaction(bobWallet, aliceWallet, 2, - // EnumTypeTransaction.NORMAL); - // System.out.println("Transaction : "); - // System.out.println("Bob envoie : " + transaction.getInputs()); - // System.out.println("Alice reçoit : " + transaction.getOutputs()); - // System.out.println(transaction); - - // int i = 1; - // while (blockchain.transactionsPool.size() < 20) { - // System.out.println("Transaction n°" + i); - // blockchain.createTrasaction(); - // i++; - // } - // System.out.println("Transactions pool count : " + - // blockchain.transactionsPool.size()); - - // // print all utxo in the utxo set - // for (UTxO utxo : Blockchain.utxos) { - // System.out.println("UTXO ID: " + utxo); - // } - - // TODO : S'asurer de créer une bonne transaction avec les UTxO etc... - // TODO : Faire la signature de la transaction - // - - // Set<Wallet> wallets = new HashSet<Wallet>() { - // { - // add(bobWallet); - // add(aliceWallet); - // } - // }; - // // Création de la blockchain - - // // MinageManager minageManager = new MinageManager(blockchain); - // // minageManager.mineABloc(); } } diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java index 488436ddea3d8c5e9b4c5b8b92f23cc554195397..4feccc2768c44b16fd30f0be059773c4bdc2a603 100644 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -7,7 +7,6 @@ import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -23,9 +22,9 @@ public class Blockchain { public static Set<UTxO> utxos = new HashSet<>(); public static Set<Transaction> transactionsPool = new HashSet<>(); - public Blockchain(String name, List<Wallet> wallets) { + public Blockchain(String name) throws NoSuchAlgorithmException, InterruptedException { this.name = name; - this.wallets = wallets; + this.wallets = setupWallet(); // Création du premier bloc contenant les transactions de coinbase this.blocs = new LinkedList<>() { { @@ -36,10 +35,17 @@ public class Blockchain { System.out.println("[BLOC] --- Hash du genesis bloc : " + this.blocs.getFirst().getHash()); } + public List<Wallet> setupWallet() throws NoSuchAlgorithmException, InterruptedException { + List<Wallet> wallets = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + wallets.add(new Wallet("Wallet" + i)); + } + return wallets; + } + // Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter // dans la transaction pool; public void createTrasaction() { - // Random wallet selection List<Wallet> walletsCopy = new ArrayList<>(); walletsCopy.addAll(wallets); Wallet walletSender = selectWallet(walletsCopy); @@ -48,29 +54,16 @@ public class Blockchain { 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()); - // System.out.println(); - // System.out.println("Utxos de " + walletSender.getName() + " : " + - // walletSender.getUtxos()); - // System.out.println("Utxos de " + walletReceiver.getName() + " : " + - // walletReceiver.getUtxos()); - // System.out.println(); if (walletSender.getUtxos().isEmpty() || walletReceiver.getUtxos().isEmpty()) { System.out.println("Wallets vides"); return; } - System.out.println("[TRANSACTION] --- Création d'une transaction ========================================="); + System.out.println("[TRANSACTION] --- Création d'une transaction =========================================\n"); System.out.println(" " + walletSender.getName() + " envoie " + randomAmountToSend + " à " + walletReceiver.getName() + "\n"); - Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL); - String transactionData = getTransactionData(tx); try { - byte[] signature = sign(transactionData, walletSender.getKeyPair().getPrivate()); System.out.println("[SIGNATURE] --- Signature de la transaction : " + signature); tx.setSignature(signature); diff --git a/src/main/java/fr/miage/MinageManager.java b/src/main/java/fr/miage/MinageManager.java index b2b80508aa1366c022ac1416393c58a8867e2b5a..ee068ff363c917afdfef31ff0ee4baf7bf800e9e 100644 --- a/src/main/java/fr/miage/MinageManager.java +++ b/src/main/java/fr/miage/MinageManager.java @@ -6,20 +6,18 @@ 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 java.util.stream.Stream; 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 = 21; + private static final int DIFFICULTY = 6; private static double MAX_NONCE = Math.pow(2, 32); private Blockchain blockchain; @@ -27,39 +25,23 @@ public class MinageManager { this.blockchain = blockchain; } - // 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 = ""; + public static void mineABloc(Bloc bloc) { + int nonce = 0; 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); + String target = new String(new char[DIFFICULTY]).replace('\0', '0'); + System.out.println("[MINAGE] ---- Minage en cours..."); + while (!bloc.getHash().substring(0, DIFFICULTY).equals(target)) { + nonce++; + bloc.setNonce(nonce); + bloc.generateHash(); } - return bloc; + System.out.println("Nonce trouvé : " + nonce); + System.out.println("Hash trouvé : " + bloc.getHash()); } public static Coinbase addCoinbaseTransaction() { Coinbase coinbase = new Coinbase(); - List<UTxO> outputs = Arrays.asList(new UTxO(coinbase.getId(), null, 5.0)); + List<UTxO> outputs = Arrays.asList(new UTxO(coinbase.getId(), UUID.randomUUID(), null, 5.0)); return new Coinbase(outputs, null, EnumTypeTransaction.COINBASE); } @@ -67,19 +49,4 @@ public class MinageManager { return Math.pow(2, (256 - DIFFICULTY)); } - public static String generateHash(String header, Double nonce) { - return DigestUtils.sha256Hex(header + nonce); - } - - 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(); - } - - record Result(String hash, double nonce) { - } - - record Compute(double hash, double nonce) { - } } diff --git a/src/main/java/fr/miage/Transaction.java b/src/main/java/fr/miage/Transaction.java index 22709036804fb9461d84ee47e51086883799e03a..10cfdd3cd6f372495fc8b9362abe7e44a8c42e19 100644 --- a/src/main/java/fr/miage/Transaction.java +++ b/src/main/java/fr/miage/Transaction.java @@ -1,12 +1,8 @@ package fr.miage; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; import java.security.PublicKey; -import java.security.Signature; import java.util.Arrays; import java.util.List; -import java.util.Set; import java.util.UUID; public class Transaction { @@ -36,10 +32,10 @@ public class Transaction { this.receiver = receiver; this.typeTransaction = typeTransaction.NORMAL; this.id = UUID.randomUUID(); - UTxO utxoAmount = new UTxO(this.id, receiver.getKeyPair().getPublic(), amount); + UTxO utxoAmount = new UTxO(this.id, UUID.randomUUID(), receiver.getKeyPair().getPublic(), amount); this.receiver.addUTxO(utxoAmount); - UTxO utxoRest = new UTxO(this.id, sender.getKeyPair().getPublic(), + UTxO utxoRest = new UTxO(this.id, UUID.randomUUID(), sender.getKeyPair().getPublic(), getTotalAmountUtxoInput(inputs) - amount); this.sender.addUTxO(utxoRest); this.outputs = Arrays.asList(utxoAmount, utxoRest); @@ -58,21 +54,17 @@ public class Transaction { } public void printUtxoDetails(List<UTxO> inputs, List<UTxO> outputs) { - System.out.println(" UTxO inputs : \n"); + System.out.println(" UTxO inputs ========"); for (UTxO utxo : inputs) { - System.out.println(" " + utxo.getUuid() + " : " + utxo.getMontant()); + System.out.println(" " + utxo.getIdentifiant() + " : " + utxo.getMontant()); } - System.out.println(" UTxO outputs : "); + System.out.println(" UTxO outputs ======== "); for (UTxO utxo : outputs) { - System.out.println(" " + utxo.getUuid() + " : " + utxo.getMontant()); + System.out.println(" " + utxo.getIdentifiant() + " : " + utxo.getMontant()); } + System.out.println(); } - // public void signTransaction() throws NoSuchAlgorithmException{ - // Signature signature = Signature.getInstance("SHA256withRSA"); - // signature.initSign(sender.getPrivateKey()); - // } - public double getTotalAmountUtxoInput(List<UTxO> inputs) { double total = 0; for (UTxO utxo : inputs) { diff --git a/src/main/java/fr/miage/UTxO.java b/src/main/java/fr/miage/UTxO.java index 4491a4c775ae18f264353ccc86cadb6627e947b9..a2d0c33818b3a0cc9a26d2e5181041e7dd016ecc 100644 --- a/src/main/java/fr/miage/UTxO.java +++ b/src/main/java/fr/miage/UTxO.java @@ -6,11 +6,13 @@ import java.util.UUID; public class UTxO implements Comparable { // UTXO : Hash qui renvoie a la transaction d'avant private UUID uuid; // identifiant (transaction de provenances) - private PublicKey ownerAdresss; // clé publique du wallet + private UUID identifiant; // identifiant de l'utxo + private PublicKey ownerAdresss;// clé publique du wallet private double montant; - public UTxO(UUID provenance, PublicKey ownerAdresss, double montant) { + public UTxO(UUID provenance, UUID id, PublicKey ownerAdresss, double montant) { this.uuid = provenance; + this.identifiant = id; this.ownerAdresss = ownerAdresss; this.montant = montant; } @@ -29,7 +31,7 @@ public class UTxO implements Comparable { @Override public String toString() { - return "UTxO [uuid=" + uuid + ", montant=" + montant + "]"; + return "UTxO [uuid=" + identifiant + ", montant=" + montant + "]"; } @Override @@ -43,4 +45,12 @@ public class UTxO implements Comparable { return 0; } } + + public UUID getIdentifiant() { + return identifiant; + } + + public void setIdentifiant(UUID identifiant) { + this.identifiant = identifiant; + } } diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java index 0c31fdd1054cf43ed8e395ffca9d8c708abe16ca..47d0cff0b0ae5e9adea21ce6fba61767d0e67697 100644 --- a/src/main/java/fr/miage/Wallet.java +++ b/src/main/java/fr/miage/Wallet.java @@ -1,31 +1,13 @@ package fr.miage; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; import java.security.KeyPair; import java.security.KeyPairGenerator; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Wallet { - // private PublicKey publicKey; - // private PrivateKey privateKey; // pour la signature private KeyPair keyPair; private double solde; private List<UTxO> utxos; @@ -37,46 +19,6 @@ public class Wallet { this.utxos = new ArrayList<UTxO>(); } - // public void initWallet() throws NoSuchAlgorithmException { - // this.publicKey = hashSha256(this.privateKey); - // this.utxos = new ArrayList<>(); - // } - - // public void createKeyPair(String privateKey, String name) throws - // InterruptedException { - - // String command = "keytool -genkeypair -alias wallet_" + name + " -keyalg RSA - // -keysize 2048 -dname \"CN=" + name - // + "\" -validity 365 -storetype JKS -keystore keystore.jks -storepass \"" + - // privateKey + "\""; - - // System.out.println(command); - // ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+")); - // processBuilder.redirectErrorStream(true); - // try { - // Process process = processBuilder.start(); - // OutputStream outputStream = process.getOutputStream(); - // outputStream.write("\n".getBytes(StandardCharsets.UTF_8)); - // outputStream.flush(); - // outputStream.close(); - // InputStream inputStream = process.getInputStream(); - // InputStream errorStream = process.getErrorStream(); - // byte[] buffer = new byte[1024]; - // int bytesRead; - // while ((bytesRead = inputStream.read(buffer)) != -1) { - // System.out.write(buffer, 0, bytesRead); - // } - // while ((bytesRead = errorStream.read(buffer)) != -1) { - // System.err.write(buffer, 0, bytesRead); - - // } - // } catch (IOException e) { - // e.printStackTrace(); - // System.out.println("Erreur lors de la création du keypair"); - // } - // System.out.println("Le wallet de " + name + " a été créé avec succès"); - // } - public KeyPair generateKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); @@ -84,12 +26,7 @@ public class Wallet { return keyPair; } - private String hashSha256(String privateKey) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] hash = md.digest(privateKey.getBytes(StandardCharsets.UTF_8)); - return new String(hash, StandardCharsets.UTF_8); - } - + @SuppressWarnings("unchecked") public List<UTxO> getUTxOsForTransaction(double amount) { List<UTxO> result = new ArrayList<>(); double res = 0; @@ -114,42 +51,6 @@ 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 publishPublicKey() { - // String command = "keytool -exportcert -alias wallet_" + name - // + " -storetype JKS -keystore keystore.jks -file certificate.cer -rfc - // -storepass \"" + privateKey + "\""; - // System.out.println(command); - // ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+")); - // try { - // Process process = processBuilder.start(); - // } catch (IOException e) { - // e.printStackTrace(); - // System.out.println("Erreur lors de la publication de la clé publique"); - // } - // } - - // public void loadPublicKeyForVerification() { - // String command = "keytool -exportcert -alias wallet_" + name - // + " -storetype JKS -keystore keystore.jks -file certificate.cer -rfc - // -storepass \"" + privateKey + "\""; - - // } - - // public String getPublicKey() { - // return this.publicKey; - // } - public String getName() { return name; } @@ -158,10 +59,6 @@ public class Wallet { this.name = name; } - // public String getPrivateKey() { - // return this.privateKey; - // } - public List<UTxO> getUtxos() { return this.utxos; } diff --git a/src/main/java/fr/miage/blocs/Bloc.java b/src/main/java/fr/miage/blocs/Bloc.java index a55e7a42d744136e329fd4fc91e3ae211575c0ea..05c03f9a633fef51302b4a704629a393cc6c3503 100644 --- a/src/main/java/fr/miage/blocs/Bloc.java +++ b/src/main/java/fr/miage/blocs/Bloc.java @@ -20,46 +20,74 @@ 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; // transaction à insérer dans le bloc - private String header; // Contient le nonce et le hash du bloc précédent - + // private String header; // Contient le nonce et le hash du bloc précédent + private String previousHash; + private long time; + // private String transactionsInfo; + private int nonce; private Coinbase coinbase; - public Bloc(String hash, List<Transaction> transactions) { - this.hash = hash; + public Bloc(List<Transaction> transactions, String previousHash) { + this.previousHash = previousHash; + this.time = Instant.now().toEpochMilli(); + this.nonce = 0; this.transactions = transactions; + this.hash = generateHash(); + + } + + public String generateHash() { + String hash = DigestUtils.sha256Hex(this.transactions.toString() + this.previousHash + this.time + this.nonce); + this.hash = hash; + return hash; + } + + public void setNonce(int nonce) { + this.nonce = nonce; + } + + public void setPreviousHash(String previousHash) { + this.previousHash = previousHash; } - public Bloc() { + public void setTime(long time) { + this.time = time; + } + + public int getNonce() { + return nonce; + } + + public String getPreviousHash() { + return previousHash; + } + + public long getTime() { + return time; } public String getHash() { return hash; } - public String getHeader() { - return header; - } + // public String getHeader() { + // return header; + // } public void setHash(String hash) { this.hash = hash; } - public void setHeader(String header) { - this.header = header; - } + // public void setHeader(String header) { + // this.header = header; + // } - public Bloc(List<Transaction> transactions) { - this.transactions = transactions; - } + // public Bloc(List<Transaction> transactions) { + // this.transactions = transactions; + // } public List<Transaction> getTransactions() { return transactions; @@ -74,7 +102,7 @@ public class Bloc { List<Transaction> transactions = new ArrayList<Transaction>(); for (Wallet wallet : wallets) { int amount = RandomNumberGenerator.getRandomNumber(1, 20); - UTxO utxo = new UTxO(null, wallet.getKeyPair().getPublic(), amount); + UTxO utxo = new UTxO(null, UUID.randomUUID(), wallet.getKeyPair().getPublic(), amount); wallet.addUTxO(utxo); Blockchain.utxos.add(utxo); List<UTxO> utxos = new ArrayList<UTxO>() { @@ -87,28 +115,10 @@ public class Bloc { transactions.add(coinbase); } // System.out.println("Set UTxO INITIAL " + Blockchain.utxos); - BlocHeader blocHeader = new BlocHeader("", "", Instant.now().toEpochMilli()); - String header = blocHeader.toString(); - 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()); + // BlocHeader blocHeader = new BlocHeader("", "", Instant.now().toEpochMilli()); + // String header = blocHeader.toString(); + // String hash = MinageManager.generateHash(header, 0.0); + return new Bloc(transactions, "0000"); } public String getTransactionsString() { @@ -140,10 +150,8 @@ public class Bloc { @Override public String toString() { - return "{" + - " hash='" + getHash() + "'" + - ", transactions='" + getTransactions() + "'" + - ", header='" + getHeader() + "'" + - "}"; + return "Bloc [hash=" + hash + ", transactions=" + transactions + ", previousHash=" + previousHash + ", time=" + + time + ", nonce=" + nonce + ", coinbase=" + coinbase + "]"; } -} + +} \ No newline at end of file diff --git a/src/main/java/fr/miage/blocs/BlocHeader.java b/src/main/java/fr/miage/blocs/BlocHeader.java index 847334a3cfb44ed2fad233ef31d97318b90a96ae..1e34961f394060cb648ae65fddc9b1b5dc6a8351 100644 --- a/src/main/java/fr/miage/blocs/BlocHeader.java +++ b/src/main/java/fr/miage/blocs/BlocHeader.java @@ -3,35 +3,25 @@ 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; + private String transactionsInfo; + private int nonce; + + public BlocHeader(String transactions, String previousHash, long time, int nonce) { - 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; - // } + this.transactionsInfo = transactions; + this.nonce = nonce; - // public void setHash(String hash) { - // this.hash = hash; - // } + } public String getPreviousHash() { return previousHash; } - // public void setPreviousHash(String previousHash) { - // this.previousHash = previousHash; - // } + public void setNonce(int nonce) { + this.nonce = nonce; + } public long getTime() { return time; @@ -39,27 +29,8 @@ public class BlocHeader { @Override public String toString() { - return "BlocHeader [previousHash=" + previousHash + ", time=" + time + ", transactions=" + transactions + "]"; + return "BlocHeader [previousHash=" + previousHash + ", time=" + time + ", transactions=" + transactionsInfo + + "]"; } - // 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 index 5d930a6f8a35e4a4bc555fdfac0e778b47744596..82cadd91b8e594e78832661c8461bbe6fc4ff6ca 100644 --- a/src/main/java/fr/miage/threads/Mineur.java +++ b/src/main/java/fr/miage/threads/Mineur.java @@ -13,7 +13,6 @@ import fr.miage.blocs.Bloc; public class Mineur extends Thread { private Blockchain blockchain; - private MinageManager minageManager = new MinageManager(blockchain); private Wallet wallet; @@ -25,7 +24,6 @@ public class Mineur extends Thread { } public void run() { - System.out.println("Attente de transactions pour minage...."); while (true) { try { if (Blockchain.transactionsPool.size() >= 20) { @@ -35,7 +33,8 @@ public class Mineur extends Thread { this.transactions = getLastTransactions(); System.out.println("[MINAGE] -- Minage du bloc...."); - Bloc bloc = MinageManager.mineABloc(previousBloc, transactions); + Bloc bloc = new Bloc(transactions, previousBloc.getHash()); + MinageManager.mineABloc(bloc); Blockchain.transactionsPool.removeAll(transactions); transactions.clear(); if (bloc != null) { @@ -45,7 +44,6 @@ public class Mineur extends Thread { + bloc.getCoinbase().getOutputs().getFirst().getMontant()); this.wallet.addUTxO(bloc.getCoinbase().getOutputs().getFirst()); } - // remove the transactions from the pool } Thread.sleep(1000); diff --git a/src/main/java/fr/miage/threads/TransactionCreator.java b/src/main/java/fr/miage/threads/TransactionCreator.java index 3a88652aa31a3f1f6ccee63a0174fa536cafd9d1..58a32094b10474c8148eca6f4d4fe795dc7facef 100644 --- a/src/main/java/fr/miage/threads/TransactionCreator.java +++ b/src/main/java/fr/miage/threads/TransactionCreator.java @@ -16,11 +16,11 @@ public class TransactionCreator extends Thread { public void run() { while (true) { blockchain.createTrasaction(); - System.out.println("[POOL] Nombre de transaction dans la pool : " + Blockchain.transactionsPool.size()); + System.out.println( + "[POOL] Nombre de transaction dans la pool : " + Blockchain.transactionsPool.size() + "\n"); try { Thread.sleep(1000); } catch (InterruptedException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } diff --git a/target/classes/fr/miage/App.class b/target/classes/fr/miage/App.class index dde94adf03d42bc0ead864a54567da56b888d422..1388792d8d6fb77aefb8a404c65223d66c2edde7 100644 Binary files a/target/classes/fr/miage/App.class and b/target/classes/fr/miage/App.class differ