ZKSwap V2 版本预计将于6月初正式上线,届时新版本将会支持 Layer2 的自主无限上币,用户可以自主添加自己发行的 ERC20 token 到 ZKSwap 的 Layer2 支付网络和兑换网络,实现免费实时转账任意 ERC20 代币(包括任何稳定币)以及免费实时兑换任意 ERC20 代币。 

ZKSwap 在 V1 的基础上,V2 版本新增了如下功能:  

1) '⽆限'上币 - ⽤户在⽀付⼀定费⽤的情况下,可以⾃主添加任意 Token,并可创建交易对;

2) 优化电路分支的实现,提升电路效率 - ⽀持⼀个账户,两个余额的修改;

3) 优化提现体验 - V1 版本中,提现的操作和区块验证操作捆绑在⼀起。由于每笔 gas 费⽤的限制,导致区块中的提现的个数受限,特别是在聚合验证的情况下,受限更多。V2版本将会优化用户的提现体验。  

1. Token管理  

ZKSwap V2 版本将⽀持三种类型的 Token:Fee Token、User Token 和 LP Token。总共⽀持 2^16 个 Token。 

   

1.1 Fee Token 

Fee Token 只能由 Governor 添加,主要为 ETH、ZKS、USDT、USDC 和 BTC 等。  

1.2 User Token 

User Token ⽤户可以付费添加。  

1.3 LP Token 

ZKSwap ⽤户创建交易对时,必须⽀付费⽤。LP Token 将在⽤户创建交易对时⾃动添加。用户创建的交易对中必须有⼀种 Token 是 Fee Token。User Token 能创建的交易对个数受限(由 Governor 设置)。  

1.4 Governor Config 

Governor 可以设置添加 User Token 和修改创建交易对⽀付的费⽤。  

2. 账户管理 

ZKSwap V2 版本将⽀持 2^28 个账户。其中账户 0 为 Validator 账户。  

3. Fee模型

ZKSwap V2 版本上的 Layer2 交易,可以指定 Fee Token 中的⼀种作为⼿续费。 

  

4. Pub Data of Transactions 

ZKSwap V2 版本上的所有交易(包括 Layer1 / Layer2 交易)都需要打包提交 Pub Data 到 Layer1。为了保持最优的电路性能,Chunk ⼤⼩为 11 字节,兑换和转账只需要 2 个 Chunk。  

4.1 Noop 

ZKSwap V2 版本允许存在空交易,来填充 Layer2 区块。  

a. pub data 

 

pub data 的总⻓度 = 1 字节。

4.2 Deposit 

用户从 ZKSwap Layer1 发起充值操作时,系统会将用户 Layer1 的资产映射到 Layer2。 

a. 接⼝函数 

function deposit ERC20 (IERC20 _token, uint104 _amount, address _franklinAddr) 

function deposit ETH (address _franklinAddr)  

b. pub data 

   

pub data 的总⻓度 = 1+4+2+16+20 = 43 字节。总共 4 个 Chunk。  

4.3 Transfer 

用户通过 ZKSwap Layer2 发起的转账交易,可实现任意 Token 的转账。  

a. pub data   

pub data的总⻓度 = 1+4+2+4+5+1+2 = 19 字节。2 个 Chunk。 

4.4 TransferToNew 

用户通过 ZKSwap Layer2 发起转账交易,可实现任意 Token 的转账。转账对⽅不需要提前创建账户。 

a. pub data 

 pub data 的总⻓度 = 1+4+2+20+4+5+1+2 = 39 字节。4 个 Chunk。  

4.5 Withdraw 

用户通过 ZKSwap Layer2 发起提现操作,可实现任意 Token 在 Layer1 的提现。  

a. pub data 

pub data 的总⻓度 = 1+4+20+2+16+1+2 = 46 字节。5 个 Chunk。 

4.6 FullExit 

用户可直接从 ZKSwap Layer1 发起 FullExit 请求,提取资产,此操作需要 Layer2 提供证明。  

a. pub data 

