ZKSwap V2版本预计将于6月份上线 支持Layer 2自主无限上币
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。