DAO, שבו ההצבעה מתבצעת רק דרך Snapshot והביצוע דרך multisig, מסתכן בריכוזיות. איך עוברים לדמוקרטיה מלאה על השרשרת מבלי לוותר על אבטחה? פיתחנו עשרות פתרונות כאלה במשך יותר מ-5 שנים: מ-multisig פשוטים ועד פלטפורמות עם veTokens וממשל מודולרי. הניסיון שלנו מראה שרוב הבעיות של DAO נמצאות בשכבה החברתית, אבל ללא ארכיטקטורת חוזים חכמים נכונה, השכבה החברתית לא מתפקדת. בואו נפרק את הארכיטקטורה על השרשרת, את המלכודות הנפוצות בעיצוב ממשל, ואת התצורות הספציפיות שאנו משתמשים בהן בייצור.
ארכיטקטורת Governor ב-Solidity
OpenZeppelin Governor (OZ 5.x) הוא מסגרת מודולרית: לוגיקת ליבה + מודולים ניתנים להחלפה להצבעה, ספירה, קוורום וטיימלוק. רוב ה-DAOים בייצור כיום משתמשים בזה או ב-Governor Bravo (Compound).
התצורה המינימלית כוללת ארבעה מודולים: GovernorSettings מגדיר votingDelay (7200 בלוקים ≈ יום אחד), votingPeriod (50400 בלוקים ≈ שבוע), ו-proposalThreshold (לדוגמה, 1000 טוקנים). GovernorCountingSimple מטפל בהצבעות בעד/נגד/נמנע. GovernorVotes מחבר טוקן עם מעקב האצלה (ERC20Votes). GovernorTimelockControl משלב TimelockController לעיכוב ביצוע. קוורום מוגדר דרך GovernorVotesQuorumFraction — בדרך כלל 4% מההיצע הכולל.
ERC20Votes: צילומי הצבעה
ERC20Votes מרחיב את ה-ERC-20 הסטנדרטי על ידי הוספת מנגנון _delegate והיסטוריית צ'קפוינטים. כל העברה או האצלה יוצרת צ'קפוינט. בעת הצבעה, נעשה שימוש בכוח ההצבעה בבלוק proposalSnapshot, לא ביתרה הנוכחית — זה מגן מפני רכישת טוקנים אך ורק לצורך הצבעה.
// Пользователь должен делегировать себе (или другому) для активации voting power
token.delegate(msg.sender);
// Voting power на момент снапшота
uint256 power = token.getPastVotes(account, proposalSnapshot);חשוב: טוקנים ללא האצלה אינם משתתפים בהצבעה. זה לעיתים קרובות מפתיע משתמשים חדשים. ה-UX צריך להזכיר למשתמשים על האצלה במהלך האינטראקציה הראשונה עם הארנק.
מחזור החיים של הצעה
- הכנה — יצירת calldata דרך
// Пользователь должен делегировать себе (или другому) для активации voting power token.delegate(msg.sender); // Voting power на момент снапшота uint256 power = token.getPastVotes(account, proposalSnapshot);. - יצירה — קריאה ל-
abi.encodeWithSignature. - עיכוב לפני הצבעה —
governor.propose(targets, values, calldatas, description)(בדרך כלל 7200 בלוקים) קובע את הצילום. - הצבעה —
votingDelay(50400 בלוקים). המשתתפים מצביעים בעד, נגד או נמנעים. - תור — אם ההצעה עוברת, היא מוכנסת ל-Timelock דרך
votingPeriod. - ביצוע — לאחר
governor.queue, קריאה ל-timelockDelay.
// Example: изменить комиссию протокола с 0.3% до 0.5%
address[] memory targets = new address[](1);
targets[0] = address(protocolFeeManager);
uint256[] memory values = new uint256[](1);
values[0] = 0;
bytes[] memory calldatas = new bytes[](1);
calldatas[0] = abi.encodeWithSignature("setFee(uint256)", 50); // 0.5% = 50 bps
governor.propose(targets, values, calldatas, "Increase protocol fee to 0.5%"); למה Timelock חשוב?
TimelockController הוא אלמנט חובה ב-DAOים בייצור. הצעה מאושרת לא מתבצעת מיד: היא נכנסת לתור ומבוצעת לאחר עיכוב (בדרך כלל 2-7 ימים). חלון זה מאפשר לקהילה לשים לב להצעה מסוכנת ולצאת מהפרוטוקול לפני הביצוע.
תפקידי TimelockController: PROPOSER (בדרך כלל רק חוזה ה-Governor), EXECUTOR (לעיתים קרובות governor.execute — כל אחד), ו-CANCELLER (multisig של הצוות כשסתום ביטחון). עיכוב מינימלי הוא פרמטר בטיחות. 48 שעות הוא המינימום המוחלט לפרוטוקול עם כספים אמיתיים; Compound ו-Aave משתמשות ב-2-7 ימים.
דוגמה לתצורת TimelockController
timelock = new TimelockController(
minDelay, // 172800 - 2 дня
proposers, // массив: address(governor)
executors, // массив: address(0) - anyone
admin // мультисиг команды (CANCELLER)
); ניהול קופת האוצר
DAOים בדרך כלל מנהלים קופת אוצר — עתודות פרוטוקול. הדפוס הסטנדרטי: קופת האוצר היא ה-TimelockController עצמו (הוא מחזיק ETH וטוקנים), או חוזה נפרד כמו Gnosis Safe עם ה-Governor כבעלים יחיד. עבור DAOים קטנים או בשלבים מוקדמים: Gnosis Safe עם multisig + מודול Zodiac SafeSnap, שמבצע הצבעות Snapshot.org על השרשרת. זה זול יותר (הצבעה מחוץ לשרשרת ללא גז) ומספיק עד שמצטברים מספיק מחזיקים פעילים לממשל על השרשרת. המעבר מ-multisig לממשל מלא על השרשרת הוא אבן דרך נפרדת. הנתיב הטיפוסי: multisig (השקה) → multisig + Snapshot (צמיחת קהילה) → Governor מלא על השרשרת (פרוטוקול בוגר).
קופת אוצר המורכבת 100% מטוקנים מקומיים היא סיכון גבוה. שוק דובי ממוטט את מסלול הריצה. DAOים בייצור מגוונים: 20-30% USDC/DAI לצרכים תפעוליים, השאר טוקנים מקומיים. הגיוון נעשה דרך הצעה מאושרת על ידי הממשל להחלפה ב-DEX או עסקת OTC.
איך להגן על DAO מהתקפות ממשל?
התקפת Flash Loan
התקפה: flash loan → השגת שליטה זמנית על טוקנים רבים → האצלה לעצמך → יצירה או דחיפה של הצעה → החזרת הלוואה. ליצירת הצעה: // Example: изменить комиссию протокола с 0.3% до 0.5% address[] memory targets = new address[](1); targets[0] = address(protocolFeeManager); uint256[] memory values = new uint256[](1); values[0] = 0; bytes[] memory calldatas = new bytes[](1); calldatas[0] = abi.encodeWithSignature("setFee(uint256)", 50); // 0.5% = 50 bps governor.propose(targets, values, calldatas, "Increase protocol fee to 0.5%"); חייב להיות גבוה מספיק. להצבעה: address(0) קבוע בעבר, כך ש-flash loan לא עוזר (אין היסטוריית האצלה בבלוק הנוכחי). ERC20Votes מוגן מפני התקפות flash loan על הצבעה בדיוק בגלל מנגנון הצ'קפוינטים. הגנה מפני התקפות flash loan מונעת הפסדים פוטנציאליים הנעים בין $50,000 ל-$5,000,000. פגיעות קיימת רק ב-timelock = new TimelockController( minDelay, // 172800 - 2 дня proposers, // массив: address(governor) executors, // массив: address(0) - anyone admin // мультисиг команды (CANCELLER) ); אם הוא מוגדר נמוך מדי.
ספאם הצעות ו-DoS
ללא סף יצירת הצעות, הפרוטוקול מוצף בהצעות זבל. proposalThreshold (מינימום טוקנים ליצירת הצעה) הוא חובה. ערכים טיפוסיים: 0.1% - 1% מההיצע הכולל.
השתלטות על הממשל
אם תוקף צובר כוח הצבעה של >50% (או >קוורום עם אחוזי הצבעה נמוכים), הוא יכול להעביר כל הצעה. הגנות: קוורום גבוה (4-10% מההיצע), Timelock עם עיכוב מספק (7 ימים), multisig של Guardian עם תפקיד CANCELLER ב-TimelockController, GovernorPreventLateQuorum — מאריך את תקופת ההצבעה אם הקוורום מושג ברגע האחרון (מונע תנודות של לווייתנים ברגע האחרון).
שדרוגים דרך DAO
חוזים חכמים משודרגים דרך הצעת DAO + טיימלוק. דפוסי שדרוג: UUPS/Transparent Proxy עם ה-Governor כבעל הפרוקסי — ההצעה קוראת ל-proposalSnapshot. הטיימלוק נותן לקהילה זמן לאמת קוד חדש לפני הפעלה. אלטרנטיבה: ארכיטקטורה מודולרית ללא פרוקסי — כל מודול מוחלף דרך הממשל. פחות מסוכן משדרוג מלא.
האצלה ותיאום מחוץ לשרשרת
רוב מחזיקי הטוקנים לא מצביעים ישירות. Compound הציגה את מושג הנציג: מחזיקי טוקנים מאצילים כוח הצבעה למשתתפים ידועים (חוקרים, תורמים מרכזיים, מומחי DAO). פרופיל נציג הוא פוסט ב-Discourse/Mirror עם עמדות בנושאים מרכזיים. מיושם דרך proposalThreshold. האצלה לא מעבירה טוקנים — רק כוח הצבעה. Snapshot.org הוא הצבעה ללא גז דרך חתימת הודעה. משמש להצבעות איתות (בדיקות טמפרטורה) שאינן קשורות לפעולות על השרשרת. תהליך טיפוסי דו-שלבי: בדיקת טמפרטורה ב-Snapshot (ללא גז) → הצעה על השרשרת עם תמיכה של 60%+.
השוואת פתרונות: OZ Governor vs Governor Bravo vs מותאם אישית
| תכונה | OpenZeppelin Governor | Governor Bravo (Compound) | DAO מותאם אישית |
|---|---|---|---|
| מודולריות | גבוהה (מודולים ניתנים להחלפה) | בינונית (מוחלף דרך שדרוג) | כל שהיא |
| יעילות גז | בינונית (הרבה delegatecalls) | נמוכה (בעיקר על השרשרת) | מותאמת |
| תמיכה בתכונות | Timelock, הצבעות, שבריר קוורום | Snapshot, הצבעה מואצלת | בלתי מוגבלת |
| נבדק | מופעי ייצור רבים | Compound v2/v3 | נדרש ביקורת מלאה |
| מורכבות הגדרה | בינונית (30+ דקות) | נמוכה (תבנית) | גבוהה |
לוחות זמנים משוערים לפיתוח DAO
| שלב | DAO בסיסי | פלטפורמה מותאמת אישית |
|---|---|---|
| ניתוח ועיצוב | 1-2 ימים | 1-2 שבועות |
| פיתוח חוזים חכמים | 2-3 שבועות | 4-8 שבועות |
| אינטגרציות (Snapshot, Tally) | 1-2 שבועות | 2-4 שבועות |
| ביקורת | 2-3 שבועות | 3-6 שבועות |
| פריסה ותיעוד | שבוע אחד | 2-3 שבועות |
עלות הפיתוח תלויה במורכבות: ביקורת אבטחה יכולה לנוע בין $10,000 ל-$100,000 בהתאם להיקף הקוד ולכיסוי הבדיקות הנדרש.
תהליך העבודה שלנו
- ניתוח ועיצוב — הגדרת מודל הממשל, סוגי הצבעות, הרכב קופת האוצר.
- פיתוח חוזים חכמים — Governor, טוקן הצבעה, טיימלוק, מודולים מותאמים (סטייקינג, gauge, שוחד). אנו משתמשים ב-Solidity 0.8.x ו-Foundry לבדיקות.
- אינטגרציות — חיבור Snapshot, Tally, Boardroom, The Graph לאינדוקס.
- ביקורת — סקירה פנימית + ביקורת חיצונית (חוזים נבדקים ל-reentrancy, מניפולציית אורקל, flash loan).
- פריסה — פריסה ל-mainnet עם אימות ב-Etherscan, הגדרת multisig של Guardian.
- תיעוד והדרכה — מדריכי משתמש, תיאורי נציגים מהימנים, runbook לצוות.
- תמיכה — 30 יום לאחר ההשקה: ניטור, תיקוני באגים, ייעוץ אינטגרציה.
מה כלול
- קוד מקור של חוזים חכמים עם כיסוי בדיקות Foundry מלא.
- תיעוד ארכיטקטוני, פריסה ושימוש.
- חוזים פרוסים על mainnet (או testnet לפי בקשה).
- אינטגרציה עם Tally/Snapshot להצבעה מחוץ לשרשרת.
- תוצאות ביקורת פנימית וחיצונית.
- 30 ימי תמיכה טכנית לאחר ההשקה.
הצוות שלנו מורכב ממפתחים בכירים עם שנים של ניסיון ב-Solidity ו-Rust. השלמנו 20+ פרויקטים ועשרות ביקורות. אנו מבטיחים שקיפות בכל שלב: כל החוזים הם קוד פתוח, נבדקים על ידי חברה עצמאית, עם סקירות לאחר עדכונים. צרו קשר להערכה ראשונית של הפרויקט שלכם. קבלו ייעוץ על ארכיטקטורת ה-DAO שלכם — נעריך מורכבות ולוחות זמנים.
לפי תיעוד OpenZeppelin Governor, Governor הוא יישום הייחוס לממשל על השרשרת.
לוחות זמנים לפיתוח: DAO בסיסי עם OZ Governor ו-Timelock לוקח 2 עד 3 שבועות של פיתוח בתוספת ביקורת. פלטפורמה מלאה עם מודולים מותאמים לוקחת 3 עד 6 חודשים. התמחור נקבע באופן אישי לאחר ניתוח דרישות. צרו קשר להערכה ראשונית.







