跳到正文

兑换截止时间、滑点与 calldata:签名前应核对什么

了解如何解码 DEX 兑换调用,并在签名前核对路由器、函数、金额边界、路径、收款人和截止时间。

更新于

仅供教育用途;不构成投资建议或投资推荐。投资可能导致损失。

直接回答

签署 DEX 兑换前,应核对链、目标合约、解码后的函数、代币地址、输入或输出边界、路径、收款人以及任何截止时间。前端显示的“滑点”百分比本身并不是链上指令。它通常用于计算保护边界,例如 exact-input 兑换的 amountOutMinamountOutMinimum,以及 exact-output 兑换的 amountInMaxamountInMaximum

截止时间是时间保护条件,不是价格保证。如果路由器检查截止时间,而交易在其后执行,调用应当回滚。交易仍可在截止时间前按金额边界允许的任何价格执行。较长的截止时间会让该授权保持可用更久;过短则增加交易在打包前过期的概率。

Calldata 不会自我描述。应使用所选链上准确合约的已验证 ABI 解码,并展开任何嵌套的 multicall 或 Universal Router 命令。如果钱包无法可信地显示解码字段,不要仅凭字节位置或函数名称数据库推测其含义。

工作原理

解码实际调用

按照 Solidity ABI,calldata 的前 4 bytes 是函数选择器,编码参数从第五码开始。选择器可能碰撞或被错误标注,因此必须与已验证目标合约的 ABI 匹配。代理、聚合器或路由器可能把兑换封装在 multicallexecute 或其他函数中;应解码所有可能转移代币或改变最终收款人的嵌套载荷。

在 exact-input 兑换中,输入金额固定,保护字段规定可接受的最低输出;在 exact-output 兑换中,目标输出固定,保护字段限制最高输入。边界为零或异常宽松,可能等同于没有有效的价格保护。代币小数位很重要:必须先把各代币地址映射到正确的小数位和符号,再比较原始整数金额。

核对路径、收款人和 value

确认路径始于要支出的代币,并终于预期收到的代币。检查中间代币、池费率,以及任何包装、解包、归集或转移余额的命令。收款人应是预期钱包,或行为已经理解的合约。还要核对交易的原生 value;它可能独立于 calldata 中编码的 ERC-20 金额。

找到截止时间

截止时间的位置取决于路由器版本。Uniswap V2 风格的路由函数含有 deadline 参数,原始 Uniswap V3 ISwapRouter 结构也包含该参数。Universal Router 同时提供 execute(commands, inputs, deadline) 和不带截止时间的重载。因此,不要假设每笔兑换都有截止时间,也不要假设它总位于相同的嵌套兑换参数内。

截止时间通常与执行时使用的区块时间戳比较。它不会取消待处理交易、保证迅速打包,或阻止金额边界以内的不利价格。如需取消,发送者必须使用对应链和钱包的交易替换机制;原交易一旦被打包,替换便无法保证成功。

完整示例

某笔 exact-input 兑换的报价预计得到 10,000 USDC,用户选择 1% 滑点。暂不考虑报价中已经包含的费用,预期最低输出为 9,900 USDC。USDC 使用 6 decimals,因此该边界的原始整数是 9900000000

解码后的调用却包含 amountOutMinimum = 9000000000,即 9,000 USDC。这允许结果比报价少最多 10%,而不是 1%。收款人还是陌生地址,截止时间也在数小时后。任一处不一致都足以拒绝该请求,并通过可信界面重新构建。重建后,应针对近期状态模拟完全相同的未签名交易,并在签名前再次核对解码载荷。

核对清单与风险

  • 对照协议官方部署记录,核对所选链以及路由器或代理地址。
  • 使用已验证合约 ABI 解码;展开嵌套调用和路由命令,而不是只检查外层函数。
  • 核对代币地址、方向、小数位、固定金额、保护金额边界、路径、费率层级、收款人和原生 value
  • 将截止时间转换为绝对时间,确认剩余窗口是否符合预期。若没有截止时间,应将其视为需要单独审查的设计选择。
  • 使用签名地址,针对近期状态模拟完全相同的交易。模拟成功只是该状态下的证据,不保证打包或最终执行。
  • 单独审查授权或 Permit2 权限。良好的兑换边界并不能让无限额或恶意的代币授权变得安全。
  • 边界过紧可能因正常价格变化而回滚;边界过松则增加成交价和三明治攻击风险。链上交易即使回滚也可能消耗 gas。

常见误区

误区:签名内容包含界面显示的滑点百分比

通常,签名载荷包含的是根据该设置计算的金额边界。应核对实际整数与代币小数位;界面标签看似正确,并不能证明 calldata 使用了相同容忍度。

误区:每笔兑换都使用 amountOutMindeadline

字段名称和位置随路由器与函数而异。Exact-output 兑换保护输入端,有些入口则省略截止时间或把它放在外层调用中。

误区:截止时间能防止不利价格

只有被调用代码实际执行检查时,它才能限制允许执行的时间。价格保护来自金额边界,而边界以内的所有成交结果仍然被允许。

误区:解码外层函数就足够

聚合器和通用路由器可能包含多次调用、代币许可、转账和清理命令。影响安全的收款人或金额可能位于嵌套载荷内。

相关主题

来源

导航

搜索知识库...