Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

作者:宋佳吉,任

来源:吉视通信

摘要:上一篇报告从底层语言特点比较了Move和Solidity的优势和特点。作为Web3的基础研究从闪电贷的角度,分析以太坊和Move分别是如何实现闪电贷的,以及Move是如何避免闪电贷攻击的。

以太坊契约之间的交互是通过交换消息来实现的。并且允许重入和动态调用,为闪电贷的实现提供了基础。在此期间,契约之间的函数可以相互来回调用,调用过程中将会转移控制权。如果DeFi项目的平台合同有漏洞仲裁员可以利用其合同的恶意代码调用相应的函数来窃取资产。——利用合约之间状态同步信息的差异,在一个进程结束前窃取双花资产(以太坊资产只是赋值),或者重复执行函数(不应该允许的逻辑)。

再入攻击的前提是攻击者部署的契约中存在恶意代码,但核心因素是:

Move提出了闪电贷新的运营流程,——烫手山芋模式,基本放弃再入。。"烫手山芋mode是一种没有键、存储、复制和删除功能的结构,Move程序在事务执行期间只使用一次。。因为没有能力丢弃、键入或存储,烫手山芋只能通过调用"摧毁"功能。顾名思义,这是一个烫手山芋,在这个过程中的任何处置都是"热"并且只能由销毁函数来结束。。具体流程如下:

完成闪电贷的前提是最终正确还款,流程结束。在流程结束前,可以在以太坊系统中反复调用恶意合同,修改相应的资产账户分配,实现盗窃。。Move系统结束闪电贷流程的前提是不仅要正确归还资金,还要一次性回收销毁烫手山芋,保证了闪电贷的原子性。

风险提示:区块链商业模式达不到预期;监管政策的不确定性。

作为以太坊DeFi生态最有特色的应用,闪电贷基于以太坊使用的Solidity语言,允许动态调用和重入。尽管这种动态调用是智能契约的开放性和可组合性的重要体现但控制权的转移和对契约功能的反复调用带来了大量的安全隐患,闪电贷在业内不时被用来攻击有缺陷的DeFi资金池。因为Move语言不允许动态调用和重入它使用一个"棘手的问题"模式轻松实现闪电贷,所以完全可以避免类似以太坊的安全问题。

两个系统在生态应用的工作模式上存在明显的差异,而这种差异的根源在于Move底层语言的特点。我们在之前的报告《Web3底层语言:Move弥补了Solidity哪些不足?》中对此进行了详细说明。这份报告从闪电贷申请的角度比较了申请的不同实现方式。

闪贷是原生DeFi的新产品,可以理解为极速贷。用户只需要在同一个交易(块)中借款、套利、还款并支付一笔手续费,因为是原子交易。然后,借款人可以在不抵押任何资产的情况下借款,提供一个无本金套利方案。

我们在上次报告中提到《Web3底层语言:Move弥补了Solidity哪些不足?》:

";在模块化和契约组合方面,通过库(相当于静态库)传递Solidity上的契约契约(如以太坊),从而实现契约契约之间的调用和交互。。Move语言采用模块和脚本的设计,前者类似于契约契约,Move语言的契约组合就是模块之间的组合。通过传递资源(也就是前面提到的资源)。关于组合,实和动的区别非常明显。

以太坊契约之间的交互是通过交换消息来实现的。并且允许重入和动态调用,也就是说契约之间的函数可以相互来回调用,调用过程中会转移控制权。这个特性为闪电贷的实现提供了基础。

具体来说,在以太坊交易中。,您可以通过调用智能合约中的功能函数进行转账和其他合约操作,并执行许多复杂的功能。也就是说,一个基于以太坊的交易,可以整合一系列复杂的交易:有可能整合借贷、套利、还款等一系列交易操作。。闪贷的所有操作都在一个区块时间内完成。按照以太坊目前的块速,合并后是12秒。核心不是12秒,而是这一系列的交易应该是有收益的,有回报的。如果不这样做,交易不会打包写入块,相当于借款人借款套利(失败)。这些操作不是有效的事务,但是临时状态是——,也就是原子事务。因此用户必须通过编程所有需要执行的步骤,完成借、用、还三个步骤,形成一个智能合约交易。

