区块链技术指南学习笔记1

区块链的诞生

区块链是金融科技(Fintech)领域的一项重要基础科技创新。
作为分布式记账(Distributed Ledger Technology,DLT)系统的核心技术,区块链被认为在金融、物联网、商业贸易、征信、资产管理等众多领域都拥有广泛的应用前景。区块链技术尚处于快速发展的早期阶段,涉及分布式系统、密码学、博弈论、网络协议等诸多学科知识,为学习和实践都带来了不小的挑战。

从记账科技数千年的演化角度来看,区块链实际上是记账问题发展到分布式场景下的天然结果,账本科技的发展变化如下:

账本科技的变化

分布式记账

复式记账法虽然记录了交易的来龙去脉、不易出错,但本质上仍然是中心化模式。
中心化模式的记账系统方便使用,但在很多情况下仍然存在不少问题:账本掌握在个体手中,一旦出现数据丢失则无法找回;同时涉及到多个交易方的情况下,需要分别维护各自的账本,如果出现不一致,对账较为困难
很自然可以想到借助分布式系统的思想来实现分布式账本(Distributed Ledger):由交易多方共同维护同一个共享的分布式账本;打通交易在不同阶段的来龙去脉;同时凭借分布式技术,进一步提高记账的规模、效率、可靠性以及合规性。
但在分布式场景下,如何避免有参与方恶意篡改或破坏记录?该由谁来决定将交易记录写到账本中

2009 年 1 月,基于区块链结构的比特币网络悄然问世,它融合了现代密码学和分布式网络技术等重要成果。此后数年里,在纯分布式场景下比特币网络稳定支持了海量转账交易。这让人们开始认识到,区块链这一看似极为简洁的数据结构,居然恰好解决了分布式记账的基本需求,基于区块链结构的分布式记账技术开始大量出现。

但是目前分布式账本技术整体还处于发展的初期,还存在不少尚待解决的问题,包括权限管理、隐私保护、性能优化和互操作性等。

分布式记账与区块链

方案一

多方均允许对账本进行任意读写,一旦发生新的交易即追加到账本上。这种情况下,如果参与多方均诚实可靠,则该方案可以正常工作;但是一旦有参与方恶意篡改已发生过的记录,则无法确保账本记录的正确性。
在这里插入图片描述
方案二

为了防止有参与者对交易记录进行篡改,需要引入一定的验证机制。很自然地,可以借鉴信息安全领域的数字摘要(Digital Digest)技术。每次当有新的交易记录被追加到账本上时,参与各方可以使用 Hash 算法对完整的交易历史计算数字摘要,获取当前交易历史的“指纹”。此后任意时刻,每个参与方都可以对交易历史重新计算数字摘要,一旦发现指纹不匹配,则说明交易记录被篡改过。同时,通过追踪指纹改变位置,可以定位到被篡改的交易记录。
在这里插入图片描述

方案三
方案(二)可以解决账本记录防篡改的问题,然而在实际生产应用时,仍存在较大缺陷。由于每次追加新的交易记录时需要从头对所有的历史数据计算数字摘要,当已存在大量交易历史时,数字摘要计算成本将变得很高。而且,随着新交易的发生,计算耗费将越来越大,系统扩展性很差
为了解决可扩展性的问题,需要进一步改进为方案(三)。注意到每次摘要已经确保了从头开始到摘要位置的完整历史,当新的交易发生后,实际上需要进行额外验证的只是新的交易,即增量部分。因此,计算摘要的过程可以改进为对旧的摘要值再加上新的交易内容进行验证。这样就既解决了防篡改问题,又解决了可扩展性问题。
在这里插入图片描述
方案(三)中的账本结构正是一个区块链结构。
在这里插入图片描述

加密货币(比特币)

上世纪 50 年代计算机(ENIAC,1946 年)出现后,人们就尝试利用信息技术提高支付系统的效率。除了作为电子支付手段的各种银行卡,自 80 年代起,利用密码学手段构建的数字货币(加密货币)也开始成为研究的热门。

加密货币前后经历了 30 多年的探索,比较典型的成果包括 e-Cash、HashCash、B-money和Bit Gold 等。

