1. 首页
  2. 区块链资讯

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易

从未破费买卖输出、买卖、手续费等角度剖析 NEAR 中实现隐私买卖的方式及提高买卖池安全性和使用性的方式。

原文题目:《深度剖析 NEAR 的私密买卖功效》
撰文:NEAR Protocol

就在不久前,NEAR 宣布与 ZeroPool 确立互助关系,后者将在 NEAR 协议中增加对私密买卖功效的支持。现在,在 NEAR 的平台上,所有买卖都和比特币和以太坊一样,所有公然可查。也就是说,对于每笔买卖,提议方、吸收方和买卖金额等信息都是对外公然的。接纳这种方式能够保证每个人都有权力审计账簿,确认买卖的有用性,同时还可以有用杜绝双花征象的发生。

在许多情况下,理想的买卖方式是:只有买卖的介入者才气看到买卖的详细内容。而要知足这一要求,同时保证账簿仍然是可被验证的是一项庞大的事情,需要用到高深的密码学手艺。在这篇文章中,笔者将从手艺的角度深度剖析若何在 NEAR 系统中实现私密买卖功效,即在保证验证买卖正确性的事情不受到任何损害的情况下,使买卖的各个介入方与买卖金额等信息处于隐藏状态。下面我们切入主题:

  1. 未经破费的输出
  2. 买卖
  3. 通证充提
  4. 买卖手续费
  5. 未来生长
  6. 结语

未经破费的输出

在 NEAR 生态里,我们一样平常使用账户模子作为记账方式,私密买卖使用的则是 UTXO (未经破费的输出)模子。每一个 UTXO 都是一个元组,包罗数额,吸收方,salt 三个元素,其中数额指买卖金额,吸收方其实是通证吸收方的公钥,而「salt」只是一些随机数。

所有的 UTXO 都储存在一个默克尔树上,该默克尔树有一个预设高度,高度值的巨细决议了在该默克尔树存在的整个生命周期内,买卖池可以处置的买卖数目的上限 / 下限。

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易图:UTXO 默克尔根

默克尔树上的每一个分支(树叶)或是一个 UTXO,或是 null (空值)。每一个 null 代表一个空位,未来可以填充进一个新的 UTXO。一旦一个空值被填满后,便不能回归到初始状态。所有的分支最初都是空值状态,即都为 null。

除了吸收方,真正的 UTXO 不会透露给任何人。因此,默克尔树上的分支实际上是 UTXO 的哈希值,这也是为什么「salt」需要存在的缘故原由。若是没有了它,一旦 Alice 知道了 Bob 的公钥,就可以使用差别的数字,来验证 Bob 的公钥(哈希值)是否泛起在了默克尔树上,从而暴力破解买卖金额。此时,Bob 的买卖也就不再匿名了。

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易图: 默克尔根

买卖

假设 Alice 想私下里给 Bob 转一些通证。属于 Alice 的通证存放在 UTXO 里,通证的吸收者相当于 Alice 的公钥。为了让买卖保持私密状态,Alice 用如下形式建立了一次买卖:

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易

这笔买卖有 2 个输入和 2 个输出(输入和输出的确切数目纷歧定为 2,然则必须要相同——所有买卖都是云云),这里的输入是一些既有的 UTXO,对应默克尔树上的分支;输出则是全新的 UTXO,未来将被添加至默克尔树。

当 Alice 提议买卖时,若是她宣布的恰好是两个正在被破费的 UTXO,就会将该买卖链接至天生这两个 UTXO 的买卖上。而确立买卖池的目的恰恰是为了保证这样的链接不能被确立,以确保输入型 UTXO 不会被宣布出去。那么问题来了,若何才气确保在买卖的历程中,验证节点可以确认一笔买卖破费的是已有的 UTXO,同时又不会对外宣布正在被破费的真实的 UTXO 呢?

与众多隐私珍爱买卖引擎一样,ZeroPool 使用了一种非交互性的零知识证实(zk-SNARK)来实现私密买卖。针对某种特定盘算的零知识证实能够支持以下形式的密码证实:

  • 给定的公然输入 1,公然输入 2…
  • 已知某种私密输入 1,私密输入 2…
  • 可得到【某种结论】

