返回论坛

查找币安全团队:去中心化永续合约深度审计指南

查找币 学术研究 安全研究 Web3安全 区块链安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
## 引言:链上衍生品的风险博弈 去中心化永续合约(Perpetual DEX)通过“共享流动性池”与“预言机定价”机制,在链上实现了高杠杆衍生品交易。与传统的 AMM 现货交易不同,永续合约系统涉及复杂的保证金核算、未实现盈亏的动态调整以及清算博弈。任何微小的逻辑偏差——无论是价格精度的舍入误差,还是预言机更新延迟——都可能导致协议资不抵债或用户资产归零。 作为安全审计团队,我们有必要深入解构此类系统的核心架构,剖析高风险场景,并为智能合约安全研究员提供实战审计检查清单。 ## 核心架构:从撮合引擎到链上博弈 去中心化永续合约的核心在于将 CEX 的高性能撮合引擎逻辑,转化为链上的“异步执行”与“资金池博弈”模型。该架构不仅管理资产,还需处理复杂的订单状态与预言机延迟。 ### 功能模块解析 #### 1. 订单管理 订单管理模块负责将用户交易意图参数化并存储,等待后续执行撮合。 - **加仓订单(Increase Order)**:包含开仓和追加保证金操作。 - **减仓订单(Decrease Order)**:包含平仓和提取保证金操作。 - **市价单(Market Order)**:即时请求,允许一定滑点,通常通过“两步执行”机制防止预言机抢跑。 - **限价单(Limit Order)**:当预言机价格达到指定触发价格阈值时触发的加仓请求。 - **止盈/止损订单(TP/SL)**:特殊的减仓限价单,当标记价格触及触发价格时执行全平或部分平仓。 - **互换订单(Swap Order)**:在不同抵押品之间进行转换(如用 USDT 开 BTC 本位合约),通常作为开仓的前置步骤。 #### 2. 仓位管理 仓位管理系统是核心账本,记录每个用户的持仓状态,关键字段包括: - `size`:头寸价值(USD计价) - `collateral`:抵押品数量 - `averagePrice`:平均开仓价格 - `entryFundingIndex`:开仓时的资金费率指数 **未实现盈亏计算**: - 多单 PnL = `size * (currentPrice - averagePrice) / averagePrice` - 空单 PnL = `size * (averagePrice - currentPrice) / averagePrice` 减仓或平仓时,需要计算实际盈亏并在仓位保证金中结算: ``` Position.collateral += PnL + FundingFee - OrderExecuteFee ``` #### 3. 交易执行与撮合 由于链上计算昂贵且依赖预言机,DEX 通常采用“Keeper 触发 + 预言机定价”模式,而非传统订单簿撮合(CLOB)。 - **请求队列(Request Queue)**:用户提交订单后,交易进入队列或 `pending` 状态,不立即执行。 - **Keepers(执行角色)**:链下机器人监听队列,当条件满足(如时间锁过期、价格触发)时,发送交易并调用合约执行撮合。 **安全风险**:Keeper 的权限控制与激励机制设计,直接影响系统的去中心化程度与抗审查能力。 #### 4. 资金池(Liquidity Pool) 资金池不仅是流动性提供者的容器,更是市场上所有交易者的全局对手方。 **4.1 虚拟流动性与资产支撑** - **LP 铸造/销毁**:流动性提供者存入资产(如 USDC、ETH)铸造 LP Token。LP Token 价格由公式 `P_LP = (TotalAssets + UnrealizedPnL) / TotalSupply` 决定。 - **零和博弈**:交易者的亏损直接成为 LP 的盈利,反之亦然。 - **风险隔离**:通常将稳定币池与波动资产池逻辑隔离,或通过权重控制特定资产敞口上限。 **4.2 动态费用(Dynamic Fees / Rebalancing)** 为维持池内资产比例平衡,系统根据当前资产权重与目标权重的偏差调整 Swap 费用。例如,若 ETH 占比过高,用 ETH 换 USDC 会收取高额费用(惩罚),反之则低费用甚至零费用激励。 **4.3 全局债务追踪(Global Debt)** 系统不直接持有空单的抵押品,而是记录“全局空单总额”。`Guaranteed USD` 是关键记账变量,表示“被多单锁定”的资产价值 + “空单的抵押品”价值,用于确保资金池的偿付能力。 #### 5. 预言机模块 预言机模块提供“防操纵”的定价服务,是系统的风控核心。 **5.1 价格聚合策略** - **双源验证**:结合 Chainlink/Pyth 等链上预言机价格(参考价格)与 Keeper 提交的 CEX 价格(快速价格)。 - **价差保护**:当 `|FastPrice - ChainlinkPrice| > SpreadThreshold` 时,强制回退使用 Chainlink 价格或暂停交易,防止 Keeper 操纵。 **5.2 安全边界** - **价格延迟**:Oracle 价格必须携带时间戳,合约需检查其新鲜度(如 `block.timestamp - oracleTimestamp < MAX_DELAY`)。 - **价格精度**:统一处理精度差异(如 USDC 6 位 vs ETH 18 位),避免舍入误差累积。 ## 深度审计检查清单 ### 代码层安全 - **冗余代码清理**:移除未使用的变量、函数和第三方合约引用,减少攻击面与部署成本。 - **除零检查**:在奖励分发逻辑中,检查 `rewardPerToken` 是否在 `totalSupply == 0` 时正确处理,防止除零错误。 - **推荐人机制防御**:防止用户自引用(Self-referral)或建立循环推荐关系(A→B→A)进行刷量。 ### 经济层安全 - **闪电贷攻击**:检查预言机价格是否可被闪电贷操纵,特别是当价格更新与交易执行之间存在时间窗口时。 - **清算阈值**:验证清算触发条件是否合理,防止因价格微小波动导致大规模清算或清算不足。 - **资金费率计算**:确保资金费率指数更新频率与持仓时间匹配,防止套利者利用延迟套利。 ## 结论:对抗式思维与持续监控 去中心化永续合约的安全性不仅依赖于 Solidity 代码的健壮性,更取决于金融逻辑的闭环设计。从预言机喂价的毫秒级延迟,到资金池 AUM 计算的微小偏差,任何环节的疏漏都可能被“闪电贷”放大为致命的经济攻击。 作为审计师,应采取对抗式思维:不仅仅验证代码是否符合预期设计,更要假设自己是真实的攻击者,试图通过操纵价格、利用舍入误差或抢跑交易等方式从协议中套利。只有深入理解攻击者的动机与手段,才能发现更深层的风险并协助项目方进行修复。 **持续监控建议**:鉴于 DeFi 乐高属性,建议项目方在主网部署后,建立自动化的链上监控系统,作为静态代码审计的必要补充。 --- 本文由查找币安全团队整理发布
在论坛中查看和回复