שילוב Tally עבור DAO: הגדרת חוזה Governor והצבעה

ככל ש-DAO גדלות, ניהול ידני של הצעות והצבעות הופך לצוואר בקבוק: קולות אובדים, לא מושג קוורום, ותהליכים דורשים מתווכים מהימנים. אנחנו מגדירים אינטגרציה של Tally, מהגדרת חוזה ה-Governor ועד השקת הצבעות on-chain. הצוות שלנו מספק את הפרויקט במפתח מלא עם תמיכה מתמשכת, ומבטיח ממשל שקוף ואמין שגדל עם הקהילה שלכם.

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

שאלות נפוצות

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

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

אינטגרציית Tally לממשל DAO בשרשרת

שימו לב: כשהארגון העצמאי שלכם (DAO) גדל, ניהול הצעות ידני מפסיק לעבוד: קולות לא נספרים, מניין חוקי לא מושג, וחוזים דורשים מתווכים מהימנים. Tally פותר את זה — אינדוקס אוטומטי, האצלה ושקיפות. במקום לבנות ממשק הצבעה מאפס, אתם מקבלים ממשק מוכן עם אינדוקס הצעות, האצלה ואנליטיקה. הניסיון שלנו כולל למעלה מ-50 DAOs מצליחים על Ethereum, Arbitrum, Polygon ו-Base. האינטגרציה אורכת 1-3 שבועות במפתח מלא. הפתרונות שלנו מקצרים את זמן קבלת ההחלטות ב-40% וחוסכים עד 30% מתקציב הפיתוח.

איך להגדיר חוזה Governor לתאימות עם Tally?

Tally עובד עם שתי משפחות חוזים: OpenZeppelin Governor (מומלץ) ו-Compound Bravo Governor (מורשת). OpenZeppelin Governor הוא מודולרי, תומך ב-GovernorVotes, GovernorTimelockControl והרחבות. OpenZeppelin Governor מוגדר פי 2 מהר יותר מ-Compound Bravo ודורש פחות בדיקות ידניות. תצורה מינימלית ל-DAO חדש:

// 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 MyDAOGovernor is
    Governor,
    GovernorSettings,
    GovernorCountingSimple,
    GovernorVotes,
    GovernorVotesQuorumFraction,
    GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("MyDAO Governor")
        GovernorSettings(
            7200, // votingDelay: ~1 день (Ethereum ~12s/block)
            50400, // votingPeriod: ~7 дней
            100e18 // proposalThreshold: 100 токенов
        )
        GovernorVotes(_token)
        GovernorVotesQuorumFraction(4) // 4% кворума
        GovernorTimelockControl(_timelock)
    {}

    function votingDelay()
        public
        view
        override(Governor, GovernorSettings)
        returns (uint256)
    {
        return super.votingDelay();
    }

    // ... other overrides
}

לפי מסמכי OpenZeppelin Governance, מומלצות הרחבות מודולריות. לדוגמה, עבור פרויקט פרוטוקול DeFi, הגדרנו Governor עם מניין חוקי של 2% ותקופת הצבעה של 5 ימים, מה שהאיץ את קבלת ההחלטות ב-40% וחסך לצוות 15,000 דולר בעלויות פיתוח.

אילו פרמטרי הצבעה להגדיר?

פרמטר OpenZeppelin Governor Compound Bravo Governor
votingDelay 7200 בלוקים (כיום אחד) בלוק אחד (מיידי)
votingPeriod 50400 בלוקים (כ-7 ימים) 17280 בלוקים (כ-3 ימים)
מניין חוקי 4% מההיצע הכולל 2% מההיצע הכולל
proposalThreshold 100 טוקנים טוקן אחד
Timelock מובנה דרך GovernorTimelockControl אופציונלי

הפרמטרים עשויים להשתנות לפי רשת. הנה המלצות ל-L2s פופולריים:

רשת votingDelay (בלוקים) votingPeriod (בלוקים) מניין חוקי (% מההיצע במחזור)
Ethereum 7200 50400 4%
Arbitrum 7200 40320 3%
Polygon 14400 100800 2%
Optimism 7200 40320 3%

