מערכות הפצת טוקנים המונית: MerkleDrop, העברה אצווה ו-Vesting
הפצת טוקנים המונית (איירדרופ) היא פעולה שיכולה לשבור פרויקט אם ניגשים אליה בנאיביות. הנפקת עסקאות לעשרות אלפי כתובות באמצעות contract MerkleDistributor { address public immutable token; bytes32 public immutable merkleRoot; mapping(uint256 => uint256) private claimedBitMap; event Claimed(uint256 indexed index, address indexed account, uint256 amount); constructor(address token_, bytes32 merkleRoot_) { token = token_; merkleRoot = merkleRoot_; } function isClaimed(uint256 index) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = claimedBitMap[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external { require(!isClaimed(index), "Already claimed"); bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid proof" ); _setClaimed(index); IERC20(token).transfer(account, amount); emit Claimed(index, account, amount); } function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] |= (1 << claimedBitIndex); } } ישיר שורפת מיליוני דולרים על גז וסותמת בלוקים. גרוע מכך — תוקף עם מאה כתובות סייביל תובע חלק שנועד למשתמשים אמיתיים. אנו מתכננים מערכות שפותרות את שתי הבעיות: חוסכות עד 70% בגז ומסננות עד 99% מהסייבילים. הניסיון שלנו משתרע על פני 7+ שנים, עם 50+ פרויקטים שהושקו והפיצו מעל $50M+ בסך הכל.
אתגרים מרכזיים בהפצת טוקנים המונית
הבחירה בין push ל-pull קובעת גם את התקציב וגם את חוויית המשתמש. ברשת Ethereum המרכזית עם 50,000 נמענים ומחיר גז של $20/Gwei, גישת העברה ישירה תעלה $50,000+ בעמלות בלבד. בתרחיש pull, המשתמשים משלמים את הגז שלהם, אבל כדי להפוך תביעה לכדאית עבור 10,000 אנשים, יש להרתיע סייבילים. הבעיה השנייה: תוקפים יוצרים אלפי ארנקים, מבצעים פעילות מינימלית, ומקבלים חלק לא פרופורציונלי. להגנה אנו משתמשים בשילוב של מסננים על-השרשרת (גיל ארנק, היסטוריית עסקאות, נפח עמלות) ואימות מחוץ לשרשרת באמצעות Gitcoin Passport או מדיה חברתית עם חתימות. הפצה מדורגת (משתתפים מוקדמים מקבלים פי 3 יותר) הופכת התקפות סייביל לבלתי אטרקטיביות כלכלית.
Merkle drop: התקן להפצה המונית
רשימת הנמענים נארזת לעץ Merkle, ורק השורש מאוחסן על-השרשרת. משתמשים מספקים הוכחה לזכותם. זהו תקן הזהב לאיירדרופים גדולים: עלויות הגז מינימליות, וההוכחות ניתנות לאימות על-השרשרת. הנה יישום בסיסי:
contract MerkleDistributor { address public immutable token; bytes32 public immutable merkleRoot; mapping(uint256 => uint256) private claimedBitMap; event Claimed(uint256 indexed index, address indexed account, uint256 amount); constructor(address token_, bytes32 merkleRoot_) { token = token_; merkleRoot = merkleRoot_; } function isClaimed(uint256 index) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = claimedBitMap[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external { require(!isClaimed(index), "Already claimed"); bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid proof" ); _setClaimed(index); IERC20(token).transfer(account, amount); emit Claimed(index, account, amount); } function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] |= (1 << claimedBitIndex); } } שימוש במפת סיביות במקום mapping(address => bool) חוסך אחסון משמעותי, במיוחד עבור מאות אלפי נמענים. ליצירת עץ מחוץ לשרשרת אנו משתמשים בספריית OpenZeppelin MerkleProof.
כיצד Merkle drop פותר את בעיית הגז?
עץ ה-Merkle מונע אחסון של הרשימה המלאה על-השרשרת. במקום זאת, מאוחסן רק השורש (32 בתים). משתמשים מוכיחים את חלקם על ידי מתן הוכחה של כ-2–12 גיבובים. עלויות הגז לתביעה הן ~50,000 גז (≈$1 ב-20 Gwei), שזה פי עשרות פחות מאשר בגישת push. Merkle drop עולה על העברה אצווה פי 3–5 בגז עבור רשימות של 10,000 כתובות ומעלה.
כיצד אנו מתכננים את המערכת: מקרה אמיתי
עבור פרויקט DeFi גדול יישמנו סכמה היברידית: 40% מהטוקנים חולקו באמצעות Merkle drop ללא KYC, 60% באמצעות ממשק עם Gitcoin Passport. תוצאה: 92% מהכתובות המורשות תבעו בשבוע הראשון, ו-97% מהן לא מכרו ב-DEX תוך חודש. ציידי סנאפשוט הפסידו 80% מהחלק הצפוי שלהם בגלל מכפילים מדורגים.
טבלת מכפילי קטגוריות
| קטגוריה | קריטריון | מכפיל |
|---|---|---|
| משתמשי OG | עסקה ראשונה לפני >12 חודשים | 3x |
| משתמשים פעילים | >10 עסקאות ב-6 החודשים האחרונים | 2x |
| משתמשים רגילים | לפחות עסקה אחת ב-3 החודשים האחרונים | 1x |
| ציידי סנאפשוט | עסקה בשבועיים האחרונים | 0.5x |
לתרחישי push (פיצוי לאחר ניצול, תגמולים רטרואקטיביים) אנו משתמשים בהעברות אצווה עם קבוצות של 200–500 כתובות. גודל הקבוצה האופטימלי מחושב מול מגבלת הגז של הבלוק: ב-Polygon זה 600–800 כתובות, ב-Ethereum 250–300.
function disperseToken( IERC20 token, address[] calldata recipients, uint256[] calldata amounts ) external { uint256 total = 0; for (uint256 i = 0; i < amounts.length; i++) { total += amounts[i]; } token.transferFrom(msg.sender, address(this), total); for (uint256 i = 0; i < recipients.length; i++) { token.transfer(recipients[i], amounts[i]); } } השוואת גישות
| גישה | גז (פרויקט) | חוויית משתמש | עמידות לסייביל |
|---|---|---|---|
| Push | גבוה מאוד | גבוהה | אין |
| Pull (אצווה) | בינוני | בינונית | אין |
| Merkle drop | נמוך | בינונית | אפשרית |
Vesting: הגנה מלחץ מחירים
עבור צוותים ומשקיעים אנו משלבים תביעות המוניות עם VestingWallets אישיים. בעת התביעה, נפרס חוזה עם לוח זמנים (cliff + vesting ליניארי). זה מונע לחץ מכירות על המחיר. עלות הגז של פריסת כל חוזה vesting מקוזזת בכך שמשתמשים משלמים על התביעה שלהם. Vesting מחלק את השחרור לאורך זמן. לדוגמה, cliff של 3 חודשים ואחריו vesting ליניארי על פני 12 חודשים. זה מפחית תנודתיות ומעודד החזקה ארוכת טווח.
כיצד אנו בונים את עץ ה-Merkle: שלב אחר שלב
תהליך שלב אחר שלב
- איסוף רשימות כתובות וסכומים ממסד הנתונים (CSV או סקריפט).
- בניית עץ ה-Merkle באמצעות ספריית OpenZeppelin MerkleProof (ethers.js או Foundry).
- פריסת חוזה MerkleDistributor עם שורש העץ וכתובת הטוקן.
- פרסום העץ ב-IPFS או באתר להורדת הוכחות.
- משתמשים תובעים טוקנים על ידי מתן ההוכחה שלהם.
מה כלול בעבודה שלנו
- ניתוח דרישות: רשימת נמענים, קטגוריות, תנאי vesting, שיטת הגנת סייביל.
- עיצוב ארכיטקטוני: Merkle drop או העברה אצווה, L1 או L2.
- פיתוח חוזים חכמים: Solidity 0.8.x, Foundry, בדיקות יחידה, בדיקות fork, fuzzing.
- יצירת עץ Merkle: מחוץ לשרשרת באמצעות ethers.js, עם אימות הוכחות.
- ביקורת אבטחה: Slither, Mythril, Echidna — חיפוש reentrancy, התנגשויות אחסון, דליפות גז.
- פריסה באמצעות multi-sig: נעילה זמנית של 24 שעות לאפשרות rollback.
- ניטור: Tenderly ו-Dune — אחוז תביעות, כתובות צלפים, שימור.
- תיעוד מלא ומדריך מנהל כלול.
- תמיכה שוטפת לחודש הראשון לאחר ההשקה.
לוחות זמנים ותקציב
מחלק Merkle בסיסי עם חזית (React + RainbowKit) — 3–4 שבועות, החל מ-$15,000. מערכת מלאה עם הגנת סייביל, הפצה מדורגת, vesting ולוח מחוונים — 2–3 חודשים, בדרך כלל $40,000–$80,000. העלות מחושבת באופן אישי. צרו קשר כדי להעריך את הפרויקט שלכם. קבלו ייעוץ על הארכיטקטורה. אנו מבטיחים חוזים מבוקרים ומותאמי גז עם רקורד מוכח — מעל 7 שנות ניסיון בלוקצ'יין ו-50+ הפצות מוצלחות.







