BTC
ETH
HTX
SOL
BNB
ดูตลาด
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

การวิเคราะห์โดยสังเขปของกระบวนการโดยละเอียดในการจับภาพ Synthetix MEV

ECN以太坊中国
特邀专栏作者
บทความนี้มีประมาณ 8520 คำ การอ่านทั้งหมดใช้เวลาประมาณ 13 นาที
บางครั้ง MEV ถูกมองว่าเป็นอาณาจักรของสุดยอดโปรแกรมเมอร์ที่เข้าใจยาก แต่ไม่จำเป็นต้องเป็น
สรุปโดย AI
บางครั้ง MEV ถูกมองว่าเป็นอาณาจักรของสุดยอดโปรแกรมเมอร์ที่เข้าใจยาก แต่ไม่จำเป็นต้องเป็น

ที่มา | bertcmiller.com

ผู้แต่ง | โรเบิร์ต มิลเลอร์

รูปภาพ

รูปภาพ

ก่อนหน้านี้ KALEB ได้ปล่อยข่าวสำคัญเกี่ยวกับการเปลี่ยนแปลงนโยบายที่ Synthetix ซึ่งเกี่ยวข้องกับเงินหลายแสนดอลลาร์ การแบ่งปันข่าวประเภทนี้ในถ้ำของผู้ควบคุมหุ่นยนต์ก็เหมือนกับการโยนเนื้อแดงให้สิงโต และเมื่อดูสัญญาอย่างรวดเร็วก็เผยให้เห็นเงินจำนวนมหาศาลที่น่าดึงดูดใจ

ชื่อระดับแรก

ขั้นตอนที่หนึ่ง: กำหนดขอบเขตของโอกาส

ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับ Synthetix ดังนั้น ขั้นแรกคือต้องเข้าใจสิ่งที่ฉันทำ โดยเฉพาะ:

  • ฉันพบสัญญาที่เกี่ยวข้อง

  • ฉันอ่านภาพรวมของฟังก์ชันการทำงานในบล็อก Sythetix และค้นหาเอกสารประกอบทั้งหมด

  • ข้าพเจ้ามั่นใจว่าข้าพเจ้าเข้าใจการเปลี่ยนแปลงธรรมาภิบาลที่จะเกิดขึ้น

  • ฉันดูที่ฟังก์ชันและมองหาสิ่งที่เกี่ยวข้อง

บทสรุปของงานในขั้นตอนนี้คือ Synthetix ได้ทดลองใช้ ETH เป็นหลักประกันเหรียญกษาปณ์ sUSD และ sETH คุณสามารถฝาก ETH ในสัญญาและสร้างสินทรัพย์เหล่านี้ได้ ตราบใดที่คุณดูแลให้มูลค่าหลักประกันของคุณไม่ลดลงต่ำกว่าระดับเงินกู้ของคุณ

แต่หนึ่งปีต่อมา โปรโตคอลได้ลงมติให้ยุติการพิจารณาคดี พวกเขาทำได้อย่างไรในเมื่อมีสินเชื่อคงค้างหลายล้าน? คุณสามารถชำระเงินตำแหน่งใดก็ได้ ในความเป็นจริงหลังจากระยะเวลาการเตือนที่ยาวนาน เงินกู้จะเปลี่ยนจากที่ปลอดภัยในหนึ่งช่วงตึกไปเป็นที่ทุกคนสามารถชำระคืนได้ โดยไม่คำนึงถึงมูลค่าของหลักประกัน! สิ่งนี้ทำให้เกิดการทำธุรกรรมจาก"pDAO"ระบุธุรกรรมที่ส่งไปยังกลุ่มธุรกรรมสาธารณะ

ชื่อระดับแรก

ขั้นตอนที่สอง: รู้จักโอกาส

