前言:
目前市面上大多数都是源于国外大神的两篇关于java区块链的教程的生硬翻译,这就很容易导致一个问题,就是你明明把他代码跑起来了,最后却还不知道区块链是个啥,比如是如何做到去中心化的?又是如何做到不可篡改行的,以及比特币为什么越挖越少这些问题依然得不到很好的解释,本篇文章呢,依然源用的是那篇教程的代码,除了英文注释我会手动翻译成中文之外,其他的变量名什么的都不会改,毕竟人家思路是对的,没有必要重新造轮子,改个变量就说代码是我自己写的,那我和网上那些抄袭转载的人也没什么区别了。本篇文章并不是对作者源论文的机械翻译,只是借用了相关代码,希望大家看过之后会大致明白区块链具体是一项什么样的技术,我们为什么需要区块链等等。
什么是区块链:
区块链(英语:blockchain或block chain)借由密码学与公识机制等技术创建与存储庞大交易资料区块链的点对点网络系统。——维基百科
区块链是什么,区块链就是谈恋爱
明天就是小民和小红在一起100天了,小民想要在明天给小红一个大大的惊喜,就是把他辛辛苦苦研发的机器人送给小红,他能想象到小红看到机器人兴奋的样子,他一想觉得太他妈浪漫了。
但是那天出现了意外。
小黑:你们不能在一起,其实小红是我的女朋友。
小民:难道我被绿了,@(#(*#(@。
小黑:不不不,其实小红是我的女朋友。
重点来啰:注意看。
小民:去你的,我们谈恋爱的第一天,我送了小红一个鼠标,第二天,我送了她一个键盘,第三天,我送了她一个屏幕,第四天… 第一百天,我送了她一个我辛苦开发的机器人,这些,就是证据!
小黑:啊啊啊啊,我输了,小红是你的女朋友。
小黑由于故意篡改小红是小民女朋友的事实,被拉入黑名单,从此再也没有找到女朋友。
在这个例子中,小红
,小民
,和小黑
就是区块链中的链,而之前小民
和小红
从相识,到相知,再到相爱期间每发生一个故事就会形成一个区块。而且小民和小红之间发生的所有故事都会以直播的形式被区块链中的所有链知道(太狠了吧),所以小黑说小红是他的女朋友自然就不可能是真的了,因为整个区块链所有的链都见证了小民和小红是情侣这个事实,如果小黑要篡改事实说小红是他的女朋友,那么他要修改整个区块链中所有链对于小民和小红这对情侣的记忆,这是几乎无法做到的。
这就是区块链的不可篡改性。
同时,如果有一天小民不爱小红了,爱上了小绿,于是把手机上和小红有关的东西全部删掉,告诉小绿,小绿是自己的初恋,小民只爱小绿一个人。这样做有用吗?没用,因为整个区块链中的链都观看过小民和小红的直播,记录着小民和小红曾经在一起过的证据。
这就是区块链中的不可修改性。
大家认真想一想,如果区块链应用于金融会怎么样?
之前我们的钱都是存在银行的账户管理系统里面,如果有人侵入银行的账户管理系统,只需要把他账号下代表余额的那串数字改了就可以决定自己有多少钱了,而在区块链中,每个人都是银行,每个人都是账户管理系统,如果需要修改自己账户的余额,则需要修改全网所有节点的信息才行,这几乎是不可能实现的,所以大大的提高了安全性。更不要说应用于其他领域了。那下面就来交你怎么实现一个简单的区块链。
用java实现一个简单的区块链:
public class Block {
/**
* 当前区块的hash
*/
public String hash;
/**
* 前一个区块的hash,本例中,靠这个实现链的
*/
public String previousHash;
/**
* 当前区块的数据,比如交易信息啊等等,在谈恋爱例子中代表小红和小民具体发生的事件
*/
private String data;
/**
* 时间戳
*/
private long timeStamp;
private int nonce;
public Block(String hash, String previousHash, String data) {
this.hash = hash;
this.previousHash = previousHash;
this.data = data;
}
public Block(String data, String previousHash) {
this.previousHash = previousHash;
this.data = data;
this.timeStamp = new Date().getTime();
this.hash = calculateHash();
}
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
Integer.toString(nonce) +
data);
return calculatedhash;
}
public void mineBlock