פיתוח חוזה איירדרופ באמצעות Merkle Distributor
לעתים קרובות אנו רואים את הטעות הקלאסית – ניסיון לחלק טוקנים באמצעות לולאה עם שליחה on-chain לכל כתובת. עם 10,000 נמענים, מדובר ב-10,000 עסקאות, עשרות אלפי דולרים בגז, ושעות רבות של עבודה. הצוות שלנו, עם ניסיון של למעלה מ-5 שנים בפיתוח בלוקצ'יין ו-50+ פרויקטי השקת טוקנים, ממליץ על גישה אחרת – Merkle distributor. אתם מגדירים את שורש ה-Merkle על הרשת פעם אחת, וכל נמען תובע את הטוקנים שלו בנפרד, ומשלם רק על ההכללה שלו. זה מפחית את חשבון הגז שלכם במאות מונים – Merkle distributor חוסך עד 99% מהגז בהשוואה להעברות ישירות. ספריית הבסיס ליישום היא OpenZeppelin MerkleProof.
בעיות שאנו פותרים
- גז מופרז לרשימות גדולות. איירדרופ on-chain ל-50,000 כתובות יכול לעלות >$20,000 בגז בלבד. ה-Merkle distributor שלנו חסך ללקוח אחד 99% מהעלות: מ-$25,000 לפחות מ-$250.
- פגיעות ל-second preimage attack. אנו משתמשים בעלה עם hash כפול כמו ב-OpenZeppelin, מה שחוסם לחלוטין את ההתקפה.
- נעילת טוקנים ללא מועד אחרון. אנו מוסיפים מועד אחרון עם אפשרות לשחזור טוקנים שנותרו לבעלים.
- חוסר ב-vesting. אנו מטמיעים vesting ליניארי ישירות לתוך ה-distributor.
השוואת גישות לאיירדרופ
| פרמטר | לולאה on-chain | Merkle distributor |
|---|---|---|
| עסקאות | N (כל נמען – קריאה נפרדת) | 1 (הגדרת שורש) + N (כל תביעה – משולם על ידי הנמען) |
| גז (10,000 משתמשים, רשת ETH) | ~30 ETH | ~0.1 ETH (עבור השורש) + ~0.02 ETH לכל משתמש |
| זמן ביצוע | שעות | דקות (לאחר פריסה) |
| אבטחה | תלוי בגז | ספריית MerkleProof מוכחת |
מקדם חיסכון בגז הוא עד פי 300 עבור 10,000 כתובות, שיפור משמעותי עבור צוותים עם תקציבי השקת טוקנים מוגבלים.
איך ה-Merkle Distributor עובד
מעבר ל-L2 מפחית עוד יותר את עלויות הגז: ב-Arbitrum או Base, תביעה עולה אגורות, לא דולרים. צרו קשר לקבלת הערכה מפורטת עבור הקהל שלכם.
הערבויות והניסיון שלנו
אנחנו צוות מנוסה עם למעלה מ-5 שנים בפיתוח בלוקצ'יין ו-50+ פרויקטי השקת טוקנים שנבדקו על ידי Certik ו-Consensys Diligence. אנו מציעים אחריות על החוזים שלנו ומספקים תמיכה לאחר ההשקה.
איך אנחנו עושים את זה
אנו משתמשים בטכנולוגיות מוכחות: Solidity 0.8.x + ספריות OpenZeppelin (MerkleProof, ERC20), עבור off-chain – TypeScript + @openzeppelin/merkle-tree. אנו פורסים על Ethereum L1 או L2 (Arbitrum, Base, Optimism) לפי בחירתכם. דוגמת יישום עם bit packing למצב תביעה:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
contract MerkleAirdrop {
IERC20 public immutable token;
bytes32 public immutable merkleRoot;
mapping(uint256 => uint256) private claimedBitMap;
constructor(address _token, bytes32 _merkleRoot) {
token = IERC20(_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 leaf = keccak256(bytes.concat(
keccak256(abi.encode(index, account, amount))
)); // Double-hash против second preimage attack
require(
MerkleProof.verify(merkleProof, merkleRoot, leaf),
"Invalid proof"
);
_setClaimed(index);
require(token.transfer(account, amount), "Transfer failed");
emit Claimed(index, account, amount);
}
} יצירת עץ Merkle Off-Chain
import { StandardMerkleTree } from "@openzeppelin/merkle-tree"
const values = [
[0, "0xAddress1...", ethers.parseEther("100")],
[1, "0xAddress2...", ethers.parseEther("250")],
]
const tree = StandardMerkleTree.of(values, ["uint256", "address", "uint256"])
console.log("Merkle Root:", tree.root)
for (const [i, v] of tree.entries()) {
if (v[1] === "0xAddress1...") {
const proof = tree.getProof(i)
}
}
import fs from "fs"
fs.writeFileSync("tree.json", JSON.stringify(tree.dump()))
אתם מפיצים הוכחות דרך API פשוט: // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract MerkleAirdrop { IERC20 public immutable token; bytes32 public immutable merkleRoot; mapping(uint256 => uint256) private claimedBitMap; constructor(address _token, bytes32 _merkleRoot) { token = IERC20(_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 leaf = keccak256(bytes.concat( keccak256(abi.encode(index, account, amount)) )); // Double-hash против second preimage attack require( MerkleProof.verify(merkleProof, merkleRoot, leaf), "Invalid proof" ); _setClaimed(index); require(token.transfer(account, amount), "Transfer failed"); emit Claimed(index, account, amount); } } → מחזיר keccak256(bytes.concat(keccak256(abi.encode(...)))). ניתן ליישם את ה-API עם Fastify או Express – קוד טיפוסי הוא כ-50 שורות.
למה לבחור L2 לאיירדרופ?
ברשת Ethereum הראשית, תביעה עולה ~$2–10 לעסקה. ב-Arbitrum, Base או Optimism – אגורות. אם הקהל שלכם המוני, L2 מוריד את חסם הכניסה. אנו עוזרים לבחור את ה-rollup המתאים ולהגדיר את גשר הטוקנים.
| רשת | עלות תביעה ממוצעת | זמן אישור |
|---|---|---|
| Ethereum L1 | $2–10 | ~15 שניות |
| Arbitrum | $0.01–0.05 | ~דקה |
| Base | $0.01–0.03 | ~שנייה |
| Optimism | $0.01–0.05 | ~דקה |
תהליך העבודה שלנו
- ניתוח – דיון ברשימת הכתובות, הטוקן, L1/L2, צורך ב-vesting, מועד אחרון.
- עיצוב – בחירת מבנה עץ Merkle, כתיבת מפרט החוזה.
- פיתוח – כתיבת החוזה באמצעות OpenZeppelin, סקריפטים off-chain, API.
- בדיקות – בדיקות יחידה, fuzzing (Echidna), סימולציה ב-Tenderly.
- פריסה – לרשת הנבחרת, אימות החוזה, תביעת בדיקה.
- תמיכה – ניטור, סיוע למשתמשים בבעיות תביעה.
מה כלול
- חוזה חכם (Merkle distributor עם מועד אחרון/vesting אופציונליים)
- מחולל עץ Merkle off-chain + סקריפטים ב-TypeScript
- API להפצת הוכחות (Fastify/Express)
- דוגמת אינטגרציה ל-UI (React + viem)
- תיעוד פריסה ותפעול
- שבועיים של תמיכה לאחר ההשקה
אנו משתמשים ב-Echidna ל-fuzzing של החוזה, בדיקת תקינות ההוכחות, מניעת תביעות כפולות ומגבלות גז. סימולציה ב-Tenderly מאפשרת לנו לשחזר כל עסקה לפני הפריסה.
לוח זמנים ותמחור
יישום סטנדרטי מסוג turnkey אורך בין שבוע לשבועיים. התמחור מחושב באופן אישי לפי אפשרויות (vesting, תביעה ללא גז, UI מותאם). אנו מעריכים את הפרויקט שלכם ביום עסקים אחד – פשוט כתבו לנו, ונכין הצעה.