ตอนนี้ฉันเข้าใจกลไกพื้นฐานและมีฟังก์ชันบางอย่างที่ฉันคิดว่าเกี่ยวข้อง จากนั้น ฉันจะเจาะลึกลงไปว่าฟังก์ชันใดที่ฉันจะเรียกใช้ ข้อมูลใดที่ฉันต้องการ และวิธีการสร้างข้อมูลนั้น

ฉันต้องการสองฟังก์ชั่น:

  • setLoanLiquidationOpen(): เจ้าของสัญญาสามารถเรียกได้เท่านั้น (pDAO) อนุญาตให้ชำระคืนเงินกู้คงค้างได้

  • liquidateUnclosedLoan(): ต้องการ ID เงินกู้และที่อยู่บัญชี และชำระคืนเงินกู้ ทุกคนสามารถใช้งานได้หลังจาก setLoanLiquidationOpen() ถูกเรียก

โปรดทราบว่ามีฟังก์ชันอื่นๆ แต่ฉันค้นพบอย่างรวดเร็วว่าไม่เกี่ยวข้องกัน ตอนนี้ ฉันต้องหาวิธีเลือกว่าจะชำระคืนเงินกู้ใด และต้องใช้ seTH/sUSD เท่าใด ฟังก์ชันต่อไปนี้จะเปิดการทำงานส่วนใหญ่ที่จำเป็นในการทำงาน:

  • openLoanIDsByAccount(): ส่งคืน ID สินเชื่อที่เปิดอยู่ทั้งหมดที่เกี่ยวข้องกับบัญชี

  • getLoanInformation(): ส่งคืนข้อมูลสินเชื่อสำหรับ ID และเจ้าของที่กำหนด

อย่างไรก็ตาม มีสองปัญหาที่ซ่อนอยู่ ประการแรก สัญญาเหล่านี้ไม่ได้บอกคุณว่าที่อยู่ใดมีสินเชื่อคงค้าง ซึ่งทำให้ฉันลำบากใจ ภายในไม่กี่นาที ฉันพบวิธีแก้ปัญหา ซึ่งก็คือการดาวน์โหลดธุรกรรมทั้งหมดของคุณที่มีสัญญาเหล่านี้บน Etherscan และใช้ Excel เพื่อสร้างรายการบัญชีเฉพาะที่มีการโต้ตอบกับสัญญาเหล่านี้ จากนั้นฉันสร้างไปป์ไลน์ต่อไปนี้:

  • ใช้ getLoans เพื่อดูว่ามีสินเชื่อคงค้างที่ที่อยู่นี้หรือไม่ และหากมี ให้บันทึกรหัสสินเชื่อ

  • ใช้ getLoanInformation เพื่อค้นหามูลค่าของหลักประกันที่สนับสนุนเงินกู้ จำนวน sUSD/sETH ที่พวกเขาออก และดอกเบี้ยเงินกู้ของพวกเขามีเท่าใด

  • จัดเรียงตามจำนวนเงินกู้ แสดงรายการเงินกู้ที่ใหญ่ที่สุดก่อน และบันทึกโครงสร้างข้อมูลเป็นไฟล์ json

ปัญหาที่สองคือจำนวน ETH ที่จำนองไว้สามารถชำระคืนเงินกู้ได้ไม่เป็นที่รู้จักในทันที เนื่องจากมีฟังก์ชันของสินเชื่อคงค้าง คุณจึงสามารถประมาณการคร่าวๆ ได้ แต่ฉันต้องการข้อมูลที่แม่นยำกว่านี้ ในการทำเช่นนี้ ฉันได้ศึกษารหัสการชำระคืนเงินกู้และหาวิธีสร้างตัวเลข

ข้อมูลทั้งหมดข้างต้นสามารถรับหรือคำนวณได้ในห่วงโซ่ แต่การทำเช่นนั้นใช้แก๊สมากเกินไป เนื่องจากฉันจะแข่งขันกับผู้อื่นเพื่อประสิทธิภาพการใช้ก๊าซของสัญญา จึงเป็นสิ่งสำคัญอย่างยิ่งสำหรับฉันที่จะต้องย้ายลอจิกออกจากเครือข่ายให้มากที่สุดเท่าที่จะเป็นไปได้เพื่อลดการใช้ก๊าซให้น้อยที่สุด

