区块链实战:从技术创新到商业模式
上QQ阅读APP看书,第一时间看更新

“盲人摸象”地解构区块链

曾经有人批评很多有关区块链技术的讲解如同“盲人摸象”,然而我们认为,要理解新技术必须有一种“盲人摸象”的勇气——先去解构性地理解局部,对局部了解得越来越清晰之后,再破除、纠正一些错误的认知,就能形成完整的认知拼图。

从不同角度对区块链进行介绍时,我们的确像“盲人摸象”一样——先从单一角度来看区块链是什么,然后逐渐来看各个角度之间有什么联系,相信聪明的你一定能够由此对区块链有一个更全面的认知(见图1–2)。正如我们前面说的,你不需要具备计算机基础知识就能大体上看懂这部分内容。如果你已具备计算机知识,甚至对区块链有所了解,希望我们这种解构能让你对区块链的认知更进一步。

图1–2 区块链技术的8种特性

分布式数据库

区块链是一种数据库,而且是一种分布式数据库。

提到数据库时,人们常常会立刻想到最流行的数据库,如PostgreSQL、MySQL等。但在此我们需要提醒你,“数据库”其实是一个非常广义的概念,前述举例的关系型数据库只是其中一种特例。比如,我们日常使用的计算机文件系统,也可以被认为是一种类型的数据库。因此,在理解区块链是一种数据库时,要明白它很可能并不是你所认为的“数据库”的样子。

区块链的核心就是数据库,而且大部分区块链技术在底层实现上采用了传统的数据库引擎来保存数据。例如,维护比特币代码的Bitcoin Core团队实现的比特币就采用了LevelDB(最早由谷歌公司贡献的一种开源数据库引擎)来索引和保存区块链的链状态信息(包括UTXOUTXO,全称为Unspent Transaction Output,即未花费的交易输出,是比特币的一种独特设计,可通俗理解为相当于用现金付账时找零的零钱记录。比特币的交易由交易输入和交易输出组成,每一笔交易都要花费(spend)一笔输入,产生一笔输出(output),而其所产生的输出,就是“未花费的交易输出”。集、当前最佳块等),而在比特币的钱包里则采用了Bekerly DB(另一种开源的非关系型数据库引擎)。不同的区块链可能会采用不同的数据库系统来实现,同一种区块链的不同的节点实现版本也可能采用不同的数据库。

数据库及其分类

简而言之,数据库可被视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

数据库分为关系型数据库和非关系型数据库。

关系型数据库是存储在计算机上的、可共享的、有组织的关系型数据的集合,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间有很多复杂的关联关系。常见的关系型数据库有MySQL、SQL Server等。

非关系型数据库指非关系型的、分布式的且一般不保证遵循ACID(4个字母分别代表原子性、一致性、隔离性、持久性)原则的数据存储系统。非关系型数据库结构相对简单,在大数据量下的读写性能好;能满足随时存储自定义数据格式需求,非常适用于大数据处理工作,适合追求速度和可扩展性、业务多变的应用场最。

分布式数据库

分布式数据库是用计算机网络将物理上分散的多个数据库单元连接起来组成的一个逻辑上统一的数据库。每个被连接起来的数据库单元被称为站点或节点。分布式数据库有一个统一的数据库管理系统来进行管理,被称为分布式数据库管理系统。

40年前,数据库的关系模型的提出,开创了数据库关系方法和关系数据库理论的研究,为关系型数据库技术奠定了理论基础。目前,关系型数据库系统仍然是数据库系统的主流,市场上涌现出了很多关系型数据库产品,如小型关系型数据库管理系统dBase/Foxbase/Visual FoxPro、Access.MySQL,大型关系型数据库管理系统DB2、Ingres、Oracle、Informix.Sybase和SQL Server等。这些数据库产品从最初各自为政的编程接口起步,到逐渐支持结构化查询语言SQL,并使SQL的影响甚至已经超出数据库领域,得到如人工智能、大数据等其他领城的数据检索的重视和采用。

区块链网络各个节点是复制同步的分布式数据库(见图1-3)。每个“健康”节点上的数据库里都有着完整的区块链上的所有数据和历史信息。由于每个节点上都有完整的检索数据,因此在每一个节点就能直接查询到区块链上的任何记录,不需要依赖任何第三方。