上述复杂的交易操作都是通过几个合约之间的动态调用来实现的,并且这个调用是可以重入的(即可以重复调用)。

目前,用户还可以通过FURUCOMBO等第三方项目完成更简单的闪电贷插件编程,而无需实际编写代码来完成智能合约的设计,最终实现闪电贷所需的全套操作。。具体套利过程如下图所示(使用FURUCOMBO平台,具体交易所价格为例),目前Kyberswap平台上的价格情况为1sUSD=0.9927DAI。、以及Uniswap上的1DAI=1.2411sUSD,用户发现这两个平台的DAI-sUSD交易对价格的套利空间较大,可以通过FURUCOMBO的接口设计套利流程。。包括:1。借100戴;来自AAVE借贷平台的闪电贷功能;2.通过Uniswap将100DAI兑换成约122sUSD代币;3.通过Kyberswap平台将sUSD代币转换成约122个DAI代币;4.偿还向借的100代币及手续费0.09代币;5.闪电贷的整个套利过程是在一个以太坊交易中完成的。,并获利约 22 DAI。

如果本次以太坊交易中所借的钱没有偿还,那么整个借贷交易就不会打包成块,也就是说借贷并没有实际发生,所以借贷人的钱不会受到任何影响。——中间借贷和套利过程只是暂时的。,尚未得到矿工们的证实。基于闪电贷的特点和时效性要求,其目前应用最广泛的是套利交易。仲裁员不需要使用自有资产进行套利操作,只需要通过闪电贷款获得所需金额的资金即可完成套利交易,并及时偿还借入资金。。这大大降低了套利者的进入门槛,因为理论上任何人都可以成为套利者,拥有无限的套利资金进行操作。

从以上过程可以看出,以太坊合约的控制权在FURUCOMBOlightning合约-仲裁人账户合约-Uniswap合约-Kyperswap合约-lightning贷款合约之间切换,可以动态调用相应的函数。如果DeFi项目平台的合约存在漏洞,套利者可以利用合约的恶意代码调用相应的函数来盗取资产。——利用合约之间的状态同步信息差异,在一个流程结束前双倍支出资产(以太坊资产只分配)。,或者反复执行函数(不应该允许的逻辑)来偷换。

对于Move生态系统来说,因为资产不是简单的赋值,禁止动态调用和重入,所以从根本上消除了风险,具体实现将在后面描述。

在实现方式上,以太坊EVM(基于Solidity)有动态调度,可以通过再入实现闪电出借。例如,在我们上一份报告中,"Web3底层语言:Move弥补了Solidity的哪些缺点?"?"提及于:

";以太坊(Solidity)的资产由相应的合同控制。如果把合约比作一个外管局,外管局会给所有用户分配一个数字余额。,以表示用户拥有的令牌A资产的数量,但资产本身仍然放在令牌A契约的保险箱中。移动用户账号本身就是一个独立的大保险箱,由用户自己控制。所有的代币资产都放在这个保险箱里。而这些Token并不是以数字的形式存在,而是不可复制、权限由用户控制的资源(类型)。

因此,以太坊EVM实现闪电贷款套利的过程是:

在上述过程中,动态调用相应的函数,闪电借款合同只有在检查归还金额是否正确后才会结束,所以控制权的转移随时都有可能发生,这是同时需要注意的。以太坊账户中的资产是以数值余额的形式存在的,重入可能会带来双花,这也是有漏洞的地方。调用外部契约的主要危险之一就是可以接管控制权,而一旦这些外部契约程序出现漏洞,攻击者就可以通过反复调用来实现攻击。,即可重入攻击。

