מפיץ מרקל לחוזי איירדרופ

הפצת טוקנים באמצעות לולאה על-רשת הופכת לעשרות אלפי עסקאות ולעלויות גז גבוהות. אנחנו מפתחים חוזי איירדרופ המבוססים על Merkle distributor, כאשר כל מקבל תובע את הטוקנים בעצמו, ואתם משלמים רק על הגדרת ה-root. הצוות שלנו מספק פתרון turnkey עם הגנה מפני התקפות, deadline ו-vesting, המבטיח אמינות ותמיכה מתמשכת.

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

שאלות נפוצות

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

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

פיתוח חוזה איירדרופ באמצעות 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 ~דקה

תהליך העבודה שלנו

  1. ניתוח – דיון ברשימת הכתובות, הטוקן, L1/L2, צורך ב-vesting, מועד אחרון.
  2. עיצוב – בחירת מבנה עץ Merkle, כתיבת מפרט החוזה.
  3. פיתוח – כתיבת החוזה באמצעות OpenZeppelin, סקריפטים off-chain, API.
  4. בדיקות – בדיקות יחידה, fuzzing (Echidna), סימולציה ב-Tenderly.
  5. פריסה – לרשת הנבחרת, אימות החוזה, תביעת בדיקה.
  6. תמיכה – ניטור, סיוע למשתמשים בבעיות תביעה.

מה כלול

  • חוזה חכם (Merkle distributor עם מועד אחרון/vesting אופציונליים)
  • מחולל עץ Merkle off-chain + סקריפטים ב-TypeScript
  • API להפצת הוכחות (Fastify/Express)
  • דוגמת אינטגרציה ל-UI (React + viem)
  • תיעוד פריסה ותפעול
  • שבועיים של תמיכה לאחר ההשקה

אנו משתמשים ב-Echidna ל-fuzzing של החוזה, בדיקת תקינות ההוכחות, מניעת תביעות כפולות ומגבלות גז. סימולציה ב-Tenderly מאפשרת לנו לשחזר כל עסקה לפני הפריסה.

לוח זמנים ותמחור

יישום סטנדרטי מסוג turnkey אורך בין שבוע לשבועיים. התמחור מחושב באופן אישי לפי אפשרויות (vesting, תביעה ללא גז, UI מותאם). אנו מעריכים את הפרויקט שלכם ביום עסקים אחד – פשוט כתבו לנו, ונכין הצעה.

דוגמת פירוט עלויות Merkle distributor בסיסי עם מועד אחרון: $5,000 הוספת vesting: +$3,000 תביעה ללא גז: +$2,000 UI מותאם: +$4,000