首页 / 区块链 / Java实现简单的区块链(一)
Java实现简单的区块链(一)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java实现简单的区块链(一),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3530字,纯文字阅读大概需要6分钟。
内容图文
区块
一个区块由该区块的hash,前一区块的hash,区块存储的数据prehash,时间戳timestamp,填充数nonce构成
hash的计算
我们将prehash,timestamp,data以及nonce连接起来计算sha256
//编写了一个工具类
public class Sha256Utils {
?
public static String getSha256(String s) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(s.getBytes("UTF-8"));
byte[] digest = sha.digest();
return byte2Hex(digest);
}
private static String byte2Hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
String temp = null;
for (byte aByte : bytes) {
temp = Integer.toHexString(aByte & 0xFF);
if (temp.length() == 1) {
// 1得到一位的进行补0操作
sb.append("0");
}
sb.append(temp);
}
return sb.toString();
}
?
}
挖矿
挖矿是比特币中的共识算法,叫工作量证明,首先设定一个targetBit 表明hash值的(16位表示)前多少位为0,也就是说我们通过调整nonce的值算出来的hash必须小于目标hash。在实际中,这个targetBit是会动态调整的以确保挖矿速度恒定。
代码
public class Block {
private String hash;
private String prehash;
private String data;
private long timestamp;
private int nonce;
?
public Block(String prehash, String data) {
this.prehash = prehash;
this.data = data;
this.timestamp = new Date().getTime();
this.hash=setHash();
this.nonce=0;
?
}
public String setHash(){
String sha256=null;
try {
sha256 = Sha256Utils.getSha256(prehash + data + timestamp+Integer.toString(nonce));
?
} catch (Exception e) {
System.out.println("区块计算hash出现错误");
}
return sha256;
?
}
?
public String getHash() {
return hash;
}
?
public void mine(int targetBits){
String target = new String(new char[targetBits]).replace('\0', '0'); //Create a string with difficulty * "0"
while(!hash.substring( 0, targetBits).equals(target)) {
nonce ++;
hash = setHash();
}
?
?
}
public static String str2HexStr(String str)
{
?
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
?
for (int i = 0; i < bs.length; i++)
{
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
sb.append(' ');
}
return sb.toString().trim();
}
?
@Override
public String toString() {
return "Block{" +
"hash='" + hash + '\'' +
", prehash='" + prehash + '\'' +
", data='" + data + '\'' +
", timestamp=" + timestamp +
", nonce=" + nonce +
'}';
}
}
?
区块链
区块链实际是一个有序的链表,所以我们这里实际采用ArrayList存储
public class BlockChain extends ArrayList<Block> {
public ArrayList<Block> blockChain= new ArrayList<Block>();
public int targetBits=24;
public BlockChain() {
}
public void setTargetBits(int num){
targetBits=num;
}
?
@Override
public int size() {
return blockChain.size();
}
?
@Override
public boolean add(Block block) {
return blockChain.add(block);
}
@Override
public String toString() {
return blockChain.toString();
}
?
@Override
public Block get(int index) {
return blockChain.get(index);
}
}
内容总结
以上是互联网集市为您收集整理的Java实现简单的区块链(一)全部内容,希望文章能够帮你解决Java实现简单的区块链(一)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。