หลังจากการทำซ้ำไม่กี่ครั้ง ฉันรู้ว่าจำนวนข้อมูลขั้นต่ำที่ฉันต้องการเพื่อออกจากเครือข่ายคือตัวแปรบางอย่างที่ฉันสามารถแก้ไขข้อมูลนอกเครือข่ายเพื่อแจ้งสิ่งที่ฉันป้อนในสัญญาอัจฉริยะ อย่างไรก็ตาม ฟังก์ชันในการรับข้อมูลนี้ซับซ้อนมาก และการสืบค้นสินเชื่อทั้งหมดใช้เวลานานกว่าการประมวลผลบล็อก สิ่งนี้เป็นไปไม่ได้ เพื่อแก้ปัญหานี้ ฉันได้เขียนสัญญาอัจฉริยะสั้นๆ ที่รวบรวมคำขอข้อมูลจำนวนมากไว้ด้วยกัน ซึ่งส่งผลให้ความเร็วเพิ่มขึ้นมากกว่า 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);}

โปรดดู rawsAssetsOracle.sol ที่จัดทำโดย EmGithub

สรุป:

สรุป:ขั้นตอนนี้เกี่ยวกับการได้รับข้อมูลเชิงลึกเกี่ยวกับโอกาสและรวบรวมข้อมูลทั้งหมดที่จำเป็นในการดำเนินการอย่างมีประสิทธิภาพคุณต้องทำให้ดีที่สุดเพื่อย้ายสิ่งต่างๆ ออกจากห่วงโซ่เพื่อลดการใช้ก๊าซชื่อระดับแรก

ชื่อเรื่องรอง

กลยุทธ์สินเชื่อแฟลช

คุณอาจต้องมีสัญญาเฉพาะเพื่อถอน MEV ฉันเขียนสัญญาและทดสอบสภาพแวดล้อมตั้งแต่เนิ่นๆ และฉันสามารถใช้สภาพแวดล้อมนี้เพื่อทำความเข้าใจสัญญาได้ดีขึ้นและตรวจสอบให้แน่ใจว่าข้อมูลถูกต้อง ทำเกือบพร้อมกันกับขั้นตอนที่สองและสี่

ฉันรู้ว่าฉันต้องได้เงินหลายล้านดอลลาร์ใน sUSD/sETH ดังนั้นเงินกู้ด่วนจึงเป็นสิ่งจำเป็น นอกจากนี้ ฉันจะเผาสินทรัพย์สังเคราะห์เหล่านี้แต่จะได้ ETH ที่เดิมพันไว้คืน หลังจากคิดอยู่พักหนึ่ง ฉันก็ตระหนักได้ว่าฉันจะแลกเปลี่ยน ETH เป็นสินทรัพย์อื่นๆ ต่อไป แต่ฉันสามารถเลือกได้ว่าจะทำก่อนหรือหลังการชำระคืน เป็นไปได้สองทางคือ

  • ตัวเลือกที่ 1 ตัวเลือกที่ 1: ยืม ETH ผ่าน Flash Loan -> แลกเปลี่ยน USDC -> แลกเปลี่ยน sUSD -> ชำระคืน sUSD Loan -> รับ ETH -> ชำระคืน ETH Flash Loan

  • ตัวเลือกที่ 2 ตัวเลือกที่ 2: กู้เงิน sUSD ผ่านสินเชื่อแฟลช -> ชำระคืนเงินกู้ sUSD -> รับ ETH -> แปลง USDC -> แปลง sUSD -> ชำระคืนเงินกู้แฟลช sUSD

การเพิ่มประสิทธิภาพก๊าซ

การเพิ่มประสิทธิภาพก๊าซ

