零知识证明 - 深入理解ZoKrates

2018年 Jacob Eberhardt和Stefan Tai两位德国柏林工业大学博士生,提出了链下计算/链上验证的处理框架,并提供了在以太坊上的整个框架的工具链。链下计算/链上验证的思想很早就有,但是能提供比较完善的工具链的实属难得。目前ZoKrates使用zk-SNARK算法实现零知识证明。

https://www.ise.tu-berlin.de/fileadmin/fg308/publications/2018/2018_eberhardt_ZoKrates.pdf

本文介绍ZoKrates的思想,工具链的使用以及源代码导读。

1. 链下计算/链上验证

传统区块链整个交易或者计算(Tx)的内容都是存储在区块链上,并且每个节点都需要执行整个交易或者计算。ZoKrates将计算移到链下,并生成证明,链上只需要验证证明是否正确,从而确认相应的计算。链下计算/链上验证的方式有一些好处:1)提供隐私的能力 2)降低链上数据存储 3)减少链上的计算量。

传统的区块链和ZoKrates的区别如下图所示:

image

2. ZoKrates工具链

使用ZoKrates工具链可以很方面地提供某种计算的证明,整个流程由如下的步骤(命令)组成:

image

1/ compile - 编译电路。对于想证明的计算,需要设计和开发电路。ZoKrates采用DSL(Domain Specific Language)描述电路。ZoKrates也提供了一些常用的电路库(SHA256,椭圆曲线的计算等等)。

2/ setup - 设置。对于每个电路,在生成证明之前,必须setup一次,生成CRS。

3/ compute-witness - 生成witness。在提供了private/public输入的情况下,ZoKrates自动根据电路计算出对应的witness。

4/ generate-proof - 生成证明信息

5/ export-verifier - 导出验证工具。比如在以太坊上,export-verifier可以导出可在以太坊上部署的证明验证合约。

从电路的DSL描述,最后到生成以太坊上的智能合约的流程,如下图:

image

3. DSL电路示例

ZoKrates给出了详细的电路描述和编译的说明:

https://zokrates.github.io/

如下的电路是最简单的DSL电路描述,判断a的平方是否等于b,等于返回1,不等于返回0:

def main(private field a, field b) -> (field):
field result = if a * a == b then 1 else 0 fi
return result

field是DSL电路的基本数据类型。一个field代表一个整数,范围[0, p-1],其中p为大的质数。比如p为21888242871839275222246405745257275088548364400416034343698204186575808495617。field前面加上关键词private,说明这个field的数据是private的,属于“witness”。电路的描述文件以.code为后缀。

4. ZoKrates源代码导读

本文中使用的ZoKrates源代码的最后一个commit信息如下:

commit 87312a55e94055f14f95afeaa2790783d79a1ee5 Author: schaeff thibaut@schaeff.fr Date: Sun Jun 23 13:35:03 2019 +0200

remove invalid test case

整个ZoKrates的源代码的目录如下图:

image

zokrates_cli:命令行接口实现。

zokrates_fs_resolver: 文件系统解析。

zokrates_parser: .code电路代码解析。

zokrates_pest_ast: 解析电路为AST(Abstract Syntax Tree)。

zokrates_stdlib: 一些预实现的电路(比如,sha256函数,pedersen hash函数,ecc相关计算)。

zokrates_core: zokrates的核心逻辑代码。解析.code电路,调用bellman相关接口,实现电路的生成,proof的生成和验证。

简单的说,ZoKrates的逻辑分为三部分:CLI代码,电路的解析(pest/ast)以及调用bellman生成电路/证明。以下从CLI命令行为起点,解析逻辑相关的代码。

4.1 compile命令

compile命令编译.code描述的电路:

./zokrates compile -i sample.code

编译的逻辑在zokrates_core/src/compile.rs模块的compile_aux函数中。

image

通过zokrates_parser模块解析.code电路。电路程序的语法定义在zokrates_parser/src/zokrates.pest文件中。也就是说,电路程序使用pest库进行语法解析。进行语法解析后,通过zokrates_pest_ast模块生成ast(语法树)。最后再通过flatten模块,将电路“拍平”。最后编译后的程序,用FlatProg表示(定义在zokrates_core/src/flat_absy/mod.rs):

