概述
http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html
- 安全,信任,去中心化
- 特殊的分布式数据库
- 区块链的作用是存储信息,读写 -> 数据库
- 任何人都可以架设服务器加入区块链网络
- 什么是区块链网络?
- 没有管理员,也无法产生管理员
区块(block)
概述
blockchain-002.jpg- 区块链由一个个区块组成,也是名称由来
- 区块很像数据库的记录,每次写入数据,就是创建一个区块
- 组成
- 区块头(Head):当前区块的元信息
- 生成时间
- 区块体Hash
- 上一个区块Hash
- ...
- 区块体(Body):实际数据
- 区块头(Head):当前区块的元信息
区块Hash
Hash = SHA256(区块头)
- 区块Hash被定义为区块头的Hash,由本区块和上一区块共同决定
- Hash计算的耗时性保证区块篡改的几乎不可行性,除非掌握全网51%以上算力
采矿
- 由于必须保证节点之间的同步,所以新区块的添加速度不能太快
- 试想一下
- 你刚刚同步了一个区块,准备基于它生成下一个区块
- 但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步
- 因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块
- 所以,你别无选择,一听到信号,就必须立刻同步
- 区块链的发明者中本聪(假名,真实身份至今未知)故意让添加新区块,变得很困难
- 他的设计是:平均每10分钟,全网才能生成一个新区块,一小时六个
- 这种产出速度不是通过命令达成,而是故意设置了海量计算
- 只有通过极其大量的计算,才能得到一个有效Hash(和区块Hash不是一个概念),从而把新区块添加到区块链
- 这个过程叫采矿(mining),因为计算有效Hash的难度,好比在全世界的沙子里面,找到一粒符合条件的沙子
- 计算Hash的机器就叫做矿机,操作矿机的人就叫做矿工
难度系数
概述
blockchain-003.jpg blockchain-004.jpg- 为什么计算Hash这么困难?
- 不是任意一个Hash都可以,只有满足条件的Hash才会被区块链接受
- 这个条件特别苛刻,使得绝大部分Hash都不满足要求,必须重算
- 区块头包含一个难度系数(difficulty),这个值决定了计算Hash的难度
- 举例来说,第100000个区块的难度系数是14484.16236122
- 有效Hash机制
- 区块链协议规定:使用一个常量除以难度系数,得到目标值
- 值(猜测由矿机自己来给) -> Hash算法 -> Hash值 -> 小于目标值的Hash才是有效的
- 目标值非常小,Hash小于该值的机会极其渺茫,可能计算10亿次,才算中一次
- 这就是采矿如此之慢的根本原因
- 区块头里面还有一个Nonce值,记录Hash重算的次数
- 第100000个区块的Nonce值是274148111,即计算了2.74亿次,才得到了一个有效的Hash,该区块才能加入区块链
难度系数调节
- 就算采矿很难,但也没法保证,正好十分钟产出一个区块
- 有时一分钟就算出来了,有时几个小时可能也没结果
- 总体来看,随着硬件设备的提升,以及矿机数量的增长,计算速度一定会越来越快
- 为了将产出速率恒定在十分钟,中本聪还设计了难度系数的动态调节机制
- 他规定,难度系数每两周(2016个区块)调整一次
- 如果两周里面,区块的平均生成速度是9分钟,就意味着比规定速度快了10%,因此难度系数调高10%
- 如果平均生成速度是11分钟,意味着比规定速度慢了10%,难度系数调低10%
- 难度系数越调越高(目标值越来越小),导致采矿越来越难
区块链分叉
-
同时有两个区块加入,应该采纳哪一个呢?
blockchain-005.jpg -
现有规则
- 新节点总是采用最长的那条区块链
- 如果有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为"六次确认")
- 按照10分钟一个区块计算,一小时就可以确认
-
由于新区块的生成速度由计算能力决定,所以这条规则就是说,拥有大多数计算能力的那条分支,就是正宗的区块链
blockchain-006.jpg
总结
- 区块链代价
- 效率:10分钟 + 同步时耗
- 能耗:无数无意义计算
- 场景
- 不存在所有成员都信任的管理当局
- 写入数据不要求实时使用
-
挖矿收益能够弥补本身成本
blockchain-007.jpg
PBFT
- 共识机制
比特币
http://www.ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html
网友评论