Zkopru这个名字由zk-transaction和Optimistic Roll-Up的首字母组成,这一层2的协议通过零知识证明保护交易隐私(zk-transaction),并结合Optimistic Rollup来管理层2。
那么它与Zk Rollup有何不同呢?Zk Rollup使用零知识证明处理层2的链状态转换,但缺点是目前零知识证明技术的成本较高,包括链下生成证明和在链上验证证明(链下生成证明耗时,链上验证证明则消耗gas)。注意:以下提到的(零知识证明、circuit)的链下成本是指时间长短,而链上成本则是指gas多少。
此外,目前的Rollup协议都是使用Merkle树来存储当前的链状态(例如用户的余额、nonce或UTXO)。如果用户要证明他有$20,则他必须提供Merkle证明,而这个Merkle证明的大小及hash次数也会因为选择的Merkle树的高度而有所不同。这个因素再加上hash的成本在EVM和circuit中会有所不同,导致如果协议在EVM中使用成本较低的hash function,则circuit的hash成本会较高;反之亦然。
目前还没有一种既在EVM又在circuit中成本都低的安全的hash function,因此协议设计者必须做出妥协。可以想象,Zk Rollup就是使用在circuit成本低但在EVM贵的hash function,这导致当用户要从层2回到层1时(这个过程在此称为withdraw),他需要支付较高的成本(因为需要在EVM中验证他持有资产的拥有权,这可能是一个merkle proof或zk proof)。
与Optimistic Rollup有何不同?这种成本相对地也反映了采用Optimistic Rollup的好处——只有在特殊情况下(例如协议中的Operator作恶)才需要付出较高的成本,其他时间大家则享受极低成本的使用费。
但使用Optimistic的方式也有附带缺点:challenge period。轻节点用户需要等待challenge period来确保交易不会被推翻、withdraw过程需要等待withdraw period过了才能将钱提回到层1。
因此,选择使用哪种Rollup取决于协议设计者如何根据他们的使用需求进行权衡。
那么为什么不用Optimistic Rollup呢?因为需要零知识证明来保护交易隐私!
前提是zkopru使用与Bitcoin相同的UTXO模型,付款方、收款方和金额都是被保护住的,看不见的。但zkopru和其他隐私币一样,不需要付款方和收款方合作,付款方可以单独完成transfer。但也和隐私币一样,收款方必须监看链上每一笔交易并尝试解密来得知是否有人transfer给自己。基本使用流程如下: Deposit:用户将ether、ERC20或ERC721代币转入zkopru位于层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来将钱提领回层1。注意:提领回层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类别的交易的资讯,用户要提领回层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还在积极更新迭代中,所以这个效能会在提升。标签: 数字货币