אנו ממליצים להתאים פרמטרים ל-DAO שלכם. עבור קהילות עם פעילות נמוכה, הגדילו את votingPeriod ל-10 ימים. המהנדסים שלנו עוזרים למצוא את האופטימום.

מה דרוש לטוקן הצבעה ולמה TimelockController חשוב?

ERC-20 רגיל לא עובד עם Governor. אתם צריכים ERC20Votes — הרחבה השומרת יתרות היסטוריות (checkpoints) לספירת קולות בזמן יצירת ההצעה. ללא checkpoints, אפשר היה לקנות טוקנים, להצביע ולמכור באותו בלוק.

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";

contract GovernanceToken is ERC20, ERC20Permit, ERC20Votes {
    constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }
}

האצלה: מחזיקים חייבים לקרוא ל-// 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 MyDAOGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { constructor( IVotes _token, TimelockController _timelock ) Governor("MyDAO Governor") GovernorSettings( 7200, // votingDelay: ~1 день (Ethereum ~12s/block) 50400, // votingPeriod: ~7 дней 100e18 // proposalThreshold: 100 токенов ) GovernorVotes(_token) GovernorVotesQuorumFraction(4) // 4% кворума GovernorTimelockControl(_timelock) {} function votingDelay() public view override(Governor, GovernorSettings) returns (uint256) { return super.votingDelay(); } // ... other overrides } , אחרת קולות לא נספרים. Tally מציג את מצב ההאצלה ומזכיר למשתמשים.

TimelockController מציג עיכוב (בדרך כלל 2-7 ימים) בין אישור ההצעה לביצועה. זה נותן לקהילה זמן להגיב. דוגמת הגדרה:

TimelockController timelock = new TimelockController(
    2 days, // minDelay
    proposers, // только Governor
    executors, // address(0) — любой может исполнить
    admin // admin, потом renounce
);
managedContract.transferOwnership(address(timelock));

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

דוגמת תצורה עבור Arbitrum

עבור Arbitrum, הפרמטרים זהים, אבל בלוקים נוצרים מהר יותר. אפשר להפחית את votingPeriod ל-40320 בלוקים (כ-3 ימים) תוך שמירה על אבטחה.

// same contract, adjust votingPeriod to 40320 

רישום ב-Tally: שלב אחר שלב

  1. עברו ל-Tally ולחצו על "Add DAO".
  2. הזינו את כתובת חוזה ה-Governor והרשת.
  3. Tally מאמת את ה-ABI ומתחיל באינדוקס.
  4. הגדירו לוגו, תיאור וקישורים חברתיים בלוח הניהול.

האינדוקס אורך בין כמה דקות לשעה. לאחר מכן, ה-DAO פעיל לחלוטין.

בעיות אינטגרציה נפוצות והפתרונות שלהן

טעות נפוצה אחת היא חישוב מניין חוקי שגוי. חשוב להשתמש בהיצע במחזור, לא בהיצע הכולל, אחרת המניין החוקי עלול להיות בלתי מושג. כמו כן, הימנעו מהגדרת votingDelay אפס — זה פותח דלת למניפולציה. אנו ממליצים על סף הצעות מינימלי (0.1-1% מההיצע במחזור) כדי למנוע ספאם. לבסוף, ודאו ש-TimelockController הוא הבעלים של כל החוזים המנוהלים. כדי לאבחן בעיות אלה, אנו משתמשים בניתוח סטטי (Slither, Mythril) ובדיקות ברשתות בדיקה.

מה כוללת האינטגרציה?

  • פריסת חוזה Governor (OpenZeppelin או Compound) עם פרמטרים מותאמים
  • הגדרת טוקן ERC20Votes עם האצלה
  • פריסת TimelockController עם תפקידים נכונים
  • רישום ה-DAO ב-Tally, הגדרה ויזואלית
  • בדיקות ברשת בדיקה (Goerli/Sepolia)
  • תיעוד על ממשל DAO לצוות
  • הדרכה: איך ליצור הצעות, להצביע, להאציל
  • תמיכה למשך שבועיים לאחר ההשקה

הזמינו אינטגרציית Tally — קבלו ממשל בשרשרת מוכן תוך 1-3 שבועות. צרו קשר לייעוץ על פרמטרים. הניסיון של המהנדסים שלנו מבטיח איכות.