คุณสามารถดูสัญญาทั้งหมดของฉันได้ที่นี่ แต่นี่เป็นส่วนหนึ่งหลังจากที่ฉันได้รับ ETH จาก dYdX และชำระคืนเงินกู้ 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 or the dYdX contract call this function    // probably fine to restrict to dYdX    require(msg.sender == executor || msg.sender == address(soloMargin));    // Decode the passed variables from the data object    (        address[] memory sUSDAddresses,        uint256[] memory sUSDLoanIDs,        uint256 wethEstimate,        uint256 usdcEstimate,        uint256 ethToCoinbase    )        = abi.decode(data,    (        address[],        uint256[],        uint256,        uint256,        uint256    ));    // Swap WETH for USDC on uniswap v3    uniswapRouter.exactOutputSingle(        ISwapRouter.ExactOutputSingleParams(            address(WETH),        // address tokenIn;            usdcTokenAddress,     // address tokenOut;            3000,                 // uint24 fee;            address(this),        // address recipient;            10**18,               // uint256 deadline;            usdcEstimate,         // uint256 amountOut;            wethEstimate,         // uint256 amountInMaximum;            0                     // uint160 sqrtPriceLimitX96;        )    );    // Swap USDC for sUSD on Curve    curvePoolSUSD.exchange_underlying(        1, // usdc        3, // sUSD        usdcEstimate, // usdc input        1); // min sUSD, generally not advisible to make a trade with a min amount out of 1, but its fine here I think because the overall risk of getting rekt is low    // Liquidate the loans    for (uint256 i = 0; i < sUSDAddresses.length; i++) {        sUSDLoansAddress.liquidateUnclosedLoan(sUSDAddresses[i], sUSDLoanIDs[i]);    }    // We got back ETH but must pay dYdX in WETH, so deposit our whole balance sans what is paid to miners    WETH.deposit{value: address(this).balance - ethToCoinbase}();    // Pay the miner    block.coinbase.transfer(ethToCoinbase);    // Use for chi tokens    uint256 gasSpent = 21000 + gasStart - gasleft() + (16 * msg.data.length);    CHI.freeFromUpTo(owner, (gasSpent + 14154) / 41947);}

โปรดดู rawdYdXLiquidator.sol ที่จัดทำโดย EmGithub

ฉันใช้เวลามากมายในการพยายามลดการใช้แก๊สให้น้อยที่สุด ตัวเลือกการออกแบบจำนวนมากของฉันขึ้นอยู่กับสิ่งนี้ เกี่ยวกับกลยุทธ์ของสัญญานี้มีบางจุดที่ควรทราบ

  • แทนที่จะส่งธุรกรรมการไถ่ถอนและการแลกเปลี่ยนแยกต่างหากจำนวนมาก ฉันเลือกที่จะรวมการชำระคืนหลายรายการไว้ในธุรกรรมเดียว ซึ่งช่วยให้ค่าใช้จ่ายคงที่ของฉันกระจายไปกับการชำระคืนหลายครั้ง ซึ่งจะช่วยปรับปรุงความสามารถในการแข่งขันของชุดธุรกรรมของฉัน

  • ฉันต้องแปลง ETH เป็น USDC เป็น sUSD ในวิธีที่ดีที่สุด และต้องตัดสินใจว่าจะซื้อขายบน Uniswap v3 ซึ่งมีฟังก์ชันที่ตรงหรือตรง ไม่ว่าฉันจะทำอะไรก็จะเกิดการเลื่อนหลุดในที่ใดที่หนึ่ง ดังนั้นฉันจึงเลือกที่จะใช้ฟังก์ชันexactOutputเพื่อหลีกเลี่ยงการเรียกค่าสมดุลของ

  • มีการแลกเปลี่ยนระหว่างความถูกต้องและประสิทธิภาพของก๊าซของการทำธุรกรรมเหล่านี้ การขาดความแม่นยำนั้นไม่เป็นไรตราบใดที่ฉันสามารถชำระคืนเงินกู้แฟลชได้ และเนื่องจากฉันกำลังแข่งขันกับประสิทธิภาพการใช้น้ำมัน ฉันจึงเลือกที่จะเพิ่มประสิทธิภาพให้กับมัน

