Lucifaer's Blog.

区块链基础概念

Word count: 2,807 / Reading time: 10 min
2018/06/18 Share

0x00 什么是区块链

简单一句话就可以回答:区块链是一种特殊的分布式数据库

想要理解上面的叙述,你需要理解下面两个概念:

  • 分布式系统
  • 去中心化

分布式系统我就不多说了,想必大家都清楚。那么我们重点来说一下去中心化。

去中心化,简单来说,去中心化不是没有中心,而是在一个分布有众多节点的系统中,每个节点都可以成为一个中心,而且每个中心都不是永久的,都是阶段性的

这意味着在整个分布式系统中各个节点的地位都是平等的。而去中心化和区块链的关系可以这么理解:区块链是去中心化的一种实现工具或者说是实现方法

首先,区块链的作用是用来储存分布式网络(区块链网络)中的信息。在区块链网络中任何需要存储的信息都可以写入区块链,同时在区块链网络中任一节点也可以从区块链中读取相应的信息,所以说它就是一个分布式数据库

其次,任何人都可以加入这个区块链网络中,并成为其中的一个节点。在区块链网络中,没有中心节点,每一个节点都是平等的,都保存着完整的区款链(数据库)。也就是说在任一节点对区块链进行读写操作最后都会同步到整个区块链网络上。

0x01 区块链特点

经过上面的介绍,可能会觉得区块链和分布式数据库没有什么差别。实际上区块链是改进了分布式数据库的一个新产品吧。

区块链最具特点的地方在:区块链作为一个分布式数据库,是没有管理员的,也就是去中心化的。去中心化的思路使区块链是无法被审计的,同时也不会受到某些处于中心位置的管理员对其进行管理。所以区块链是无法被控制的。

这样的特点其实也造成了一些云玩家天天叫喊着“我们为了隐私,要去中心化”的儿戏之言。就像你觉得FaceBook要求用户上传他们的隐私,以此来防止用户隐私泄露的方法很蠢一样,为了隐私而去中心化,其实和FaceBook的做法差不多。

0x02 区块链的组成——区块

区块链由一个个区块组成。每一个区块也可以称为数据库的记录。区块的构造有点像内存的结构,包含两个部分:

  • 区块头(Head):记录当前区块的特征值
  • 区块体(Body):实际数据

区块头包含着当前区块的多项特征,下图是区块头的示意图:

其中比较重要的几个特征为:

  • hashPrevBlock(上一个区块的哈希)
  • Target(难度目标):该区块工作量证明算法的难度目标,后面会提到
  • Nonce

我们都知道如果原始内容不同,其对应的哈希一定是不同的,哈希保证了数据的唯一性。因此:

  • 可以通过哈希来表示不同的区块
  • 如果区块的内容改变了,其哈希一定会改变

也就是说:

在区块链中,如果当前区块的内容改变了,或者上一个区块的哈希变了,一定会引起当前区块的哈希改变。

这一点对于区块链来说意义重大。如果有人改变了一个区块的内容,这个区块的哈希就会改变。为了让后面的区块还能连接到它(Head中所记录的上一个区块的哈希值),他需要一次改变后面的所有区块,否则后面的区块就会脱离该区块链。而哈希破解本身就需要相当大的算力,所以短时间更改多个区块基本上是不可能发生的。

这样就保证了区块链中的每一个区块是很难被更改的。防止数据被篡改。

0x03 区块的产生——挖矿

在了解了区块本身的结构后,我们来说一说区块是如何生成的。经过上面的介绍,我们知道区块链本身就是一个数据库,用于记录一些信息,而生成这个数据库从而产生新区块的过程就是挖矿。

由于区块链网络本身是一个分布式的数据库,其必定存在节点更新的工作,为了保证所有节点可以同步的更新数据,新区块的添加速度必定不能太快,因为过快的增加区块会影响其他同步较慢节点区块的生成。

中本聪在设计区块链时也考虑到了这个情况,他在设计比特币系统的时候设计了每10分钟产生一个新的区块,在生成区块的算法上,他使用了POW算法的思路,这个算法就是我们常说的工作量证明算法,这个算法简单来说就是为了防止资源滥用,在每个节点生成新区块前,首先需要做一定量的工作,生成工作量证明,确保节点的正常。

在前面我们已经介绍过了区块头的结构,在区块头结构中有一个Nonce字段,这个字段是也就是工作量证明算法需要做的工作。在其他字段值不变的情况下,通过不断的更新Nonce的值来改变区块头这个结构的整体哈希值。

如何证明该节点的工作是有效的呢?在区块头结构中还有一个Target值,只有当你找到一个Nonce值使得整个结构算出的哈希值小于Target值,才算成功,才能生成新的区块。

0x04 为什么说挖矿很难

根据以上的介绍,可以将挖矿理解为计算Nonce值,使得当前区块头的哈希值小于Target值。这个哈希值需要进行相当复杂的计算,接下来就深入聊一下为什么说挖矿很难。

1. 难度系数

难度系数(difficulty)是指与上一次发现一个区块时相比,现在发现一个区块的困难程度。

