การเก็งกำไรบนเชน: วงจรอะตอม, แฟลชโลน, และการประมูลที่คุณต้องชนะ
มีความเชื่อที่สบายใจว่าการเก็งกำไรบนเชนเป็นเรื่องยากเพราะ การค้นหา เป็นเรื่องยาก — ว่ามีวงจรที่ซ่อนอยู่บางอย่างในกราฟราคาที่อัลกอริทึมที่ฉลาดที่สุดเท่านั้นที่สามารถมองเห็นได้ และใครก็ตามที่คำนวณได้เร็วที่สุดก็จะได้รับค่าตอบแทน ความจริงเกือบจะตรงกันข้าม บนเชนสาธารณะ วงจรที่ทำกำไรได้นั้นมองเห็นได้โดยทุกคนในทันที โดยถูกคำนวณโดยบอทหลายสิบตัวที่รันโค้ดที่เหมือนกันเกือบทั้งหมดกับสำรองเดียวกัน การตรวจจับเป็นปัญหาที่แก้ไขได้และกลายเป็นสินค้าโภคภัณฑ์ สิ่งที่ยาก — สิ่งที่ตัดสินว่าใครจะได้เงินจริงๆ — คือการชนะลำดับ: การวางธุรกรรมของคุณในช่องที่ถูกต้องของบล็อกที่ถูกต้อง ก่อนที่ผู้ค้นหาคนอื่น ๆ ที่พบสิ่งเดียวกันทุกประการ การเก็งกำไรบนเชน ตรวจจับได้ง่าย และ ชนะได้ยาก และช่องว่างระหว่างคำกริยาเหล่านั้นคือที่ที่เศรษฐศาสตร์ทั้งหมดของธุรกิจอาศัยอยู่
บทความนี้จะนำมุมมองของผู้ค้นหามาพิจารณา ใน กายวิภาคของ MEV เราได้ทำแผนที่ป่าทมิฬจากมุมมองของเหยื่อ และสัญญาว่าจะติดตามผลเกี่ยวกับการสกัด ที่ไม่มีอันตราย — การเก็งกำไรและการแบ็ครันที่ทำให้ราคาทั้งหมดบนเชนมีความยุติธรรม ใน การชำระบัญชีบนเชน เราได้สร้างสัญญาการดำเนินการสินเชื่อแฟลชและบันเดิลการแบ็ครันออราเคิล และชี้ไปที่นี่สำหรับการรักษาทั่วไปของสิ่งพื้นฐาน ชิ้นนี้จ่ายหนี้ทั้งสอง มันสมมติว่าคุณรู้อยู่แล้วว่า mempool, bundle, และ priority fee คืออะไร หากไม่เป็นเช่นนั้น โปรดอ่านบทความ MEV ก่อน ที่นี่เราจะสร้างเครื่องมือของนักเก็งกำไร: ธุรกรรมอะตอมมิกที่ไม่สามารถสูญเสียได้, เงินทุนที่ยืมมาซึ่งขจัดข้อจำกัดด้านทุน, การค้นหากราฟที่เป็นครึ่งหนึ่งที่ง่าย, และการประมูลที่กินส่วนต่างเกือบทั้งหมด
อะตอมมิก: การซื้อขายที่ย้อนกลับเมื่อขาดทุน
คุณสมบัติที่กำหนดของการเก็งกำไรบนเชน — สิ่งที่ทำให้มันปลอดภัยอย่างยิ่งเมื่อเทียบกับการซื้อขายข้ามสถานที่ใดๆ ที่เทรดเดอร์ CEX สามารถดำเนินการได้ — คือ อะตอมมิก การเก็งกำไรหลายขั้นตอนไม่ใช่ลำดับของการซื้อขายที่คุณยิงออกไปและหวังว่าจะสำเร็จพร้อมกัน มันคือ ธุรกรรมเดียว ที่ดำเนินการทุกขาของวงจร และหากยอดคงเหลือสุดท้ายไม่มากกว่ายอดคงเหลือเริ่มต้นอย่างชัดเจน ธุรกรรมทั้งหมดจะ ย้อนกลับ: การเปลี่ยนแปลงสถานะทั้งหมดจะถูกยกเลิกราวกับว่าไม่เคยเกิดขึ้น และคุณจะเสียเฉพาะค่าแก๊สสำหรับธุรกรรมที่ล้มเหลวเท่านั้น
สิ่งนี้เปลี่ยนโปรไฟล์ความเสี่ยงอย่างสิ้นเชิง เทรดเดอร์ CEX ที่ซื้อ BTC บนการแลกเปลี่ยนหนึ่งเพื่อขายบนอีกแห่งหนึ่งจะถือสินค้าคงคลังระหว่างนั้น — เป็นเวลาหลายวินาที หลายนาที นานเท่าใดก็ตามที่การโอนและการเติมครั้งที่สองใช้เวลา — และรับผลกระทบจากราคาใดๆ ที่เกิดขึ้นในช่วงเวลานั้น นักเก็งกำไรบนเชนถือสินค้าคงคลังเป็นเวลา ศูนย์ ในแง่เศรษฐกิจที่มีความหมาย: การซื้อและการขายเป็นการดำเนินการเดียวกันที่ไม่สามารถแบ่งแยกได้ ไม่มีความเสี่ยงด้านราคาในช่วงกลางวงจรเพราะไม่มีช่วงกลางวงจร ไม่ว่าวงจรทั้งหมดจะปิดลงอย่างมีกำไรในขั้นตอนอะตอมมิกเดียว หรือไม่เกิดขึ้นเลย
ตัวป้องกันที่บังคับใช้สิ่งนี้คือการเปรียบเทียบเดียวที่ปลายสุดของเส้นทางการดำเนินการ โดยหลักการแล้ว สัญญาการเก็งกำไรอะตอมมิกไม่ได้ทำอะไรมากไปกว่า:
// The whole cycle runs inside one transaction. If the closing balance
// does not clear the opening balance (plus costs), the require() throws,
// and the EVM reverts every trade that came before it.
function executeCycle(bytes calldata path, uint256 minProfit) external {
uint256 start = IERC20(baseToken).balanceOf(address(this));
_hopA(path); // e.g. USDC -> WETH on Uniswap
_hopB(path); // e.g. WETH -> DAI on Sushiswap
_hopC(path); // e.g. DAI -> USDC on Curve
uint256 end = IERC20(baseToken).balanceOf(address(this));
require(end >= start + minProfit, "unprofitable"); // atomic safety net
}
require คือโมเดลความปลอดภัยทั้งหมด ใบเสนอราคาที่ล้าสมัย, ธุรกรรมคู่แข่งที่ย้ายพูลไปหนึ่งช่องก่อนของคุณ, ค่าธรรมเนียมที่ไม่คาดคิด — อะไรก็ตามที่ทำให้วงจรไม่ทำกำไรเพียงแค่ทำให้ตัวป้องกันทำงานและย้อนกลับ คุณไม่เคยขายขาสุดท้ายในราคาที่แย่กว่าที่คุณจำลองไว้และรับผลขาดทุน; การซื้อขายที่จะขาดทุน จะไม่ดำเนินการ นี่คือเหตุผลว่าทำไมการเก็งกำไรจึงเป็นส่วนที่ไม่มีอันตรายของอนุกรมวิธาน MEV จาก บทความ MEV: ไม่มีเหยื่อที่การเติมถูกลดทอน และนักเก็งกำไรก็ไม่แบกรับความเสี่ยงด้านทิศทางของสินค้าคงคลัง ต้นทุนจริงเพียงอย่างเดียวของความพยายามที่ล้มเหลวคือแก๊ส — ซึ่งดังที่เราจะได้เห็น คือต้นทุนที่การประมูลแข่งขันถูกออกแบบมาเพื่อเพิ่มขึ้น
สินเชื่อแฟลชขจัดข้อจำกัดด้านทุน
อะตอมมิกเปิดใช้งานสิ่งที่แข็งแกร่งกว่า: การเก็งกำไรโดย ไม่มีทุนของตนเอง สินเชื่อแฟลชช่วยให้คุณยืมจำนวนเท่าใดก็ได้จากพูลการให้กู้ยืมโดยมีเงื่อนไขเพียงอย่างเดียว — คุณต้องชำระคืนพร้อมกับค่าธรรมเนียม ก่อนที่ธุรกรรมจะสิ้นสุด เนื่องจาก การยืม, การเก็งกำไร, และการชำระคืนทั้งหมดอยู่ในธุรกรรมอะตอมมิกเดียว พูลจึงไม่มีความเสี่ยงในการผิดนัดชำระหนี้: หากคุณไม่สามารถชำระคืนได้ ธุรกรรมทั้งหมดจะย้อนกลับและสินเชื่อจะถูกยกเลิก ผู้ให้กู้ได้รับการคุ้มครองโดยการย้อนกลับเดียวกันที่ปกป้องคุณ
รูปแบบคือการเรียกกลับ คุณเรียกฟังก์ชันสินเชื่อแฟลชของพูล; พูลจะส่งโทเค็นให้คุณแล้วเรียก คุณกลับ; ภายใน callback นั้น คุณจะดำเนินการวงจรและต้องเหลือเพียงพอสำหรับการชำระคืน:
// Called by the lending pool in the middle of the flash loan.
function receiveFlashLoan(address token, uint256 amount, uint256 fee, bytes calldata data)
external
{
// 1. buy the asset cheap on venue A with the borrowed `amount`
uint256 bought = _swap(VENUE_A, token, ASSET, amount, data);
// 2. sell it dear on venue B, back into the borrowed token
uint256 repaidIn = _swap(VENUE_B, ASSET, token, bought, data);
// 3. must be able to return principal + fee, or the whole tx reverts
require(repaidIn >= amount + fee, "arb cannot cover loan");
IERC20(token).transfer(msg.sender, amount + fee); // repay in-tx
// whatever remains — repaidIn - amount - fee — is profit, kept here
}
ค่าธรรมเนียมมีขนาดเล็กและขึ้นอยู่กับสถานที่: Aave v3 คิดค่าธรรมเนียม 5 bps (0.05%) สำหรับสินเชื่อแฟลช, Balancer เคยคิดค่าธรรมเนียม 0 bps, และ Uniswap v3 เปิดเผยความสามารถเดียวกันผ่าน flash swaps โดยค่าธรรมเนียมเป็นเพียงค่าธรรมเนียมการแลกเปลี่ยนปกติของพูล ห้า basis points เป็นต้นทุนจริงที่ต้องเคลียร์ภายในส่วนต่างของวงจร แต่ก็เล็กน้อยเมื่อเทียบกับทางเลือกในการผูกเงินทุนหกหรือเจ็ดหลักของสินค้าคงคลังของคุณเองเพื่อจับการเบี่ยงเบนที่คงอยู่เพียงหนึ่งบล็อก
ผลที่ตามมาต่อโครงสร้างตลาดนั้นคุ้มค่าที่จะกล่าวอย่างชัดเจน: สินเชื่อแฟลชแยกกำไรจากการเก็งกำไรออกจากทุน ผู้ชนะในโอกาสที่กำหนดไม่ใช่ผู้ค้นหาที่มีงบดุลลึกที่สุด — บอทที่มีเงินแก๊สเพียงไม่กี่ดอลลาร์สามารถยืมเงินสิบล้านดอลลาร์ได้ตลอดระยะเวลาหนึ่งธุรกรรม ทุนไม่ใช่คูเมือง ทุกคนสามารถยืมขนาดเดียวกันกับโอกาสเดียวกัน ซึ่งเป็นเหตุผลว่าทำไมการแข่งขันจึงยุบตัวลงเหลือสิ่งเดียวที่ ไม่ กลายเป็นสินค้าโภคภัณฑ์: การได้รับการจัดลำดับก่อน
วงจรข้าม DEX ที่ทำงานแล้ว
ตัวเลขทำให้กลไกมีความเป็นรูปธรรม ลองดูพูล WETH/USDC แบบ constant-product สองพูลที่มีค่าธรรมเนียม 0.30% () และสมมติว่าการซื้อครั้งใหญ่เพิ่งผลักดันพูล B ให้สูงกว่าพูล A — การเบี่ยงเบนประเภทที่ส่วนถัดไปแสดงให้เห็นว่าเป็นที่มาของวงจร ใช้สำรองกลมๆ ที่แสดงให้เห็นชัดเจน:
- พูล A (ราคาถูก): WETH, USDC ราคา USDC/WETH
- พูล B (แพง): WETH, USDC ราคา USDC/WETH
วงจรคือ: สินเชื่อแฟลช USDC, ซื้อ WETH ราคาถูกบน A, ขายราคาแพงบน B, ชำระคืน ยืม USDC การกระโดด 1 ขาย USDC เข้าสู่พูล A สำหรับ WETH:
การกระโดด 2 ขาย WETH นั้นเข้าสู่พูล B สำหรับ USDC:
คุณยืม 100,000 ได้รับ 100,723 และเป็นหนี้ค่าธรรมเนียมสินเชื่อแฟลช 5 bps จำนวน 50 USDC สุทธิ: ประมาณ กำไรขั้นต้น $673 จากการลงทุนด้วยทุนศูนย์ ก่อนหักค่าแก๊สและก่อนการเสนอราคาสูงสุด สองสิ่งที่ควรสังเกต ประการแรก การกระโดดทั้งสองทำให้พูล เข้าใกล้กันมากขึ้น — การซื้อบน A ทำให้ราคาสูงขึ้น การขายบน B ทำให้ราคาลดลง — ดังนั้นกำไรจึงไม่เป็นเชิงเส้นตามขนาด: หากผลักดันมากเกินไป ผลกระทบด้านราคาจะกินส่วนต่างไป เช่นเดียวกับการปรับให้เหมาะสมแบบแซนด์วิชจาก บทความ MEV ผู้ค้นหาจะดำเนินการค้นหาแบบมิติเดียวบน เพื่อหาขนาดการยืมที่เพิ่มกำไรสุทธิให้สูงสุด ประการที่สอง $673 นั้นเป็น ตัวเลขที่แน่นอน ที่บอทคู่แข่งทุกตัวคำนวณได้ค่าเท่ากันจากสำรองเดียวกัน — ซึ่งเป็นปัญหาทั้งหมด และเป็นหัวข้อของส่วนการประมูลด้านล่าง

