毫无疑问,区块链技术拥有巨大的潜力。
分布式的交易、市场预测,以及资产管理平台只是区块链开发者正在开发的有趣应用中的几个。
2017年间,全行业筹集了数十亿美元的资金,并推动了区块链大幅度增值,实际上这是一件令人非常激动的事情。这些炒作都是真的。
不要误解我的意思。区块链的“炒作”帮它在主流用户间逐渐普及,对此我很喜欢。因此,当我说到“比特币”或者“以太坊”时,我看到的不再是人们迷茫的眼神。
然而这个故事还没有得到足够的重视:区块链几大技术上的障碍使得它还不能成为当今主流的应用。
我相信我们终将实现目标,但是作为开发者和投资者,我们也要现实一点。事实就是,去信任系统要想大规模成为主流应用还需要很多年。
其中的一些技术障碍包括:
有限的可扩展性
有限的隐私
缺乏正规的合约验证
存储的约束
不可持续的共识机制
缺乏管理和标准
工具不足
量子计算的威胁
......还有很多
在本文中,我将介绍这些技术障碍,并且分享几个克服这些障碍的解决方案。
作为开发人员,我认为把我们的部分注意力从闪闪发亮的众筹转移到真正技术挑战上是至关重要的。
注意:我不可能列出所有的问题和每一个解决方案,我只是列出了我最熟悉的。如果有些没有包含进来,请不要对我太苛刻。如果我看到并且认为它合适的话,我很乐意为你发布任何本文中遗漏的东西 :) …如果有什么错误,也请告诉我。
1. 有限的可扩展性
目前,所有公有链共识协议都有很大的局限性:网络中的每个全节点必须处理每个交易。
这是为什么呢?那么就请你回想一下,区块链从根本上来说是“去中心化”的,这意味着没有一个中心团体来保证系统的安全和运行维护。相反,网络中的每一个节点通过处理交易、维护一个整个系统的备份,来保证系统的安全。
虽然分布式的共识机制为我们提供了我们都关心的区块链核心利益:安全保障、政治中立和防审查等,但是这些都是以可扩展性为代价的,因为,根据定义,分布式把区块链可以处理的交易数量限制为了网络中全节点可以处理的交易的数量。
这里有两个隐藏的含义:
低吞吐量:区块链只能处理有限的交易数量
缓慢的交易处理时间:交易形成区块的时间缓慢。例如:比特币形成一个区块的时间是10分钟,以太坊形成一个区块的时间是14秒左右。在高峰期的时候,可能这些区块形成的时间更长。把这个时间和使用Square或Visa等服务时获得的即时确认比一比。
因此,公有链不得不在低交易吞吐量和高集中度之间进行权衡。
换句话说,随着区块链规模的增大,对于存储、带宽和网络中全节点算力的需求也随之增大。在某些情况下,它变得很笨重,只有少数节点具有处理区块的资源,这就导致了集中化的风险。
在那种情况下,我们做了个360度的全面转型,却回到了一个需要信任几个大公司的中心化系统。然而,我们想要的是加密货币最初承诺提供的,一个能够每秒处理数千次交易,并且具有相同的去中心化水平的系统。
扩展性方案
理想情况下,我们希望一个区块链的设计方案有着能和比特币或以太坊相似或更好的安全性,同时,在每个节点处理的交易量没有超过网络交易总量一定百分比的情况下,也能运行。换句话说,我们需要一种机制,在不丢失网络对于交易正确性权威性可信度的条件下,限制验证每个交易的节点的数量。这听起来可能比较简单,但是在技术上还是非常困难的。
可扩展性是将来平台成功的一个障碍。在区块链生态系统中现在有几个不同开发团队正在提出几种解决方案。我已经在之前的文章中全面的介绍过这个话题,如果你有兴趣的话,我建议你看看。有关当前解决方案的简要总结,请看下面:
线下支付通道
微支付网络通道背后的想法是把大部分的交易放到链下。它本质上是一种区块链交互机制,使原本在链上的交互转为链下。区块链只是用作结算层来处理一系列交易的总和——最终交易,这这有助于减轻底层区块链的负担。
这解决了我们上面讨论的吞吐量的问题,因为现在区块链可以扩展到更大体量的交易。而且,因为交易在支付渠道一经处理就已经产生,而不是等到他被包含到区块中的时候,因此微支付通道解决了交易速度的问题,消除了区块链上典型的延迟。
区块链生态系统中微支付通道网络的例子包括雷电网络和闪电网络。
分片
分片背后的概念是区块链整体的状态被分成不同的“片”,每一部分由网络中的不同节点进行存储和处理。每个分片只处理一小部分状态,分片之间并行处理。除了需要在分散的一组节点之间维护安全性和可靠性的难点之外,区块链分片与传统数据库领域的分区是类似的。
链下计算
除了范围比较大一点,链下计算和状态通道是类似的。它想法就是在链下执行计算(而不仅仅是链下代币的转移),如果在链上进行,并且安全可验证的话,代价是非常昂贵的。将计算和验证过程转移到链下单独的协议中,就能达到交易的高吞吐量。以太坊链下计算的一个例子就是 TrueBit。
DAGs(有向无环图)
DAG,有向无环图的缩写,是一个图形数据结构,由顶点和边组成。(顶点是图中的点,边是图中一个点到另一个点的路径。)DAG保证了没有环,即不可能从一个点开始沿着一系列的边在回到这个点。这使得我们能够沿着拓扑顺序获得一个节点(或顶点)序列。
-DAG-
以DAG为基础的协议(例如IOTA的Tangle)的前提,是将全局线性区块链排在一起,用DAG数据结构来维护系统的状态。 为了维护网络安全,这些协议依赖于他们自己的新方法,不要求每个节点都以线性方式处理每个交易。
另一种基于DAG的方法,例如SPECTER协议,用有向无环图(DAG)组织区块,并行挖DAG块,以实现更高的吞吐量和更快的交易处理时间。
我希望能够在将来的帖子中写下更多的基于DAG的方法。 现实情况是,这些协议还处于非常初级的阶段,尚未得到大规模的实施和使用。 坦率地说,他们有一些根本性的限制/弱点尚未解决,还不能被认为是可行的可扩展的方案。
想要了解有关这些可扩展性解决方案,以及其他方案的一些更详细的概述,我建议您阅读我之前写的有关可扩展性的帖子。
2. 有限的隐私
鉴于区块链交易不直接与您的身份挂钩,它们可能显得更私密。 世界上任何人都可以匿名创建一个新的钱包,并用它进行交易。
但是,这没有那么简单。
一方面,这项技术的巨大潜力确实是可以使用化名:虽然交易在公共账本中记录和存储,但是它们与一个仅由数字和字母组成的账户地址相关联。 由于这个地址没有真实世界的身份,交易的创建人似乎是无法跟踪的。
然而,这种整体安全的表象是误导性的。 只要化名不与个人连接在一起,一个人就可以一直保护自己的隐私,但只要有人连接起来,这个秘密就暴露了。 一个例子是,当执法机构承认他们能够在调查过程中识别特定的比特币用户时,于是,对他们进行”去匿名化”,违背了区块链所有交易不可见的总体前提。
这是怎么做到的呢?
商家网站上的网络跟踪器和cooky使得交易信非常容易的息泄漏到网上,任何人(包括政府,执法机构和恶意用户)都可以随意利用这些信息。
此外,像以太坊这样的区块链平台,用户是与智能合约进行交互,而智能合约处理的不仅仅是简单的价值转移。 关于这些智能合约的所有细节在以太坊区块链上都是公开的,包括交易发起方和接收方,交易数据本身,执行的代码以及合约中存储的状态。
将关键业务数据上传到黑客、竞争对手或其他未授权方都可以查看的区块链中,对与大多数公司来说不是一种选择。 考虑一下情况:
电子病历,这是非常私人和敏感的信息。 在公有链上公开显示这些信息是令人不可接受的,这样会侵犯病人的隐私。
身份验证数据(如社保号码)不能公开存储在公共智能合约中。
凭证管理(如密码和密钥)是不可能存放在开放的、本质上不安全的智能合约中的。
财务文件,如电子股权结构表或员工工资等不得公开与易于追溯的地址联系。
不胜枚举
对于关注隐私和主权的个人、组织和行业来说,隐私仍然是一个根本的障碍。 我们这些人中许多痴迷于区块链和加密货币的,对建立一个无需信任的、抗审查的、能为个人提供财务支持的系统,有着共同的兴趣。 相反的是,我们正在使用一个公开的,易于追踪的账本来做这个系统。(当我思考这个的时候,它让我的想法走了偏路 !
隐私的解决方案
以下是不同开发团队一直在致力解决的几个方案。
椭圆曲线迪菲-赫尔曼-默克尔(ECDHM)地址
要了解 ECDHM 地址,你要先了解迪菲-赫尔曼密钥交换(Diffie-Hellman Key Exchange)。迪菲-赫尔曼密钥交换背后的思想是建立双方之间的共享秘钥。它可以用来在公共网络上进行私下的信息交换。
这是怎么做到的?
发起方和接收方可以公开共享 ECDHM 地址,然后可以用他们的共享密钥获取匿名比特币地址。这些比特币地址只能由拥有这个密钥的人发布。 唯一公开可见的是可重用的ECDHM 地址。因此,用户不必担心被跟踪的交易。
-用颜色(而不是非常大的数字)说明的密钥交换概念图
使用ECDHM地址方案的一些例子包括 Peter Todd 的 Stealth Addresses,Justus Ranvier 的 BIP47 可重复使用支付代码,Justin Newton 的BIP75带外地址交换等等。 但是,这些方案的实施和实际使用是很少的。
Mixers(交易混合器)
Mixers 背后的思想是,一群人可以将他们得到的付款合并进一个池,并在一个私有账本上保持债务的跟踪。然后,当池中的资金被花费时,每笔付款资金的来源都会被掩盖。任何一个查看区块链的人都可以看到支付金额以及接收方,但理论上,无法追踪被特别授权的人。Mixers 服务的一个例子是 CoinJoin。
不幸的是,Mixers 已被证明是不可靠的方案。例如,研究人员能够轻松识别CoinJoin交易:只花32,000美元,就能让一个攻击者以90%的成功率将交易去匿名化。此外,研究人员还证明了 Mixers 对 Sybil 攻击(编者注:即“女巫攻击‘)和拒绝服务攻击的抵抗力不足。
更令人不安的是,据称,Mixers 的私有账本需要由一些中央机构进行管理,这意味着它需要一个受信的第三方来“混合”交易。
由于 CoinJoin 是用户可选而不是默认的解决方案,因此历史上很少有人参与这些类型的混合池,这使得匿名集合非常小。 因此,这就很容易确定一个特定的输出是否为那几个人之一。
混合方案的另一个例子是 CoinShuffle,这是一个由德国萨尔大学的研究人员开发的分布式混合协议。CoinShuffle 试图通过去掉受信的第三方来收集混合交易,从而改进 CoinJoin。
Monero
解决隐私问题的另一种方法是创建默认私有的加密货币,如Monero。与许多其他币种不同,Monero不是比特币的分叉。相反,Monero基于另一种协议,CryptoNote。
Monero提供的主要功能是另一种“环形签名”方案。
环签名是一种组签名,组中的每个签名者都有一对私钥和公钥。与传统的加密签名不同,传统的加密签名是指一个交易是由一个签名者的私钥“批准”验证的,环签名是指签名者集合的一个成员验证批准了一个交易,而不会暴露是谁签署的交易。
零知识证明
零知识证明是 证明者 在不向 验证者 提供任何信息的情况下,使得验证者相信他们拥有一些秘密知识。换句话说,一个程序可以有秘密的输入,证明者不会向验证者揭示任何东西。零知识证明提供了可用于构建隐私保护机制的基础。 例子包括:
示例1:质询/响应规则
在计算机安全中,质询——响应认证是一个协议族,其中一方提出问题(“质疑”),另一方必须提供一个有效的答案(“回应”)以便认证。这个“规则”可以在区块链上用作交易验证。如果一个交易是无效的,另一个节点可以选择“引起注意(call attention)”来证明交易无效。这就要求提供可验证的证据,来证明交易是无效的。如果验证失败,就会产生一个“质疑”,要求交易的发起者产生一个证明交易有效的“回应”。
让我们来看一个例子:Bob有独自访问一些资源的权限(例如他的车)。Alice现在也想使用该资源,想开着它去杂货店。Bob发出了一个质疑,假设是“52w72y”。Alice必须回应一个符合Bob发出的质疑的字符串。找到答案的唯一方法,是使用只有Bob和Alice知道的算法。而且,Bob每次都会发出不同的质疑。因此,知道以前的正确答案并不会给Alice带来任何帮助。
质询/响应规则已经在像以太坊这样的区块链中使用。但是,我们需要库和工具来使这些类型的认证方案更容易使用。
示例2:zkSNARK
什么是zkSNARKs? 我们来分析定义:
zk = 零知识。不需要知道信息而能证明信息存在。
SNARK:Succinct Non-interactive Adaptive ARgument of Knowledge的缩写。
“简洁(Succinct)”是指可以快速验证的简洁证明。信息较短,便于验证。
“无交互(Non-interactive)”意味着不要求验证者与证明者进行交互。相反,证明者可以提前发布证据,验证者可以验证它是否正确。
“适应性的知识论(Adaptive Argument of Knowledge)”意味着一些计算的知识证明。
尽管有一天我希望能够在帖子中详细介绍zkSNARK,但是这次我会跳过zkSNARK的技术细节。zkSNARKs是一个令人兴奋的、有前途的隐私建设块,有几点注意事项:
SNARKs是资源密集型的。
SNARKs允许用户证明他们拥有一个秘钥的访问权限,但是他们有责任维护秘钥,并在需要时使它能够被访问。
SNARKs有一个启动阶段,在这个阶段你想要证明的电路或者计算是固定了。这个阶段需要事先在一组私下信任人的集合中进行。这不仅要求你信任这组准备这个启动阶段的人员,还意味着SNARK不适合运行任意计算,因为它总是需要一个准备阶段。
示例3:zkSNARKs + Zcash
Zcash是基于zk-SNARKs的隐私保护加密货币。Zcash拥有所谓的“匿名交易”,即所有使用的币都有一个匿名集合。匿名交易使用“匿名地址”,要求发送者或接收者生成一个零知识证据,在交易信息不被泄露的情况下允许其他人验证交易的加密数据。
-Zcash交易图-
Zcash绝对是一个值得关注的有趣项目。
示例4:zkSNARKs +以太坊
在以太坊的下一个协议升级中,Metropolis,开发者将有能力高效的验证链上的zk-SNARKs。
在支持 SNARKs 的以太坊我们能做什么?某些合约变量可以被有效地私有化。它可以和那些遵守支持 SNARKs 的合约规则的用户存储在一起,而不是直接在链上存储秘钥。这些用户每一个都需要自己的信任设置,这就会增加一些准备工作。但是,需计算的电路一旦存在,它就可以根据需要被尽可能多的交易使用。
然而,支持 SNARKs 的以太坊上无法实现的是独立于用户的自治性隐私。由于以太坊上的 SNARKs 依靠用户维护链下的秘钥,所以如果没有这个用户,就无法追踪这个秘钥。
示例5:zkSTARKs
ZK-SNARKs拥有一个更新、更闪亮的兄弟:ZK-STARK,“T”代表“透明”。ZK-STARK解决了Zk-SNARKs的主要弱点之一:对于可信启动的依赖。它们也更简单,因为它们纯粹依赖于哈希散列和信息论,并且能更好抵御量子计算机的攻击,因为它们不使用椭圆曲线或指数假设。
总的来说,尽管我们通过上面提到的基于零知识证明的方法,在隐私方面取得了令人惊叹的进展,但是仍然有很多工作要做。零知识证明库需要进行大量的研究与实战考验,才能成熟。zkSNARKs 和 zkSTARKs 需要在各种公有链上进行实验。Zcash需要在 真实世界的场景 中 大规模 地证明用例。我们离做到这些还有很远。
代码混淆(Code Obfuscation)
另一个隐私机制是代码混淆。目标是找到一种混淆程序P的方法,使得混淆器可以产生二代程序 O(P)=Q , 对于混淆程序 P 和 Q ,如果给定相同的输入,返回相同的输出,但 Q 不会显示任何关于 P 的内部结构。这使得我们可以隐藏Q中的私有数据,如密码、社保号码等,但仍然可以在程序中使用它。
虽然研究人员声称,完全黑盒混淆是不可能的,但有一个模糊的概念:不可分辨性混淆,研究人员认为它是可能的。不可分辨性混淆器O的定义是,如果你取两个等价的程序 A 和 B(即给A、B相同的输入产生相同的输出)并且计算出 O(A)= P 和 O(B)= Q ,那么对于没有权限访问 A 或 B 的人来说,找出 P 是来自 A 还是 B,没有计算上可行的方法。
最近,研究人员Craig Gentry,Amit Sahai等人成功实现了不可分变性混淆的代码。但是,该算法计算开销很高。
如果这个算法可以改进,那么潜在的好处是巨大的。在加密货币世界中,最有趣的可能性是包含私有信息的链上合约的想法。
例如,我们可以想象一个以太坊合约把用户的密码包含到 Coinbase 中。然后,我们可以编写一个程序:如果合约中的某些条件得到满足,合约将通过一些中间节点与Coinbase 发起 HTTPS 会话,也就是使用用户的密码登录并进行交易。由于合约中的信息将被混淆,那么任何中间节点或区块链中的其他玩家,将无法改变正在传播的请求或确定用户的密码。
预言机(Oracles)
在区块链领域中,预言机是一个在智能合约和外部数据源之间传递信息的一方。它本质上充当链上智能合约与链外数据源之间的数据载体。因此,保持信息“私有”的一种方法就是使用预言机从外部数据源获取隐私信息。
可信执行环境
可信执行环境(TEE,Trusted Execution Environment)是主处理器的安全区。它保证内部加载的代码和数据在保密性和完整性方面得到保护。这种可信赖的环境与面向用户的操作系统并行运行,但倾向于比面向用户的操作系统更加私密和安全。
早期有对 TEEs 的研究和开发,确定它们如何实现区块链上的隐私。对于有更多安全领域的专家致力于这些问题,我个人感到非常兴奋。我们确实需要更多的专家来研究这些问题。