以比特币为代表的可编程货币的出现让区块链技术走进大众视野,随后,以以太坊为代表的智能合约平台的问世设置了区块链技术商用的起点。但与此同时,现有的区块链技术尚无法支撑大规模商业应用的搭建,主流的区块链平台存在瓶颈和问题,迫使更多的开发者持续探寻区块链技术边界及新型技术方案。
根据对区块链行业发展历史及现状的综合分析得出,限制区块链规模化应用的技术掣肘主要在四大部分:可扩展性、互操作性、隐私性及安全性。
可扩展性:突破现有区块链技术的性能瓶颈,提升区块链系统的吞吐量,以满足主流交易网络高并发的性能要求,主要是通过发展多样态共识、并行分片方案、二层网络方案及可验证计算来解决和改善。
互操作性:实现不同区块链间的互操作,构建高效的连接机制,主要是通过跨链机制打通“区块链孤岛”。
隐私性:区块链技术的应用需要保障交易数据、合约数据用等多个方面的安全和隐私保护,主要是通过假名、混币、环签名、Mimblewimble、零知识证明和可信计算解决。
安全性:保证区块链安全可靠运行,特别是在智能合约方面。
共识算法用于协调系统中节点的行为和保持数据一致性。在不可信环境中组建的分布式系统,由于节点自身的不可靠性和节点间通讯的不稳定性,甚至节点伪造信息进行恶意响应,节点之间容易存在数据状态不一致性的问题。通过共识算法,区块链协调多个互不信任的节点的行为和状态,由此在不可信环境中组建一个可靠的系统。
共识算法是基于节点行为假设、治理模型和节点网络规模假设的系统实现。本质上,链上业务的特性和网络节点角色的定位决定了共识算法的选择。随着节点参与角色的多样化和业务交互特点的细分,出现了不同的网络假设和治理模型,如何成为可以真正实现的公有链项目,是共识的探索方向。这个方向催生了共识算法在共识顺序、共识轮次、终局性和节点选择方式等方向的差异,形成多样态发展的态势。区块链共识机制的演变也印证了这一点。
在区块链发展初期,主流区块链网络多用基于 PoW(proof of work)的共识算法。由于 PoW 存在资源浪费问题,2017 年后基于 PoS(proof of stake)的共识算法研究得到了迅猛的发展。单一共识算法均具有自身局限性,例如 PoW 共识效率低,DPoS 去中心化程度较低等,区块链研究者尝试将两种或者多种共识算法融合起来,取长补短,来达到更好的共识特性。新一代的共识算法,比如 Algorand、DFINITY、VBFT 等都属于混合共识算法。
区块链采用共识算法解决分布式系统多个节点间状态一致性的问题。区块链系统中每个节点全量处理所有交易,单纯增加节点并不能提升区块链的性能(TPS),反而节点之间达成共识的过程对性能是一个损耗。
直接增加节点并不能提升区块链的 TPS,因为区块链上的交易没有负载分发机制,需要所有节点全量处理所有交易,无法并行处理。区块链的分片就是试图让链并行起来,将链分为多个分片链,然后通过一种负载分发机制,把交易分配给不同的分片执行,每个分片链独立运行,有独立的共识机制,通过并行的方案支撑比较强的水平扩展和按需扩展。分片技术的实现将为区块链各项事务活动的开展带来更高的协作效率与更加可信的生产方式。这种方案的难点在于跨分片的交易确认以及分片链的安全性保证。
因此,如何把分片的理论和区块链的安全理论,包括密码经济学设计、激励机制设计,这些融合在一起来实现一个安全可扩展,而且高性能的区块链是一系列的非常大的挑战。分片技术包含网络分片、交易分片和状态分片:
网络分片:要求分片的消息只在分片内部网络中传播;
交易分片:指不同交易将只在不同的分片中运行,每个分片运行独立的共识算法;
状态分片:要求分片只需要维护分片内部的状态数据而不需要保存其它分片的数据。
随着业务对区块链扩展性的需求量逐渐增大,公有链项目方对于分片有不同程度的尝试,不同的分片技术可以实现存储,通信,计算等不同层面的扩展。可以看到,分片相关的理论和工程化成果稳步发展。
区块链二层网络(Layer2)技术旨在解决区块链扩容问题。区块链本身的容量是受限的,仅靠提高吞吐量很难满足所有的应用需求。
实际情况中,不是所有的交易都要在全球范围内达成共识,可以把部分交易以及合约执行只在所需范围内进行共识,以实现扩容的目标。广义的二层网络,包含了侧链,状态通道等各种将区块链的交易从链上迁移到链下(也可能是别的共识范围更小的链)的技术方案。二层网络设计中,脱离的链上共识的交易与合约如何与链上的共识挂接,保证交易和合约的合法性及安全性是需要解决的问题。
具体来讲,二层网络需要解决三类问题:
证明问题:链上没有全量数据的情况下,链下的交易最终如何给链上提交证明。
裁决和惩罚问题:裁决和执行如何进行以产生链下约束力。
监督问题:链下状态的监督。
在区块链系统中,用户希望自己的身份、资产状况、交易历史等信息都被尽可能少的人知道。一个完美的隐私性的支付系统中,每笔交易的信息都仅被参与这笔交易的双方知道。作为一个所有交易都要被公开和全网验证的系统,公有链在设计之初就应该考虑隐私性的需求。
比特币采用的方案是使用可以任意选取的、和真实身份的无关的公钥地址来作为持有资产和参与交易的主体,并通过地址对应的公钥和数字签名来验证对链上资产的所有权。
比特币实现了一个用户使用“假名”的支付系统,用户的真实身可信区块链推进计划 20 份被隐藏在公钥地址背后。类似的方式也被使用在其他很多公有链项目的设计中,在公有链发展的早期也较好地满足了当时人们对于隐私性的需求。
混币方案让多个用户共同创建交易来变更其代币的所有权,通过混淆发送者和接受者之间的对应关系来增强用户的匿名性。以下图为例,如果没有采用混币,则很容易看到 Alice 付了 8 个 BTC 给 Carol,Bob 付了 15 个 BTC 给 Ted,结合其他交易信息进行交叉分析就很容易发现这些用户的真实身份;而进行混币以后就只能看到{Alice, Bob}向{Carol, Ted}发送了比特币,但是无法精确判断发送者和接受者的对应关系。
通过不同的用户间多次重复混币操作,最终就会把可能的发送者和接受者集合都变得很大,从而保护其中每个人的匿名性。
机密交易是由 Adam Back 和 Greg Maxwell 在 2013 年提出的增强比特币隐私性的提案,可以实现对于交易金额和账户余额隐私性的保护,即其他人虽然可以看到 Alice 发送了一些代币给 Bob,但是无法知道具体发送了多少。
机密交易的核心思想是用一种称为 Pedersen Commitment 的承诺方案代替以(哈希地址,金额)的方式存储每一笔交易的输出,然后用同态加密的方式验证每笔交易中发送的总金额和接收的总金额是平衡的。在矿工看来,只需要对着输入输出的同态加密密文做一些线性运算就能验证一笔交易的金额是合法的了,整个过程中无需把交易金额暴露给矿工。机密交易它提供了一种简单高效的隐藏交易金额的方法,在以后的很多隐私保护方案中都被作为组件使用。
混币方案最大的缺陷就在于当参与人数不够多的时候能提供的隐私性保护非常有限。环形签名方案就是让其他用户在不知情的情况下“被动地”参与到混币中来,达到隐私保护的目的。简单来说,环签名技术允许一个用户列表中的任何一个用户都能独自生成一个合法的签名,且不同的用户生成的签名看上去是一样的。
进行交易时就只能验证一笔交易的所有发送者中的某一个许可了这笔交易,而无法精确判断具体是哪个发送者签名的,因此也无法判断交易真实的发送者。
另外,为了保护交易接收方的隐私,还可采用了潜行地址的技术。潜行地址技术允许发送方根据接收方公开的信息生成一个一次性的公钥地址,这个地址依然由接收方通过私钥控制,但是其他人无法从这个一次性地址关联到接收方的身份。通过环签名加上潜行地址的方式,对交易不可关联性方面的表现至少等同于多名用户参与的混币交易。而且由于协议强制要求每笔交易必须选择多个输入进行环签名,所以其实际上隐私性要高于只有少部分有需求的用户使用的比特币混币方案。
Mimblewimble 方案的所有交易都以机密交易的方式进行,并且强制采用了区块级的混币和交易裁剪技术,因此它能够提供比单纯使用机密交易或者混币都更好的安全性。按照 Mimblewimble 协议,矿工会把每个区块中所有的交易混合成一笔交易,从而隐藏发送者和输出者之间的关联性。更进一步地,矿工们会从交易历史中删去已经被花掉的交易输出,只保留尚未被使用的交易输出(UTXO)。因此,其他人就很难再对历史交易进行关联性分析了。最好的情况下,一个新加入的节点相当于只能看到从 coinbase 到 UTXO 转账的一笔交易,除此以外得不到任何信息——UTXO 中每笔输入的金额都是隐藏的。
零知识证明技术允许证明者在不告诉验证者任何关于 x 的具体信息的情况下,让验证者相信证明者是确实知道 x 的值的。原始版本的零知识证明技术是基于交互式证明设计的,并不适合直接用到区块链上。
适合区块链使用的零知识可信区块链推进计划 22 证明必须满足两个条件:非交互性,即证明者只生成一个证明,此后便可由不同的验证者分别验证证明的正确性;易验证性,即验证一个证明所花费的计算资源非常低。此外,为了节约宝贵的链上共识数据吞吐量,最好这个证明的长度也尽可能简短。
利用密码学技术在比特币上实现隐私保护功能吸引了很多密码学家进行研究。2012 年 Bitansky 等首次提出了“零知识的简短非交互式证据”(zk-SNARK for zero-knowledge succinct non-interactive argument of knowledge)的概念, 其中简短和非交互两点即为在区块链上应用所必须的特点。“证据”是指这种方式在原理上是存在伪证的可能性的,只不过因为找到一个伪证需要天文数字的计算量,所以作为证据还是很有说服力的——毕竟如果攻击者可以完成那么大的计算量的话,任何加密算法都会被破解,也就无所谓伪证了。
零知识证明技术具有非常巨大的潜力。
首先,零知识证明是一种通用的证明技术,可以证明任何计算的正确性,这与只能证明转账交易合法性的机密交易技术有着本质区别。因此,零知识证明技术可以解决更复杂的系统中的隐私保护问题。
其次,零知识证明技术的另一个优点是明确地区分了计算和验证,使得验证的成本可以比计算低很多。这使得在区块链上以较低成本进行复杂运算成为了可能——这对于现有公有链是难以想象的,因为在这些公有链上验证一个状态的正确因为在这些公有链上验证一个状态的正确性需要所有节点重复执行一遍整个计算过程,效率自然非常低。
最后,零知识证明技术还可以用于压缩交易历史,让节点在无需存储所有历史交易的情况下依然保持几乎相同的安全性。这点对于一个高吞吐量的公有链项目尤为重要。
在区块链的应用场景下,可信计算的目标主要有两个:一是数据隐私保护,即除了指定的计算任务外,用户的数据不应当被擅自挪作他用;二是可验证计算,这是对于计算过程的真实性和完整性的保护,使得用户不需要重复执行运算即可验证计算结果是否正确。目前用于实现可信计算的技术主要有基于硬件安全的可信执行环境(Trusted Execution Enclave,TEE)和基于密码学的全同态加密技术(Fully Homomorphic Encryption, FHE)等。
可信执行环境的基本原理是给每个支持 TEE 功能的芯片分配一对公钥和私钥,公钥与芯片序列号一起公开,私钥存储在 TEE 内部。需要进行安全计算时,用户首先与 TEE 通信建立一个临时性的会话密钥,然后把输入数据用会话密钥加密后发送给 TEE 在受保护的独立的区域内将输入数据解密后完成计算,最后用会话密钥把计算结果加密返回给用户。为了验证计算的正确性和完整性,通常计算结果中还会包括关于计算任务的快照以及使用 TEE 私钥做出的签名。
可信执行环境的逻辑在于整个计算过程中输入和计算结果只在用户端和 TEE 内部以明文的方式出现。只要不暴露 TEE 内部信息,即使可以完全控制服务器的操作系统也无法窥探或篡改计算结果。对芯片直接进行测量的难度极高,大大提升攻击难度。
TEE 技术的主要优势在于计算的成本较低。对于区块链来说,TEE 技术可以大幅度降低验证智能合约执行的成本,彻底改变链上所有运算都要被所有全节点分别执行一遍的现状,突破单点的硬件性能对于区块链吞吐量的限制。目前 TEE 技术已有一些商用产品,例如英特尔(Intel)2015 年推出了采用 SGX (Software Guard Extensions)技术的处理器,近两年也有一些区块链项目支持用 SGX 验证智能合约等复杂计算的运行结果。
TEE 的主要缺点有两个:首先,每个 TEE 芯片初始的密钥必然是由芯片制造厂商产生和分配的,因而芯片厂商是一个必须信任的中心化节点;其次, TEE 芯片虽然通过独立封装硬件的方式将其与服务器中的其他程序隔离开来,但是仍然可以通过旁路攻击的方式间接地获得芯片内部运行状况的信息。例如 2018 年 3 月份,美国俄亥俄州立大学的一个研究小组展示了一种名为“Sgx Spectre”的新型攻击技术,可以通过观察多次重复执行中缓存区大小的细微变化实现从 SGX 中提取数据的效果。
加密算法的同态性指的是对于密文信息进行一些运算后,得到的新的密文与原密文所对应的明文有某种可以预测的对应关系。例如加密算法 Enc 满足对于任意的 x 和 y,Enc(x)+Enc(y)=Enc(x+y),就可以说 Enc 对于加法具有同态性。常见的如 RSA 加密算法和椭圆曲线群都是关于加法同态的。全同态加密对于加密算法的结构性要求则更高一些:对于任意函数 f,都可以通过在关于 x 的密 文 上 进 行 一 系 列 操 作 得 到 一 个 新 的 对 应 于 f(x) 的 密 文 , 即 Eval(f,Enc(x))=Enc(f(x))。全同态加密对密文进行的运算的整个过程中不会用到解密密钥,因而其作为加密算法的安全性可以保证不会泄露任何关于输入 x 或者计算结果 f(x) 的信息。
全同态加密算法可以很好地解决数据隐私保护的问题,在有可信的安全设置(trusted setup)的前提下也可以实现可验证计算,是一种应用前景非常广阔的通用技术。目前限制同态和全同态加密算法广泛应用的主要瓶颈在于其过低的执行效率20。提高效率是现在全同态加密算法研究的核心方向,但是如果要获得大幅度改进需要理论密码学上的重大突破。
跨链互通需求日益凸显跨链技术的核心在于让不同的区块链能跨越彼此的障碍,从而在数据和价值的层面进行相互流通。跨链技术的本质是为了解决不同区块链之间的互通性。而这种互通性正是目前区块链在场景落地中碰到了一个非常核心的难题,不管是公有链还是联盟链,跨链技术都是实现价值互联网的关键,也是避免目前各个不同的区块链分别发展,导致数据孤岛的唯一途径。在具体的实现层面,由于跨链技术实现了多条区块链之间的逻辑关联,所以在很多应用场景中,跨链技术也会被应用到拓展区块链事务处理能力方面。
智能合约是一种旨在以信息化方式传播、验证或执行的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约的出现使得区块链的扩展性和便捷性获得极大的提升,但图灵完备的合约也带来了更多的安全风险。2016 年 6 月 17 日,当时区块链业界最大的众筹项目 The DAO(被攻击前拥有1.5亿美元左右资产,约占当时发行的以太币总量的14%) 遭到攻击,并导致 360 万的以太币资产被分离出 The DAO 资产池(当时价值约为 5000 万美元)。
该次攻击事件直接导致了以太坊硬分叉为 ETH 和 ETC。2017 年 11 月 7 日 Parity 多重签名合约漏洞导致 93 万个以太币(当时价值约 150 亿美元)永久丢失。相关数据显示,2018 年整个区块链行业因为安全问题导致损失金额超过 20 亿美元。针对区块链行业发起的所有攻击中,交易所和智能合约是最受可信区块链推进计划攻击者关注的攻击点。
目前,智能合约安全问题的主要有以下四个方面:
整型溢出:以太坊的合约虚拟机(EVM)为整数指定固定大小的数据类型。这意味着一个整型变量只能有一定范围的数字表示。在智能合约开发中,如果没有检查用户输入就直接执行计算,可能导致数字超出存储它们的数据类型所允许的范围,该变量就很有可能被用来组织攻击。
重入:以太坊的智能合约能够接收和发送以太币。调用外部合约或将以太币发送到合约地址的操作需要合约提交外部调用。这些外部调用可能被攻击者劫持,迫使合约执行进一步的代码(即通过回退函数),包括回调自身,因此代码执行"重新进入"合约。
随机数:由于大多数区块链平台本身不提供随机数生成接口,智能合约只能自己实现随机数生成算法,如果智能合约本身生成的随机数算法不当,可能导致随机数被提前预测、或者可被篡改。
越权调用:由于公有链的开放性,任何地址都可以与区块链上的智能合约进行交互,如果智能合约的函数中未做权限限制,那么任何地址都可以成功调用此函数,如果该函数为敏感函数,智能合约可能会因此遭受攻击,造成合约控制权限丢失或者直接导致资产损失。
逃逸漏洞:虚拟机在运行字节码的时候会提供一个沙箱环境,一般用户只能在沙箱的限制中执行相应的代码,此类型漏洞会使得攻击者退出沙箱环境,执行其他本不能执行的代码。
逻辑漏洞:虚拟机在发现数据或代码不符合规范时,可能会对数据做一些“容错处理”,这就导致可能会出现一些逻辑问题,最典型的是“以太坊短地址攻击”。
堆栈溢出漏洞:攻击者可通过编写恶意代码让虚拟机去解析执行,最终导致栈的深度超过虚拟机允许的最大深度,或不断占用系统内存导致内存溢出。此种攻击可引发多种威胁,最严重的是造成命令执行漏洞。
资源滥用漏洞:攻击者可以在虚拟机上部署一份恶意代码,消耗系统的网络资源、存储资源、计算资源、内存资源。所以在虚拟机中必须要有相应的限制机制来防止系统的资源被滥用。在以太坊中采用的是 gas 机制,攻击者想要在以太坊虚拟机上进行操作,需要支付 gas。
来源:可信区块链推进计划