图1–3 中心化账本和分布式账本的比较示意

我们有时候说区块链是分布式账本技术,尤其当人们谈及联盟链(Consortium Blockchain)技术的时候。账本其实只是数据库的一种相对简化的特例,早期的区块链都和数字货币相关,主要的数据就是交易,而这些交易的数据集合就是账本。随着区块链技术的不断发展,越来越丰富的数据甚至代码逻辑也出现在区块链上,但作为习惯的延续,人们还常常称区块链数据库为“账本”,称每条记录为“交易”。

由于区块链是一种分布复制的数据库,将数据保存在这样的数据库里的开销和成本是比较大的,因此区块链这种数据库不适合用来保存海量数据,通常只用来保存关键信息,或者作为其他存储方式的数据的验证信息。有种常见用法是试图把所有数据都一股脑儿“上链”,在区块链里保存,这是对区块链的一种误解、误用。本书第四部分将阐述典型的数据上链应用设计模式。简而言之,数据上链并不是把数据全部放在区块链上,而是把数据仍然保存在原有的地方,只是把数据的校验信息放在链上。

共识机制:让各个节点的数据库保持一致的方法

谈到区块链时,我们经常会听到“共识”(Consensus)这个概念,各种共识算法的名称,例如工作量证明(Proof of Work,缩写为PoW)、权益证明(Proof of Stake,缩写为PoS)等,常常让人望而生畏。

工作量证明、权益证明

工作量证明是一种应对服务与资源滥用,或是拒绝服务攻击的经济对策。一般要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以耗用的时间、设备与能源作为担保成本,来确保服务与资源是被真正的需求使用。这一概念最早由辛西娅·德沃克和莫尼·瑙尔于1993年发表的学术论文中提出,被用于经济领域统计。“工作量证明”一词由马库斯·雅各布森与阿里·尤尔斯在1999年计算机反垃圾邮件系统实现中提出。现在,工作量证明成为以比特币为代表的加密货币或区块链的主流共识机制。

权益证明(又称持有量证明)是2012年出现的共识机制。与要求验证者执行一定量的计算工作的工作量证明不同,权益证明要求一组验证者轮流对下一个区块进行提议和投票,每个验证者的投票权重取决于其持有权益证明的多少。权益证明的显著优势在于具备安全性,降低集中化的风险以及提升能效。

之前我们提到,区块链就是一种分布式数据库,是有很多个节点的复制的数据库,而且每个节点都可以独立验证数据,不需要依赖第三方。那么,一个很自然的问题就是:如何能让这些节点的数据库保持一致?传统的分布式数据库设计有一个重要的假设,即分布式数据库的每个节点都是“友好”的。因此,要保持数据一致,主要需要克服的是一些技术问题,比如网络延迟怎么办?网络临时中断怎么办?不同节点上的用户对相同的数据都想进行修改怎么办?……所有这些问题在区块链这种分布式数据库上全部存在。除此之外,区块链的一个重要想法是,不能默认各个节点都是“友好”的,有可能有些节点就是有意要“制造麻烦”,这就使得区块链要解决这个问题更为困难。

实际上,“共识”的概念很容易理解。所谓共识的本质,就是一种让区块链各个节点上的数据保持一致的方法。而各种不同的共识算法,就是为了达到此目的而采用的不同技术方法。我们要理解一个重要概念:“共识机制”的根本目的在于确保区块链各节点上的数据是一致的。

因此,达成共识注定是一个“慢”且“费劲”的过程,但这就是代价——为了实现区块链系统的分布式、去中心化、独立验证、数据难被篡改等特性所必须付出的代价。无论未来人类发明出多么高性能的共识算法,网络和计算性能有多大程度的提高,可以肯定的是,区块链系统的性能必然会始终低于集中式系统。对这一事实的理解和把握,是我们决定一个应用是否应该采用区块链技术,或者决定一个应用的哪些部分应该采用区块链技术的重要原则,即高性能永远不是采用区块链技术的首要目标。

