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