นอกจากนี้ยังมี "ยุทธวิธี" บางอย่างที่ต้องระวัง:

  • การอนุมัติทุกอย่างจะถูกส่งต่อไปยังฟังก์ชันการสร้างสัญญาของฉัน ด้วยวิธีนี้ ฉันสามารถจ่ายค่าโสหุ้ยในเวลาที่ปรับใช้ และลดก๊าซที่ใช้ในการดำเนินการ

  • ฉันไม่ได้เผาโทเค็นก๊าซจากบัญชีของฉัน แต่จากสัญญาของฉัน เพื่อปรับปรุงประสิทธิภาพการใช้ก๊าซด้วย

  • มีการระบุชื่อฟังก์ชันทั้งหมด และอักขระนำหน้าของตัวเลือกฟังก์ชันคือ 0x และการใช้ตัวเลือกฟังก์ชันยังช่วยลดการใช้แก๊สได้เล็กน้อย

  • ตัวดัดแปลงฟังก์ชันใช้แก๊สมากกว่าการเพิ่มโดยตรงเล็กน้อย ข้อความสั่ง

  • นอกจากนี้ยังมีวิธีเพิ่มประสิทธิภาพสัญญานี้ เช่น การใช้ค่าธรรมเนียมน้ำมันแทนการโอนฐานเหรียญ

  • สรุป:

สรุป:ชื่อระดับแรก

ชื่อเรื่องรอง

เศรษฐศาสตร์ของการชำระคืน MEV และการปรับราคาก๊าซให้เหมาะสม

ด้วยสัญญาที่ออกแบบมาอย่างดีและความเข้าใจอย่างถ่องแท้เกี่ยวกับโอกาส ฉันจำเป็นต้องปรับปรุงกลยุทธ์ของฉันเพื่อทำให้เป็นจริง สรุปก็คือ ไคลเอ็นต์ MEV-Geth ของ Flashbot สามารถดำเนินการประมูลได้อย่างมีประสิทธิภาพ โดยกลุ่มที่มีราคาน้ำมันสูงที่สุดจะเป็นผู้ชนะและได้รับการรวมกลุ่มแบบออนไลน์ ข้อเท็จจริงที่สำคัญนี้หมายความว่าฉันต้องเพิ่มราคาก๊าซของชุดธุรกรรมของฉันให้สูงสุด ไม่ใช่จำนวนเงินรวมของ ETH ที่ฉันจ่าย

รูปภาพ

รูปภาพ

โปรดทราบว่าผลลัพธ์นี้ค่อนข้างน่าแปลกใจ - การชำระคืนเงินกู้ sUSD 4 (จาก 30) ครั้งแรกเท่านั้นเป็นวิธีที่ประหยัดที่สุด เงินกู้แต่ละครั้งหลังจากนั้นจะสร้างผลกำไรโดยรวมมากขึ้น แต่จะลดราคาก๊าซของกลุ่มธุรกรรมของฉันและทำให้แข่งขันได้น้อยลง หากมีคนอื่นพยายามชำระคืนเงินกู้ 10 sUSD แรกในครั้งเดียว ปริมาณการใช้ก๊าซของพวกเขาจะมีประสิทธิภาพน้อยลงเกือบ 30%!

