Jump to content

Hello visitors, welcome to the Hacker World Forum!

Red Team 1949  (formerly CHT Attack and Defense Team) In this rapidly changing Internet era, we maintain our original intention and create the best community to jointly exchange network technologies. You can obtain hacker attack and defense skills and knowledge in the forum, or you can join our Telegram communication group to discuss and communicate in real time. All kinds of advertisements are prohibited in the forum. Please register as a registered user to check our usage and privacy policy. Thank you for your cooperation.

TheHackerWorld Official

Featured Replies

Posted

## **TL;博士**

本文对DeFi 杠杆的多样性和应用场景进行了深入研究,详细分析了代码级漏洞,并提出了杠杆协议的安全关键点。

## **1. DeFi 杠杆简介**

近期dYdX V4的上线,引起了永续合约交易所的广泛关注和参与。

dYdX是杠杆交易的成功应用案例,我们不仅要期待dYdX V4的巨大潜力,还要关注杠杆协议的安全性。接下来,我们将通过具体的代码分析和示例,让您熟悉不同的杠杆策略和安全注意事项。

### **1.什么是杠杆**

在金融领域,杠杆是一种依靠借入资金来增加潜在投资回报的策略。简而言之,投资者或交易者借入资金来增加对特定类型资产、项目或工具的投资,远远超出仅依靠自有资本所能实现的目标。通常,通过使用杠杆,投资者能够放大他们在市场上的购买力。1706757566_65bb0dbe2222eed288bce.png!small?1706757566834

### **2。 DeFi 交易中的杠杆**

杠杆的使用是加密资产交易中最重要和最常见的特征之一。去中心化交易所成立后不久,尽管加密货币市场已经表现出很高的波动性,但杠杆交易变得越来越流行。

与传统金融一样,交易者使用杠杆要么只是借入资金以增加购买力,要么利用期货和期权等各种金融衍生品。

杠杆也从3倍、5倍增加到100倍以上。较高的杠杆意味着较高的风险,但正如大多数中心化交易所所见,随着杠杆交易量的增长,这是寻求更高回报的激进交易者愿意承担的风险。

## **2.杠杆分类详解**

就DeFi 而言,杠杆产品主要分为四种类型,杠杆产生机制不同:杠杆借贷、杠杆交易杠杆、永续合约杠杆、杠杆代币。

### **1。杠杆贷款**

DeFi借贷是最早、规模最大的DeFi应用之一,MakerDao、Compound、AAVE、Venus等巨头已经在市场上运营。通过借出加密资产来获得杠杆的逻辑很简单。

例如,如果您持有10,000 美元的以太坊(ETH) 并且看涨,您可以将ETH 存入Compound 作为抵押品,借出5,000 美元的USDC,然后用这5,000 美元的USDC 换取另外5,000 美元的ETH。这将为您提供1.5 倍的ETH 杠杆,与您最初的10,000 美元资本相比,您的ETH 敞口为15,000 美元。

同样,如果你看空,你可以选择存入稳定币并借出ETH。如果ETH价格下跌,您可以在市场上以更低的价格购买ETH并偿还债务。

值得注意的是,由于您将从去中心化协议借款,因此如果抵押品价值下降或您借入的资产价值超过特定阈值,您可能会被清算。

### **2。保证金交易杠杆**

通过DeFi 借贷,你可以用这些数字资产做任何你想做的事。 DeFi 保证金交易更注重增加头寸规模(增加购买力),被认为是真正的“杠杆头寸”。然而,有一个重要的区别—— 虽然保证金头寸保持开放,但交易者的资产充当借入资金的抵押品。

dYdX是著名的去中心化保证金交易平台,最大杠杆为5倍。在dYdX 的保证金交易中,交易者使用自有资金作为抵押品,将其原始本金放大数倍,并利用这些放大的资金进行更大的投资。

交易者需要支付利息费用和与交易相关的费用。该头寸不是虚拟建立的,它涉及实际的借贷和买卖。

如果市场朝不利方向发展,交易者的资产可能无法完全偿还借入的资金。为了防止这种情况发生,协议会在达到一定的清算比例之前清算您的头寸。

**保证金交易中杠杆如何变化——**

假设您以3 倍的保证金持有ETH,但不愿意不时调整您的仓位。

您持有100 美元的USDC,另外借入200 美元的USDC,并交易300 美元的ETH,以建立所需的ETH 多头头寸。杠杆水平为300 美元/100 美元=3 倍。

如果ETH 价格上涨20%,您的利润将为300 (1+20%) - 300=60 美元。您相对于强平的风险较低,实际杠杆水平降低至360/(360-200)=2.25x。换句话说,当ETH 价格上涨时,你会自动去杠杆化。

