前面的文章,笔者花了不少的文字来介绍区块链的基础概念,以太坊的概念和开发,大家是否感觉区块链开发还是挺复杂的呢。但其实区块链技术本质就是一个分布式账本,在技术上本质就是一个链表。链表里面有一个个的区块,每个区块有自己的数字签名(涉及到加密技术)和交易数据和一些其他的数据,然后把一堆区块串起来就是区块链,同时把区块数据能够进行广播,基本上就完成一个最简单的区块链系统。
那么今天,笔者用java开发语言来简单实现一个简易版的区块链。
首先,定义好区块的结构,我们先回顾下一个区块有哪些信息:
区块hash
上一个区块hash
时间戳
交易信息列表
其中交易信息(以UTXO模型为例)包括以下信息:
交易hash
交易发送者
交易接受者
时间戳
交易额
签名
交易输入
交易输出
OK,回顾完了区块的数据内容,我们用Java代码编写出来数据结构,很明显我们需要定义两个Java对象:交易和区块。
看下面的代码
交易类:Transaction
public class Transaction {
public String transactionHash; //交易hash
public PublicKey sender; //发送这地址
public PublicKey receiver; //接受者地址
public double value; //交易额
public byte[] signature; //签名数据
public long timeStamp; //时间戳
public ArrayList inputs = new ArrayList(); //交易输入
public ArrayList outputs = new ArrayList(); //交易输出
}
区块类:Block
public class Block {
public String hash;
public String previousHash;
public List data; //交易列表
public long timeStamp; //时间戳
}
交易输出类:定义UTXO中的交易输出
public class TransactionOutput {
public String id;
public PublicKey receiver; //
public double value; //接受者的拥有的余额
public String parentTransactionHash; //产生该交易输出的交易hash
public TransactionOutput(PublicKey receiver, float value, String parentTransactionHash) {
this.receiver = receiver;
this.value = value;
this.parentTransactionHash = parentTransactionHash;
this.id = StringUtil.applySha256(StringUtil.getStringFromKey(receiver)+Float.toString(value)+parentTransacti