פיתוח חוזי DAO: Governor, Timelock, הצבעה

ניהול DAO דורש מנגנוני הצבעה וביצוע אמינים — טעויות כאן עולות ביוקר. אנחנו מפתחים חוזי DAO עם Governor, Timelock ומערכת הצבעה, ומספקים את הפרויקט במפתח מלא. הצוות שלנו מבטיח ממשל מאובטח ושקוף, עם תמיכה מתמשכת וביקורת.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

DAO על הנייר נראה פשוט: טוקנים = קולות, רוב מחליט. בפועל, זה אחד התחומים המורכבים ביותר בחוזים חכמים—לא כי הקוד קשה במיוחד, אלא כי המחיר של שגיאה במכניקת ממשל הוא קטסטרופלי. הצעה עוברת עם באג בלוגיקת קוורום, ותוקף מרוקן את האוצר. זה קרה עם Beanstalk, שם מתקפת ממשל באמצעות הלוואת פלאש גנבה 182 מיליון דולר.תקרית Beanstalk פיתוח חוזי DAO עוסק בתכנון מערכת קבלת החלטות מאובטחת כלכלית. אנו מספקים שירות סוהר: מעיצוב מודל כלכלי ועד ביקורת והשקה. הניסיון שלנו: מעל 10 שנים בפיתוח בלוקצ'יין, מעל 50 פרויקטים מוצלחים, כולל אינטגרציה עם OpenZeppelin Governor ו-SafeSnap. אנו מבטיחים ביקורות על ידי חברות מובילות.

ארגון אוטונומי מבוזר

איך ארכיטקטורת DAO עובדת

Governor + Timelock

הסטנדרט דה פקטו הוא OpenZeppelin Governor עם TimelockController. Governor מנהל את מחזור חיי ההצעה (יצירה, הצבעה, תיאום), בעוד Timelock מוסיף עיכוב בין אישור ההצעה לביצועה.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";

contract DAOGovernor is
    Governor,
    GovernorSettings,
    GovernorCountingSimple,
    GovernorVotes,
    GovernorVotesQuorumFraction,
    GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("DAO Governor")
        GovernorSettings(
            1, // votingDelay: 1 блок (~12 сек на Ethereum)
            50400, // votingPeriod: ~7 дней в блоках
            100_000e18 // proposalThreshold: минимум 100K токенов для proposal
        )
        GovernorVotes(_token)
        GovernorVotesQuorumFraction(10) // 10% от total supply = кворум
        GovernorTimelockControl(_timelock)
    {}

    function quorum(uint256 blockNumber)
        public
        view
        override(Governor, GovernorVotesQuorumFraction)
        returns (uint256)
    {
        return super.quorum(blockNumber);
    }

    function state(uint256 proposalId)
        public
        view
        override(Governor, GovernorTimelockControl)
        returns (ProposalState)
    {
        return super.state(proposalId);
    }

    function _execute(
        uint256 proposalId,
        address[] memory targets,
        uint256[] memory values,
        bytes[] memory calldatas,
        bytes32 descriptionHash
    )
        internal
        override(Governor, GovernorTimelockControl)
    {
        super._execute(proposalId, targets, values, calldatas, descriptionHash);
    }

    function _cancel(
        address[] memory targets,
        uint256[] memory values,
        bytes[] memory calldatas,
        bytes32 descriptionHash
    )
        internal
        override(Governor, GovernorTimelockControl)
        returns (uint256)
    {
        return super._cancel(targets, calldatas, descriptionHash);
    }

    function _executor()
        internal
        view
        override(Governor, GovernorTimelockControl)
        returns (address)
    {
        return super._executor();
    }
}

הגדרת TimelockController

Timelock הוא רכיב קריטי. הוא נותן לקהילה זמן להגיב להצעה מאושרת לפני ביצועה. עיכוב מינימלי לפעולות אוצר הוא 48 שעות, ולשדרוגי חוזים 72 שעות.

// Деплой TimelockController
// minDelay: 172800 (48 часов в секундах)
// proposers: [address(governor)]
// executors: [address(0)] — любой может исполнить после задержки
// admin: address(0) — нет суперадмина, только через Timelock
TimelockController timelock = new TimelockController(
    172800,
    proposers, // только Governor может ставить в очередь
    executors, // address(0) = любой может исполнить
    address(0) // admin revoked
);

// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/governance/Governor.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; contract DAOGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { constructor( IVotes _token, TimelockController _timelock ) Governor("DAO Governor") GovernorSettings( 1, // votingDelay: 1 блок (~12 сек на Ethereum) 50400, // votingPeriod: ~7 дней в блоках 100_000e18 // proposalThreshold: минимум 100K токенов для proposal ) GovernorVotes(_token) GovernorVotesQuorumFraction(10) // 10% от total supply = кворум GovernorTimelockControl(_timelock) {} function quorum(uint256 blockNumber) public view override(Governor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) { return super.state(proposalId); } function _execute(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) internal override(Governor, GovernorTimelockControl) { super._execute(proposalId, targets, values, calldatas, descriptionHash); } function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) internal override(Governor, GovernorTimelockControl) returns (uint256) { return super._cancel(targets, calldatas, descriptionHash); } function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { return super._executor(); } } פירושו שכל אחד יכול לבצע את הפעולה לאחר העיכוב—זה נכון. אחרת, כתובת ספציפית תיצור נקודת ריכוזיות שחייבת ללחוץ על "בצע".

מחזור חיי הצעה

Pending → Active → Succeeded/Defeated → Queued → Executed ↓ Canceled 
  • ממתינה: ההצעה נוצרה, מחכה ל-blocks של votingDelay. תמונת הצבעה נלקחת ב-block האחרון לפני המעבר לפעילה.
  • פעילה: ההצבעה פתוחה ל-blocks של votingPeriod. אפשרויות הצבעה: בעד, נגד, נמנע.
  • הצליחה: הושג קוורום, בעד > נגד.
  • בתור: בתור של Timelock, מחכה ל-minDelay. בתקופה זו, Guardian (אם קיים) יכול לבטל.
  • בוצעה: בוצעה על השרשרת.

איך להגן מפני מתקפות הלוואת פלאש

התרחיש של Beanstalk: תוקף לוקח הלוואת פלאש בסכום ענק, משיג שליטה זמנית בממשל (delegateVote למשקל ממשל), יוצר ומעביר מיד הצעה זדונית, ואז מחזיר את ההלוואה—הכל בעסקה אחת.

הגנה מרכזית: תזמון תמונת הצבעה. // Деплой TimelockController // minDelay: 172800 (48 часов в секундах) // proposers: [address(governor)] // executors: [address(0)] — любой может исполнить после задержки // admin: address(0) — нет суперадмина, только через Timelock TimelockController timelock = new TimelockController( 172800, proposers, // только Governor может ставить в очередь executors, // address(0) = любой может исполнить address(0) // admin revoked ); משתמש ב-executors: [address(0)]—משקל ההצבעה נקבע ב-block של התמונה, לא ב-block של ההצבעה. Pending → Active → Succeeded/Defeated → Queued → Executed ↓ Canceled (block אחד) כבר שובר את מתקפת הלוואת הפלאש: אי אפשר לשאול טוקנים ולהשתמש בהם באותו block לתמונה. אמצעים נוספים: עיכוב Timelock (48-72 שעות), סף הצעות (יתרה מינימלית ליצירת הצעות), וקוורום קשור להיצע הכולל.

אילו מודלי הצבעה לבחור?

שלושה מודלים עיקריים: הצבעה משוקללת טוקנים, ריבועית, ואופטימית. הצבעה משוקללת טוקנים פשוטה וצפויה, אבל מחזיקים גדולים שולטים. הצבעה ריבועית שוויונית יותר—עלות N קולות היא N²—אבל דורשת התנגדות ל-Sybil. ממשל אופטימי מבצע הצעות אוטומטית אלא אם יש וטו, ומפחית אדישות מצביעים.

הצבעה משוקללת טוקנים על L2 (Arbitrum, Optimism) עולה פי 10 פחות מאשר על L1, בעוד ריבועית רק פי 2 יותר יקרה מהצבעה פשוטה.

פרמטר משוקללת טוקנים ריבועית אופטימית
מהירות החלטה גבוהה בינונית מיידית
עמידות לשליטת מחזיקים גדולים נמוכה גבוהה בינונית
מורכבות יישום נמוכה גבוהה (דורש Sybil) בינונית
עלות גז על L1 $5-20 $10-40 $2-5 (off-chain)
פרמטר ערך מומלץ הערה
votingDelay block אחד הגנה מהלוואת פלאש
votingPeriod 50400 blocks (~7 ימים) מספיק לקהילה גלובלית
proposalThreshold 100,000 טוקנים מפחית ספאם
quorum 10% מההיצע הכולל איזון בין בטיחות למעבר