此类知识证实的事情原理不在本文讨论局限之内。有关此问题的更多信息,可以点击该博客链接查询。若是想以一种最简朴的方式杀青私密买卖,知识论证可以具有以下形式:

  • 给定默克尔根以及两个哈希值 OUT_HASH1 和 OUT_HASH2,
  • 已知有四个这样的 UTXO:IN1,IN2,OUT1,OUT2,两个默克尔证实 P1 和 P2 以及一个私钥 x,
  • OUT1 和 OUT2 对应的哈希值分别为 OUT_HASH1 和 OUT_HASH2;IN1 和 IN2 中的吸收者相当于与 x 对应的公钥 X;merkel 证实 P1 和 P2 是在默克尔根已确定的默克尔树中包罗 IN1 和 IN2 的有用证实;IN1 和 IN2 中的数目之和即是 OUT1 和 OUT2 中的数目之和。

买卖则包罗 merkle_root,out_hash1,out_hash2,以及知识证实。买卖中的任何内容都不会露出输出型 UTXO 的吸收者,也不会将输出型 UTXO 链接到特定的输入型 UTXO。而且,连买卖金额这样的信息也不会在买卖历程中对外展示。

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易

举例说明:如上图所示,假设该默克尔树的第一个和第三个 UTXO 以 Alice 为吸收者,对应的金额分别为 $100 和 $17,Alice 知道这两个 UTXO,然则对树上的其他任何 UTXO 都未知。若是她想向 Bob 发送 $42,通常的做法是她会首先建立一笔买卖,这笔买卖会使用她的两个 UTXO 作为输入,同时建立两个输出:——一个向 Bob 发送 $42,另一个将剩下的 75$ 返给她自己。她将属于 Bob 的 UTXO 告诉了对方,然则其余的 UTXO 只有她自己知道,旁人无从知晓。而且,甚至连输入型的 UTXO 的哈希值也是保密的。

智能合约卖力对买卖池举行一样平常维护,一旦该合约收到了一笔这样的买卖,便会对知识证实举行验证。验证无误后,就会将两个新的 UTXO 添加至默克尔树上。

微软、IBM 与纳斯达克等 30 余机构结盟,将构建代币化国际标准

微软、IBM、纳斯达克、Hyperledger 等多家技术和金融机构宣布结成联盟 InterWork Alliance (IWA),计划为代币化生态系统制定代币分类框架、InterWork 框架与分析框架。微软,R3,IBM,Hyperledger,IWA

技术解析如何在 NEAR 中通过 zk-SNARK 实现私密交易

Bob 从 Alice 处收到 UTXO 后,会守候一段时间,直到 UTXO 的哈希值被默克尔树收录之后,他才从真正意义上获得了这些通证。

这种方式虽看似简朴,但存在一个问题,即相同的 UTXO 可能会被重复使用。由于除了 Alice 没有人知道输入型 UTXO 的哈希值,买卖池便无法将已消耗的 UTXO 从默克尔树上移除,由于连它也不知道先从哪个最先移除。

若是 Alice 建立 2 个差别的零知识证实,然则消耗了同样的 2 个输入,每个人都能验证两笔买卖消耗了一些原本存在于默克尔树上的 UTXO,然则却无法得知两笔买卖中消耗的 UTXO 其实是一样的。为了解决这个问题,我们引入了 nullifier 的观点。简朴来说,nullifier 是 UTXO 的哈希值,同时也是 UTXO 吸收者的私钥。然后,我们将买卖的知识证实更改为以下内容:

  • 给定默克尔根,以及两个哈希值 OUT_HASH1 和 OUT_HASH2,另外两个哈希值 NULLIFIER1 和 NULLIFIER2,
  • 已知有四个这样的 UTXO:IN1,IN2,OUT1,OUT2,两个默克尔证实 P1 和 P2 以及一个私钥 x,
  • OUT1 和 OUT2 对应的哈希分别是 OUT_HASH1 和 OUT_HASH2;IN1 和 IN2 中的吸收者相当于与 x 对应的公钥 X;默克尔证实 P1 和 P2 是在有确定的默克尔根的树中包罗 IN1 和 IN2 的有用证实;IN1 和 IN2 中的总和即是 OUT1 和 OUT2 中的总和;而且 hash (IN1,x)即是 NULLIFIER1,hash (IN2,x)即是 NULLIFIER2