共识算法对公链(公共区块链,或无须许可的区块链)至关重要,因为任何人不需要任何许可就能加入这类区块链网络,因此无法确认节点的意图,即便发现其可能有恶意也难以杜绝,这就导致共识算法几乎是保证这类区块链系统可靠的唯一途径。而需要许可的区块链,例如联盟链,其成员往往被一定规则约束,从身份识别验证、加入网络、访问权限到参与活动都是受控制的。在这类区块链架构中,除共识算法之外还有很多方法可以保证系统安全和数据一致性,因此可以选择更轻量的共识机制,例如实用拜占庭容错算法(Practical Byzantine Fault Tolerance,缩写为PBFT),而在联盟链环境下选择工作量证明机制往往是不必要的。

拜占庭容错及实用拜占庭容错算法

拜占庭容错是由莱斯利·兰波特于1982年在其同名论文http://lamport.azurewebsites.net/pubs/byz.pdf.中提出的分布式点对点网络通信容错问题。其含义是,在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此,对一致性的研究一般假设信道是可靠的,或不存在本问题。这个难题也被称为“拜占庭将军问题”或者“两军问题”。

实用拜占庭容错算法是由米格尔·卡斯特罗和芭芭拉·利斯科夫在1999年发表的论文中提出的http://pmg.csail.mit.edu/papers/osdi99.pdf.,该算法解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。

直到2020年年初,在公链类型的区块链上,工作量证明仍然是唯一真正经受住了时间考验和证明的共识机制。由于工作量证明共识机制通常会导致巨大的计算资源消耗,进而导致无谓的能耗竞争,业内一直在尝试寻找更经济实用、性能更好的方法。已经有为数众多的区块链项目尝试采用权益证明机制或在其基础上演变的改进版本算法,但其可靠性还需要时间来证明。近两年,公链项目层出不穷,市场上出现了各种各样的共识算法,好多都采用“Po?”(Proof of ?)来命名,有人开玩笑说,26个英文字母都不够用了。这些算法中有一些作为学术讨论和论文研究被学界接受,也有一些纯属无稽之谈或炒作,但无一例外都尚未在实际应用中得到足够的验证。

P2P通信

为了成为一个有“共识”的、可靠的分布式数据库,而且能够不依赖任何中间人,区块链必须在网络传输上有所突破,解决这个问题的方法就是P2P(点对点)通信。所谓P2P通信,就是节点之间直接通信而不需要经由第三方。我们不要被P2P这样的字眼迷惑,其实这是最简单、直接、“原始”的通信方式,是任何网络通信的基础。

区块链出现之前,P2P技术已经取得了飞速发展,其最成熟的应用是文件的共享服务,这证明P2P技术可以实现高可靠性、高性能的数据同步,并且具备抗封锁能力。

区块链是由很多台运行区块链软件的计算机组成的网络系统,每台这样的计算机被称为节点。很多情况下,一个节点对应着一台真正的计算机,但也有可能多台计算机一起工作才构成一个节点——通常是为了让这个节点的计算能力更强。

区块链每个节点都独立地和其他节点进行通信,每个节点都会采用“存储—转发”策略来“收听”其他节点发送的内容,并且广播自己产生的信息或者转发收到的信息(见图1–4)。这种通信方式可以避免区块链网络依赖一些关键的中间节点,也可以防止少数节点被恶意操纵后对整个区块链网络产生影响。由于采用了P2P通信方式,区块链的“去中心化”特性比常见的互联网应用(如万维网服务)更强。

图1–4 客户端服务器架构与点对点架构的比较示意

P2P技术及其发展历程

P2P是一种分布式应用计算网络架构,可在地位对等的参与者之间划分任务或工作负载。参与节点在应用中享有同等的权利,平等参与,并形成点对点网络。网络节点将其部分资源(例如处理能力、磁盘存储或网络带宽)直接提供给其他参与者,而无须服务器或稳定主机的集中协调。与传统的客户端服务器模型(其中资源消费和供给相分离)相反,这些节点既是网络资源的供应者,又是消费者。

