diff --git a/Blockchaindiag.drawio.png b/Blockchaindiag.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3fae5b25e03a72a69547febd0dcfa2fbc8a666 Binary files /dev/null and b/Blockchaindiag.drawio.png differ diff --git a/README.md b/README.md index 30afc98d55416f3e8c71adad9ac5a7c4e8590eaa..9cb8c846743883f43d9118a87d3d6633ade9f695 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ Avant de passer à la réalisation et au développement de la blockchain, il a Pour se faire, nous avons décidé de représenter les différentes entités d'une blockchain en différentes classes : - - Une classe Blockchain, représentant la blockchain dans sa globalité; - - Une classe Bloc, représentant les blocs contenues dans la blockchain; - - Une classe Transaction, représentant une transaction qui sera contenu dans un bloc; - - Une classe Coinbase, qui hérite de Transaction, cette classe va représenter une transaction coinbase dans un bloc; - - Une classe UTxO, représentant le détails des tranasactions - - Une classe Wallet représentant un wallet enregistré sur la blockchain +- Une classe Blockchain, représentant la blockchain dans sa globalité; +- Une classe Bloc, représentant les blocs contenues dans la blockchain; +- Une classe Transaction, représentant une transaction qui sera contenu dans un bloc; +- Une classe Coinbase, qui hérite de Transaction, cette classe va représenter une transaction coinbase dans un bloc; +- Une classe UTxO, représentant le détails des tranasactions +- Une classe Wallet représentant un wallet enregistré sur la blockchain - TODO : METTRE DIAGRAMME DE CLASSE + ## Réalisation @@ -35,19 +35,54 @@ Plus précisément, lors d'une transaction, les UTx0 outputs de cette dernière Une transaction est identifé par : - - Un ID de transaction; - - Un wallet de provenance et un wallet de destination; - - Une liste d'UTxO inputs et une liste d'UTxO outputs; - - D'une signature +- Un ID de transaction; +- Un wallet de provenance et un wallet de destination; +- Une liste d'UTxO inputs et une liste d'UTxO outputs; +- D'une signature Au sein de notre blockchain, pour simuler la création d'une transaction, notre programme va éxéuter la suite d'instruction suivante : - 1) Sélection d'un wallet de provenance et d'un wallet de destination de façon aléatoire - 2) Séléction d'un montant à envoyer - 3) Signature de la transaction par le wallet de provenance - 4) Vérification de la signature - 5) Création de la transaction +1) Sélection d'un wallet de provenance et d'un wallet de destination de façon aléatoire +2) Sélection d'un montant à envoyer +3) Signature de la transaction par le wallet de provenance +4) Vérification de la signature +5) Création de la transaction + +Une fois les transactions crées nous pouvons passer au minage d'un bloc. + +### Minage d'un bloc + +Pour le minage d'un bloc, nous avons fais le choix de créer une classe MinageManager avec une fonction `static mineABloc(Bloc bloc)`. + +Cette fonction va effectuer les tâches suivantes : + +- Ajouter une coinbase transaction contenant un seul UTxO outputs d'une valeur de 5 qui sera la récompense du mineur qui arrive a miné le bloc. +- De générer une target +- De rentrer dans une boucle et il en sortira seulement dans le cas ou le mineur aura trouvé un hash satisfaisant. + +### Assemblage + +Une fois les principaux composants de la blockchain modéliser, il a fallu mettre en place un système permettant à la fois de créer des transactions et à la fois de miner un bloc dès lors que notre "pool" de transaction arrive à 50. En effet, dans notre blockchain, le minage d'un bloc se déclenche dès lors que nous avons 50 transactions dans notre "pool". + + +#### Thread : TransactionCreator + +Dans notre classe `TransactionCreator` qui étend de `Thread`, il va appeler la fonction static `createTransaction` de la classe `Blockchain` toute les 1 seconde. + +#### Thread : Mineur + +Notre classe `Mineur` qui étend de `Thread` effectue un peu plus de traitement. En effet, le traitement est le suivant : + +1) On récupére le dernier bloc de la blockchain +2) On récupère les 50 dernières transactions +3) On créer le bloc qui contient les transactions et le hash du bloc précédent +4) On mine le bloc comme expliqué ci-dessus. + +### Conclusion + +Le développement de notre blockchain a été une expérience intéressante. Il nous a permis de développé une compréhension des principes fondamentaux d'une blockchain ainsi que son potentiel pour révolutionner plusieurs secteurs grâce à sa transparense, sa sécurité et sa décentralisation. + + -Une fois les transactions crées nous pouvons passer au minage d'un bloc.... diff --git a/blockchain-project.iml b/blockchain-project.iml new file mode 100644 index 0000000000000000000000000000000000000000..3b0c98fb511c7d61c66d12b0c4f2698c2334f5b7 --- /dev/null +++ b/blockchain-project.iml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module version="4"> + <component name="AdditionalModuleElements"> + <content url="file://$MODULE_DIR$" dumb="true"> + <excludeFolder url="file://$MODULE_DIR$/.idea/copilot/chatSessions" /> + </content> + </component> +</module> \ No newline at end of file diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java index 0b47048992d8ac7a168402e96777981a19ccbeec..09f8cd9802d1424ae0779dcc73b157a3a97e8042 100644 --- a/src/main/java/fr/miage/App.java +++ b/src/main/java/fr/miage/App.java @@ -10,8 +10,7 @@ import fr.miage.threads.TransactionCreator; public class App { public static synchronized void main(String[] args) throws NoSuchAlgorithmException, InterruptedException { - Blockchain blockchain = new Blockchain("Blockchain de Jérémy BRODIER et Corentin SAINT-DIZIER"); - + Blockchain blockchain = Blockchain.getInstance("Blockchain de Jérémy BRODIER et Corentin SAINT-DIZIER"); TransactionCreator transactionCreator = new TransactionCreator(blockchain); Mineur mineur = new Mineur(blockchain); transactionCreator.start(); diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java index d9cda316c1c764bd2e89c3206c7f8121d011544a..fb7f5c1693cce714290ca4ab89a0a632ee95fbba 100644 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -16,13 +16,15 @@ import java.util.Set; import fr.miage.blocs.Bloc; public class Blockchain { + + private static Blockchain instance = null; private String name; private LinkedList<Bloc> blocs; private List<Wallet> wallets; public static Set<UTxO> utxos = new HashSet<>(); public static Set<Transaction> transactionsPool = new HashSet<>(); - public Blockchain(String name) throws NoSuchAlgorithmException, InterruptedException { + private Blockchain(String name) throws NoSuchAlgorithmException, InterruptedException { this.name = name; this.wallets = setupWallet(); // Création du premier bloc contenant les transactions de coinbase @@ -32,7 +34,14 @@ public class Blockchain { } }; ; - System.out.println("[BLOC] --- Hash du genesis bloc : " + this.blocs.getFirst().getHash()); + } + + public static Blockchain getInstance(String name) throws NoSuchAlgorithmException, InterruptedException { + if (instance == null) { + instance = new Blockchain(name); + } + return instance; + } public List<Wallet> setupWallet() throws NoSuchAlgorithmException, InterruptedException { diff --git a/src/main/java/fr/miage/MinageManager.java b/src/main/java/fr/miage/MinageManager.java index ee068ff363c917afdfef31ff0ee4baf7bf800e9e..1bfad92b8e99d50a44f92732e90ccbb74263b3a5 100644 --- a/src/main/java/fr/miage/MinageManager.java +++ b/src/main/java/fr/miage/MinageManager.java @@ -17,12 +17,9 @@ import fr.miage.blocs.BlocHeader; public class MinageManager { - private static final int DIFFICULTY = 6; - private static double MAX_NONCE = Math.pow(2, 32); - private Blockchain blockchain; + private static final int DIFFICULTY = 5; - public MinageManager(Blockchain blockchain) { - this.blockchain = blockchain; + public MinageManager() { } public static void mineABloc(Bloc bloc) { diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java index 47d0cff0b0ae5e9adea21ce6fba61767d0e67697..ba422e5bfbb34313790eee5dbf44b2b410b392c9 100644 --- a/src/main/java/fr/miage/Wallet.java +++ b/src/main/java/fr/miage/Wallet.java @@ -9,7 +9,6 @@ import java.util.List; public class Wallet { private KeyPair keyPair; - private double solde; private List<UTxO> utxos; private String name; // temp @@ -69,7 +68,7 @@ public class Wallet { @Override public String toString() { - return "Wallet [keyPair=" + keyPair + ", solde=" + solde + ", utxos=" + utxos + ", name=" + name + "]"; + return "Wallet [keyPair=" + keyPair + ", utxos=" + utxos + ", name=" + name + "]"; } public KeyPair getKeyPair() { diff --git a/src/main/java/fr/miage/threads/Mineur.java b/src/main/java/fr/miage/threads/Mineur.java index 82cadd91b8e594e78832661c8461bbe6fc4ff6ca..4ce51f48920a993afeff55203f4283ea1f6e6bec 100644 --- a/src/main/java/fr/miage/threads/Mineur.java +++ b/src/main/java/fr/miage/threads/Mineur.java @@ -34,8 +34,8 @@ public class Mineur extends Thread { System.out.println("[MINAGE] -- Minage du bloc...."); Bloc bloc = new Bloc(transactions, previousBloc.getHash()); - MinageManager.mineABloc(bloc); Blockchain.transactionsPool.removeAll(transactions); + MinageManager.mineABloc(bloc); transactions.clear(); if (bloc != null) { blockchain.addBloc(bloc); diff --git a/target/classes/fr/miage/App.class b/target/classes/fr/miage/App.class index 1388792d8d6fb77aefb8a404c65223d66c2edde7..01a6e190c4e3380acf2bd19f9ed4efe3719e9b64 100644 Binary files a/target/classes/fr/miage/App.class and b/target/classes/fr/miage/App.class differ