การตรวจจับเป็นครึ่งหนึ่งที่ง่าย
เมื่อพิจารณาตลาดเป็นกราฟ — สินทรัพย์เป็นโหนด, คู่การซื้อขายเป็นขอบที่มีน้ำหนัก — วงจรการเก็งกำไรคือวงจรที่ผลคูณของอัตราแลกเปลี่ยนเกินหนึ่ง การใช้ลอการิทึมของแต่ละอัตรา, การทำให้เป็นลบ, และวงจรที่ทำกำไรจะกลายเป็น วงจรที่มีน้ำหนักเป็นลบ เครื่องมือคลาสสิกในการค้นหาคือ Bellman-Ford, โดยมี SPFA และอัลกอริทึม RICH ที่ใหม่กว่าเป็นรูปแบบที่เร็วกว่าซึ่งปรับให้เหมาะกับกราฟขนาดเล็กที่เปลี่ยนแปลงอย่างรวดเร็วที่ตลาดจริงสร้างขึ้น ชุดเครื่องมือทั้งหมดนั้น — การแปลงลอการิทึม, เงื่อนไขวงจรติดลบ, การใช้งาน Rust, และน้ำหนักขอบที่ปรับค่าธรรมเนียมซึ่งทำลายวงจรทางทฤษฎีส่วนใหญ่ — เป็นหัวข้อของ อัลกอริทึมกราฟสำหรับการตรวจจับการเก็งกำไร และไม่จำเป็นต้องกล่าวซ้ำที่นี่
สิ่งที่สำคัญสำหรับบทความ นี้ คือจุดบัญชีเดียว: ค่าธรรมเนียมต้อง รวมอยู่ในน้ำหนักขอบ หรือวงจรจะเป็นภาพลวงตา วงจรสามขาจะจ่ายค่าธรรมเนียมพูลสามครั้ง บวกกับค่าธรรมเนียมสินเชื่อแฟลชหากคุณยืม และการทดสอบวงจรติดลบต้องเห็นทั้งหมด:
from math import log
def cycle_log_gain(rates, pool_fee=0.003, loan_fee=0.0005):
"""Log-gain around a cycle. > 0 means gross profit before gas and priority bid.
`rates[i]` = units of the next asset per unit of the current one on hop i."""
gross = 1.0
for r in rates:
gross *= r * (1 - pool_fee) # each hop pays the venue's swap fee
gross *= (1 - loan_fee) # one flash-loan fee for the whole cycle
return log(gross) # still ignores gas and the auction bid
นี่คือข้อสังเกตที่สำคัญ ฟังก์ชันนั้น แน่นอน ป้อนสำรองบนเชนปัจจุบัน — ซึ่งทุกโหนดถือเหมือนกัน เพราะเชนเป็นเครื่องสถานะที่จำลองและแบ่งปัน — และผู้ค้นหาทุกคนจะคำนวณ cycle_log_gain เดียวกันให้ได้ค่าเดียวกันที่ความสูงบล็อกเดียวกัน ไม่มีการส่งสัญญาณส่วนตัว, ไม่มีชุดข้อมูลที่เป็นกรรมสิทธิ์, ไม่มีข้อได้เปรียบด้านข้อมูล เมื่อการแลกเปลี่ยนขนาดใหญ่หรือบล็อกใหม่จัดเรียงสำรองใหม่ บอทหลายสิบตัวที่รันโค้ดตรวจจับที่เหมือนกันทางโครงสร้างจะสว่างขึ้นบนวงจรเดียวกันภายในไม่กี่มิลลิวินาที การค้นหาจะให้ผลลัพธ์เดียวกันกับทุกคน
หมายเหตุเกี่ยวกับโทโพโลยี เพราะมันกำหนดว่าการค้นหาจริงๆ ยากแค่ไหน วงจรที่ถูกที่สุดคือ สามเหลี่ยมและภายใน DEX — WETH → USDC → DAI → WETH ทั้งหมดภายใน Uniswap deployment เดียว: สามขา, ค่าธรรมเนียมพูลสามครั้ง, ไม่มีการประสานงานข้ามสถานที่ วงจร ข้าม DEX (ซื้อบน Uniswap, ขายบน Sushiswap) เพิ่มสถานที่ แต่ยังคงรักษาตัวป้องกันอะตอมมิกไว้เหมือนเดิม วงจรที่ยาวกว่าและแปลกใหม่จะเชื่อมต่อขาเพิ่มขึ้นอีก — แต่ทุกขาที่เพิ่มขึ้นจะคูณปัจจัย อีกตัวเข้าไปในผลคูณ ดังนั้นเงื่อนไขวงจรติดลบที่ปรับค่าธรรมเนียมจะทำลายวงจรยาวอย่างรวดเร็ว นี่คือเหตุผลว่าทำไมผู้ค้นหาจริงจึงจำกัดความยาววงจรไว้ที่สามถึงห้าขาและตัดแต่งอย่างดุเดือด มันคือการค้นหาแบบชั้นที่จำกัดความยาวที่อัลกอริทึม RICH จากบทความ อัลกอริทึมกราฟ ถูกสร้างขึ้นเพื่อรัน
ดังนั้นการตรวจจับจึงไม่ทำให้คุณชนะการซื้อขาย มันเพียงแต่ทำให้คุณมีสิทธิ์แข่งขันเพื่อมัน การทดสอบ log(gross) > 0 บอกคุณว่ามีโอกาส อยู่ — มันไม่ได้บอกอะไรเกี่ยวกับการที่คุณจะเป็นที่อยู่ที่จะจับมันได้ สิ่งนั้นถูกตัดสินในระดับที่ต่ำกว่า, ในลำดับ, และลำดับไม่ใช่สิ่งที่อัลกอริทึมของคุณคำนวณ มันคือสิ่งที่คุณ เสนอราคา สำหรับ ทุกสิ่งที่ยากเกี่ยวกับการเก็งกำไรบนเชนเกิดขึ้นหลังจากที่วงจรถูกค้นพบ