P2P在隐私性要求高的网络中和文件共享领域得到了广泛的应用。P2P这一概念最早出现在1969年4月7日的第一份RFC(Request For Comments,即征求意见)文档中,RFC是互联网工程任务组(Internet Engineering Task Force,缩写为IETF)发布的一系列备忘录,后来演变为用来记录互联网规范、协议、过程等的标准文件。

1999年:P2P音乐共享服务Napster上线

1999年,18岁的肖恩·范宁与19岁的肖恩·帕克上线发布P2P音乐共享服务Napster,首次把P2P技术变成为广大消费者接受并喜欢的主流,是互联网文件下载共享方式的一次变革。

2001年:BitTorrent(比特流)协议

2001年4月,布拉姆·科恩发布了BitTorrent协议,并在7月正式应用。BitTorrent协议是架构于TCP/IP协议(传输控制协议/网际协议)之上的一个P2P文件传输通信协议。它把文件虚拟分成大小相等的块,并把每个块的索引信息和哈希验证码写入种子文件。下载者根据种子文件告知对方自己已有的块,然后交换没有的数据。使用BitTorrent协议,下载的人越多,提供的带宽越多,下载速度也就越快;同时,拥有完整文件的用户也会越来越多,文件的“寿命”会不断延长。

2002年:Kademlia协议

2002年,彼塔·梅耶蒙科夫与戴维·马兹埃瑞斯提出了第三代P2P网络的节点动态管理和路由协议Kademlia,通过分布式哈希表实现信息的存储和检索。

相比之前的两代协议,Kademlia以全局唯一ID(身份标识)标记P2P网络节点,以节点ID异或(XOR)值度量节点之间距离,并通过距离分割子树构建路由表,建立起一种全新的网络拓扑结构,相比其他算法更加简单和高效。

2005年,BitTtorrent实现基于Kademlia协议的分布式哈希表技术,eMule也实现了基于Kademlia的类似技术。以太坊使用Kademlia作为分布式网络的底层算法。

2009年:比特币协议

2009年1月,比特币网络上线,发布了第一个开源的比特币客户端软件。这是P2P技术首次应用于加密数字货币,也成为区块链最重要的基础技术之一。

公开可验证的数据

区块链的节点都是可见的。对于比特币、以太坊这种典型的公链而言,链上的任何数据都是完全公开的,也就是一旦数据上链,那么全世界任何人都可以看到,而且区块链上的数据是难以删除或修改的,因此一旦数据在区块链之上发布就成为公开的信息。

区块链上的数据普遍使用了一些常用的加密和签名算法来保证数据的正确性和一致性,因此在每个区块链节点上都可以立即验证链上数据的正确性。事实上,这些节点在维护其数据时,总是通过这些算法随时独立地校验数据,不会盲从任何第三方。

区块链如何进行数据的验证呢?这涉及两个重要的计算机密码学相关的技术:一是哈希算法哈希算法又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。哈希算法的特点是任何原始数据的小改动都会导致数字“指纹”的大变化,并且无法反向推导出原始数据的变化。,二是数字签名数字签名是一类用于快速验证的算法。每一个使用者有一对密钥:一把公钥和一把私钥。数字签名中,我们使用私钥生成签名,用公钥验证签名。技术。

在区块链里保存数据的时候,哈希算法被用在很多地方。例如,在每一“块”数据里都保留有这一块数据经过哈希计算的结果,因此只要把块内的数据按照相同的哈希算法计算一遍,再比较一下结果是否一致,就能知道这块数据是否正确。而区块链里每一块的数据还包含着前一块的哈希计算结果,并且把前一块的哈希计算结果用于自己这一块来计算哈希结果。这样一来,任何一点数据的变化都会牵一发而动全身。

区块链上保存的来自用户的数据都包含该用户的数字签名,数字签名的特点是可以迅速验证签名的正确性,而且篡改数据、伪造签名几乎都是不可能的。每个区块链的节点软件都会独立验证每条数据的签名是否吻合。

正因为区块链具有这种数据公开可验证的特点,把需要确保数据真实性、难以篡改、可以验证的信息用区块链实现是合乎情理的,这就是人们常说的“数据上链”。但数据上链通常并不是把数据本身放入区块链,而是把数据真实性和一致性的证明信息(例如数据的哈希验证码)或加密后的数据放在区块链上。

