# Design文档 # 面向人群 vincent,sulin,keqi,白帽 拆分成三个文档:电路设计、合约设计、电路与合约协作 # 电路与合约协作大纲 ## 文档目的 阐述DeGate系统去中心化的实现方式与目的,强调用户资产的安全性 ## 文档结构 ### DeGate概述 ### 整体设计目标 即时性、高吞吐量、低成本 ### 零知识证明实现步骤 说明电路与合约配合方式,如何实现DeGate交易的零知识证明 ### DeGate系统角色(介绍各角色职责) #### 撮合系统 #### Operator #### ZKProof Worker #### 智能合约 ### 保护用户资产 #### 零知识证明 #### 逃离模式 #### 关停模式 ### 特殊说明 #### 签名 所有签名方式,包括Poseidon,可以引用电路与合约的设计文档 #### 交易员系统 交易Key与资产Key,目前电路叫高权限Key与低权限Key # 电路设计文档大纲 ## 文档目的 阐述电路的具体设计与功能 ## 文档结构 ### 电路是什么,在zkSnark零知识证明中处于什么位置 ### 电路约束数量的限制 #### BN128曲线的描述 #### 电路size描述,为什么是这几个size ### 设计详述 #### 数据存储-树结构 ##### 树存储的优势 ##### 树存储的结构-引出完整树与资产树 ##### 完整树说明 ##### 资产树说明 #### ZKBlock ##### ZKBlock结构说明 ##### ZKRollUp交易 ###### Noop、Transfer、SpotTrade、OrderCancel、AppKeyUpdate、BatchSpotTrade、Deposit、AccountUpdate、Withdraw #### ZKProof ##### ZKP输出产物 ##### 验证方式 #### 特殊说明 ##### 重放保护 ##### Poseidon签名 ##### 高低权限key说明 ##### 电路时间戳 ##### 手续费 ##### 矿工费 # 合约设计文档大纲 ## 文档目的 阐述合约提供的功能与具体设计 ## 文档结构 ## 合约提供的功能 在zkSnark零知识证明中处于什么位置 ### 零知识证明验证 - 电路verification key如何注册 (hardcoded) - 电路verification key如何验证 (验证publicInputs和proofs) ### L2区块的验证 - 验证完整树与资产树 - 验证时间戳 - 验证和处理部分交易- conditional Tx介绍(Deposit、AccountUpdate、Withdraw) - 验证零知识证明proof ### 充值功能 - 合约接口充值 - 直接转账充值 - 费用 ### 提现功能 - 普通提现 - 强制提现 - 提交merkle证明提现 ### 代币注册 - TokenID为0-31的token由交易所admin注册 ## 合约的设计 ### 设计详述 主要模块介绍 Exchange合约/Deposit合约/Loopring合约/BlockVerifier合约 ### Exchange合约 通过submitBlocks接口提交ZKBlock并验证。 #### ZKBlock数据定义 - 数据结构(header + L2 txs) #### Conditional交易 - Calldata - AuxData - Deposit、AccountUpdate、Withdraw数据结构 #### 交易手续费和更新 - 校验机制 - 延时更新 - 最大值保护 #### 充值接口和实现 - deposit - 未处理请求 #### 强制提现接口和实现 - forcewithdraw #### 逃离模式 - 逃离模式,notifyXXXTooOld - 逃离模式的提现接口withdrawFromMerkleTree - merkle proof的验证 #### 关停模式 - 关停模式,forcewithdraw的处理 ### Deposit合约 - 存储所有用户资金的合约 - 非标准ERC20处理 ### Loopring合约 - Exchange参数管理合约 - 初始化配置verifier合约。 - 设置交易费率/强制提现费率等参数 ### BlockVerifier合约 - 存储电路verificationKey - verifyProofs接口