package com.baeldung.blockchain; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; public class Block { private static Logger logger = Logger.getLogger(Block.class.getName()); private String hash; private 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 = calculateBlockHash(); } public String mineBlock(int prefix) { String prefixString = new String(new char[prefix]).replace('\0', '0'); while (!hash.substring(0, prefix) .equals(prefixString)) { nonce++; hash = calculateBlockHash(); } return hash; } public String calculateBlockHash() { String dataToHash = previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data; MessageDigest digest = null; byte[] bytes = null; try { digest = MessageDigest.getInstance("SHA-256"); bytes = digest.digest(dataToHash.getBytes("UTF-8")); } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) { logger.log(Level.SEVERE, ex.getMessage()); } StringBuffer buffer = new StringBuffer(); for (byte b : bytes) { buffer.append(String.format("%02x", b)); } return buffer.toString(); } public String getHash() { return this.hash; } public String getPreviousHash() { return this.previousHash; } public void setData(String data) { this.data = data; } }