难以篡改的数据记录

经常有人强调区块链上的数据“不可篡改”。严格来讲,这并不正确,区块链上的记录并非不可篡改,而只是“难以篡改”。通过前述的区块链特点可见,区块链是一种分布式数据库,每个节点都有独立验证的能力,通过共识算法来保证各个节点数据一致。也就是说,要想“篡改”数据,首先得骗过每个节点的验证算法,这已经非常困难了,其次还得骗过整个区块链的共识机制,让所有的节点都跟着改变,这更是难上加难。

区块链之所以被称为“区块链”,就是因为其在组织数据记录时采用“区块”的方式来保持一大块数据,并且把这些分成块的数据用类似链表的方式按次序连接起来(见图1–5)。这是在比特币的实现之中最先出现的,并且一直为现在大部分区块链设计所沿用。近年来也出现了少数不同方式的数据组织技术,如有向无环图(见图1–6),但绝大多数区块链至今仍在采用“区块”+“链”的方式组织数据。

在区块链里,通常每条数据记录被称为“交易”(transaction)。这是沿袭比特币的称呼,比特币上的数据基本就是和转账记录类似的交易信息。直到现在,很多区块链里的数据记录仍然是这些交易信息,但也出现了一些其他的应用需求,使得这些数据记录其实并不是“交易”(例如智能合约代码)。关系型数据库中也有transaction这一名词,不过含义与上述完全不同,在中文翻译里,与关系型数据库相关的transaction多被翻译为“事务”。读者需要记住这两个是完全不同的概念,千万不要混淆。

注:这是一种最常见的计算机数据结构。它从一个节点内的指向信息,就可以知道下一个节点或者上一个节点在哪里。这样一个节点连着一个节点,就像一根链条,所以被称为链表。

图1–5 链表

注:在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则为有向无环图。

图1–6 有向无环图

区块链是个“不支持删除操作”的数据库,区块链的数据只会不断增加,不会被删除。由于这些特点,区块链比较适用于非常重要、需要留下“审计记录”的场合。例如,对关键敏感信息的访问记录或对保密资料的任何访问意图和使用记录,如果采用区块链技术来进行,就能有效对访问行为进行审计分析(因为一旦这些记录被记入区块链就难以被修改或删除)。

区块链的数据虽然难以被篡改,但并不意味着“不可篡改”或“数据永不丢失”。一般而言,区块链的节点越多、越分散,数据被篡改或完全被破坏的难度就越大,这是比较容易理解的。这也是大家提到区块链就会想起“去中心化”的一个重要原因,在一个去中心化程度非常高的区块链上,要篡改或破坏数据是极其困难的。但是,如果区块链的网络节点非常少(比如一个测试性的区块链可能只在一个节点运行),或者如果全部或大部分节点控制在少数人手里,那么篡改或完全破坏数据是能够做到的。

智能合约:链上的“代码逻辑”

区块链这个分布式数据库里保存的是数据,而实际上从第一个区块链比特币开始,这些数据里就包含了“代码逻辑”:比特币脚本。由于比特币脚本属于一个功能特定的脚本语言,并且被设计成无状态的特点,算不上是完整的“程序”,因此在比特币出现后很长一段时间里没人认为它是智能合约,但比特币脚本实际上是一种区块链智能合约的雏形。

以太坊是第一个引入更复杂的代码逻辑的区块链,并且沿用了尼克·绍博发明的词汇“智能合约”http://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/smart_contracts_2.html.,在极客社区广受认可。但从实践角度而言,它在相当程度上“误导”了大众——以太坊的智能合约既不具备我们常说的“智能”(人工智能、自动化逻辑等),也不太符合大众理解的“合约”(合同、法律条款),而只是一种新的结合了区块链的计算模型,配合了一个图灵完备图灵完备指计算能力和通用图灵机相当。通用图灵机的概念很简单,但这是现代编程语言所能拥有的最高计算能力。的虚拟机和一种新的程序设计语言。我们会在后面的章节展开来讲智能合约以及大家对它存在的常见认知误区。

