干货 | 公有链的基本挑战: Part 2

hongji   |     |   1012 次阅读

3. 缺乏形式化合约验证

智能合约的正式验证仍然是一个巨大且悬而未决的问题。首先,让我们通过理解什么是“形式证明”来理解“正式验证”对一个合约的意义。数学中的“形式证明”意味着一个已经被计算机用数学的基本公理和原始推理规则检验过的数学证明。

更广泛地说,与软件程序相关的形式验证是确定程序是否按照规范行事的方法。一般来说,这是用一个具体的规范语言来完成的,这个语言用来描述函数的输入和输出应该如何相关。 换句话说,我们首先声明一个关于该程序的不变性,然后我们有义务证明这个不变性。

一个规范语言的例子是 Isabelle ,它是一个通用的定理证明辅助工具,支持形式化数学公式,并提供证明工具完成对数学公式的逻辑演算。另一种规范语言是 Coq ,它是编写数学定义、可执行算法和定理的形式化语言。 

那么,为什么对编码到智能合约中的程序进行形式化验证很重要?

 首先,智能合约是不可改变的,这意味着一旦将它们部署到以太坊主网络后,就对他们不能再更新或修改。所以这意味着,在真实世界的应用程序中部署并使用这些合约之前,我们需要把事情做好。而且,智能合约是可以公开访问的,任何存储在智能合约中的东西都是开放的,任何人都可以调用智能合约的公有方法。虽然这提供了开放性和透明度,但它也使得智能合约成为对黑客极具吸引力的攻击目标。

事实上,无论你采取多少预防措施,编写可信且无bug的智能合约都很困难。而且,以以太坊为例,由于EVM指令的设计方式,验证EVM代码非常困难。这使得为以太坊建立形式化验证解决方案变得更加困难。无论如何,形式化验证是减少bug和攻击风险的强有效的方法。与传统方法相比(例如测试,同行评审等),它们提供了更高的正确性保证,并且我们迫切地需要更好的解决方案。

形式化验证解决方案

我希望我有更多可公开的解决方案在本节炫耀,但不幸的是并不多。我发现一个非常早期的例子是由以太坊基金会的形式化验证工程师Yoichi Hirai完成的。他能够获得智能合约的形式化验证产生早期结果,其中包括一个很小的“行为契约”合约。虽然很小,但这是我在定理证明环境中看到的第一个被分析过的“真实的”合约(合同)。

就像 Yoichi 本人说的......

“验证结果还不够完善。我仍然发现验证合约阶段比验证初始阶段有更多的问题。EVM(以太坊虚拟机)编程不针对其他人进行测试!我已经公开这个项目了,因为这个项目是使用机器辅助逻辑推理,来验证智能合约所需的工作量(和细节水平)的一个很好的例子。在这个时候,如果我要实现一个包含价值超过10万美元的智能合约,并且如果我负责这个计划,我会考虑这种方案(另一个选择是先尝试较价值较小的合同)”。

还有一些其他的团队,比如 Tezos 完全放弃使用 Solidity 语言与 EVM,而是建立自己的智能合约编程语言和虚拟机,来完成形式化验证。

无论正确的方法是什么,无论是彻底改革 EVM 使其更容易进行形式化验证,或建立一个本质上更容易验证的全新语言,我们都需要做更多的工作。我们需要更多的研究人员和开发人员来研究形式化验证。我们需要在每种可能的编程语言中实现形式化验证库和标准。

4. 存储的约束

构建在公有链上的大多数应用程序都需要某种存储解决方案。(用户身份,财务信息等)。

然而,将信息存储在公有链数据库中意味着数据:

  1. 由网络中的每个全节点存储。
  2. 由于区块链数据库仅可添加和不可更改,所以数据被无限期地存储。

因此,数据存储为分布式网络增加了巨大的成本,每个全节点得无限期的存储越来越多的数据。从而,对于任何构建在区块链上的现实应用,存储都是一个巨大的障碍。

存储方案

