3.3.Mina:零知识智能合约Snapp 在主链和外部应用环境之间进行数据计算协同工作,为了使得最终的结果达成共识,需要证明每次计算使用的数据与链上的区块中数据一致。对于存储在一连串历史区块中的数据,在主链和外部应用环境之间,如何以较轻便的、去中心化的方式来验证数据的有效性?Mina作为目前最为轻量级的公链平台,通过递归零知识证明将区块链替换为易于验证、区块大小恒定的加密证明,不必穷尽所有区块,而以最新区块(21kb左右)就可以实现验证。这样大幅减少了每位用户需要下载的数据量,降低用户点对点连接的门槛,提高了网络的去中心化程度。 一般区块链公链整个账本数据量非常大(如比特币账近400G),且按照时间顺序分散在很多区块中,为数据验证带来较大是负担。Mina则使用递归zk-SNARK(零知识证明)实现验证证明,只需要把每个区块中的交易做一次验证证明,然后将证明存入区块中,且不会为每一个区块单独做一次证明,而是每一次新区块做证明时连带上一次的区块证明一起生成一次证明,存入最新区块。可以简单理解为,类似套娃一样,最新区块将本区块内的数据和前一个区块的验证证明数据一起做一个类似快照的证明。这样,每一个区块都只需要一个次证明结果,就可以将所有历史区块的数据证明包含在内。举一个例子比喻,旅行者为了证明自己到过哪些景点,可以每到一个景点便打卡拍照,且下一次景点拍照时候手拿上一次景点照片一起拍照,如此递归下去,每一张照片都套娃式的包含了前面所有景点的打卡信息,那么只需要一张最新的照片,就能够证明该旅行者确实到过所有的景点。 这样就实现了一种效果:区块链上储存的全都是交易正确性的证明,而非交易本身。因为前面说到的这种证明占用空间很小,因此区块的大小得以被压缩。 在此基础上,Mina开发了更具可延展性以及以隐私为中心的Dapp——Snapp。Snapp由智能合约和UI界面两部分组成。由于Snapp基于零知识证明(zk-SNARKs)构建,开发者需要构建证明者函数和相应的验证者函数来生成和处理零知识证明。 证明者函数作为Snapp的一部分直接运行在用户的web浏览器,当用户与Snapp的UI界面交互时,用户需要将私有数据输入(PRIVATE INPUTS)和公共数据输入(PUBLIC INPUTS)提交给证明者函数以生成零知识证明。 在生成零知识证明之后,不再需要用户提供任何私有数据输入,进而保护用户隐私安全。验证者函数则用于验证零知识证明是否通过了证明者函数中定义的所有约束函数(也就是数据是否有效),一般由Mina网络完成验证。 具体运行上,证明功能在用户的web浏览器上完成,其生成的零知识证明(验证密钥)则会被存储在给定Snapp账户的链上,之后发送至Mina网络进行验证。因此,交易的生成和数据计算在链下完成,同时该过程会生成可用于验证交易的零知识证明,而用户原始私有数据隐私是得到充分保护的。链上只负责对该证明进行验证,通过验证后将其上链保存,并对Snapp的状态进行更新。 (责任编辑:admin) |