diff --git a/pom.xml b/pom.xml index 8debaf11b880e4b075cc973e0df085b85b5ee3bf..0f1c75e78f7aed8cca2c9d66cda8fbf70954df8c 100644 --- a/pom.xml +++ b/pom.xml @@ -14,8 +14,9 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <maven.compiler.source>1.8</maven.compiler.source> - <maven.compiler.target>1.8</maven.compiler.target> + <maven.compiler.source>21</maven.compiler.source> + <maven.compiler.target>21</maven.compiler.target> + <maven.compiler.release>21</maven.compiler.release> </properties> <dependencies> diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java index 71b6b24fb0e14d830574bd8deeb73d7fab33f30c..6d01adca9e4b2ef8e18fd1d76548fbdbb3573cbf 100644 --- a/src/main/java/fr/miage/App.java +++ b/src/main/java/fr/miage/App.java @@ -8,6 +8,12 @@ public class App { public static void main( String[] args ) { - System.out.println( "Hello World!" ); + System.out.println("Début de la blockchain"); + // Création de la blockchain + Blockchain blockchain = new Blockchain("BloBlockchain"); + //Création de 2 wallets + Wallet bobWallet = new Wallet("publicKey1", "privateKey1"); + Wallet aliceWallet = new Wallet("publicKey2", "privateKey2"); + } } diff --git a/src/main/java/fr/miage/Bloc.java b/src/main/java/fr/miage/Bloc.java index f4cffff5b629086a9e3aa7fd2d45ee03ab2a383f..2fe1256d91c0e03449ad26873225eb1b610d69d0 100644 --- a/src/main/java/fr/miage/Bloc.java +++ b/src/main/java/fr/miage/Bloc.java @@ -3,5 +3,38 @@ package fr.miage; import java.util.List; public class Bloc { + private String hash; private List<Transaction> transactions; + private String header; + + + public Bloc(String hash,List<Transaction> transactions) { + this.hash = hash; + this.transactions = transactions; + } + + public String getHash() { + return hash; + } + public String getHeader() { + return header; + } + public void setHash(String hash) { + this.hash = hash; + } + public void setHeader(String header) { + this.header = header; + } + + + public Bloc(List<Transaction> transactions) { + this.transactions = transactions; + } + + public List<Transaction> getTransactions() { + return transactions; + } + public void setTransactions(List<Transaction> transactions) { + this.transactions = transactions; + } } diff --git a/src/main/java/fr/miage/BlocHeader.java b/src/main/java/fr/miage/BlocHeader.java new file mode 100644 index 0000000000000000000000000000000000000000..0f5f02ddd3adf6fe0c756a8fd20d4c8ad622c084 --- /dev/null +++ b/src/main/java/fr/miage/BlocHeader.java @@ -0,0 +1,60 @@ +// 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 hash, String previousHash, long time, long nonce, long size) { +// 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 651cafafade3183da0ec98d0bdd5c6a1657d38fc..c3f539863199bf9467fefa2b17cddad8ed9d4f9c 100644 --- a/src/main/java/fr/miage/Blockchain.java +++ b/src/main/java/fr/miage/Blockchain.java @@ -5,4 +5,10 @@ import java.util.LinkedList; public class Blockchain { private String name; private LinkedList<Bloc> blocs; + + public Blockchain(String name) { + this.name = name; + this.blocs = new LinkedList<Bloc>(); + } + } diff --git a/src/main/java/fr/miage/EnumTypeTransaction.java b/src/main/java/fr/miage/EnumTypeTransaction.java new file mode 100644 index 0000000000000000000000000000000000000000..765fc59d374b85d1e7d135fec0503d15a9968d39 --- /dev/null +++ b/src/main/java/fr/miage/EnumTypeTransaction.java @@ -0,0 +1,5 @@ +package fr.miage; + +public enum EnumTypeTransaction { + NORMAL, COINBASE; +} diff --git a/src/main/java/fr/miage/MinageManager.java b/src/main/java/fr/miage/MinageManager.java index 17cc5742565442f74e19f70e9388749e6fb05a63..ac0d41424d0e514939c3fab38bb5c004f9f4cfd1 100644 --- a/src/main/java/fr/miage/MinageManager.java +++ b/src/main/java/fr/miage/MinageManager.java @@ -1,5 +1,39 @@ package fr.miage; +import java.math.BigInteger; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Optional; +import java.util.stream.DoubleStream; + +import javax.swing.text.html.Option; + +import org.apache.commons.codec.digest.DigestUtils; + public class MinageManager { - //TODO + + private static final int DIFFICULTY = 27; + + + + public MinageManager() { + } + + + public Bloc mineABloc(Bloc previousBloc) { + double target = Math.pow(2, 256 - DIFFICULTY); + //DoubleStream doubleStream = DoubleStream.iterate(0, i -> i + 1).limit((long) Math.pow(2, DIFFICULTY)); + Compute result = new Compute(new BigInteger(DigestUtils.sha256Hex(previousBloc.getHeader() + Math.pow(2,DIFFICULTY)), 16).doubleValue(), Math.pow(2,DIFFICULTY)); + if(result.hash < target){ + System.out.println("Bloc miné avec succès : " + result.nonce); + System.out.println("Hash : " + DigestUtils.sha256Hex(previousBloc.getHeader() + result.nonce)); + Bloc bloc = new Bloc(transactions, new BlocHeader(DigestUtils.sha256Hex(previousBloc.getHeader() + result.nonce), previousBloc.getHeader(), System.currentTimeMillis(), result.nonce, transactions.size())); + } + System.out.println("Failed after " + BlocHeader.DIFFICULTY + " tries"); + return new Result("", BlocHeader.DIFFICULTY); + + } + + 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 bd17ac27115b836222af12e21ddd41e1464cd066..b7ca27528f4814f8c177aa172a784c6e17056f5b 100644 --- a/src/main/java/fr/miage/Transaction.java +++ b/src/main/java/fr/miage/Transaction.java @@ -6,6 +6,16 @@ public class Transaction { private String id; private List<UTxO> inputs; private List<UTxO> outputs; + //private double fees; private String signature; + private String typeTransaction; + + public Transaction(String id, List<UTxO> inputs, List<UTxO> outputs, String signature, String typeTransaction) { + this.id = id; + this.inputs = inputs; + this.outputs = outputs; + this.signature = signature; + } + //créer transaction coinbase } diff --git a/src/main/java/fr/miage/UTxO.java b/src/main/java/fr/miage/UTxO.java index 6275dfba20b6651877662715f66064214d8b17f7..e52bfef990b98f0370e49d640139c4e38a17bd5b 100644 --- a/src/main/java/fr/miage/UTxO.java +++ b/src/main/java/fr/miage/UTxO.java @@ -5,4 +5,11 @@ public class UTxO { private String hashWallet; // hash du wallet private Transaction transaction; // transaction précédente (provenance de l'argent) --> peut etre meme que le hash de la transaction private double montant; + + public UTxO(String hashWallet, Transaction transaction, double montant) { + this.hashWallet = hashWallet; + this.transaction = transaction; + this.montant = montant; + } + } diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java index 7f02c73127e499cb5b4d7a2c638e3afc0e7a5715..49d390cdfc7df0d7eeec4c79b345fb945c6fe159 100644 --- a/src/main/java/fr/miage/Wallet.java +++ b/src/main/java/fr/miage/Wallet.java @@ -1,5 +1,8 @@ package fr.miage; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.List; public class Wallet { @@ -13,5 +16,14 @@ public class Wallet { this.publicKey = publicKey; this.privateKey = privateKey; } + + public void initWallet(byte[] data) throws NoSuchAlgorithmException{ + + } + + private String hashSha256(String privateKey) throws NoSuchAlgorithmException{ + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hash = md.digest(privateKey.getBytes(StandardCharsets.UTF_8)); + } } diff --git a/target/blockchain-project-1.0-SNAPSHOT.jar b/target/blockchain-project-1.0-SNAPSHOT.jar index 7de4d656a0ec888f2265e9e8c7a4b85fc456a088..f988b3b41a7cb272d887a9a6c7dcaa36582b7f2b 100644 Binary files a/target/blockchain-project-1.0-SNAPSHOT.jar 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 index 2d323d3bb26f550b630926e29147fce43ff6dd00..e101c779abed4e7b739e1fa70d480be8175b415c 100644 Binary files a/target/classes/fr/miage/App.class and b/target/classes/fr/miage/App.class differ 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 index a6e1610dec9c1092eb02c52d3fa7ca8dad0b362a..be281bf01b03b789780e7cc2b46bf12684a2eabe 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1 +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 index b3b66de328ae313efc5380a048374ad03ff3ebc2..1ddb5f309e514dde9bd943a2edf1123475ceac1e 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1 +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