智能合约、图灵机、虚拟机

1995年,计算机科学家、法学家及密码学家尼克·绍博在其论文《智能合约:数字化市场的构建模块》中提出了“智能合约”概念。智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议,其基本理念是把合约条款嵌入硬件和软件中。以太坊实现了智能合约这一想法。

图灵机是英国数学家阿兰·图灵在1936年提出的为了研究可计算问题而构思的抽象计算模型——将传统的使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人进行无数次的数学运算。这个虚拟的机器就是图灵机,也就是现代计算机的雏形。

虚拟机是一种特殊的架构软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于虚拟机这个软件所创建的环境来操作其他软件。虚拟机是计算机系统的仿真器,通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。

把“程序逻辑”放在区块链上,就使得这些代码逻辑如同链上数据一般公开可验证。也许有人问,如果代码开源不是也可以做到公开吗?是的,开源的代码是公开的,但并不能做到可验证。虽然你能看到项目的源代码,但不能保证真正执行的就是源代码对应的程序。以太坊的设计中实现了一个以太坊虚拟机(Ethereum Virtual Machine,缩写为EVM),这些虚拟机包含在所有的以太坊节点软件里作为其一部分。智能合约需要执行的时候,相当于每个以太坊的节点都独立地执行这些代码。

开源软件

开源软件又称开放源代码软件,是一种源代码可以被任意获取的计算机软件,这种软件的著作权人在软件协议的规定之下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。开源软件同时也是一种软件发行模式。一般的软件仅可获取已经过编译的二进制可执行档,通常只有软件的作者或著作权人等拥有程序的源代码。

以太坊智能合约的设计、实现和采用链节点内置专用虚拟机的执行模型只是代表智能合约的一种实现方法,并不是所有区块链都应该采用相同的实现方法。以太坊成功后,大量追随者都采用与以太坊完全一致的设计模式,此类设计在业内极为流行,但还是有不少知名区块链技术采用不同的设计和实现:Hyperledger Fabric支持的链上代码(Chaincode)可以被视为类似以太坊的智能合约,但其设计与实现跟以太坊的方式大相径庭;ArcBlock的区块链平台选择了采用链节点和智能合约运行环境统一在Erlang虚拟机BEAM上的策略;2019年6月,Libra一亮相旋即引起争议,其智能合约设计https://developers.libra.org/docs/move-paper.虽与以太坊的设计有显著不同,却也有几分类似。

智能合约可能是目前区块链技术给人的遐想空间最大,却也是人们存在误解最多的概念。为此,我们在本书第二部分会专门针对智能合约和区块链虚拟机介绍相关细节,并分析一些常见误解。

自主账户体系

如果你使用过比特币或以太坊这些区块链,可能最容易产生的第一个疑惑就是:区块链上的“账户”是没有人给你“分配”的。这和过去大家熟悉的各种互联网服务迥然不同——无论是传统的互联网服务,还是更传统的银行、证券公司等,用户需要对方提供服务时,首先要做的就是在其平台上申请和开通账户。为什么这些区块链里面是有价值的数字货币,却不需要事先开设账户?

我们回过头考察一下,所谓传统的账户,一般为某个机构在自己的记账系统中给用户分配一个标示属于该用户的且受机构规范的分账记录序列,也就是用户的相关记录首先得在这些机构的规范记账系统下的子账户里。而自主账户体系的设计,相对于之前的互联网账户是一个巨大的升级。

所谓自主账户,是指账户不是由其他人分配的,而是用户自我产生、自我申明的。自主账户体系能够实现,得益于现代计算机密码学,用户只需要按照一个算法执行一下,就可以获得自己独特的、安全的账户。自主账户体系的进一步发展和延伸,也许是区块链应用除了数字货币以外的又一个重要领域——去中心化身份。去中心化身份将成为未来区块链应用的一个重要基础,甚至会成为下一个区块链应用时代到来的标志,我们会在第4章专门介绍。

