本书适用于对区块链技术感兴趣,且具备一定信息和金融基础知识的读者;无技术背景的读者也可以从中了解到区块链的应用现状。
「区块链技术指南」在线阅读:https://www.gitbook.com/book/yeasy/blockchain_guide/details
以下为书摘(为了保持前后连贯顺畅,部分内容经过简单重组,仍与原文含义保持一致):
区块链技术的概念与展望
无论是货币,还是信用卡模式,都需要额外的系统(例如银行)来完成生产、分发、管理等操作,带来很大的额外成本和使用风险。诸如伪造、信用卡诈骗、盗刷、转账等安全事件屡见不鲜。
很自然的,如果能实现一种数字货币,保持既有货币的这些特性,消除纸质货币的缺陷,无疑将带来巨大的社会变革,极大提高经济活动的运作效率。
比特币是首次从实践意义上实现了一套去中心化的数字货币系统。
最早区块链技术雏形出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了近八年时间,支持了海量的交易记录,并未出现严重的漏洞。
公认的最早关于区块链的描述性文献是中本聪所撰写的「比特币:一种点对点的电子现金系统」,但该文献重点在于讨论比特币系统,实际上没有明确提出区块链的定义和概念。在其中,区块链被描述为用于记录比特币交易的账目历史。
从记账的角度来看,区块链是首个自带对账功能的数字记账技术实现。
区块链的基本概念包括:
- 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
- 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;
- 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。
如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。
区块链不是数据库。虽然区块链也可以用来存储数据,但它要解决的问题是多方的互信问题。单纯从存储数据角度,它的效率可能不高,笔者也不推荐把大量的原始数据放到区块链上。区块链不是要颠覆现有技术,作为基于多项已有技术而出现的新事物,区块链跟现有技术的关系是一脉相承的。
商业价值
现代商业的典型模式为,交易方通过协商和执行合约,完成交易过程。区块链擅长的正是如何管理合约,确保合约的顺利执行。
从技术特点上,区块链一般被认为具有:
- 分布式容错性:网络极其鲁棒,容错 1/3 左右节点的异常状态。
- 不可篡改性:一致提交后的数据会一致存在,不可被销毁或修改。
- 隐私保护性:密码学保证了未经授权者能访问到数据,但无法解析。
随之带来的业务特性将可能包括:
- 可信任性:区块链技术可以提供天然可信的分布式账本平台,不需要额外第三方中介机构。
- 降低成本:跟传统技术相比,区块链技术可能带来更短的时间、更少的人力和维护成本。
- 增强安全:区块链技术将有利于安全可靠的审计管理和账目清算,减少犯罪可能性和各种风险。
区块链并非凭空诞生的新技术,更像是技术演化到一定程度突破应用阈值后的产物,因此,其商业应用场景也跟促生其出现的环境息息相关。基于区块链技术,任何基于数字交易的活动成本和追踪成本都会降低,并且能提高安全性。笔者认为,能否最终带来成本的降低,将是一项技术能否被深入应用的关键。
区块链系统跟传统的分布式系统不同,其处理性能无法通过单纯增加节点数来进行扩展,实际上,很大程度上取决于单个节点的处理能力。高性能、安全、稳定性、硬件辅助加解密能力,都将是考察节点性能的核心要素。
世界上并没有绝对安全的系统。系统是由人设计的,系统也是由人来运营的,只要有人参与的系统,就容易出现漏洞。
最早出现的未必是先驱,也可能是先烈。创新固然很好,但过早播撒的种子,没有合适的土壤,往往也难长大。技术创新与科研创新很不同的一点便是,技术创新必须立足于需求,过早过晚都会错失良机。科研创新则要越早越好,最好像二十世纪那批物理巨匠们一样,让后人吃了一百多年老本。
区块链种类
根据参与者的不同,可以分为公开链、联盟链和私有链。
从功能上看,可以分为以货币交易为主的初代区块链(如比特币网络)、支持智能合约的二代区块链(如以太坊网络)、面向复杂商业应用场景支持链上代码的新一代区块链或分布式账本(如超级账本)。
分布式系统核心问题
一致性问题
如果一个分布式系统无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。
将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。
理想的分布式系统一致性应该满足:
- 可终止行(Termination):一致的结果在有限时间内完成;
- 共识性(Consensus):不同节点最终完成决策的结果应该相同;
- 合法性(Validity):决策的结果必须是其他进程提出的提案。
绝对理想的强一致性代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,超强的一致性要求往往意味着越弱的性能。
强一致性主要包含:顺序一致性、线性一致性。
强一致性的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性,即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性。
实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。
共识算法
共识算法解决的是对某个提案,大家达成一致意见的过程。
搞学术的人都喜欢对问题先确定一个界限,那么,这个问题的最坏界限在哪里呢?很不幸,一般情况下,分布式系统的共识问题无解。
当节点间网络不可靠时,很显然,无法确保实现共识。然而,即便在网络通信可靠的情况下,一个可扩展的分布式系统的共识问题的下限是无解。
这个结论,被称为 FLP 不可能性 原理,可以看做分布式领域的“测不准原理”。
FLP不可能性原理
FLP 不可能原理:在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性算法。
FLP 不可能原理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法。
但,学术界做研究,考虑的是数据和物理意义上极端的情形,很多时候现实生活要美好的多。科学告诉你什么是不可能的;工程则告诉你,付出一些代价,我可以把它变成可能。这就是工程的魅力。
科学上告诉你去赌场赌博从概率上总会是输钱的;工程则告诉你,如果你愿意接受最终输钱的结果,中间说不定偶尔能小赢几笔呢!?
在付出一定代价的情况下,我们能做到多少?回答这一问题的另一个很出名的原理:CAP 原理。
CAP 原理
分布式系统不可能同时确保一致性(Consistency)、可用性(Availability)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证。
- 一致性(Consistency):任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果(强一致性);
- 可用性(Availability):在有限时间内,任何非失败节点都能应答请求;
- 分区容忍性(Partition):网络可能发生分区,即节点之间的通信不可保障。
Paxos 与 Raft
Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。
Paxos 能保证在超过 1/2 的正常节点存在时,系统能达成共识。
Paxos 存在两个阶段:准备(prepare)阶段和提交(commit)阶段。准备阶段解决大家对哪个提案进行投票的问题,提交阶段解决最终值的问题。
Raft 算法是 Paxos 算法的一种简化实现。
拜占庭问题
拜占庭问题更为广泛,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的一致性达成问题。
拜占庭算法讨论的是最坏情况下的保障。
面向拜占庭问题的容错算法,解决的是网络通信可靠,但节点可能故障情况下的一致性达成。
1 | 以函数来表示,将军的总数为 n,n 里面背叛者的数量为 t,则只要 n > 3t 就可以容错。 |
拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但一旦确认,即为最终确认。
比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work)算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。
后来的各种 PoX 系列算法,也都是沿着这个思路进行改进,采用经济上的惩罚来制约破坏者。
可靠性指标
指标 | 概率可靠性 | 每年允许不可用时间 | 典型场景 |
---|---|---|---|
1个9 | 90% | 1.2 月 | 不可用 |
2个9 | 99% | 3.6 天 | 普通单点 |
3个9 | 99.9% | 8.6 小时 | 普通企业 |
4个9 | 99.99% | 51.6 分钟 | 高可用 |
5个9 | 99.999% | 5 分钟 | 电信级 |
6个9 | 99.9999% | 31 秒 | 极高要求 |
7个9 | 99.99999% | 3 秒 | N/A |
8个9 | 99.999999% | 0.3 秒 | N/A |
9个9 | 99.9999999% | 30 毫秒 | N/A |
依靠单点实现的可靠性毕竟是有限的,要想进一步的提升,那就只好消灭单点,通过主从、多活等模式让多个节点集体完成原先单点的工作。这可以从概率意义上改善服务的可靠性,也是分布式系统的一个重要用途。
密码学与安全技术
Hash 算法
Hash(哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能使任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
一个优秀的 Hash 算法,将能实现:
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干)hash 值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 冲突避免:很难找到两段内容不同的明文,使得他们的 hash 值一致(发生冲突)。冲突避免有时候又被称为“抗碰撞性”。如果给定一个明文前提下,无法找到碰撞的另一个明文,称为“弱抗碰撞性”;如果无法找到任意两个明文,发生碰撞,则称算法具有“强抗碰撞性”。
一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。也有一些 Hash 算法不是算力敏感的, 例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多的 CPU 来获得 hash 性能的提升。
数字摘要是 Hash 算法最重要的一个用途。数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。在网络上下载软件或文件时,往往同时会提供一个数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确保内容没有被修改过。
加解密算法
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文;解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。
数字签名
类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。
- HMAC:Hash-based Message Authentication Code,即“基于 Hash 的消息认证码”。
- 盲签名
- 多重签名
- 群签名
- 环签名
数字证书
数字证书用来证明某个公钥是谁的,并且内容是正确的。
对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。怎么确保一个公钥确实是某个人的原始公钥?这就需要数字证书机制。
顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发,权威的 CA 包括 Verisign 等。
PKI 体系
在非对称加密中,公钥则可以通过证书机制来进行保护,如何管理和分发证书则可以通过 PKI (Public Key Infrastructure)来保障。顾名思义,PKI 体系在现代密码学应用领域处于十分基础的地位,解决了十分核心的证书管理问题。
一般情况下, PKI 至少包含如下组件:
- CA(Certification Authority):负责证书的颁发和作废,接收来自 RA 的请求,是最核心的部分;
- RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
- 证书数据库:存放证书,一般采用 LDAP 目录服务,标准格式采用 X.500 系列。
常见的流程为,用户通过 RA 登记申请证书,CA 完成证书的制造,颁发给用户。用户需要撤销证书则向 CA 发出申请。
Merkle 树
默克尔树(哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶子节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。
默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
同态加密
同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。
与同态加密相关的一个问题是函数加密。
同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。
比特币 - Bitcoin
做设计,很多时候都是在权衡(trade-off)。
比特币项目是区块链技术首个大规模的成功应用,并且是首个得到实践检验的数字货币实现,在金融学和信息技术历史上都具有十分重要的意义。
比特币是基于密码学和经济博弈的一种数字货币,也是历史上首个经过大规模长时间运作检验的数字货币系统。
区块
如何避免作恶
基于经济博弈原理。
在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。
一个典型的例子
两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么指定规则才公平?
最简单的一个方案是负责切蛋糕的人后选。
比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉默成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。
负反馈调节
比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。
因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。
从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140 年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。
共识机制
目前,Proof of 系列中比较出名的一致性协议包括 PoW 和 PoS,都是通过经济惩罚来限制恶意参与。
PoW
工作量证明, Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题。保证在一段时间内,系统中只能出现少数合法提案。同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最长链上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。
超市付款需要排成一队,可能有人不守规矩要插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。只要大部分人不傻,就会自觉在最长的队伍上排队。
PoS
权益证明,Proof of Stake,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权。
闪电网络
比特币的区块链机制自身提供了很好的可信保障,但是很慢;另一方面考虑,对于大量的小额交易来说,是否真实需要这么高的可信性?闪电网络通过智能合约来完善链下的交易渠道。
核心概念:
RSMS(Recoverable Sequence Maturity Contract):解决链下交易确认的问题。
中文可翻译为“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,就是类似准备金机制。
HTLC(Hashed Timelock Contract):解决了支付通道的问题。
中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。
RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。整合这两种机制,就可以实现任意两个人之间的交易都可以在链下完成了。
在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。
侧链
允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。
以太坊 - Ethereum
君子和而不同。
以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约( Smart Contract )。
根据以太坊官方的宣称,以太坊( Ehtereum )目标是打造成一个运行智能合约的去中心化平台( Platform for Smart Contract ),平台上的应用按程序设定运行,不存在停机、审查、欺诈、第三方人为干预的可能。
以太坊平台由 Golang、C++、Python 等多种编程语言实现。
当然,为了打造这个平台,以太坊提供了一条公开的区块链,并制定了面向智能合约的一套编程语言。智能合约开发者可以在其上使用官方提供的工具来开发支持以太坊区块链协议的应用(即所谓的 DAPP )。
核心概念
- EVM:以太坊虚拟机,轻量级虚拟机环境,是以太坊中智能合约的运行环境。
- Account:账户,分两类:合约账户存储执行的合约代码;外部账户为以太币拥有者账户,对应到某公钥。
- Transaction:交易,从一个账户到另一个账户的消息,包括以太币或者合约执行参数。
- Gas:燃料,每执行一条合约指令会消耗一定的燃料,当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。
一致性
目前采用了 PoW 作为一致达成保证,未来可能迁移到 PoS 上。
降低攻击
设计核心思想是通过经济激励机制防止少数人作恶:
- 所有交易都要提供交易费用,避免 DDoS 攻击;
- 程序运行指令数通过 gas 来限制,所消耗的费用超过设定上限时会被取消,避免恶意合约。
提高扩展性
以太坊未来希望通过分片机制可以提高整个网络的扩展性。
分片之前整个网络的处理取决于单个节点的处理。分片后,只有同一片内的处理是同步的、一致的,不同分片之间则可以是异步的。
超级账本 - Hyperledger
Hyperledger 项目是首个面向企业的开放区块链技术的重要探索。在 Linux 基金会的支持下,吸引了包括 IBM、Intel、摩根等在内的众多科技和金融巨头的参与。
该项目的出现,实际上宣布区块链技术已经不再是仅面向“社会实践”性质的应用场景,它已经正式被主流机构和企业市场认可;同时,Hyperledger 首次提出和实现的完备权限管理、创新的一致性算法和可插拔、可扩展的框架,对于区块链相关技术和产业的发展都将产生深远的影响。
区块链即服务
懒惰和好奇,是创新与进步的源泉。
云的出现,让传统信息行业变得前所未有的便捷。只要云中有的服务,通过简单的几下点击,就可以获得一个运行中的服务实例,节约了大量的研发和运维的时间和成本。
现有的区块链分为三种:私有链、联盟链和公有链。私有链存在于机构内部,必要性较低,且在性能上弱于现有的分布式系统。联盟链建立在多个联盟机构之间,每个联盟成员之间各自拥有一个核心节点。公有链向社会开放,可以用于信息认证、公共资源共享。任何团体或个人可以加入公有链。
目前,业界已经开始有少数区块链前沿技术团队开发了区块链即服务( Blockchain as a Service,BaaS )的平台。根据上述划分,BaaS 平台可以面向用户群体提供联盟链及公开链两种服务,并根据不同的服务类型进行不同的结构设计及优化。
(完)