---
# System prepended metadata

title: Design文档

---

# 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接口

