מערכת חסימת כתובות חשודות ל-DeFi ו-CEX

כאשר פרוטוקול DeFi מפסיד מיליונים עקב אינטראקציה עם כתובת מוסנקציה, מחיר העיכוב הופך קריטי. אנו מפתחים מערכת לחסימת כתובות חשודות הבודקת כל בקשה בזמן אמת, תוך שילוב נתונים מ-OFAC, Chainalysis ומקורות נוספים. הצוות שלנו מספק את הפרויקט במפתח מלא—מביקורת ועד הטמעה ותמיכה שוטפת—ומבטיח הגנה אמינה לפלטפורמה שלך ללא פספוס מועדים.

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

שאלות נפוצות

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

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

נתקלנו במצב שבו פרוטוקול DeFi איבד סכום גדול של כספים עקב אינטראקציה עם כתובת שנוספה לרשימת הסנקציות של OFAC רק 40 דקות לאחר הפרסום. מערכת חסימת הכתובות החשודות שלנו חייבת לבדוק כל בקשה מול הרשימה השחורה העדכנית עם זמן השהיה של <10ms ותפוקה של עד 10,000 rps. אנו בונים ארכיטקטורה דו-שכבתית: חוזה חכם על-השרשרת עבור פרוטוקולים מבוזרים ושירות מחוץ-לשרשרת עבור בורסות מרכזיות. אנו מבטיחים אפס תוצאות שליליות שגויות ומפחיתים את עלות הגז ב-15%.

כיצד פועלים עדכונים אוטומטיים של מערכת רשימת הכתובות החסומות

הבעיה המרכזית היא שמקורות רשימת הסנקציות מתעדכנים באופן אסינכרוני. OFAC מפרסם עדכונים מספר פעמים בשבוע, Chainalysis בזמן אמת. המערכת שלנו ממזגת אותם דרך API אחיד באמצעות ETag וקאשינג. זה מסנכרן את הרשימה השחורה תוך פחות מ-300 שניות לאחר פרסום עדכון. עם מסנן בלום, ההסתברות לתוצאה חיובית שגויה אינה עולה על 0.1% עם מהירות בדיקת כתובת של פחות מ-5 אלפיות השנייה.

// Cron: каждый час проверяем обновления OFAC
@Cron("0 * * * *")
async syncOFACList() {
  const etag = await this.cache.get("ofac_etag");
  const response = await fetch("https://www.treasury.gov/ofac/downloads/SDN_advanced.xml", {
    headers: etag ? { "If-None-Match": etag } : {},
  });
  if (response.status === 304) return; // не изменился
  const xml = await response.text();
  const addresses = parseOFACCryptoAddresses(xml);
  await this.blocklist.updateAddresses(addresses, "OFAC");
  await this.cache.set("ofac_etag", response.headers.get("ETag"));
  this.logger.log(`OFAC sync: ${addresses.length} crypto addresses`);
}

עבור Chainalysis אנו משתמשים ב-API סטרימינג — כל אירוע חשוד חדש נשלח מיד לתור RabbitMQ ומעובד תוך <500ms.

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

רשימה שחורה חד-שכבתית על-השרשרת אינה יעילה עבור מערכות בעומס גבוה: עלות הגז לכל עסקה גבוהה והעדכונים אורכים זמן. אנו מפרידים בין שכבות על-השרשרת (חוזה חכם) ומחוץ-לשרשרת (שירות עם מסנן בלום). בדיקה מחוץ-לשרשרת באמצעות מסנן בלום מהירה פי 5 מסריקה מלאה, והמודיפייר notBlocked על-השרשרת מוסיף רק 100 גז לקריאה רגילה. שיעור התוצאות החיוביות השגויות ניתן להגדרה — בדרך כלל פחות מ-0.1% עם אפס תוצאות שליליות שגויות.

מדד על-השרשרת מחוץ-לשרשרת
זמן השהיה לבדיקה ~500 אלפיות השנייה (כולל גז) <5 אלפיות השנייה
תפוקה ~100 rps >10,000 rps
תוצאה שלילית שגויה 0% 0%
מקור תדירות עדכון עלות תמיכה
OFAC SDN מספר פעמים בשבוע חינם כן
סנקציות האיחוד האירופי פעם ביום חינם כן
Chainalysis זמן אמת בתשלום API
Elliptic זמן אמת בתשלום API

רשימה שחורה על-השרשרת (עבור חוזים חכמים) — פיתוח מנגנון החסימה

contract AddressBlocklist { // Управление через multisig или governance
    address public admin;
    mapping(address => bool) public blocked;
    mapping(address => string) public blockReasons;

    event AddressBlocked(address indexed addr, string reason);
    event AddressUnblocked(address indexed addr);

    function blockAddress(address addr, string calldata reason) external onlyAdmin {
        blocked[addr] = true;
        blockReasons[addr] = reason;
        emit AddressBlocked(addr, reason);
    }

    function blockBatch(address[] calldata addrs, string calldata reason) external onlyAdmin {
        for (uint i = 0; i < addrs.length; i++) {
            blocked[addrs[i]] = true;
            blockReasons[addrs[i]] = reason;
        }
    }

    modifier notBlocked(address addr) {
        require(!blocked[addr], string.concat("Address blocked: ", blockReasons[addr]));
        _;
    }
}