เนื่องจากมีสินเชื่อ seTH ที่ค้างชำระน้อยกว่า จึงเหมาะสมที่สุดที่จะทำสินเชื่อ sUSD เท่านั้นและไม่รวม sUSD และ seTH ไว้ในธุรกรรมเดียว เป็นผลให้มีรางวัลที่เป็นไปได้น้อยลงและเงินที่จ่ายให้กับนักขุดน้อยลง ทำให้พวกเขาค่อนข้างไร้ประสิทธิภาพ ฉันอดไม่ได้ที่จะยิ้มเมื่อเห็นการค้นพบเหล่านี้ ถ้าคนอื่นโลภและจ่ายเงินกู้หมดในคราวเดียว หรือขี้เกียจและแบ่งจ่าย ฉันชนะ

ชื่อเรื่องรอง

การประมูล Flashbots และกลยุทธ์การสั่งซื้อบันเดิลของฉัน

หากต้องการทำซ้ำสถานการณ์: ฉันต้องการทั้งการแข่งขันด้านประสิทธิภาพการใช้น้ำมันและเพิ่มผลตอบแทนสูงสุดสำหรับการชำระคืนเงินกู้แต่ละครั้ง กลยุทธ์ที่ดีที่สุดคือส่งการชำระคืนหลายๆ ครั้งต่อกลุ่ม หลายๆ กลุ่ม กลุ่มเหล่านี้ได้รับการประเมินทีละรายการในการประมูล Flashbots อย่างไรก็ตาม ทุกธุรกรรมขึ้นอยู่กับธุรกรรมจาก pDAO ซึ่งทำให้ทุกคนสามารถชำระคืนเงินกู้ได้

  • ถ้าธุรกรรม pDAO ไม่ได้อยู่ในบันเดิล บันเดิลจะล้มเหลว แต่ถ้าฉันมีธุรกรรม pDAO ในแต่ละบันเดิล จะมีเพียงบันเดิลเดียวที่สำเร็จ นั่นคือ หลังจากห่อธุรกรรมสำเร็จแล้ว ส่วนอื่นๆ ทั้งหมดจะไม่ถูกต้องเนื่องจากจะพยายามแพ็คธุรกรรม pDAO เป็นสองเท่า ดังนั้น ฉันต้องหาวิธีส่งเฉพาะธุรกรรม pDAO ในชุดธุรกรรมแรกของฉัน แต่ในขณะเดียวกันต้องแน่ใจว่าชุดธุรกรรมอื่นๆ ของฉันไม่ล้มเหลวและถูกโยนทิ้งไปเพราะไม่มีธุรกรรม pDAO

วิธีแก้ปัญหาอยู่ที่ความละเอียดอ่อนของการประมูล Flashbots Flashbots ทำการจำลองสองรอบก่อนที่เสิร์ชเอ็นจิ้นจะเริ่มใช้ "เคล็ดลับ" ในการประมูลเพื่อลดค่าธรรมเนียมการขุดหลังจากรวมธุรกรรม ขั้นแรก กลุ่มธุรกรรมทั้งหมดจะจำลองแยกจากกัน ราคาก๊าซจะได้รับและตรวจสอบความล้มเหลว ในรอบที่สอง กลุ่มที่ประสบความสำเร็จจะถูกจัดเรียงตามราคาก๊าซ และการจำลองจะทำงานอีกครั้งเพื่อค้นหากลุ่มที่ไม่สอดคล้องกัน เพื่อให้แน่ใจว่าไม่มีกลุ่มใดที่มีราคาก๊าซต่ำกว่าที่คาดไว้ เว้นแต่คุณต้องการ คุณอาจไม่มีชุดธุรกรรมที่ราคาน้ำมันลดลงหลังจากการควบรวมกิจการ