pub data 的总⻓度 = 1+4+2+20+16 = 43 字节。4 个 Chunk。  

4.7 ChangePubKey 

用户通过在 ZKSwap Layer2 发起提取交易,可实现任意 Token 在 Layer1 的提现。 

a. pub data 

pub data 的总⻓度 = 1+4+20+20+4 = 49 字节。5 个 Chunk。  

4.8 CreatePair 

用户通过 ZKSwap Layer1 发起交易池的创建。创建交易池需要在 Layer1 创建对应的智能合约(LP 代币)。

a. 接⼝函数 

function createPair (address _tokenA, address _tokenB)  

b. pub data 

pub data 的总⻓度 = 1+ 4+2+2+2+20 = 31 字节。总共3个Chunk。 

4.9 AddLiquidity 

用户通过 ZKSwap Layer2 添加流动性。  

a. pub data 

pub data 的总⻓度 = 1+4+4+5+5+5+5+1+2 = 32 字节。总共 3 个 Chunk。 

4.10 RemoveLiquidity 

用户通过 ZKSwap Layer2 移除流动性。  

a. pub data 

  

pub data 的总⻓度 = 1+4+4+5+5+5+1+2 = 27 字节。总共 3 个 Chunk。  

4.11 Swap 

用户通过 ZKSwap Layer2 实现两种 Token 之间的兑换。  

a. pub data

  

pub data 的总⻓度 = 1+4+4+5+5+1+2 = 22 字节。总共 2 个 Chunk。  

5. Circuit Optimization 

ZKSwap V2 版本为了降低 AMM 相关操作的 Chunk 个数,需要降低“Branch”的个数。原有设计在状态树上的⼀个 Account 和⼀个 Token 的 Balance 组成⼀个“Branch”。在 AMM 相关的操作中,如果采⽤ Fee Token 的⽅式,原有的设计效率⽐较低,需要⽀持 1 个 Account 和 2 个 Token 的 Balance的“Branch”。  

1) Account Audit Path (aap)

2) 该 Account 下的 2 个 Balance (balance0 / balance1) 在修改前的 Audit Pat(bap0/bap1) 3) 该 Account 下的 2 个 Balance (balance0'/balance1') 在修改后的Audit Pat(bap0'/bap1')  

在修改前电路需要证明: 

  • balance0 + bap0 ==> b_root0
  • balance1 + bap1 ==> b_root0 
  • account (b_root0) + aap ==> root  

在balance修改后电路需要证明: 

  • balance0' + bap0 ==> b_root0' 
  • balance1 + bap1' ==> b_root0' 
  • balance1' + bap1' ==> b_root0'' 
  • account(b_root0'') + aap ==> root'  

6. AMM Circuit Explanation  

6.1 CreatePair Circuit 

   

6.2 AddLiquidity Circuit

     


6.3 RemoveLiquidity Circuit

    

6.4 Swap Circuit

    


7. Withdrawal Optimization

ZKSwap V2 版本提现操作和区块验证隔离开,区块中的提现个数将不受限制。

   

在某个区块验证后,通过 Check Withdrawals 函数创建 Pending Withdraws,再通过Complete Withdrawls 完成提现。Complete Withdrawls 函数需要增强可以优先处理某个Pending Withdraws。区块验证是针对多区块聚合实现的。Check Withdrawals 针对每个验证后的区块进⾏处理。创建⼀个Pending Withdraw 的 gas 费⽤在 7w 左右,按照⼀个交易最⼤的 gas 费⽤ 1250w 来说的话,⼀个区块⽀持的最⼤的提现个数是 178 笔。  

7.1 checkWithdrawals 

   

7.2 completeWithdrawals 

  

8. Limitation 

1. Fee Token:32个;User Token:16352个;Pair:49152 

2. 兑换中交易对的 2 个 Token,其中一个必须是 Fee Token;

3. 兑换时收取的费用将是 2 个 Token 中的一个 Fee Token;

4. 所有交易的⾦额最⼤为 120 bit,且任何中间计算变量的最⼤值为 120 bit。