איך עובד Guardian מרובה חתימות?

ממשל מלא על השרשרת פגיע בשלבים מוקדמים: מעט טוקנים במחזור, אחוזי הצבעה נמוכים, קל לתמרן. נוהג סטנדרטי—Guardian מרובה חתימות (Gnosis Safe 3/5 או 4/7) שיכול לבטל הצעות בתור, אבל לא יכול ליזום או לבצע אותן.

// В TimelockController: CANCELLER_ROLE для Guardian Safe timelock.grantRole(timelock.CANCELLER_ROLE(), guardianSafe); 

ל-Guardian לא צריך להיות PROPOSER_ROLE או EXECUTOR_ROLE—רק CANCELLER. זה יוצר הגנה אסימטרית: Guardian מגן מפני מתקפות אבל לא שולט בממשל. ככל שהקהילה גדלה, Guardian מוסר בהדרגה.

תת-DAOs וועדות מתמחות

Governor מונוליטי לכל ההחלטות הוא אנטי-דפוס. מבנה רב-רמות טיפוסי: Governor של DAO ליבה (החלטות מרכזיות, הצבעה של 7-14 ימים), ועדת אוצר (פעולות מהירות < $100K), ועדה טכנית (ביקורת, השבתת חירום), ועדת מענקים (תקציב $5-20K, הצבעה off-chain דרך Snapshot).

הצבעה ללא גז באמצעות EIP-712

הבעיה המרכזית של הצבעה על השרשרת היא עלות הגז. ברשת Ethereum הראשית, הצבעה אחת עולה $5-20. רוב ה-DAOs פותרים זאת עם הצבעה off-chain (Snapshot) וביצוע על השרשרת. גישה היברידית: הצבעה ב-Snapshot (חינם, חתימת EIP-712), תוצאה מבוצעת דרך SafeSnap. להצבעה על השרשרת ב-L2 (Arbitrum, Optimism, Base), הגז כבר מקובל—$0.05-0.50 לעסקה.

מה כלול

  • עיצוב מודל ממשל: פרמטרים, ועדות, תוכנית Guardian.
  • פיתוח חוזים חכמים: Governor, Timelock, טוקן, בדיקות תרחישי מתקפה.
  • סקירת אבטחה פנימית ואימות פורמלי של המודולים הקריטיים ביותר.
  • ביקורת חיצונית (אופציונלי—עם ההמלצה שלנו לחברות מובילות).
  • אינטגרציה עם Snapshot, Tally.xyz, SafeSnap.
  • תיעוד: מפרט טכני, runbook פריסה, תיאור נהלי חירום.
  • הדרכת צוות: איך ליצור הצעות, לפרש תוצאות, להגיב לאירועים.
  • תמיכה לאחר השקה: ניטור, עדכונים כשהסטנדרטים משתנים (EIP).

תהליך

  1. עיצוב ממשל (1-2 שבועות). הגדרת מודל הצבעה, פרמטרים, מבנה ועדות, תוכנית Guardian.
  2. פיתוח חוזים (2-3 שבועות). Governor + Timelock + טוקן ממשל + בדיקות תרחישי מתקפה.
  3. אבטחה (1-2 שבועות). סקירה פנימית של כל התרחישים, בדיקות הלוואת פלאש.
  4. ביקורת (2-3 שבועות). ביקורת חיצונית היא חובה.
  5. חזית ואינטגרציה (2-3 שבועות). Tally.xyz, Snapshot, SafeSnap.
  6. השקה הדרגתית. התחילו עם Guardian מרובה חתימות, הפחיתו ריכוזיות לפי מפת הדרכים.

מחזור מלא: 3-4 חודשים. העלות מחושבת באופן אישי לפי מורכבות מודל הממשל וזמינות טוקן קיים. אופטימיזציית גז יכולה לחסוך עד 30%, והפחתת עלות ביקורת עד 20% בזכות ההכנה שלנו.

מוכנים להתחיל? צרו קשר לדיון מפורט ב-DAO שלכם.

עוד על תמיכה לאחר השקהאנו מספקים ניטור ועדכוני חוזים כשהסטנדרטים משתנים.

קבלו ייעוץ: צרו קשר כדי לדון בפרויקט שלכם—נעריך אותו בחינם ונציע פתרון אופטימלי. הזמינו פיתוח חוזי DAO עם ערבות ביקורת והניסיון שלנו של 10+ שנים.