我是靠谱客的博主 狂野曲奇,这篇文章主要介绍仅仅用java就能简单实现区块链(BlockChain)1.设置好成员属性2.计算hash值方法(“挖矿”方法)3.设置好挖矿成功的条件4.“挖到”方法5.添加一个区块6.区块链验证,现在分享给大家,希望可以做个参考。
区块链逻辑:根据所需信息创建一个区块,再利用定义的计算hash值方法,不断进行计算,直到达到想要的结果,再通过层层验证,加入到我们的区块链中。
1.设置好成员属性
//区块链
List<Block> blockchain = new ArrayList<>();
//哈希值,判断挖矿成功与否
private String hash;
//前块哈希值,便于之后验证成功与否
private String previousHash;
//所需存储数据
private String data;
//时间戳
private long timeStamp;
//用于判断”挖矿“成功的密码学数字
private int nonce;
//构析方法,得到所需信息
public Block(String data,String previousHash,long timeStamp){
this.data = data;
this.previousHash = previousHash;
this.timeStamp = timeStamp;
this.hash = calculateBlockHash();
}
2.计算hash值方法(“挖矿”方法)
所谓挖矿,就是进行不断地计算,直到“挖到”,而这步算法我们是借助hash算法完成的。
//得到对应hash字符串
//hash算法优势:输出格式一致,而且对数的变化十分敏感,对于之后验证挖矿成功与否作用巨大!
public String calculateBlockHash(){
//生成独属的字符串,方便之后转换
String dataToHash = previousHash + Long.toString(timeStamp)
+ Integer.toString(nonce) + data;
MessageDigest digest = null;
byte[] bytes = null;
try {
//创建一个提供信息摘要算法的对象,初始化为SHA-256算法对象
digest = MessageDigest.getInstance("SHA-256");
//用对象调用,信息摘要计算方法,计算后获得字节数组
//dataToHash.getBytes(UTF_8),将字符串转换为字节数组
bytes = digest.digest(dataToHash.getBytes(UTF_8));
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
//用缓存字符串
StringBuffer buffer = new StringBuffer();
for (byte b : bytes) {
//延伸字符串
//String.format("%02x", b),以十六进制输出,2为指定的输出字段的宽度.如果位数小于2,则左端补0
buffer.append(String.format("%02x", b));
}
//返回字符串
return buffer.toString();
}
3.设置好挖矿成功的条件
老实说,“挖矿”这件事本身已经很抽象了,但是我们还需要沿着这条路,来考虑一个“挖到了”的情形。在我们“挖矿”实际是计算区块hash值的情形下,而我们的思路是:找到以四个0开头的hash值。
//定义了一个前缀4,这实际上意味着我们希望哈希以4个零开始。
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('