ฉันตระหนักว่าฉันสามารถทำสิ่งที่ตรงกันข้ามกับผู้ค้นหาด้านบนได้: แทนที่กลุ่มธุรกรรมของฉันจะจ่ายน้ำมันน้อยกว่าที่คาดไว้ พวกเขากลับยอมจ่ายมากขึ้นในการจำลองรอบที่สอง ในการดำเนินการนี้ ฉันจะรวมธุรกรรม pDAO ไว้ในบันเดิลแรกตามที่คาดไว้ แต่ตรวจสอบเพิ่มเติมในบันเดิลที่เหลือ ชุดธุรกรรมเหล่านี้จะอนุมานว่า "รอบ" ใดที่จะถูกจำลองที่ จากนั้นจึงปรับเปลี่ยนการดำเนินการตามนั้น หากพวกเขาอยู่ใน "รอบที่หนึ่ง" พวกเขาจะไม่ชำระคืนเงินกู้ใด ๆ - เพราะพวกเขาจะล้มเหลวหากพวกเขาพยายาม - จากนั้นจึงจ่ายเงินให้คนงานเหมืองเพื่อให้ได้ราคาก๊าซที่สูงเพื่อให้ผ่านการจำลองรอบแรก

หลังจากผ่านรอบแรกของการจำลอง กลุ่มธุรกรรมเหล่านี้จะตามด้วยธุรกรรม pDAO ในรอบที่สองของการจำลอง ณ จุดนี้พวกเขาสามารถชำระคืนเงินกู้ได้สำเร็จ นอกจากนี้ ราคาแก๊สสำหรับชุดเหล่านี้จะสูงกว่าที่ประมูลคาดไว้ ไม่ต่ำกว่า ดังนั้นการเปลี่ยนการใช้งานจึงไม่ใช่ปัญหาที่นี่

สรุป:

สรุป:ชื่อระดับแรก

ขั้นตอนที่ห้า: การดำเนินการ

ตอนนี้ฉันมีข้อมูล สัญญา และแผนการที่ฉันสามารถเริ่มดำเนินการได้ โดยพื้นฐานแล้ว ฉันต้องสร้างบันเดิลธุรกรรมดังกล่าวหลายชุด: ในแง่หนึ่ง ฉันสามารถดำเนินการตามแผนของฉันด้านบนได้ และในทางกลับกัน ฉันต้องฟังธุรกรรมที่เกี่ยวข้องกับ Synthetix ในกลุ่มธุรกรรมเพื่อการติดตามส่วนท้าย ณ จุดนี้ ปัญหาส่วนใหญ่อยู่ที่การนำไปปฏิบัติ

อันดับแรก ฉันใช้ Blocknative เพื่อฟังบัญชี pDAO สำหรับการทำธุรกรรมที่เกี่ยวข้อง ฉันมีธุรกรรมใด ๆ ที่ส่งจากบัญชี pDAO จะถูกส่งไปยังบอทของฉัน

จากนั้น ฉันเรียกใช้สคริปต์การฟังสองรายการ (หนึ่งรายการสำหรับ sETH และ sUSD) พร้อมกันเพื่อรับข้อมูลจากเครือข่ายและหากลยุทธ์ชุดธุรกรรมที่เหมาะสมที่สุด (เช่น ชำระคืนเงินกู้ 3 sETH แรกก่อน เงินกู้แฟลช X ETH และทำเช่นเดียวกันกับ 2 ครั้งสุดท้าย เป็นต้น) และสร้างข้อมูลที่สัญญาของฉันต้องการ ฉันต้องทำสิ่งนี้ทุกบล็อก ในกรณีที่ราคาเปลี่ยนแปลงหรือมีคนปิดเงินกู้ เปลี่ยนกลยุทธ์ที่ดีที่สุด ผลลัพธ์เหล่านี้จะถูกบันทึกไว้ในเครื่อง

ในท้ายที่สุด ฉันมีสคริปต์การดำเนินการที่รับการซื้อขายที่รอดำเนินการส่งไปยังบอทของฉัน โหลดผลลัพธ์ของกลยุทธ์แบบรวมที่เหมาะสมที่สุดจากสคริปต์การฟังของฉัน สร้างกลุ่มโดยอัตโนมัติ และส่งไปยัง Flashbots

ชื่อระดับแรก

ขั้นตอนที่หก: ช่วงเวลามาถึงแล้ว

