阅读更多
1 原版传送门
如要学习完整内容,请猛戳⬇⬇⬇(支持耗子叔,支持原版)
2 区块链
2.1 技术概要
比特币的特性
- 去中心化
- 数据防篡改
- 固定的发行量
去中心化网络的前提:网络中的任何节点都是不能信任的,它们中的任何一个都可能会作恶
基于上述前提,分布式的记账系统必须满足如下要求
- 任何人都可以拿到所有数据
- 数据的正确性很容易验证
- 数据极难被篡改
区块链中的一个区块至少包含如下内容
- 当前区块的id
- 上一个区块的id
- 数据
- 注意,上面提到的id,都是与内容相关的,只要内容(包括2和3)发生改变,id以极大的概率会改变
区块id的计算,就是工作量证明共识机制(Proof-of-Work)
- 区块id的正确性必须容易被验证。当前区块的内容(前一个区块的id+数据)经过指定hash算法运算后得到的结果就是当前区块的id,否则就是不可信数据
- 区块id的产生非常耗费计算资源,以至于修改几乎不可能。要求产生的id前n位是0,n会随着整个网络的计算资源大小进行调整,从而保证一个相对恒定的产量
工作量证明机制(Proof-of-Work)可以有效解决如下问题
- 修改几乎变得不可能
- 能掌握51%算力的人也变得几乎不可能
- 解决分歧
2.2 Hash算法
著名的hash算法
- MD5
- SHA-256
下面重点介绍一下比特币的hash算法,比特币的区块头包含如下字段
- Version:当前区块链协议的版本号。4个字节
- Previous Block Hash:前面区块的hash地址。32个字节
- Merkle Root:交易信息(数据)的hash值。32个字节
- Timestamp:区块生成时间。4个字节
- Bits:表明当前hash生成的难度。4个字节
- Nonce:一个随机数,用于找到满足某个条件的hash值。4个字节
通过对五个字段进行hash计算(用SHA-256进行两次运算),就可以得到本区块的hash值,也就是id或者地址。这个hash值是有要求的,难度由Bits字段控制,旷工可以调整Nonce的数值来找到符合条件的hash值
2.3 加密和挖矿
挖矿流程
- 从网络上取得之前的区块信息
- 从“待记账区”中获取一组交易数据(有优先级,比如成长时间、旷工消费等)
- 形成区块头(计算Merkle Root并设计记账时间Timestamp等)
- 开始穷举Nonce,来计算区块头的hash值。如果前面有n个零,那么记账成功。如果没有,则从第一步重新开始
- 一旦旷工成功打包一个区块,他就会告诉其他旷工。收到消息的旷工会停下手上的工作,开始验证,验证通过后,广播给其他旷工。并开始新一轮的挖矿
关于Merkle Root
- 可以简单地将Merkle Root理解为交易的hash值
- 比特币的每一笔交易会有三个字段,一个是转出方,一个是转入方,另一个是金额。我们会对每笔交易的这三个字段求hash(三个字段一起求一个hash值),然后把所有交易的hash做两两合并,在求其hash值,直到算出最后一个hash值,这就是所谓的Merkle Root
- 这样做可以带来如下三个好处
- 大量的交易可以被分成多种尺寸的小组
- 这样的开销在内存和存储上并不大
- 在P2P无中心网络中,我们可以把大量数据拆成一个一个小数据片传输,提高传输效率
2.4 交易记录
2.4.1 手继续
这里需要知道另外一个概念,即“手续费”。手续费是发起交易的节点决定给的,和小费性质一样。比如A打算转给B,0.5BTC
,A手上有一个完整的(来自一个输入)BTC,这时A将这1
个BTC作为输入,输出包含两条,一条是给B的0.5BTC
,另一条是给自己0.49BTC
(这个过程叫“找零”)。那么这个交易中就有0.01BTC
是消失了,消失了的BTC将作为小费奖赏给矿工
现在我们把自己的角色转换为矿工,当我们从自己的内存中收集所有交易,准备打包区块时,发现这里有一条交易有0.01BTC
的小费,于是我把它作为本次打包优先考虑的交易记录。由于每个区块的大小限制在1M左右,所有我只选了那些给小费的交易打包进这次区块。而那些未给交易费的交易,在优先考虑完这些有交易费的交易之后,我才会考虑把它们加进来
这也就是为什么有些交易被确认很快,有些交易被确认很慢
2.4.2 确认
“确认”这个概念也要解释一下,一个区块产生之后,它不是立即可信的,网络上的节点总是相信最长的区块链,当一条交易记录被打包进一个区块之后,就有了一个确认,而这个区块所在的链后面被再加入一个区块,就是第二个确认,如此下去,一个交易有了6个确认,我们就认为这个交易已经确定了,会被永远记录在区块链中。为什么是6个确认呢?因为每一个确认就是一个挖矿过程,都需要提供非常严格的计算,因此,这6个区块被同一个矿工创建的可能性微乎其微(可以说是不可能),因此矿工伪造交易也基本不可能。
由于比特币的区块平均产生时间是10分钟,所以一个交易要1小时左右才能保证成功(最快),不过也不是所有的系统都这样认为,有些网站在接受比特币支付时,认为4个确认就可以给客户发货了。如果不幸这个交易在创建的时候,没有被打包进最近的那个区块,那就要延迟10分钟,如此下去,如果后面过了好几个区块,交易都没有被打包进区块链,那就悲剧了。
2.4.3 广播交易
不过也不用着急,比特币系统中只留给了这种优先级高的交易50k的存储空间,即使你没有给交易费,也可能在24小时内被打包进区块。不过也不一定,有些交易可能永远都进不了区块,因为矿工是从自己都内存中获取自己暂存的交易信息,一旦这些内存被释放,那么这些交易信息就会被清空。为了解决这个问题,比特币钱包需要不断对自己发起的交易进行检查,如果发现没有被打包进最新的区块,就要对网络广播,这样,这个交易就会在网络里不断被提起,矿工又可以把这笔交易写进自己的内存里暂时放着,等到下次打包区块时,选择是否把它打包进去
2.5 去中心化的共识机制
2.5.1 分布式一致性算法
经典的分布式一致性算法Paxos/Raft
和区块链使用的PoW
算法
- 相同点
- 都是一致性的算法
- 对系统的修改总是需要一个人来完成。区别就是区块链用
PoW
消耗资源,让提案变得困难;Paxos/Raft
用领导选举 - 系统中暂存的不一致性是可以被修正的。区别就是区块链考虑最长链,牺牲了强一致性,保证了可用性;
Paxos/Raft
如果没有超过半数的节点在线,会停止工作,牺牲了可用性,保证了强一致性
- 不同点
Paxos/Raft
需要Leader选举;而PoW
不需要Leader选举(无中心)Paxos/Raft
假设加入网络的节点都是受信的;而PoW
假设加入网络的节点是不可信的Paxos/Raft
需要事先定义整个集群中的节点数量,且数量较少;而PoW
中的节点数量是不确定的,且数量庞大
2.5.2 工作量证明
工作量证明(PoW)就是为了下面几件事情
- 提高对数据篡改的成本
- 提高网络中有不同声音的成本
- 解决分歧。以算力多的人认可的数据为准
PoW的问题
- 越来越中心化地记账:普通计算机无法承担这样的算力
- 越来越跑不动:验证数据正确性的成本越来越高
2.5.3 股权证明协议
为了使每个Block生成的速度加快,出现了PoS(Proof of Stake)协议
在PoS机制下,旷工不叫旷工,而叫校验者(Validator)。每个Validator需要以“交押金”的方式获取记账权(押金越多,计算hash值的难度越小)。因此,PoW
是多劳多得的社会,而PoS
是资本主义社会
延伸出来的问题:
- 如果钱越多的人越有动力维护社会稳定,那么中心化机构也越有动力维护整个系统的健康度,那么为什么还要去中心化
- 在PoS这种不需要算力的机制下,记账可以同时在两个分支上进行,以争取利益最大化(无论哪个分支胜出,都能获利)。如此一来,攻击者就可以利用这种情况进行Nothin-At-Stake攻击
- 99%的人在同时发展分支A和分支B。持有1%股份的人在分支A中写一笔交易,然后分支B没有这笔交易,当其在A分支上达成合约后(例如,收到商品),加入B分支,然后B分支胜出,导致其没有交易(白拿商品)
- 此外,还可以发生双重支付,Tom在分支A上给Jack100元,同时在分支B上给Jerry100元
- 贿赂攻击,攻击者可以在一个分支上声称购买了某个商品。然后以提高手续费的方式养另一个没有购买这个商品交易的分支,然后把没有这个交易的链养得足够长,长到系统最终选择了没有交易的这条链
2.5.4 DPoS机制
在常规的PoW和PoS机制中,一大影响效率之处在于任何一个新加入的区块,都需要被整个网络所有节点确认。DPoS优化方案在于:通过不同策略,不定时地选中一小群节点,这一小群节点做新区块的创建、验证、签名和相互监督。这样就大幅度减少了区块创建的确认所需要消耗的时间和算力成本
2.5.5 总结
- PoW:谁的算力大谁说话,真正无政府,无中心
- PoS:谁钱多谁说话,无政府,但受资本控制
- DPoS:谁选票多谁说话,有政府,有中心
2.5.6 区块链的CAP
- 去中心化
- 安全性
- 高性能
- 既安全,又高性能:放弃去中心化架构,例如DPoS这样的中心化系统,以及传统中心化架构
- 既无中心,又安全:放弃高性能,Pow架构
- 去中心化,又高性能:放弃安全,没有人会用
2.6 传统金融和虚拟货币
金融行业最大的本质就是:促进交易完成,实现价值提升
金融行业需要解决的问题
- 交易中的信用问题。所以,银行会来作中间人来担保
- 交易中的资金不足的问题。通过借贷来让交易完成
- 交易中的大额的问题。把一个大额的金融事件以股份的方式拆碎进行大众投资
虚拟货币(以比特币为例)的几个问题
- 交易成本上升。一定时间能产生的新区块的数量是有限的,因此可以记录的交易数量也是有限的
- 个人无法参与。比特币到现在这个阶段,个人电脑怕是连校验工作都很难完成(链太长了),更不用说挖矿了
- 社区的利益纷争
2.7 参考
- 区块链技术(1)-区块链的革命性及技术概要
- 区块链技术(2)-区块链技术细节-哈希算法
- 区块链技术(3)-区块链技术细节-加密和挖矿
- 区块链技术(4)-去中心化的共识机制
- 区块链技术(5)-智能合约
- 区块链技术(6)-传统金融和虚拟货币
- 【区块链】一文看懂区块链:一步一步发明比特币
- 区块链中,交易被如何打包进区块
3 分布式架构入门
分布式技术涵盖如下几个方面
- 服务调度:涉及服务发现、配置管理、弹性伸缩、故障恢复等
- 资源调度:涉及对底层资源的调度使用,如计算资源、网络资源和存储资源等
- 流量调度:涉及路由、负载均衡、流控、熔断等
- 数据调度:涉及数据副本、数据一致性、分布式事务、分库、分表等
- 容错处理:涉及隔离、幂等、重试、业务补偿、异步、降级等
- 自动化运维:涉及持续集成、持续部署、全栈监控、调用链跟踪等