区块链技术博客
www.b2bchain.cn

捕获Synthetix MEV的策略剖析

第24465篇文章捕获Synthetix MEV的策略剖析,说明解释了捕获Synthetix MEV的策略剖析,是很好的区块链入门技术文章网站,提供了相应的代码的进行解释,并且把原理说的很清晰

来源:ETH中文网

作者:Robert Miller

几个月前,臭名昭著的 KALEB 在 Flashbots 的公共搜索者 discord 上发布了以下信息:

捕获Synthetix MEV的策略剖析

KALEB 之前泄露了关于Synthetix 变动政策的重大消息,涉及数十万美元。在这个机器人运营商的巢穴里分享这种消息就像把红肉扔给狮子一样,快速看一下合约就会发现有一笔诱人的钱在里面。

在接下来的几周里,我计划并试图执行一个策略,以捕获 KALEB 在上面分享的 MEV。我将在本文公开我使用的代码,并讲解我的过程和策略。你将无法运行我的代码来印钱,但这篇文章将告诉你我如何设计新的搜索器,且包含很多关于这样做重要信息。这自然会比较技术,但我努力使非技术读者也能理解。

第一步:确定机会范围

我不是 Synthetix 的专家,因此第一步是了解我的工作内容。具体来说:

我找出相关的合约

我在 Sythetix 博客上通读它们功能的概述性文章,并搜索了所有的文档

我确信我理解了即将要实现的治理变更

我查看这些函数,并找出那些看起来相关的

这个阶段工作的总结是,Synthetix 已经试验了使用 ETH 作为抵押品来铸造 sUSD 和 sETH。你可以在合约中存入 ETH 并铸造这些资产,只要你注意你的抵押品价值不会跌至低于你贷款的一定水平。

但是,一年后,协议投票决定结束这个试验。当有数以百万计的未偿贷款时,他们怎么能这样做呢?好吧,你可以让任何头寸都变得可偿还。事实上,在一个漫长的警告期后,贷款会从在一个区块里是安全的,变成可被任何人偿还,无论抵押品的价值是多少!这会触发一笔从 「pDAO」 地址发送到公共交易池的交易。

要偿还一笔贷款,我需要归还所借资产 (sUSD 或 sETH) 的未偿金额。作为回报,我会收到支持我所关闭的贷款的抵押 ETH。作为偿还这些贷款的激励,我会获得比我归还 sETH 或 sUSD 更多的抵押品价值。由于当时仍有数百万美元的贷款,这意味着偿还者可以赚更多的钱。此外,我将不得不从 pDAO 合约里尾追 (backrun) 交易,以便我可以尽可能利用这个机会。

第二步:了解机会

现在我了解了基本机制,并且有了一些我认为相关的函数了。然后,我又深入了解我将调用哪些函数,我需要什么数据,以及如何生成该数据。

我需要两个函数:

setLoanLiquidationOpen():仅能由合约所有者 (pDAO) 调用。允许对未关闭的贷款进行偿还。

liquidateUnclosedLoan():需要一个贷款 ID 和账户地址,并偿还该贷款。在 setLoanLiquidationOpen() 被调用后可以被任何人使用。

请注意,还有其他函数的,但我很快发现它们并不相关。现在,我需要解决我要如何选择偿还哪些贷款,以及这样做我需要多少 sETH/sUSD。以下的函数开启工作所需的大部分东西:

openLoanIDsByAccount():返回所有与某个账户相关的所有公开贷款 ID

getLoanInformation():返回一个给定 ID 和所有者的贷款数据

然而,存在两个隐藏的困难。首先,这些合约不会告诉你哪些地址有未偿还的贷款,这给我带来一定难度。几分钟内,我找到一个解决方法,就是在 Etherscan 上下载所有与这些合约想法 u 你的交易,并用 Excel 创建一个与这些合约交互过的唯一账户列表。从那里,我建立了以下管道:

使用 getLoans 找出该地址是否有未偿贷款,如果有,记录它们的贷款 ID

使用 getLoanInformation 找出支持该贷款的抵押价值,它们发行了多少 sUSD/sETH,以及它们的贷款有多少利息

按贷款金额排序,首先列出最大额度的贷款,并把数据结构保存到 json 文件中。

