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技术在其中发挥了关键作用。
传统的预言机可以被划分为三种不同的类型,我们将从以下四个维度来阐述和比较每种预言机之间的差异:
Input Oracle |
Output Oracle |
I/O Oracle |
|
用途 |
将链下数据传到链上环境 |
将链上数据传到链下环境 |
使用链下计算的自动化智能合约 |
数据源 |
链下数据 |
链上数据 |
链上数据 |
计算 |
简单(聚合,上传) |
复杂(索引,聚合,过滤,或其他复杂计算) |
复杂(索引,过滤,触发条件检查等) |
输出 |
链上数据 |
链下数据 |
链上数据和目标智能合约调用 |
在本文中,我们专注于对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技术的应用可实现匿名投票,既保护了投票者的身份隐私,又能验证投票信息的真实性。在区块链拍卖项目中,使用该技术可以保护投标者的身份隐私,同时验证他们拥有足够的出价资金,从而保护卖方的利益。