// Использование в протоколе
contract Protocol is AddressBlocklist {
    function deposit(uint256 amount) external notBlocked(msg.sender) {
        // логика депозита
    }
}

רשימה שחורה מחוץ-לשרשרת (עבור בורסות ושירותים)

עבור מערכות בעומס גבוה — Redis Bloom Filter לבדיקות חברות מהירות של כתובות ברשימה השחורה. מסנן בלום מפחית את זמן ההשהיה פי 5 בהשוואה לסריקת מסד נתונים מלאה.

class AddressBlocklistService {
  private bloomFilter: RedisBloom;
  private exactBlocklist: Set<string>;

  async isBlocked(address: string): Promise<BlockStatus> {
    const normalized = address.toLowerCase();

    // Bloom filter: false позитивы возможны, false негативы — нет
    if (!await this.bloomFilter.exists(normalized)) {
      return { blocked: false }; // быстрый ответ: точно не в blocklist
    }

    // Exact check для подтверждения (bloom filter мог дать false positive)
    const exactMatch = await this.db.findBlockedAddress(normalized);
    if (!exactMatch) return { blocked: false };

    return {
      blocked: true,
      reason: exactMatch.reason,
      source: exactMatch.source,
      addedAt: exactMatch.addedAt,
    };
  }

  async updateFromSanctionsList(): Promise<void> {
    // OFAC SDN список (обновляется несколько раз в неделю)
    const ofacAddresses = await fetchOFACCryptoAddresses();

    // Chainalysis Sanctioned Addresses список
    const chainalysisAddresses = await this.chainalysis.getSanctionedAddresses();

    const allNew = [...ofacAddresses, ...chainalysisAddresses];

    for (const addr of allNew) {
      await this.bloomFilter.add(addr.address.toLowerCase());
      await this.db.upsertBlockedAddress({
        address: addr.address.toLowerCase(),
        reason: addr.reason,
        source: addr.source,
      });
    }
  }
}
פרטי יישום מסנן בלום אנו משתמשים ב-RedisBloom עם תצורה מותאמת למספר הכתובות הצפוי (עד מיליון) ולשיעור התוצאות החיוביות השגויות הרצוי (0.01%). זה שומר על שימוש בזיכרון בתוך 2 MB.

כיצד ליישם את המערכת: תוכנית שלב-אחר-שלב לפרויקט שלך

  1. ניתוח ארכיטקטורה — קבע את מקרי השימוש שלך (DeFi, CEX, NFT) ובחר גישה: על-השרשרת, מחוץ-לשרשרת או היברידית. הערך את העומס הנוכחי: RPS ממוצע, מספר משתמשים פעילים.
  2. בחירת מקורות רשימת החסימה — חבר את OFAC SDN, סנקציות האיחוד האירופי, APIs בתשלום (Chainalysis, Elliptic) או רשימות קהילתיות. הגדר עדכונים אוטומטיים עם מרווחים מ-5 דקות עד שעה.
  3. פיתוח חוזה חכם — יישם AddressBlocklist עם מודיפיירים ופעולות אצווה. שלב multisig לניהול. אופטימיזציית גז: השתמש ב-mapping ולוגיקה מונעת אירועים.
  4. יצירת שירות מחוץ-לשרשרת — פרוס Redis עם מסנן בלום, הגדר תור RabbitMQ לעדכונים בזמן אמת. טפל בעד 10,000 rps עם זמן השהיה של <5 אלפיות השנייה.
  5. בדיקות וביקורת — כסה בבדיקות יחידה (Foundry/Hardhat), השתמש ב-Slither לניתוח סטטי, בצע fuzzing על Echidna. בדוק תוצאות חיוביות שגויות מול נתונים היסטוריים על פני 6 חודשים.
  6. פריסה וניטור — פרוס ל-mainnet/testnet עם השקה מדורגת. חבר את Tenderly למעקב אחר גז ו-TPS. הגדר התראות לחסימה המונית.

מה כלול בעבודה

  • ארכיטקטורה: תכנון רכיבים על-השרשרת/מחוץ-לשרשרת לפי התרחישים שלך (DeFi, CEX, NFT).
  • יישום: חוזים חכמים (Solidity), חלק שרת (TypeScript, Redis), אינטגרציה עם מקורות.
  • תיעוד: סכמות API, הוראות פריסה, מדריך מנהל.
  • הדרכה: מפגש קצר לצוות על תפעול ופתרון תקלות.
  • תמיכה: שבועיים של תחזוקה לאחר השחרור, תיקון באגים.

זמן הפיתוח המשוער נע בין 2 ל-3 שבועות. עלויות היישום האופייניות נעות בין $15,000 ל-$30,000, עם חיסכון שנתי פוטנציאלי של $500K על ידי מניעת ניצול יחיד. הצוות שלנו סיפק למעלה מ-50 פרויקטי בלוקצ'יין ויש לו ניסיון של 6+ שנים במומחיות Web3.

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