请注重,任何破费特定 UTXO 的买卖盘算的都是相同的 NULLIFIER 值,由于 NULLIFIER 仅取决于 UTXO 的哈希值和 UTXO 中公钥对应的私钥。由于上述知识证实中的 NULLIFIER 是在公然的「给定」语句(Clause)中,因此若是曾经宣布过使用相同 UTXO 的两笔买卖,每个人都可以得知它们具有相同的 NULLIFIER,并舍弃后泛起的那笔买卖。同样值得注重的是,只要用于盘算它的哈希是抗原像攻击的,NULLIFIER 就不会显示有关输入型 UTXO 或吸收方私钥的任何信息。

通证充提

上述类型的买卖可用于池内资产的转移,但对于一个功效完善的买卖池来说,必须同时支持池内外的资金转移。因此,我们在私密买卖的花样中加入了一个分外的字段,称为 delta,云云一来,输入型 UTXO 的总量就即是输出型 UTXO 数目+delta。

  • 给定默克尔树,两个哈希值 OUT_HASH1 和 OUT_HASH2,另外两个哈希值 NULLIFIER1 和 NULLIFIER2,以及一个 delta 值。
  • 已知对于 IN1,IN2,OUT1,OUT2 计 4 个 UTXO,两个默克尔证实 P1 和P2,另有一个私钥 x,
  • 则 OUT1 与 OUT2 对应的哈希值分别为 OUT_HASH1 和 OUT_HASH2;IN1 和 IN2 中的买卖吸收方相当于与私钥 x 对应的公钥 X;默克尔证实P1 和 P2 是有给定哈希根的包罗 IN1 和 IN2 的 merkel 树的有用证实;IN1 和 IN2 数目即是 OUT1,OUT2 数目总和再加上 delta 值;hash (IN1,x)即是 NULLIFIER1;hash (IN2,x)即是 NULLIFIE2R。

需要注重的是,delta 在给定语句中,因此是公然的。NEAR 在处置上述类型的买卖时,若 delta 值为负(即一笔私密买卖中输入通证比输出通证少),多出来的通证会存入买卖提议方的账户中;若 delta 值为正(即一笔私密买卖中输入通证比输出通证多),则只有在剩余通证被补足时买卖才有用。

买卖手续费

私密买卖克制在新建立的 UTXO 和曾被用作买卖输入的 UTXO 之间确立联系。不外对于任何将被记录在 NEAR 链上的买卖而言,买卖的发出者都必须支付 gas 费。也正是由于这个缘故原由,该发出者的账户中必须有一定数目的 NEAR 通证。该账户可能不知通过什么手段获得了一些 NEAR 通证,从而在上文提到的两种 UTXO 之间建立了某种联系,私密买卖的目的会因此大为受挫。

为了解决这个问题,我们在系统中引入了中继者(Relayer)的观点。假设 Alice 想给 Bob 发送一笔买卖,并计划让 Ryan 充当中继者。这笔买卖的 gas 用度小于Ⓝ1,而 Alice 愿意支付给 RyanⓃ1,让 Ryan 帮他把买卖上链。

Alice 甚至可能都没有 NEAR 账户,此时的她建立了一笔私密买卖。在这笔买卖中,作为买卖输入的两个 UTXO 的资金总额比作为买卖输出的 UTXO 的资金总额正好少Ⓝ1。剩余的Ⓝ1 被提取至买卖提交方的账户中。Ryan 从 Alice 处收集到这笔买卖信息,验证其有用性,并用自己的账户提交买卖。整个历程消耗的 gas 费小于Ⓝ1,然则他最后却得到了Ⓝ1 的酬劳 。

