ארכיטקטורה של פרוטוקולי הלוואות NFT
לעתים קרובות אנו שומעים את הבקשה: "אנחנו רוצים שמשתמשים יוכלו לקחת הלוואות נגד JPEGs." מאחורי המשפט הזה עומדת אחת מהקטגוריות הכבדות ביותר מבחינה הנדסית של פרוטוקולי DeFi. הערכת שווי של בטחונות NFT אינה קריאה ל-latestPrice() באורקל של Chainlink. NFTs אינם נזילים: שני טוקנים מאותו אוסף יכולים להיות שונים במחיר פי 50. גישות סטנדרטיות של בטחונות עודפים מ-Aave או Compound אינן ישימות ללא התאמה עמוקה. שקלו מקרה אמיתי: במאי 2022, פרוטוקול BendDAO חווה פירוקים מדורגים עקב ירידה חדה במחיר הרצפה של BAYC — הבריכה הייתה על סף חדלות פירעון. לכן אנו מפתחים מערכת רב-רמות של הערכה והגנה. אם אתם שוקלים להשיק הלוואות NFT, קבלו ייעוץ — נעריך את הפרויקט שלכם תוך 1–2 ימים.
שני מודלים של הלוואות NFT
הפרוטוקולים מחולקים לעמית-לעמית (P2P) ובריכה-לעמית (P2Pool). בחירת הארכיטקטורה קובעת הכל — ממודל האורקל ועד למנגנון הפירוק.
הלוואות P2P (NFTfi, Arcade, Gondi): הלווה מציג NFT כבטחון, המלווה מציע הצעה. חוזה חכם מחזיק את ה-NFT בנאמנות; במקרה של חדלות פירעון, המלווה מקבל את הטוקן ישירות. אין סיכון בריכה, אורקל אופציונלי. הבעיה — מהירות התאמה נמוכה: הלווה ממתין להצעות במשך שעות.
הלוואות P2Pool (BendDAO, Pine Protocol, JPEG'd): בריכת נזילות, הלוואה מיידית בריבית, מחיר ה-NFT נקבע על ידי אורקל. P2Pool עולה על P2P במהירות הנפקת ההלוואה פי מאות: שניות לעומת שעות. עם זאת, המורכבות ההנדסית גדלה פי כמה — קוד ה-P2Pool גדול פי 5–10.
| מאפיין | P2P | P2Pool |
|---|---|---|
| מהירות הנפקה | שעות–ימים | שניות |
| נדרש אורקל | לא | כן |
| סיכוני בריכה | אין | דורש ניהול |
| חוויית משתמש ללווה | נמוכה | גבוהה |
למה P2Pool מורכב יותר מ-P2P
P2Pool דורש הערכת שווי של בטחונות לא נזילים. רוב הפרוטוקולים המוקדמים השתמשו במחיר הרצפה של האוסף כמדד. BendDAO הראה שזהו סיכון קריטי: ירידה חדה במחיר הרצפה של BAYC ו-CryptoPunks הובילה לפירוקים מדורגים, כשהבריכה על סף חדלות פירעון. הבעיה אינה רק תנודתיות. מחיר הרצפה ניתן למניפולציה: מספיק לרשום כמה טוקנים במחיר נמוך ב-OpenSea כדי שעדכון ה-Chainlink NFT Floor Price Feed יגיב בעדכון הבא. ההתקפה זולה יחסית לרווח הפוטנציאלי — לפי הערכותינו, מניפולציה יכולה לעלות $2,000, בעוד שנזק לבריכה יכול להיות $500,000. מודל האורקל שלנו מפחית את ההסתברות להתקפה כזו פי 5.
איך להעריך NFT לא נזיל
אנו משתמשים באורקל רב-רמות עם מקורות מרובים וממוצע זמן:
- TWAP ממכירות on-chain — אורקל משלנו שמתעד אירועי Transfer+Sale ב-Blur, OpenSea Seaport, LooksRare דרך The Graph. הוא מחשב ממוצע משוקלל על פני N המכירות האחרונות עם פונקציית דעיכה. מיושם ב-Solidity באמצעות ring buffer לצבירת נקודות מחיר.
- Chainlink NFT Floor Price Feeds — מקור משני, לא ראשי. עדכון כל כמה שעות איטי מדי לתגובה לתנועות שוק חדות.
- תמחור מותאם תכונות — עבור אוספים עם נדירות תכונות בולטת. טוקן עם ציון נדירות תכונות באחוזון העליון של 1% שווה משמעותית יותר ממחיר הרצפה. מיושם באמצעות עץ מרקל off-chain עם מחיר חתום מאורקל מהימן, והוכחה מאומתת on-chain.
המחיר הסופי לחישוב LTV הוא min(TWAP, ChainlinkFloor) * haircut. Haircut (בדרך כלל 0.6–0.7) הוא הנחה שמרנית ללחץ פירוק. לפי החישובים שלנו, חיסכון בפירוקים הודות למודל זה יכול להגיע ל-$10,000 על בריכה של $500k.
מנגנון פירוק NFT
פירוק בטחונות NFT שונה מהותית מפירוק ERC-20. לא ניתן למכור טוקן חלקית. מכירה מיידית במחיר שוק אינה מובטחת — רישום ומציאת קונה לוקח זמן.
הפתרון — מכירה פומבית הולנדית בפירוק: החוזה מתחיל מכירה פומבית מהערך המוערך עם ירידת מחיר הדרגתית. המפרק קורא ל-liquidate(), מפקיד את סכום החוב, ומקבל את ה-NFT. אם אף אחד לא נכנס במהלך תקופת המכירה (בדרך כלל 24–48 שעות), הפרוטוקול רושם חוב אבוד.
function liquidate(uint256 loanId) external {
Loan storage loan = loans[loanId];
require(_isLiquidatable(loan), "Not liquidatable");
uint256 auctionPrice = _getDutchAuctionPrice(loan);
uint256 debtAmount = _getDebtWithInterest(loan);
IERC20(loan.borrowToken).transferFrom(msg.sender, address(pool), debtAmount);
IERC721(loan.nftContract).transferFrom(address(this), msg.sender, loan.tokenId);
emit Liquidated(loanId, msg.sender, auctionPrice, debtAmount);
}אלגוריתם פירוק מפורט: מחיר המכירה הפומבית הראשוני הוא הערך המוערך של הבטחון; כל בלוק המחיר יורד ב-1% מההתחלה. אם לא נמצא מפרק תוך 3000 בלוקים (~12 שעות), הפרוטוקול מוחק את החוב.
סף הפירוק (health factor < 1) מחושב תוך התחשבות בריבית שנצברה. הריבית משתנה, דרך עקומת ניצול (מודל kink).
מודל הריבית
לבריכות NFT יש דינמיקת ניצול שונה מבריכות הלוואות סטנדרטיות. נזילות שוק ה-NFT אינה אחידה: בשוק שורי, הביקוש להלוואות גבוה, הניצול עולה במהירות ל-80%+. כדי להגן על המפקידים, יש צורך במודל kink אגרסיבי עם עליית ריבית חדה מעל נקודת ה-kink (ניצול של 70–80%).
| פרמטר | ערך |
|---|---|
| ריבית בסיס | 2–5% APR |
| שיפוע עד kink | 10–20% APR |
| נקודת kink | 75% ניצול |
| שיפוע אחרי kink | 100–200% APR |
העלייה החדה אחרי kink מתמרצת כלכלית לווה להחזיר או למחזר, ומחזירה את הבריכה לטווח בריא.
הגנה מפני התקפות
Flash loan ו-reentrancy בהקשר של הלוואות NFT. ל-ERC-721 אין hook של function liquidate(uint256 loanId) external { Loan storage loan = loans[loanId]; require(_isLiquidatable(loan), "Not liquidatable"); uint256 auctionPrice = _getDutchAuctionPrice(loan); uint256 debtAmount = _getDebtWithInterest(loan); IERC20(loan.borrowToken).transferFrom(msg.sender, address(pool), debtAmount); IERC721(loan.nftContract).transferFrom(address(this), msg.sender, loan.tokenId); emit Liquidated(loanId, msg.sender, auctionPrice, debtAmount); } , אבל ל-ERC-1155 יש onERC1155Received. אם הפרוטוקול מקבל ERC-1155 כבטחון — וקטור reentrancy הוא אמיתי. הגנה: nonReentrant על כל הפונקציות שמשנות מצב + עדכון אחסון לפני קריאות חיצוניות.
וקטור עדין יותר: flash loan + מניפולציה של מחיר הרצפה דרך רישום/הסרת רישום המוני ב-Blur בבלוק אחד. תוקף לוקח flash loan → מבצע מניפולציה על הרצפה → לוקח הלוואה בהערכה מנופחת → מחזיר flash loan → הרצפה חוזרת. TWAP עם חלון מספיק (מינימום 30 דקות) הופך התקפה זו ללא רווחית.
מחסנית וכלי פיתוח
החוזים כתובים ב-Solidity 0.8.24; אנו בודקים ב-Foundry עם fork tests על ה-Ethereum mainnet. Fork test מאפשר אינטראקציה אמיתית עם Seaport, Blur Exchange, ו-Chainlink price feeds בסביבת בדיקה.
עבור ה-subgraph של The Graph אנו משתמשים ב-AssemblyScript, מתעדים אירועי Transfer ו-OrderFulfilled כדי לבנות היסטוריית מחירים. רכיב האורקל off-chain — שירות Node.js עם Redis לשמירה במטמון וחתימת מחירים דרך נתונים מובנים של EIP-712.
יכולת שדרוג: UUPS (EIP-1822) עם timelock דרך OpenZeppelin TimelockController. עבור פרוטוקול עם TVL > $1M, חשוב שלכל שדרוג יהיה עיכוב של לפחות 48 שעות — זה נותן למשתמשים זמן לצאת אם מתגלה בעיה.
מה כלול בעבודה
אנו מיישמים הלוואות NFT מאפס: מחזור פיתוח ופריסה מלא.
- ארכיטקטורת חוזים ומפרט invariants
- חוזים חכמים בקוד פתוח (Solidity)
- מערכת אורקל (TWAP, Chainlink, מחיר תכונות)
- ערכת בדיקות מלאה: יחידה, fuzz, fork tests עם נתונים אמיתיים
- ביקורת פנימית (Slither, Mythril, סקירה ידנית)
- תיעוד פריסה וניטור
- קוד מקור וגישה ל-repository
- הכשרת צוות על תפעול הפרוטוקול
יש לנו 8 שנות ניסיון בפיתוח DeFi ומעל 30 פרויקטים מיושמים בתחום ההלוואות הקריפטו. הזמינו פיתוח פרוטוקול — נציע את הפתרון האופטימלי.
תהליך העבודה
- ניתוח (2–3 ימים). קביעת סוג הפרוטוקול (P2P לעומת P2Pool), אוספים יעד, מקורות נזילות. ניתוח נתוני מחיר רצפה היסטוריים לבחירת פרמטרי TWAP.
- עיצוב (3–5 ימים). פריסת אחסון חוזים, תוכנית אורקל, מודל פירוק, פרמטרי סיכון. מפרט פורמלי של invariants של המערכת לבדיקות מבוססות מאפיינים.
- פיתוח (3–6 שבועות). חוזי ליבה, מערכת אורקל, בדיקות (יחידה + fuzz + fork). כיסוי >95%, בדיקות מאפיינים דרך Echidna עבור invariants.
- ביקורת פנימית (שבוע). Slither, Mythril, סקירה ידנית. אימות נתיבי פירוק עם fork tests באמצעות נתונים אמיתיים מהתרסקויות NFT בעבר.
- פריסה וניטור. Gnosis Safe multisig לפונקציות ניהול, Tenderly להתראות על עסקאות חריגות, The Graph לניתוח פרוטוקול.
לוחות זמנים משוערים
פרוטוקול P2P בסיסי — 4–6 שבועות. P2Pool עם אורקל מותאם אישית ופירוק במכירה פומבית הולנדית — 8–12 שבועות. ביקורת חיצונית (אנו ממליצים על Trail of Bits, Spearbit, או תחרות Code4rena) מוסיפה 2–6 שבועות והיא קריטית לפני פריסה ל-mainnet. עלות הפיתוח מחושבת באופן אישי לפי מורכבות ופונקציונליות נדרשת. עוד על מכירה פומבית הולנדית.
השאירו בקשה לייעוץ — נדון בפרויקט שלכם בפירוט ונציע ארכיטקטורה.







