Uniswap v4 的记账术:多跳兑换的中间流程只在结算时转账 图 1
Uniswap v4 的记账术:多跳兑换的中间流程只在结算时转账 · 图 1

在 v3 的世界里做一笔跨三个池子的兑换,链上动静的样子是这样的:资金从你的钱包进第一个池、换出的币再进第二个池、换出的币再进第三个池,每一跳都是一次真实的代币转账加一次余额核对,每跳各付各的转账成本。v4 官方文档描述的新架构把这套流程改写了:池子不再各是一个独立合约,全部住进一座叫 PoolManager 的单例合约;资金也不再逐跳搬运,系统只记录你在这笔操作里净欠什么、净得什么,最后一次结清。官方文档称这套机制为延迟余额记账,英文原名直译过来是闪兑式记账:操作中途什么都不转,收尾时一次结清。

先看单例这一半。v3 每个交易对都要部署一个独立的池合约,建池子要花部署的 gas,多跳兑换要跑多个外部合约。v4 里池子由一个键值描述——两种资产、费率档、刻度间距,外加可选的钩子合约地址——哈希之后变成池子的标识,所有池子的状态和操作都收拢在 PoolManager 一个地址里。官方文档给出的直接收益是:新建池子从部署合约降为写一条状态,跨池调用的跳转成本显著下降,原生以太也第一次不需要先包装成包裹币就能直接参与兑换。

再看净额记账这一半,这是更有意思的改动。在一笔操作里,系统用有符号的余额差记录每一步资金流向:某个池子应收你多少、你应收某个池子多少,全部以净额的形态挂在临时存储里。操作结束时做一次总检查:所有方向的余额差必须互相轧平为零,任何一条没收平,整笔交易直接回滚。官方文档把这层机制和访问模式讲得很直白——外部合约要先通过锁定机制进入回调,在回调里可以调用任意池子的兑换或流动性操作,归还控制权之前必须把所有未结清的净额轧平。

这套记账方式最直接的受益场景是多跳与组合操作。三跳兑换不再产生两笔中间转账,你只为最终的那笔净收支付转账成本;闪电贷式的「一笔交易内借、换、还」流程也不再需要逐池子结清,中间环节全部以净额存在。配合钩子合约在交换前后插入逻辑的设计,同一次锁定里甚至可以让一个合约从多个池子凑流动性再统一结算。对普通用户,这些工程细节最终只体现为两件事:多跳路径更便宜,以及兑换失败时的报错信息更可能来自某个钩子而不是池子本身。

风险面随架构一起换了形状。其一,状态集中:v3 时代一个池子的漏洞大致圈在那个地址里,v4 的所有池子共享同一份合约实现,核心层的一处缺陷理论上波及面更大,这要求用户对单例版本的审计与升级治理投入更严的注视。其二,钩子入局:每次交换都可能调用一个随池子登记的第三方合约,钩子能改费率、能限制地址,能做的事越多,出错与作恶的面越大,读池子的钩子地址成了选型清单的新增项。其三,净额语义对读者的要求:从事件日志复原一笔 v4 交易的资金流,不能再靠逐跳的转账事件拼,要理解余额差与事件结构。

顺带解释一个名词误会:这里的闪兑不是指闪电贷,也不承诺零时刻到账,名字描述的是同一笔交易内部资金结算被推迟到最后关头的记账方式。读链上数据时也别被表面迷惑——净额记账意味着区块里可能看不到某些中间转账事件,旧的解析脚本若假设「每次交换必有转账」,在新一代数据上会得出错误结论。基础设施生态通常会为这类记账迁移提供事件索引更新,使用第三方数据分析时先确认它是否覆盖了新结构,再决定要不要相信仪表盘上的转账统计。

给使用者的核对动线因此三句话:确认交互的是官方部署的单例地址;选池子时把钩子地址当作和费率、深度并列的字段去读;对账时看净额事件而不是找中间转账。合约地址与实现细节以 Uniswap 官方文档与链上合约为准。本文只做机制说明,不构成投资建议。

Uniswap v4 的记账术:多跳兑换的中间流程只在结算时转账 图 2
Uniswap v4 的记账术:多跳兑换的中间流程只在结算时转账 · 图 2