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。