From fe8e8211a7fd5b6849c1de0a7219328eb55a44c5 Mon Sep 17 00:00:00 2001 From: oleksii Date: Mon, 19 Nov 2018 00:33:14 +0200 Subject: [PATCH 1/2] First phase implementation done --- src/blockchain/Block.java | 40 +++++++++++++++++++++++++++++++ src/blockchain/Blockchain.java | 44 ++++++++++++++++++++++++++++++++++ src/blockchain/Main.java | 18 ++++++++++++-- src/blockchain/StringUtil.java | 28 ++++++++++++++++++++++ 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/blockchain/Block.java create mode 100644 src/blockchain/Blockchain.java create mode 100644 src/blockchain/StringUtil.java diff --git a/src/blockchain/Block.java b/src/blockchain/Block.java new file mode 100644 index 0000000..534b357 --- /dev/null +++ b/src/blockchain/Block.java @@ -0,0 +1,40 @@ +package blockchain; + +public class Block { + + private final Integer id; + private final String hashPreviousBlock; + private final String hash; + private final String data; + private final Long timestamp; + + + public Block(Integer id, String hashPreviousBlock, String hash, String data, + Long timestamp) { + this.id = id; + this.hashPreviousBlock = hashPreviousBlock; + this.hash = hash; + this.data = data; + this.timestamp = timestamp; + } + + public Integer getId() { + return id; + } + + public String getHashPreviousBlock() { + return hashPreviousBlock; + } + + public String getHash() { + return hash; + } + + public Long getTimestamp() { + return timestamp; + } + + public String getData() { + return data; + } +} diff --git a/src/blockchain/Blockchain.java b/src/blockchain/Blockchain.java new file mode 100644 index 0000000..39c97f6 --- /dev/null +++ b/src/blockchain/Blockchain.java @@ -0,0 +1,44 @@ +package blockchain; + +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedList; + +public class Blockchain implements Iterable { + + private final LinkedList blocks; + + public Blockchain() { + blocks = new LinkedList<>(Collections.singleton( + new Block(1, + "0", + StringUtil.applySha256("0" + "pivot"), + "pivot", + new Date().getTime())) + ); + } + + public void generate() { + Long timestamp = new Date().getTime(); + Block tailBlock = blocks.getLast(); + String hash = StringUtil.applySha256(tailBlock.getHash() + "hello"); + blocks.add(new Block(tailBlock.getId() + 1, tailBlock.getHash(), hash, "hello", timestamp)); + } + + public boolean validate() { + for (int i = 1; i < blocks.size(); i++) { + Block prev = blocks.get(i - 1); + Block cur = blocks.get(i); + if (!cur.getHashPreviousBlock().equals(prev.getHash())) { + return false; + } + } + return true; + } + + @Override + public Iterator iterator() { + return blocks.iterator(); + } +} diff --git a/src/blockchain/Main.java b/src/blockchain/Main.java index adf1d02..c44806f 100644 --- a/src/blockchain/Main.java +++ b/src/blockchain/Main.java @@ -1,7 +1,21 @@ package blockchain; public class Main { - public static void main(String[] args) { - System.out.print("Hello world!"); + + public static void main(String[] args) { + Blockchain blockchain = new Blockchain(); + for (int i = 0; i < 10; i++) { + blockchain.generate(); + } + + for (Block block : blockchain) { + System.out.printf("Block:\n"); + System.out.printf("Id: %s\n", block.getId()); + System.out.printf("Timestamp: %s\n", block.getTimestamp()); + System.out.printf("Hash of the previous block:\n%s\n", block.getHashPreviousBlock()); + System.out.printf("Hash of the block: \n%s\n\n", block.getHash()); } + + System.out.println(blockchain.validate()); + } } \ No newline at end of file diff --git a/src/blockchain/StringUtil.java b/src/blockchain/StringUtil.java new file mode 100644 index 0000000..9a4c32d --- /dev/null +++ b/src/blockchain/StringUtil.java @@ -0,0 +1,28 @@ +package blockchain; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +public class StringUtil { + + /** + * Applies Sha256 to a string and returns a hash. + */ + public static String applySha256(String input) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte elem : hash) { + String hex = Integer.toHexString(0xff & elem); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} From d920eb04845a12697b6d3dce74f0a7ce1f67e9f0 Mon Sep 17 00:00:00 2001 From: oleksii Date: Sat, 15 Dec 2018 16:11:26 +0200 Subject: [PATCH 2/2] First phase implementation done --- src/blockchain/Block.java | 9 +-------- src/blockchain/Blockchain.java | 7 +++---- src/blockchain/Main.java | 2 -- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/blockchain/Block.java b/src/blockchain/Block.java index 534b357..eacfa16 100644 --- a/src/blockchain/Block.java +++ b/src/blockchain/Block.java @@ -5,16 +5,13 @@ public class Block { private final Integer id; private final String hashPreviousBlock; private final String hash; - private final String data; private final Long timestamp; - public Block(Integer id, String hashPreviousBlock, String hash, String data, - Long timestamp) { + public Block(Integer id, String hashPreviousBlock, String hash, Long timestamp) { this.id = id; this.hashPreviousBlock = hashPreviousBlock; this.hash = hash; - this.data = data; this.timestamp = timestamp; } @@ -33,8 +30,4 @@ public String getHash() { public Long getTimestamp() { return timestamp; } - - public String getData() { - return data; - } } diff --git a/src/blockchain/Blockchain.java b/src/blockchain/Blockchain.java index 39c97f6..dac77fc 100644 --- a/src/blockchain/Blockchain.java +++ b/src/blockchain/Blockchain.java @@ -13,8 +13,7 @@ public Blockchain() { blocks = new LinkedList<>(Collections.singleton( new Block(1, "0", - StringUtil.applySha256("0" + "pivot"), - "pivot", + StringUtil.applySha256("0"), new Date().getTime())) ); } @@ -22,8 +21,8 @@ public Blockchain() { public void generate() { Long timestamp = new Date().getTime(); Block tailBlock = blocks.getLast(); - String hash = StringUtil.applySha256(tailBlock.getHash() + "hello"); - blocks.add(new Block(tailBlock.getId() + 1, tailBlock.getHash(), hash, "hello", timestamp)); + String hash = StringUtil.applySha256(tailBlock.getHash()); + blocks.add(new Block(tailBlock.getId() + 1, tailBlock.getHash(), hash, timestamp)); } public boolean validate() { diff --git a/src/blockchain/Main.java b/src/blockchain/Main.java index c44806f..e343207 100644 --- a/src/blockchain/Main.java +++ b/src/blockchain/Main.java @@ -15,7 +15,5 @@ public static void main(String[] args) { System.out.printf("Hash of the previous block:\n%s\n", block.getHashPreviousBlock()); System.out.printf("Hash of the block: \n%s\n\n", block.getHash()); } - - System.out.println(blockchain.validate()); } } \ No newline at end of file