零知识证明的力量:去中心化世界的隐私驱动创新
我们只看到了 ZK 技术潜力的冰山一角,其真正的能力远远没有被完全挖掘出来。
撰文:Salus
1. 引言
零知识证明(Zero-Knowledge, 或简称 ZK)技术可以解决去中心化世界中的隐私和安全问题。本文通过 DEX、Oracle、投票和拍卖四个实例,说明了 ZK 技术在其中发挥的关键作用。ZK 技术被用于确保在 DEX 上的交易既可以被验证,又可以保护用户的隐私,隐藏用户的身份或其他交易细节。基于 ZK 技术可以保证从预言机获取的数据的准确性,防止数据在传输或计算过程中被篡改。在区块链投票项目中,有资格的投票者可以以匿名身份进行投票,投票信息能够防止被预篡改,也是 ZK 技术能够解决的。该技术也可以为区块链拍卖项目中的竞拍者提供身份隐私保护功能,同时还能解决虚假出价的问题。
2. 去中心化世界的隐私风险
区块链没有秘密,所有信息都在公众视野之下,这使得其在隐私保护方面有所欠缺。此外,很多智能合约的运行离不开链下数据,这就带来的额外的安全风险。下文,我们将详细探讨这两大特性会引发的安全问题和潜在风险。
区块链的公开透明性所引发的安全问题
区块链的公开透明性保证了交易的可追溯性,但同时也会引发安全性问题。比如,DeFi 中的个人隐私的泄露风险和抢跑交易风险。
隐私泄露:通过地址标签染色法、交易 IP 匹配和广播节点探针等方法可以轻易关联链上地址在现实世界中的真实身份。这些分析方法不仅可以揭露用户的身份,还透露了用户的行为模式和投资策略。例如,某个地址的频繁交易或特定类型的交易活动会透露出该用户的投资偏好或习惯,这种信息经常被不正当地用于竞争优势或不恰当地利用。
抢跑交易:攻击者能够利用区块链的透明性来监控待确认的交易队列。他们通过分析这些未处理交易,可以在交易中设置更高的手续费,从而诱导矿工优先处理这些交易。这样,攻击者可以在其他用户之前执行交易,以获取先机优势,为自己谋取利益。这种行为不仅扭曲了交易过程的公平性,还会导致市场操纵和不利于其他用户的情况。
因此,DeFi 协议的设计和实施应当充分考虑这些潜在的安全威胁。我们应考虑引入额外的隐私保护措施,以保护用户免受隐私泄露和交易行为分析等风险。
区块链在获取链下数据时存在的安全风险
在区块链中,智能合约无法直接获取链下数据,它们只能访问区块链上的交易数据或其他合约的状态。智能合约是区块链上自动执行的程序,其运行结果必须在所有节点中保持一致性,即给定相同的输入,其执行结果必须完全一致。由于链下数据可能变化,如果智能合约直接获取链下数据,不同节点在执行相同的合约时可能得到不同的结果,这将破坏区块链的一致性。
然而,许多场景下,智能合约需要依赖链下的数据。例如,一个 DEX 需要获取特定股票或者数字货币的最新价格。这些价格数据一般需要从链下的金融市场或者其他交易所获取。区块链系统通常会通过预言机来获取链下的数据。当智能合约需要链下数据时,它可以请求预言机,预言机将获取链下数据并返回给智能合约。而且,预言机也可以将链上的数据传输至链下。
不过,引入预言机也带来了新的安全风险,在一些场景下预言机会因错误或恶意行为提供不准确的数据。因此,预言机的设计和实现需要对安全性给予高度重视。
涉及到投票和拍卖的区块链项目,也需要考虑特别的安全保护措施。区块链技术为投票平台提供了透明和不可篡改的特性。然而,筛选合格选民、选民匿名投票、防止投票信息被预先篡改已经成为了新的挑战。链上拍卖的核心问题是虚假出价和账户可视。当你可以看透对方的筹码,那你就具有了先发优势。
3. 隐私化驱动场景创新
3.1 ZK Private DEX
区块链的公开透明性为 DeFi 领域的许多项目带来了隐私上的挑战。面对这样的挑战,Salus 将以 DEXs 为例,探讨 ZK 技术在增强 DEXs 隐私保护方面的关键作用。
假设有一个具有隐私保护功能的 private DEX。通过使用 ZK 技术,它能够隐藏交易信息的部分内容,同时还能验证这些交易的有效性。在这个 DEX 中,只有部分交易信息是公开的,例如所有注册用户,他们的银行账户、存款和取款的资产名称以及数量,如图 1 所示。交易者本人会知道自己的全部交易信息,但其他交易者无法看到他人的完整交易信息。以下,以五个具体的交易事件为例:
图 1 只知道部分公开信息的 Private DEXs ,图片来源 https://arxiv.org/pdf/2309.01667.pdf
假设在这个 private DEX 平台上发生了五笔交易,他们相对应的事件信息是:
Alice 在平台上存入了 1000 USD。
Bob 在平台上存入了 10 BTC,此时 BTC 的价格是 1000 美元。
Alice 在平台上进行交易,将 800 USD 兑换为 0.5 BTC,此时 BTC 的价格是 1600 美元。
Alice 在平台上提取了 0.3 BTC,此时 BTC 的价格是 2000 美元。
平台记录了 Alice 的总支出和总收益,分别是 480 美元和 600 美元。
这个 private DEX 平台基于 ZK 技术实现了隐私保护功能,其中完整的交易信息只对参与交易的用户可见。该平台不会公开展示完整的交易事件信息,而是提供隐私的事件信息。接下来,我们将详细说明这些隐私事件信息具体指什么,以及如何进行验证:
当存款 1000 美元时,银行账户会显示 Alice 的身份。然后 Alice 会得到一个由平台生成的资产凭证或签名。为了防止双重支付并确保合规,签名的消息必须包含超出资产细节的额外属性。这些属性包括一个唯一的资产标识符,即 Alice 的用户标识符。这些信息应该被隐藏,以保持用户的匿名性。Alice 被要求基于 ZK 技术来证明她的盲化用户标识符(the blinded user identifier)等于她的注册凭证(registration credential)。为了满足税务报告 - 客户合规要求( tax-report-client-compliance),交易所中卖出资产的收益和提现交易需要被计算。这需要在存款和交易中包括资产购买时的确切成本。为此,我们在资产凭证中引入购买价格作为额外属性。
当 Bob 存入 10 BTC 时,平台不知道 Bob 的身份。因为这笔交易并不是法币存款。
当 Alice 以 800 美元兑换 0.5 BTC 时,她使用 1000 美元的资产凭证请求两个新的凭证,分别是剩余的 200 美元和 0.5 BTC,保持隐藏其细节。平台在特定条件下批准她的请求,这些条件包括基于 ZK 技术证明她有足够的美元,确保凭证共享相同的用户标识符,确认剩余美元金额为非负,匹配 BTC 的价格与最新的凭证,并验证总交易价值等价。
当提取 0.3 BTC 时,类似于交易操作,除了被交换的资产。Alice 也在区块链上验证了以提取的 BTC 的收据。
当总支出为 480,总收益为 600 时,Alice 展示了一个带有她身份的有效注册凭证,并请求一个带有新索引的更新注册凭证,将支出和收益重置为零,并获取一个用于向监管机构展示的文件凭证。文件凭证包含 Alice 的真实身份,正确的支出 480 和收益 600,以及一些监管辅助信息。由于支出和收益被平台隐藏以避免信息泄露,Alice 应证明承诺的支出和收益等于她注册凭证中的数值,平台会进行盲签名(sign blindly)。Alice 解除盲签名并将消息签名对提交给监管机构进行税务报告。
3.2 zkOracle
假设存在一个基于区块链的农业保险智能合约,该合约根据预言机提供的天气数据来判断是否向投保的农场主支付赔偿。例如,如果某地区发生严重干旱,那么该地区的农场主就能从这个保险合约中获得赔偿。
但是,如果预言机由于某些原因错误报告了该地区的天气状况,比如实际上该地区正遭受严重干旱,而预言机却报告称降雨量正常,这种错误的信息将导致智能合约做出错误判断,从而拒绝向实际上正面临干旱困境的农场主支付赔偿。
从上面这个例子可以看出,保证预言机提供数据的准确性是至关重要的。zkOracle是基于 ZK 技术的预言机,一个无需信任且安全的预言机。以下,我们将具体介绍传统预言机和 zkOracle 的主要区别,并解释为什么 ZK 技术在其中发挥了关键作用。
传统的预言机可以被划分为三种不同的类型,我们将从以下四个维度来阐述和比较每种预言机之间的差异:
在本文中,我们专注于对 Output Oracle 和 I/O Oracle 的讨论。这两种预言机的数据均源自区块链,这意味着这些数据已经经过了区块链的验证和保护。如何保证预言机计算和传输的安全性是我们讨论的重点问题。
为了实现一个安全的预言机,我们可以对 output oracle 和 I/O oracle 进行 ZK 改造,实现 output zkOracle 和 I/O zkOracle。以下部分将比较传统 oracle、output zkOracle 和 I/O zkOracle 的工作流程,并阐述 output zkOracle 和 I/O zkOracle 在哪些方面进行了 ZK 改造。
1. Traditional Oracle
传统预言机的工作流程如图 2 所示:
步骤①:从数据源获取数据
步骤②:在 computation 组件中对数据进行计算
步骤③:将计算结果输出
图 2 Traditional Oracle
可以使用 ZK 技术对传统预言机工作流程中的步骤②和步骤③进行 ZK 改造,步骤①保持不变:
2. Output zkOracle
步骤②-ZK 改造:计算和生成 ZK 证明
在 computation 组件中基于 ZK 技术对从数据源获取到的数据进行计算,通常是排序、聚合和过滤,计算的结果是一个 ZK 证明。使计算和输出可验证。
步骤③-ZK 改造:验证 ZK 证明
步骤②计算得到的 ZK 证明可以在智能合约或任何其他环境中被验证。可以通过确认步骤②验证计算的有效性。
图 3 Output zkOracle
3. I/O zkOracle
步骤②-ZK 改造:计算和生成 ZK 证明
I/O zkOracle 的计算组件由 output zkOracle 和 input zkOracle 组成。I/O zkOracle 与前述的 output zkOracle 相比,计算的主要内容变多了,即 input zkOracle 涉及将链下的计算结果设置为智能合约调用的 calldata。这两部分的结合,使得利用复杂的链下计算来实现智能合约自动化操作成为可能。
步骤③-ZK 改造:验证 ZK 证明
步骤②计算的输出包括链上数据(作为 calldata 完成智能合约调用)和一个可验证的 ZK 证明。这个 ZK 证明可以在智能合约或任何其他环境中被验证。验证可以确认步骤②计算的有效性。
图 4 I/O zkOracle
3.3 匿名投票
在区块链上进行的投票活动,所有信息都是公开的,这会使投票者的隐私信息被潜在的攻击者获取。基于区块链的投票项目面临着两大挑战:
投票者的身份隐私:保证投票者隐私,需要使用匿名身份进行投票。
投票结果的可验证性:防止投票数据被篡改,需要设计一种机制以确保投票结果的真实性可被验证。
在基于区块链的投票项目中,如何既保护投票者的身份隐私,又确保投票结果的可验证性,是一个需要巧妙处理的问题。利用 ZK 技术,可以有效地实现这两者的平衡。
在区块链匿名投票项目中,结合使用 ZK 技术和 merkle tree 实现匿名投票并验证。我们将投票流程分为三个主要阶段:
1. 使用哈希和签名方法为投票者生成匿名身份
投票者在进行投票之前需要使用自己的真实身份信息进行资格确认和身份验证。验证通过后,他们将得到一个与自己真实身份无关的匿名身份(anonymous identity)。投票者以该匿名身份进行投票可以保护个人身份信息不被泄露。
2. 基于 ZK 技术和 merkle tree 验证投票者匿名身份
投票者使用匿名身份进行投票之前,需要验证其匿名身份,验证通过的投票者才可以投票。
使用一个Merkle tree来存储所有投票者的匿名身份,这样可以防篡改,保证投票者身份信息的完整性。
将投票者的匿名身份信息生成的身份承诺作为叶子结点,由一定数量的叶子结点构造 merkle tree。使用一个基于 merkle tree 的验证电路验证投票者的身份。验证需要三方面的数据:
当前投票者的身份承诺,记作输入目标节点(input target node)。
Merkle tree 的根节点(root node)。
输入目标节点到根节点的路径索引(path index)。路径索引表示目标节点在 merkle tree 中的位置信息,由左 0 右 1 表示。
在由输入目标节点和路径索引生成根节点的过程中,使用由兄弟节点和用户信息生成的身份承诺来确定用户的身份。为了确保用户选票的唯一性,我们使用经过哈希处理后的身份标识符和外部标识符作为投票证明。
3. 投票并验证
这个阶段可以分为以下六个步骤,如图 5 所示:
计算问题:将投票者的匿名身份插入到 merkle tree 中,并进行验证。
等价转换:将问题依次转化为 ZK 低阶电路(low-order circuit)、R1CS 结构(rank-1 constraint system)和 QAP(quadratic arithmetic program)问题,以生成验证和证明密钥的过程。
公共参数生成:为了确保 ZK 系统的安全性,需要一个可信的设置来生成用于生成证明和验证证明的公共字符串。
生成 ZK 证明:可以使用 ZK 电路为投票者生成 ZK 证明。为了产生这样的证明,需要以投票者匿名身份信息和投票信息作为 ZK 电路的输入,这一步通常在链下完成。之后,生成的 ZK 证明就会被上传到区块链上。
验证 ZK 证明:在链上验证证明,即验证投票的有效性,也就是验证投票者的投票是否满足这个电路有界系统。如果验证成功,则返回 1,否则返回 0。
投票合约(Voting contract):投票合约根据部署的验证合约和验证秘钥对投票结果进行验证。在用户与合约交互的过程中,ZK 证明的生成和验证都是基于 ZK 电路进行计算的,可以很大程度上保护投票者的身份信息。
图 5 投票验证过程
基于此,我们可以实现一个区块链匿名投票项目。
3.4 隐私拍卖
区块链公开拍卖存在一个弊端。由于区块链交易都是公开的,任何人都可以观察到投标者的出价和资金状况。如果一个投标者知道了其他投标者的出价。或者,他知道了其他投标者的身份,就可以根据区块链公开的交易信息得知此账号拥有的可用资金。这个投标者就可以根据其他投标者的出价或者可用资金来调整自己的出价以赢得拍卖。公开区块链拍卖面临着投标者身份公开和资金敞口等挑战。隐私拍卖可以防止这种不公平现象的发生。
在隐私拍卖中,投标者可以在不透露身份或可用资金的情况下提交出价。要想实现隐私拍卖,必须攻克两大难关。
保护买方身份:买方账户的身份需要保密,因为揭示账户就会揭示他们在拍卖中的可用资金。
保护卖方利益:拍卖需要防止恶意投标者(买方)提交超过他们可用资金的出价。
使用 ZK 技术来保护投标者的身份隐私,同时能够验证他们拥有出价的可用资金。
在隐私拍卖中,每一个投标者需要两个账户地址:
公开的质押账户(Public staking account):用于提前转移拍卖的入场费;
隐私账户(Private account):这个账户持有投标者用于满足中标出价的实际资金。换句话说,如果投标者成功中标,这个账户里的钱就会被用来支付中标的价格。
这两个账户地址毫不相关,其他人无法通过投标者质押账户的交易来确定隐私账户下的最高出价。
隐私拍卖的过程如下:
1. 基于 ZK 技术验证账户地址和可用资金
每一个投标者将账户地址的哈希值和可用资金的哈希值预提交至 merkle tree。基于 ZK 技术验证该用户确实拥有该账户地址,即哈希值的原像(原始数据)与账户地址和可用资金一致。
2. 验证账户防止人为抬高价格
在投标者递交报价之前,隐私拍卖合约可以检验上一位投标者的账户。为了防止同一账户人为抬高价格,上一位投标者不能和当前投标者是同一人。虽然这样的设置无法完全避免一个人同时控制两个质押账户和两个隐私账户,但需要注意的是,拥有两个账户意味着每个账户中的可用资金会减少。这进一步降低了赢得拍卖的机会,因为在资金被质押给 merkle tree 之后,将无法将其转移到隐私账户中。
3. 基于 ZK 技术验证投标者的可用资金是否高于出价
使用比较器电路(comparator circuit)来验证投标者的可用资金是否高于出价,主要验证以下内容:
比较可用资金和投标者的出价。如果比较器的 ZK 电路返回的结果是 true,表明投标者的可用资金等于或高于出价,即出价有效,否则出价无效。
该电路还包括中间检查以防止篡改证人文件(witness file)。
检查账户地址和可用资金的哈希值是否存在于 merkle tree 中。
基于此,我们可以实现一个区块链隐私拍卖项目。
4. 总结
我们不能忽视区块链项目在安全性方面所面临的挑战。ZK 技术可以为 DeFi 项目提供隐私保护功能,避免用户身份泄露和抢跑攻击等安全问题。该技术也可以为预言机提供更安全的数据验证方法。在区块链投票项目中,ZK 技术的应用可实现匿名投票,既保护了投票者的身份隐私,又能验证投票信息的真实性。在区块链拍卖项目中,使用该技术可以保护投标者的身份隐私,同时验证他们拥有足够的出价资金,从而保护卖方的利益。
然而,这仅仅是 ZK 技术潜力的冰山一角,其真正的能力远远没有被完全挖掘出来。在未来,我们期望看到 ZK 技术在更多的区块链项目中得到应用,为用户提供更好的隐私保护和安全保障。