1.本质
特殊的分布式数据库,主要用于储存信息,任何信息都可以在区块链中进行读写。
2.特点
区块链没有管理员,实现了无中心化,它的设计目标就是防止出现居于中心地位的管理当局。
3.区块
区块链由区块(Block)组成
区块像是数据库的记录,每次写入一个数据,创建一个区块
区块由两个部分组成
- 区块头(Head):记录当前区块的元信息
- 区块体(Body):实际数据
区块头包含了当前区块的多项元信息
- 生成时间
- 实际数据(区块体)的 Hash,不是整个区块
- 上一个区块的 Hash
- …
Hash 指计算机可以对任意内容,计算出一个长度相同的特征值。区块链的 Hash 长度是 256 位,这就是说,不管原始内容是什么,最后都会计算出一个 256 位的二进制数字。而且可以保证,只要原始内容不同,对应的 Hash 一定也是不同的。
因此有两个推论
- 每个区块的 Hash 都是不一样的,可以通过 Hash 标示区块
- 如果区块的内容变了,它的 Hash 一定会改变
4.Hash 的不可修改性
区块 与 Hash 一一对应,每个区块的 Hash 都是针对“区块头(Head)”计算的
计算公式:Hash = SHA256(区块头)
SHA256 是区块链的 Hash 算法
如果一个区块被修改,则该区块的 Hash 改变,为了链接后面的区块,后面的区块也必须改变,上一个也得变。
而 Hash 的计算又非常耗时,所以除非一个人掌握了全网 51% 的计算能力,否则无法同时修改多个区块。
这种联动机制使数据一旦被写入,就无法被修改
5.采矿
由于必须保证节点之间的同步,新区块的添加速度不能太快,每个区块后只能跟着一个区块,采矿的人永远只能跟在最新的区块之后。一听到信号,必须同步。
区块链的发明者(假名:中本聪)故意让添加新区块非常困难。他的设计规则:一个新区块 / 10min,也就是 1 小时 6 个。
只有经过大量的运算,才能计算出当前区块的有效 Hash,所以快不起来。
这个过程就叫做采矿(mining)
6.难度系数
只有满足条件的 Hash 才会被区块链接受。
区块头包含一个难度系数(difficulty)
目标值(target)= targetmax / difficulty
Hash 的有效性跟目标值密切相关,只有小于目标值的 Hash 才是有效的,否则 Hash 无效,必须重算。由于目标值非常小,Hash 小于该值的机会极其渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。
区块头里面还有一个 Nonce 值,记录了 Hash 重算的次数。第 100000 个区块的 Nonce 值是274148111,即计算了 2.74 亿次,才得到了一个有效的 Hash,该区块才能加入区块链。
7.难度系数的动态调节
为了保证 一个区块 / 10min,中本聪 设计了难度系数的动态调节机制
每两周调整一次难度系数
难度系数越高 -> 目标值越小 -> 采矿越难
8.区块链的分叉
当两个人同时向区块链写入数据,新节点总是采用最长的那条区块链(哪个分支后面先打到 6 个区块,就采用哪个分叉)。
9.总结
区块链数据可靠,但是耗时耗能。
使用场景有限
- 不存在所有成员都信任的管理当局
- 写入的数据不要去实时使用
- 挖矿的收益 > 本身成本