在去中心化交易所(DEX)上换币,成交的对手不是另一个人,是一个池子。池子里装着两种代币,比如 ETH 和一种稳定币,由一份智能合约拿着;换币的人拿其中一种放进去,合约按两边各剩多少,算出该还给他多少另一种。这一对币连同管着它们的合约,就叫流动性池。

LP 是什么意思:流动性提供者和 LP 代币

池子里的币不归交易所,也不是凭空来的,是有人存进去的。存币的人叫流动性提供者(Liquidity Provider),英文缩写 LP。他们按池子当时两边的比例,把两种币一起存进去。第一笔存款来自建池的人,他放进去的两边数量,定下了这个池子的第一个报价;在 DEX 首发的新代币,头一个价格就是这么来的。

存进去以后,合约给存币的人记一份 LP 凭证,也叫 LP 代币,代表他在整个池子里占多少份额。凭证记的是比例,不是两种币各多少枚。池子每被换一次,两边的数量就变一次,同一份凭证能取回的两种币也跟着变。想退出时,把凭证交回合约,按份额从两边各取一份。所以 LP 这两个字母有两个意思,一个指存币的人,一个指他手里那张凭证,要看上下文分。

智能合约可以看成一种以太坊账户:能持有资金,也能按设定的条件把资金发出或退回。池子里的币就由这样一个账户拿着,进出都照合约写好的条件走。借贷协议里也有叫「流动性池」的资金池,那是供人借款用的,和这里说的兑换池同名、用途不同。

AMM(自动做市商):流动性池按两边存量定价

池子不记录「现在一枚多少钱」,只记两边各有多少枚。报价从这两个数算出来:代币那一侧多、ETH 那一侧少,每枚代币折合的 ETH 就低;反过来就高。

有人用 ETH 买代币,ETH 放进池子、代币被取走,ETH 一侧变多,代币一侧变少,下一个人看到的代币报价随之变高。卖出时方向相反。每一笔兑换都在改这个比例,报价就跟着成交一点点挪动,中间没有人出价,也没有挂单在等。按存量自动算价、自动成交的这套做法,叫自动做市商(Automated Market Maker,AMM)。

合约用什么公式从两边存量算出一笔能换多少,各协议写得不一样。让两边数量相乘的结果在兑换前后保持不变,是其中一种写法。

池子也不看外面的行情。别处的价格变了,池里的报价不会自己跟过去,要等有交易进来。两边差价够付手续费时,在便宜一边买、到贵一边卖的交易,会把池子的比例换回到接近外面的价格。无常损失就出在这一步。

在 DEX 换币为什么有滑点

报价是池子此刻的比例,可一笔兑换在成交过程中自己就在改这个比例。前面那一小部分按原来的比例换,越往后,放进去的那一侧越多、被取走的那一侧越少,每多换一点都更贵。整笔算下来的平均成交价,比下单前看到的报价差,这段差额就是池子里的滑点。单子相对池子越大,滑点越大;同样一笔单放进存量大得多的池子,比例挪得少,均价就贴近报价。

订单簿上也有滑点,成因是一张市价单吃完一档挂单、接着吃下一档。池子里的价格则是随换入的数量连续地被推着走。

常数乘积公式 x * y = k:拿一笔兑换来算

Uniswap 给池子定价,用的是常数乘积公式 x * y = k(Uniswap 开发者文档)。x 和 y 是池里两种代币各自的存量,k 是两者的乘积,每笔兑换之后,k 必须保持不变或者变大。有人往池里放进一种币,这一侧的存量变大;乘积不能变小,另一侧最多能取走多少,就由这条等式定了。

算例假设一个池子里有 20 枚甲币和 4,000 枚稳定币,不计手续费。k = 20 × 4,000 = 80,000,报价是 4,000 ÷ 20 = 200,即 1 枚甲币折 200 枚稳定币。有人放进 1,000 枚稳定币买甲币:稳定币一侧变成 5,000,甲币一侧必须剩 80,000 ÷ 5,000 = 16 枚,他取走 20 − 16 = 4 枚。按下单前的报价,1,000 枚稳定币该换 5 枚;实际换到 4 枚,平均每枚花了 250。换完以后,池子的报价是 5,000 ÷ 16 = 312.5。

一单下来有三个价格:下单前的报价 200,成交均价 250,换完后的新报价 312.5。这一单相当于稳定币一侧存量的四分之一,所以挪得这么远。Uniswap 把这种挪动叫价格影响(price impact):相对池子的深度,单子越大,价格挪得越多;小单的成交价贴近当时的报价。

提供流动性(做 LP)的收入:换币的人付的手续费

滑点之外,每笔兑换还要付一笔手续费。这笔钱按份额归流动性提供者。池子成交得越多,攒下的手续费越多;没人来换的池子,存在里面的币就只是放着。

费率不是全协议一个数。在 Uniswap 上,兑换手续费按池子和协议版本设定,归流动性提供者;治理启用之后,受支持的池子还可以在预先定好的限度内另收一笔协议费。

