[iframe src="https://mubu.com/doc/16ggfnRlzI" width="100%" height="900"] 思维导图百度云下载:链接:https://pan.baidu.com/s/1SqSvLzIOMZS1Y3UWqdS8ig 密码:n8s3 Source:红石@氢石科技 - 知识星球 星球里的原帖:https://t.zsxq.com/2Rz7uRB
0.区块链核心技术概览 运用之妙夺造化,存乎一心胜天工。 跨境商贸合作中签订的合同,怎么确保对方能严格遵守和及时执行? 酒店宣称刚打捞上来的三文鱼,怎么追踪捕捞和运输过程中的时间和卫生? 现代数字世界里,怎么证明你是谁?怎么证明某个资产属于你? 经典囚徒困境中的两个人,怎样才能达成利益的最大化? 宇宙不同文明之间的“黑暗森林”猜疑链,有没有可能被彻底打破? 这些看似很难解决的问题,在区块链的世界里已经有了初步的答案。 本文将带领大家探索区块链的核心技术,包括其定义与原理、关键的问题等,还将探讨区块链技术的演化,并对未来发展的趋势进行展望。最后,对一些常见的认识误区进行了澄清。 1.定义与原理 定义 区块链技术自身仍然在飞速发展中,目前相关规范和标准还在进一步成熟中。 公认的最早关于区块链的描述性文献是中本聪所撰写的 《比特币:一种点对点的电子现金系统》,但该文献重点在于讨论比特币系统,实际上并没有明确提出区块链的术语。在其中,区块和链被描述为用于记录比特币交易账目历史的数据结构。 另外,Wikipedia 上给出的定义中,将区块链类比为一种分布式数据库技术,通过维护数据块的链式结构,可以维持持续增长的、不可篡改的数据记录。 笔者认为,讨论区块链可以从狭义和广义两个层面来看待。 狭义上,区块链是一种以区块为基本单位的链式数据结构,区块中利用数字摘要对之前的交易历史进行校验,适合分布式记账场景下防篡改和可扩展性的需求。 广义上,区块链还指代基于区块链结构实现的分布式记账技术,还包括分布式共识、隐私与安全保护、点对点通信技术、网络协议、智能合约等。 区块链技术最早的应用出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了八年时间,支持了海量的交易记录,并且从未出现严重的漏洞,这些都与区块链结构的巧妙是分不开的。 基本原理 区块链的基本原理理解起来并不复杂。 首先包括三个基本概念: 交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录; 区块(Block):记录一段时间内发生的所有交易和状态结果,是对当前账本状态的一次共识; 链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。 如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中交易导致状态改变的结果进行确认。 在实现上,首先假设存在一个分布式的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表,这也是其名字“区块链”的来源。链表由一个个“区块”串联组成(如下图所示),后继区块记录前导区块的哈希(Hash)值。新的数据要加入,必须放到一个新的区块中。而这个块(以及块里的交易)是否合法,可以通过计算哈希值的方式快速检验出来。任意维护节点都可以提议一个新的合法区块,然而必须经过一定的共识机制来对最终选择的区块达成一致。 图 1.5.1.1 – 区块链结构示例 以比特币为例理解区块链工作过程 具体以比特币网络为例,来看其中如何使用了区块链技术。 首先,比特币客户端发起一项交易,广播到比特币网络中并等待确认。网络中的节点会将一些收到的等待确认的交易记录打包在一起(此外还要包括前一个区块头部的哈希值等信息),组成一个候选区块。然后,试图找到一个 nonce 串(随机串)放到区块里,使得候选区块的哈希结果满足一定条件(比如小于某个值)。这个nonce 串的查找需要一定的时间进行计算尝试。 一旦节点算出来满足条件的 nonce 串,这个区块在格式上就被认为是“合法”了,就可以尝试在网络中将它广播出去。其它节点收到候选区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的新区块,并添加到自己维护的区块链上。当大部分节点都将区块添加到自己维护的区块链结构上时,该区块被网络接受,区块中所包括的交易也就得到确认。 当然,在实现上还会有很多额外的细节。这里面比较关键的步骤有两个,一个是完成对一批交易的共识(创建区块结构);一个是新的区块添加到区块链结构上,被大家认可,确保未来无法被篡改。 比特币的这种基于算力寻找 nonce 串的共识机制被称为工作量证明(Proof of Work,PoW)。目前,要让哈希结果满足一定条件,并无已知的快速启发式算法,只能进行逐个尝试的暴力计算。尝试的次数越多(工作量越大),算出来的概率越大。 通过调节对哈希结果的限制,比特币网络控制平均约 10 分钟产生一个合法区块。算出区块的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。这个计算新区块的过程,即俗称的“挖矿”。 读者可能会关心,比特币网络是任何人都可以加入的,如果网络中存在恶意节点,能否进行恶意操作来对区块链中记录进行篡改,从而破坏整个比特币网络系统。比如最简单的,故意不承认收到的别人产生的合法候选区块,或者干脆拒绝来自其它节点的交易等。 实际上,因为比特币网络中存在大量(据估计数千个)的维护节点,而且大部分节点都是正常工作的,默认都只承认所看到的最长的链结构。只要网络中不存在超过一半的节点提前勾结一起采取恶意行动,则最长的链将很大概率上成为最终合法的链。而且随着时间增加,这个概率会越来越大。例如,经过 6 个区块生成后,即便有一半的节点联合起来想颠覆被确认的结果,其概率也仅为 (1/2)^6 ≈ 1.6%,即低于 1/60 的可能性。 当然,如果整个网络中大多数的节点都联合起来作恶,可以导致整个系统无法正常工作。要做到这一点,往往意味着付出很大的代价,跟通过作恶得到的收益相比,得不偿失。 注:区块链结构,与 Git 版本管理的有向无环图数据结构,在设计上有异曲同工之妙。 2.技术的演化与分类 区块链技术自比特币网络设计中被大家发掘关注,从最初服务数字货币系统,到今天在分布式账本场景下发挥着越来越大的技术潜力。 区块链的演化 比特币区块链已经支持了简单的脚本计算,但仅限于数字货币相关的处理。除了支持数字货币外,还可以将区块链上执行的处理过程进一步泛化,即提供智能合约(Smart Contract)。智能合约可以提供除了货币交易功能外更灵活的合约功能,执行更为复杂的操作。 这样扩展之后的区块链,已经超越了单纯数据记录的功能了,实际上带有点“智能计算”的意味了;更进一步地,还可以为区块链加入权限管理,高级编程语言支持等,实现更强大的、支持更多商用场景的分布式账本。 从计算特点上,可以看到现有区块链技术的三种典型演化场景: 场景 功能 智能合约 一致性 权限 类型 性能 编程语言 代表 公信的数字货币 记账功能 不带有或较弱 PoW 无 公有链 较低 简单脚本 比特币网络 公信的交易处理 智能合约 图灵完备 PoW、PoS 无 公有链 受限 特定语言 以太坊网络 带权限的分布式账本处理…
分布式系统 万法皆空,因果不空。 随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。 区块链首先是一个分布式系统。 中央式结构改成分布式系统,碰到的第一个问题就是一致性的保障。 很显然,如果一个分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。 本文将介绍分布式系统中一些核心问题的来源以及相关的工作。 一致性问题 在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。 如果分布式系统能实现“一致”,对外就可以呈现为一个功能正常的,且性能和稳定性都要好很多的“虚处理节点”。 举个例子,某影视公司旗下有西单和中关村的两个电影院,都出售某电影票,票一共就一万张。那么,顾客到达某个电影院买票的时候,售票员该怎么决策是否该卖这张票,才能避免超售呢?当电影院个数更多的时候呢? 这个问题在人类世界中,看起来似乎没那么难,你看,英国人不是刚靠 投票 达成了“某种一致”吗? 注意:一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否,例如,所有节点都达成失败状态也是一种一致。 挑战 在实际的计算机集群系统(看似强大的计算机系统,很多地方都比人类世界要脆弱的多)中,存在如下的问题: 节点之间的网络通讯是不可靠的,包括任意延迟和内容故障; 节点的处理可能是错误的,甚至节点自身随时可能宕机; 同步调用会让系统变得不具备可扩展性。 要解决这些挑战,愿意动脑筋的读者可能会很快想出一些不错的思路。 为了简化理解,仍然以两个电影院一起卖票的例子。可能有如下的解决思路: 每次要卖一张票前打电话给另外一家电影院,确认下当前票数并没超售; 两家电影院提前约好,奇数小时内一家可以卖票,偶数小时内另外一家可以卖; 成立一个第三方的存票机构,票都放到他那里,每次卖票找他询问; 更多…… 这些思路大致都是可行的。实际上,这些方法背后的思想,将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。只是因为计算机系统比较傻,需要考虑得更全面一些;而人们又希望计算机系统能工作的更快更稳定,所以算法需要设计得再精巧一些。 要求 规范的说,理想的分布式系统一致性应该满足: 可终止性(Termination):一致的结果在有限时间内能完成; 共识性(Consensus):不同节点最终完成决策的结果应该相同; 合法性(Validity):决策的结果必须是其它进程提出的提案。 第一点很容易理解,这是计算机系统可以被使用的前提。需要注意,在现实生活中这点并不是总能得到保障的,例如取款机有时候会是“服务中断”状态,电话有时候是“无法连通”的。 第二点看似容易,但是隐藏了一些潜在信息。算法考虑的是任意的情形,凡事一旦推广到任意情形,就往往有一些惊人的结果。例如现在就剩一张票了,中关村和西单的电影院也分别刚确认过这张票的存在,然后两个电影院同时来了一个顾客要买票,从各自“观察”看来,自己的顾客都是第一个到的……怎么能达成结果的共识呢?记住我们的唯一秘诀:核心在于需要把两件事情进行排序,而且这个顺序还得是大家都认可的。 第三点看似绕口,但是其实比较容易理解,即达成的结果必须是节点执行操作的结果。仍以卖票为例,如果两个影院各自卖出去一千张,那么达成的结果就是还剩八千张,决不能认为票售光了。 带约束的一致性 做过分布式系统的读者应该能意识到,绝对理想的强一致性(Strong Consistency)代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,越强的一致性要求往往意味着越弱的性能。 一般的,强一致性(Strong Consistency)主要包括下面两类: 顺序一致性(Sequential Consistency):Leslie Lamport 1979 年经典论文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中提出,是一种比较强的约束,保证所有进程看到的 全局执行顺序(total order)一致,并且每个进程看自身的执行(local order)跟实际发生顺序一致。例如,某进程先执行 A,后执行 B,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来。同时所有其它进程在全局上也应该看到这个顺序。顺序一致性实际上限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序。 线性一致性(Linearizability Consistency):Maurice P. Herlihy 与 Jeannette M. Wing 在 1990 年经典论文《Linearizability: A Correctness Condition for Concurrent Objects》中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。但是比较难实现,目前基本上要么依赖于全局的时钟或锁,要么通过一些复杂算法实现,性能往往不高。 目前,高精度的石英钟的漂移率为,人类目前最准确的原子震荡时钟的漂移率为。Google 曾在其分布式数据库 Spanner 中采用基于原子时钟和 GPS 的“TrueTime”方案,能够将不同数据中心的时间偏差控制在 10ms 以内。方案简单粗暴而有效,但存在成本较高的问题。 强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(Eventual Consistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(Weak Consistency)。 莫非分布式领域也有一个测不准原理?这个世界为何会有这么多的约束呢? 共识算法 实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。 共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案。 注:实践中,一致性的结果往往还需要客户端的特殊支持,典型地通过访问足够多个服务节点来验证确保获取共识后结果。…