การวิเคราะห์โดยสังเขปของกระบวนการโดยละเอียดในการจับภาพ Synthetix 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


