虽然 ZK-Rollups、电路和 SNARK 非常复杂且不够成熟,但使用多证明者方法可以对冲证明系统、架构和实现中的错误和漏洞的风险。多证明者可以使用不同类型的证明(例如,有效性证明和欺诈证明)、不同的证明系统(例如,SNARK和STARK)以及不同团队的不同实现来实现。
在本文的第一部分中,我们介绍了多证明者方法的重要性,简要解释了除了证明系统之外还有什么可以多样化。在第二部分中,我们将阐明什么是 SGX(有效性证明之一)、它是如何工作的,并解释为什么它是现有加密和经济系统的可靠补充选项。在第三部分中,我们简要描述了多重证明者如何适用于节点和智能合约。
内容
为什么多重证明很重要
什么是新交所,它是如何运作的,它的优点和缺点是什么
什么是新交所
SGX 组件的高级概述
新交所如何运作
新交所的疑虑、限制和弱点
现有的区块链实施
将 SGX 应用于汇总
多重证明器如何在汇总设置中工作
资源
代码风险问题:电路复杂、体积大,尤其是ZK-EVM的电路:几十万行代码。它们在很长一段时间内不会没有错误。证明系统、电路编译器、ZK-EVM 代码等中可能存在错误。
年轻的加密原语:ZK-Rollups 依赖于 SNARK,后者相当年轻,证明系统中也可能存在错误。
多证明者:为一个区块生成多种证明类型。然后,如果出现错误,即使一个证明被破坏,其他证明也不太可能允许完全相同的漏洞被利用。如果一种证明类型以某种方式不允许验证区块,则链可能会停止(取决于接受某些内容为真的要求)。对多种证明类型的额外要求是严格的安全改进。
免责声明:从现在开始,当我们说“多重证明者”时,我们指的是不同类型的证明。
我们可以将多重证明者视为以太坊客户端的多样性:它允许链“对网络上的部分故障具有弹性,然后恢复并最终确定”。
正如 Vitalik 在他的文章中解释的那样:“以太坊的多客户端理念是一种去中心化,就像 一般的去中心化一样,人们可以关注架构去中心化的技术优势或政治去中心化的社会效益。最终,多客户理念受到两者的推动并为两者服务。”
对于 Rollup 多证明者理念来说,这也是公平的:它有助于构建架构和政治去中心化的技术和社会效益。通过技术优势,我们指的是不同的证明系统、架构和实现。所谓社会效益,是指权力多元化:即避免链团队内部权力集中。
多重证明者可能涵盖
不同的证明类型,例如欺诈证明(在乐观汇总中使用)和有效性证明(在 zk-rollups 中使用)。由于它们依赖于非常不同的假设,并且它们的设计彼此相距甚远,因此欺诈证明和有效性证明中的错误之间的相关性非常低。另一种不太受欢迎的证明系统多样性的选择是 SGX。请查看下一节以了解其工作原理。
不同的证明系统,例如 SNARK 和 STARK 后端(在使用 zk 有效性证明类型的情况下)。
不同团队的不同实现:它降低了一个软件中的一个错误导致整个网络灾难性崩溃的风险,因为其他团队编写的其他软件极有可能不包含相同的错误。
如果有多种证明类型——它们有可能会产生不同的区块证明结果。
当谈到证明时,我们期望它们具有两个特征:完整性和健全性。完整性是指“如果陈述是正确的,验证者可以被证明者确信这一事实”。所谓健全性,我们的意思是“如果陈述是错误的,则任何作弊证明者都无法说服验证者它是真的。” 下面我们解释了多证明者环境中完整性和健全性可能出现的问题。
对于有效性证明类型:
完整性上下文中的证明被破坏:无法生成有效块的证明。
这意味着这种证明类型的证明不能在链上提交。根据需要 n/N 的证明类型数量,链可能会停止。健全性上下文中的证明被破坏:可以使用不同的区块哈希生成有效区块的多个证明,当然,只有一个且唯一正确的区块哈希的证明应该是可能的。
在这种情况下,可以在链上提交有效的证明,但它必须与其他证明类型的区块哈希相匹配。如果同一个错误可以在多种证明类型中被利用,并且可以为同一个块提交具有相同错误块哈希的多个证明,那么即使多证明者设置也会被破坏。对于欺诈证明类型,完整性破坏意味着无法为无效块生成欺诈证明,而健全性破坏意味着是否可以为有效块生成欺诈证明。
如果使用两种类型的证明,并且一种或多种证明类型存在完整性问题,一种可能的解决方案是使用多重签名治理作为紧急情况。该实体将检查哪个区块哈希真实有效,并在链上确认它,并排除或更新有问题的证明类型(或采取其他严格措施)。在这种情况下,良好的多重签名是必要的。查看Ed Felten 的Twitter 帖子,了解什么是好的多重签名。
如果存在两种以上的证明,那么关于证明有效性的多数共识可能是争议解决机制。其次是排除或更新有错误行为的证明者的机制。
当涉及到证明类型的多样性时,可以结合不同的有效性证明(例如,zk证明和SGX证明)和欺诈证明。然而,欺诈证明需要较长的延迟,因此似乎不太适合 ZK-Rollup 的需求。在本节中,我们将探讨 SGX 证明,解释它是什么、它如何工作以及它们有哪些优缺点。
SGX 代表软件防护扩展。
它是 Intel 推出的一种可信执行环境 (TEE)。
TEE 是设备主处理器上与系统主操作系统 (OS) 分离的区域。它确保数据在安全的环境中存储、处理和保护。
SGX 使应用程序能够在其自己的可信执行环境中执行代码并保护机密,从而提供针对恶意软件的保护。
在区块链中,SGX可用于私人智能合约。当它们在受信任的飞地内运行时,它们变得私有。例如,人们可以在新交所内部运行预言机来获取隐私并进行证明,而无需透露已证明的内容。
SGX 创建从系统物理 RAM 中保留的隔离的不可寻址代码和数据内存区域(飞地),然后进行加密。换句话说,Enclave 是一个包含代码和数据的“秘密库”,应用程序可以在其中处理敏感数据,而不会造成数据泄露的风险。
加密发生在硬件级别,它可以防止基于软件的攻击。即使黑客可以访问运行 TEE 的系统的应用程序、整个操作系统和BIOS,机密数据仍将保密。
TCB(可信计算机库) ——计算系统中为操作提供安全环境的所有内容。这包括其硬件、固件、软件、操作系统、物理位置、内置安全控制以及规定的安全和安全程序。
硬件机密– RPK、根配置密钥(由英特尔随机创建和保留)和 RSK、根密封密钥(在生产过程中在 CPU 内部自动随机生成)。
证明– 证明软件可执行文件已在平台上正确实例化的过程。
SGX应用程序由两部分组成:可信部分和不可信部分。
应用程序在可信部分创建一个飞地。
然后它**调用可信函数。**可信函数是由软件开发人员创建的一段代码,用于在 enclave 内工作。仅允许受信任的函数在 enclave 中运行,处理器会拒绝从 enclave 外部访问 enclave 内存的所有其他尝试。
一旦调用该函数,应用程序就会在可信空间中运行,并以明文形式查看安全区代码和数据。
当可信函数返回时,飞地数据保留在可信内存中。
应用程序重新在不受信任的空间中运行。
一些澄清和细节:
不受信任的代码是一个应用程序;
一是调用ecall函数进入enclave;
ecall函数输入不可信;
可信代码是一个飞地;
ocall 是从 ECALL 内部进行呼叫外部的;
ocall 的输出不受信任;
Enclave无法直接访问操作系统提供的服务;
有两个密钥:秘密密钥和公钥。密钥在飞地内部生成并且永远不会离开它。公钥可供任何人使用:用户可以使用公钥加密消息,因此只有 enclave 可以解密它。
有时,由于数据交换或通信等不同原因,飞地需要与同一平台上的其他飞地进行协作。
需要证明的两种主要情况:
两个交换飞地必须向对方证明它们是可以信任的。
客户端必须向服务器证明客户端应用程序正在可安全处理机密的可信平台上运行。
这两种情况都需要安全执行环境的证明,英特尔 SGX 将这种证明过程称为证明。
有两种类型的证明:
本地证明——一个飞地使用英特尔 SGX 报告机制在本地对另一飞地进行身份验证,以验证对方是否在同一 TCB 平台上运行。
远程认证– 远程证明的目标是让硬件实体或硬件和软件的组合获得远程服务提供商的信任,以便服务提供商可以自信地向客户端提供所请求的秘密。它验证三件事:(i) 应用程序的身份,(ii) 其完整性(未被篡改),以及 (iii) 它是否在支持 Intel SGX 的平台上的 enclave 内安全运行。借助英特尔 SGX,远程证明软件包括应用程序的飞地、英特尔提供的引用飞地(从其他飞地接收报告、验证它们并在返回结果之前使用证明密钥对其进行签名)和配置飞地(使用 PSK 加密证明密钥)并存储在平台上以供将来使用)。证明硬件是支持 Intel SGX 的 CPU。SGX 101。
远程证明功能要求服务在英特尔证明服务中注册(或者可以使用其他人的服务来代替英特尔服务,例如还提供安全管道定制机会的云提供商的服务)。
对于区块链新交所来说,远程证明是唯一的选择,尽管它不如本地证明稳健。
1. 信任
使用 SGX,人们相信英特尔这一先进技术一切都很好。由于硬件已在受信任飞地内附带私钥交付。此外,英特尔在修补新攻击方面相当缓慢。检查sgx.fail以查找英特尔尚未修复的公开已知的 SGX 攻击列表。
作为对此问题的反驳,有人提到,如今英特尔的声誉是一项极高价值的资产。也就是说,对SGX的任何恶意操纵对于英特尔来说在经济上都是不合理的,至少对于个人经济利益来说是不合理的。
另一个问题是,由于 SGX 在 2021 年在消费类 CPU 上被弃用,有一天它可能会被弃用或在其他版本中发生重大变化,这可能与特定用例不兼容。
2.全新技术
几乎没有人能够公正地回答新交所的可靠性如何这一问题。最公平的答案:我们不知道,因为它是相当新的,我们不知道可能发生(并将发生)的所有类型的攻击。
大多数 SGX 都是黑盒的,其中很大一部分是在 ucode 中实现的。
3. 安全性
TEE 不能自给自足。因此它们需要通过 MPC、ZK、FHE、ORAM 等(以及它们的不同组合)来补充,以确保 TEE 的安全。
除了将新交所与其他加密原语相结合之外,它还可能与经济激励相结合。
SGX与经济
图表来源:Phil在 ETHDenver 隐私研讨会上的演讲,2023 年 2 月
在某些方面,SGX比经济激励更弱,有时又更强。
SGX更强大:
SGX较弱:
4. 作弊
当某些事情是私人的时(比如在新交所的情况下),巨大的作弊行为可能会在不被观察到的情况下发生。
所以,新交所并不是灵丹妙药。然而,飞地显着减少了攻击面,使用它似乎是合理的。
图来源:论文《基于云/雾的物联网场景中的机密计算》。
最合理的策略是以一种智能的方式结合所有的解决方案(包括加密的和经济的)以获得一个真正强大的解决方案。
目前,对于 SGX 的实现,有多种 SDK:Intel SGX SDK、Open Enclave (C++)、Rust SGX、Teaclave等。
为了在不修改源代码的情况下独立运行现有应用程序,已经开发了像Gramine、 Occlum 和 EGo这样的 libOSes(作为库实现的整个操作系统) ,为希望在类 Linux 环境中运行的应用程序提供抽象层。
SGX 在区块链领域的实施是由 Flashbots 和 Nethermind 共同努力开创的。
摘要:在 SGX 中运行 Geth 是完全可能的,但过程既耗费资源又耗时。需要大量内存,启动时间约3小时,且状态容易丢失。
问题和限制
存储状态: Gramine 的加密文件挂载性能缓慢,这使得 Geth 很难跟上以太坊主网(也许这是一个错误)。
**初始同步:**链的初始同步过程可能需要相当长的时间,目前需要高达 800GB 的存储空间。
**信息泄漏:**当主机系统可以提取有关 SGX enclave 内正在访问的数据的信息时,就会发生信息泄漏。就 Geth 而言,由于 IO 和内存访问模式(探讨 IO 泄漏的论文),这可能会泄漏有关从数据库访问的键的信息。
面对所有这些问题,Flashbots 尝试了一种替代方法:将整个链存储在内存中。
新问题
需要至少具有 1TB 内存的系统,这是硬件资源密集型且昂贵的。但并不是所有的 1TB 都需要被应用程序一次性访问,其中很多可以由 SGX 内核驱动程序加密并换出。
如果 Geth 应用程序停止,状态就会丢失。
代码和工具: https: //github.com/flashbots/geth-sgx-gramine
论坛讨论
实现目标(指定):私有交易+去中心化构建者
区块构建者以及其他基础设施提供商无法再看到用户交易的内容并对其运行可验证的区块构建算法;
展望未来,新交所内的建设者可以制作可证明有效的区块并如实报告其出价规模,从而可能消除对 mev-boost 继电器的需要。
问题和限制
Geth状态大小: geth数据库需要大约1TB的存储空间。启动过程大约需要4.5小时。已实施的解决方案:将古老的数据库保留在飞地之外,将内部所需的状态减半(至约 500GB)。检查实施细节。
合并性能和额外延迟: SGX 构建器目前的性能约为 150 mgasps(每秒百万 Gas),大约是非 SGX 构建器性能的一半。
“导致这种性能下降的罪魁祸首可能是 Golang 处理系统调用的方式。Golang 不使用 libc 系统调用接口,而是直接调用内核。当在 SGX enclave 内运行时,这会产生额外的执行开销。通过使用 gccgo 构建 geth 可以实现可能的改进。”
有关 flashbots 实施的更多信息:
在 flashbots 论坛上打开了问题。
Alex Stokes关于分布式构建的帖子。
好消息是,对于汇总,我们只对验证块的正确执行感兴趣。这意味着我们可以创建一个仅验证块的正确执行的无状态程序。可以从普通节点查询执行此操作所需的所有数据。该数据作为输入传递到程序中,程序验证其正确性。这正是 zk 证明的工作原理,因为 zk 证明无法直接访问状态。
更具体地说,输入是最新已知的状态根、交易列表和区块参数。预期输出(块哈希)也作为输入传递,因此可以根据预期值检查程序计算的块哈希。为了验证作为输入传入的状态数据,输入还包含块内访问的所有状态的 Merkle 证明,以便可以根据已知的状态根进行验证。这样,只要我们能够确保向无状态函数提供正确的状态根和块数据,SGX就可以证明程序的正确执行,从而证明块的正确执行。
任何对生成证明感兴趣的人都希望为需要为其创建证明的链运行一个节点。从该节点提取生成证明所需的所有数据。除了区块中的交易等明显数据之外,这还包括所有状态访问的所有 Merkle 证明。对于 zk 证明,这还可能包括块中所有交易的执行轨迹。根据这些数据,生成证据。使用许多计算机,基于 zk 的证明的证明生成可能需要花费几分钟的时间。其他证明(例如 SGX)只需几秒钟即可在一台计算机上运行。
一旦生成了所有必要的证明,它们就会一起提交到汇总智能合约。它们不会单独提交,因为仅将部分所需的证明放在链上并没有什么好处。只需要求将所有证明一起提交即可使事情变得更简单、更高效。通过链上可用的所有证明,智能合约将验证它们的正确性。
对于 zk 证明,这意味着在证明上运行验证器。对于基于 SGX 的证明,这只是检查包含预期数据的某些 ECDSA 签名是否由预期地址签名。如果所有证明都通过了此检查,并且给出了预期的证明数量,那么唯一需要检查的是所有证明实际上都证明该块具有相同的块哈希。如果检查通过,该区块最终被标记为已验证,并且其区块哈希现在在链上已知(假设所有先前的区块也已被证明,以便该区块构建在正确的链尖端之上)。
资源
SGX Gitbook:如何构建您的第一个 SGX 应用程序。
2022 年 Rollup Day 的视频– 用于 Rollup 安全性的多重证明者 (Vitalik Buterin)。
2023 年 ETHDenver 隐私研讨会的视频(Kevin Yu)。
Flashbots 在 SGX报告中运行区块构建器。
在 SGX 内运行 Geth:我们的经验、学习和代码报告。
Alex Stokes谈分布式区块构建。
来自 ETHDenver 隐私研讨会 2023 的视频(Phil Daian)。
演讲“SGX Secure Enclaves 实践安全和加密审查”。
演示工作量证明、时间证明和所有权证明实施示例。
英特尔对SGX 的解释。
上海交通大学张媛媛作报告。
关于 SGX 的英特尔官方视频。