织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

技术详解如何在 Synthetix 上捕获 MEV 机会(2)

时间:2021-09-16 20:42来源:未知 作者:admin 点击:
请注意,还有其他函数的,但我很快发现它们并不相关。现在,我需要解决我要如何选择偿还哪些贷款,以及这样做我需要多少 sETH/sUSD。以下的函数开启

请注意,还有其他函数的,但我很快发现它们并不相关。现在,我需要解决我要如何选择偿还哪些贷款,以及这样做我需要多少 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); } (责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容