The Web3 社区产品课程之 Defi 产品详解
一.概述
DeFi 即去中心化金融,火于 2020-2021 年,因此那段时间也被称为 DeFi Summer。根据 TradingView 的统计数据,2020 年夏天刚崛起时,DeFi 总市值仅 50 亿美元,随后一路飙升,在 2021年底达到了最高峰,将近 1800 亿美元。
DeFi 有很多板块,主要包括
二. 去中心化交易所代表产品-Uniswap
1.UniSwap 概述
在 Uniswap 之前,去中心化交易所(DEX)的形态主要是基于订单簿的模型,这种模型与传统中心化交易所(如 Binance、Coinbase)类似,但去中心化版本存在许多问题。这些早期 DEX 的形态和面临的挑战包括:
1.1.基于订单簿的去中心化交易所(Order Book DEX)
- 概述:基于订单簿的去中心化交易所类似于传统金融市场,交易是通过买单和卖单的匹配来实现的,买家和卖家分别设定他们愿意买入或卖出的价格和数量。
- 例子:早期的去中心化交易所如 EtherDelta 和 0x(最初的版本)都是基于订单簿的 DEX。
1.2.特点:
- 订单簿管理:用户发布买卖订单,其他用户选择是否接受这些订单。买卖双方的需求会通过撮合系统进行匹配。
- 链上交易:每次订单发布或取消都需要链上操作,这使得交易速度较慢且费用较高。
- 流动性依赖:订单簿系统的流动性严重依赖于活跃的买卖双方。当交易活跃度低时,流动性不足,交易难以快速执行。
1.3.问题与挑战:
- 低流动性:在去中心化的订单簿系统中,流动性分散,用户需要等待匹配订单的时间较长,导致成交不畅。
- 高费用和低效率:由于所有订单和匹配过程都在链上进行,每次操作都需要支付交易费(gas),使得效率低下,尤其是在网络繁忙时。
- 用户体验差:由于订单簿系统复杂且需要用户手动操作,用户体验不佳,尤其对于不熟悉交易的用户。
1.4.链上订单簿 vs 链下订单簿
- 链上订单簿:像 EtherDelta 这样的 DEX 将所有订单发布和管理都放在链上进行。这虽然实现了去中心化,但显著增加了交易成本和延迟。
- 链下订单簿:一些项目(如 0x 协议)尝试将订单簿管理放在链下,只将订单撮合结果放在链上。这种模型改善了交易速度和费用问题,但仍然依赖流动性提供者。
1.5.Atomic Swap(原子交换)
在订单簿 DEX 之外,另一种去中心化交易方式是原子交换(Atomic Swap),这种技术允许两方在不同的区块链之间直接交换资产,而无需中介。原子交换的早期尝试主要是针对比特币和其他区块链资产之间的交易,典型的例子有 Decred 和 Lightning Network 的原子交换。
1.5.1.优点:
- 完全去中心化:原子交换不需要第三方托管资产,交易通过智能合约保证两方同时完成交换。
- 跨链交易:用户可以在不同的区块链之间进行直接的去中心化交易,而不需要中心化的交易所。
1.5.2.问题与挑战:
- 技术复杂性:原子交换的技术实现较为复杂,难以被普通用户采用。
- 流动性和交易速度:原子交换的交易速度较慢,且跨链资产的流动性有限。
1.6.去中心化订单路由协议(如 0x 协议)
0x 是一种去中心化的订单路由协议,旨在为 DEX 提供标准化的交易基础设施。0x 允许开发者创建自己的 DEX,使用链下订单簿和链上结算的混合模式来提高效率。
1.6.1.优点:
- 协议灵活性:0x 允许开发者基于其协议构建不同的 DEX,提供了很高的灵活性。
- 改善用户体验:通过将订单簿放在链下,减少了用户在链上发布和取消订单的费用。
1.6.2.挑战:
- 流动性分散:虽然 0x 协议标准化了 DEX 的构建,但流动性仍然分散在不同的平台上,无法形成强大的交易市场。
2.自动做市商模型
自动做市商模型(Automated Market Maker, AMM)是一种无需传统订单簿撮合的去中心化交易方式,广泛应用于去中心化交易所(DEX)如 Uniswap、SushiSwap 和 Balancer 中。AMM 通过算法自动定价和管理流动性,使用户能够轻松交换代币。
2.1.流动性池
流动性池是 AMM 模型的基础,流动性提供者(Liquidity Providers, LP)将两种代币(通常是等值的代币)存入池中,供交易者使用。流动性池替代了传统的订单簿,成为买卖双方进行交易的市场。每个流动性池都是一对代币的组合,例如 ETH/DAI。流动性提供者通过将这两种代币存入流动性池来提供流动性,并在每次交易时收取一小部分交易费用。
2.2.定价公式:
AMM 通过预定的算法来确定代币之间的价格。最常见的定价公式是 Uniswap 采用的 恒定乘积公式: x × y=k; 其中,x 和 y 是池中两种代币的数量,k 是一个常数(即在交易过程中保持不变的总流动性)。当用户买入或卖出其中一种代币时,另一个代币的数量会自动调整,以维持这个等式不变。这种算法保证了交易双方能够在任何时候进行代币交换。
2.3.无订单簿、无中介:
AMM 模型中不存在传统意义上的买单和卖单,也不需要中介来匹配订单。交易者直接与流动性池进行交互,按照当前算法设定的价格进行代币交换。这大大简化了交易流程,也使得任何人都可以成为流动性提供者。
2.4.流动性提供者收益
流动性提供者通过为池子提供资金获得收益。每次交易会产生一笔手续费(例如 Uniswap V2 的 0.3%),这些手续费按比例分配给所有为该流动性池提供流动性的 LP。流动性提供者也会承担一定的无常损失(Impermanent Loss)风险。
2.5.无常损失
无常损失指的是当流动性提供者的代币在价格波动期间受到的损失。由于 AMM 的定价算法,LP 存入的代币可能会在市场价格变化时造成损失,尤其是当代币价格发生大幅波动时,这种损失会更加明显。然而,如果价格最终恢复到初始状态,无常损失会减少或消失。
2.6.流动性挖矿和激励
为了鼓励更多人向流动性池提供流动性,许多 AMM 协议提供额外的激励机制,如流动性挖矿(Liquidity Mining)。用户通过提供流动性不仅能赚取交易手续费,还可以获得协议的原生代币作为奖励。
2.7.自动做市商模型的优点:
- 去中心化和无许可性:任何人都可以为流动性池提供流动性或在池子中交易,无需许可或信任第三方。
- 流动性提高:流动性池的设计使得即便没有大量的主动买家和卖家,也可以确保流动性并为用户提供流畅的交易体验。
- 简化的用户体验:AMM 摆脱了复杂的订单簿和撮合系统,降低了用户的学习门槛。
2.8.自动做市商模型的挑战:
- 无常损失:流动性提供者面临代币价格波动带来的无常损失,特别是在价格大幅变化时,这种损失可能超过交易费用收益。
- 资本效率较低:AMM 模型中需要较大的流动性池来支持大额交易,随着交易量的增长,这种资本效率的低下表现得更为明显。
- 滑点:交易过程中,如果交易量较大,相对于流动性池的规模,可能会引发滑点(Slippage),即实际成交价格与预期价格的差异。
2.9.示例:ETH/DAI 流动性池中的交易
假设在 Uniswap V2 上有一个 ETH/DAI 流动性池。该池中目前有以下储备:
- 100 ETH
- 40,000 DAI
根据 AMM 的 恒定乘积公式 x × y=k,其中 x 代表池中的 ETH 数量,y 代表 DAI 数量,公式如下:
100×40000=4000000
在这个例子中,恒定乘积 k为 4000000
2.9.1..用户用 10 ETH 购买 DAI
现在假设有一个用户想用 10 ETH 从这个流动性池中购买 DAI。根据 Uniswap 的定价算法,交易后 ETH 的数量将变为 110 ETH,而池中的 DAI 数量将自动减少,以保持恒定乘积 k 不变。
新状态下池中的 DAI 数量 y 可以通过以下公式计算:
110 × y=4000000
解出 y:
y = 4000000 / 110 = 36363.64 DAI
因此,用户将从流动性池中获得:
40,000−36,363.64=3636.36DAI
用户用 10 ETH 购买了 3636.36 DAI。
2.9.2.价格滑点
交易完成后,池中的 ETH 数量增加,DAI 数量减少,这意味着池中 ETH 的价格升高。用户实际获得的 3,636.36 DAI 相比交易前的价格出现了滑点,因为交易量较大相对于池的总规模来说,价格会发生较大变化。
2.9.3.流动性提供者的收益
在 Uniswap V2 中,每次交易都会收取 0.3% 的交易手续费。对于这笔交易,手续费如下:
10×0.003=0.03ETH
这笔手续费会按比例分配给为这个 ETH/DAI 流动性池提供流动性的流动性提供者。
2.9.4.无常损失
流动性提供者由于池中代币价格的变化,可能会产生无常损失。假设在这个例子中,ETH 的价格在用户交易前是 400 DAI/ETH,而在用户购买后,ETH 的价格升到了 403.64 DAI/ETH。这种价格波动可能导致流动性提供者在撤出流动性时,相比不参与池的情况下损失一部分潜在收益。
3.UniSwap V1
Uniswap 出现之前,去中心化交易所的主要模式是基于订单簿的模型,但由于这些 DEX 依赖活跃的买卖双方和链上操作,导致交易效率低、流动性不足,用户体验较差。Uniswap V1 的自动做市商(AMM)模型通过引入流动性池和定价算法,避免了这些问题,使得交易更流畅、用户体验更好,并为 DEX 带来了革命性变化。
Uniswap V1 是一个开创性的去中心化交易平台(DEX),基于以太坊区块链开发,于 2018 年 11 月推出。它是自动做市商(AMM)模型的第一个实际应用,允许用户无需中介直接在链上交易 ERC20 代币。Uniswap V1 的核心特点和机制如下:
3.1.核心机制:
- 自动做市商(AMM)模型:Uniswap V1 不依赖于传统的订单簿交易模式,而是使用了自动做市商模型。该模型通过一个流动性池(Liquidity Pool)来实现交易,流动性提供者将等值的两种资产(例如 ETH 和某个 ERC20 代币)存入池中,并根据一个简单的公式 x×y=kx \times y = kx×y=k 来维持价格平衡,保证市场的流动性。
- 流动性池(Liquidity Pool):用户可以向流动性池提供资产,成为流动性提供者(LP)。作为回报,流动性提供者可以获得每笔交易的手续费(0.3%),该费用按比例分配给所有池中的流动性提供者。
- 无许可的交易和流动性提供:任何人都可以自由地在 Uniswap 上提供流动性或进行交易,无需许可或身份验证,这符合去中心化金融(DeFi)的理念。
- ETH 中心化的交易对:在 Uniswap V1 中,每一个流动性池都是基于 ETH 和某个 ERC20 代币进行的交易对。这意味着如果用户想要交换两种 ERC20 代币,必须先将第一种代币兑换成 ETH,再将 ETH 兑换为第二种代币。
3.2.Uniswap V1 的限制:
- 集中于 ETH 的交易对:所有交易对必须涉及 ETH,无法直接交易两个 ERC20 代币。
- 有限的可扩展性:随着 DeFi 的发展,V1 的简化设计无法满足日益增长的需求。
- 用户界面和体验:早期的用户界面较为原始,且存在一定的用户体验门槛,尤其是对新用户来说。
3.3.Uniswap v1 业务流
uniswap_factory.vy:这是一个工厂合约,负责创建新的交易合约(exchange)。每个交易合约对应一个特定的代币对。
uniswap_exchange.vy:这是交易合约的核心,处理所有交易相关的逻辑,主要功能分为:
- 添加流动性(流动池充值)
- 删除流动性(流动池提取)
- 交换功能,包括:
- ETH兑Token:用户可以将以太坊(ETH)兑换成其他代币。
- Token兑ETH:用户可以将持有的代币兑换成以太坊。
- Token兑Token(通过以太坊作为中介):用户可以将一种代币直接兑换成另一种代币,通过中间的以太坊转换。
4.UniSwap V2
4.1.UniSwap 业务流预览
- interface
- v2-sdk
- sdk-core
- info
- v2-subgraph
- v2-periphery
- solidity-lib
Interface, v2-sdk 和 sdk-core 都是前端的项目,对应 uniswap 的网页,展示页面在 interface 项目中,v2-sdk 和 sdk-core 则是做为 sdk 存在。
info 是 Uniswap 的数据分析项目,展示数据分析,主要是从 supgraph 里面的读取数据,也就是 v2-subgraph 项目
最后三个则是合约项目了,v2-core 就是核心合约的实现; v2-periphery 则提供了和 UniswapV2 进行交互的外围合约,主要就是路由合约; solidity-lib 则封装了一些工具合约。core和 periphery 里的合约实现是我们后面要重点讲解的内容。
另外,UniswapV2 其实还有一个流动性挖矿合约项目 liquidity-staker ,因为UniswapV2 的流动性挖矿只上线过一段短暂的时间,很少人知道这个项目,但是这个项目也是值得学习。
4.2.Uniswap V2 业务流详解
4.2.1.创建交易对
配对合约管理着流动性资金池,不同币对有着不同的配对合约实例,比如 USDT-WETH这一个币对,就对应一个配对合约实例,DAI-WETH 又对应另一个配对合约实例。
每个配对合约都有对应的一种 LP Token 与之绑定。其实,UniswapV2Pair 继承了UniswapV2ERC20,所以配对合约本身其实也是 LP Token 合约。
工厂合约则是用来部署配对合约的,通过工厂合约的 createPair() 函数来创建新的配对合约实例。
4.2.2.添加流动性
4.2.3.移除流动性
4.2.4.兑换
4.3.Uniswap V2 和 V1 的区别
4.3.1.合约代码用 solidity 重构
- Uniswap V1 合约是用 Vyper 写的,Uniswap V2 用 solidity 重写了
4.3.2.ERC20 到 ERC20 交易对
- 在 Uniswap V1 中,每个交易对都必须包含以太坊(ETH)作为中介,意味着 ERC20 代币之间的交易需要通过 ETH 进行两步交换:从 ERC20 转换为 ETH,再从 ETH 转换为另一种 ERC20 代币。
- Uniswap V2 支持 ERC20 到 ERC20 直接交易,这不仅简化了交易流程,还减少了交易手续费和滑点。
4.3.3.闪电交换(Flash Swaps)
- 闪电交换 允许用户无需预先支付代币即可借出合约中的任意数量的资产,只要在交易结束前支付相应的代币,或在交易过程中销毁代币。
- 这种机制类似于 Aave 或 dYdX 的闪电贷,用户可以在单个原子交易中借入和偿还资产,极大地提升了去中心化金融(DeFi)的创新能力。
4.3.4.TWAP
- Uniswap V2 中引入了内置的 时间加权平均价格(TWAP)预言机 功能。这使得开发者可以通过调用 Uniswap 合约获取价格信息,用于其他去中心化应用(Dapps)中,如借贷协议、衍生品等。
- TWAP 价格计算基于一定时间段内的价格均值,能够抵抗短期波动和攻击,增强了系统的稳健性。
4.3.5.增加了统一入口 Router 合约
- Uniswap V2 的入口在 Router 合约
4.3.6.可定制的智能合约架构
- Uniswap V2 的合约架构更加模块化和灵活,支持自定义 LP 代币、手续费模型等功能。这使得开发者可以基于 Uniswap V2 创建更加复杂的金融工具和服务。
5.UniSwap V3
5.1.Uniswap V3 的特性
- 集中流动性:在 Uniswap V2 中,流动性提供者 (LP) 必须在整个价格范围内(0 到 ∞)提供流动性。大多数资金实际上没有被有效利用,因为交易往往集中在特定的价格范围内。Uniswap V3 允许 LPs 在特定的价格区间内提供流动性,这称为“集中流动性”,提高了资金效率。这个功能可以让 LPs 将他们的资金集中在市场最活跃的价格区间,提升了收益率。
- 自定义价格范围 :LPs 在 V3 中可以为他们的流动性设定特定的价格区间。例如,一个 LP 可以选择只在 1000 到 2000 美元之间的 ETH/USD 价格范围提供流动性。如果 ETH 价格超出这个范围,他们的流动性就不会被用于交易,这有助于降低无常损失(Impermanent Loss)。
- 多级费用结构:Uniswap V3 引入了多种不同的费用层级 (0.05%、0.3%、1%),供 LPs 选择,以适应不同的市场条件和风险偏好。交易对的波动性越大,LPs 通常会选择更高的费用层,以补偿更大的无常损失风险;对于稳定币对,则可以选择较低的费用层以吸引更多的交易量。
- 无常损失管理 :集中流动性减少了资金在非活跃价格区间的分散,这有助于降低无常损失的风险。然而,LPs 仍然需要密切关注市场变化,主动调整他们的流动性价格范围。Uniswap V3 的这种设计促使 LPs 更加关注市场动向,进行主动管理。
- NFT 表示流动性头寸:在 Uniswap V2 中,LP 头寸通过 ERC-20 代币表示,每个流动性池都使用相同的 LP 代币。然而在 V3 中,由于 LPs 可以设置不同的价格范围,流动性头寸是独特的,因此使用不可替代代币 (NFT) 来表示每个 LP 的头寸。每个 NFT 都包含了流动性提供者的自定义价格区间和资金量等信息。
- 自动路由:Uniswap V3 的交易功能会自动寻找最佳的交易路径,通过不同的交易对来最大化交易效率。例如,当你想要在 ETH 和 USDC 之间进行交易时,Uniswap 可能会通过多个中间交易对来找到最具成本效益的路径,减少滑点并节省交易成本。
- 资本效率提升:集中流动性让 LPs 在更窄的价格范围内提供流动性,极大地提高了资金的利用效率。在这些区间内,LPs 的资本效率比 Uniswap V2 提高了 4000 倍,意味着 LPs 可以用更少的资本获得与 V2 相同的收益。
- 主动管理策略 : 流动性提供者可以根据市场价格的变动主动调整他们的价格区间,从而最大化收益。尽管这需要更高的参与度和市场分析,但它为专业流动性提供者提供了新的套利和管理机会。
5.2.Uniswap v3 详解业务流程
5.2.1.创建并初始化流动性池
上面流程图中的代码都比较简单,难一点的就是 getTickAtSqrtRatio,getTickAtSqrtRatio 里面的代码解析
该函数通过一系列位运算和对数计算,高效地在给定的平方根价格下找到相应的 Tick 值。Tick 是 Uniswap V3 中管理价格区间的关键,通过这个函数可以快速确定给定价格在哪个 Tick 区间内,从而实现高效的流动性管理和交易撮合。这种计算方式采用了位操作和内联汇编,确保了在区块链上的执行效率。
5.2.2.添加流动性
- MintParams 参数解释:
- token0: 组成池子的token0
- token1:组成池子的token1
- fee:费率
tickLower: 价格区间的下限对应的 tick 序号
- tickUpper: 价格区间的上限对应的 tick 序号
- amountoDesired: 要添加作为流动性的token0数量
- amount1Desired: 要添加作为流动性的token1数量
- amountoMin: 作为流动性的token0最小数量
- amount1Min: 作为流动性的tokne1最小数量
recipient: 接收头寸的地址
- deadline: 过期时间
其中,amountODesired 和amountlDesired1 其实是预估的数量。从用户端发起交易,到实际链上执行交易是存在时延的,这期间可能有其他用户也添加了流动性,所以最终成交时的数量可能会和 Desired 的值不一样。如果期间价格变化比较大,也会导致用户实际成交时的滑点很大,因此在前端页面上其实会有一个滑点设置来保护用户实际成交时不会超 amountoMin 和 amount1Min 就是根据设置的滑点值计算出来的。
5.2.3.增加流动性
5.2.4.减少流动性
函数入参除了指定头寸的 tokenld,还指定了liquidity,这是要移除的流动性数量。
实现逻辑倒也简单,先通过 tokenld 从_positions 读取出 Position 对象,然后校验头寸里的流动性不能小于要移除的流动性。之后,计算出 pool 地址,并调用 pool 合约底层的burn 函数来实现底层的移除流动性操作。然后,和增加流动性时一样,结算之前的手续费收益并更新手续费相关字段,移除的流动性也相应从头寸中减少。
5.2.5.提取手续费收益
5.2.6.销毁头寸
5.2.7.兑换
- 其中:需要跨多个池子的编码方式如下:
5.3.总结
Uniswap V3 的特性使其成为一个高度灵活和高效的去中心化交易平台,它的主要创新点包括:
- 集中流动性,提高了资金效率;
- 多级手续费层,允许流动性提供者根据风险偏好选择不同的费用结构;
- NFT 表示流动性头寸,为流动性提供者带来更多的灵活性;
- 改进的预言机机制,为 DeFi 应用提供精确的价格数据;
- 更灵活的价格滑点保护,使用户能够更安全地进行交易。
Uniswap V3 的这些创新让它在 DeFi 领域处于领先地位,适合各种类型的用户,无论是流动性提供者、交易者,还是构建在其上的应用开发者。
三. 借贷协议代表产品-Compound
Compound 是一个去中心化的借贷协议,运行在以太坊区块链上,允许用户借出或借入加密资产,并赚取或支付利息。作为 DeFi 领域的代表性项目之一,Compound 通过智能合约来管理用户的资产和交易,从而消除了传统金融中介的作用。
1.核心概念
1.1. cToken
- 当用户将资产存入 Compound 时,他们会收到相应的 cToken(例如,存入 ETH 会收到 cETH)。
- cToken 代表用户在 Compound 中的存款及其产生的利息。
- cToken 可以赎回为其代表的原始资产及其利息。
1.2.供给与借贷
- 供给: 用户可以将自己的加密资产(如 ETH、USDC、DAI 等)存入 Compound 协议,从而开始赚取利息。
- 借贷: 用户可以使用他们存入的资产作为抵押,从协议中借出其他资产。借款人需要支付利息,而这些利息将分发给供应者。
1.3. 利率模型
- 利率是动态调整的,基于资产的市场供需情况。
- 每个市场(如 ETH、DAI 等)都有一个单独的利率模型,决定了供给利率和借贷利率。
1.4. 抵押品与清算
- 借款人必须提供超额抵押品,即借款价值必须小于抵押品的价值。
- 如果借款人的抵押品价值跌破清算阈值,清算人可以部分或全部收回抵押品以偿还债务。
2.核心功能
2.1. 供给资产
- 用户可以将资产存入 Compound 协议,开始赚取利息。存入资产的用户会收到相应的 cToken。
- 这些 cToken 可以随时赎回为底层资产,赎回时会包括存款期间累计的利息。
2.2. 借贷资产
- 用户可以使用他们存入的资产作为抵押,从 Compound 协议中借出其他资产。
- 借款的利息是根据借贷市场的利率模型动态确定的。
- 借款人必须维持足够的抵押品以避免清算。
2.3. 清算机制
- 如果借款人的抵押品价值下跌到一定比例(清算阈值)以下,清算人可以触发清算过程。
- 在清算过程中,部分或全部抵押品将被出售以偿还债务。
2.4.工作流程
2.4.1.存款流程
- 用户将资产存入 Compound 协议。
- 系统根据当前的利率将资产转换为 cToken 并发放给用户。
2.4.2.借款流程:
- 用户选择要借的资产并确认借款。
- 系统计算用户可借额度,并要求用户提供足够的抵押品。
- 用户支付利息,利息动态调整。
2.4.3.清算流程:
- 当借款人的抵押品价值不足时,清算人可以发起清算。
- 系统会将部分抵押品出售给清算人,以偿还用户的债务。
>3.Compound 的治理
Compound 协议通过治理代币 COMP 实现去中心化治理。COMP 持有者可以提议、投票和执行对协议的更改,包括利率模型的调整、新资产的引入等。
- 提案: 任何持有一定数量 COMP 代币的用户可以提出治理提案。
- 投票: 所有 COMP 持有者都可以对提案进行投票。
- 执行: 当提案获得足够的投票支持后,系统会自动执行提案。
二. Compound 协议涉及的算法
1.资金利用率 (Utilization Rate, U)
资金利用率是决定借贷利率的关键参数,表示市场中借出的资产占总供应资产的比例。计算公式为:
Bash U = Total Borrows/(Total Cash + Total Borrows - Reserves) |
---|
- Total Borrows: 当前市场中已被借出的资产总量。
- Total Cash: 市场中未借出的剩余资产(流动性)。
- Reserves: 协议中的储备金,通常是保留的一部分利息收入。
借贷利率 (Borrow Rate)
借贷利率是借款人需支付的年化利率,基于资金利用率计算。
2.利率模型
Compound 使用多种利率模型,其中最常用的是跳跃利率模型。该模型在资金利用率较低时,利率增长较慢,但当利用率达到一定阈值后,利率增长会加快。
2.1.跳跃利率模型的公式
跳跃利率模型的公式分为两段,根据资金利用率 U 是否超过一个设定的阈值(称为 “Kink”)来计算利率
Bash If U <= Kink Borrow Rate = Base Rate + U + Multiplier_low If U > Kink Borrow Rate = Base Rate + U + Multiplier_low + (U - Kink) x Multiplier_high |
---|
- Base Rate: 基础利率,即最低利率。
- Multiplier_low: 低于 Kink 时的利率增长系数。
- Multiplier_high: 高于 Kink 时的利率增长系数。
- Kink: 资金利用率的阈值,当利用率超过此值时,利率增长加速。
3.供给利率的计算
供给利率(Supply Rate)是供应者能获得的年化利率,它依赖于借贷利率和资金利用率。计算公式为:
Bash Supply Rate=U × Borrow Rate × (1−Reserve Factor) |
---|
- Reserve Factor: 储备因子,表示协议保留的一部分利息收入,不分配给供应者。
4.Compound 详细业务流程
4.1.用户存款
4.2.用户赎回资产
4.3.借出流程
4.4.归还借款流程
4.5.清算流程
- 清算人一般会运行一个链下服务,监听链上的数据状态,帮借款人进行清算,清算服务确保 Compound 协议能够维持整体健康,并防止因市场波动造成系统性风险。
4.总结
Compound 是一个去中心化的借贷协议,允许用户在区块链上存入加密资产赚取利息,或者抵押资产借款。以下是 Compound 的核心功能和特点总结:
- 去中心化借贷平台:用户可以将加密资产存入 Compound 赚取利息,或抵押资产借款,整个过程通过智能合约实现,无需中介。
- 利率算法:利率是动态的,由供需关系决定。当某种资产的需求增加时,利率会上升,反之则下降。
- cToken:存入资产的用户会收到 cToken(如 cETH、cDAI),这些代币代表用户在 Compound 中的存款,且随着时间自动累积利息。
- 超额抵押机制:借款需要超额抵押,即用户必须存入高于借款金额的资产作为抵押品,以确保系统的安全性。
- 清算机制:如果借款人的抵押品价值跌破一定阈值,清算人可以部分偿还借款人的债务,并获得他们的抵押品作为奖励,保障协议安全。
- 去中心化治理:COMP 代币持有者可以对协议的变更进行投票和治理,影响利率模型、市场参数等方面。
Compound 协议为加密用户提供了一种无需信任第三方即可参与借贷市场的方式,同时利用去中心化治理和动态利率模型保持系统的长期稳定。
四. Dex 聚合器代表产品-1inch
1inch 是一个去中心化交易(DEX)聚合器,其主要目标是通过整合多个去中心化交易所(DEX)和流动性协议,提供给用户最佳的交易价格和最低的滑点。它的工作原理是扫描多个流动性来源,寻找最优的交易路径,从而帮助用户减少交易成本并提高交易效率。
1.1inch的主要特点
- 聚合多个DEX:1inch聚合了多个DEX和流动性提供协议,比如Uniswap、SushiSwap、Balancer等,使用户能够在一次交易中获得最优的交易价格。
- 智能路径优化:1inch的路由算法会智能地分配订单,选择最佳路径并在多个DEX之间分散交易,以获得最佳价格。
- GAS费用优化:1inch通过使用GasToken和优化的合约交互来帮助用户减少交易时的GAS费用。
- 流动性挖矿:1inch还推出了流动性挖矿计划,用户可以通过提供流动性来获得1INCH代币奖励。
- 1INCH治理代币:1inch拥有自己的治理代币1INCH,持有者可以参与平台的治理和提案投票。
- Limit Orders:除了常规的交换功能,1inch还支持限价订单功能,允许用户设置特定价格并等待市场达到该价格时执行交易。
1inch 作为DEX 聚合器,为用户提供了更低的交易成本、更多的流动性选择,以及更好的交易体验。在 DeFi 领域,它已经成为了一个代表性产品,尤其对于那些希望在多个平台间寻找最优交易机会的用户非常有吸引力。
2.1inch智能路径优化算法
1inch 的智能路径优化算法(即 1inch Pathfinder Algorithm)是其核心技术之一,旨在通过优化交易路径,为用户提供最优的交易价格和最少的滑点。1inch 通过聚合多个去中心化交易所(DEX)和流动性池来寻找最佳交易路径,智能地分配订单到多个流动性来源,分散交易风险,并在复杂的流动性环境中最大化用户的利益。
以下是1inch智能路径优化算法的主要步骤和原理:
2.1.多路径拆分交易
1inch 的算法会将一个交易订单拆分成多个子交易订单,分配到多个 DEX 或流动性池中进行部分执行。这种多路径拆分的方式,可以最大限度地利用不同流动性池中的最优价格,并避免一个流动性池交易量过大导致的滑点问题。
例如:
- 你希望用 ETH 换成 USDT,1inch 可能会将你的订单分成以下子交易:
- 50% 通过 Uniswap V3 完成
- 30% 通过 SushiSwap 完成
- 20% 通过 Balancer 完成
2.2.考虑滑点和交易成本
算法不仅会寻找价格最优的路径,还会综合考虑滑点和 GAS 费用。因为每个 DEX 的流动性状况不同,如果将大量交易放入一个流动性池,可能会造成显著的滑点。因此,1inch 的智能路径优化算法会尽量在滑点增加前找到更小的池来分散交易量。
此外,GAS 费用也是优化的关键。算法会比较不同路径的 GAS 成本,并通过权衡价格、滑点和GAS来确定最佳的路径。
2.3.多跳路径
在某些情况下,1inch 会通过多个代币之间的交换来实现最终的兑换目标。例如,你想要将 ETH 换成 DAI,算法可能会建议先将 ETH 换成 USDC,再从 USDC 换成 DAI。这种“多跳”交易路径有时会比直接交易更加划算,尤其当某些交易对的流动性不足时。
例如:
- ETH -> USDC -> DAI 的交易可能比 ETH -> DAI 的单一交易具有更低的滑点。
2.4.流动性池权重分配
1inch 的智能算法会根据每个流动性池的深度和交易量对流动性池进行加权分配。交易订单会被自动分配给拥有更大流动性且滑点较小的池子。
例如,如果 Uniswap V3 的 ETH/DAI 流动性池比 SushiSwap 的大且交易深度更好,那么算法可能会将更多的交易量分配给 Uniswap V3,以减少滑点和交易成本。
2.5.实时价格与流动性监测
1inch Pathfinder 不仅在执行时优化交易路径,还会实时监控每个 DEX 的价格和流动性变化。由于 DeFi 市场的价格波动较大,流动性随时可能发生变化,算法会根据当前市场条件动态调整交易路径,确保用户在价格发生显著变化时仍能获得最佳的兑换率。
2.6.模拟交易和预估收益
在用户确认交易前,1inch 的算法会模拟交易路径,向用户展示详细的交易信息,包括路径、滑点、GAS 费用以及预估的兑换数量。这种透明度让用户在确认交易前了解可能的结果。
2.7.GasToken 和 Chi GasToken
为了进一步优化交易成本,1inch 还集成了 GasToken(Chi Token),可以帮助用户在GAS费用较高时进行GAS费用折扣,通过将 GasToken 销毁来节省部分GAS费用。这在以太坊网络繁忙时尤为有用。
2.8.总结
1inch 的智能路径优化算法通过复杂的多路径拆分、多跳交易和实时价格监测,实现了DEX聚合器中最高效、最节省成本的交易方式。用户不仅能够获得最优的价格,还可以减少交易滑点和GAS费用,尤其适用于大额交易和流动性分散的市场环境。
这种算法在去中心化金融(DeFi)领域极大地提升了用户体验,是1inch 成为领先 DEX 聚合器的重要原因之一。
五. 价格预言机-ChainLink 和 Uniswap
1.预言机概述
预言机(Oracle)在区块链和智能合约领域中起着至关重要的作用。它们是连接链上(on-chain)和链下(off-chain)数据的桥梁,允许智能合约从外部世界获取和使用数据。这对于智能合约的执行至关重要,因为大多数区块链网络(如以太坊)本身并不能直接访问外部信息。
预言机是一种服务,能够将链外的真实世界数据(如资产价格、天气信息、体育比赛结果等)提供给链上智能合约。智能合约是自动化的,不依赖于人工干预,因此它们需要外部输入的数据来触发特定条件下的逻辑执行。
在去中心化金融(DeFi)应用中,经常需要用到外部的加密货币价格信息。预言机可以从多个价格数据源获取资产价格,并将其传送给智能合约,以此作为贷款清算或衍生品交易的依据。
2.预言机种类
在 Web3 领域,预言机主要分为以下这些泪奔
3.Chainlink 价格预言机
Chainlink 是去中心化金融(DeFi)生态系统中广泛使用的预言机解决方案,它将链外数据(如资产价格、天气信息、事件结果等)安全地引入到区块链上,使智能合约能够与现实世界交互。接下来我们会讲 Chainlink 价格预言机的实现原理,包括其架构、去中心化设计、数据聚合过程、安全性机制等。
3.1.Chainlink 预言机架构图
1.1.链下部分
Chainlink 预言机网络的链下部分由多个独立的节点运营商组成,这些节点通过与数据提供商、API 等外部系统的连接,获取并处理数据。链下部分的主要组件包括:
- Chainlink 节点:独立运行的服务器,负责从外部数据源获取信息,并将其传送至区块链。
- 数据源和 API:Chainlink 节点从不同的数据源或 API 获取价格信息,这些数据源可以是加密货币交易所、金融数据提供商等。
- 外部适配器:这些适配器是 Chainlink 节点与外部数据源之间的桥梁,处理数据格式转换、API 请求等任务。
1.2.链上部分
链上部分由智能合约组成,负责接收链下节点发送的数据,并将其存储在区块链上,供其他智能合约使用。链上部分的主要组件包括:
- 请求合约:用户合约请求数据时,创建并发送数据请求给 Chainlink 预言机。
- Chainlink 合约:包括 Oracle 合约和 Aggregator 合约,用于管理和处理数据请求、节点响应和数据聚合。
3.2.Chainlink 价格预言机的工作流程
- 请求数据:当一个智能合约需要某个资产的价格数据时,它会通过 Chainlink 请求合约发起一个请求。这个请求包含了所需数据的类型、数据来源等信息。
- 分发任务:Chainlink 请求合约将数据请求发送给多个独立运行的 Chainlink 节点,每个节点独立处理请求并从不同的数据源获取价格信息。
- 数据获取与处理:各个 Chainlink 节点从外部数据源获取价格数据,并对数据进行预处理和验证,以确保数据的准确性和完整性。
- 数据上链:Chainlink 节点将处理后的数据发送到区块链上的 Oracle 合约。每个节点独立提交数据,从而减少单点故障和操纵风险。
- 数据聚合:Oracle 合约会接收来自多个节点的数据,并通过 Aggregator 合约对这些数据进行聚合。通常,Chainlink 使用中位数或平均值等聚合方法,以获得最终的价格数据。这种聚合过程进一步降低了个别节点报告错误或恶意数据的影响。
- 数据传递给请求者:最终的聚合数据会被传递给最初发起请求的智能合约。该智能合约可以使用这个数据来执行逻辑操作,例如执行交易、触发清算或调整抵押品价值等。
3.3.去中心化设计
- 多节点架构:Chainlink 预言机网络由多个独立的节点组成,这些节点由不同的实体运营。每个节点独立获取数据并上链提交,极大地减少了单点故障和操纵的风险。
- 多数据源:Chainlink 支持从多个独立的数据源获取数据,确保即使个别数据源出现问题,也不会影响整个预言机网络的运行。多数据源策略增强了数据的准确性和完整性。
- 数据聚合机制:Chainlink 采用数据聚合机制来处理多个节点返回的数据。常用的聚合方法包括中位数、去除极值后的平均值等。这种方法能够有效降低个别节点返回错误数据的影响,确保最终输出的数据可靠性。
3.4.安全性机制
- 签名与验证:每个 Chainlink 节点都对其提供的数据进行数字签名,确保数据的来源可追踪且无法篡改。链上智能合约可以验证这些签名,以确保数据的真实性。
- 惩罚机制:如果一个节点提供的数据被验证为错误或恶意,Chainlink 网络可以对该节点进行惩罚,包括削减其质押的代币或降低其信誉评分。这种机制促使节点诚实地执行任务。
- 去信任机制:Chainlink 的设计目标之一是去信任化,任何单个节点或数据源都不能完全信任。通过去中心化、多节点、多数据源的设计,Chainlink 实现了无需依赖单一实体的可信数据传输。
- 声誉系统:Chainlink 预言机网络中每个节点都有一个声誉评分系统,节点的可靠性、响应速度、数据准确性等都会影响其评分。高评分的节点更容易被选中执行任务,获得更多的报酬。
4.L2 OVM Gas 预言机
5.DappLink 桥 Gas 预言机(作业)
5.1.L1 手续费预估
参考过去 32 个块的交易的手续,加权平均之后上浮 0.3% 做为一层的手续
扫块,取数据,计算手续,计算公式如下:
l2BlockFee = (TxFee1 + TxFee2 ... + TxFeen)/n
L2Fee = (l2BlockFee1 + l2BlockFee2 + ... + l2BlockFeen)/n
- TxFee: 一笔交易消耗的手续
- l1BlockFee:L1 上一个块消耗的手续费
- L1Fee:L1 层消耗的手续
5.2.L2 手续费预估
参考过去 32 个块的交易的手续,含 L1 和 L2 Fee,加权平均之后上浮 0.3% 做为二层的手续
扫块,取数据,计算手续,计算公式如下:
bridgeFee = (L1Fee/L2Fee) + amount * 0.01%
- TxFee: 一笔交易消耗的手续
- l2BlockFee:L2 上一个块消耗的手续费
- L2Fee: L2 层消耗的手续
5.3.Bridge 一笔实际消耗手续费计算
bridgeFee = (L1Fee/L2Fee) + amount \* 0.01%
- L1Fee: L1 模型计算出来的手续费
- L2Fee:L2 模型计算出来的手续费
- amount:用户转账金额
- 0.3%:收取的手续费佣金
六. 去中心化随机数-DappLink
1.DappLink的去中心化随机数生成器简介
DappLink的去中心化随机数生成器(DRNG)由多节点共同参与,共同参与随机数生成过程、共识过程以及监督审计过程。DappLink DRNG有几大特点:“无延迟”,“批量生成”,“拜占庭容错的”,“随机数生成过程可验证”,“恶意节点可发现”,“参与随机数生成的节点无法预测随机数结果”等。
1.1.无延迟:
去中心化随机数生成器通常受密码学算法、共识算法以及信标链响应速度的影响,在用户发出一个随机数请求之后,需要经过上述一系列过程,导致随机数结果返回至用户侧时会有或多或少的延迟。延迟的长短在游戏行业是十分关键的,大家都知道的,如果我们在玩掷骰子的游戏时骰子在地上转了1分钟才停下,那么怕是不会有人愿意玩了吧。
DappLink的用户请求结果与此时正在进行的随机数生成过程并没有直接关系,也就是说用户想要获取随机数结果,不需要等待一轮完整的随机数生成流程执行完成。这极大的节省了随机数请求的响应时间,几乎做到了无延迟。
1.2批量生成
随机数生成过程中有密码学、共识、数据上链等技术共同支持,这些技术必然耗费一定的时间成本和计算成本甚至token成本。那么我们希望能在一轮随机数生成过程中产生更多的随机数,以提高随机数的产生效率以及降低随机数的平均成本。
DappLink根据可信节点数量配置以及参与节点数量,一轮随机数生成过程可以产生若干数量的随机数,最多可获得参与节点相同数量的随机数结果。这样在节省随机数生成的平均成本的同时,产生了充裕的随机数后备结果,更加保证了随机数请求的响应速度。同时我们会用一些技术手段保证这些多出的随机数结果不为人知,直到被提供给用户的时候。
1.3. 拜占庭容错&恶意节点发现
既然是去中心化的系统,那也就意味着会有许多节点共同参与其中。如果所有节点都是安全可信的,那自然是一个理想情况,但是我们必须考虑到,如果有恶意节点参与到去中心化系统中来想要搞破坏,那该如何应对。
DappLink DRNG能够容忍一定恶意节点,恶意节点常见的行为可能是提供错误的签名影响聚合签名的验签过程、向参数共识的不同节点发送不同数据影响共识过程、或者对于随机数生成的环节进行拖延等等。DappLink对于这些恶意节点的破坏行为有着各自的解决方案,争取不因为个别节点的恶意行为导致一次随机数生成过程作废。当生成过程中发现异常情况时,系统会主动筛查恶意节点,争取在排除恶意节点的数据之后还能完成本轮随机数生成过程。各节点将自己检查出的疑似恶意节点加入黑名单,并会在下一轮拒绝他的消息,从而减少伤害。当然黑名单中的疑似恶意节点也有机会从黑名单中剔除。
1.4.随机数生成过程可验证
DappLink的去中心化随机数生成过程包含了多次多节点交互,参与随机数生成的节点从一轮随机数产生的流程开始,记录自己以及经自身检验过的来自其他节点的数据。生产数据以及共识数据会经过隐私处理之后在链上合约保存。当用户想要对一个随机数进行检查,验证随机数是否真实由一定数量的节点共同监督产生,可以通过合约查询到该随机数曾经过哪些节点共同监督产生。
1.5.随机数生产节点无法预测结果
每个参与随机数生成的节点都有机会产生由自己主导的随机数,这使得节点有预测随机数结果的风险。为了降低这种可能性,DappLink DRNG会将每一批次随机数以随机的顺序返回给不同的用户。由于随机数的生成过程与用户的随机数请求并非一一对应的关系,所以节点并不能确定自己主导生成的随机数将会在什么时间以什么顺序分别作为结果返回给哪些不同的用户。
同时为了获取更加安全不可预测的随机数,我们可以在将随机数作为结果返回给用户的最后阶段结合链上随机数为结果增加噪声。
DappLink DRNG致力于成为快速、安全、鲁棒、公平、可验证的去中心化随机数生成器。为用户提供可参与、可监督、更高效、更快速的去中心化随机数生成器解决方案,以更加安全透明公平的方式为以Web3游戏赛道为主的随机数使用方提供更好的服务。
2.随机数生成流程
- client request randNum: 客户端向Leader发送请求新随机数的请求。
-
broadcast ReqID: Leader检查并拒绝规定时间窗口内的重复请求。对于一个新的随机数请求,Leader为其分配一个唯一的非顺序递增的reqID,leader使用私钥sk-l对reqID加密并将密文广播给randNodes
-
broadcast randNum
randNode-i收到来自leader的密文后,用leader的公钥pk-l解密。
解密无误情况下,自身生成一个随机数randNum-i。
randNode-i利用自己的私钥分别对reqID和randNum-i进行签名和加密得到sig-i和encrypted-i。
randNode-i将{sig-i, encrypted-i}广播给所有BLS成员。
- collect random numbers
randNode-i会收到来自其他randNode-j的消息,收集它们直到数量足够对签名进行聚合。聚合签名验证无误之后,相应签名对应的encrypted-i追加到随机数数组randNumList中。
为了区别前一阶段的sig-i,该阶段中,节点对增加后缀的reqID进行签名,获得sig-i-2。
randNode-i将{sig-i-2, randNumList{node-i: encrypted-i}}发送至Leader。
同时,在该随机数的可审计时间窗内,节点保留randNumList{node-i: encrypted-i},也可存链上
- return random numbers
leader等待randNode的随机数数组结果,收集足够数量的反馈并能成功聚合验证sig-i-2后,将randNumList进行合并并解密。一个node-i只能够提供一个随机数,如果出现来自同一节点的不同随机数,以先到达的为准(有节点作恶的情况下,一个节点可以给不同的其他节点发送不同的随机数,以求自己提供的随机数有更大的几率被选中)。
根据不同的策略,可以将全部randNumList作为结果返回,也可以通过Leader对randNumList进行随机选择作为结果返回。
(为了应对密集的随机数请求,可以将randNumList中的值以随机的顺序返回给相邻的请求。比如reqID = 5, randNumList有6个结果,这6个结果可以提供给reqID=[5, 10])
七.总结
本文深入分析了去中心化金融(DeFi)应用中的多种产品,涵盖了去中心化交易所(DEX)、预言机、交易聚合器和去中心化随机数生成器等。每种产品在DeFi生态系统中扮演着独特的角色,为用户提供了更高效、安全和透明的金融服务。DEX 允许用户直接在区块链上进行资产交易,而预言机则提供真实世界数据以支持智能合约的执行。交易聚合器通过整合多个交易平台的流动性,优化交易成本。而去中心化随机数生成器则为区块链应用提供了不可预测的随机性,增强了基于随机的游戏和博彩等领域的公平性和安全性。