Layer2 系统的安全性和效率取舍
感谢 Matter Labs 提出关于部分 L1 数据链上可用性的问题,我们一直以来都非常重视社区的声音,并会根据社区的需求修改方案。因此,我们想借着这次机会向大家分享 ZKSwap 开发团队辛勤工作所交付的产品背后的一些思考。
经过非常谨慎细致的思考之后,为了 TPS 和 Gas fee 的效率,我们决定将 ZKSwap 的 L2 转账放在链下。在 ZKSwap 的设计中,L1 相关的数据在链上,L2 相关的数据,比如转账和交易,存在链下。尽管存在链下,这部分数据也会被验证者实时公布。
例如,L2 区块 7831:
https://api.zkswap.info/block/7831/pub-data
三种转账类型
ZK-Rollup 协议中,一个区块可以包括三种类型的转账:
类型 1:来自 L1 的存款和创建 AMM 交易对的转账;
类型 2:L2 发起且只能被 L1 验证的转账。比如,公钥转账将需要 L1 签名来确保 L1 账户的密钥所有者能将他们的账户与 L2 账户关联起来,因为电路不能检查确认 L1 的签名;
类型 3:由 L2 签名验证而无法被 L1 验证的转账。
ZKSwap 安全模型
一个区块内记录的 L2 转账在 L1 上只有部分记录。只有区块信息的总结会被记录在 L1 链上,例如区块哈希、新默克尔根、区块高度等等。
当一个区块的转账被提交到 L1 上,区块就被创建出来,区块哈希会被验证。由于 以太坊 内建了 sha256 算法,所以区块哈希通常也使用 sha256 进行计算。
为了保持数据可用性,所有的转账数据都应该被提交到 L1 上,这被称为「公开数据」。一笔转账的公开数据与其在 L2 上的转账并不完全相同。系统在进入「退出模式」时将使用公开数据,这样任何人都能恢复最近的经过验证的默克尔树。
电路
L2 的电路与 L1 的智能合约能够协同工作,确保 ZK-Rollup 协议的功能性。L2 的电路保证了以下几点:L2 转账签名正确、L1 / L2 转账执行正确、区块信息计算正确、及时有效地更新账户信息——包括默克尔根、账户默克尔树和费用信息等等。
双验证模式
验证模块对与安全性来说十分重要,是 ZK-Rollup 协议的基础。
公开数据验证——验证第一类和第二类转账的内容和次序。例如,验证存款需要确保存款数额和信息与 L1 上记录的相同,并且顺序无误。
区块验证——验证一个区块里的转账被正确执行,并且 L2 的账户默克尔树根被及时恰当地通过零知识证明进行更新。当一个区块被验证之后,更新的默克尔根就取得了最终性。
总结来说,整体的安全假设如下:
· 一个区块的所有转账公开数据在链上;
· 验证一个区块中第一类和第二类转账被正确执行;
· 证明一个区块内的所有转账被正确执行、账户默克尔树被正确更新、一个区块内的所有转账的公开数据能够匹配;
· 证明该区块内所有公开数据都被正确计算;
· 提交给 L1 的区块公开数据与零知识证明系统所证明的数据相同。
公开数据不上链时会发生什么?
如果公开数据不在链上,安全假设「提交给 L1 的区块公开数据与零知识证明系统所证明的数据相同」就不能被验证。这时候,当 L2 的零知识证明系统阵营所有转账都被正确执行、默克尔树都被正确更新时,只能说明一个区块内的转账有效,而不能证明来自特定区块的其他转账。
大多数第三类转账都是安全的,但是对于提现操作来说,提现的收款人未经验证,不能被零知识证明系统证明。
对于第一类转账来说,所有可能的第一类转账都能被证明,但不能被验证。类如,零知识证明系统能证明一些非 L1 发起的存款转账。
由于只有验证着能提交公开数据或者区块证明,所以社区必须信任验证者是诚实的。当验证者诚实时,以上所有的风险都不会存在。对 ZKSwap 来说,所有公开数据都在浏览器中同步公布,任何人都可以验证公开数据和任何链上区块。
将公开数据存在链下不是一个草率的决定。这个选择背后的主要原因是降低 Gas 费和提高可扩展性。
Gas 费用
保持 ZK-Rollup 协议运行的一个痛点是 Gas。为了向 L1 提交一个区块,需要消耗以下 Gas Limit (参考典型用例:只展示了区块中的 L2 转账(交易)):
一个区块中,最多可以包括 120 笔交易转账。
如果要在 L1 提交验证一个区块,需要消耗大约 23 万 Gas Limit,call data 费用约占 31%。
可扩展性(TPS)
可扩展性(TPS)是另一个考虑因素。假设一笔 L2 转账消耗 1850.7 Gas,那么 ZKSwap 将消耗 10% 的以太坊 Gas,整体 TPS 将在 51.5。
这是在只有交易、没有提现的情况,所以正常使用中将消耗更多 Gas,TPS 会更低。
结论
保护用户资金安全对所有区块链项目来说都很重要,也是 ZKSwap 的核心价值。当转账的公开数据没有提交上链时,安全性就依赖于零知识证明电路。当验证者诚实时,用户的资产就是安全的。从技术角度来说,如果验证者不诚实,安全性将会是一个问题。这是降低 Gas、提高 TPS 的一个权衡。
考虑到 Gas 消耗和可扩展性,ZKSwap 做了一个艰难的决定,将公开数据不上链,换来对 L2 用户更高的 TPS 和更低的 Gas 消耗。
我们愿意倾听开发者和用户的反馈,让 ZKSwap 系统更好。我们也可以在任何时间将所有数据上链。事实上,在发布 ZKSwap 之前,我们已经实现了 100% 数据可用的版本(所有 L1 和 L2 转账都在链上),所以我们可用随时升级至这个 100% ZK-Rollup 的版本,提供更高的 Gas 消耗、更低的 TPS,但是更安全。