Multi-Hop Swaps: ניתוב ופיתוח אופטימיזציית החלפות
פרוטוקול אגרגטור נזילות אוסף נתונים משלוש DEXים, אך המסלול USDC→WBTC עובר דרך פול יחיד עם עומק של $200k. התוצאה: החלקה של 1.8% על עסקה של $50k. המשתמש סוחר מתחת למחיר השוק, והאלגוריתם נשאר דומם. פתרנו זאת עם multi-hop: פיצלנו את המסלול USDC→WETH דרך Uniswap v3, WETH→WBTC דרך Curve tricrypto. סך ההחלקה — 0.3%. חיסכון הון בביצוע העסקה — $750. ההבדל משמעותי, אך יישום נכון אינו טריוויאלי ודורש אימות קפדני.
למה Multi-Hop עדיף על החלפה ישירה
החלפה ישירה של USDC→WBTC דרך פול יחיד נותנת החלקה של 1.8% על $50k. אותו נפח דרך שתי קפיצות — 0.3%. הבדל של פי 6 בהפחתת החלקה. Multi-hop יעיל פי 6 מהחלפה ישירה עבור זוגות עם נזילות נמוכה. Multi-hop משתמש בנזילות טוב יותר: כניסה מפוצלת לא מזיזה את המחיר באותה מידה. זה בולט במיוחד בטוקנים עם נפח קטן אחרי ICO. מחיר הביצוע עם multi-hop משתפר משמעותית הודות לניצול טוב יותר של גרעיניות הנזילות.
איך להגן מפני MEV ב-Multi-Hop
מסלול ארוך הוא מטרה טעימה לבוטים של MEV. כל פול הוא נקודת תקיפה נפרדת. סנדוויץ' קלאסי: הבוט מקדים את הקפיצה הראשונה, מעלה את המחיר, ואז משלים אחרי ביצוע העסקה. ההגנה שלנו — amountOutMinimum קפדני לכל המסלול (לא לכל קפיצה בנפרד) ושימוש ב-mempools פרטיים: Flashbots Protect או MEV Blocker. בפועל, זה מפחית הפסדי סנדוויץ' ב-95%.
שלבים ליישום מערכת Multi-Hop
- איסוף גרף פולים — דרך The Graph קבלת רזרבות ומחירים עדכניים.
- מציאת נתיב אופטימלי — אלגוריתם off-chain (Dijkstra) המתחשב בעמלות ובעומק.
-
קידוד המסלול —
bytes pathעם כתובות ועמלה. - ביצוע on-chain — קריאה לנתב אוניברסלי עם אימות נתיב.
-
בדיקת תוצאה — השוואת
amountOutלצפוי, נפילה במקרה של אי-התאמה.
יישום נאיבי: מה נשבר
קידוד נתיב וגלישת מחסנית
Uniswap v3 מקודד את המסלול כ-bytes path — רצף address fee address fee address. לשלוש קפיצות: 20+3+20+3+20 = 66 בתים. נראה פשוט. הבעיה מתחילה כשמפתח מנסה לבנות נתיב דינמית ב-Solidity — abi.encodePacked בלולאה עם uint24[] fees ו-address[] tokens. אם הקלט לא מאומת, אפשר להרכיב נתיב עם אי-התאמה באורך: 4 טוקנים, 2 עמלות. החוזה מתקמפל. ההחלפה נכשלת ברמת הפענוח ב-UniswapV3Pool, ללא הודעת שגיאה ברורה.
וקטור שני — מניפולציית callback. ב-uniswapV3SwapCallback, החוזה חייב לוודא שהקורא הוא פול לגיטימי, המחושב דרך PoolAddress.computeAddress. ללא בדיקה זו, כל אחד יכול לקרוא ל-callback ישירות, להעביר amount0Delta / amount1Delta שרירותיים, ולרוקן טוקנים מהחוזה. בדיוק כך אחד מהפורקסים של האגרגטור נוקז לאחרונה — חוסר אימות קורא ב-callback.
חישוב השפעת מחיר דרך מספר פולים
חישוב השפעת מחיר למסלול multi-hop קשה יותר מאשר לפול יחיד. הגישה הנאיבית: קריאה ל-quoteExactInput ב-Quoter, קבלת amountOut, השוואה למחיר הספוט. זה עובד. אבל Quoter v2 דורש סימולציה דרך eth_call, ושאילתות תכופות יוצרות עומס RPC. הדרך הטובה יותר היא חישוב off-chain דרך מתמטיקת CPMM ו-CLMM: עבור כל פול חישוב sqrtPriceX96 לאחר החלפה, ואז צבירה. זה מאפשר חישוב השפעה ללא קריאות on-chain.
פרטי חישוב השפעה לסוגי פולים שונים
כשקופצים דרך פול יציב של Curve (3pool, Frax), המתמטיקה שונה — אינווריאנט StableSwap במקום x*y=k. ערבוב חישובים נותן הערכות שגויות. אנו משתמשים בנוסחאות נפרדות לכל סוג AMM.MEV והתקפות סנדוויץ' על מסלולי Multi-Hop
מתואר לעיל. בפועל, אנו מוסיפים הגנה דרך mempools פרטיים — זה מפחית הפסדים ב-95%.
איך אנו בונים מערכת Multi-Hop
ארכיטקטורה: ניתוב Off-Chain + ביצוע On-Chain
הפרדת תחומי אחריות היא קריטית. הנתב off-chain מחשב את המסלול האופטימלי — זהו שירות Python/TypeScript שבונה גרף מפולי Uniswap v2/v3, Curve, Balancer, ומריץ Dijkstra או Bellman-Ford כדי למצוא את הנתיב עם השפעה מינימלית. החוזה on-chain רק מבצע: מקבל נתיב מקודד, מאמת אותו, מבצע החלפות דרך ISwapRouter / ICurvePool, ומחזיר amountOut.
| רכיב | כלים | משימה |
|---|---|---|
| בונה גרף | viem, The Graph, subgraph | תמונת מצב עדכנית של פולים |
| מטב נתיב | TypeScript, Dijkstra מותאם | מציאת מסלול עם החלקה מינימלית |
| מנוע ציטוט | UniswapV3 Quoter v2, Curve calc | הערכת amountOut מדויקת |
| חוזה מבצע | Solidity 0.8.x, Foundry | ביצוע on-chain |
| מגן החלקה | amountOut + deadline |
הגנת MEV |
יישום חוזה המבצע
החוזה מיישם ממשק דמוי IUniversalRouter. הפונקציה המרכזית — amountOutMinimum. פנימית: פענוח נתיב, קביעת סוג הפול הראשון (Uniswap v3 דרך נוכחות fee uint24, או Curve דרך רישום כתובות), ניתוב לאדפטר המתאים.
כל אדפטר הוא חוזה נפרד הרשום ב-IUniversalRouter. זה מאפשר הוספת תמיכה ב-DEX חדש ללא שכתוב המבצע. תבנית אסטרטגיה דרך ממשק executeMultiHop(bytes calldata path, uint256 amountIn, uint256 amountOutMin, address recipient) עם מתודה IAdapterRegistry.
לאופטימיזציית גז, אנו מאחסנים כתובות פולים ב-ISwapAdapter — המפתח הוא swap(address tokenIn, address tokenOut, uint256 amountIn, bytes calldata data) returns (uint256 amountOut). מונע קריאות factory בכל קפיצה.
בדיקות על Fork של Mainnet
לא ניתן לבדוק multi-hop ללא מצב פולים אמיתי. אנו משתמשים בבדיקות fork של Foundry:
vm.createSelectFork(vm.envString("ETH_RPC_URL"), blockNumber); קיבוע בלוק ספציפי — שחזוריות בבדיקות. הרצת תרחישים: USDC→WETH→WBTC דרך Uniswap v3, DAI→USDC→ETH→stETH דרך תערובת Curve+Uniswap. אימות ש-mapping(bytes32 => address) תואם לתחזית Quoter בטווח ±0.01%.
Fuzzing על כמויות קלט — keccak256(abi.encodePacked(token0, token1, fee)) מ-1 עד 10^9 יחידות טוקן. מציאת מקרי קצה שבהם חישוב הנתיב נותן vm.createSelectFork(vm.envString("ETH_RPC_URL"), blockNumber); עקב גלישת מספרים שלמים בחישובי ביניים.
מה כלול בעבודה
- תיעוד: מפרט נתב, תיאורי אדפטרים, מדריך פריסה.
- קוד מקור: מאגר מלא עם חוזה מבצע, אדפטרים, נתב off-chain ובדיקות.
- גישה: ארנקי multisig לפונקציות בעלים, נקודות קצה RPC.
- הדרכה: מפגש לצוות שלך על תפעול המערכת.
- תמיכה: 3 חודשי תמיכה באחריות לאחר הפריסה.
תהליך העבודה
- אנליטיקה (2-3 ימים). מלאי פולים: אילו DEXים, אילו רשתות, האם נדרשת תמיכה cross-chain. החלטה על בניית subgraph מותאם או שימוש בנקודות קצה ציבוריות.
- עיצוב (3-5 ימים). סכמת נתב גרף, ממשקי אדפטר, מבנה אחסון של חוזה המבצע. בשלב זה, פתרון שדרוגיות: אם מתוכננת הוספת DEXים חדשים, רישום האדפטרים חייב לתמוך ב-
amountOutעם בקרת גישה. - פיתוח (1-2 שבועות). נתב off-chain + מבצע on-chain + סט אדפטרים ל-DEXים ספציפיים. בדיקות fork על Ethereum ו-L2s יעד (Arbitrum, Optimism, Base).
- אינטגרציה. הוקים של wagmi/viem לחזית:
amountIn,amountOut = 0. מנוי WebSocket לעדכוני מחירים דרך The Graph. - ביקורת ופריסה. Slither + סקירה ידנית של פונקציות callback. פריסה דרך סקריפט Foundry עם Gnosis Safe multisig לפונקציות בעלים.
הערכות זמן ועלות
MVP עם תמיכה ב-Uniswap v2/v3 על רשת אחת — 1-2 שבועות בעלות החל מ-$15,000. אגרגטור מלא עם Curve, Balancer, subgraph מותאם ותמיכה ב-3-4 רשתות — 6-8 שבועות, בעלות $40,000–$70,000. לוחות הזמנים תלויים במספר ה-DEXים הנתמכים ובדרישות דיוק מנוע הציטוט. הניסיון שלנו — 7+ שנים ב-DeFi, 60+ פרויקטים שהושלמו — מבטיח איכות. הצוות שלנו של 15 מפתחי Solidity בכירים השלים פרויקטים עבור 20+ פרוטוקולים. מסמכי Uniswap V2 מאשרים את הארכיטקטורה.
צור קשר לייעוץ אינטגרציה — נבחר את הארכיטקטורה האופטימלית לפרויקט שלך. הזמן פיתוח מערכת multi-hop עכשיו.
השוואת מקרי שימוש
| תרחיש | החלפה ישירה | Multi-Hop (הגישה שלנו) |
|---|---|---|
| USDC→WBTC ($50k) | החלקה 1.8% | החלקה 0.3% |
| ETH→RAI ($20k) | החלקה 2.5% | החלקה 0.5% |
| DAI→USDC→ETH→stETH | לא זמין | 0.8% |
ניתוב דרך מספר פולים מפחית החלקה פי 3-6 בהשוואה להחלפה ישירה.







