首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

今天我们直接带你实现比特币(下)

阅读时间: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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180210G0FJC200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券