#stark #zkp #wasm #no-std

no-std zkp-stark

STARK 零知识证明系统的实现

4 个版本

0.2.1 2020年10月19日
0.1.2 2019年10月7日
0.1.1 2019年10月7日
0.1.0 2019年10月7日

#569 in 加密学

Apache-2.0

1MB
15K SLoC

OpenZKP Stark

Crates.io CircleCI Codecov

STARK 零知识证明的开源实现。

STARKs 是由 Eli Ben-Sasson、Michael Riabzev、Lior Goldberg 等人和 Starkware Ltd. 开发的一系列协议。实现的特定 Stark 协议变体是(Starkdex alpha 使用的近似)一个。此 Stark 协议具有 "StarkDEX 深度分析" 第 III 部分(见 参考文献)中描述的优化。

示例

use zkp_stark::{*, primefield::*};

struct FibonacciClaim {
    index: usize,
    value: FieldElement,
}

impl Verifiable for FibonacciClaim {
    fn constraints(&self) -> Constraints {
        use RationalExpression::*;

        // Seed
        let mut seed = self.index.to_be_bytes().to_vec();
        seed.extend_from_slice(&self.value.as_montgomery().to_bytes_be());

        // Constraint repetitions
        let trace_length = self.index.next_power_of_two();
        let g = Constant(FieldElement::root(trace_length).unwrap());
        let on_row = |index| (X - g.pow(index)).inv();
        let every_row = || (X - g.pow(trace_length - 1)) / (X.pow(trace_length) - 1.into());

        let mut c = Constraints::from_expressions((trace_length, 2), seed, vec![
            (Trace(0, 1) - Trace(1, 0)) * every_row(),
            (Trace(1, 1) - Trace(0, 0) - Trace(1, 0)) * every_row(),
            (Trace(0, 0) - 1.into()) * on_row(0),
            (Trace(0, 0) - (&self.value).into()) * on_row(self.index),
        ])
        .unwrap()
    }
}

impl Provable<&FieldElement> for FibonacciClaim {
    fn trace(&self, witness: &FieldElement) -> TraceTable {
        let trace_length = self.index.next_power_of_two();
        let mut trace = TraceTable::new(trace_length, 2);
        trace[(0, 0)] = 1.into();
        trace[(0, 1)] = witness.clone();
        for i in 0..(trace_length - 1) {
            trace[(i + 1, 0)] = trace[(i, 1)].clone();
            trace[(i + 1, 1)] = &trace[(i, 0)] + &trace[(i, 1)];
        }
        trace
    }
}

pub fn main() {
    let claim = FibonacciClaim {
        index: 5000,
        value: FieldElement::from_hex_str("069673d708ad3174714a2c27ffdb56f9b3bfb38c1ea062e070c3ace63e9e26eb"),
    };
    let secret = FieldElement::from(42);
    let proof = claim.prove(&secret).unwrap();
    claim.verify(&proof).unwrap();
}

/examples 文件夹中还有更多示例

  • small_fiblarge_fib
  • mimc_cubic 由编织工协会提供(来源)。
  • mimc_quadratic 由编织工协会提供(来源)。
  • vdf 由 Matter Labs 提供(来源)。
  • pedersen_merkle 由 Starkware 提供。

功能和限制

功能

简单的接口。 公共接口简单,被认为是 semver-stable。预期未来版本将添加功能而不会破坏此接口。

简洁的证明。 对于给定的安全性参数,证明大小接近最小值。在此处取得重大改进将需要创新约束系统设计或底层加密方式。

良好的性能。 证明的所有步骤都使用渐近最优算法,所有主要步骤都使用多线程。没有硬性内存要求。我们预计通过微调可以获得相当多的性能改进,但我们不期望有数量级的改进。

WebAssembly 支持。 验证器可以在不使用 Rust std 库的 WebAssembly 环境中使用。证明者也可以工作,但不是优先考虑的事项。

限制

无高级语言。 使用它们的代数表达式指定约束。这要求库用户进行复杂且仔细的设计,容易出错,导致不安全的系统。高级语言将有助于简化开发并提高安全性,并促进组件的重用。

无全面的安全审计。 虽然开发时考虑了最佳安全实践,但仍处于早期阶段,尚未达到生产级系统所需的大量专家同行评审。

没有完美的零知识。 当前实现提供简洁的证明,但不是完美的零知识。虽然非平凡,但理论上可能了解一些关于秘密的信息。实现完美零知识是可能的,并且可以实施。

没有抵抗侧信道。 实现优先考虑性能而不是侧信道抵抗。虽然这在零知识证明系统中很常见,但你应该意识到这可能会泄露中间计算。侧信道抵抗可以实施。

硬编码的字段和哈希。 当前实现使用特定的素域和特定的哈希函数。这些是为了在以太坊虚拟机中的验证而优化的。这可以推广到其他针对其他用例优化的原语。

参考文献

  • Eli Ben-Sasson, Iddo Bentov, Ynon Horesh, Michael Riabzev (2018)。"快速Reed-Solomon交互式接近性证明"。 eccc.weizmann.ac.il
  • Eli Ben-Sasson, Iddo Bentov, Yinon Horesh, Michael Riabzev (2018)。"可扩展、透明和后量子安全的计算完整性"。 eprint.iacr.org
  • Eli Ben-Sasson, Lior Goldberg, Swastik Kopparty, Shubhangi Saraf (2019)。"DEEP-FRI:超出框外采样提高正确性"。 arxiv.org
  • Starkware的stark mathstarkdex系列。
  • Starkware的Starkdex 验证合约
  • StarkwareMatter Labs提供的资源概述。

依赖关系

~2–3.5MB
~68K SLoC