目前,除了像以比特币这样的分布式技术之外,仍然存在不少中心化代理模式的数字货币机制,包括 paypal、支付宝甚至 Q 币等。通过跟已有的支付系统合作,也可以高效地进行代理交易。

直到今天,关于比特币的话题仍充满了不少争议。但大部分人应该都会认可,比特币是数字货币历史上,甚至整个金融历史上一次了不起的社会学实验。比特币网络上线以来,在无人管理的情况下,已经在全球范围内无间断地运行了 10 年时间,成功处理了千万笔交易,最大单笔支付超过 1.5 亿美金。难得的是,比特币网络从未出现过重大的系统故障。

比特币网络目前由数千个核心节点参与构成,不需要任何中心化的支持机构参与,纯靠分布式机制支持了稳定上升的交易量。比特币首次真正从实践意义上实现了安全可靠的非中心化数字货币机制,这也是它受到无数金融科技从业者热捧的根本原因。

作为一种概念货币,比特币主要希望解决已有货币系统面临的几个核心问题:

  • 被掌控在单一机构手中,容易被攻击。
  • 自身的价值无法保证,容易出现波动。
  • 无法匿名化交易,不够隐私

要实现一套数字货币机制,最关键的还是要建立一套完善的交易记录系统,以及形成一套合理的货币发行机制。这个交易记录系统要能准确、公正地记录发生过的每一笔交易,并且无法被恶意篡改。对比已有的银行系统,可以看出,现有的银行机制作为金融交易的第三方中介机构,有代价地提供了交易记录服务。如果参与交易的多方都完全相信银行的记录(数据库),就不存在信任问题。可是如果是更大范围(甚至跨多家银行)进行流通的货币呢?哪家银行的系统能提供完全可靠不中断的服务呢?唯一可能的方案是一套分布式账本。这个账本可以被所有用户自由访问,而且任何个体都无法对所记录的数据进行恶意篡改和控制。为了实现这样一个前所未有的账本系统,比特币网络巧妙地设计了区块链结构,提供了可靠、无法被篡改的数字货币账本功能。

区块链的价值

区块链擅长的正是如何在多方之间达成合约,并确保合约的顺利执行

从技术角度,一般认为,区块链具有如下特点:

  • 分布式容错性:分布式账本网络极其鲁棒,能够容忍部分节点的异常状态;
  • 不可篡改性:共识提交后的数据会一直存在,不可被销毁或修改;
  • 隐私保护性:密码学保证了数据隐私,即便数据泄露,也无法解析。

区块链核心技术概览

区块链的定义与原理

狭义上,区块链是一种以区块为基本单位的链式数据结构,区块中利用数字摘要对之前的交易历史进行校验,适合分布式记账场景下防篡改和可扩展性的需求。

广义上,区块链还指代基于区块链结构实现的分布式记账技术,包括分布式共识、隐私与安全保护、点对点通信技术、网络协议、智能合约等。

区块链的基本原理理解起来并不复杂。首先来看三个基本概念:

  • 交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录;
  • 区块(Block):记录一段时间内发生的所有交易和状态结果等,是对当前账本状态的一次共识
  • 链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。如果把区块链系统作为一个状态机,则每次交易意味着一次状态改变;生成的区块,就是参与者对其中交易导致状态改变结果的共识。

区块链的目标是实现一个分布的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表。链表由一个个“区块”串联组成(如下图所示),后继区块中记录前导区块的哈希(Hash)值。某个区块(以及块里的交易)是否合法,可通过计算哈希值的方式进行快速检验。网络中节点可以提议添加一个新的区块,但必须经过共识机制来对区块达成确认。
在这里插入图片描述

以比特币为例理解区块链工作过程

首先,用户通过比特币客户端发起一项交易,消息广播到比特币网络中等待确认。网络中的节点会将收到的等待确认的交易请求打包在一起,添加上前一个区块头部的哈希值等信息,组成一个区块结构(pre hash + 交易 + metadata)。然后,试图找到一个 nonce 串(随机串)放到区块里,使得区块结构的哈希结果满足一定条件(比如小于某个值)。这个计算 nonce 串的过程,即俗称的“挖矿”。nonce 串的查找需要花费一定的计算力。

