欢迎大家来参加技能进阶挑战!
在本帖下用回复的方式上传你的学习笔记完成打卡
欢迎大家来参加技能进阶挑战!
在本帖下用回复的方式上传你的学习笔记完成打卡
成都信息工程大学 梁培利老师
Uniswap V2 采用自动做市商(AMM)模型,其核心是流动性池(Liquidity Pools)和恒定乘积公式($x\times y = k$)。
每个交易对都有独立的流动性池
价格由池中代币比例决定
流动性提供者(Liquidity Providers, LP)通过存入资产获得手续费收益
Uniswap V1 使用 ETH 作为桥接代币,意味着要实现 ABC 与 XYZ 的交易,需要使用 ETH/ABC 和 ETH/XYZ 交易对,而这样会让流动性提供者面临 ETH 的风险敞口;而在 V2 中允许给任意两个 ERC-20 代币创建交易对合约,所以可以直接使用 ABC/XYZ 交易对,省去双倍交易手续费和滑点。
Uniswap V1 无法提供安全的链上预言机,因为价格很容易被操控,通过买入 ETH 触发合约清算再卖回 ETH 使得价格回归正常。V2 通过在每个区块的第一笔交易前计算和记录价格来实现预言机,此时操纵价格要更困难些。除非同一个人控制了两个区块的所有交易,否则没有足够的套利优势,将会在 V3 改进。
V2 计算时间加权平均价格(TWAP)的方式实际使用的是(加权)算数平均数,在 V3 中使用更合理的几何平均数计算价格预言机。
V2 允许用户在支付费用前先收到并使用代币,只要他们在同一个交易中完成支付。
V2 交易对铸造的资金池原生支持元转账,即意味着用户可以用签名授权转账而不用从地址进行链上转账。任何人都可以调用permit
函数发送签名,支付 gas 费用并在同一个转账中执行其他操作。
function swap(uint amount0Out, uint amount1Out, address to) external;
用户指定输出量而并非输入量:
防止前端运行(使抢跑者难以预测用户意图)
支持复杂交易路径(用户更关心最终获得量,路由合约可自动计算中间量)
避免超额支付(确保获得期望输出,输入量由合约计算更准确)
之前只是在用 DEX 的角度體驗 Uniswap,對它背後的機制其實沒有那麼深入,這次看完一些文件、實際跑合約跟數學模型後,剛好趁機會整理一下心得,也給其他小夥伴們參考參考。
Uniswap V2 最核心的概念還是 x * y = k 的恆定乘積公式。
只要有人進行 swap,池子裡的 token 數量會變動,但 k 會被維持不變(扣除手續費)。
一開始我覺得這個模型好像太簡單了,但實際想一想,這就是為什麼它能完全自動化,完全不需要訂單簿(order book)。
LP 其實就是把兩種 token 按比例存進去,拿到 LP Token 當憑證。
所以說當 LP 不是單純「躺著賺手續費」,而是必須考慮到幣價波動的風險。
跟 V1 相比,V2 允許直接建立 任意 ERC20/ERC20 的池子,不用再強制一邊是 ETH。
這對 DeFi 生態影響很大,因為這意味著專案方可以直接建立 USDC/DAI、WBTC/ETH 這種交易對,不用透過 ETH 當中介,降低了額外的滑點。
剛開始接觸 DeFi 時,常常覺得這些協議很黑箱,但學了 Uniswap V2 之後,真的發現它的數學模型很直觀,程式碼也透明。雖然風險依然存在(像是無常損失、智慧合約漏洞、手續費競爭),但至少能清楚理解運作邏輯。
我覺得最大的收穫是:
首先Uniswap是什么?
Uniswap 是一个在以太坊上运行的去中心化交易所(DEX)协议,它利用智能合约和自动做市商(AMM)模型实现加密货币的自动化、无需许可的交易。
Uniswap v2 core源码分析
目录结构
v2-core/
└── contracts/
├── interfaces/
│ ├── IUniswapV2ERC20.sol
│ ├── IUniswapV2Factory.sol
│ ├── IUniswapV2Pair.sol
│ └── IERC20.sol
├── UniswapV2ERC20.sol
├── UniswapV2Factory.sol
└── UniswapV2Pair.sol
UniswapV2Factory
UniswapV2Factory 是 Uniswap V2 的注册中心和交易对的创建者。其设计遵循了“工厂模式”,通过一个中心化的合约来创建和管理一系列同类型的合约实例(即 UniswapV2Pair 合约)。
核心函数:
UniswapV2ERC20
UniswapV2ERC20 是一个实现了 ERC20 标准的代币合约,专门用作流动性凭证(LP Token)。当用户向一个 UniswapV2Pair 合约中添加流动性时,该合约会铸造(mint)相应数量的 LP Token 给用户。用户可以随时通过销毁(burn)这些 LP Token 来取回其在流动性池中的份额。
核心:
UniswapV2Pair
UniswapV2Pair是 Uniswap V2 中最核心、最复杂的合约。每一个 UniswapV2Pair 实例都代表一个流动性池,负责存储两种代币的储备金,并实现代币的兑换和流动性管理。
核心重点:
流动性管理:
mint(address to)
:铸造LP Token,当用户添加流动性时,根据存入的代币数量计算生成应获得的LP Token,并将其发送到指定地址。burn(address to)
:销毁LP Token,当用户移除流动性时,销毁其所持有的LP Token,并按比例返还流动性池中的两种代币。代币兑换:
swap(uint amount0Out, uint amount1Out, address to, bytes calldata data)
: 这是代币兑换的核心函数,用户将一种代币换成另一种代币。amount0Out
和 amount1Out
分别代表期望换出的 token0 和 token1 的数量,to 是接收代币的地址。data 参数则用于支持闪电兑换(Flash Swap)后的回调。价格预言机:
price0CumulativeLast 和 price1CumulativeLast: 这两个状态变量用于实现时间加权平均价格(TWAP)预言机。
update()
: 在每次交易或流动性变更之前,会调用此内部函数来更新价格累加器。核心机制
Uniswap V2 的核心是其自动做市商(AMM)模型,具体采用的是恒定乘积做市商(Constant Product Market Maker)模型。
核心公式:
x⋅y=k
其中:
运作原理:
在一个交易对中,两种代币的储备量的乘积 k 在交易过程中保持不变(忽略手续费)。当用户想要用 token0 兑换 token1 时,他们向池中存入一定数量的 token0(假设为 Deltax),池子会根据恒定乘积公式计算出应返还给用户的 token1 数量(Deltay)。
交易后的新的储备量为 x′=x+Deltax
和 y′=y−Deltay
。为了维持乘积不变,必须满足:(x+Δx)⋅(y−Δy)=k
由此可以推导出 Deltay 的计算公式。
手续费:
实际上,每次交易都会收取 0.3% 的手续费。这笔手续费会留在流动性池中,从而增加了 k 的值。这意味着流动性提供者(LP)可以通过赚取交易手续费来获得收益。包含手续费的交易公式变为:(x+Δx⋅0.997)⋅(y−Δy)=x⋅y
时间加权平均价格 (TWAP) 预言机
为了防止价格预言机被恶意操控(例如通过在一个区块内的连续交易来瞬间拉高或砸低价格),Uniswap V2 设计了一种巧妙的**时间加权平均价格(Time-Weighted Average Price, TWAP)**机制。
实现原理:
UniswapV2Pair 合约中维护了两个关键的状态变量:
计算公式:
假设在时间点 t_1 更新了一次价格 P_1,下一次更新发生在时间点 t_2,期间的价格为 P_1。那么在 t_2 时刻,价格累加器会增加 P_1cdot(t_2−t_1)。
如何使用:
外部合约可以通过在两个不同的时间点读取价格累加器的值,然后用两个值的差除以两个时间点的时间差,来计算出这段时间内的 TWAP。
TWAP(t1,t2)=t2−t1priceCumulativeLastt2−priceCumulativeLastt1
这种机制使得攻击者需要在一个很长的时间段内持续地操控价格,才能显著地影响 TWAP 的计算结果,而这样做的成本极高,从而保证了价格预言机的可靠性。
思考:
Uniswapv2如果刚创建,交易对是空的,那么如何确定初始化的兑换比,例如ETH/USDT?
这个问题就是AMM冷启动的本质,对于刚创建的、完全空的Uniswap V2交易对,初始兑换比例完全由第一人向该交易对体哦那个流动性的人来决定。这个人会首次存入池中两个代币的数量,达到一定的比例。
UniswapV2是如何维持代币价格和市场价格几乎一致?
Uniswap V2 本身是一个被动的、孤立的系统。它并不知道,也无法知道外部世界(例如币安、Coinbase 等中心化交易所)的代币价格。套利者会通过套利手段帮助uniswap维持价格平衡。
一、核心机制:自动化做市商(AMM)模型
恒定乘积公式
交易价格由公式 x * y = k 决定,其中 x 和 y 是资金池中两种代币的储备量,k 为常数。该公式确保交易后储备量的乘积不变,价格随供需动态调整
手续费机制:每笔交易收取 0.3% 的手续费(例如兑换 100 ETH 需支付 0.3 ETH),手续费直接注入资金池,使 k 值缓慢增加,提升流动性价值
流动性池与 LP 代币
流动性提供者(LP)向池中存入等值的两种代币(如 ETH/USDC),获得 LP 代币作为所有权证。
LP 代币占比反映用户在池中的份额,赎回时可按比例取回本金及累积的手续费收益
LP 代币符合 ERC-20 标准,可自由交易或质押,实现了流动性的代币化
二、合约架构解析
Uniswap V2 采用模块化设计,分为核心(Core)与周边(Periphery)合约:
核心合约(Core Contracts)
UniswapV2Factory.sol :部署和管理交易对资金池(Pair),每个币对对应一个独立合约
UniswapV2Pair.sol :实现具体交易逻辑(如 swap、mint、burn)及储备量管理,包含恒定乘积公式的代码实现
UniswapV2ERC20.sol :发行和管理 LP 代币,记录流动性提供者的权益
周边合约(Periphery Contracts)
UniswapV2Router.sol :简化用户交互,提供原子操作(如自动兑换代币后再添加流动性),降低前端开发复杂度
总结
Uniswap V2 通过恒定乘积公式和模块化合约设计,构建了高效的去中心化交易引擎。其核心创新点包括:
LP 代币化:将流动性所有权转化为可组合的资产
TWAP 预言机:为 DeFi 协议提供相对可靠的价格数
闪电贷集成:扩展了资本利用率及套利场景
Uniswap 是运行在以太坊上的去中心化交易所(DEX)协议,借助智能合约与自动做市商(AMM)模型,实现加密货币的自动化、无需许可交易。Uniswap V2 作为其重要版本,在 V1 基础上进行了多方面优化与创新,是理解 DeFi 基础的优质入门内容。
Uniswap V1 以 ETH 作为桥接代币,实现 ABC 与 XYZ 交易需借助 ETH/ABC 和 ETH/XYZ 交易对,这使流动性提供者面临 ETH 风险敞口。而 V2 允许为任意两个 ERC-20 代币创建交易对合约,可直接使用 ABC/XYZ 交易对,省去双倍交易手续费和滑点,对 DeFi 生态影响重大,例如项目方可直接建立 USDC/DAI、WBTC/ETH 等交易对。
V2 允许用户在支付费用前先收到并使用代币,只要在同一个交易中完成支付。用户可在不持有任何代币的情况下,先从交易池中 “借出” 代币,在同一原子交易中用这些代币进行套利等操作,然后在交易结束前将借出的代币(加上手续费)归还给交易池。
V2 交易对铸造的资金池原生支持元转账,用户可通过签名授权转账,无需从地址进行链上转账。任何人都可调用permit
函数发送签名,支付 gas 费用并在同一个转账中执行其他操作。
solidity
function swap(uint amount0Out, uint amount1Out, address to) external;
Uniswap V2 采用模块化设计,分为核心(Core)与周边(Periphery)合约。
plaintext
v2-core/
└── contracts/
├── interfaces/
│ ├── IUniswapV2ERC20.sol
│ ├── IUniswapV2Factory.sol
│ ├── IUniswapV2Pair.sol
│ └── IERC20.sol
├── UniswapV2ERC20.sol
├── UniswapV2Factory.sol
└── UniswapV2Pair.sol
UniswapV2Router.sol :简化用户交互,提供原子操作(如自动兑换代币后再添加流动性),降低前端开发复杂度。
刚创建且完全空的 Uniswap V2 交易对,初始兑换比例由第一个向该交易对提供流动性的人决定,此人首次存入池中两个代币的数量,形成初始比例。
Uniswap V2 本身是被动、孤立的系统,无法知晓外部中心化交易所(如币安、Coinbase)的代币价格。套利者会通过套利手段帮助其维持价格平衡,当 Uniswap V2 上代币价格与外部市场价格存在差异时,套利者会在价格低的平台买入代币,在价格高的 Uniswap V2 上卖出,赚取差价,此过程会使 Uniswap V2 上代币价格逐渐与市场价格趋于一致。
Uniswap V2 是以太坊上一个去中心化、无需许可的加密货币交易所。它不使用传统的订单簿模型,而是开创性地采用了**自动化做市商(Automated Market Maker, AMM)**机制。
其核心思想是流动性池(Liquidity Pools)。用户(流动性提供者,LP)将两种等值的 ERC-20 代币存入一个智能合约中,形成一个交易对池。其他用户则可以直接与这个池子进行交易。
价格发现机制依赖于一个简洁的数学公式:恒定乘积公式(Constant Product Formula)。
x∗y=k
其中:
x
是池中代币 A 的数量。y
是池中代币 B 的数量。k
是一个常数(乘积)。当交易发生时,协议会从池中取走一种代币,并向池中添加另一种代币,但必须确保在不考虑手续费的情况下,新的 x
和 y
的乘积 k
保持不变。这创造了一条平滑的价格曲线,资产的价格由池中两种代币的相对比例决定。
相较于 V1 的重大改进:
v2-core
v2-core
是 Uniswap V2 协议的心脏。它的设计哲学是极简主义和极致安全。这部分代码直接掌管着所有流动性资金,因此其代码量被刻意减少,逻辑清晰,并经过了严格的审计。
v2-core
主要由三个核心合约组成:UniswapV2Factory
、UniswapV2Pair
和 UniswapV2ERC20
。
v2-core/contracts/
目录结构解析v2-core/
└── contracts/
├── interfaces/ # 接口定义:规定了合约必须实现哪些函数
│ ├── IUniswapV2ERC20.sol
│ ├── IUniswapV2Factory.sol
│ ├── IUniswapV2Pair.sol
│ └── IERC20.sol
├── UniswapV2ERC20.sol # 流动性凭证 (LP Token) 的实现
├── UniswapV2Factory.sol # 工厂合约:创建和索引所有交易对
└── UniswapV2Pair.sol # 交易对合约:每个交易对的独立市场
UniswapV2Factory.sol
(工厂合约)工厂合约是整个协议的注册中心和入口点。它是一个单例合约(Singleton),意味着在整个以太坊网络上只有一个官方的 Uniswap V2 工厂合约。
核心职责:
UniswapV2Pair
合约的实体。关键函数解析:
createPair(address tokenA, address tokenB)
:
DAI/WETH
和 WETH/DAI
创建出两个不同的池子)。CREATE2
操作码部署一个新的 UniswapV2Pair
合约。这是一个关键特性,因为它允许在链下以确定性的方式计算出交易对的地址,而无需实际查询区块链。PairCreated
事件。getPair(address tokenA, address tokenB)
: 返回给定代币对的合约地址。如果不存在,则返回零地址。allPairs(uint)
和 allPairsLength()
: 用于遍历所有已创建的交易对。feeTo
和 feeToSetter
: 这两个变量用于控制协议级别的费用开关。如果 feeTo
地址被设置,那么每笔交易手续费(0.3%)中的 1/6(即交易额的 0.05%)会被发送到该地址,作为协议收入。UniswapV2Pair.sol
(交易对合约)如果说工厂是注册中心,那么交易对合约就是真正的市场。每一个 ERC20-ERC20 交易对都是一个独立的、由 UniswapV2Pair.sol
部署的智能合约实例。它同时承担了流动性池和 AMM 交易引擎的双重角色。
核心职责:
mint
)和移除(burn
)流动性的操作。关键函数解析:
swap(uint amount0Out, uint amount1Out, address to, bytes calldata data)
:
amount0Out
或 amount1Out
)和接收地址 to
。x * y = k
的关系(同时扣除 0.3% 的手续费)。to
地址。data
参数用于支持闪电兑换。如果 data
不为空,合约会在执行完兑换后,调用 to
地址合约上的一个回调函数,从而实现闪电兑换的逻辑。mint(address to)
:
to
地址,代表其在池中的份额。burn(address to)
:
to
地址。UniswapV2ERC20.sol
(LP 代币合约)这个合约是 LP 代币 的具体实现。LP 代币本质上是一种标准的 ERC-20 代币,它代表了流动性提供者在特定交易对池中所占的份额。
核心特性:
UniswapV2Pair.sol
继承了 UniswapV2ERC20.sol
,这意味着每个交易对合约本身就是一个功能完备的 ERC-20 (LP) 代币合约。
interfaces/
(接口目录)接口(Interface)在 Solidity 中扮演着合约蓝图或 API 规范的角色。它只定义函数签名(名称、参数、返回值),而不包含任何具体实现。这确保了不同合约之间可以以一种标准化的方式进行交互。
IERC20.sol
: 这是 ERC-20 代币的标准接口。Uniswap 需要与各种不同的 ERC-20 代币交互,通过这个接口,它可以调用任何标准代币的 transfer
、approve
、balanceOf
等函数。IUniswapV2Factory.sol
: 定义了工厂合约必须拥有的函数,如 createPair
和 getPair
。IUniswapV2Pair.sol
: 定义了交易对合约必须拥有的函数,如 swap
、mint
、burn
和 getReserves
。IUniswapV2ERC20.sol
: 定义了 LP 代币必须拥有的 ERC-20 相关函数。Uniswap V2 的 v2-core
通过一个 工厂-交易对(Factory-Pair) 模式,构建了一个优雅、安全且高效的去中心化交易系统。
UniswapV2Factory
) 负责创建和登记所有的交易市场。UniswapV2Pair
) 是成千上万个独立的、自治的市场,每个市场都保管着自己的资金,并根据恒定乘积公式自主运行。UniswapV2ERC20
) 将流动性份额代币化,使其具有了强大的金融可组合性。interfaces/
) 则确保了整个系统以及外部应用能够以一种统一、可预测的方式与核心合约进行交互。最近啃 Uniswap V2 的核心机制,作为一名运营的从业人员,我没纠结太多底层代码,反而更关注 “用户为什么用它”“生态如何靠规则自运转”“运营能在其中做什么”—— 这篇笔记就从我的视角,记录下那些让我突然 “想通” 的关键节点。
接触之前,我总疑惑 “为什么大家愿意用一个没有客服、没有后台管控的交易所”,直到理清它的核心逻辑,才发现它从机制上解决了 Web3 运营的两大核心难题:
Web2 运营要花大量精力做 “信任铺垫”,比如展示资质、优化客服响应,但 Uniswap V2 完全不用 —— 它的 “自动化做市商(AMM)” 机制本身就是信任基础。
简单说,用户交易不再依赖 “对手方”,而是和 “流动性池” 交互:比如我想把 ETH 换成 USDC,本质是从 ETH-USDC 池中按 “恒定乘积公式(x*y=k)” 兑换,池里的资产由其他用户(流动性提供者,LP)存入,所有交易价格、份额分配都由智能合约自动计算,没有任何人能篡改。
对运营来说,这意味着 “信任成本趋近于零”:不用向用户解释 “我们不会卷款跑路”,合约代码开源就是最好的证明,反而可以把精力放在 “让用户看懂这个规则” 上 —— 比如用动画演示 “存入 1 ETH 和对应 USDC 后,如何按比例获得 LP (Liquidity Provider) 代币,以及后续如何赚取手续费分成”,比干巴巴的文字说明有效得多。
Web3 运营最头疼的就是 “用户只薅羊毛不贡献”,但 Uniswap V2 用 “流动性挖矿 + 手续费分成” 让用户主动成为生态共建者。
我算过一笔账:假设我往 ETH-USDC 池存入 1% 的流动性,那么所有通过这个池产生的交易(Uniswap V2 默认收 0.3% 手续费),我能分到 1% 的 0.3%—— 相当于 “躺着赚被动收入”。这种 “贡献即受益” 的模式,不用运营催,就有大量用户愿意成为 LP,甚至自发在社群分享 “哪个池收益高”“如何规避无常损失”。
这给我的启发是:Web3 运营不用强行 “拉新促活”,而是要设计 “让用户能赚到钱 / 获得价值” 的规则。比如后续做类似 AMM 产品的运营,重点不是发优惠券,而是用数据可视化工具帮用户算 “投入多少、预期收益多少、风险点在哪”,降低用户的决策成本。
虽然 Uniswap V2 已经很成熟,但从运营角度看,它的一些机制也存在 “用户体验盲区”,这些其实是后续运营可以发力的地方:
这是我学习时最绕的部分,也是很多用户不敢当 LP 的核心原因。简单说,当池子里两种代币价格波动大时,LP 取出资产的价值可能比存入时还低(比如 ETH 价格暴涨,用户兑换 ETH 多、USDC 少,LP 手里的 USDC 变多但 ETH 变少,整体价值缩水)。
Uniswap V2 本身没有解决这个问题,但运营可以做 “风险前置科普”:比如制作 “无常损失计算器”,让用户输入 “存入金额、预期价格波动”,就能看到可能的损失比例;再整理 “低波动代币池推荐”(比如稳定币池 USDC-USDT),告诉新手 “先从风险低的池入手”。其实,很多社群里用户会分享 “对冲无常损失的小技巧”,运营的工作可以把这些内容整理成合集,既降低用户恐惧,又能提升社群活跃度。
Uniswap V2 单个池的流动性有限,有时会出现 “滑点高”(比如大额交易导致价格偏差大)的问题。虽然这是机制本身的局限,但运营可以通过 “整合流动性聚合工具” 来优化体验。
比如我在测试时发现,有些第三方工具会自动对比 Uniswap V2、SushiSwap 等多个 AMM 的流动性,帮用户选择 “滑点最低、手续费最少” 的交易路径。如果运营能在产品页面嵌入这类工具,或者在社群推荐 “靠谱的聚合器清单”,用户会觉得 “更省心”。不是自己做所有事,而是链接生态里的优质资源,帮用户解决 “信息差” 问题。
Uniswap V2 没有官方客服,但它的社群(Discord、Twitter)却异常活跃。我观察到,用户会自发解答新手问题(比如 “如何添加流动性”“LP 代币怎么提取”),甚至会集体讨论 “某个新代币是否适合上池”。
Web3 社群运营不用 “控评” 或 “强行引导话题”,而是要做 “规则制定者和氛围维护者”。比如设定 “禁止虚假项目推广”“提问前先看 FAQ” 的规则,再扶持几个 “社群 KOL”(比如经常分享干货的老 LP),让社群自己形成 “互助、分享” 的氛围。我还注意到,Uniswap 团队会在社群同步 “合约更新进度”“新功能投票”,这种 “透明沟通” 比发红包更能提升用户忠诚度。
作為 DeFi 領域的重要項目,Uniswap V2 在技術實現和架構設計上展現了其特點。通過對整個代碼庫的詳細分析,本文從技術實現、架構設計、數學原理、安全機制等多個維度提供完整的學習總結。
Uniswap V2 採用了相對簡潔的模塊化架構,主要由以下核心合約組成:
這種模塊化設計帶來了以下特點:
Uniswap V2 將自動化做市商(AMM)的經濟學原理轉化為代碼實現。恒定乘積公式 x * y = k
的實現體現了以下特性:
UniswapV2Factory.sol 作為系統的管理中心,其技術實現包含幾個重要特性:
bytes memory bytecode = type(UniswapV2Pair).creationCode;
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
assembly {
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
使用 create2
操作碼實現的確定性部署具有以下技術優勢:
mapping(address => mapping(address => address)) public getPair;
// ...
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS');
getPair[token0][token1] = pair;
getPair[token1][token0] = pair;
雙向映射的實現提供:
address public feeTo;
address public feeToSetter;
function setFeeTo(address _feeTo) external {
require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
feeTo = _feeTo;
}
權限管理的設計特點:
UniswapV2Pair.sol 實現了 AMM 的核心邏輯,包含多個技術要點。
uint112 private reserve0;
uint112 private reserve1;
uint32 private blockTimestampLast;
存儲優化的技術考量:
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'UniswapV2: LOCKED');
unlocked = 0;
_;
unlocked = 1;
}
重入鎖的實現特點:
初始流動性計算:
if (_totalSupply == 0) {
liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
_mint(address(0), MINIMUM_LIQUIDITY);
}
後續流動性計算:
liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
流動性計算的技術邏輯:
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
// 樂觀轉帳
if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out);
if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out);
// 閃電貸支持
if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
// 不變量檢查
uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
}
交易機制的技術特點:
樂觀轉帳模式:
閃電貸整合:
費用機制實現:
function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
uint32 timeElapsed = blockTimestamp - blockTimestampLast;
if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
}
}
TWAP 預言機的技術實現:
UniswapV2ERC20.sol 在標準 ERC20 基礎上加入了現代 DeFi 特性。
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
_approve(owner, spender, value);
}
Permit 功能的技術實現:
constructor() public {
uint chainId;
assembly {
chainId := chainid
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes(name)),
keccak256(bytes('1')),
chainId,
address(this)
)
);
}
域分隔符的技術作用:
恒定乘積公式 x * y = k
具有以下數學性質:
當前價格 = dy/dx = y/x(邊際情況下)
這個關係式意味著:
對於輸入量 Δx,輸出量 Δy 的計算公式:
(x + Δx) * (y - Δy) = k = x * y
=> Δy = y * Δx / (x + Δx)
考慮 0.3% 費用後的實際公式:
Δy = y * (Δx * 0.997) / (x + Δx * 0.997)
滑點函數的特性:
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
SafeMath 的實現特點:
library UQ112x112 {
uint224 constant Q112 = 2**112;
function encode(uint112 y) internal pure returns (uint224 z) {
z = uint224(y) * Q112;
}
function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
z = x / uint224(y);
}
}
UQ112x112 格式的技術優勢:
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
算法實現的技術特點:
Uniswap V2 採用了多層次的安全防護策略:
x * y >= k
在所有操作後成立require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
K 值檢查的作用:
樂觀轉帳機制的安全保障:
閃電貸的安全機制:
uint112 private reserve0;
uint112 private reserve1;
uint32 private blockTimestampLast;
打包優化的效果:
uint _totalSupply = totalSupply; // gas savings
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
緩存策略的作用:
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
位運算優化:
{ // scope for _token{0,1}, avoids stack too deep errors
address _token0 = token0;
address _token1 = token1;
// ...
}
作用域控制的目的:
Uniswap V2 遵循既有的技術標準:
event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to);
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
事件系統的技術價值:
0.3% 交易費用的技術實現:
LP 代幣的技術設計:
Uniswap V2 在多個方面建立了技術標準:
通過分析 Uniswap V2,可以總結出幾個重要的設計原則:
Uniswap V2 在技術發展中的位置:
對於技術學習者,Uniswap V2 提供了以下價值:
基於 Uniswap V2 的技術基礎,DeFi 領域的發展方向:
核心概念: V2 建立了最基本的去中心化交易所模式。想像一個自動販賣機,但不是賣可樂,而是交換不同的加密貨幣。
運作原理:
實際例子: 假設你想用 1000 USDC 買 ETH,系統會計算:
Uniswap V2作为去中心化金融(DeFi)领域的重要里程碑,凭借其创新的技术架构和底层逻辑,为加密货币交易带来了革命性的变革
Uniswap V2采用“恒定乘积做市商”机制来确定交易价格和执行代币交换。在每个配对合约中,两种代币的储备量x和y满足x * y=k的关系,其中k为常数。当用户发起一笔交易,用代币A兑换代币B时,配对合约会根据这一公式计算出用户需要支付的代币A数量和能够获得的代币B数量。具体计算过程如下:
Uniswap V2由一系列智能合约组成,主要包括工厂合约(UniswapV2Factory)、交易对合约(UniswapV2Pair)以及路由合约(UniswapV2Router02)等。这些合约相互协作,共同构建起一个去中心化的交易生态系统。
## 流动性管理逻辑
流动性是Uniswap V2正常运行的基础,流动性提供者的参与对于维持交易对的流动性和价格稳定性至关重要。Uniswap V2通过一系列机制来鼓励和管理流动性提供者的行为。
流动性代币(LP)机制
流动性挖矿激励机制
流动性再平衡机制
研究Uniswap V2的技术原理和底层逻辑后,觉得恒定乘积做市商机制(xy=k)是Uniswap V2最核心的创新。这个看似简单的数学公式,却为去中心化交易提供了很靠谱的的解决方案。它不仅能自动调节价格,还能通过滑点机制来平衡大额交易对市场的冲击,有效保护了流动性提供者的利益。在流动性管理方面,Uniswap V2展现出了独特的智慧。LP代币机制让流动性提供者能够灵活管理资金,而流动性挖矿激励和再平衡机制的巧妙设计,则确保了充足的流动性和价格的稳定性。这些机制相互配合,构建出了一个运转流畅的去中心化交易生态。作为DeFi领域的重要基础设施,Uniswap V2展示了去中心化交易所的无限可能。它不仅为用户提供了便捷的交易体验,更为整个DeFi生态系统的发展奠定了坚实基础。