אינטגרציית 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: שלב אחר שלב
- עברו ל-Tally ולחצו על "Add DAO".
- הזינו את כתובת חוזה ה-Governor והרשת.
- Tally מאמת את ה-ABI ומתחיל באינדוקס.
- הגדירו לוגו, תיאור וקישורים חברתיים בלוח הניהול.
האינדוקס אורך בין כמה דקות לשעה. לאחר מכן, ה-DAO פעיל לחלוטין.
בעיות אינטגרציה נפוצות והפתרונות שלהן
טעות נפוצה אחת היא חישוב מניין חוקי שגוי. חשוב להשתמש בהיצע במחזור, לא בהיצע הכולל, אחרת המניין החוקי עלול להיות בלתי מושג. כמו כן, הימנעו מהגדרת votingDelay אפס — זה פותח דלת למניפולציה. אנו ממליצים על סף הצעות מינימלי (0.1-1% מההיצע במחזור) כדי למנוע ספאם. לבסוף, ודאו ש-TimelockController הוא הבעלים של כל החוזים המנוהלים. כדי לאבחן בעיות אלה, אנו משתמשים בניתוח סטטי (Slither, Mythril) ובדיקות ברשתות בדיקה.
מה כוללת האינטגרציה?
- פריסת חוזה Governor (OpenZeppelin או Compound) עם פרמטרים מותאמים
- הגדרת טוקן ERC20Votes עם האצלה
- פריסת TimelockController עם תפקידים נכונים
- רישום ה-DAO ב-Tally, הגדרה ויזואלית
- בדיקות ברשת בדיקה (Goerli/Sepolia)
- תיעוד על ממשל DAO לצוות
- הדרכה: איך ליצור הצעות, להצביע, להאציל
- תמיכה למשך שבועיים לאחר ההשקה
הזמינו אינטגרציית Tally — קבלו ממשל בשרשרת מוכן תוך 1-3 שבועות. צרו קשר לייעוץ על פרמטרים. הניסיון של המהנדסים שלנו מבטיח איכות.