早期的几个项目使用的策略是将数据拆分成片,然后根据参与的节点以分布式的方式存储数据(即分布式存储)。这里的基本前提是,不是每个节点都存储所有的数据,而是一组节点将数据分离或“分配”。像这样的项目的几个例子包括:

  • 蜂群协议(Swarm):蜂群协议是 Ethereum 点对点文件共享协议,允许用户将应用程序代码和数据存储在主链下连接到以太坊区块链的 swarm 节点中。用户接下来就可以在区块链上交换这些数据。
  • Storj:一种数据分片的解决方案:首先对文件和数据进行分片、加密,然后分发到多个节点,从而使每个节点只存储一小部分数据。因此 Storj 也是“分布式数据存储”。然后 Storj 币(SCJX)就被用来支付存储操作,并且作为存储部分用户文件或数据的节点的激励。
  • IPFS:一种可选的 p2p 超媒体协议,以内容寻址超链接为基础的、提供高吞吐量、内容寻址的块存储模型。从本质上讲,它允许文件以永久和分布式的方式存储,同时提供历史版本的文件从而删除重复文件。
  • Decent:Decent是一个分布式的内容共享平台,允许用户上传和数字货币化分享他们的工作成果(视频,音乐,电子书等),而不依赖于集中化的第三方来分享。用户可以通过跳过这些中间媒介,以更经济的方式访问媒体内容,而承载数字媒体内容的节点将获得奖励。
  • ......还有更多。

5. 不可持续的共识机制

区块链是“去信任化的”。用户在进行交易时没必要相信其他任何人,因此这能带给用户有吸引力的特性,如自主性、抗审查性、真实性和无许可创新等。

能够实现去信任化区块链又不易受攻击的机制被称为“共识协议”。共识协议对比特币等区块链来说都不陌生。例如,1992年,Dwork 和 Naor 就是首批创建出“工作量证明”系统的人。在“工作量证明”系统中,在不需要依靠信任的情况下,就能为获得资源所付出的计算力生成加密证明。该系统过去被用于抵制垃圾邮件。在1997年,Adam Back创建了一个叫作 Hashcash 的相似系统。之后在2003年,Vishnumurthy 人首次使用工作量证明来保护货币,在这个项目中,代币没有被用作通用货币,而是被用来维护端到端的文件交易系统。

5年后,中本聪横空出世,他将工作量证明用作保护价值货币——比特币——的机制。这种潜在的共识机制让比特币成为了第一个被广泛采用的全球分布式交易账本。

工作量证明共识

工作量证明是一种解题机制,题虽难解,但易于验证。矿工使用他们的计算力完成需消耗大量计算力的计算。对于提供解法的矿工,比特币系统会奖励他们新的比特币和交易费。矿工拥有的计算力越多,他们对于共识的决定权所占的“权重”就越大。

工作量证明共识允许比特币成为分布式数字货币的第一个真正被广泛采用的分布式数字货币形式。它无需通过任何可信的第三方就解决了“双重支付问题”。然而,工作量证明并非完美无缺,仍需通过大量研究和发展来构建一个更可行的共识机制。

工作量证明存在哪些问题?

1. 专业化硬件优势带来的问题

工作量证明的一个缺点在于使用专业化硬件。在2013,人们专为挖掘比特币设计出了被称为“应用型专用集成电路(ASICs)”的设备,能够提高10至50倍的效率。从那时起,使用普通计算机的CPU和GPU 挖矿已经完全无利可图了。挖矿的唯一方法是通过自己制造ASICs,或是向ASICs制造商购买。这偏离了区块链的“分布式”特性。在区块链中,所有人都应该有机会促进网络的安全性。

为了缓解这一问题,以太坊选择使它的工作量证明算法(Ethhash)变得memory-hard。这意味着该算法是经过设计的,使得Nounce 需要大量内存和带宽。面对大量的内存需求和较高的带宽需求,即使是运行速度超快的计算机也难以同时发现多个Nounce。这就降低了中心化的风险,为正在进行验证的节点创造了更公平的环境。