การแบ็ครัน: รูปแบบ MEV ที่ไม่มีอันตราย
วงจรเหล่านี้มาจากไหนตั้งแต่แรก? ส่วนใหญ่มาจากธุรกรรมของผู้อื่น การแลกเปลี่ยนขนาดใหญ่บนพูล Uniswap จะย้ายราคาของพูลนั้นออกจากตลาดที่กว้างขึ้น พูลนั้นตอนนี้มีราคาผิดพลาดเมื่อเทียบกับ Binance, เมื่อเทียบกับ Curve pool, เมื่อเทียบกับ Sushiswap; และการ ปรับให้สอดคล้องกัน คือการเก็งกำไรที่ทำกำไรได้ ผู้ค้นหาที่ทำเช่นนี้จะวางธุรกรรมของตน ทันทีหลังจาก การแลกเปลี่ยนที่สร้างการเบี่ยงเบน นี่คือ การแบ็ครัน และเป็นรูปแบบ MEV บนเชนที่โดดเด่นและไม่มีอันตราย
โปรดจำกลไก constant-product จาก บทความ MEV พูลมีสำรอง กับ และราคาจุด มีคนขายสินทรัพย์ฐานจำนวนมาก เข้าไป; ตามค่าคงที่ พูลจะจ่ายออก
และราคาจุดใหม่จะต่ำลง — ผู้ขายผลักดันมันลง หากราคาตลาดภายนอกยังคงเป็น พูลตอนนี้เสนอราคาต่ำกว่า และการแบ็ครันที่เพิ่มกำไรสูงสุดจะซื้อจากพูลจนกระทั่งราคาขอบเพิ่มขึ้นกลับไปที่ — นั่นคือ จนกว่าสำรองจะตรงตาม อีกครั้ง นักเก็งกำไรจะจับพื้นที่ระหว่างเส้นโค้งการดำเนินการของพูลกับราคาภายนอกที่คงที่ — มูลค่าที่การแลกเปลี่ยนขนาดใหญ่ ทิ้งไว้ โดยการย้ายพูล
ข้อเท็จจริงเชิงโครงสร้างที่สำคัญ — สิ่งที่ทำให้การแบ็ครันอยู่ในด้านที่ไม่มีอันตรายของบัญชี — คือ การแบ็ครันแบบบริสุทธิ์ไม่ทำให้การดำเนินการของเป้าหมายแย่ลง มันทำงานอย่างเคร่งครัด หลังจาก การแลกเปลี่ยนของเหยื่อ เมื่อการแบ็ครันดำเนินการ ราคาของผู้แลกเปลี่ยนได้ถูกล็อคไว้แล้ว; ไม่มีอะไรที่นักแบ็ครันทำสามารถย้อนกลับไปทำให้แย่ลงได้ เปรียบเทียบกับ แซนด์วิช ที่เป็นพิษจาก บทความ MEV ซึ่งมีการแทรก frontrun ก่อน เหยื่ออย่างแม่นยำเพื่อทำให้การเติมของพวกเขาแย่ลง เพื่อให้นักแบ็ครันสามารถเก็บเกี่ยวการเบี่ยงเบนที่ขยายใหญ่ขึ้น กลไกการแบ็ครันแบบเดียวกัน, จริยธรรมที่ตรงกันข้าม: แซนด์วิชสร้างการกำหนดราคาผิดที่ค่าใช้จ่ายของเหยื่อ; การแบ็ครันที่ไม่มีอันตรายเพียงแค่ทำความสะอาดการกำหนดราคาผิดที่เหยื่อจะสร้างขึ้นอยู่ดี นักเก็งกำไรคือกลไกที่ทำให้ราคาทั้งหมดบนเชนติดตามโลกภายนอก — บทบาทเดียวกันที่ทำให้การเก็งกำไรข้ามสถานที่กลายเป็นแรง ทำให้เสถียร ทั่วทั้งการเงิน
นี่คือเหตุผลว่าทำไมสแต็กการป้องกัน MEV สมัยใหม่จึงพยายาม รักษาและกระจาย การแบ็ครันในขณะที่ระงับแซนด์วิช MEV-Share ของ Flashbots และการประมูลกระแสคำสั่งซื้อช่วยให้ผู้ใช้เปิดเผยคำใบ้บางส่วนเกี่ยวกับธุรกรรมของตน เชิญผู้ค้นหาเสนอราคาเพื่อสิทธิ์ในการแบ็ครัน และคืนกำไรส่วนใหญ่ที่เกิดขึ้นให้กับผู้ใช้ที่สร้างโอกาสนั้น การแบ็ครันยังคงเกิดขึ้น — ราคายังคงถูกปรับให้สอดคล้องกัน — แต่คุณค่าจะไหลกลับไปยังธุรกรรมที่สร้างมันขึ้นมา แทนที่จะถูกขโมยโดยใครก็ตามที่เร็วที่สุด
ที่มาของวงจร
เกือบทุกวงจรที่ทำกำไรได้นั้นอยู่ปลายทางของเหตุการณ์อื่นบนเชนที่ย้ายราคา การรู้แหล่งที่มาคือความแตกต่างระหว่างการสำรวจกราฟทั้งหมดแบบสุ่มกับการเฝ้าดูทริกเกอร์เพียงไม่กี่อย่างที่สร้างขอบจริงๆ:
- การแลกเปลี่ยนขนาดใหญ่ แหล่งที่มาตามแบบแผนที่กล่าวถึงข้างต้น: การซื้อขายใดๆ ที่ใหญ่พอที่จะย้ายพูลออกจากตลาดภายนอกจะเปิดการแบ็ครันเพื่อปรับให้สอดคล้องกัน การแลกเปลี่ยนที่ใหญ่ขึ้นและพูลที่บางลง การเก็งกำไรก็จะใหญ่ขึ้น
- การอัปเดตออราเคิล ทุกสถานที่ที่กำหนดราคาจากออราเคิล — ตลาดเงิน, DEX แบบ perp — จะสามารถเก็งกำไรได้ทันทีที่ฟีดเคลื่อนไหว การแบ็ครันการอัปเดตออราเคิลที่ขับเคลื่อนการชำระบัญชี ซึ่งวิเคราะห์ในบทความ การชำระบัญชี คือการเคลื่อนไหวแบบเดียวกันนี้ที่ใช้กับฟีดราคาแทนการแลกเปลี่ยน: การอัปเดตคือปืนสตาร์ท และผู้ค้นหาจะลงจอดทันทีหลังจากนั้น
- สภาพคล่องใหม่หรือที่ถูกลบออก การสร้างหรือการเผา LP ขนาดใหญ่จะเปลี่ยนความลึกของพูลและอาจทำให้พูลมีราคาผิดพลาดชั่วคราว สภาพคล่องแบบ just-in-time (JIT) คือเวอร์ชันที่เป็นปฏิปักษ์ โดยเพิ่มความลึกรอบๆ การแลกเปลี่ยนที่รอดำเนินการเพียงครั้งเดียวและดึงออกทันทีหลังจากนั้น
- เศษการกำหนดเส้นทางข้ามพูล เราเตอร์ที่แยกการแลกเปลี่ยนข้ามพูลไม่ค่อยทิ้งพูลทั้งหมดไว้ในราคาเดียวกันอย่างแม่นยำ และความไม่สมดุลเล็กน้อยที่เหลืออยู่สามารถแบ็ครันได้
ข้อสรุปเชิงปฏิบัติ: บอทเก็งกำไรส่วนใหญ่เป็น ผู้ฟังเหตุการณ์ ไม่ใช่ตัวแก้กราฟ มันเฝ้าดูทริกเกอร์เหล่านี้ คำนวณเฉพาะกราฟย่อยที่แต่ละทริกเกอร์สัมผัส และยิงบันเดิล — ซึ่งเป็นเหตุผลว่าทำไมการออกแบบการอัปเดตส่วนเพิ่มจากบทความ อัลกอริทึมกราฟ จึงมีความสำคัญมากกว่าความเร็วในการค้นหาดิบๆ ทั่วทั้งกราฟ

