אופטימיזציית גז לחוזים חכמים
פנה אלינו פרויקט DeFi: פריסת החוזה ERC-1155 שלהם עלתה 0.8 ETH במקום 0.3 הצפוי. משתמשים שילמו 15$ לכל transfer() במחיר גז של 30 gwei, בעוד מתחרים שילמו 4$. הסיבה הייתה מבנה אחסון לקוי ודפוסים לא אופטימליים שהמהדר Solidity לא מתקן עבורך. ביצענו ביקורת גז והפחתנו את עלות הפריסה ב-62%, ואת עלויות העסקאות פי 3, וחסכנו לפרויקט מעל 50,000$ בעמלות משתמשים בשנה. הניסיון שלנו באופטימיזציה של מעל 50 חוזים מראה ש-80% מההפסדים מתבטלים על ידי ארכיטקטורת אחסון נכונה. כל פעולת SLOAD או SSTORE נוספת מוכפלת על פני אלפי קריאות. במאמר זה, נסקור דפוסים ספציפיים שחוסכים 30-50% בחוזים טיפוסיים.
למה אחסון הוא המקור העיקרי לאובדן גז
SSTORE עולה 20,000 גז בכתיבה לחריץ קר, 2,900 גז בעדכון חריץ חם. SLOAD עולה 2,100 גז לקר, 100 לחם (לפי EIP-2929). לכן ארכיטקטורת אחסון קובעת 60-80% מעלות החוזה.
אריזת חריצים היא הכלי הראשון. ה-EVM מאחסן נתונים בחריצים של 32 בתים. אם תצהיר משתנים כך:
// Плохо: 3 слота
uint128 a;
uint256 b;
uint128 c;
// Хорошо: 2 слота (a и c упакованы)
uint128 a;
uint128 c;
uint256 b;זה חוסך שתי פעולות SLOAD בקריאה. בחוזה עם 10,000 פריסות, החיסכון מסתכם במאות ETH.
עלויות גז לפעולות אחסון
| פעולה | גז (קר) | גז (חם) |
|---|---|---|
| SLOAD | 2100 | 100 |
| SSTORE (חדש) | 20000 | 20000 |
| SSTORE (עדכון) | 2900 | 2900 |
| BALANCE | 2600 | 100 |
אלה לא רק מספרים—הכרתם מאפשרת לך לבחור בין קריאה מאחסון לחישוב.
איך למצוא צווארי בקבוק בחוזה שלך
כלי ניתוח
| כלי | מה הוא מראה |
|---|---|
| Hardhat Gas Reporter | גז לכל קריאת פונקציה בבדיקות |
Foundry // Плохо: 3 слота uint128 a; uint256 b; uint128 c; // Хорошо: 2 слота (a и c упакованы) uint128 a; uint128 c; uint256 b; |
אותו דבר, אבל מהיר יותר עם השוואה בין commits |
forge test --gas-report |
פירוט Opcode דרך eth-gas-reporter |
| Tenderly Gas Profiler | פירוט מעקב EVM של עסקאות אמיתיות |
| Remix Gas Estimation | בדיקה מהירה ללא הגדרה |
Foundry הוא הבחירה המועדפת שלנו. --verbose יוצר קובץ forge snapshot שניתן להתחייב ולעקוב אחריו ב-CI:
forge snapshot # изменяем код forge snapshot --diff ההבדלים מוצגים שורה אחר שורה לכל פונקציה.
Mappings לעומת מערכים
.gas-snapshot הוא גישה O(1), חסכוני בגז. forge snapshot # изменяем код forge snapshot --diff עם חיפוש ערך הוא O(n) וטעות ארכיטקטונית ב-99% מהמקרים. אם יש צורך באיטרציה, אינדקס דרך אירועים וקריאה off-chain דרך The Graph.
מקור לא ברור: keccak256 על מחרוזות קצרות
mapping(uint256 => address) בפונקציה שנקראת אלפי פעמים גורם לעומס קידוד ABI. החלפת מחרוזות בקבועי address[] כאשר המחרוזות ידועות מראש חוסכת 200-500 גז לכל קריאה.
דפוסי אופטימיזציה ספציפיים
שגיאות מותאמות אישית במקום require עם מחרוזות
// До: 24 000 gas на деплой одной строки
require(amount > 0, "Amount must be positive");
// После: экономия ~200 gas per revert + меньше байткода
error AmountZero();
if (amount == 0) revert AmountZero();שגיאות מותאמות אישית (EIP-838) הפכו לסטנדרט עם Solidity 0.8.4. מחרוזות ב-string memory name הן bytecode שמגדיל את עלות הפריסה ועלות ה-revert.
חשבון לא בדוק (Unchecked)
מאז Solidity 0.8.0, כל פעולות החשבון בודקות גלישה כברירת מחדל. הבדיקה עולה ~100 גז לכל פעולה. במקום שבו גלישה בלתי אפשרית מתמטית:
unchecked { ++i; // в цикле for — стандартный паттерн total += amounts[i]; // если суммы ограничены и проверены выше } בלולאה של 100 איטרציות, זה חוסך 10,000+ גז.
Immutable ו-Constant
ערכי bytes32 מוטמעים ב-bytecode—אין צורך ב-SLOAD. ערכי // До: 24 000 gas на деплой одной строки require(amount > 0, "Amount must be positive"); // После: экономия ~200 gas per revert + меньше байткода error AmountZero(); if (amount == 0) revert AmountZero(); נכתבים ל-bytecode בזמן פריסה, נקראים כ-require. שניהם ~3x זולים יותר מקריאה מאחסון. כתובות Token, נקודות בסיס לעמלות, כתובות בעלים בחוזים שאינם ניתנים לשדרוג—כולם מועמדים ל-unchecked { ++i; // в цикле for — стандартный паттерн total += amounts[i]; // если суммы ограничены и проверены выше } .
Calldata לעומת Memory לפרמטרי קלט
// memory — копирует данные в память
function process(uint256[] memory ids) external
// calldata — читает напрямую из calldata, не копирует
function process(uint256[] calldata ids) external
לפונקציות חיצוניות שרק קוראות נתונים, constant זול יותר. ההבדל גדל עם גודל המערך: למערך של 50 אלמנטים, זה 3,000-5,000 גז.
מה שירות אופטימיזציית הגז שלנו כולל
- ביקורת בסיס: הרצת כל הבדיקות עם
immutable, תיעוד בסיס. ללא שינויים ללא מדידות לפני/אחרי. - פרופילינג דרך Tenderly: לקיחת עסקאות mainnet אמיתיות (אם כבר נפרסו) או סימולציה ב-Tenderly fork. ראיית פירוט לפי EVM opcodes.
- אופטימיזציה איטרטיבית: יישום שינויים אחד בכל פעם, מדידה. אריזת חריצים בדרך כלל נותנת את האפקט הגדול ביותר—אנחנו מתחילים שם.
- בדיקות רגרסיה:
PUSH32ב-CI. כל PR שמגדיל גז ביותר מ-1% דורש הצדקה. - תיעוד ודוח: תיעוד כל השינויים, חיסכון לכל פונקציה, המלצות לתחזוקה שוטפת.
דוגמה: חיסכון מאריזת אחסון
חוזה עם 1,000,000 קריאות `mint` המשתמש ב-3 חריצים במקום 2: כל SLOAD נוסף עולה 100 גז (חם) או 2100 (קר). ב-30 gwei, החיסכון נע בין כמה מאות דולרים.התהליך שלנו
- ניתוח: ביקורת החוזה הנוכחי, ניתוח פרופיל הגז.
- עיצוב: זיהוי דפוסים שיניבו את החיסכון הגדול ביותר.
- יישום: שינוי קוד, כתיבת בדיקות.
- בדיקות: רגרסיה, מבחן עומס, פריסה ל-testnet.
- פריסה: פריסת החוזה המאופטם, העברת נתונים (אם נדרש).
הערכות זמן
ביקורת גז של חוזה קיים + דוח עם המלצות: 1-2 ימים. אופטימיזציה עם יישום ובדיקות: 2-3 ימים תלוי במורכבות החוזה. עיצוב מחדש מלא של מבנה האחסון (אם הארכיטקטורה לא אופטימלית מלכתחילה): משבוע, מכיוון שדורש סקריפטים להעברת נתונים קיימים.
העלות נקבעת לאחר ניתוח החוזה ופרופיל הגז הנוכחי. עלויות ביקורת טיפוסיות נעות בין 5,000$ ל-15,000$ תלוי במורכבות, עם הבטחה להפחתת גז של 20-50% בפונקציות מפתח.
מה כלול בעבודה
- דוח ביקורת גז מפורט עם פירוט לכל פונקציה
- קוד חוזה חכם מאופטם עם diff מהמקור
- מערך בדיקות המכסה רגרסיות וחיסכון בגז
- סקריפטי פריסה ותמיכה בהעברת נתונים (אם נדרש)
- גישה ללוח ניטור הגז שלנו דרך Tenderly
- מפגש הדרכה לצוות שלך על שיטות עבודה מומלצות
- 30 ימי תמיכה לאחר פריסה
למה לבחור בנו?
- מעל 5 שנות ניסיון בפיתוח חוזים חכמים ב-Solidity, Rust ו-Vyper.
- ביצענו ביקורות ואופטימיזציות ל-30+ פרויקטי DeFi, כולל פרוטוקולים עם TVL > 50M$.
- הבטחה להפחתת גז של 20-50% בפונקציות מפתח.
- עבודה עם חוזים ב-Ethereum, Polygon, Arbitrum, Optimism, Base, Solana, BNB Chain.
שירות אופטימיזציית הגז שלנו מתמקד באריזת אחסון להשגת חיסכון בגז. אם אתה מחפש להפחית עלויות עסקאות ולחסוך בפריסה, צור קשר להערכה מקדימה בחינם. קבל ייעוץ מהנדס—נקבע את פוטנציאל האופטימיזציה בשעה.
הערה: התרחבות זיכרון עולה ליניארית עם גודל הנתונים בשל נוסחת עלות הגז הריבועית (G_memory + expansion_cost). הבנת זה עוזרת בבחירת מיקום הנתונים הנכון למשתנים כדי למזער תקורה בגז.







