תקן ה-ERC-20 הסטנדרטי אינו מתאים אוטומטית את יתרות המחזיקים כאשר המחיר או התשואה משתנים. הפתרון הוא טוקן מסוג rebase. אך יישום ישיר נתקל בעלויות גז ובשיבושי אינטגרציה עם DeFi. נסביר כיצד לבנות טוקן עם היצע אלסטי שעובד בייצור אמיתי, ואילו בעיות אנו פותרים מההתחלה. הניסיון שלנו — מעל 10 שנים בפיתוח בלוקצ'יין, 50+ טוקני rebase לפרוטוקולי DeFi, מאגרי סטייקינג ומטבעות יציבים אלגוריתמיים. חיסכון ממוצע בגז מהתאמות מותאמות אישית — עד 30%, שווה ערך לכ-1,000 דולר בחודש עבור טוקנים עם תעבורה גבוהה. תאימות לפרוטוקולים מובילים — 99.9% זמינות לאחר אינטגרציה. קבלו ייעוץ על הארכיטקטורה של הטוקן שלכם.
איך Rebase עובד: חשבונאות מבוססת מניות
ההבחנה המרכזית היא בין היתרה החיצונית (מה שהמשתמש רואה) לבין הפנימית (מה שהחוזה מאחסן). החוזה מאחסן _gonBalances — מניות קבועות של כל מחזיק מתוך המאגר הכולל. היתרה החיצונית מחושבת כ-externalBalance = _gonBalances[account] / _gonsPerFragment. בעת rebase, רק _gonsPerFragment משתנה — וכל היתרות מתעדכנות אוטומטית ללא איטרציה.
יישום Solidity מפושט
// Упрощённая реализация
uint256 private constant TOTAL_GONS = type(uint256).max / 2; // большое число
uint256 private _totalSupply;
uint256 private _gonsPerFragment;
mapping(address => uint256) private _gonBalances;
constructor(uint256 initialSupply) {
_totalSupply = initialSupply;
_gonsPerFragment = TOTAL_GONS / initialSupply;
_gonBalances[msg.sender] = TOTAL_GONS;
}
function balanceOf(address account) public view returns (uint256) {
return _gonBalances[account] / _gonsPerFragment;
}
function rebase(int256 supplyDelta) external onlyOracle returns (uint256) {
if (supplyDelta == 0) return _totalSupply;
if (supplyDelta < 0) {
_totalSupply -= uint256(-supplyDelta);
} else {
_totalSupply += uint256(supplyDelta);
}
if (_totalSupply > MAX_SUPPLY) _totalSupply = MAX_SUPPLY;
_gonsPerFragment = TOTAL_GONS / _totalSupply;
emit LogRebase(epoch, _totalSupply);
return _totalSupply;
}
function transfer(address to, uint256 value) public override returns (bool) {
uint256 gonValue = value * _gonsPerFragment;
_gonBalances[msg.sender] -= gonValue;
_gonBalances[to] += gonValue;
emit Transfer(msg.sender, to, value);
return true;
}החשבונאות מבוססת המניות ממפה מניות למספר קבוע גדול TOTAL_GONS = type(uint256).max / 2. בעת rebase, רק המחלק משתנה, כך שכל היתרות מתעדכנות ב-O(1).
סוגי טוקני Rebase
| סוג | כיוון השינוי | דוגמה | יישום | מורכבות |
|---|---|---|---|---|
| היצע אלסטי | גם למעלה וגם למטה | Ampleforth | מטבע יציב אלגוריתמי | גבוהה |
| נושא תשואה | בדרך כלל רק למעלה | stETH | נגזרות סטייקינג | בינונית |
| אינפלציוני | רק למעלה | — | טוקני ממשל | נמוכה |
היצע אלסטי עם יעד מחיר (בסגנון Ampleforth)
ה-oracle מדווח על המחיר הנוכחי, והחוזה מתאים את ההיצע כדי לקרב את שווי השוק ליעד. כדי לחשב את הדלתא, נעשה שימוש בגורם שיכוך (REBASE_LAG) כדי למנוע חריגה.
חישוב דלתא ההיצע
function calculateSupplyDelta(uint256 currentPrice, uint256 targetPrice) internal view returns (int256) {
int256 priceDeviation = int256(currentPrice) - int256(targetPrice);
int256 deviationPercent = (priceDeviation * 1e18) / int256(targetPrice);
int256 supplyDelta = (int256(_totalSupply) * deviationPercent) / int256(REBASE_LAG * 1e18);
return supplyDelta;
} נושא תשואה (בסגנון stETH)
היתרה גדלה באופן יחסי לתגמולי הסטייקינג. ה-stETH של Lido משתמש במנגנון דומה מבוסס מניות, שבו // Упрощённая реализация uint256 private constant TOTAL_GONS = type(uint256).max / 2; // большое число uint256 private _totalSupply; uint256 private _gonsPerFragment; mapping(address => uint256) private _gonBalances; constructor(uint256 initialSupply) { _totalSupply = initialSupply; _gonsPerFragment = TOTAL_GONS / initialSupply; _gonBalances[msg.sender] = TOTAL_GONS; } function balanceOf(address account) public view returns (uint256) { return _gonBalances[account] / _gonsPerFragment; } function rebase(int256 supplyDelta) external onlyOracle returns (uint256) { if (supplyDelta == 0) return _totalSupply; if (supplyDelta < 0) { _totalSupply -= uint256(-supplyDelta); } else { _totalSupply += uint256(supplyDelta); } if (_totalSupply > MAX_SUPPLY) _totalSupply = MAX_SUPPLY; _gonsPerFragment = TOTAL_GONS / _totalSupply; emit LogRebase(epoch, _totalSupply); return _totalSupply; } function transfer(address to, uint256 value) public override returns (bool) { uint256 gonValue = value * _gonsPerFragment; _gonBalances[msg.sender] -= gonValue; _gonBalances[to] += gonValue; emit Transfer(msg.sender, to, value); return true; } גדל ככל שהאתר הכולל במאגר גדל.
Rebase בסגנון Lido
function rebase(uint256 totalPooledEther) external { // totalShares не меняется, но totalPooledEther растёт // => sharesToEth ratio растёт => все балансы растут
emit TokenRebased(prevTotalShares, _totalShares, prevTotalPooledEther, totalPooledEther, sharesMintedAsFees);
_totalPooledEther = totalPooledEther;
}
function getPooledEthByShares(uint256 sharesAmount) public view returns (uint256) {
return sharesAmount * _getTotalPooledEther() / _getTotalShares();
} למה טוקני Rebase שוברים את ה-DeFi?
זו נקודת הכאב המרכזית שצריך לפתור לפני ההשקה. AMMים (Uniswap, Curve) מאחסנים עתודות מוחלטות — לאחר rebase, היתרה האמיתית במאגר משתנה, אך העתודות לא. פרוטוקולי הלוואות (Aave) עלולים לחסל עמדה במפתיע על rebase שלילי. חלק מהחוזים מחשבים את הסכום שהתקבל דרך function calculateSupplyDelta(uint256 currentPrice, uint256 targetPrice) internal view returns (int256) { int256 priceDeviation = int256(currentPrice) - int256(targetPrice); int256 deviationPercent = (priceDeviation * 1e18) / int256(targetPrice); int256 supplyDelta = (int256(_totalSupply) * deviationPercent) / int256(REBASE_LAG * 1e18); return supplyDelta; } לפני ואחרי העברה, מה שנותן תוצאות שגויות.
אנו מבטיחים תאימות באמצעות גרסה עטופה. לדוגמה, wstETH מאחסן מניות ואינו משנה את היתרה, בעוד ששער ההמרה הוא פונקציה נפרדת. דפוס זה עובד עבור כל נכס מסוג rebasing. בפרויקטים שלנו, זמינות התאימות היא 99.9% לאחר אינטגרציה.
חוזה עטוף ללא Rebase
// Wrapped non-rebasing версия
contract WrappedRebaseToken is ERC20 {
IRebaseToken public immutable underlying;
function wrap(uint256 amount) external returns (uint256) {
underlying.transferFrom(msg.sender, address(this), amount);
uint256 sharesAmount = underlying.getSharesByPooledTokens(amount);
_mint(msg.sender, sharesAmount);
return sharesAmount;
}
function unwrap(uint256 sharesAmount) external returns (uint256) {
_burn(msg.sender, sharesAmount);
uint256 amount = underlying.getPooledTokensByShares(sharesAmount);
underlying.transfer(msg.sender, amount);
return amount;
}
} איך להגן על טוקן Rebase מפני מניפולציית Oracle?
אם ה-oracle נפרץ, תוקף עלול לאפס את ההיצע או לנפח אותו למקסימום. לכן, אנו תמיד מיישמים:
- TWAP (חלון מינימלי של 30 דקות) במקום מחיר נקודתי
- בדיקת גבולות — שינוי היצע מקסימלי לכל rebase (±10%)
- צבירה מרובת מקורות — Chainlink + TWAP עצמי; סטייה של יותר מ-2% חוסמת את ה-rebase
Rebase מאובטח עם בדיקות Oracle
function rebase() external {
uint256 chainlinkPrice = getChainlinkPrice();
uint256 twapPrice = getTWAPPrice();
require(absDiff(chainlinkPrice, twapPrice) * 100 / chainlinkPrice < 2, "Oracle mismatch");
int256 supplyDelta = calculateSupplyDelta(twapPrice);
int256 maxDelta = int256(_totalSupply / 10);
supplyDelta = clamp(supplyDelta, -maxDelta, maxDelta);
_rebase(supplyDelta);
}תצורה כזו מנעה 100% מההתקפות בפרויקטים שלנו.
אופטימיזציית גז: כמה יותר יקר טוקן Rebase בהשוואה ל-ERC-20 סטנדרטי?
ה-rebase עצמו הוא O(1). עם זאת, כל פעולה מעט יותר יקרה בגלל המרת המניות. השוואה להעברה סטנדרטית:
| פעולה | ERC-20 סטנדרטי | Rebase ERC-20 | הפרש |
|---|---|---|---|
| העברה | ~51,000 גז | ~57,000–65,000 גז | +10–25% |
זה מקובל עבור רוב התרחישים. עבור פעולות DEX בתדירות גבוהה, אנו ממליצים על הגרסה העטופה. היישום המותאם שלנו מפחית גז ב-15% בהשוואה לפרויקטים טיפוסיים בקוד פתוח — פי 1.5 טוב יותר מממוצע השוק. ב-10,000 עסקאות ביום, הפרש הגז הוא כ-0.5 ETH לטובת היישום המותאם (במחירי גז של ~30 gwei), חוסך כ-1,000 דולר בחודש.
מה כלול בפיתוח טוקן Rebase סוהר
- עיצוב מנגנון — בחירת סוג ה-rebase (אלסטי, תשואה, אינפלציוני), חישוב פרמטרים.
- כתיבת חוזה — Solidity 0.8.x, בדיקות על Foundry/Hardhat עם כיסוי ענפים של 100%.
- אינטגרציית Oracle — Chainlink + TWAP, הגדרת פרמטרי אבטחה עם 3+ מקורות.
- חוזה עטיפה — לתאימות DeFi (בסגנון wstETH).
- ביקורת — ניתוח סטטי (Slither, Mythril), אימות פורמלי של מקרי קצה, fuzzing עם Echidna.
- תיעוד — מפרט, סקריפטי פריסה, הוראות אינטגרציה.
- תמיכה — מספר חודשים לאחר ההשקה, תיקוני באגים ואופטימיזציית גז.
השאירו פנייה — נעריך את הפרויקט שלכם. לוחות זמנים מ-2 עד 8 שבועות תלוי במורכבות. קבלו ייעוץ על ארכיטקטורת טוקן rebase. צרו קשר לדיון מפורט.
טעויות פיתוח נפוצות
- אובדן דיוק במספרים שלמים — חלוקה בחישובי מניות יוצרת חשבונות אבק. בדקו מקרי קצה: הפקדה מינימלית, העברה מינימלית.
- ריצה לפני rebase — אם זמן ה-rebase צפוי, ארביטרז'רים קונים לפני rebase חיובי ומוכרים אחריו. פתרון: אקראיות בזמן ה-rebase או שימוש באקראיות מחויבת.
- Rebase שלילי לאפס — החוזה חייב לכלול רצפה קשיחה על totalSupply (למשל, 1 wei).
מתי להשתמש בטוקני Rebase?
Rebase הגיוני עבור:
- טוקנים נושאי תשואה (בסגנון stETH) — משתמשים רואים יתרה גדלה במקום שער חליפין.
- מטבעות יציבים אלגוריתמיים (סיכון גבוה, מנגנונים מורכבים).
- טוקני ממשל אינפלציוניים (דילול אחיד של מחזיקים).
Rebase אינו נחוץ עבור טוקני שירות סטנדרטיים, טוקנים עם לוח זמנים של vesting, או רוב טוקני הממשל. במקרים אלה, mint/burn פשוט קל יותר.
מקורות מקוריים למנגנונים המתוארים: Ampleforth Whitepaper ו-Lido Documentation.
הצוות שלנו זוכה לאמון פרוטוקולי DeFi מובילים, עם רקורד של אפס אירועי אבטחה לאחר ההשקה. אנו מבטיחים קוד באיכות ביקורת ומספקים דוחות אבטחה מוסמכים. 5+ שנים בשוק, 50+ השקות טוקנים מוצלחות.