Alice 最终在没有露出自己身份的情况下提交了一笔买卖,Ryan 则获得了一笔小额的回报。请注重在交互中,任何一方都无需取得他人的信托:Ryan 不能以任何形式窜改买卖,留给他的只有两个选择:要么提交,要么放弃。因此,对于 Alice 来说最大的风险就是她的买卖可能没有被提交(这种情况下她可以请另一个中继人)。由于 Ryan 在买卖提交之前就验证了买卖,因此除非另一个中继人捷足先登,否则 Ryan 便不会有破费了 gas 却得不到回报的风险。

未来生长

上文形貌的这种模子已经是一个可以完全知足私密买卖的买卖池了。接下来,笔者会从几个方面简要形貌一下若何提高买卖池的安全性或使用性。

支付

在我们形貌如上买卖的历程中,笔者曾提到当 Alice 悄悄将通证发给 Bob 的同时,也将新建立的 UTXO 分享给了对方。这一历程的实现需要 Alice 与 Bob 在链下交流,而这是我们不希望看到的。为了解决这一问题,我们可以对买卖池举行扩展,使其可以存储所有的用买卖吸收方的公钥加密的 UTXO。当 Alice 将资产转给 Bob 并建立 2 个新的 UTXO 后,Bob 作为吸收方,其公钥会被 Alice 用来对 UTXO 加密。

再来看 Bob,他监控着所有新建立的 UTXO,并试着用自己的私钥对其逐个解密。一旦他试到 Alice 建立的 UTXO,则解密乐成——这样,Bob 就完全通过 NEAR 特有的链上相同的方式发现了他们的 UTXO。

解耦署名与证实

当 Alice 建立一笔买卖后,她需要使用自己的私钥信息,设计一个庞大的证实。因此,盘算该证实的机械需要获取她的私钥,而这是我们不愿意看到的。总的来说,私钥最好用某些外部的硬件装备加以存储,这类硬件的功效通常会对照单一,好比有些产物只有新闻署名这一个功效。对于这种硬件来说,运算知识证实通常在他们的功效之外。

为了适配这些硬件,我们天生 3 个密钥,而不是传统的公私钥对:私钥,解译钥和公钥。在这种情况下,用公钥加密的某条信息可以使用解译钥来解密。同理,私钥署名可以通过解译钥来验证。只有公钥是人人都能看到的。解译钥被储存在一个运算买卖证实的装备上,而私钥被储存在外接装备中,该装备只能对信息举行署名。我们可以使用以下方式对知识证实做一些修改:

  • 给定默克尔根,两个哈希值 OUT_HASH1 和 OUT_HASH2,以及另外两个哈希值 NULLIFIER1 和 NULLIFIER2
  • 已知有 IN1,IN2,OUT1,OUT2 四个 UTXO,两个默克尔证实 P1 和 P2,一个解译钥 d 和一个署名 s。
  • OUT1,OUT2 对应的哈希值为 OUT_HASH1 和 OUT_HASH2;IN1 和 IN2 中的吸收方相当于和 d 对应的公钥 X;默克尔证实 P1 和 P2 是给定哈希根的默克尔树包罗 IN1,IN2 的有用证实;IN1 与 IN2 数目之和即是 OUT1 与 OUT2 的数目之和;hash (IN1,d)即是 NULLIFIER1;hash (IN2,d)即是 NULLIFIER2,s 是 message (IN1,IN2,OUT1,OUT2)的署名、并对于 d 有用。

当 Alice 想要建立一笔买卖时,她会使用硬件装备署名(IN1,IN2,OUT1,OUT2),然后使用署名 s 在只能获取解译钥的机械上天生证实。需要注重的是,若是无法使用硬件装备,Alice 就无法天生署名 s,也就不能花出这笔钱——纵然获取了用于天生证实的机械的使用权限也不行。

支持更多通证

私密买卖并不仅仅局限于 NEAR 通证。开发人员只需作稍微调整,便可让买卖池可以支持任何发行在 NEAR 平台上的通证。详细的实现方式本文不再赘述。

结语

除了与 NEAR 互助之外,ZeroPool 也在为以太坊搭建私密买卖功效。现在团队生长所需的资金主要来自于社区,热心的读者可以在 Gitcoin 上支持他们。

泉源链接:mp.weixin.qq.com

原创文章,作者:链大大,如若转载,请注明出处:http://www.chaindada.com/chain/2888.html