Skip to content

Latest commit

 

History

History
211 lines (152 loc) · 7.05 KB

README.zh.md

File metadata and controls

211 lines (152 loc) · 7.05 KB

Adjoint Logo

Build Status Build Status

零知识证明

ZKP是一种实用的零知识证明系统,可提供为任意计算提供小型、计算效率高的零知识证明。 该系统使我们能够以廉价且快速的验证时间构造简洁的非交互式证明。

该协议允许不受信任的各方彼此进行交易,而无需共享信息。

这是用于构建zk-SNARK的密码库。该库可为财务分布式数据库实现交易隐私。

下图描述了证明生成系统的拓扑。

Groth16

编译步骤

  • 电路构造
  • 可信设置
  • 证明生成
  • 证明验证

程序构造

程序构造是由其他库开发的,这些库产生一个标准的JSON协议文件,该文件描述了门的功能组成,这些门计算加法,乘法和导线的算术运算。

该库可以直接使用任何其他以JSON作为其交换格式编译器或库。

算术电路包提供了电路构造语言的参考库。

arithmetic-circuits

可信设置

可以从命令行运行可信设置。 这将生成特定电路设置所需的一次参数。 设置参数可以随后销毁,也可以在Shamir秘密共享配置中分发。 Shamir共享允许一个n-of-m的设置,其中至少需要n个参与者组合其秘密部分以重建可信设置。

zkp setup --prover Groth16 --input samples/example1.json -o setupdir

这将在setupdir目录中生成可信设置参数,即BN254椭圆曲线的素数域Fr中的五个随机参数(α,β,𝛾,δ,x)。

RandomSetup
  { setupAlpha =
      P 12256559805687004284032990640481138455228350420895296477627313054450750333538
  , setupBeta =
      P 4401553107086663101145669242467980542018664489189708849056812824771109996937
  , setupGamma =
      P 11751086019938025633396747311851452921508835627313304853903993116945166687533
  , setupDelta =
      P 168604024821165987426171350616143663866971217710026689954359697680025921731
  , setupX =
      P 17090290750981977232640417368259094286138615605287635462955897488010126230557
  }

如果您希望使用内核中的硬件熵来执行随机生成,请在可信设置过程中传递--hardware标识标志。

证明生成

对于给定的一组有效输入(--inputs),将在输出目录内部生成证明文件pi。 给定可信设置和程序输入对电路进行求值,将生成简洁的零知识证明。

zkp prove --input samples/example1.json -d setupdir --inputs samples/inputs1.json --pi proof

这将生成一个π证明项,该项由双线性映射A : G2,B : G1和 C:G1 中的三个项组成。

Proof
  { proofA =
      A (P 4881623700312852323508547682818174690864977127565225101692969747455865314076)
        (P 21226270279582811012422188678741405568697460494611910557066940647978844558004)
  , proofB =
      A (E (P 20323099801991325872207033941577805160427313780137510282152872074461606067272 *
              X +
              P 1422252355533785307633747654423585463232482725315893764382065912760224949248))
        (E (P 3567658277931205602889970963406800124094834788390622140804820116722346374274 *
              X +
              P 15030027696371368845331628915595104373945089162840261486371773861661834388966))
  , proofC =
      A (P 21113978983642622273905001525315900726975017023639887701995527379031005434733)
        (P 1703880359115562486637532379447225273456712398817044635461020607254025768226)
  }

证明验证

验证算法将受限的公共参考字符串和证明项(--pi)作为输入,计算最终配对操作以验证随后证明的完整性,并以拒绝或接受作为退出码返回。

zkp verify -d setupdir --inputs samples/inputs1.json --pi proof

椭圆曲线

该证明系统使用椭圆曲线操作的多态表示形式,使我们可以在多个椭圆曲线上实例化证明者,其中包括:

  • BLS12-381
  • BN254

从源代码编译

该库在Haskell编译器的8.x上编译。 要安装GHC,请使用ghcup

ghcup install 8.6.5

设置GHC后,下载此库并使用cabal进行构建。

git clone git@github.com:adjoint-io/zkp.git
cd zkp
cabal new-install --installdir=.
cp ./zkp ~/.local/bin

另外,您可以使用Stack和如下命令构建库:

cd zkp
stack install

Docker镜像

可以在Docker镜像内构建和运行zkp可执行文件:

$ docker build -t zkp .
$ docker run -ti zkp /bin/bash

验证

这是可选步骤,仅适用于开发人员。

一系列关于refinement types的规范丰富了ZKP,这些refinement types可以在LiquidHaskell框架中进行检查。 LiquidHaskell分析模块,并将证明义务交给SMT求解器,以查看条件是否可满足。 这使我们能够证明在内存安全性,算术异常和信息流方面不存在一系列错误。

您将需要Microsoft Research Z3 SMT求解器或Stanford CVC4 SMT求解器。

对于Linux:

sudo apt install z3 # z3
sudo apt install cvc4 # cvc4

对于Mac:

brew tap z3 # z3
brew tap cvc4/cvc4 # cvc4
brew install cvc4/cvc4/cvc4

然后使用Cabal或Stack安装LiquidHaskell:

cabal install liquidhaskell
stack install liquidhaskell

然后可以在该项目中的加密模块上运行验证。

liquid -f --cabaldir -i src -i spec src/Poly.hs
liquid -f --cabaldir -i src -i spec src/Protocol/Groth.hs

库依赖

该系统取决于以下依赖性。