这笔兑换交易上链另要付 Gas,那是付给网络的,不进池子。交易执行途中 Gas 用尽而失败,已经消耗的也不退。

集中流动性(Concentrated Liquidity):把资金放在选定的价格区间里

Uniswap 各个版本记 LP 份额的办法不同。v2 给存币的人铸一种可互换的 ERC-20 池子代币,代表他在两边存量里按比例占的一份。到了 v3 和 v4,每个流动性提供者要自己选一段价格区间,x * y = k 只在他选的那段区间里适用。这种做法叫集中流动性,由 v3 引入,v4 沿用,另外在架构和记账上做了改动。

版本 LP 的份额怎么记
v2 可互换的 ERC-20 池子代币,按比例代表两边存量
v3 每个仓位带着自己选的价格区间,由一枚 ERC-721 NFT 代表
v4 仓位由 PositionManager 管理,内部记账用 ERC-6909

所以「LP 代币」这个词,放在 v2 那类池子里,指的是一种能拆分、能互换的代币;到了 v3,凭证是一枚一枚各不相同的 NFT,区间不同的两个仓位不能当成一样的东西来算。

无常损失是什么,怎么算

存进池子的两种币,比例由池子维持。外面的价格变了,那些在两边赚差价的交易把池子的比例换回到接近外面的价格,换的方式是从池子里拿走正在涨的那一种、放进另一种。等存币的人取回时,涨的那种变少了,没涨的那种变多了。拿这个结果和「当初不存、两种币原样放在钱包里」比,少掉的部分叫无常损失(Impermanent Loss)。

算例假定一个池子按两边数量相乘不变来定价,里面只有一笔存款:10 枚甲币和 1,000 枚稳定币,存入时 1 枚甲币折 100 枚稳定币,两边各值 1,000,合计 2,000。之后外面的甲币涨到 200,不计手续费,池子被换到每枚甲币也折 200 枚稳定币为止:甲币剩约 7.07 枚(10 除以根号 2),稳定币约 1,414.21 枚,两数相乘仍是 10,000。这时取回,价值约 7.07 × 200 + 1,414.21 ≈ 2,828.43;原样拿着不存,是 10 × 200 + 1,000 = 3,000。差了约 171.57,占原样拿着的 5.7% 左右。这笔差额去了把比例换回来的那一方:他们放进约 414.21 枚稳定币,拿走约 2.93 枚甲币,按 200 算值约 585.79。

跌的方向也一样。甲币跌到 50,照同一规则算,取回的价值约 1,414.21,原样拿着是 1,500,同样少了约 5.7%。价格离存入时的比例越远,差得越多;价格回到存入时的比例,这段差额也就没了。在偏离的时候取回,它才成了实际少拿的钱。手续费收入在另一头,能把这段差额补回一部分,也可能补得比它多,看这段时间池子成交了多少。

流动性池和订单簿的区别:成交对手不同

在池子里换币,币从自己的钱包出去,换回的币回到自己的钱包,中间不经过交易所账户,这也是 DEX 和 CEX 的根本差别之一。

谁都能建池子:不用谁批准,开盘价由建池的人定

Uniswap 的协议向所有人开放,它自己没有能力挑选谁可以用。兑换、往池里存币、给一对代币新开一个市场,都不用谁批准。核心合约部署之后不能升级,没有哪一方能把它暂停,或者撤销已经执行的兑换。

落到池子上是两件事。头一件,没在中心化交易所上架的代币,只要有供需,有人给它建了池,就换得到。第二件,池子在那里,只说明有人往里放了两种币:第一笔存款的两边数量由建池的人自己定,开盘价也就由他定;池子多深,要看之后还有多少人往里存。存量小的池子,一笔不大的单就能把价格推出去很远,换之前先看池子两边各有多少。

锁池子、撤池子是什么意思

撤池子,是凭证的持有者把凭证交回合约,按份额把两边的币取走,流动性提供者退出都走这一步;凭证全在建池人一个地址名下时会出什么事,见 Rug Pull。

锁池子,是让凭证暂时或彻底离开建池人的控制:存进锁仓合约,到期后凭证回到设定的地址,撤与不撤又由那个地址说了算;转进没人掌握私钥的销毁地址,谁也取不出来。

常见疑问

无常损失只要不取出来,会不会变成真亏?

取出之前,它是拿池里的份额和「原样拿着两种币」比出来的账面差额,价格回到存入时的比例,这段差额就没有了;在价格偏离时取回,差额就成了实际少拿到的钱。它和本金亏损也是两回事:两种币一起跌,原样拿着同样在亏,无常损失是在这之上再少掉的部分。

LP 代币是什么,能转给别人或卖掉吗?

LP 代币是存币以后合约记给流动性提供者的凭证,代表他在整个池子里占多少份额。凭证本身是一种代币时,可以像别的代币一样转给别人;卖掉的同时,按份额取回池里两种币的权利也跟着转给买到它的人。存进锁仓合约或转进销毁地址的凭证转不出来,也就卖不了。