自动做市商是一种算法,或者说是一种在区块链上运行的智能合约,它允许数字资产之间的去中心化交易。AMM 的引入开创了一种全新的交易方式,无需传统的买家和卖家进行订单匹配,而是通过一种预设的数学公式(比如,常数乘积公式)创建一个流动性池,使得用户可以随时进行交易。
特点:k = x + y。其中的常数k,就是我们说的恒定总和。也就是说,在交易前后, k的值不会发生改变。 eg: 可乐价值1u,然后现在有个池子,我们放进去10u和10瓶可乐,k为20,为了保证恒定总和k不变,如果我们使用2u买了可乐,(10 + 2) + ? = 20。 ? 等于8。且购买后可乐的价格仍然为1u。然后保证了池子的总价值为20u。 缺点就是流动性很容易耗尽。因为在这个池子中,如果你有10u,就可以获得所有的可乐,然后其他人就没有了,并不会随着购买力的提高而提高价格。
特点:k = x * y。 其中的常数k,就是我们说的恒定乘积。在交易前后, k的值不会发生改变。 eg: 可乐价值1u,然后有个池子,我们放进去10u和10瓶可乐,k为100,为了保证k值不变,如果我们使用了10u购买了可乐,(10 + 10 ) * ? = 100。 ?等于5, 10 - 5 = 5, 于是用10u兑换了五瓶可乐。 会发现我们购买五瓶可乐的平均价格是2u,说明会随着购买力的改变,价格发生改变,不会耗尽流动性。 比如有人有1000u,那么(10 + 1000) * ? = 100; ? = 1/11。 说明池子里面还剩1/11瓶可乐,永远有人能喝到一点点。且价格越来越贵。
在去中心化交易所中,使用的自动做市商的算法是恒定乘积,保证了价格的动态变化。 k = x * y。
getAmountOut精准输入计算输出的方式:
// 由于x与y是固定比例,所以x增加的比例 * y的数量,就可以求出y的数量。
uint amountInWithFee = amountIn.mul(997);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(amountInWithFee);
amountOut = numerator / denominator;
swap通过输出的token计算是否满足输入的方式: 通过计算拿到一次swap输入的token数量,然后拿到总余额中扣除一次手续费千分之三的x的balance乘y的balance,得到的k值应该要大于或者等于之前的k值。
uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
// balance0 = reserve + inputTokenNumber
// reserve * 1000 + amount0In * 1000 - amount0In * 3
// balance0 * 1000 - amount0In * 3