一旦节点找到了满足条件的 nonce 串,这个区块在格式上就“合法”了,成为候选区块。节点将其在网络中广播出去。其它节点收到候选区块后进行验证,发现确实合法,就承认这个区块是一个新的合法区块,并添加到自己维护的本地区块链结构上。当大部分节点都接受了该区块后,意味着区块被网络接受,区块中所包括的交易也就得到确认。

这里比较关键的步骤有两个,一个是完成对一批交易的共识(创建合法区块结构);一个是新的区块添加到链结构上,被网络认可,确保未来无法被篡改。当然,在实现上还会有很多额外的细节。(创建区块结构 + 添加后被认可)

比特币的这种基于算力(寻找 nonce 串)的共识机制被称为工作量证明(Proof of Work,PoW)。这是因为要让哈希结果满足一定条件,并无已知的快速启发式算法,只能对 nonce值进行逐个尝试的蛮力计算。尝试的次数越多(工作量越大),算出来的概率越大。

通过调节对哈希结果的限制条件,比特币网络控制平均约 10 分钟产生一个合法区块。算出区块的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。

比特币网络是任何人都可以加入的,如果网络中存在恶意节点,能否进行恶意操作来对区块链中记录进行篡改,从而破坏整个比特币网络系统?比如最简单的,故意不承认别人产生的合法候选区块,或者干脆拒绝来自其它节点的交易请求等。

实际上,因为比特币网络中存在大量(据估计数千个)的维护节点,而且大部分节点都是正常工作的,默认都只承认所看到的最长的链结构。只要网络中不存在超过一半的节点提前勾结一起采取恶意行动,则最长的链将很大概率上成为最终合法的链。而且随着时间增加,这个概率会越来越大。例如,经过 6 个区块生成后,即便有一半的节点联合起来想颠覆被确认的结果,其概率也仅为 (1/2)^6 ≈ 1.6%,即低于 1/60 的可能性。10 个区块后概率将降到千分之一以下。

当然,如果整个网络中大多数的节点都联合起来作恶,可以导致整个系统无法正常工作。要做到这一点,往往意味着付出很大的代价,跟通过作恶得到的收益相比,往往得不偿失。

区块链的演化

比特币区块链面向转账场景,支持简单的脚本计算。很自然想到如果引入更多复杂的计算逻辑,将能支持更多应用场景,这就是智能合约(Smart Contract)。智能合约可以提供除了货币交易功能外更灵活的功能,执行更为复杂的操作。引入智能合约后的区块链,已经超越了单纯的数据记录功能,实际上带有点“智能计算”的意味了;更进一步地,还可以为区块链加入权限管理、高级编程语言支持等,实现更强大的、支持更多商用场景的分布式账本系统。演化场景具体有下面几种:

在这里插入图片描述

区块链与分布式记账

在这里插入图片描述
现代复式记账系统最早出现在文艺复兴时期的意大利,直到今天仍是会计学科的核心方法。复式记账法对每一笔账目同时记录来源和去向,首次将对账验证功能嵌入记账过程,提升了记账过程的可靠性和可追查性。区块链则实现了完整交易历史的记录和保护。从这个角度来看,区块链是首个自带对账功能的数字账本结构。更广泛地,区块链实现了非中心化的记录。参与到系统中的节点,并不属于同一组织,彼此
可以信任或不信任;链上数据由所有节点共同维护,每个节点都存储一份完整或部分的记录拷贝。

跟传统的记账技术相比,基于区块链的分布式账本包括如下特点:

  • 维护一条不断增长的链,只可能添加记录,而且记录一旦确认则不可篡改
  • 非中心化,或者说多中心化的共识,无需集中的控制,实现上尽量分布式;
  • 通过密码学的机制来确保交易无法被抵赖和破坏,并尽量保护用户信息和记录的隐私性。

认识上的误区

目前,区块链作为一种相对年轻的技术,自身仍在飞速发展中,在相关概念上仍有一些值得探讨之处。