การประมูลกินส่วนต่าง
ตอนนี้ส่วนที่ไม่สบายใจ คุณพบวงจรแล้ว คนอื่น ๆ ก็เช่นกัน โอกาสนั้นแน่นอน, อะตอมมิก, และปราศจากทุน — ซึ่งหมายความว่า ตัวแปรเดียวที่เหลืออยู่ คือใครจะลงจอดในช่องที่ชนะ และนั่นจะถูกตัดสินโดย การประมูลลำดับความสำคัญ
ตั้งแต่การย้ายไปสู่การแยกโปรโพเซอร์-บิลเดอร์ และ MEV-Boost (ท่อประปาที่อธิบายไว้ใน ห่วงโซ่อุปทาน MEV: PBS และ MEV-Boost ที่กำลังจะมาถึง) ผู้ค้นหาไม่ต้องต่อสู้กับสงครามแก๊สสาธารณะใน mempool อีกต่อไป พวกเขาส่งบันเดิลแบบส่วนตัวไปยังผู้สร้างบล็อก โดยแนบราคาเสนอ — ไม่ว่าจะเป็นค่าธรรมเนียมลำดับความสำคัญสูงหรือการชำระเงินโดยตรงให้กับผู้สร้างบล็อก ผู้สร้างบล็อกจะรวบรวมบล็อกที่มีมูลค่าสูงสุดเท่าที่ทำได้และส่งต่อไปยังโปรโพเซอร์ จากมุมมองของผู้ค้นหา นี่คือ การประมูลแบบซองปิด สำหรับสิทธิ์ในการเป็นที่อยู่ที่จะดำเนินการรางวัลที่ทราบและแน่นอน
จำลองดู ให้กำไรจากการเก็งกำไรขั้นต้นเป็น — เช่น $673 จากวงจรที่ทำงานแล้วข้างต้น — และให้ต้นทุนของผู้ค้นหาแต่ละราย (แก๊ส, ค่าธรรมเนียมสินเชื่อแฟลช) เป็น เพื่อชนะช่อง คุณเสนอราคา แข่งกับผู้ค้นหาคนอื่น ๆ ทุกคนที่คำนวณ เดียวกัน กำไรสุทธิของคุณหากคุณชนะคือ
คุณต้องการ ให้ต่ำที่สุดเท่าที่จะทำได้; คุณยังต้องการชนะด้วย แต่คู่แข่งของคุณเผชิญกับคณิตศาสตร์ที่เหมือนกันกับ ที่เหมือนกัน ในการประมูลแบบซองปิดสำหรับรางวัลที่มีมูลค่าร่วมกันที่ทุกคนสามารถคำนวณได้อย่างแม่นยำ ราคาเสนอจะเพิ่มขึ้นจนกว่าจะครอบคลุมส่วนเกินเกือบทั้งหมด: และผู้ชนะจะเก็บไว้เพียง ซึ่งเป็นส่วนต่างที่บางเฉียบซึ่งพวกเขาเสนอราคาสูงกว่าผู้ที่ตามมา $673 ไม่ได้อยู่กับผู้ที่พบวงจร; เกือบทั้งหมดถูกเสนอราคาตรงไปยังผู้สร้างบล็อก และท้ายที่สุด โปรโพเซอร์ที่ขายลำดับ นี่ไม่ใช่ความล้มเหลวของตลาด นี่คือสิ่งที่ ควรจะทำ ในการประมูลแข่งขัน
การย้อนกลับไม่ใช่เรื่องฟรี — เศรษฐศาสตร์อัตราความล้มเหลว
มีต้นทุนที่สองที่โมเดลที่ไม่ได้พิจารณาจะมองข้ามไป และมันคือสิ่งที่แยกผู้ดำเนินการจริงๆ เมื่อคุณ แพ้ การประมูล บันเดิลของคุณก็แค่ไม่ลงจอด — คุณไม่ต้องจ่ายอะไรเลย ซึ่งเป็นประเด็นทั้งหมดของการส่งบันเดิลเหนือสงครามแก๊สสาธารณะแบบเก่า แต่เมื่อคุณชนะการประมูลด้วยบันเดิลที่การจำลองล้าสมัย — สำรองเคลื่อนไหวระหว่างการอ่านของคุณและการรวม — ตัวป้องกัน require(end >= start + minProfit) ของคุณจะทำงานและธุรกรรมจะย้อนกลับบนเชน และ คุณต้องจ่ายค่าแก๊สสำหรับการย้อนกลับ อะตอมมิกปกป้องเงินต้นของคุณ ไม่ใช่แก๊สของคุณ
ดังนั้น มูลค่าคาดหวังที่แท้จริงของผู้ค้นหาต่อโอกาสคือ
โดยที่ คือแก๊สที่เผาไหม้ในบันเดิลที่ลงจอดแต่ย้อนกลับ การผลักดันราคาเสนอ ของคุณให้สูงขึ้นจะชนะช่องมากขึ้น แต่ก็ชนะช่องที่ ล้าสมัย มากขึ้นเช่นกัน ทำให้เทอมการย้อนกลับสูงขึ้น ผู้ดำเนินการที่อยู่รอดไม่ใช่ผู้ที่พบวงจรมากขึ้น — ทุกคนพบวงจรเดียวกัน — แต่คือผู้ที่มี ต่ำกว่า (เส้นทางการดำเนินการที่ถูกกว่าและแคบกว่า), ความน่าจะเป็นในการย้อนกลับต่ำกว่า (การจำลองที่สดใหม่กว่า, การคาดการณ์การรวมที่ดีกว่า), และวินัยในการ ไม่ เสนอราคาในโอกาสชายขอบที่ต้นทุนการย้อนกลับที่คาดหวังจะกลืนกินส่วนเกินที่บางเฉียบ ขอบ, ถ้ามี, อาศัยต้นทุนอันดับสองเหล่านี้ทั้งหมด
รูปร่างเชิงประจักษ์ตรงกับโมเดล เมื่อบอทหลายตัวจำลองโอกาสบนเชนเดียวกันให้ได้ตัวเลขกำไรเท่ากัน บันเดิลที่ชนะมักจะส่งกำไรขั้นต้นส่วนใหญ่ไปยังผู้สร้างบล็อกและผู้ตรวจสอบ — การรั่วไหล 90% ขึ้นไปเช่นเดียวกับที่เราวัดได้สำหรับ การชำระบัญชี ด้วยเหตุผลเดียวกัน: ข้อมูลที่สมบูรณ์แบบเกี่ยวกับรางวัลร่วมและการประมูลแบบซองปิดเท่ากับส่วนต่างที่ถูกแข่งขันจนถึงต้นทุนของผู้แพ้ที่ชายขอบ ขอบของผู้ค้นหาไม่ใช่ขนาดของ ซึ่งทุกคนเห็น มันคือข้อได้เปรียบส่วนตัวใดๆ ใน (การดำเนินการที่ถูกกว่า, การกำหนดเส้นทางที่ดีกว่า, อัตราความล้มเหลวต่ำกว่า) หรือในการ มองเห็น ก่อนที่ฝูงชนจะเห็น
ซึ่งบอกคุณได้อย่างแม่นยำว่ากำไรยังคงอยู่ได้ที่ไหน:
- เชนหางยาวและตลาดผู้สร้างที่ยังไม่สมบูรณ์ บนเชนที่มีผู้ค้นหาที่ซับซ้อนน้อยรายดำเนินการและตลาดประมูลผู้สร้างที่บางหรือไม่มีอยู่จริง ราคาเสนอ ยังคงต่ำเพราะไม่มีใครเสนอราคาสูงขึ้น วงจรเดียวกันที่ให้ผลตอบแทน บน Ethereum mainnet สามารถให้ผลตอบแทนส่วนใหญ่ของ บน L2 ที่เงียบสงบหรือ alt-L1 ขอบคือการแข่งขัน ไม่ใช่ความฉลาด
- พูลที่มีการแข่งขันต่ำและสินทรัพย์แปลกใหม่ โอกาสที่ทางออกที่ทำกำไรได้ต้องกินสภาพคล่อง DEX ที่บางและขึ้นอยู่กับเส้นทางนั้นจำลองได้ยาก ผู้ค้นหาที่จำลองการเดินทางไปกลับเต็มรูปแบบ — รวมถึงการคลาดเคลื่อนในการออกบนโทเค็นที่ไม่มีสภาพคล่อง — จะจับวงจรที่บอททั่วไปมองข้ามหรือกำหนดราคาผิดจนเกิดการย้อนกลับ ที่นี่ขอบคือคุณภาพการดำเนินการที่แท้จริง ไม่ใช่ความล่าช้า
- การเก็งกำไร CEX-DEX หมวดหมู่ที่ใหญ่ที่สุด — และเป็นหมวดหมู่ที่ละเมิดอะตอมมิก มันมีส่วนของตัวเอง ถัดไป
บทสรุปที่ซื่อสัตย์ของเกมอะตอมมิกบนเชน: มันเป็นวิธีที่ยอดเยี่ยมในการเรียนรู้ภายในของ EVM, ท่อประปาของผู้สร้าง, และทฤษฎีการประมูลด้วยวิธีที่ยาก มันเป็นวิธีที่โหดร้ายในการหาเลี้ยงชีพ เพราะสิ่งที่คุณกำลังขาย — ความสามารถในการค้นหาและดำเนินการวงจรที่แน่นอน — คือสิ่งเดียวกับที่คู่แข่งของคุณกำลังขาย และการประมูลจะกำหนดราคาไว้ที่ต้นทุน