pub struct FlatProg<T: Field> {
/// FlatFunctions of the program
pub functions: Vec<FlatFunction<T>>,
}
pub struct FlatFunction<T: Field> {
/// Name of the program
pub id: String,
/// Arguments of the function
pub arguments: Vec<FlatParameter>,
/// Vector of statements that are executed when running the function
pub statements: Vec<FlatStatement<T>>,
/// Typed signature
pub signature: Signature,
}

也就是说,一个电路程序由一个个的FlatFunction构成,每个FlatFunction中包含参数以及一系列的FlatStatement(R1CS表达式)。解析完成的电路程序会存放在临时文件中(当前目录下的output文件中)。

4.2 setup命令

setup命令生成CRS。

./zokrates setup

ZoKrates提供几种零知识证明的方案:PGHR13, G16和GM17。默认采用G16的方案。

核心逻辑在zokrates_core/src/proof_system/bn128/g16.rs的setup函数中。

image

通过zokrates_core/proof_system/utils/bellman模块,调用bellman库中的generate_random_parameters函数生成随机数,并算出对应的CRS数据。注意,在生成CRS数据之前,需要synthesize电路生成R1CS。

4.3 compute-witness命令 compute-witness命令,指定输入参数,生成满足电路R1CS限制的所有变量对应的值。如下是示例电路对应的compute-witness的命令,示例电路对应的a为337,b为113569:

./zokrates compute-witness -a 337 113569

image

核心逻辑在zokrates_core/src/ir/interpreter.rs的execute函数中。获得满足电路的所有变量的值,就是“执行”一下电路逻辑,记录相应变量的值即可。

4.4 generate-proof命令

generate-proof命令,使用compute-witness生成的witness信息,以及setup生成的CRS数据,生成proof证明。

./zokrates generate-proof

image

核心逻辑在zokrates_core/src/proof_system/bn128/g16.rs的generate_proof函数中。调用bellman库的create_random_proof生成证明。

4.5 export-verifier命令

export-verifier命令,导出以太坊上可以部署的验证证明的智能合约。

./zokrates export-verifier

核心逻辑在zokrates_core/src/proof_system/bn128/g16.rs的export_solidity_verifier函数中。在g16.rs中,定义了一个Groth16证明验证的模版程序(其中一部分如下):

function verifyingKey() pure internal returns (VerifyingKey memory vk) {
vk.a = Pairing.G1Point(<%vk_a%>);
vk.b = Pairing.G2Point(<%vk_b%>);
vk.gamma = Pairing.G2Point(<%vk_gamma%>);
vk.delta = Pairing.G2Point(<%vk_delta%>);
vk.gammaABC = new Pairing.G1Point;
<%vk_gammaABC_pts%>
}

这个模版程序定义了一些“宏变量”(vk_a, vk_b, vk_gamma, vk_delta等等)。export-verifier函数,针对当前的电路以及CRS信息,替换相应“宏变量”,生成真实的验证电路的智能合约。

总结:

ZoKrates提出了链下计算/链上验证的处理框架,并提供了在以太坊上的整个框架的工具链。ZoKrates使用zk-SNARK算法实现零知识证明。ZoKrates的工具链,极大地降低了在以太坊上实现链下计算/链上验证的逻辑的门槛。只需要使用DSL语言编写电路,就能使用ZoKrates工具库实现链下计算,同时可以导出以太坊上对应的智能合约,实现对应电路的证明验证。

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • “区块链”作为2018年最被关注的行业,许多人对于这个陌生的领域,都会用带有千万种疑问的眼光去看待它,尤其是对一些...
    净心净心阅读 299评论 0 1
  • 01 故事发生在高中时光,他和她分在了一个班级里。从他们对视上以后,她对他有了好感,但不敢表达;他对她一见钟情,...
    七安QiAn阅读 1,028评论 0 1
  • 1.跑步 跑步,要继续跑。跑步保证了一天的旺盛精力。这几天,单位特别忙,几乎每天加班。宝宝生病了,感冒、...
    在路上_e767阅读 210评论 0 0
  • 你为它修枝修叶 但你怎么期望一朵花爱上你 人们只要欣赏花的美丽就好了
    啊晏阅读 155评论 0 0
  • 昏黄的路灯 将影子拉近了又拉长 高跟鞋与地砖的碰撞 高调的脚步声透着傲娇的孤独 和着不甘寂寞的招摇过市 统统被西装...
    卿公子的小酒馆阅读 1,116评论 39 27