区块链技术概念由2008年化名为Satoshi Nakamoto 的学者所发表的一篇名为Bitcoin: A Peer-toPeer Electronic Cash System的论文所提出。比特币是第一个广泛使用的数字加密货币,以比特币为代表的数字加密货币引起了社会各界的广泛关注。区块链技术作为比特币底层的基础架构与分布式计算范式也被认为是继大型机、个人计算机、互联网、移动通信和社交媒体之后的第5次颠覆式创新,并被 Gartner 列为未来10大技术发展趋势之一。
「 1. 实现可信数据管理——区块链 」
传统数据库主要通过C-S模型管理数据,这种统一管理数据的模型已经陪伴我们走过了几十个年头,带来的贡献毋庸置疑,但是在这个数据量爆炸、个体追求数据隐私的时代,这种数据管理带来的一些问题需要我们重新审视:一方面,如果服务器受到黑客攻击,就可能造成服务器端的数据泄露,这严重损害了个人隐私;另一方面,如果这个服务器本身是不可信的,即服务器运营商可能窃用一些敏感数据进行数据挖掘等操作,也同样会损害用户的个人利益。综合起来,C-S模式无法保证可信性。而近年来走入大众视野的区块链就可以解决这个问题,使用区块链实现可信数据管理是一个不错的选择。
首先,区块链是存储可信的。区块链摒弃了传统C-S模式,它采用了分布式数据管理,可以防止单点故障导致数据丢失的问题;其次,区块链是处理可信的。区块链通过智能合约等机制实现了数据的可溯源,赋予了数据不可篡改的特性,进一步保证用户的数据安全;最后,区块链是安全可信的。区块链采用非对称加密的方法,这比常用的对称加密方法的安全级别要高,可以更有效地保护数据安全。
1)区块链技术的特征
(1)去中心化:区块链技术不依赖可信的第三方机构,基于分布式系统结构,采用数学方法实现数据的验证、存储、维护和传输等过程。去中心化是区块链最本质的特征。
(2)不可篡改:区块链技术应用了分布式存储、加密技术、共识机制等保障了数据安全,有效地防止数据被篡改。
(3)可追溯:区块链技术采用链式区块结构存储数据,有极强的可验证性和可追溯性。
(4)安全可信:区块链技术采用非对称加密技术既实现了数据的透明公开性,也实现了对个人用户隐私的保护。
2)区块链体系结构与关键技术
区块链融合了多种现有的技术,利用分布式一致性算法维护数据,采用P2P(peer-to-peer)网络进行数据传输。从数据管理角度看,区块链本质上是一个构建在对等网络上、通过链式存储和加密技术提供了可信数据功能的数据库系统。
数据层中主要应用哈希函数、Merkle 树和非对称加密等技术,包括区块结构、链式结构和信息模型。如图2所示,区块结构包括区块头和区块体两部分。区块头封装了前一个区块的哈希值,当前区块的哈希值,共识过程产生的随机数、时间戳和Merkle树的根节点。区块体包括经过验证的有效的交易,并通过Merkle树的哈希过程产生唯一的根结点写入区块头。所有的区块依次相接,形成从创始块到当前区块的一条最长的链,称为主链。主链上记录了区块链数据的完整历史,能够提供数据的溯源和定位功能。
数据层中主要采用了以下4种技术:
(1)哈希函数。区块链采用将原始数据通过哈希函数编码为特定长度的字符串的方式保存数据。哈希函数具有单向性、定时性、定长性和随机性。比特币采用SHA256哈希函数,将任意长度的数据转换为长度为256位的二进制数字。SHA256哈希函数具有巨大的散列空间和抗碰撞的特性。
(2)Merkle树。Merkle树的作用是快速归纳和验证区块数据的完整性、安全性。Merkle树的运算过程是将数据进行分组哈希,将产生的哈希值插入Merkle树,不断递归直到产生最后一个根哈希值。Merkle树技术极大地提高了运行效率和可扩展性。
(3)非对称加密。在非对称加密技术中加密过程所使用密钥和解密过程所使用的密钥是不同的,分别称为私钥和公钥。公钥是公开的,而私钥一般是个人持有的。一个区块链账户由公钥和私钥组成。用户随机生成私钥,私钥经过椭圆曲线变换之后会生成一个由65个字符组成的数组,字符数组经过16进制处理之后得到公钥。用户使用私钥对消息进行签名,任何获取了用户公钥的用户都可以利用公钥来对消息进行验证。
(4)信息模型。信息模型是记录应用信息的逻辑结构,目前区块链系统采用的信息模型主要有 UTXO 模型、账户模型和键值对模型。
网络层封装了组网结构、传播机制和验证机制。区块链采用 P2P 网络,其结构可以分为无结构的网络、结构化网络和混合式网络。共识层包括共识机制和激励机制,是区块链系统中的核心组件。比特币采用了高度依赖算力的工作量证明PoW(proof-of-work)作为共识机制。随着区块链技术的发展,研究者提出了许多更节能的共识机制,如权益证明PoS(proof-of-stake),授权股份证明DPoS(delegated proof of stake)等。合约层封装了脚本代码和智能合约等,提供了区块链系统的可编程性,使得区块链系统能支持不同领域的应用。应用层包括区块链的诸多应用场景和实际案例,如智慧城市、边缘计算和人工智能等。
「 2. 保证数据来源——密码学 」
在制造业中属于同一产业链的各个企业,彼此间通常有着大量的数据需要交流沟通。固然信息化时代彼此通信已经十分方便,但企业间仍然有许多数据是十分珍贵的,当不信任已有的通信平台时,就需要技术手段来保障信息安全,而密码学就是专注研究这一领域的学科。同时密码学也是保证区块链安全的基石,在区块链的整个体系中大量使用了密码学算法,比如用于PoW的哈希算法,用于完整性验证的 Merkle Tree,用于交易签名与验证的数字签名算法,用于隐私保护的零知识证明等等。
其中最常用的也是最基础的技术——加解密算法,从设计理念上可以分为两大基本类型,如表1所示。简单来说,现代加解密系统的组件一般包括:加解密算法、加密密钥、解密密钥。在加解密系统中,加解密算法固定不变,并且一般公开可见;密钥则是最关键的信息,需要安全地保存起来,甚至通过特殊硬件进行保护。一般来说,对同一种算法,密钥需要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。根据加解密过程中所使用的密钥是否相同,算法可以分为对称加密和非对称加密(又称公钥加密)。两种模式适用于不同的需求,恰好形成互补。某些时候可以组合使用,形成混合加密机制。
「 3. 共享数据的可用不可见——隐私计算 」
传统的数据保密存在着许多不足,其中最重大的缺陷便是无法实现数据的可用不可见,彼此间共享数据的使用价值,但不知道数据的具体内容。这时就需要隐私计算技术,可以计算加密状态下的数据,且安全性和准确性有所保证。本文介绍三种隐私保护技术。
同态加密(homomorphic encryption)由Rivest等在20世纪70年代提出的,是基于数学难题的计算复杂性理论的密码学技术,指对同态加密后密文进行计算得到密文输出,将密文输出解密为明文输出,其结果与对未加密的原始数据进行相同计算得到的输出一致,这样便达到了在隐私数据上进行计算的效果。
2009年Gentry提出基于理想格的全同态加密方案,通过自举将部分同态加密转变为全同态加密,使全同态加密成为可能,但存在着计算复杂、实用性低等问题;在接下来的技术研究革新中,BGV用模交换技术来代替自举过程,BFV通过缩放技术代替模交换,最新则有能支持浮点数近似运算的CKKS方案出现。经过几代人的努力,全同态加密在软硬件实现上都有所突破:软件方面,IBM实现的HElib和美国国防部高级研究计划局资助的PALISADE等软件库,支持BGV、BFV、CKKS和FHEW等全同态加密方案,并通过多线程、SIMD与高效数学算法来进行软件层次的优化;硬件加速上,许多研究团队通过设计数学计算最优的硬件加速器,用FPGA加速基于RLWE的BGV、BFV算法,同时也有发挥GPU并行能力的CUDA同态加密库cuHE出现。近年来,人们在软硬协同上寻求有所突破,不少学者使用GPU、FPGA对全同态加密计算过程进行加速,美国国防高级研究计划局则计划设计出支持大字长运算的专用化芯片将同态加密技术应用到国防及商业领域。
2)安全多方计算
姚期智先生于1982年通过提出和解答百万富翁问题而创立的安全多方计算技术(MPC)也是隐私计算技术中重要的一部分:多个互不信任的参与方之间进行协同计算,满足如下特性:
(1)隐私性——MPC协议执行过程中,攻击者无法推断出任何有关私有输入数据的信息(可从计算结果推断出的信息除外)。
(2)正确性——诚实参与方不会计算得到错误的结果。
具体到使用技术上,目前主流两方安全计算框架的核心用了加密电路和不经意传输这两种密码学技术:一方将计算逻辑转化为布尔电路,针对电路中每个门进行加密处理。接下来,该参与方将加密电路(即计算逻辑)和加密后的标签输入给下一个参与方。另一方作为接收方,通过不经意传输按照输入选取标签,对加密电路解密进行解密获取计算结果。而通用的多方安全计算框架可以让多方安全地计算任意函数或一类函数的结果,诸如 BMR、GMW、BGW、SPDZ等,这些多方安全计算框架涉及到加密电路、秘密分享、不经意传输等相关技术。
3)零知识证明
多方计算技术包含一种在区块链中使用较多的技术——零知识证明。零知识证明的定义为:证明者(prover)能够在不向验证者(verifier)提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明具有以下重要的性质:
(1)完备性(completeness)。完备性是指如果证明者拥有知识,则可以通过验证者的验证。
(2)可靠性(soundness)。可靠性是指如果证明者没有拥有知识,则不能通过验证者的验证。
(3)零知识性(zero-knowledge)。零知识性是指证明者在证明过程中不会泄露其所拥有的知识,即验证者无法从证明信息中获得证明者所拥有的知识。
目前,实现零知识证明的主流开发库有Libsnark、Bellman、ZoKrates等。其中,libsnark基于C++语言开发,包装了零知识证明的核心,提供易于使用的编程接口,让开发者可以在不掌握算法细节的情况下进行开发。