שדרוגי חוזים חכמים: מנצחיות לניתנים לשדרוג
דמיינו שפרסתם חוזה על Ethereum, וחודש לאחר מכן אתם צריכים להוסיף פונקציית משיכה או לתקן פרצת לוגיקה. חוזים חכמים הם נצחיים — זה חוק הבלוקצ'יין. אבל שדרוגים עדיין אפשריים באמצעות תבניות פרוקסי. לצוות שלנו יש ניסיון של 5+ שנים וביצענו 50+ שדרוגים לפרוטוקולים על Ethereum, Polygon ו-BNB Chain — אפס מקרי אובדן נתונים.
הטעות היקרה ביותר במהלך שדרוג היא התנגשות אחסון. זה קורה כאשר יישום חדש דורס בטעות מצב קודם עקב שינוי בסדר המשתנים. דוגמה: צוות הוסיף משתנה בתחילת האחסון — כל מיפוי // UUPS: функция upgrade должна быть в реализации function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} זז בחריץ אחד. יתרות משתמשים החלו להיקרא ככתובות. היה צורך לבצע rollback לפריסה באמצעות multisig חירום. מצב כזה יכול לעלות מאות אלפי דולרים, וקל להימנע ממנו על ידי ביצוע השיטות המוכחות שלנו. כל עסקה דרך Transparent Proxy צורכת 2100 גז נוסף — ב-1000 עסקאות ביום, זה 2.1 מיליון גז מבוזבז. UUPS צורך כ-30% פחות גז בקריאות רגילות. אז בחירת התבנית משפיעה ישירות על תקציב הפרויקט.
תבניות פרוקסי: השוואה ובחירה
בחירת תבנית תלויה בעדיפויות: גז מול אבטחה. הטבלה שלהלן מתארת את ההבדלים המרכזיים.
| תבנית | גז לעסקה | סיכון לאובדן שליטה | מורכבות תחזוקה | מתאימה ל |
|---|---|---|---|---|
| Transparent Proxy (EIP-1967) | +2100 גז (בדיקת אדמין) | נמוך | נמוכה | רוב הפרוטוקולים |
| UUPS (EIP-1822) | מינימלי | גבוה (אם חסרה פונקציית שדרוג) | בינונית | פרוטוקולים רגישים לגז |
| Beacon Proxy | תלוי ב-beacon | נמוך | בינונית | תבניות Factory (NFTs, vaults) |
| Diamond (EIP-2535) | גבוה יותר בקריאות facet | בינוני | גבוהה | חוזים > 24KB |
Transparent Proxy
הקלאסי מOpenZeppelin. ProxyAdmin מנהל שדרוגים; משתמשים מתקשרים ישירות עם הפרוקסי. חיסרון: כל קריאה דורשת SLOAD לבדיקת אדמין (כ-2100 גז). מתאים לרוב הפרוטוקולים אם אילוצי הגז אינם מחמירים.
UUPS (EIP-1822)
לוגיקת השדרוג מועברת לתוך היישום. הפרוקסי קל יותר, פחות גז בקריאות רגילות. אבל אם ליישום חסרה פונקציית שדרוג, החוזה הופך לנצחי לצמיתות. זה לא היפותטי — כמה פרויקטים מצאו את עצמם במצב זה. EIP-1822 מתאר את התקן.
// UUPS: функция upgrade должна быть в реализации
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} Beacon Proxy
Beacon אחד מאחסן את כתובת היישום. מאות פרוקסים קוראים מה-beacon. עדכון כל הפרוקסים הוא קריאה אחת. קריטי לתבניות Factory: עמדות הלוואה, אוספי NFT עם לוגיקה, vaults לכל משתמש.
Diamond (EIP-2535)
מאפשר פיצול לוגיקה ל-facets — מספר חוזי יישום. עוקף את מגבלת ה-24KB. מורכב לתחזוקה: פריסת האחסון נשלטת ידנית דרך DiamondStorage. אנו משתמשים בו רק כאשר החוזה חורג אובייקטיבית מהמגבלה.
למה התנגשות אחסון היא האויב הראשי של שדרוגים
בדיקת פריסת האחסון היא הצעד הראשון. לפני כתיבת גרסה חדשה, אנו משווים את הפריסה של היישום הישן והחדש באמצעות forge inspect ContractName storage-layout. כלל קריטי: אין לשנות את הסדר או הסוגים של משתנים קיימים. רק להוסיף חדשים בסוף.
// ❌ Нельзя: balances сдвинется с slot 0 на slot 1
contract TokenV2 {
address public newFeature; // добавлено в начало
mapping(address => uint256) public balances;
}
// ✅ Можно: новые переменные только в конец
contract TokenV2 {
mapping(address => uint256) public balances;
address public newFeature; // добавлено в конец
}עבור UUPS ו-Transparent Proxy, תוסף השדרוגים של OpenZeppelin בודק אוטומטית תאימות אחסון במהלך שדרוגים.
רשימת בדיקה לפני שדרוג
- [ ] פריסת אחסון אומתה עבור יישומים ישנים וחדשים
- [ ] סקריפטי מיגרציה נכתבו
- [ ] בדיקה על fork testnet של mainnet
- [ ] Multisig מוגדר עם timelock ≥ 48 שעות
- [ ] תוכנית rollback מוכנה (כתובת היישום הישן נשמרה)
איך תהליך השדרוג עובד
אנו פועלים לפי תהליך שממזער סיכונים.
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח פריסת אחסון וארכיטקטורה | 1-2 ימים | דוח תאימות |
| הכנת סקריפטי מיגרציה | 2-5 ימים | סקריפטים ובדיקות |
| פריסת Staging על fork testnet | 1-2 ימים | סימולציית ייצור |
| הצעת Multisig + timelock | 2-7 ימים | ביצוע |
| ניטור לאחר פריסה | מתמשך | Dashboard והתראות |
ניתוח פריסת אחסון
אנו משווים את חריצי האחסון של היישום הנוכחי והחדש. אם קיימים שינויים, אנו מעריכים את ההשפעה.
מיגרציית נתונים
אם נדרש טרנספורמציה של נתונים (למשל, שינוי מבנה mapping), אנו כותבים סקריפט נפרד. עבור מערכי נתונים קטנים — מיגרציה on-chain ב-initializer. עבור גדולים — off-chain עם עסקאות בקבוצות.
פריסת Staging
אנו בודקים את השדרוג על fork testnet של מצב mainnet האמיתי:
# Форк mainnet с реальным состоянием контракта
anvil --fork-url $MAINNET_RPC --fork-block-number latest
# Деплой новой реализации и upgrade
forge script UpgradeScript --fork-url http://localhost:8545אנו מוודאים שלמות אחסון, ושפונקציות ישנות וחדשות פועלות כראוי.
Multisig + Timelock
שדרוג ייצור עובר דרך הצעת multisig → עיכוב ב-Timelock → ביצוע. timelock מינימלי הוא 48 שעות כדי לאפשר לקהילה ולמבקרים לבדוק את היישום החדש.
מה כלול בתמיכה בחוזים חכמים?
אנו מגדירים ניטור דרך Tenderly Alerts או OpenZeppelin Defender Sentinel: התראות על עסקאות גדולות, דפוסים חריגים, שינויים במשתנים קריטיים. עבור אירועים קריטיים — התראות ב-Telegram/PagerDuty.
החבילה המלאה כוללת:
- ניתוח פריסת אחסון וארכיטקטורה נוכחית
- הכנת סקריפטי מיגרציה
- פריסת testnet עם סימולציה
- עסקת multisig עם timelock
- ניטור לאחר פריסה (P95, מספר עסקאות, שגיאות)
- תיעוד שינויים והמלצות לאופטימיזציית גז
ציר זמן: מיומיים עסקיים (שדרוגים פשוטים של הוספת פונקציות) עד שבועיים (אם נדרשת מיגרציית נתונים ובדיקות מקיפות).
טעויות שדרוג אופייניות
שכחת קריאה ל-// ❌ Нельзя: balances сдвинется с slot 0 на slot 1 contract TokenV2 { address public newFeature; // добавлено в начало mapping(address => uint256) public balances; } // ✅ Можно: новые переменные только в конец contract TokenV2 { mapping(address => uint256) public balances; address public newFeature; // добавлено в конец } של חוזי אב ב-initializer החדש. חוזי OpenZeppelin עם # Форк mainnet с реальным состоянием контракта anvil --fork-url $MAINNET_RPC --fork-block-number latest # Деплой новой реализации и upgrade forge script UpgradeScript --fork-url http://localhost:8545 דורשים שרשור initializers דרך __init. דילוג מוביל לאובדן תפקידים. שדרוג ללא בדיקות testnet — אפילו הוספת פונקציית view יכולה לשנות אחסון עקב חוזים מורשים. אין תוכנית rollback — ודאו שכתובת היישום הישן נשמרה (אפשרי בפרוקסי Transparent ו-UUPS).
למה הצוות שלנו?
ביצענו 50+ שדרוגים לפרוטוקולי DeFi ו-NFT עם אפס תקלות. אנו משתמשים באימות פורמלי וביקורות קוד. אנו מבטיחים שלמות אחסון וניטור 24/7. קבלו ייעוץ לחוזה שלכם: נעריך סיכונים ונציע תוכנית שדרוג אופטימלית. צרו קשר כדי לדון במקרה שלכם.







