BSV 上的 zk-SNARKs

在此之前,我们已经使用零知识证明(ZKP)证明了一个人知道一些数学秘密,而无需透露秘密本身。

秘密知识包括:

虽然在其特定应用中很有用,但这些零知识证明不能应用于任意数学函数。zk-SNARK(零知识简洁非交互式知识论证)是一种旨在为任何数学函数生成零知识证明的协议,克服了这些限制。生成的证明是“简洁的”和“非交互的”:一个证明只有几百字节,可以在恒定时间内,甚至在几毫秒内得到验证,无需向证明者提出额外的问题。这些特性共同使 zk-SNARK 特别适用于区块链,即使其中链上存储和计算可能很昂贵,并且发送者在发送交易后经常会离线。 Zcash 和智能合约平台 Ethereum 是其著名的早期采用者之一。

zk-SNARK

一个 zk-SNARK 由以下三种算法组成:GPV

在这里插入图片描述

密钥生成 (Key Generation)

密钥生成器 G 采用秘密参数 λ 和函数 C,并生成证明密钥 pk 和验证密钥 vk。两个密钥都是公开的。

在这里插入图片描述

Key Generator

C 是一个布尔函数(也称为程序或电路),它接受两个输入:
公共输入 x 和私有输入 w(又名见证人或知识)。例如,C 可以是一个检查 w 是否是摘要 x 的 sha256 原像的函数。

C(x, w) = sha256(w) == x

证明者

证明者 P 将证明密钥 pk、公共输入 x 和秘密的见证人 w 作为输入,以生成证明者知道见证人 w 的证明,该见证人 w 使 C(x, w) 返回真。

在这里插入图片描述

验证者

验证者 V 获取验证密钥 vk、证明和公共输入 x,并且仅当证明是在见证人 w¹ 的知识下生成时才接受。

在这里插入图片描述

Verifier

实现

在区块链中使用 zk-SNARK 时,密钥和证明的生成都是在链下执行的。只有通用验证算法在链上智能合约中运行。文献中有多种 zk-SNARK 方案。我们实现了使用最广泛的方案 Groth16,因为它的证明尺寸小且验证速度快

在这里插入图片描述

Groth16 中的验证器:第 18 页

下面列出了基于我们的椭圆曲线算术配对库的完整代码。

import "pairing.scrypt";

// point in G1
struct G1Point {
    int X;
    int Y;
}

// point in G2: encoding of field elements is X[0] * z + X[1]
struct G2Point {
    int[2] X;
    int[2] Y;
}

struct VerifyingKey {
    G1Point alpha;
    G2Point beta;
    G2Point gamma;
    G2Point delta;
    G1Point[N_1] gamma_abc;
}

struct Proof {
    G1Point a;
    G2Point b;
    G1Point c;
}

// zk-snark verification
library ZKSNARK {
    // number of inputs
    static const int N = 2;
    static const int N_1 = 3;

    static function verify(int[N] inputs, Proof proof, VerifyingKey vk) {
        G1Point vk_x = vk.gamma_abc[0];
        loop (N) : i {
            G1Point p = EC.multByScalar(vk.gamma_abc[i + 1], inputs[i]);
            vk_x = EC.addPoints(vk_x, p);
        }

        // pairing check
        require(Pairing.pairing(proof.a, proof.b) == Pairing.pairing(vk.alpha, vk.beta) * 
                Pairing.pairing(vk_x, vk.gamma) * Pairing.pairing(proof.c, vk.delta));
    }
}
ZKSNARK 合约源代码

值得注意的是,无论被证明的函数 C 有多复杂,证明大小(第 23-27 行)和配对数(第 43-44 行)都是恒定的。

总结

zk-SNARK 是区块链隐私和可扩展性的强大基础。今天我们只展示了 zk-SNARK 是什么以及如何在 BSV 上实现它。我们将在不久的将来探索如何使用它。它为什么以及如何在内部工作,这是相当繁重的数学问题,超出了本文的范围。有很多优秀的教程,比如这个系列这篇论文


[1] 有一个例外。任何人都知道生成器中使用的秘密参数 λ 可以在不知道见证人的情况下生成虚假但有效的证明。这就是为什么它被称为有毒废物。在完成受信任的设置阶段之后必须将其丢弃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sCrypt Web3应用开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值