การเก็งกำไร CEX-DEX: หมวดหมู่ที่ใหญ่ที่สุด และมันไม่ใช่อะตอมมิก
แหล่งที่มาที่ใหญ่ที่สุดของมูลค่าที่สามารถสกัดได้บนเชนไม่ใช่แค่วงจรอะตอมมิกที่เรียบร้อย มันคือ การเก็งกำไร CEX-DEX: ราคาของสินทรัพย์ในการแลกเปลี่ยนแบบรวมศูนย์แตกต่างจากราคาบน DEX และผู้ค้นหาจะซื้อขายทั้งสองด้านเพื่อปิดช่องว่าง การศึกษาการเก็งกำไรที่ไม่ใช่อะตอมมิก — โดยตรงที่สุดคือ Heimbach, Pahari และ Schertenleib's Non-Atomic Arbitrage in Decentralized Finance (2024) — ระบุว่ามีมูลค่าที่สกัดได้จากการเก็งกำไรข้ามการแลกเปลี่ยนหลายร้อยล้านดอลลาร์ในช่วงเวลาหลายปี ซึ่งเกินกว่าหมวดหมู่อะตอมมิกบนเชนล้วนๆ หากคุณต้องการเข้าใจว่าเงินใน MEV อยู่ที่ไหนจริงๆ นี่แหละคือที่นั่น
และมันละเมิดคุณสมบัติที่ทำให้ทุกอย่างข้างต้นปลอดภัย ขาหนึ่งของการซื้อขายอยู่ที่การแลกเปลี่ยนแบบรวมศูนย์; อีกขาหนึ่งอยู่ที่บนเชน ขาบนเชนเป็นอะตอมมิก — มันจะลงจอดในบล็อกหรือย้อนกลับ — แต่ขา CEX เป็นคำสั่งแยกต่างหากบนเครื่องมือจับคู่แยกต่างหาก ซึ่งจะตัดสินใจตามกำหนดเวลาของตัวเอง ทั้งสองขาไม่สามารถห่อหุ้มไว้ใน revert เดียวกันได้ ไม่มี require(end >= start) ที่ครอบคลุมทั้งสองสถานที่ ผู้ค้นหาแบ็ครันการแลกเปลี่ยนบน Uniswap เพื่อซื้อ WETH ราคาถูกบนเชน และ แยกต่างหาก ขาย WETH บน Binance เพื่อรับส่วนต่าง — และระหว่างเหตุการณ์ทั้งสองนี้ ราคาอาจเคลื่อนไหว การเก็งกำไร CEX-DEX แบกรับความเสี่ยงสินค้าคงคลังที่การเก็งกำไรอะตอมมิกขจัดออกไป
ความเสี่ยงนั้นเปลี่ยนรูปร่างทั้งหมดของธุรกิจ:
- คุณต้องจัดวางสินค้าคงคลังล่วงหน้าในทั้งสองสถานที่ คุณไม่สามารถใช้สินเชื่อแฟลชสำหรับขา CEX ได้ หากต้องการขาย WETH บน Binance ทันทีที่การซื้อบนเชนของคุณได้รับการยืนยัน คุณต้อง ถือ WETH บน Binance อยู่แล้ว (และสกุลเงินอ้างอิงบนเชน และในทางกลับกันสำหรับทิศทางอื่น) ทุน ซึ่งสินเชื่อแฟลชได้ขับไล่ออกจาก การเก็งกำไรอะตอมมิก กลับมาเป็นข้อกำหนดที่เข้มงวด — สินค้าคงคลังที่วางอยู่บนการแลกเปลี่ยนหลายแห่ง, เปิดเผย
- คุณต้องป้องกันขาที่เปิดอยู่ ระหว่างการเติมบนเชนและการเติม CEX คุณจะถือครองสินทรัพย์ตามทิศทาง ผู้ดำเนินการ CEX-DEX ที่จริงจังดำเนินการสิ่งนี้เป็นบัญชีที่จัดการเดลต้าอย่างต่อเนื่อง: พวกเขาป้องกันการเปิดเผยในสัญญาซื้อขายล่วงหน้าแบบถาวร, ถือว่าต้นทุนการป้องกันของเฮดจ์นั้นเป็นต้นทุนในการดำเนินธุรกิจ, และจัดการส่วนต่างระหว่างสปอตกับเพิร์พ นี่ไม่ใช่ปัญหาใหม่ — มันคือเครื่องจักรเดียวกับ การเก็งกำไรอัตราการให้กู้ยืมข้ามการแลกเปลี่ยน ซึ่งเกมทั้งหมดคือการถือครองขาที่หักล้างกันข้ามสถานที่และจัดหาเงินทุนสำหรับการป้องกันผ่านการให้กู้ยืม การเก็งกำไร CEX-DEX คือวินัยนั้นโดยมีขาหนึ่งตรึงอยู่กับบล็อก
- ขอบเป็นส่วนตัวด้านข้อมูลและโครงสร้าง เนื่องจากราคา CEX นำหน้าราคา DEX (สมุดคำสั่งซื้อแบบรวมศูนย์อัปเดตอย่างต่อเนื่อง; ราคา AMM จะเคลื่อนไหวก็ต่อเมื่อมีคนซื้อขาย) ผู้ค้นหาที่อ่านสมุดคำสั่งซื้อ CEX จะทราบว่าทิศทางของการแบ็ครันครั้งต่อไปควรจะเป็นอย่างไร ก่อน ที่ราคาบนเชนจะตามทัน และมากขึ้นเรื่อยๆ ผู้สร้างบล็อกเองก็รวมกระแสนี้ไว้: ผู้สร้างบล็อกที่ดำเนินการเดสก์ CEX-DEX ด้วยตนเองสามารถจัดลำดับบล็อกรอบๆ การซื้อขายของตนเองได้ สิ่งนี้ทำให้เส้นแบ่งระหว่างผู้ค้นหาและผู้สร้างบล็อกพร่ามัว และเป็นหนึ่งในแรงที่รวมศูนย์ใน ห่วงโซ่อุปทาน MEV — หน่วยงานที่เห็นกระแสคำสั่งซื้อมากที่สุดและควบคุมการสั่งซื้อมากที่สุดก็สามารถจับการเก็งกำไรที่ไม่ใช่อะตอมมิกได้มากที่สุด
ดังนั้นการแลกเปลี่ยนจึงกลับด้านจากกรณีอะตอมมิกอย่างสิ้นเชิง การเก็งกำไรอะตอมมิกนั้น ปลอดภัย (ย้อนกลับเมื่อขาดทุน, ไม่มีสินค้าคงคลัง, ไม่มีทุน) แต่ มีการแข่งขันอย่างเข้มงวด (รางวัลที่แน่นอน, การประมูลกินส่วนต่าง) การเก็งกำไร CEX-DEX นั้น อันตราย (ความเสี่ยงสินค้าคงคลังจริง, ทุนจริง, การป้องกันเพื่อจัดหาเงินทุนและจัดการ) แต่ ใหญ่กว่ามากและมีการแข่งขันน้อยกว่าอย่างสมบูรณ์ เนื่องจากอันตรายและข้อกำหนดด้านทุนทำให้บอทที่สามารถดำเนินการวงจรที่ปราศจากความเสี่ยงได้เท่านั้น ผลตอบแทนเพิ่มเติมคือค่าตอบแทนสำหรับความเสี่ยงเพิ่มเติม — ซึ่งเป็นข้อเท็จจริงที่ธรรมดาที่สุดในการเงิน ซึ่งในที่สุดก็กลับมามีผลอีกครั้งบนเชนที่ใช้เวลาทั้งส่วนในการแสร้งทำเป็นว่ามีเงินที่ปราศจากความเสี่ยงอยู่บนโต๊ะ
สิ่งที่ควรนำกลับไป
สรุปข้อโต้แย้งให้เป็นประเด็นสำคัญ:
- อะตอมมิกคือโมเดลความปลอดภัยทั้งหมด การเก็งกำไรหลายขั้นตอนคือธุรกรรมเดียวที่มีตัวป้องกัน
require(end >= start + minProfit); อะไรก็ตามที่ทำให้มันไม่ทำกำไรจะย้อนกลับ ดังนั้นนักเก็งกำไรจึงไม่เคยถือครองความเสี่ยงสินค้าคงคลังในช่วงกลางวงจร และไม่เคยขายขาสุดท้ายขาดทุน - สินเชื่อแฟลชแยกกำไรออกจากทุน ยืม, เก็งกำไร, และชำระคืนภายในธุรกรรมอะตอมมิกเดียว; ผู้ให้กู้ได้รับการคุ้มครองโดยการย้อนกลับเดียวกันกับคุณ ผู้ชนะไม่ใช่ผู้ค้นหาที่มีทุนมากที่สุด — ทุนไม่ใช่คูเมือง
- การตรวจจับเป็นครึ่งหนึ่งที่ง่ายและกลายเป็นสินค้าโภคภัณฑ์ การค้นหาวงจรติดลบของ อัลกอริทึมกราฟสำหรับการเก็งกำไร นั้นแน่นอนและเหมือนกันสำหรับทุกคน; การค้นหาวงจรเพียงแต่ทำให้คุณมีสิทธิ์แข่งขันเพื่อมัน
- การแบ็ครันคือรูปแบบที่ไม่มีอันตรายและโดดเด่น การลงจอดทันทีหลังจากสวอปขนาดใหญ่หรือการอัปเดตออราเคิลจะปรับพูลที่กำหนดราคาผิดให้สอดคล้องกันโดยไม่ทำให้การเติมของใครแย่ลง — ตรงกันข้ามกับแซนด์วิชที่เป็นพิษ และสิ่งที่ MEV-Share พยายามกระจายแทนที่จะระงับ
- การประมูลกินส่วนต่างเกือบทั้งหมด ในการประมูลผู้สร้างบล็อกแบบซองปิดสำหรับรางวัลร่วมที่คำนวณได้ ราคาเสนอจะเข้าใกล้ และ 90% ขึ้นไปจะรั่วไหลไปยังผู้สร้างบล็อกและโปรโพเซอร์ กำไรจะอยู่รอดได้เฉพาะในกรณีที่มีการแข่งขันบางเบา: เชนหางยาว, พูลที่ไม่มีสภาพคล่อง, และทางออกที่จำลองได้ยากกว่า
- CEX-DEX เป็นหมวดหมู่ที่ใหญ่ที่สุดและมันไม่ใช่อะตอมมิก ขาหนึ่งบน CEX หมายถึงความเสี่ยงสินค้าคงคลังจริง, ทุนจริง, และการป้องกันเพื่อจัดหาเงินทุน — คู่มือการให้กู้ยืมข้ามการแลกเปลี่ยน ที่นำมาใช้โดยมีขาหนึ่งตรึงอยู่กับบล็อก, และหนึ่งในแรงที่ดึง ห่วงโซ่อุปทาน MEV ไปสู่ผู้สร้างบล็อกที่เห็นกระแสมากที่สุด
การเก็งกำไรบนเชนดูเหมือนจากภายนอกเหมือนปริศนาเกี่ยวกับการค้นหาวงจรที่ซ่อนอยู่ จากภายในมันคือการประมูล — และปริศนาถูกแก้ไขสำหรับทุกคนในทันที การรู้ว่าวงจรอยู่ที่ไหนไม่เคยเป็นขอบ การชนะช่อง, หรือการซื้อขายในที่ที่ไม่มีใครเสนอราคา, เป็นเสมอมา
เอกสารอ้างอิง
- Daian, Goldfeder, Kell, Li, Zhao, Bentov, Breidenbach, Juels (2019), Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges. arXiv:1904.05234.
- Heimbach, Pahari, Schertenleib (2024), Non-Atomic Arbitrage in Decentralized Finance. arXiv:2401.01622 (IEEE S&P 2024).
- Robinson & Konstantopoulos (2020), Ethereum is a Dark Forest.
- เอกสารประกอบ Aave v3 flash loans และ Balancer / Uniswap v3 flash-swap (ตารางค่าธรรมเนียม)
- เอกสารประกอบ Flashbots: MEV-Boost, MEV-Share, การประมูลกระแสคำสั่งซื้อ (docs.flashbots.net).
ผู้เขียน
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.