阅读时间:10分钟Block,区块链的最小单位
到目前我们已经实现了Transaction,签名,UTXO,是时候将他们串联在一起了。
在串联之前,我们先来看看区块的构成。
从上图可以看到,区块的主要构成为
上一个区块的哈希
区块的proof of work
本个区块的哈希
所有的transaction
对于这个基本单位来说,其余部分其实都很好理解,唯一的难点在于,怎么实现proof of work呢?也就是说,怎么实现挖矿的功能呢挖矿这个概念我们就不再赘述,相信有大把的资料提到了这个功能,简单的讲就是需要一个proof of work的字段,在不停更改尝试后,当哈希整个区块数据时,哈希结果的前K位全部为零,这个K的值就是挖矿的difficulty。(K越小难度越小)
所以 的核心API如下
得到区块的字节流表示,用于产生哈希
尝试改变proof of work(也就是 ),试图得到难度为difficulty的哈希
的总代码如下
Transaction Pool,未处理的Transaction
在设计最后的区块链之前,我们很有必要建立一个Transaction Pool来保存所有收到但是未加入区块链的Transaction。对于区块链上的单一节点来说,生成一个新的区块有两种方式,被动接受和主动生成
被动接受:接收来自其余节点的区块广播,验证后加入自己的区块链
主动生成:接收来区块链上的transaction,之后一定时间内,建立一个新的区块来囊括这些transaction,计算出proof of work后广播给别人
在主动生成的情况下,我们要维持一个区块链的所有未加入区块链的transaction,所以我们需要维持一个transaction Pool
的代码如下,本质上就是一个HashMap
区块链
经过一系列的努力后,我们终于来到了最后的目的地!区块链!还是一样的,在写 之前,我们还是先宏观的看一看区块链长什么样子的
如上图所示(忽略timestamp,这个字段在这里不考虑),每一个区块链是由众多区块构成的,其实也就是一堆区块的集合,由hash pointer互相连接起来。同时之前我们说过,我们需要保存一个 来维持节点收到但是尚未处理的区块还有一点,相信朋友们都知道,就是维护一个最长链,作为consensus的存在。基于上述三点,我们可以知道,在我们的区块链类中,需要维护三个属性:
: 保存最长链的顶部节点: 区块链,也就是我们的区块HashMap: 所有的TransactionPool
这里存在两个问题第一,每一个区块实际上还和一个UTXO Pool相关,因为每加入一个新的区块后,其对应的UTXOPool会产生改变。解决这个问题的方法是,在每一个Block上都绑定一个UTXOPool,于是我们将Block封装为一个内部类 ,每一个BlockNode维护区块,UTXOPool和区块的parent(方便查找索引,不用每一次都去getHash然后查找)
的代码如下
第二,区块链实际上是一颗树而不是一个链表。理解这一点非常关键,因为区块链并没有要求新的区块一定要加在最后(但是也不能太浅,稍后会解释为什么),只是区块链公认最长的那个链条是区块的公允链条。所以我们现在来定义 的几个关键API
构造函数,创建创世区块,这个区块只有一个Coinbase Transaction,是第一笔矿工奖励
将一个区块加入区块链中,加入的过程如下
我们先验证区块的parent是否存在于区块
区块的深度不能太浅,比如最长链深度为100,我们不能把这个区块加入到深度为1的地方,因为这个区块哪怕加入,未来也不可能成为最长区块(算力不可能超过全网50%,无法追上)
每一个Transaction必须成立,从当前的TxPool中移除相关的Trsansaction(因为别人已经算出来nounce并产生新的区块加入了区块链)
产生一个新的UTXO Pool,产生一个新的BlockNode来包装UTXO
完整的 代码如下
最后一站,Block Handler
拥有了所有的元素后,我们可以来撰写最后的两个function首先在我们的文件夹下创建一个叫做 的文件现在我们来定义最后的两个API
将区块加入区块链
将当前transaction池中所有的Transaction提取出来,产生一个新的区块加入到区块链中。
完整代码如下
看到这里的朋友!恭喜你,你已经完成了一个区块链了!经过这一系列流程以后是不是发现比想象中的简单很多呢~区块链本质上就是一个拜占庭容错的共识解决机制,能够有效解决不同节点之间的共识同步,通过这一节的教程,想必你对区块链的认识又进了一步!
写在最后
最后首先让我们来总结下我们的区块链实现方案。本文中一共有如下的几个大类Block
:实现了单个区块的功能
:区块链
:维护区块链的Handler
Transaction
:Transaction本身
:未处理Transaction的集合
:处理Transaction,包括校验和更改UTXOPool
UTXO
:实现了UTXO的表示
:实现了所有UTXO的池子
Signature
: 实现了数字签名的校验功能
Helper
:将byte array转化为可哈希的类
这之间的关系如下图所示
一个区块链包含多个Block,一个Block包含多个Transaction,而一个Transaction消耗多个UTXO,产生多个新的UTXO
最后,附上文章的完整代码Github地址:NaiveCoin
领取专属 10元无门槛券
私享最新 技术干货