ZK-STARKs 由Eli Ben-Sasson在2018年提出,是一种零知识证明方案,其全称为:Zero-Knowledge Scalable Transparent Arguments of Knowledge
Zero-Knowledge:实现零知识证明
Scalable:可扩展性
Transparent:透明性,不需要可信设置
Argument of Knowledge:知识论证,只有知道 secret 的prover,才能生成有效的proof;
安全:能仅依赖抗碰撞的Hash函数,能够抗量子攻击。
效率:对于指定的计算,对于证明者,zk-STARK 比 zk-SNARK和Bulletproof快10倍;对于验证者,比zk-SNARK快2倍,比bulletproof快10倍
不足:对于证明的size, zk-STARK (200 KB 左右)是zk-SNARK(192 B)的100倍左右,是Bulletproof的20倍左右。
数学原理
ZK-STARK主要针对CI问题,即保证计算的正确性. ZK-STARK算法流程如下图,主要是一系列转化的过程,主要是将CI 问题转化为多项式处理,再利用多项式值构建Merkle树,生成Merkle path 证明。
- 算术法就是把CI问题转化为多项式形式
以Fibonacci序列为例,对于, 假如要证明, 其中 为公开输入, 为 隐私输入
(1)首先转化为执行路径(Execution Trace):
注:上表示例中, x = 3, y =4
上表需要满足以下两种约束条件:
a. 状态转移约束条件(transition constraints):
b. 边界约束条件:
即将Fibonacci计算问题转为执行路径表的验证问题。
(2)执行路径多项式插值
对于每一列,定义多项式
其中 .
通过Lagrange或FFT实现多项式插值,由此将执行路径表转为多项式验证。
(3)约束条件多项式
思考: 对于多项式f(x), 若f(1) = 0, f(2) = 0, f(5) = 0, 则必然存在: T(x) = f(x)/(x-1)(x-2)(x-5). 同理利用该性质对约束条件进行处理。
a. 状态转移多项式约束条件
b. 边界条件多项式约束条件
进行将 CI 问题转化为多项式的验证问题,可以将组合为一个多项式:
(4) Merkle树 证明
在扩域(Extended Domain)分别计算P0(x), P1(x), C(x)。然后利用P0(x) 和P1(x) 构建执行路径Merkle树, 利用C(x) 的值构建约束条件Merkle树。
随机抽样部分叶子节点,构建Merkle树path证明,由此生成proof.
- 低度测试(low-degree test)
思考:如何证明5个点,在一个2次多项式上?
如何证明10000个点,在一个200次多项式上?
将P(x)和C(x)经过处理,复合为一个多项式,然后证明其次数小于某个指定的度(degree)
例如对于多项式:
证明其度数小于d.
思路: 对于
可以写为 :
即
和 次数变成,由此于通过于递归实现实现低度测试,对于每一次递归,同样构建Merkle树,然后随机抽样一些叶子节点及基Merkle路径,形成proof。
实际证明中,每层递归多项式次数缩减4倍(实际要证明的度数为, 例如
第一层:1024个点,次数为64
第二层:256个点, 次数为16
第三层:64个点, 次数为4
ZK-STARK proof 构成
-
执行路径(trace polynomial)构建的Merkle树 root,Merkle path及对应的叶子节点;
- 约束多项式(constraint polynomial)构建的Merkle树root, Merkle path及对应的叶子节点 ;
随机z点的值: Tk(z), Tk(z*wtrace)
组合多项式(composite polynomial)的低度证明,包括每一层的Merkle root, path和叶子节点值。
验证过程:
根据复合多项式Merkle roots 确定查询位置;
验证执行路径多项式和约束多项的Merkle 证明;
计算随机点z的多项式约束值;
计算组合多项式在查询位置的值;
根据第4步的值验证组合多项式低度测试证明。
ZK-STARK 虚拟机
下面基于distaff, 介绍ZK-STARK虚拟机设计,整体框架如图所示:
-
Program:
program 是由一系列指令组成,对栈上的数据进行操作,下面fibonacci序列为例,进行介绍。
假如, 根据 , 计算 的 program 即为:
step | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
instruction | swap | dup.2 | drop | add | swap | dup.2 | drop | add | swap | dup.2 | drop | add | |
register 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 1 | 2 | 3 |
register 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 1 | 2 |
register 2 | 0 | 1 | 1 | 1 | 1 | 2 | |||||||
register 3 | 1 | 1 | 2 |
注:public inputs 作为寄存器初始状态,secret inputs 可以通过read 指令读入寄存器中。目前distaff已支持39个指令,可以实现比较,条件语句,循环,嵌套等结构,已接近图灵完备(缺少RAM(random access memory), 后面将会实现)。
- 证明生成
let options = ProofOptions::default();
let inputs = [1, 0]; // initialize stack with 2 values; 1 will be at the top
let num_outputs = 1;
let (outputs, program_hash, proof) = processor::execute(&program, &inputs, num_outputs, &options);
注:证明生成可在链下完成
- 证明验证
match processor::verify(&program_hash, &public_inputs, &outputs, &proof) {
Ok(_) => println!("Execution verified in {} ms", now.elapsed().as_millis()),
Err(msg) => println!("Failed to verify execution: {}", msg)
}
注: verify 函数可以实现任意proof 验证,因此对于所有的ZK-STARK proof, 仅需要部署一个验证合约。
性能分析
测试环境: Intel Core i5-7300U @ 2.60GHz (single thread) with 8 GB of RAM
可以通过多线程或FPGA, ASIC等加速proof的生成。
目前面临问题
- 目前仅实现汇编形式的语言对CI问题进行定义,缺少高级描述语言,使用不方便。
汇编语言:
let program = assembly::compile("
begin
push.3
push.5
read
if.true
add
else
mul
end
end").unwrap();
编译后的指令:
[begin noop noop noop noop noop noop noop push(3) noop noop noop noop noop noop noop push(5) read noop noop noop noop noop noop noop noop noop noop noop noop noop,ifassert add noop noop noop noop noop noop noop noop noop noop noop noop noopelsenot assert mul noop noop noop noop noop noop noop noop noop noop noop noop end]
- 扩展指令
目前只开发了一些基本计算功能指令,缺少专用计算功能的指令,例如要实现匿名交易,需要实现相关密码算法的指令,椭圆曲线的点加运算,perdersen承诺,hash函数等指令。
- 元素域限制
目前栈上元素定义的素域模128,即为 340282366920938463463374557953744961537 () ,未对256位大数运算进行支持。
参考资料
https://hackmd.io/@_33nsoRFQwGYh2T1-T9lqQ/rJHYnQ3Z4?type=view
https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/zk-starks/
Distaff: https://github.com/GuildOfWeavers/distaff
附:更多ZKSTARK资料:
https://eprint.iacr.org/2021/582.pdf
Stark anatomy: https://aszepieniec.github.io/stark-anatomy/
https://github.com/aszepieniec/stark-anatomy
Starkware 文档:https://medium.com/starkware/arithmetization-i-15c046390862
Vitalik: https://vitalik.ca/general/2017/11/09/starks_part_1.html
Ox.org 文档:https://hackmd.io/@_33nsoRFQwGYh2T1-T9lqQ/rJHYnQ3Z4?type=view
ethhub: https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/zk-starks/
https://github.com/matter-labs/awesome-zero-knowledge-proofs#fri-starks
FRI:https://eccc.weizmann.ac.il/report/2017/134/download/
Matter labs hodor: https://github.com/matter-labs/hodor
OpenZKP: https://github.com/0xProject/OpenZKP
ethSTARK: https://github.com/starkware-libs/ethSTARK
distaff: https://github.com/GuildOfWeavers/distaff