Zkopru 这个名称是由zk-transaction + Optimistic Roll-Up 的字首组成,这个layer 2 的协议包含了使用零知识证明来保护交易的隐私( zk-transaction)、再搭配Optimistic Rollup 来管理layer 2 。
它和Zk Rollup 有什么不同?
Zk Rollup连同layer 2的链的state transition都是由零知识证明来处理,但缺点是目前零知识证明技术的成本较高,包含在链下产生证明和在链上验证证明(链下产生证明耗费时间,链上验证证明则耗费gas)。
注:接下来提到的(零知识证明、circuit)的链下成本都是指时间多寡,而链上成本则都是指gas多寡)
另外目前的Rollup协议都是使用merkle tree来储存当前的链的状态(例如使用者的余额、nonce或是UTXO) —如果使用者要证明他有$20,则他必须要提供merkle proof ,而这个merkle proof的大小及hash次数也会因为选择的merkle tree的高度而有不同。
而这个因素再搭配上hash的成本在EVM和circuit会有不同,导致协议如果使用在EVM成本较便宜的hash function,则circuit的hash成本会较高;反之亦然。
目前还没有安全的hash function 是在EVM 或circuit 里都是便宜的,所以协议设计者必须做出妥协。可想而知,Zk Rollup 便是使用在circuit 便宜但是在EVM 贵的hash function,这导致当使用者要离开layer 2 回到layer 1 时(这个步骤在这里称作withdraw),他成本会很高(因为要在EVM 里验证他持有资产的拥有权,这可以是一个merkle proof 或zk proof)。
和Optimistic Rollup 有什么不同?
而这个成本相对的也反映了采用Optimistic Rollup 的好处— 只有在特殊情况下(例如协议里的Operator 作恶)才需要付出较高的成本,其他时间大家则享受极低成本的使用费。
但使用Optimistic 的方式也有附带的缺点: challenge period 。轻节点使用者需要等待challenge period 来确保交易不会被推翻、withdraw 过程需要等待challenge period(以下称withdraw period) 过了才能将钱提回到layer 1。
所以使用哪种Rollup 就要看协议设计者如何依照他们的使用需求去权衡。
那为什么不使用Optimistic Rollup 就好?
因为需要零知识证明来保护交易隐私!
前提
- zkopru 使用和Bitcoin 相同的UTXO model
-
transfer的付款方、收款方和金额都是被保护住、看不到的,但zkopru和其他隐私币一样,不需要付款方和收款方合作即可由付款方单独完成transfer。
但也和隐私币一样,收款方必须去监看链上每一笔交易并尝试解密来得知是否有人transfer给自己
基本使用流程
Deposit
使用者将ether 、ERC20或ERC721代币转入zkopru位于layer 1的合约,触发event。协议的Operator会监看合约并搜集deposit event,然后将这些deposit一起放入下一个(zkopru的)区块里。
Transfer
如同Bitcoin的UTXO,zkopru里使用者必须要证明其对某UTXO有拥有权才能花费该UTXO。要被花费的UTXO会被放到transaction格式里的inputs栏位, outputs栏位的UTXO则是填入收款方的公钥和收款金额(outputs的UTXO就会是新产生的UTXO)。
因为要保护交易的隐私,新的UTXO的资讯是不会泄露出去的,第三方只会看到该UTXO的hash值。那收款方要怎么知道一个UTXO是不是他的呢?
sender会利用自己的私钥、收款方的公钥及一个随机值,透过密钥交换协议来产生一个临时的共享密钥。付款方用此共享密钥加密收款方所需的资讯(包含transfer的代币种类和金额),而收款方会监看每一笔交易并试着用自己的私钥组出一个共享密钥然后去解密,如果解密完的资料不是乱码而是合理的,则可确认收到钱。
Withdraw
使用者产生withdraw类别的交易,等待协议Operator收进区块里,然后再等待withdraw period过去,即可送出merkle proof来将钱提领回layer 1。
注:提领回layer 1之后的收款方和金额都是公开透明的,隐私不再受保护。
零知识证明
zkopru 里一共有三种类型的merkle tree 来储存所需的状态,分别是UTXO tree、Nullifier tree 以及Withdrawal tree。
- UTXO tree 纪录所有产生过的UTXO,包含新的和已经花掉的。
- Nullifier tree 纪录被花掉的UTXO 的nullifier 值。一个UTXO 的nullifer 由该UTXO 的相关资讯算出,而且只能得出唯一一个nullifier。这个nullifier 能够证明该UTXO 已被花掉,但同时又不会泄露是哪个UTXO 被花掉。听起来很饶口,但这就是零知识证明的能力。
- Withdrawal tree 纪录withdraw 类别的交易的资讯,使用者要提领回layer 1 就需要这棵merkle tree 的merkle proof。也是就说,前面说的Operator 会把withdraw 交易放到这棵merkle tree 里,然后等待withdrawal period 过后,再由使用者提供merkle proof 来领走。
这里以transfer 为例来说明其中一部分的circuit 在做什么事
当使用者要产生一笔transfer,他首先要证明inputs 里的UTXO 都是合法的,这包含了证明:
- 他拥有这个UTXO — 藉由提供签章来证明
- 这个UTXO 是真的存在的— 藉由证明该UTXO 的hash 值存在UTXO tree 里
- 这个UTXO 没有被花过— 藉由证明该UTXO 的nullifier 值不存在Nullifier tree 里
接者是outputs,新产生的UTXO的hash值会被放进UTXO tree里。
最后是比对inputs金额加总等于outputs金额加总再加上交易手续费。
而这些都在circuit 里完成,第三方没办法得知实际的inputs、outputs 或nullifiers 等等,第三方只能知道新的UTXO 的hash 值以及运算过程是正确的— 也就是这些tree 都被正确的更新了。
其他特色
Mass migration
原本每个使用者要把资产换到另外一个layer 2协议,他必须申请withdraw 、等待withdraw period ,然后把资产deposit到另外一个layer 2协议。
zkopru 支持使用者成批的搬移资产到另外一个layer 2 协议— 共享经济。
Instant withdrawal
如果其他需要等待withdraw period的应用来说,withdraw period是一个UX痛点。zkopru的instant withdrawal提供急着withdraw的一方和不急着withdraw的一方一个管道能互惠。
急的一方提供一点手续费,对自己的withdraw交易做签名并广播出去。不急的一方在听到这个签名后,可以将这个签名送到zkopru合约并附上withdraw金额(扣掉自己该收的手续费)。
这笔钱会直接转给急的一方,然后急的一方的withdraw拥有权便会转移到不急的一方手上,不急的一方再慢慢等到withdraw period过了再提领。
估计效能
目前在初版的效能估计中,一笔transfer 平均耗费8800 gas;而TPS 则是105。zkopru 还在积极更新迭代中,所以这个效能会在提升。
本文链接地址:https://www.wwsww.cn/jishu/7194.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。