下面总结一些常见的认知误区。

  1. 区块链是完全创新的,是颠覆性的。作为融合多项已有技术而出现的事物,区块链跟现有记账科技和信息体系是一脉相承的。区块链在解决多方合作和可信计算问题上向前多走了一步,但并不意味着它就是万能的(从来不会存在一项万能的科技),更不会快速颠覆已有的众多
    商业模式。很长一段时间里,区块链的应用场景仍需不断摸索,区块链在自身发展的同时也会与已有系统共存互通。

  2. 区块链必然是非中心化的,非中心化的一定优于中心化设计 比较两种技术的优劣必须要先确定场景前提,区块链也是如此。不可能存在某种技术在任意场景下都是最优的。目前区块链两大形态——公有链和联盟链之所以在技术选型上存在较大差异,正是因为它们面向的场景
    不同。中心化设计往往具有设计简单、管理完善、性能高、安全可控的特点,但容错性能比较差;非中心化(多中心化)的设计可以提高容错性能,可以利用多方共识来降低篡改风险,但意味着设计较复杂,性能较差。从实际需求出发,现有大部分区块链技术都介于绝对的中心化和绝对的非中心化之间,以取得不同指标上的平衡。例如某些公有链为了提高性能,选择部分代表节点来参与共识。

  3. 区块链离不开加密数字货币。虽说区块链的早期应用之一是比特币等加密数字货币,但发展到今日,区块链技术早已脱颖而出,两者也各自发展为不同的目标。前者侧重从金融角度发掘加密数字货币的实验和实践意义;后者则从技术层面探讨和研究分布式账本科技的商业价
    值,并试图拓展到更多分布式互信的场景。

  4. 区块链是一种数据库技术 虽然区块链中可以使用数据库技术,也可以用来存储或管理数据(Data Management)技术,但它要面向的核心问题是多方数据互信协作(Data Collaboration)问题,这是传统数据技术无法解决的。另外,单纯从数据存储或管理角度,区块链效率可能不如传统数据库效率高,因此一般不推荐把大量原始数据直接放到区块链系统中。当然,区块链系统可以很好的与现有数据库和大数据等技术集成,也有人尝试将区块链的一些特点引入到数据库设计中,解决非中心化的管理问题,如 BigchainDB。

Token 等于加密数字货币 早在区块链概念出现之前,Token(令牌)就大量应用在计算机系统中。作为权限证明,它可以协助计算机系统进行认证等操作。作为分布式系统,区块链中很自然也可以在某些场景(如游戏积分)下借用 Token 机制,带来应用生态的管理便利。而加密数字货币试图借用数字化技术来实现货币功能,更强调经济价值,跟计算机系统中的原生功能无必然联系。

分布式系统核心技术

一致性问题

一致性问题是分布式领域最基础、最重要的问题,也是半个世纪以来的研究热点。

随着业务场景越来越复杂,计算规模越来越庞大,单点系统往往难以满足高可扩展(Scalability)和高容错(Fault-tolerance)两方面的需求。此时就需要多台服务器通过组成集群,构建更加强大和稳定的“虚拟超级服务器”。任务量越大,处理集群的规模越大,设计和管理的挑战也就越高。谷歌公司的全球搜索集群系统,包括数十万台服务器,每天响应百亿次的互联网搜索请求。

集群系统要实现一致性不是一件容易的事。不同节点可能处于不同的状态,不同时刻收到不同的请求,而且随时可能有节点出现故障。要保持对外响应的“一致性”,好比训练一群鸭子齐步走,难度可想而知。

那么,为什么说一致性问题十分重要呢?

举个现实生活中的例子,多个售票处同时出售某线路上的火车票,该线路上存在多个经停站,怎么才能保证在任意区间都不会出现超售(同一个座位卖给两个人)的情况?
这个问题看起来似乎没那么难,现实生活中经常通过分段分站售票的机制。然而,要支持海量的用户进行并行购票,并非易事(参考 12306 的案例)。特别是计算机系统往往需要达到远超物理世界的高性能和高可扩展性需求,挑战会变得更大。这也是为何每年到了促销季,各大电商平台都要提前完善系统。