如果ETH 价格下跌20%,您的损失将为300 (1-20%) -300=-$60。当涉及到强平时,您的风险更大,实际杠杆水平会自动增加到240/(240-200)=6x。换句话说,当ETH 价格下跌时,您会重新平衡杠杆,这表明您的风险状况比以前更高。

因此,虽然您可能认为通过以固定3 倍保证金进行交易,您可以保持恒定的杠杆率,但实时杠杆率却在不断变化。查看下面的图表,了解杠杆将如何根据价格变化而变化。

### 1706757596_65bb0ddc64c7785521195.png!small

### **3。永续合约杠杆**

永续合约与传统期货合约类似,但没有到期日。永续合约模仿基于保证金的现货市场,因此交易价格接近基础参考指数价格。

有很多DeFi 项目向交易者提供永续合约,例如dYdX、MCDEX、Perpetual Protocol、Injective 等。很多交易者可能很难区分保证金交易和永续合约之间的区别。事实上,它们都涉及到用户的杠杆作用。

然而,杠杆机制、费用和杠杆水平存在一些差异。

永续合约是交易合成资产的衍生品,具有保证金交易的特点。以综合方式跟踪标的资产价格,无需交易实际标的资产。然而,保证金交易涉及实际借贷和实际加密资产的交易。

随着永续合约的出现,出现了资金费率的概念,其目的是使永续合约的交易价格与标的参考价格保持一致。如果合约价格高于现货价格,多头将向空头付款。换句话说,交易者借钱需要不断支付费用。

永续合约的杠杆通常高于保证金交易,最高可达100 倍。清算和实际杠杆机制与保证金交易相同。

### **4。杠杆代币**

杠杆代币是一种衍生品,可为持有人提供加密货币市场的杠杆敞口,而无需担心主动管理杠杆头寸。虽然它们为持有人提供杠杆敞口,但不要求他们处理保证金、清算、抵押品或融资利率。

杠杆代币与保证金交易/永续合约最大的区别在于,杠杆代币会定期或达到一定阈值时进行重新平衡,以维持特定的杠杆。

这与保证金交易和永续合约明显不同——这些产品的实际杠杆率会根据价格变动不断变化,即使交易者最初可能指定了杠杆水平。

让我们看看上面3x ETH 示例中的再平衡是如何工作的:

您持有100 美元USDC 并购买ETHBULL (3 倍) 杠杆代币。该协议将自动借入200 美元USDC 并交易200 美元ETH。

假设在重新平衡之前,ETH 的价格上涨了20%,ETHBULL (3x) 代币价格上涨至300\\*(1+20%)-200=160 美元。现在,您的实际杠杆变为2.25(360/160),低于目标杠杆。

作为再平衡过程的一部分,该协议将从稳定币池借入更多美元并购买额外的ETH 代币,将杠杆率恢复至3 倍。在我们的示例中,协议将再借入120 美元并将其兑换为ETH。因此,总杠杆再次变为(360+120)/160=3倍。

假设在重新平衡之前,ETH 的价格下跌了20%,ETHBULL (3x) 代币价格跌至300\\*(1-20%)-200=40 美元。现在,您的实际杠杆将变为6(240/40),高于目标杠杆。

在这种情况下,协议将出售ETH 代币并偿还未偿债务以降低杠杆。在此示例中,协议将出售120 美元的ETH 来支付资金池。债务将变为80 美元,总杠杆率再次为(240-120)/40=3x。

**换句话来说,杠杆代币会自动对利润进行重新杠杆化,对损失进行去杠杆化,以恢复其目标杠杆水平。如果这个机制运作良好,即使在不利的市场趋势下,杠杆代币持有者也不会被爆仓,因为去杠杆机制会不断降低用户的有效杠杆水平。 **

因此,杠杆代币模式的借贷池将没有清算风险,并且比保证金交易的借贷池更安全。

## **3。利用应用案例**

我们已经了解了一些常见的DeFi 协议杠杆类型。接下来我们将结合具体的DeFi 协议来详细讲解杠杆的应用。

### **1.GMX**

GMX 是一个去中心化的现货和永续交易所,为交易者提供高达50 倍杠杆的资产交易能力。该协议目前在Arbitrum 和Avalanche 上运行。在GMX上,交易者对交易对手有完整的了解,这与在CEX上的交易完全不同。 GMX 与dYdX 等其他永续合约协议的不同之处在于,它完全在链上运行,并使用AMM 功能来实现杠杆交易。1706757627_65bb0dfbefaa7598dc829.png!small?1706757628666

GMX 与其他服务的不同之处在于,它是一个提供杠杆交易服务的去中心化交易所。在这方面,它结合了与Uniswap 等其他DeFi 交易所类似的体验以及Binance 等公司提供的杠杆交易服务。

