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)