From 3f425360208951c71381006ca436afcd68ca8320 Mon Sep 17 00:00:00 2001 From: Gaby Wald <30340425+gabywald@users.noreply.github.com> Date: Mon, 18 Oct 2021 17:41:28 +0200 Subject: [PATCH 1/2] [blockchain]different way to work applySha256 (not throwing exception) --- .../java/gabywald/crypto/blockchain/Block.java | 9 +-------- .../gabywald/crypto/blockchain/StringUtils.java | 16 ++++++---------- .../gabywald/crypto/blockchain/Transaction.java | 16 +++++----------- .../crypto/blockchain/TransactionOutput.java | 12 +++--------- 4 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/main/java/gabywald/crypto/blockchain/Block.java b/src/main/java/gabywald/crypto/blockchain/Block.java index 71dee6e..36390ec 100644 --- a/src/main/java/gabywald/crypto/blockchain/Block.java +++ b/src/main/java/gabywald/crypto/blockchain/Block.java @@ -52,19 +52,12 @@ public Block(String previousHash ) { * @see StringUtils#applySha256(String) */ public String calculateHash() { - String calculatedhash = null; - try { - calculatedhash = StringUtils.applySha256( + String calculatedhash = StringUtils.applySha256( previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + merkleRoot ); - } catch (BlockchainException e) { - // e.printStackTrace(); - System.out.println( e.getMessage() ); - calculatedhash = null; - } return calculatedhash; } diff --git a/src/main/java/gabywald/crypto/blockchain/StringUtils.java b/src/main/java/gabywald/crypto/blockchain/StringUtils.java index 5505109..d8cfa6b 100644 --- a/src/main/java/gabywald/crypto/blockchain/StringUtils.java +++ b/src/main/java/gabywald/crypto/blockchain/StringUtils.java @@ -28,11 +28,8 @@ public abstract class StringUtils { * Applies Sha256 to a string and returns the result. * @param input * @return (String) - * @throws BlockchainException - * TODO upgrade / improve this method (applySha256) to return null value if any exception inside ! */ - public static String applySha256(String input) - throws BlockchainException { + public static String applySha256(String input) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); // Applies sha256 to our input, @@ -49,7 +46,8 @@ public static String applySha256(String input) return hexString.toString(); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { System.out.println( "StringUtils: " + e.getClass().getName() + ": " + e.getMessage() ); - throw new BlockchainException("StringUtils: " + e.getClass().getName() +": " + e.getMessage()); + // throw new BlockchainException("StringUtils: " + e.getClass().getName() +": " + e.getMessage()); + return null; } } @@ -140,11 +138,9 @@ public static String getMerkleRoot(List transactions) { while (count > 1) { treeLayer = new ArrayList(); for (int i = 1 ; i < previousTreeLayer.size() ; i++) { - try { - treeLayer.add(StringUtils.applySha256(previousTreeLayer.get(i-1) + previousTreeLayer.get(i))); - } catch (BlockchainException e) { - System.out.println( e.getMessage() ); - } + String calculedHash = StringUtils.applySha256(previousTreeLayer.get(i-1) + previousTreeLayer.get(i)); + if (calculedHash != null) + { treeLayer.add( calculedHash ); } } count = treeLayer.size(); previousTreeLayer = treeLayer; diff --git a/src/main/java/gabywald/crypto/blockchain/Transaction.java b/src/main/java/gabywald/crypto/blockchain/Transaction.java index 86f7096..164887f 100644 --- a/src/main/java/gabywald/crypto/blockchain/Transaction.java +++ b/src/main/java/gabywald/crypto/blockchain/Transaction.java @@ -48,17 +48,11 @@ public Transaction(PublicKey from, PublicKey to, float value, List Date: Mon, 18 Oct 2021 18:26:47 +0200 Subject: [PATCH 2/2] [blockchain]Change JSON output (not useful, but for notice) --- pom.xml | 7 ++-- .../gabywald/crypto/blockchain/Block.java | 33 ++++++++++++++++- .../crypto/blockchain/BlockChain.java | 3 +- .../crypto/blockchain/NoobChainTests.java | 23 +++++++----- .../crypto/blockchain/StringUtils.java | 2 +- .../crypto/blockchain/Transaction.java | 35 +++++++++++++++++-- 6 files changed, 84 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 9d6655d..2e3ff8f 100644 --- a/pom.xml +++ b/pom.xml @@ -51,11 +51,8 @@ - - com.google.code.gson - gson - 2.8.8 - + org.bouncycastle diff --git a/src/main/java/gabywald/crypto/blockchain/Block.java b/src/main/java/gabywald/crypto/blockchain/Block.java index 36390ec..e2b8668 100644 --- a/src/main/java/gabywald/crypto/blockchain/Block.java +++ b/src/main/java/gabywald/crypto/blockchain/Block.java @@ -5,13 +5,17 @@ import java.util.List; import java.util.Map; +import gabywald.global.json.JSONException; +import gabywald.global.json.JSONValue; +import gabywald.global.json.JSONifiable; + /** * Block of BlockChain. *
https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa *
https://github.com/CryptoKass/NoobChain-Tutorial-Part-1 * @author Gabriel Chandesris (2021) */ -public class Block { +public class Block extends JSONifiable { private String hash; private String previousHash; @@ -113,4 +117,31 @@ public List getTransactions() { return this.transactions; } + @Override + protected void setKeyValues() { + this.put("hash", JSONValue.instanciate( this.hash.toString() ) ); + this.put("previousHash", JSONValue.instanciate( this.previousHash.toString() ) ); + this.put("timeStamp", JSONValue.instanciate( this.timeStamp ) ); + this.put("nonce", JSONValue.instanciate( this.nonce ) ); + this.put("transactions", JSONifiable.generateArray( this.transactions ) ); + } + + @Override + protected T reloadFrom(String json) + throws JSONException { + return null; + } + + @Override + public String toString() { + StringBuilder sbToReturn = new StringBuilder(); + sbToReturn.append("hash").append(": ").append( this.hash.toString() ).append("\n"); + sbToReturn.append("previousHash").append(": ").append( this.previousHash.toString() ).append("\n"); + sbToReturn.append("timeStamp").append(": ").append( this.timeStamp ).append("\n"); + sbToReturn.append("transactions").append(": \n"); + for (Transaction transaction : this.transactions) { + sbToReturn.append("\t transaction").append(": ").append( transaction.toString() ).append("\n"); + } + return sbToReturn.toString(); + } } diff --git a/src/main/java/gabywald/crypto/blockchain/BlockChain.java b/src/main/java/gabywald/crypto/blockchain/BlockChain.java index 0166905..13b425d 100644 --- a/src/main/java/gabywald/crypto/blockchain/BlockChain.java +++ b/src/main/java/gabywald/crypto/blockchain/BlockChain.java @@ -8,7 +8,7 @@ * * @author Gabriel Chandesris (2021) */ -public abstract class BlockChain { +public class BlockChain { /** * Build a list of Blocks. @@ -141,4 +141,5 @@ public static boolean addBlock(final List blockchain, final Block newBloc newBlock.mineBlock(difficulty); return blockchain.add(newBlock); } + } diff --git a/src/main/java/gabywald/crypto/blockchain/NoobChainTests.java b/src/main/java/gabywald/crypto/blockchain/NoobChainTests.java index 867f43f..39174b8 100644 --- a/src/main/java/gabywald/crypto/blockchain/NoobChainTests.java +++ b/src/main/java/gabywald/crypto/blockchain/NoobChainTests.java @@ -8,7 +8,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.google.gson.GsonBuilder; +// import com.google.gson.GsonBuilder; + +import gabywald.global.json.JSONifiable; /** * Tests about BlockChain / NoobChain. @@ -48,9 +50,13 @@ void testPart02() { blockchain.add(new Block("Yo im the second block", blockchain.get(blockchain.size()-1).getHash() )); blockchain.add(new Block("Hey im the third block", blockchain.get(blockchain.size()-1).getHash() )); Assertions.assertEquals(3, blockchain.size()); - String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); - Assertions.assertNotNull( blockchainJson ); + + String blockchainJson = JSONifiable.generateArray( blockchain ).toString(); + // String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); + System.out.println("\nThe block chain: "); System.out.println(blockchainJson); + + // for (Block block : blockchain) { System.out.println( block ); } } @Test @@ -76,12 +82,12 @@ void testPart03() { Assertions.assertTrue( BlockChain.isChainValidV1( blockchain ) ); - String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); - - Assertions.assertNotNull( blockchainJson ); - + String blockchainJson = JSONifiable.generateArray( blockchain ).toString(); + // String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("\nThe block chain: "); System.out.println(blockchainJson); + + // for (Block block : blockchain) { System.out.println( block ); } } @Test @@ -188,8 +194,9 @@ void testPart05() { Block block3 = new Block(block2.getHash() ); System.out.println("\nWalletB is Attempting to send funds (20) to WalletA..."); - boolean bBlock3AddTransactionResult = block3.addTransaction( walletB.sendFunds( walletA.getPublicKey(), 20, mapUTXOs), + boolean bBlock3AddTransactionResult = block3.addTransaction( walletB.sendFunds( walletA.getPublicKey(), 20f, mapUTXOs), mapUTXOs, minimumTransaction); + Assertions.assertTrue( bBlock3AddTransactionResult ); System.out.println("\nWalletA's balance is: " + walletA.getBalance( mapUTXOs )); System.out.println("WalletB's balance is: " + walletB.getBalance( mapUTXOs )); diff --git a/src/main/java/gabywald/crypto/blockchain/StringUtils.java b/src/main/java/gabywald/crypto/blockchain/StringUtils.java index d8cfa6b..d3de0c4 100644 --- a/src/main/java/gabywald/crypto/blockchain/StringUtils.java +++ b/src/main/java/gabywald/crypto/blockchain/StringUtils.java @@ -31,7 +31,7 @@ public abstract class StringUtils { */ public static String applySha256(String input) { try { - MessageDigest digest = MessageDigest.getInstance("SHA-256"); + MessageDigest digest = MessageDigest.getInstance("SHA-256"); // Applies sha256 to our input, byte[] hash = digest.digest(input.getBytes("UTF-8")); // This will contain hash as hexidecimal diff --git a/src/main/java/gabywald/crypto/blockchain/Transaction.java b/src/main/java/gabywald/crypto/blockchain/Transaction.java index 164887f..35a3cc6 100644 --- a/src/main/java/gabywald/crypto/blockchain/Transaction.java +++ b/src/main/java/gabywald/crypto/blockchain/Transaction.java @@ -7,6 +7,11 @@ import java.util.List; import java.util.Map; + +import gabywald.global.json.JSONException; +import gabywald.global.json.JSONValue; +import gabywald.global.json.JSONifiable; + import java.util.ArrayList; import java.util.Base64; @@ -16,7 +21,7 @@ *
https://github.com/CryptoKass/NoobChain-Tutorial-Part-2 * @author Gabriel Chandesris (2021) */ -public class Transaction { +public class Transaction extends JSONifiable { /** This is also the hash of the transaction. */ private String transactionId; /** senders address/public key. */ @@ -206,8 +211,6 @@ public float getOutputsValue() { return total; } - - public void setTransactionId(String transactionId) { this.transactionId = transactionId; } @@ -229,4 +232,30 @@ public List getOutputs() public List getInputs() { return this.inputs; } + @Override + protected void setKeyValues() { + this.put("transactionId", JSONValue.instanciate( this.transactionId.toString() ) ); + this.put("sender", JSONValue.instanciate( this.sender.toString() ) ); + this.put("recipient", JSONValue.instanciate( this.recipient.toString() ) ); + this.put("value", JSONValue.instanciate( this.value ) ); + // this.put("signature", JSONValue.instanciate( this.signature ) ); + // this.put("sequence", JSONValue.instanciate( this.sequence ) ); + } + + @Override + protected T reloadFrom(String json) + throws JSONException { + return null; + } + + @Override + public String toString() { + StringBuilder sbToReturn = new StringBuilder(); + sbToReturn.append("transactionId").append(": ").append( this.transactionId.toString() ).append("\n"); + sbToReturn.append("sender").append(": ").append( this.sender.toString() ).append("\n"); + sbToReturn.append("recipient").append(": ").append( this.recipient ).append("\n"); + sbToReturn.append("value").append(": ").append( this.value ).append("\n"); + return sbToReturn.toString(); + } + }