GMX 有一个流动性池GLP,这是一个为保证金交易提供流动性的多资产池:用户可以通过铸造和销毁GLP 代币来做多/做空并执行交易。该池通过交易和杠杆交易赚取LP 费用,这些费用分配给GMX 和GLP 持有者。1706757641_65bb0e0929d199dc958a2.png!small?1706757641909

为了利用杠杆进行交易,交易者将抵押品存入协议中。交易者可以选择高达50 倍的杠杆。杠杆越高,强平价格越高,强平价格会随着借贷费用的增加而逐渐上升。

例如,当做多ETH 时,交易者是从GLP 池中“出租”ETH 的上涨空间;当做空ETH 时,交易者是从GLP 池中“租用”稳定币相对于ETH 的上涨空间。但GLP池中的资产实际上并未被租赁。

平仓时,如果交易者押注正确,利润将以多头代币的形式从GLP池中支付;否则,损失将从抵押品中扣除并存入资金池。 GLP 从交易者的损失中获利,从交易者的利润中获利。

在此过程中,交易者支付交易费用、开仓/平仓费用和借款费用,以换取指定代币(BTC、ETH、AVAX、UNI和LINK)对美元做多/做空的上行空间。1706757649_65bb0e1186c13c517b49c.png!small?1706757650452

### **2.Merkle 交易**

Merkle Trade 是一个去中心化交易平台,提供加密货币、外汇和大宗商品交易,杠杆高达1,000 倍,并具有以用户为中心的高级交易功能。 Merkle Trade 由Aptos 区块链提供支持,提供一流的性能和可扩展性。与Gains Network相比,在提供同样高杠杆的同时,交易延迟和手续费更低。1706757660_65bb0e1c960cf8a3cf18c.png!small?1706757661651

与大多数交易所不同,Merkle Trade 没有订单簿。相反,Merkle LP 充当每笔交易的交易对手,在交易者亏损时收取抵押品,并在已平仓交易中支付正回报的利润。

- **以高达1,000 倍的杠杆交易加密货币、外汇和大宗商品**

Merkle Trade 的目标是从第一天起就提供广泛的交易对,包括加密货币、外汇和大宗商品,并提供一些市场上最高的杠杆;加密货币最高可达150 倍,外汇最高可达1,000 倍。

- **公平价格的订单执行、毫秒延迟、最小滑点**

由迄今为止最低延迟的Aptos 生成的区块链提供支持,实现最快的链上交易体验。对于交易者来说,这意味着更快的交易体验,并且由于执行延迟而导致的价格滑点更少。

- **去中心化、非托管交易,无交易对手风险**

交易者使用流动性池(Merkle LP)进行交易,该池充当协议上每笔交易的对手方。所有交易和结算均由智能合约执行,用户资金随时无人托管。

- **最低手续费**

Merkle Trade 声称其费用是迄今为止市场上最低的费用之一。推出时,加密货币交易对的费用低至0.05%,外汇交易对的费用低至0.0075%。

### **3.dYdX**

dYdX 是一个去中心化交易所(DEX),让用户能够高效地交易永续合约,同时完全控制自己的资产。自2021年推出以来,dYdX V3采用了独特的非托管第二层扩容解决方案来实现其交易所,但其订单簿和撮合引擎仍然集中管理。而现在,通过dYdX V4,该协议正在演变成自己的链,并彻底重构整个协议,以实现完全去中心化,同时提高吞吐量。 dYdX还包括借贷、保证金交易和永续合约三大功能。保证金交易具有借贷功能。用户存入的资金自动形成资金池。如果交易过程中资金不足,他们会自动借款并支付利息。1706757685_65bb0e35166e31c658589.png!small?1706757685913

## **4。利用安全分析**

我们介绍了DeFi 中常见的杠杆类型和应用。同样,杠杆设计中还存在很多安全问题值得我们关注。我们将结合具体的审计案例来分析DeFi 杠杆的安全问题和审计要点。

### **1。区分限价单和市价单**

在大多数杠杆交易应用中,都有限价单和市价单。要严格区分和核实限价单和市价单。我们将对Merkle Trade审计中发现的问题进行详细分析。

````

让现在=时间戳:now_秒();

if (现在- order.created_timestamp 30) {

取消订单内部(

_订单_id,

订单,

T_CANCEL_ORDER_EXPIRED

);

返回

};

````

这部分代码是在订单函数中进行验证。在此函数中,它检查自订单创建以来是否已过去30 秒以上。如果满足条件,则调用cancel\\_order\\_internal()取消订单。但是,如果订单是限价订单,则意味着该订单具有交易者设定的特定价格,他们愿意在该价格上买入或卖出资产。执行限价单时不宜使用该判断,这可能会导致大部分限价单未被执行。因此,严格区分限价单和市价单的交易逻辑非常重要。

### **2。杠杆计算误差**