ที่น่าสนใจคือ มีคนพยายามหลอกล่อบอทให้ล้มเหลวตั้งแต่เนิ่นๆ ด้วยการส่งธุรกรรมไปยังสัญญาที่เกี่ยวข้อง ฉันไม่แน่ใจว่าสิ่งนี้เกิดขึ้นกับบอทของคนอื่นด้วยหรือไม่ แต่ของฉันเกลี้ยกล่อมไม่สำเร็จ

ไม่กี่ชั่วโมงต่อมา pDAO ส่งธุรกรรมจริง หลังจากค้นคว้าและเตรียมการมาหลายสัปดาห์ ฉันก็รู้ว่าช่วงเวลานั้นมาถึงแล้ว ฝั่งฉันทุกอย่างไปได้สวย: สคริปต์ฟังของฉันทำงานได้ดี ได้รับธุรกรรม ชุดรวมธุรกรรมถูกสร้างขึ้นและคอมมิต

.....และแล้วอุบัติเหตุก็เกิดขึ้น ไม่มีการขุดบล็อก Flashbots ติดต่อกันหลายบล็อก ไม่เพียงแต่ฉันเสียโอกาสเท่านั้น แต่ไม่มีโปรแกรมรวบรวมข้อมูล Flashbots ใดที่ชนะโอกาส เมื่อไม่มี Flashbots ปิดกั้นที่ด้านบนสุดของบล็อก บอทกลุ่มการทำธุรกรรมที่มีความทะเยอทะยานเข้ามาและคว้าเงินกู้ที่ให้ผลกำไรทั้งหมด

แม้จะขาดทุน แต่ฉันคิดว่าแนวทางของฉันยังถูกต้อง จุดแข็งของฉันอยู่ที่กลยุทธ์และการมองหาโอกาสใหม่ๆ ไม่ใช่ใน PGA (การประมูลก๊าซที่ดีที่สุด) ดังนั้นการใช้ Flashbot ทำให้ฉันมีโอกาสชนะมากที่สุด เนื่องจากมีการใช้ Flashbots อย่างแพร่หลาย จึงค่อนข้างโชคร้ายที่มีบล็อกที่ไม่ใช่ Flashbots หลายบล็อกติดต่อกัน

บางครั้ง MEV ถูกมองว่าเป็นอาณาจักรของสุดยอดโปรแกรมเมอร์ที่เข้าใจยาก แต่ไม่จำเป็นต้องเป็นเช่นนั้น คงจะสนุกตื่นเต้นไม่น้อย และกฎของเกมก็เปิดอยู่ หากคุณกำลังมองหากฎเหล่านี้ บทความนี้เกี่ยวกับกระบวนการของฉันในการเรียนรู้กฎของเกมที่ฉันเล่น ซึ่งฉันคิดกลยุทธ์ขึ้นมาและดำเนินกลยุทธ์นั้นในท้ายที่สุด แม้ว่าฉันจะแพ้ แต่ฉันได้เรียนรู้มากมายและสนุกไปพร้อมกัน ฉันหวังว่าคุณจะทำได้เช่นกัน และหวังว่าคุณจะเข้าร่วมกับฉันในเกมรอบต่อไป

ลิงค์ต้นฉบับ: https://bertcmiller.com/2021/09/05/mev-synthetix.html

ETH
Synthetix
ยินดีต้อนรับเข้าร่วมชุมชนทางการของ Odaily
กลุ่มสมาชิก:
https://t.me/Odaily_News
กลุ่มสนทนา:
https://t.me/Odaily_GoldenApe
บัญชีทางการ:
https://twitter.com/OdailyChina
สารบัญบทความ
คลังบทความของผู้เขียน
ECN以太坊中国
อันดับบทความร้อน
Daily
Weekly
ดาวน์โหลดแอพ Odaily พลาเน็ตเดลี่
ให้คนบางกลุ่มเข้าใจ Web3.0 ก่อน
IOS
Android