0%

左耳听风-读书笔记

阅读更多

1 原版传送门

如要学习完整内容,请猛戳⬇⬇⬇(支持耗子叔,支持原版)

课程购买链接

2 区块链

2.1 技术概要

比特币的特性

  1. 去中心化
  2. 数据防篡改
  3. 固定的发行量

去中心化网络的前提:网络中的任何节点都是不能信任的,它们中的任何一个都可能会作恶

基于上述前提,分布式的记账系统必须满足如下要求

  1. 任何人都可以拿到所有数据
  2. 数据的正确性很容易验证
  3. 数据极难被篡改

区块链中的一个区块至少包含如下内容

  1. 当前区块的id
  2. 上一个区块的id
  3. 数据
  • 注意,上面提到的id,都是与内容相关的,只要内容(包括2和3)发生改变,id以极大的概率会改变

区块id的计算,就是工作量证明共识机制(Proof-of-Work)

  1. 区块id的正确性必须容易被验证。当前区块的内容(前一个区块的id+数据)经过指定hash算法运算后得到的结果就是当前区块的id,否则就是不可信数据
  2. 区块id的产生非常耗费计算资源,以至于修改几乎不可能。要求产生的id前n位是0,n会随着整个网络的计算资源大小进行调整,从而保证一个相对恒定的产量

工作量证明机制(Proof-of-Work)可以有效解决如下问题

  1. 修改几乎变得不可能
  2. 能掌握51%算力的人也变得几乎不可能
  3. 解决分歧

2.2 Hash算法

著名的hash算法

  1. MD5
  2. SHA-256

下面重点介绍一下比特币的hash算法,比特币的区块头包含如下字段

  1. Version:当前区块链协议的版本号。4个字节
  2. Previous Block Hash:前面区块的hash地址。32个字节
  3. Merkle Root:交易信息(数据)的hash值。32个字节
  4. Timestamp:区块生成时间。4个字节
  5. Bits:表明当前hash生成的难度。4个字节
  6. Nonce:一个随机数,用于找到满足某个条件的hash值。4个字节

通过对五个字段进行hash计算(用SHA-256进行两次运算),就可以得到本区块的hash值,也就是id或者地址。这个hash值是有要求的,难度由Bits字段控制,旷工可以调整Nonce的数值来找到符合条件的hash值

2.3 加密和挖矿

挖矿流程

  1. 从网络上取得之前的区块信息
  2. 从“待记账区”中获取一组交易数据(有优先级,比如成长时间、旷工消费等)
  3. 形成区块头(计算Merkle Root并设计记账时间Timestamp等)
  4. 开始穷举Nonce,来计算区块头的hash值。如果前面有n个零,那么记账成功。如果没有,则从第一步重新开始
  5. 一旦旷工成功打包一个区块,他就会告诉其他旷工。收到消息的旷工会停下手上的工作,开始验证,验证通过后,广播给其他旷工。并开始新一轮的挖矿

关于Merkle Root

  • 可以简单地将Merkle Root理解为交易的hash值
  • 比特币的每一笔交易会有三个字段,一个是转出方,一个是转入方,另一个是金额。我们会对每笔交易的这三个字段求hash(三个字段一起求一个hash值),然后把所有交易的hash做两两合并,在求其hash值,直到算出最后一个hash值,这就是所谓的Merkle Root
  • 这样做可以带来如下三个好处
    1. 大量的交易可以被分成多种尺寸的小组
    2. 这样的开销在内存和存储上并不大
    3. 在P2P无中心网络中,我们可以把大量数据拆成一个一个小数据片传输,提高传输效率

fig1

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算法

  • 相同点
    1. 都是一致性的算法
    2. 对系统的修改总是需要一个人来完成。区别就是区块链用PoW消耗资源,让提案变得困难;Paxos/Raft用领导选举
    3. 系统中暂存的不一致性是可以被修正的。区别就是区块链考虑最长链,牺牲了强一致性,保证了可用性;Paxos/Raft如果没有超过半数的节点在线,会停止工作,牺牲了可用性,保证了强一致性
  • 不同点
    1. Paxos/Raft需要Leader选举;而PoW不需要Leader选举(无中心)
    2. Paxos/Raft假设加入网络的节点都是受信的;而PoW假设加入网络的节点是不可信的
    3. Paxos/Raft需要事先定义整个集群中的节点数量,且数量较少;而PoW中的节点数量是不确定的,且数量庞大

2.5.2 工作量证明

工作量证明(PoW)就是为了下面几件事情

  1. 提高对数据篡改的成本
  2. 提高网络中有不同声音的成本
  3. 解决分歧。以算力多的人认可的数据为准

PoW的问题

  1. 越来越中心化地记账:普通计算机无法承担这样的算力
  2. 越来越跑不动:验证数据正确性的成本越来越高

2.5.3 股权证明协议

为了使每个Block生成的速度加快,出现了PoS(Proof of Stake)协议

在PoS机制下,旷工不叫旷工,而叫校验者(Validator)。每个Validator需要以“交押金”的方式获取记账权(押金越多,计算hash值的难度越小)。因此,PoW是多劳多得的社会,而PoS是资本主义社会

延伸出来的问题:

  1. 如果钱越多的人越有动力维护社会稳定,那么中心化机构也越有动力维护整个系统的健康度,那么为什么还要去中心化
  2. 在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 总结

  1. PoW:谁的算力大谁说话,真正无政府,无中心
  2. PoS:谁钱多谁说话,无政府,但受资本控制
  3. DPoS:谁选票多谁说话,有政府,有中心

2.5.6 区块链的CAP

  1. 去中心化
  2. 安全性
  3. 高性能
  • 既安全,又高性能:放弃去中心化架构,例如DPoS这样的中心化系统,以及传统中心化架构
  • 既无中心,又安全:放弃高性能,Pow架构
  • 去中心化,又高性能:放弃安全,没有人会用

2.6 传统金融和虚拟货币

金融行业最大的本质就是:促进交易完成,实现价值提升

金融行业需要解决的问题

  1. 交易中的信用问题。所以,银行会来作中间人来担保
  2. 交易中的资金不足的问题。通过借贷来让交易完成
  3. 交易中的大额的问题。把一个大额的金融事件以股份的方式拆碎进行大众投资

虚拟货币(以比特币为例)的几个问题

  1. 交易成本上升。一定时间能产生的新区块的数量是有限的,因此可以记录的交易数量也是有限的
  2. 个人无法参与。比特币到现在这个阶段,个人电脑怕是连校验工作都很难完成(链太长了),更不用说挖矿了
  3. 社区的利益纷争

2.7 参考

3 分布式架构入门

分布式技术涵盖如下几个方面

  1. 服务调度:涉及服务发现、配置管理、弹性伸缩、故障恢复等
  2. 资源调度:涉及对底层资源的调度使用,如计算资源、网络资源和存储资源等
  3. 流量调度:涉及路由、负载均衡、流控、熔断等
  4. 数据调度:涉及数据副本、数据一致性、分布式事务、分库、分表等
  5. 容错处理:涉及隔离、幂等、重试、业务补偿、异步、降级等
  6. 自动化运维:涉及持续集成、持续部署、全栈监控、调用链跟踪等

3.1 参考