第二个难题是偿还一笔贷款能拿回多少抵押的 ETH 并不能马上了解。因为有未偿贷款的函数,你可以粗略估算到,但我需要更精确的数据。要实现这点,我研究了偿还贷款的代码,并了解清楚相关数字是如何产生的。

以上的所有数据都是我可以在链上获取或计算的。但这样做太耗费 gas 了。由于我将与别人竞争合约的 gas 效率,对我来说,尽可能地把逻辑移到链下,以最小化 gas 消耗是极其重要的。

经过几次迭代后,我知道我需要从链上获取的最小数据量,这是我可以链下解析的一些变量,以告知我在智能合约上输入的内容。但是,获取这个信息的函数非常复杂,而且查询所有贷款所花的时间比处理一个区块的时间还长。这是不可行的。为了解决这个问题,我写了一份简短的智能合约,把许多数据请求集中在一起,这提高了超过 10 倍的速度。这是其中一个函数:

function batchGetLoanInformation(address[] calldata _addresses, uint256[] calldata _loanIDs, address _contractAddress) external view returns (uint256[] memory,uint256[] memory){

    uint256[] memory totalRepayment = new uint256[]( 
       _addresses.length);    uint256[]  
          memory totalCollateralLiquidated 
          = new uint256[](    _addresses.length);  
            for (uint i = 0; i < 
                _addresses.length; i++){  
                           
     uint loanAmount;           
       uint accruedInterest; 
  (,,   loanAmount,,,, 
   accruedInterest,       
   ) = collateralContract(    _contractAddress).getLoan( 
     _addresses[i], _loanIDs[i]);  totalRepayment[i] =  
 loanAmount + accruedInterest;   totalCollateralLiquidated[ 
 i] =   getCollateralAmountSUSD(   sUSD, totalRepayment[i], 
 COLLATERAL);   }    return (  totalRepayment, 
 totalCollateralLiquidated);}

请看由 EmGithub 提供的 rawsAssetsOracle.sol

你们可以在这里我的监听脚本看其使用。现在我能很快判断我需要多少 sETH/sUSD,偿还一笔贷款后能拿回多少抵押价值,从而得知这笔贷款的利润。

总结:这个阶段的工作是深入了解机会,以及以高效的方式搜集所有执行所需的数据。 你需要尽力把东西移到链下完成,以降低 gas 消耗。这部分工作的成果是做出了两份搜集所需数据的 fast script。

第三步:写一份执行合约

闪电贷策略

你可能需要一份专门的合约来提取 MEV。我在早期写了一份合约和测试环境,可以用这个环境来更好理解合约,并确保数据是正确的。这几乎与第二和第四步是同时进行的。

我知道我需要获得数百万美元的 sUSD/sETH,因此使用闪电贷是必须的。此外,我会烧毁这些合成资产但拿回抵押的 ETH。经过一番思考,我意识到无论如何我都要用 ETH 兑换其他资产,但我可以选择在偿还之前还是之后进行。有两条可能的路径:

Option 1 选项 1: 通过闪电贷贷出 ETH -> 兑换出 USDC -> 兑换出 sUSD -> 偿还 sUSD 贷款 -> 收到 ETH -> 偿还 ETH 的闪电贷

Option 2 选项 2: 通过闪电贷贷出 sUSD -> 偿还 sUSD 贷款 -> 收到 ETH -> 兑换出 USDC -> 兑换出 sUSD -> 偿还 sUSD 的闪电贷

鉴于 sUSD 仅在 Aave 上可用,而 ETH 可以在多个闪电贷供应商上可用,问题最终会变成我想使用哪个闪电贷供应商。最终,我选了选项 1,因为 dYdX 不产生费用,而 Aave 会产生一项费用。

Gas 优化

你可以在此处找到我的完整合约,但这是我从 dYdX 收到 ETH 并进而偿还 sUSD 贷款后的部分:

// This is the function called by dydx after giving us the loanfunction callFunction(address sender, Account.Info memory accountInfo, bytes memory data) external {    // Use chi tokens  uint256 gasStart = gasleft();     // Let the executor     orthe dYdX contract call this function         // probably fine to restrict to dYdX  require(        msg.sender 捕获Synthetix MEV的策略剖析 由www.b2bchain.cn 提供
文章整理自网络,只为个人学习与分享使用
链接地址https://www.b2bchain.cn/?p=24465

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 捕获Synthetix MEV的策略剖析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们