其实,自主账户体系更像是计算机系统产生之前的社会,我们每个人生而为人并不需要其他人和机构来证明。在现代文明社会,每个人的权利无须其他任何人赋予,因为人作为个体,其身份是自主的,也就是我们不需要任何其他人或者机构的“证明”、“认证”或“承认”,我们就是一个独立的个体。想象一下在现实生活中,比如在商场使用现金购物时,我们不需要开户,不需要给店家提供各种个人注册信息,不需要认证身份,只需“一手交钱”,店家必然“一手交货”。区块链技术的自主账户让个体和个体之间的数字资产交换转移回归到最初的阶段。

值得一提的是,虽然采用自主账户体系是目前区块链设计的主流,但也有少数区块链项目并没有采用这样的体系(例如EOS及其各种分叉项目),而是采用类似互联网那种需要申请账户的设计,这究竟是为照顾用户习惯的折中主义还是一种退步,尚难有定论。

区块链并不是真正匿名的

区块链普遍采用的自主账户地址往往是一长串我们人类难以识别的字符或数字,因此不少人会误认为区块链是匿名的。但大部分区块链并不实现真正的匿名,包括区块链的鼻祖比特币在内。除了少数专注于隐私需求的区块链技术之外,大部分区块链上的数据完全是公开的,也就是人们可以清晰地知道每笔交易的相关账户,如果是一笔转账,那么转账金额和交易账户都清清楚楚,虽然有可能不知道账户的户主是谁,但这个账户在区块链上的一举一动完全大白于天下,而且一旦公开几乎不可能被抹去(见图1–7)。相比之下,互联网业务数据往往不是完全公开的。虽然互联网服务常常搜集各种用户数据,但一般只有其内部才有访问的能力和权限,出现隐私泄露问题通常是因为某些互联网企业出售了含有用户隐私的数据,或者出现了数据泄露(可能来自外部黑客攻击,也可能来自其内部的数据滥用或盗用)。

区块链之所以似乎能保护用户隐私,原因在于区块链的账户及其对应的真实用户身份在区块链上不存在对应关系。正如前文所述,自主账户不需要向任何人或机构申请,因此用户在使用这些自主账户的时候,没有任何信息能把这些账户和真实世界的个人信息关联起来。另外,区块链采用P2P通信方式,很难在链本身的记录里发现使用者的网络IP地址等传统的互联网用户定位信息。从这个角度而言,区块链的匿名性的确比互联网应用要更好一些,因为区块链上虽然交易信息全公开,但毕竟没有任何敏感的个人信息,自然不存在隐私泄露的问题。因此,在比特币及其分叉币出现后的相当长时间里,数字货币的这种“匿名性”和“隐私性”一度成为地下交易、暗网、跨境洗钱的利器。

注:2010年5月22日,拉斯洛·豪涅茨用1万枚比特币购买了两个比萨饼,图中为通过他的地址向外展开4层看到的所有的关联地址和交易。该图使用谷歌提供的BigQuery谷歌的BigQuery工具中包含了比特币的全部数据,可供各种分析。生成。

图1–7 用比特币购买比萨的交易踪迹

由于区块链数据的公开性,采用大数据分析的方法可以很容易发现各个账户之间的关系,账户的一举一动都完全暴露在各种分析决策工具之下,由于区块链的历史数据也是公开的,因此可以在新的行为发生后倒推历史行为和关联的操作,反之亦然。通过大数据分析技术,还可以发现各种交易的典型特征,包括一些企图迷惑侦查的行为。由于现实中的大部分数字货币交易所现在都已经有“了解你的客户”(Know Your Customer,缩写为KYC)和“反洗钱”(Anti-Money Laundering,缩写为AML)的要求,从交易所的用户数据就可以定位到用户,此外,执法机构的各种执法行动中也能锁定一些账户的真实背景。通过这两种方法的结合,往往可以对区块链上的交易做出非常精准的定位。

目前有部分区块链技术,例如Zcash、Mimblewimble等主打彻底的隐私匿名。尽管它们在技术上可以做到一定程度的匿名,但其存在和应用在法律和监管领域面临严峻挑战,其应用前景难以预料。

本书第四部分会介绍区块链数据分析这种应用方式,可以看到如何在实际应用中有效地掌握区块链上的一举一动。因此,读者需要知道区块链并非真正匿名,相反是完全公开透明的。