tp官网|闪电贷技术详解(2)

时间:2022-08-05        来源: 未知

熊市就像一块试金石,Defi的各核心业态,哪些能够穿越周期,更好的发展?在周期中又暴露了哪些问题,值得后来者借鉴?SharkTeam合约安全系列课程之【DeFi安全】和您一起讨论和深入。第二课【闪电贷技术详解】。

文章较长,分为3个部分,这是第2部分:

1.闪电贷原理和应用场景;

2.闪电贷合约实现和风险防范。

3.闪电贷相关项目协议分析。

image.png

1 闪电贷合约实现

1.1 闪电贷

以Aave项目为例,Aave项目实现了闪电贷业务的主要合约是 LendingPool.sol 合约,关键函数为 flashLoan函数。

以下是AaveV1的实现代码:

image.png

IFlashLoanReceiver 代码如下:

image.png

FlashLoanReceiverBase 代码如下:

image.png

其中需要注意:

l 闪电贷接收方合约 IFlashLoanReceiver (接口合约)的实现是需要闪电贷发起方自定义的。自定义闪电贷合约需要继承 IFlashLoanReceiver 接口合约或者 FlashLoanReceiverBase 合约,并实现其中的 executeOperation 函数。

l 自定义闪电贷合约部署在区块链中的地址即为 flashloan 函数的参数 _receiver。

以下是 AaveV1 闪电贷的一个代码实现示例:

image.png

1.2 闪电兑

以 UniswapV2 项目为例,UniswapV2 项目实现了闪电兑换业务的主要 错误! 超链接引用无效。 合约中的 swap函数,代码如下:

image.png

其中需要注意:

l 闪电贷接收方合约 IUniswapV2Callee(接口合约)是需要闪电贷发起方自定义的。自定义闪电贷合约需要继承该接口合约,并实现其中的 uniswapV2Call函数。

l 自定义闪电贷合约部署在区块链中的地址即为 swap 函数的参数 to。

以下是UniswapV2闪电贷的一个代码实现示例:

image.png

2 闪电贷风险与防范

2.1 闪电贷优点

1. 没有任何资金风险,而借款人只需要支付借款手续费及Gas费用即可。

2. 无需任何资产抵押,就可以借到高达百万美元甚至千万、上亿美元的资产,用来进行杠杆等金融业务进行获利,不用抵押任何资产。

2.2 闪电贷缺点

1. 有一定的技术门槛及金融知识门槛,调用者需要熟悉用智能合约进行闪电贷的操作,并且要利用金融知识从闪电贷操作中进行获利,这样才不会有任何财产损失(比如借款手续费及Gas费用)

2. 会被别有用心者用于黑客攻击:利用项目方的智能合约漏洞,从闪电贷借到巨额资金,从项目方资金池中获取巨额收益。

2.3 闪电贷攻击

闪电贷是一种金融技术,同时也是一把双刃剑,既为人们提供了极大的便利性,也为别有用心者提供了一把利器。

通过闪电贷,黑客可以利用智能合约中的漏洞,用极低的成本,从闪电贷协议借得大量资金,用于攻击操作,获得巨大的利益。

另外一面,黑客的攻击行为在造成巨大财产损失的同时,也产生了一种鲶鱼效应,让整个DeFi生态系统得到了加强,并不断完善和发展。

2.4 安全防范建议

闪电贷攻击的根本原因在于被攻击的项目的智能合约(尤其是价格预言机)存在漏洞,黑客利用了其中的漏洞完成攻击,而闪电贷只是提供了攻击的资金,降低了黑客攻击的成本。

因此,闪电贷攻击并没有有效的防范措施,只能尽可能的让项目的业务逻辑和合约代码不存在漏洞。

解决闪电贷攻击的办法:

1. 说服所有的闪电贷协议停止提供这种服务

这是不可能的。提供闪电贷款符合每个协议的利益,并且其用户有合理原因的希望使用此功能。因此,我们可以放心地消除这一选项。闪电贷不会消失。

2. 迫使关键交易跨越两个区块

如果一个资本密集型交易需要跨越至少 两个区块 ,用户需要至少在两个区块时间段取出贷款,闪电攻击就成为不可能。

3. 要求提供链上证明,证明完成闪电贷后用户的账户余额未出现变化

如果可以通过某种方法来检测用户的 实际余额 是多少 (即在他们贷款之前和还款之后的余额分别是多少) ,我们就可以战胜闪电攻击。

在原生 EVM 机制中无法执行此操作,但是可以对其进行修改。你要做的是:在用户与你的协议进行交互之前,你要求其提供 Merkle 证明,证明在上一个区块末尾时他们有足够的余额来偿还当前使用的资金。 你需要针对每个区块中的每个用户跟踪此情况。

这种方法一定程度上是奏效的。当然,它还很粗糙,有一些问题:验证这些链上证据在链上的 成本极高 ,思维正常的用户没有人愿意提供这类证明,并为整个过程支付 gas 费用。另外用户完全可能有合法合理的理由,在上个区块想调整其余额。所以,尽管这种方法理论上有些作用,它不是一种可行的解决方案。

减缓闪电贷攻击的办法:

1. 市场价预言机

像 Uniswap 或 OasisDEX 等市场价预言机 , 由于闪电攻击的可能性,你任何情况下不能把当前市价中位数当成喂价。 攻击者只需要一笔交易就能轻而易举地大幅改变市价中位数,让预言机失灵。对此最好的解决方案是通过 时间加权平均价格 (TWAP) 或 成交量加权平均价格 (VWAP) 计算 上一批 X 区块的加权平均数 。 Uniswap v2 会自带这一功能; 经济学家 Max Wolff 的著作 《 Polaris 》为其它协议提供了一种通用方法。

2. 治理代币

链上治理 则是则会带来一连串令人头疼的问题。链上治理通常由治理代币持币人按权重投票决定。但如果这种治理代币进入某一贷款池,任何攻击者可以偷走大量选票,得到自己想要的结果。 当然,多数治理协议要求这些治理代币在投票期间锁定,这让闪电攻击无计可施。但有些治理协议并非如此,例如 Carbon Vote 和Maker 的行政投票。在闪电贷攻击的阴影之下,这些治理机制完全可能被攻陷。

理想情况下,你不想让治理代币进入闪电贷款池。但这并非由发币者决定,它是由市场决定的。因此,所有治理行动应该要求 代币锁定期 ,以阻止闪电攻击。更关键的是,所有治理代币必须有 时间锁 (timelocks) 。时间锁迫使所有的执行决策在生效前都有一段等候期。(例如 Compound 的时间锁是 2 天 ) 。如果遭遇意料之外的治理攻击,这一机制让系统有了 容错时间 。

关于我们:SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。

Web:https://www.sharkteam.org

Telegram:https://t.me/sharkteamorg

Twitter:https://twitter.com/sharkteamorg

Reddit:https://www.reddit.com/r/sharkteamorg

更多区块链安全咨询与分析,点击下方链接查看

D查查|链上风险核查 https://m.chainaegis.com