当然,这并不是说未来也不会有专为以太坊设计的ASIC。专门化硬件对工作量算法来说仍是一个巨大的风险。

2. 矿池中心化

矿池的理念是不再让每位客户各自挖矿,只有很低的概率能获得区块奖励,而是让他们为了矿池而挖矿,之后矿池会持续支付给他们适当的报酬。有一个问题是,因为矿池在网络中的“权重”较高,大型矿池的收益变化少于单个用户。随着时间的推移,一些矿池开始控制大部分网络,集中型的矿池组则继续获得更多计算力。例如,前五大矿池现有的hashrate占据了总量的近70%。这可以说是相当可怕了。

3. 能源浪费

矿工花费大量的计算力来进行计算,从而解决工作量证明算法,然而可惜的是,所有这些计算工作对社会毫无价值。根据数字经济学家的比特币能源消耗指数来看,比特币目前的年度电力消耗量预计达29.05太瓦时,占据了全球电力总消耗量的0.13%。说得直观一点就是,比特币挖矿目前使(lang)用(fei)的电力超出了159个国家所使用的电力。

随着比特币等使用工作量证明共识的公共区块链继续扩张,越来越多的能源会被浪费。如果公共区块链的目标是扩展至数百万的用户和交易,由工作量证明造成的不可持续的能源浪费和计算成本不利于该目标的实现。

共识解决方案

有用的工作量证明

该能源浪费问题的一个解决方案是让工作量证明函数解决有用的问题。例如,想象这样一个场景,矿工花费他们的计算力求解很难的人工智能算法,而不是工作量证明需要解决的一个随机的SHA256问题。

权益证明

解决挖矿中心化问题的一个方法是彻底取消挖矿,转而采用其它机制来计算共识中每个节点的权重。这就是权益证明的目标。

”在权益证明机制下,矿工花费的是“权益”(即金钱),而非算力。正如Vitalik所言,不再是“每单位CPU算力为一票”,而是“每单位货币为一票。”

权益证明消除了硬件需求,因此无需担心上述所讨论的硬件中心化问题。而且,由于矿工不需要花费大量能源来通过计算求解工作量证明算法,权益证明从本质上来说更加节能。

然而,天下没有白吃的午餐,使用任何技术都需代价。权益证明算法也有其根本挑战。具体来说,这些挑战包括:

  1. 无利害关系问题:有了权益证明,当区块链中出现分叉之时,无论是该分叉是偶然的还是恶意的,对于任何正在验证交易的节点来说,最佳策略是在每条链上进行”挖矿”。由于他们没有花费物质上的算力,只用美元进行投票。这意味着在权益证明机制下,不管哪条链赢了,矿工都会得到奖励(也就是说“无利害关系”防止他们在每条链上挖矿)。
  2. 远程攻击Long-range attack,也译作“长程攻击”):如果使用工作量证明的区块链上出现了分叉,矿工将在当前主链区块头后面的几个区块之处开始制造分叉链。矿工距离分叉链越远,分叉链就越难赶上主链,因为这需要一半以上网络的算力。但是,如果使用了权益证明,矿工可以在上千或上百万个区块之后制造分叉链,因为这需要的只是权益,即金钱。这意味着矿工轻易就能将数百万个区块添加到新链上,让用户难以辨别出哪条是正确的区块链。
  3. 卡特尔的形成: 在一个以经济激励为主导的分布式系统里,真正的风险在于联合和寡头的形成。以太坊研究员Vlad Zamfir指出:“加密货币是非常集中的。挖矿力也是如此。许多‘现实世界的'市场都以寡头竞争为准则。少数几个较富有的验证者之间形成联合要比大量较贫穷的验证者之间形成联合容易得多。在区块链领域,卡特尔的形成是完全可预期的。

为了能使权益证明之类的新型共识机制代替工作量证明,我们需要一个既能解决无利害关系问题和远程攻击问题又不会带来新的联合风险的算法。

