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)