本文主要关注从L2读L1, 从L1读L2, 或者L2读L2的状态。这对实现asset/keystore
分离的钱包技术架构很关键。
目标
随着L2成为主流,用户可能在多个l2上都拥有资产。随机智能合约钱包 (multisig, social wallet) 等普及,用户密钥可能随时间一直需要更新,如何同步更新密钥也是一个问题。
counterfactual addresses
: 尚未在链上注册的地址。
智能合约钱包地址可以利用create2
, 在各个l2生成相同的地址。

但是智能合合约钱包存在一个关键挑战:如何更新同步更新访问密钥。
唯一可行的解决方案是: asset/keystore 分离架构。每个用户都有一个: (1) keystore
合约, 用于存放verification key
; (2) wallet
合约,在其它的L1或L2上,通过跨链读到verification key
.

有两上办法实现这个目的:
- Light version: 每个钱包本地存储
verification key
, 包含一个函数,用于检查一个跨链的证明,用于获取keystore
的状态,并更新本地年verificaation key
。 它优秀点在于当跨链证明代价比较高时,可以不用频繁更新verification key
. 只有当前的密钥可以处理合约钱包的资产; - Heavy version: 对于每个交易,生成一个跨链的证明,用于验证当前
verification key
的有效性。
跨链证明
假设keystore
在Linea上, 钱包在Kakarot
上, 跨链的证明如下:

主要包含两个证明:
- 对于指定的Ethereum 状态根,证明Linea 状态根的有效性;
- 对于指定的Linea 状态根,证明
keystore
的的有效性。
证明的实现方案
- Merkle proofs
- 通用的ZK-SNARKs
- 专用的证明(KZG);
- Verkle 证明,
- 直接的状态读取

聚合是将一个块中的多个跨链证明聚合在一起, 对于SNARKs和KZG可以进行聚合,可以有三种聚合方式:
- 将N 个Merkle 证明生一个证明;
- KZG multi-proof
- Verkle multi-proof
网友评论