Tendermint 和以太坊等团队在解决上述问题方面已经取得了很大的进展。Tendermint 是第一个通过为区块链构建可行的权益证明共识引擎而将传统的拜占庭容错研究引入区块链的。然而,Tendermint 也存在缺陷(详见另一篇文章)。同样地,以太坊在权益证明的执行上也取得了长足的进步,不过事实是如今在活跃的网络上没有任何东西在大规模运行。

与工作量证明不同,权益证明还未被现实验证,而且知道的人也很少。要了解各类设计的不同利弊需要进一步的研究和试验。同样地,非常需要在这些早期成果的基础上共同创造一个高效、快速又安全的共识系统。

6. 缺少治理和标准

显然,公共的分布式区块链是不依靠中心机构或组织进行决策的。一方面,这可以实现我们的共同梦想——构建一个完全不需要信任和许可的开发系统,另一方面却又缺少安全的协议升级途径,也没有人负责制定并维护标准。

虽然我们确实想要尽量维持区块链技术发展的分布式特点,我们仍然需要在这个生态系统内的开发者等人员之间建立起某个组织,在新的标准、特性和升级方面达成共识。如何能在完全没有中心化组织(如以太坊基金会)的情况下实现这点尚未明确。
例如,以太坊的现状向来是由一至两个开发人员主要负责制定具体标准或特性。该模式目前虽然有效,但是存在缺陷。一方面,它的效率不高——如果负责制定标准的开发人员过于忙碌,或是在几天或几周之内忘了回复,不管该标准对于所有构建公共区块链的人来说是多么重要,制定标准的进程就会停滞。在没有明确领导力的情况下制定标准会造成一片混乱,也不可能在紧要问题上迅速达成共识,尤其是在社区日益扩大的情况下。

另一个方法是让以太坊变成彻底的开放式和分布式系统。然而,这种方法已经被证明是无效的,造成了数年的失败。

需要找到一个更好的方法。

Tezos 是公共区块链的一则实例。它旨在通过使用链上治理实现协议内部升级的能力,不过这仍然停留在概念阶段,未经践行或证明。

总的来说,区块链治理是一个非常棘手的问题,找到中心化和分布式管控之间的平衡将是步入正轨的关键。

7. 工具不足

工具充足对开发人员的工作来说至关重要,尤其是在开发人员想要有效且高效工作的情况下。糟糕的工具会造成可怕的后果。

当前区块链生态系统使用的开发人员工具显然是不能接受的。在区块链上开发功能协议或分布式应用是一项艰巨的任务,即使对于如今经验最丰富的开发人员来说也是如此。

