我是靠谱客的博主 等待水池,最近开发中收集的这篇文章主要介绍Java实现区块链 --- 代码篇首先弄清楚需要哪些信息创建一个Block类创建一个工具类创建一个测试类结果源码地址,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
首先弄清楚需要哪些信息
自身的hash值,上一个区块的hash值,保存的数据信息,时间戳,随机数。
创建一个Block类
package blockChain;
import java.util.Date;
/**
* @author WuYongheng
* @date 2022/10/22
* @description
*/
public class Block {
public String hash;
public String previousHash;
private String data;
private long timeStamp;
private int nonce;
/**
* 区块构造函数
*
* @param previousHash
* @param data
*/
public Block(String data, String previousHash) {
this.previousHash = previousHash;
this.data = data;
this.timeStamp = new Date().getTime();
this.hash = calculateHash();
}
/**
* 计算区块的hash值,使用SHA256加密算法
* nonce每加一次,都会调用一次applySha256()方法
*
* @return calculateHash
*/
private String calculateHash() {
String calculateHash = StringUtil.applySha256(
previousHash
+ Long.toString(timeStamp)
+ data
+ Integer.toString(nonce)
);
return calculateHash;
}
/**
* 通过随机数nonce的递增,不断地尝试,得到符合要求的哈希值,使用SHA256加密
* 人为制造哈希碰撞的可能性很低,可以认为随机数是唯一的
*
* @param difficulty 困难度,表示哈希值的开头有多少个零
*/
public void mineBlock(int difficulty) {
String target = StringUtil.getDifficultyString(difficulty);
while (!hash.substring(0, difficulty).equals(target)) {
nonce++;
hash = calculateHash();
}
System.out.println("Block Mined!!! : " + hash);
}
}
创建一个工具类
需要手动添加一下gson的jar包
package blockChain;
import com.google.gson.GsonBuilder;
import java.security.MessageDigest;
/**
* @author WuYongheng
* @date 2022/10/22
* @description 工具类,负责加密,返回‘困难度’个零,解析json数据
*/
public class StringUtil {
/**
* for循环的解释:0xff & hash[i]
*
* @param input 未加密的字符串
* @return 加密之后的字符串
*/
public static String applySha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// 传入需要计算的字符串,把输入变成ascii值
byte[] hash = digest.digest(input.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 困难度是多少,就返回多少个零
* 比如 difficulty=6 返回 000000
* @param difficulty 困难度
* @return 一个字符串
*/
public static String getDifficultyString(int difficulty) {
return new String(new char[difficulty]).replace('