Skip to content
Snippets Groups Projects
Commit e4965e85 authored by saintdi25u's avatar saintdi25u
Browse files

modification code + ajout readme

parent 2cc94e66
No related branches found
No related tags found
1 merge request!2refacto: Update README
Blockchaindiag.drawio.png

78.6 KiB

......@@ -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
![alt text](Blockchaindiag.drawio.png)
## 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....
<?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
......@@ -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();
......
......@@ -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 {
......
......@@ -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) {
......
......@@ -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() {
......
......@@ -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);
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment