区块链的结构和原理


文章目录

  • 区块链的结构和原理
  • 区块链原理
  • 区块链结构
  • 关于区块链的几个问题
  • 结语


区块链原理

区块链是一个链表,链表上存有交易信息,所有人共享同一个链表,因此它也是一个没有管理员的分布式数据库,即去中心化数据库,所有人都能加入这个数据库,并且可以读取任意块,也可以在区块链尾加入块,但无法修改已有块,新块加入后所有人的链表都将更新。采矿就是在链表中加入新块。

区块链结构

区块链软件技术架构图 区块链技术框架图_哈希算法

图 1:区块链的一个例子,它由连续的块序列组成

区块链软件技术架构图 区块链技术框架图_区块链软件技术架构图_02


图 2:块结构

块由块头和块体组成:
块头包含:

  1. Block version: 表示遵循哪一组块验证规则。
  2. Merkle tree root hash: 区块体所有交易的哈希值
  3. Timestamp: 时间戳,从1970年1月1日开始,当前时间以秒表示。
  4. nBits: 有效块哈希的目标阈值,可以转换为:
    target, 难题的答案范围 (<= target为解)
    difficulty, 难题的难度
    Chainwork, 链上累计的所有hash次数(可以转换成电力,矿机,成本)
    hashrate, 使用不同设备,达到600s(10分钟)出块时间需要达到的hash速度 (hashes/s)
  5. Nonce: 一个4字节的字段,通常以0开始,每次哈希计算都会增加。
  6. Parent block hash: 指向前一个块的256位哈希值。

块体由交易计数器和交易组成。一个块可以包含的最大交易数取决于块的大小和每个交易的大小。区块链使用非对称加密机制来验证交易的身份验证。基于非对称密码学的数字签名是在一个不可信的环境中使用的。

区块哈希:区块本身不保存该信息,但下一区块需要将其作为父区块哈希并保存到块头,该值256位,通过区块头计算而来,计算公式:
区块链软件技术架构图 区块链技术框架图_区块链_03
因此得到:每个区块的哈希都是不一样的,可以通过哈希标识区块
如果区块的内容变了(块体改变导致Merkle tree root hash改变),它的哈希一定会改变。

关于区块链的几个问题

1. 为什么所有人共享一个链表,有什么好处?

a)提高安全性,若有人想修改区块中的信息,则必须修改所有人的信息,这几乎是无法实现的。
b)防垄断。共享链表意味着没有管理员,能防止企业垄断,使得人人平等。

2. 为什么无法修改已有块?

前文说到,区块哈希由区块头计算得到,区块头包括了父区块的哈希这意味着父区块的哈希改变将会引起区块哈希的改变,也就是说,只要修改了一个区块体的内容,那么它本身以及后续所有区块的哈希都需要修改,否则被改掉的区块就脱离区块链了,而区块哈希的计算很耗时,短时间内修改多个区块几乎不可能发生,因此无法修改已有块。

3. 新块怎么生成

前文说到,块包含块头和块体,块头包含父区块的哈希值,因此为了能够加入区块链,我们需要知道上一区块的哈希,上一区块的哈希如何得到?
有效哈希的计算:区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target):
区块链软件技术架构图 区块链技术框架图_区块链软件技术架构图_04
而只有小于target的哈希才是有效的。但是根据公式区块链软件技术架构图 区块链技术框架图_区块链_03,区块哈希由区块头决定,为了算出小于target的哈希,区块头必须包含随机选项,因此区块头中的随机值Nonce发挥了作用,新块生成其实就是猜出 Nonce 的值,使得区块头的哈希可以小于target,从而能够写入区块链。

4. 新块不断加入,我怎么确定上一块的哈希?

有这样一个场景:你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步新区快。这样你可能永远无法生成你的区块,怎么办?
区块链的发明者中本聪(这是假名,真实身份至今未知)故意让添加新区块,变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。为了将产出速率恒定在十分钟,中本聪还设计了难度系数的动态调节机制,即动态调整nBits中的difficulty来控制平均每10分钟才能生成一个新块。这样的话你需要在一个新块生成后的10分钟内生成你的块即可。

5. 不是所有人都能加入新块吗,那么采矿难在何处?

生成新区块的过程就叫做采矿(mining),前文说到新块生成实际上就是猜出Nonce的值,但是Nonce是非常难猜的,目前只能通过穷举法一个个试错。根据协议,Nonce 是一个32位的二进制值,即最大可以到21.47亿。而且上文说到difficulty是动态调整的,随着越来越多人加入区块链,target只会越来越小。

6. 区块链的分叉

如果两个人同时向区块链写入数据,也就是说,同时有两个区块加入,因为它们都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?

区块链软件技术架构图 区块链技术框架图_链表_06

现在的规则是,新节点总是采用最长的那条区块链,如上图。如果区块链有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为"六次确认"),如下图。按照10分钟一个区块计算,一小时就可以确认。

区块链软件技术架构图 区块链技术框架图_哈希算法_07

由于新区块的生成速度由计算能力决定,所以这条规则就是说,拥有大多数计算能力的那条分支,就是正宗的区块链。