DEV Community

Shelner
Shelner

Posted on

Super Simple Blockchain using Java

Folder Structure

SimpleCrypto/ ├── src/  └── main/  └── java/  └── com/  └── crypto/  ├── Block.java  ├── Blockchain.java  └── Main.java ├── pom.xml (if using Maven) 
Enter fullscreen mode Exit fullscreen mode

Features

  • Blocks linked via hashes
  • SHA-256 hashing
  • Proof-of-work via nonce
  • Basic blockchain validation

Code

// Block.java package com.crypto; import java.util.Date; public class Block { public String hash; public String previousHash; private String data; private long timeStamp; private int nonce; public Block(String data, String previousHash) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); } public String calculateHash() { String input = previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data; return StringUtil.applySha256(input); } public void mineBlock(int difficulty) { String target = new String(new char[difficulty]).replace('\0', '0'); while (!hash.substring(0, difficulty).equals(target)) { nonce++; hash = calculateHash(); } System.out.println("Block mined: " + hash); } public String getData() { return data; } } 
Enter fullscreen mode Exit fullscreen mode
// Blockchain.java package com.crypto; import java.util.ArrayList; public class Blockchain { public static ArrayList<Block> blockchain = new ArrayList<>(); public static int difficulty = 4; public static void addBlock(Block newBlock) { newBlock.mineBlock(difficulty); blockchain.add(newBlock); } public static boolean isChainValid() { for (int i = 1; i < blockchain.size(); i++) { Block currentBlock = blockchain.get(i); Block previousBlock = blockchain.get(i - 1); if (!currentBlock.hash.equals(currentBlock.calculateHash())) { return false; } if (!currentBlock.previousHash.equals(previousBlock.hash)) { return false; } } return true; } } 
Enter fullscreen mode Exit fullscreen mode
// StringUtil.java package com.crypto; import java.security.MessageDigest; public class StringUtil { public static String applySha256(String input) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(input.getBytes("UTF-8")); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch (Exception e) { throw new RuntimeException(e); } } } 
Enter fullscreen mode Exit fullscreen mode
// Main.java package com.crypto; public class Main { public static void main(String[] args) { Blockchain.addBlock(new Block("First block", "0")); Blockchain.addBlock(new Block("Second block", Blockchain.blockchain.get(Blockchain.blockchain.size()-1).hash)); Blockchain.addBlock(new Block("Third block", Blockchain.blockchain.get(Blockchain.blockchain.size()-1).hash)); System.out.println("\nBlockchain is valid: " + Blockchain.isChainValid()); System.out.println("\nBlockchain:"); for (Block block : Blockchain.blockchain) { System.out.println("Hash: " + block.hash); System.out.println("Previous: " + block.previousHash); System.out.println("Data: " + block.getData()); System.out.println(); } } } 
Enter fullscreen mode Exit fullscreen mode

How to run

  1. Compile all files:
javac -d out src/main/java/com/crypto/*.java 
Enter fullscreen mode Exit fullscreen mode
  1. Run the program:
java -cp out com.crypto.Main 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)