共识算法

共识(Consensus),很多时候会见到与一致性(Consistency)术语放在一起讨论。严谨地讲,两者的含义并不完全相同。

共识,特指在分布式系统中多个节点之间对某个事情(例如多个事务请求,先执行谁?)达成一致看法的过程。因此,达成某种共识并不意味着就保障了一致性。

共识算法解决的是分布式系统对某个提案(Proposal),大部分节点达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是主节点……等等。可以认为任何可以达成一致的信息都是一个提案。

无论是在现实生活中,还是计算机世界里,达成共识都要解决两个基本的问题:

  • 首先,如何提出一个待共识的提案?如通过令牌传递、随机选取、权重比较、求解难题……等;
  • 其次,如何让多个节点对该提案达成共识(同意或拒绝),如投票、规则验证……等。

理论上,如果分布式系统中各节点都能以十分“理想”的性能(瞬间响应、超高吞吐)稳定运行,节点之间通信瞬时送达(如量子纠缠),则实现共识过程并不十分困难,简单地通过广播进行瞬时投票和应答即可。可惜地是,现实中这样的“理想”系统并不存在。不同节点之间通信存在延迟(光速物理限制、通信处理延迟),并且任意环节都可能存在故障(系统规模越大,发生故障可能性越高)。

如通信网络会发生中断、节点会发生故障、甚至存在被入侵的节点故意伪造消息,破坏正常的共识过程。一般地,把出现故障(Crash 或 Fail-stop,即不响应)但不会伪造信息的情况称为“非拜占庭错误(Non-Byzantine Fault)”或“故障错误(Crash Fault)”;伪造信息恶意响应的情况称为“拜占庭错误”(Byzantine Fault),对应节点为拜占庭节点。显然,后者场景中因为存在“捣乱者”更难达成共识。

此外,任何处理都需要成本,共识也是如此。当存在一定信任前提(如接入节点都经过验证、节点性能稳定、安全保障很高)时,达成共识相对容易,共识性能也较高;反之在不可信的场景下,达成共识很难,需要付出较大成本(如时间、经济、安全等),而且性能往往较差(如工作量证明算法)。

常见算法

根据解决的场景是否允许拜占庭错误情况,共识算法可以分为 Crash Fault Tolerance (CFT)和 Byzantine Fault Tolerance(BFT)两类。

对于非拜占庭错误的情况,已经存在不少经典的算法,包括 Paxos(1990 年)、Raft(2014年)及其变种等。这类容错算法往往性能比较好,处理较快,容忍不超过一半的故障节点。

对于要能容忍拜占庭错误的情况,包括 PBFT(Practical Byzantine Fault Tolerance,1999年)为代表的确定性系列算法、PoW(1997 年)为代表的概率算法等。确定性算法一旦达成共识就不可逆转,即共识是最终结果;而概率类算法的共识结果则是临时的,随着时间推移
或某种强化,共识结果被推翻的概率越来越小,最终成为事实上结果。拜占庭类容错算法往往性能较差,容忍不超过 1/3 的故障节点。

此外,XFT(Cross Fault Tolerance,2015 年)等最近提出的改进算法可以提供类似 CFT 的处理响应速度,并能在大多数节点正常工作时提供 BFT 保障。Algorand 算法(2017 年)基于 PBFT 进行改进,通过引入可验证随机函数解决了提案选择的问题,理论上可以在容忍拜占庭错误的前提下实现更好的性能(1000+ TPS)。

理论证明告诉我们,即便在网络通信可靠情况下,一个可扩展的分布式系统的共识问题通用解法的下限是——没有下限(无解)。这个结论,被称为“FLP 不可能原理(在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统 中,不存在一个可以解决一致性问题的确定性共识算法”。该原理极其重要,可以看做是分布式领域里的“测不准原理”。

发布了58 篇原创文章 · 获赞 3 · 访问量 3819
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 护眼 设计师: 闪电赇

分享到微信朋友圈

×

扫一扫,手机浏览