再入攻击创造了以太坊历史上最严重的攻击之一,直接导致了以太坊的分叉,也就是2016年6月17日的道崩溃。黑客部署了一份合同。作为一个"投资者",在道中储存一些ETH。然后黑客调用DAO契约中的取款函数,让DAO契约为黑客取款。由于黑客合约(回退功能)存在恶意漏洞——,且无结束逻辑,DAO始终未完成提现(此时DAO不知道黑客收到提现,将其账户余额变为0)并收回控制权。黑客通过不断调用取款功能,发送了比初始存款更多的ETH。

闪电贷款攻击中,攻击者往往通过恶意契约实现重入攻击。比如2022年3月16日。黑客通过闪电贷款借钱并利用借贷项目开心金融的漏洞重新实时进入攻击,最终获利约2363ETH。具体流程并不复杂,因为开心理财是先转账再记账。黑客闪电借款,利用攻击契约存入开心金融贷款池实现抵押贷款,而攻击契约部署的onTokenTransfer函数可以在记账前反复调用贷款函数(重入攻击)。用一个抵押资产从不同的贷款池借款,因为先转账后记账,记账时(流程结束),黑客已经实现了攻击并获利。攻击的核心是在过程结束之前,攻击者可以反复调用相关函数来窃取资产。

就好比说攻击者签约将资产抵押给A银行(项目A的贷款池)进行贷款,A银行在完成记账结算流程之前就开始放款,这意味着闪电贷款交易会成功(原子性)。这时,资产由甲入库。。但由于A银行与其他银行的信息不同步(合同功能状态不同步),当攻击者在A银行还没有完成资产入库记账时(即被攻击的合同贷款流程还没有结束时,此时闪电贷款工作流程还没有结束,合同功能调用仍然可以进行)。再次,用这个资产在B、c等其他银行抵押贷款(重入),流程结束后,攻击者已经完成闪电贷款攻击,并获利。

再入攻击的前提条件攻击者部署的契约中包含恶意代码,但核心因素是:

";再入"是闪电贷款的基础,但是一旦目标契约出现漏洞,攻击者就可以进行再入攻击。这在我们的上一份报告中有详细介绍。

Move语言禁止动态调用和重入,从根本上杜绝了重入攻击。。但作为一种资源类型,Move系统的资产一旦被借出,就相当于一次真实的转让。如何保证闪电贷款顺利还款?

Move提出闪电贷新的操作流程,——烫手山芋模式,基本废弃,可以重新进入。。"烫手山芋mode是一种没有键、存储、复制和删除功能的结构,Move程序在事务执行期间只使用一次。。因为没有能力丢弃、键入或存储,烫手山芋只能通过调用"摧毁"功能。顾名思义,这是一个烫手山芋,在这个过程中的任何处置都是"热"并且只能由销毁函数来结束。。具体流程如下:

正如我们在前面的报告中分析的,账户资产和收款都是一种资源类型,"它们不能被复制、丢弃或重复使用,但可以安全地储存和转移"。所以收据一定要处理(而且只能用一次),而不是像以太坊一样给账户赋予价值。因此,烫手山芋模式可以确保借出的资产(资源类型,一旦借出,真的转让)必须归还。。收据,作为一个烫手山芋,就像定时一个雷管(在这里,定时是"时间"闪电贷款套利作为一个原子交易,而不是具体的时间),资金是与雷管一起借出的,任何一方都不能拿走雷管。必须将它放回原处才能拆除。否则无法完成交易,所以闪电贷资金可以保证归还。

闪电贷完成的前提是最终正确还款,流程结束。在流程结束前,可以在以太坊系统中反复调用恶意合同,修改相应的资产账户分配,实现盗窃。Move系统中结束闪贷流程的前提不仅是正确归还资金。还需要一次性回收销毁烫手山芋,保证了闪电贷的原子性。

从应用的角度来说,Web3的底层代表应该在保证开放性和可重构性的基础上提高代码安全性。在Web3中,代码不仅包含信息,还直接涉及资产调用。确保用户的安全';资产是最重要的,否则Web3将是一片黑暗的森林。以太坊的生态让大家看到了智能合约的生命力,下一个时代将在此基础上继续向安全合规进化。这也是我们目前关注Web3底层语言演变的核心逻辑,或者说它孕育着下一波创新。