在区块头中都会包含一个难度系数(difficulty),这个值决定了计算哈希的难度。难度系数在区块中并不记录,而是一个浮点数,其公式如下:

$$difficulty=\cfrac{difficulty_1_target}{currentTarget}$$

difficulty_1_target是一个非常大的常数。表示矿池挖矿最大难度,其数值为:

1
0x00000000FFFF0000000000000000000000000000000000000000000000000000

也就是:

$$diffuculty_1_taget=0xffff*2^{208}$$

难度系数是如何存储在区块中的呢?每个区块会被存储为一个经过压缩后的target,target是使用十六进制表示的。这个target是能够使用预定义的公式推断的,用一个具体的例子来说明过程。

如果区块bits记录为0x1b0404cb,在计算时,后面3个字节0x0404cb为底,前面的1字节0x1b表示次方数,因此这个16进制的target是:

1
0x0404cb * 2 ** (8*(0x1b-3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

我们来理一下压缩的过程:

  1. 将数字转换为256进制数
  2. 如果第一位数字大于127即(0x7f),则在前面添加0
  3. 压缩结果中的第一位存放该256进制数的位数
  4. 后面三个数存放该256进制数的前三位,如果不足三位,则在后面补0

举个例子,如果将1000压缩,先转换成256进制数:

1
1000=0x03 * 256 + 0xe8 * 1

由两个数字构成:

1
03      e8

03未超过0x7f,前面不需要添0,但是长度为两位低于三位,需要在后面补0,最终表示为:

1
0x0203e800

根据公式可以看到当current_target=0diffculty无穷大,但是实际情况是最大难度值接近$2^{265-32}$,同理难度值的最小值为1。

2. 难度系数的动态调节

中本聪在设计区块链时规定了每10分钟生成一个新的区块,并且每2016个区块(每2周6*24*7*2=2016)动态更新一次难度系数。如果生成前面的2016个区块花费了超过2周的时间,难度会根据比例来降低难度系数,同理,如果少于2周时间,则会根据比例上调难度系数。

难度系数越调越高,根据难度计算公式,我们能知道目标值会越来越小,所以挖矿越来越难。

3. 网络算力(hash rate)和给定难度的相关性

网络算力,表示根据难度值要计算多少次才能找到一个随机数使得区块哈希值低于目标值。由当前目标值currentTarget决定当前难度值。假设当前难度为D(十进制),根据难度公式得到难度D的偏移为:

$$currentTarget=\cfrac{difficulty_1_target}{D}=\cfrac{0xffff*2^{208}}{D}$$

我们都知道区块计算出的哈希值是一个256bit的值,也就是说在难度D下,如果想要生成新的区块,大约要计算的哈希个数为:

$$\cfrac{D}{0xffff2^{208}}2^{256}=\cfrac{D2^{48}}{0xffff}=D2^{32}$$

也就是目前难度计算速度要求在10分钟内找到,也就是说网络算力最低必须是:

$$\cfrac{D*2^{32}}{600}$$

简单来算的话,当难度值D=1,需要每秒计算7158278次哈希,即7.15 Mhahs/s。

4. 如何估算产生一个块的时间

下面的公式可以计算产生一个块的平均值:

$$time=\cfrac{difficulty * 2^{32}}{hashrate}$$

difficulty是当前难度,hashrate是每秒矿机计算的哈希个数(算力),time是挖掘到新区块的平均间隔时间。

附一个算力换算公式:

  • 1 KHash/s = 1000 Hash/s
  • 1 MHash/s = 1000 KHash/s
  • 1 GHash/s = 1000 MHash/s
  • 1 THash/s = 1000 GHash/s
  • 1 PHash/s = 1000 THash/s

了解一下现在的难度:

普通计算机(i7 6700k + 16g内存)算力差不多是1.8GH/s,我按2GH/s来算:

差不多是要122784365天。

0x05 区块链的分叉

在区块链中可能出现同时有两个区块加入,而且其都是连接着前一个区块的新区块,这样就可能形成分叉,这个时候区块链会记录各个分叉的情况,看哪个分叉后面首先达到6个新区块,就将哪个分叉并入区块链中,并将其他的分叉抛弃。

0x06 总结

区块链作为去中心化的工具是一个非常新颖的领域,同时其所存储的数据是较为可靠的,但是它比较消耗能源,并且效率低下,所以区块链目前适用的场景非常有限。目前最大的应用场景就是虚拟货币。

CATALOG
  1. 1. 0x00 什么是区块链
  2. 2. 0x01 区块链特点
  3. 3. 0x02 区块链的组成——区块
  4. 4. 0x03 区块的产生——挖矿
  5. 5. 0x04 为什么说挖矿很难
    1. 5.1. 1. 难度系数
    2. 5.2. 2. 难度系数的动态调节
    3. 5.3. 3. 网络算力(hash rate)和给定难度的相关性
    4. 5.4. 4. 如何估算产生一个块的时间
  6. 6. 0x05 区块链的分叉
  7. 7. 0x06 总结