计算错误一直是DeFi 中非常常见的问题,在杠杆中尤其常见。我们将根据Unstoppable协议第三方审计中发现的问题,对杠杆计算问题进行深入研究。

我们看一下《Unstoppable》中计算杠杆的代码:

````

def _calculate_leverage(

_position_value: uint256、_debt_value: uint256、_margin_value: uint256

) - uint256:

如果_position_value=_debt_value:

#坏债

返回最大值(uint256)

返回(

精度

*(_债务_值+ _保证金_值)

/(_position_value - _debt_value)

/精度

````

\\_calculate\\_leverage 函数使用\\_debt\\_value + \\_margin\\_value 作为分子而不是\\_position\\_value 导致杠杆计算错误。该函数的三个输入参数\\_position\\_value、\\_debt\\_value 和\\_margin\\_value 均由Chainlink 链上预言机提供的价格信息决定。其中\\_debt\\_value 表示将头寸的债务份额转换为美元债务金额的价值。 \\_margin\\_value 表示仓位初始保证金金额的当前值(以美元为单位)。 \\_position\\_value 表示仓位初始仓位金额的当前值(美元)。

上述计算的问题在于\\_debt\\_value + \\_margin\\_value 并不代表仓位的价值。杠杆是当前仓位价值与当前保证金价值之间的比率。 \\_position\\_value - \\_debt\\_value 是正确的,它代表了当前的保证金值,但是\\_debt\\_value + \\_margin\\_value 并不代表仓位的当前价值,因为不能保证负债代币和仓位代币会有相关的价格波动。

例如:负债代币为ETH,持仓代币为BTC。

使用1 ETH 作为保证金,Alice 借入14 ETH(每ETH 2,000 美元)并收到1 BTC(每BTC 30,000 美元)的持仓代币。杠杆为14。

第二天,ETH的价格仍然是2000美元/ETH,但BTC的价格从30000美元/BTC跌至29000美元/BTC。此时杠杆应该为(\\_position\\_value==29,000)/(\\_position\\_value==29,000 - \\_debt\\_value==28,000)=29,而不是合约中计算的值:(\\_debt\\_value==28,000 + \\_margin\\_value==2,000)/(\\_头寸\\_值==29,000 - \\_债务\\_值==28,000)=30。

因此,为了解决这个问题,应该使用上述正确的公式来计算智能合约中的杠杆。如果价格波动,杠杆计算错误可能会导致不公平的清算或过度杠杆化的头寸。

在智能合约中,确保正确的杠杆计算对于维护系统的稳健性和用户的利益至关重要。正确的杠杆计算应该基于仓位的当前价值与当前保证金价值之间的比率。如果使用不正确的计算公式,可能会导致系统对价格变化做出不恰当的反应,平仓不该平仓的仓位,或者让过度杠杆的仓位继续存在,从而增加系统和用户的风险。

### **3。逻辑错误**

智能合约的审计中需要特别注意逻辑错误,尤其是像DeFi 杠杆交易这样复杂的逻辑。

让我们结合Tigris(Tigris是一个基于Arbitrum和Polygon的去中心化合成杠杆交易平台)在第三方审计中发现的问题来讨论一下DeFi杠杆需要注意的逻辑问题。

我们看一下Tigris中限位平仓函数的逻辑:

````

函数限制关闭(

uint_id,

布尔_tp,

PriceData calldata _priceData,

字节calldata_signature

外部的

{

_checkDelay(_id, false);

(uint _limitPrice, 地址_tigAsset)=tradeExtension._limitClose(_id, _tp, _priceData, _signature);

_closePosition(_id, DIVISION_CONSTANT, _limitPrice, 地址(0), _tigAsset, true);

}

函数_limitClose(

uint_id,

布尔_tp,

PriceData calldata _priceData,

字节calldata_signature

)外部视图返回(uint _limitPrice,地址_tigAsset){

_checkGas();

IPosition.交易内存_trade=仓位.trades(_id);

_tigAsset=_trade.tigAsset;

getVerifiedPrice(_trade.asset, _priceData, _signature, 0);

uint256 _price=_priceData.price;

if (_trade.orderType !=0) revert(\'4\'); //为极限

如果(_tp){

if (_trade.tpPrice==0) revert(\'7\'); //未设置限制

if (_trade.direction) {

if (_trade.tpPrice _price) revert(\'6\'); //未满足限制

} 否则{

if (_trade.tpPrice _price) revert(\'6\'); //未满足限制

}

_limitPrice=_trade.tpPrice;

} 否则{

if (_trade.slPrice==0) revert(\'7\'); //未设置限制

if (_trade.direction) {

if (_trade.slPrice _price) revert(\'6\'); //未满足限制

} 否则{

if (_trade.slPrice _price) 恢复(\'

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.