Folder Structure
SimpleCrypto/ ├── src/ │ └── main/ │ └── java/ │ └── com/ │ └── crypto/ │ ├── Block.java │ ├── Blockchain.java │ └── Main.java ├── pom.xml (if using Maven)
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; } }
// 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; } }
// 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); } } }
// 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(); } } }
How to run
- Compile all files:
javac -d out src/main/java/com/crypto/*.java
- Run the program:
java -cp out com.crypto.Main
Top comments (0)