阅读对象
本文阅读对象,主要是希望和即将从事区块链开发的项目架构师,开发工程师,项目设计或产品设计师。要求阅读者具备一定的“区块链”基础知识、概念和以及相关的技术知识。
如果你只需要对区块链应用做一个更深更直观的了解,通过本文的例子更清晰了解区块链是怎么回事,大概是怎么开发出来的,怎么使用,那么知道一些区块链相关知识即可。
如果你是一个想从事这方面工作的人,尤其是从事开发和架构的技术人员,那么需要的技术知识就相当的多了,无法一一列举,大概一个高级网络开发工程师和中级以上的架构师水平,是需要的。
前言
很多新的概念,人们在刚接触的时候,会让人感到非常困惑,学了好多次都稀里糊涂,并不仅仅是技术,很多地方都是如此。对于比较难理解的概念,用什么办法去学习最高效呢?我一直认为,就是找一个例子,或者写一个Demo,世上无难事,for一个example即可。。。
最近一段时间,AI人工智能方兴未艾,区块链技术又迎面走来,对数字货币的崛起感到新奇的我们,估计很想知道其背后的技术--区块链是怎样的一个东西。但是完全搞懂区块链并非易事,在实践中学习方为上策。
我喜欢把程序当成诗歌来写,理所当然要通过写代码来实现并运行一个例子,来理解并学习这门技术。这里,就通过用JAVA语言实现和构建一个区块链来探讨对区块链的理解。
本文,我们要用区块链来实现这么一个例子,名字叫“区块链成语接龙”。用户通过这个例子,可以不断的接龙前面一个用户的成语,规则和普通游戏一样,前面一个用户的成语的最后一个字,作为后面一个成语的第一个字。
单单作为一个应用,这个很简单呐,问题是,我们要用区块链的原理和相关技术实现它。
OK,let’s go… …
准备工作
这个时候其实我很想大喊一声:“区块链”其实不是某一种单纯的技术,而是基于某一种思想的多种技术的结合。
需要的技术包括分布式存储,分布式计算,P2P数据同步,加密解密,安全传输,一些语言,一些开发工具。。。还有一些新型的概念 – 分布式节点,工作量证明,共识算法。。。等等
基于哪一种思想呢,大家都说是“去中心化”,我觉得就是“反垄断”“反。。。”,敏感话题,不展开了。但是我事实上是一个喜欢民主的人,所以区块链的“去中心化”对我吸引力颇大。。。all men are created equal…J
本文里面涉及到的一些例子,来源是网上,有些是Python版本,有些是Java版本,C版本,考虑到JAVA更为通用和易读写(其实我是认为JAVA语言更像诗歌了),就把他们改成了JAVA版,所以要求读者对诗歌..哦,不是,是对JAVA非常了解,能读写基本的语法框架和逻辑,并且因为这个DEMO的特殊性,需要对网络框架和HTTP请求有基本的了解。
我们知道区块链是数据块和链的存储方式的组合,是由N多个数据区块按照链的组织和记录构成的不可变、有序的链结构,记录可以是交易、文件或任何你想要的数据,同时它们是通过哈希值(hashes)链接起来的。所以,在阅读本文之前,一定要阅读几篇关于区块链的文章,了解里面块,链,数据,工作量证明等等概念,最好也了解一些相关技术比如Hash,分布式存储等等的概念。如果你还不是很了解这些,请找度娘。
如果在了解这些概念的过程中,一不小心接触到了比特币,请一定要明白,比特币只是区块链技术的一个产品实现。如果还接触到其它一些诸如以太网等等的名词,那么需要知道,这些都是区块链技术下实现的一些框架和产品。
环境准备
理论上来说,可以用任何一种语言来创建任何一种技术的例子,包括区块链的例子,我们这里选用了JAVA,所以要在自己的电脑上,准备JAVA的相关开发环境。
确保你的电脑上已经安装了较新版本的JDK,Tomcat和某一种你熟悉的最好能整合Tomcat的JAVA IDE,本例用的是Eclipse。Tomcat在我们这个例子中间,是一个WEB工具,因为我们的项目,需要基于WEB HTTP 发布和运行。
如何安装Java和各种工具,包括如何用Eclipse创建Dynamic web项目并发布到Tomcat等等步骤,既然你已经如此熟悉JAVA了,这里就不再多讲。
开始创建区块链
区块或称数据块Block类
区块链中每个区块包含以下基本内容:索引(index),Unix时间戳(timestamp),数据块(data)(包括交易,文字,申明,奖励等任何和合适的内容),证明或工作量证明(proof稍后解释)以及前一个区块的Hash值,Hash 用来链接数据块,同时确保数据块不被非法修改。
以下是一个区块的结构:
public class Block {
int iIndex; //索引
String sProof; //工作量证明,在这个例子里面,其实就是一个经过验证的正确的成语
String sPreviousHash; //前一个区块的Hash值
Timestamp tsCreateTime; //区块创建时间戳
/*数据块
*
* 用户每接上一个成语,会得到系统10元钱的奖励,同时会赢得前面一个用户的2元钱
* 数据区同时需要记录自己的用户名和回答出上一个成语的用户名
*
* */
String sSender; //回答出上一个成语的用户名
String sRecipient; //回答出当前这个成语的用户名
final int iMoneyAward=10; //系统奖励,数额固定
final int iMoneyWin=2; //赢取奖励,数额固定
public Block(){
}
}
区块链实现Blockchain类
import java.util.*;
import blockchain.Block;
public class BlockChain {
//用来存储区块
private List<Block> lBlockchain=new ArrayList<>[];
public BlockChain(){
}
//创建新块
public Block NewBlock(){
Block bRet=null;
//在这里创建一个新块
return bRet;
}
//Hash 一个块
public String Hash(Block block){
String sHash=null;
//在这里Hash 一个块
return sHash;
}
//其他方法
//....
}
Blockchain类用来管理链条,它能存储和更新链数据,加入新块等等,下面我们来进一步增加和完善里面的一些方法
创建新块和创世块
当一个用户按照成语接龙的规则,对上上一个成语,并且系统验证这成语正确(工作量被证明)。这个时候我们就可以创建一个新块,并且加到链里面。
一旦工作量证明确认,并且上一个块hash 生成后,就可以简单调用函数创建一个新块了。