作为Solidity和区块链开发者,我个人发现了工具生态系统的几点缺失:

  • 一个有良好的linter工具及一切必要插件的IDE,能够实现有效的合约发展和区块链分析
  • 一个有详细文档记录又便于使用的构建工具编译器
  • 一个不难用的部署工具
  • 实际存在或是对各种API和构架来说尚未完全过时的技术文件
  • 还说得过去的测试框架。一些像Truffle之类的以太坊工具尚能凑合,不过就测试框架方面而言极其需要更多的选择和试验。我已经看到太多未经测试的智能合约了,涉及金额高达数百万美元。在任何情况下都不能缺少测试,更何况涉及金额如此巨大。例如,BAT代币销售智能合同虽然没有测试包,却在24秒之内就筹集到了3600万美元。但凡有理智的人都知道,能募集到如此巨大金额的智能合约肯定会遭受攻击。
  • 调试工具。唉,调试Solidity代码就像蒙着眼罩在漆黑的隧道里搜寻金矿。在我之前从事的工作中,我负责的是网站开发,能够使用调试器单步调试一行行代码,真的是救命稻草。在开发Solidity之时,没有这样的工具,甚至连类似的工具都没有的话,那就太令人失望了,结果只会徒劳无功。我们非常需要能够将隔离和诊断问题变得更容易的工具。
  • 日志记录工具。同上。
  • 安全审计。这是一个大问题。我只听说过Open Zepplin 这一个知名的以太坊安全审计服务。虽然他们的审计服务对于这个生态系统做出了很大的贡献,但是对于这样一个使用智能合约募集数十亿美元的行业来说,只有这一家提供安全审计服务的初创公司是不够的。各公司和工程师需要开创更高级的工具和服务,此外必须要有更多安全专家对智能合约进行彻底的审核。 只在两次 Parity 攻击和 DAO 攻击等被黑事件发生后,人们才对智能合约的安全性有了较高的关注。当然,这责任被归咎在了编写这些智能合约的开发人员,甚至是以太坊的核心团队身上。我认为这是不公平的。不知道如何对自己的代码进行安全审计并不应该是开发人员的责任。这就好比说让Stephen Curry 给自己计分一样。这是行不通的。我们很需要安全工程师和研究人员的帮助和专业知识。我们需要投资者拿出实际行动来,资助那些致力于提高智能合约和区块链安全性的工作。
  • 区块探测器和分析器。以太坊使用的区块探测器名为Etherscan。比特币使用的区块探测器有Blockchain.infoBlockexplorer Blockcypher等。这些都是整个社区付出的巨大努力。实际上,我大量使用 Etherscan。但是在对区块链进行认真分析方面,它还远远不够。公共区块链有很多有趣的数据可供我们进行分析,这也是我们应该做的。

8. 量子计算威胁

对于加密货币和密码学的潜在威胁之一是量子计算机问题。

虽然如今的量子计算机能解决的问题类型依然有限,但未来不会一成不变。一个可怕的真相是,大多数流行的公钥算法可以被足够大的量子计算机有效破解。

重要的是,当我们设计并构建区块链及其密码基础之时,我们需要考虑如何让这些性能实现量子防御。

量子防御解决方案

尽管我不是这方面的专家,但是跟据我非常有限的了解,后量子密码研究目前重点采用以下6种方法:基于Lattice的密码学多变量密码学基于哈希函数的密码学、基于代码的密码学、超奇异椭圆曲线同源密码学以及 AES 和 SNOW 3G 等对称密钥量子防御系统。

不管最终采用何种方案,构建量子防御的密码学解决方案是首要考虑之事。

谨记各种挑战

  • 我们需要更多强有力解决跨链交流的方案,允许各种区块链(如比特币、以太坊和Litecoin等)互相进行无缝交流和互动。
  • 我们需要在区块链工具内构建更好的密钥管理系统,以便在此基础上构建应用程序。
  • 我们需要更高效的签名方案和其他低耗设备无需降低安全性就能操作的加密系统。
  • 等等……

结束语

令人遗憾的是,围绕在区块链上的注意力和资金正在被推向ICO。与此同时,一些研究人员和开发人员虽然很想解决这些问题,却没有足够的资源。

再者,许多人在利诱之下忽略了这些问题——包括该领域内一些极具影响力的开发人员和领导者。

对于接下来的一年,我对目标是继续:

  1. 提高人们对这些问题的意识
  2. 将大量时间花在研究这些解决方案上
  3. 带动其他研究人员和开发人员与我一起努力

不管当前的投资热潮最后是否会化为泡沫,我坚定地相信区块链会挺过这关。我们只需要再加把劲,让开发人员致力于为区块链扫除影响其成为主流应用的障碍,并让投资者发掘并资助这类工作。


干货 | 公有链的基本挑战: Part 1
干货 | 公有链的基本挑战: Part 2(本篇)


原文链接: https://medium.com/@preethikasireddy/fundamental-challenges-with-public-blockchains-253c800e9428
作者: Preethi Kasireddy
翻译&校对: 闵敏 & Elisa

本文由作者授权 EthFans 翻译及再出版。


你可能还会喜欢:

如何使用Solidity编写安全的智能合约代码?
观点 | 区块链治理:用编程迎接未来
关于钱包的基础密码学 (1)

 
2 人喜欢