Ми стикалися з ситуацією, коли DeFi-протокол втрачав значну суму через взаємодію з адресою, включеною до санкційного списку OFAC через 40 хвилин після публікації. Система блокування підозрілих адрес повинна перевіряти кожен запит проти актуального blacklist з latency <10ms і пропускною здатністю до 10 000 rps. Ми будуємо дворівневу архітектуру: on-chain смарт-контракт для децентралізованих протоколів та off-chain сервіс для централізованих бірж. Гарантуємо точність з нульовим false negative і зниження gas cost на 15%.
Як працює автоматичне оновлення системи блокування підозрілих адрес?
Ключова проблема — джерела санкційних списків оновлюються асинхронно. OFAC публікує оновлення кілька разів на тиждень, Chainalysis — в real-time. Наша система об'єднує їх через єдиний API з використанням ETag та кешування. Це дозволяє синхронізувати blacklist менш ніж за 300 секунд після виходу оновлення. Завдяки Bloom filter ймовірність false positive не перевищує 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 використовуємо streaming API — кожна нова підозріла подія негайно надсилається до черги RabbitMQ і обробляється за <500ms.
Чому дворівнева архітектура необхідна для системи блокування підозрілих адрес?
Одношаровий on-chain блокліст неефективний для high-load систем: gas cost при кожній транзакції високий, а оновлення займає час. Ми розділяємо on-chain (смарт-контракт) та off-chain (сервіс з Bloom filter) рівні. Off-chain перевірка через Bloom filter у 5 разів швидша за повне сканування, а on-chain модифікатор notBlocked додає всього 100 gas до звичайного виклику. False positive rate налаштовується — зазвичай менше 0.1% при нульовому false negative.
| Метрика | On-chain | Off-chain |
|---|---|---|
| Latency перевірки | ~500 ms (включаючи gas) | <5 ms |
| Пропускна здатність | ~100 rps | >10 000 rps |
| False negative | 0% | 0% |
| Джерело | Оновлення | Вартість | Підтримка |
|---|---|---|---|
| OFAC SDN | Кілька разів/тиждень | Безкоштовно | Так |
| EU Sanctions | Раз/день | Безкоштовно | Так |
| Chainalysis | Real-time | Платно | API |
| Elliptic | Real-time | Платно | API |
On-chain блокліст (для смарт-контрактів) — розробка системи блокування
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) { // логіка депозиту } } Off-chain блокліст (для бірж та сервісів)
Для високонавантажених систем — Redis Bloom Filter для швидкої перевірки належності адреси до blocklist. Bloom filter знижує latency у 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, }); } } } Деталі реалізації Bloom filter
Ми використовуємо RedisBloom з конфігурацією, оптимізованою під очікувану кількість адрес (до 1 млн) та бажаний false positive rate (0.01%). Це дозволяє тримати пам'ять в межах 2 MB.Як впровадити систему: покроковий план для вашого проекту
- Аналіз архітектури — визначаємо ваші сценарії (DeFi, CEX, NFT) і вибираємо підхід: on-chain, off-chain або гібрид. Оцінюємо поточне навантаження: середній RPS, кількість активних користувачів.
- Вибір джерел блоклісту — підключаємо OFAC SDN, EU Sanctions, платні API (Chainalysis, Elliptic) або community-списки. Налаштовуємо автоматичне оновлення з інтервалом від 5 хвилин до 1 години.
- Розробка смарт-контрактів — реалізуємо AddressBlocklist з модифікаторами та batch-операціями. Інтегруємо multisig для управління. Gas-оптимізація: використовуємо mapping та event-driven логіку.
- Створення off-chain сервісу — розгортаємо Redis з Bloom filter, налаштовуємо чергу RabbitMQ для real-time оновлень. Обробляємо up to 10 000 rps з latency <5 ms.
- Тестування та аудит — покриваємо unit-тестами (Foundry/Hardhat), використовуємо Slither для статичного аналізу, проводимо fuzzing на Echidna. Перевіряємо хибні спрацювання на історичних даних за 6 місяців.
- Деплой та моніторинг — розгортаємо на mainnet/testnet з багатофазним запуском. Підключаємо Tenderly для відстеження gas та TPS. Налаштовуємо алерти при масових блокуваннях.
Що входить в роботу
- Архітектура: проектування on-chain/off-chain компонентів з урахуванням ваших сценаріїв (DeFi, CEX, NFT).
- Реалізація: смарт-контракти (Solidity), серверна частина (TypeScript, Redis), інтеграція з джерелами.
- Документація: API-схеми, інструкції з розгортання, посібник адміністратора.
- Навчання: коротка сесія для команди з експлуатації та вирішення інцидентів.
- Підтримка: 2 тижні пост-релізного супроводу, виправлення помилок.
Орієнтовні терміни розробки — від 2 до 3 тижнів. Вартість розраховується індивідуально на основі обсягу інтеграцій та SLA.
Замовте розробку системи захисту вашого протоколу вже сьогодні. Отримайте консультацію з впровадження — наші інженери з 6-річним досвідом у Web3 допоможуть підібрати оптимальне рішення для вашого проекту.







