Розробка системи блокування підозрілих адрес
Система блокування підозрілих адрес — перший рівень захисту від відмивання грошей. Її завдання: перешкодити взаємодії з відомими поганими акторами перед тим, як транзакція потрапить до протоколу або біржі. Для DeFi протоколів це також зменшує нормативні ризики в юрисдикціях, де регулятори починають звертати увагу на off-chain compliance.
Архітектура системи блокування
On-chain blocklist (для смарт-контрактів)
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 blocklist (для бірж та сервісів)
Для високонавантажених систем — Redis Bloom Filter для швидкої перевірки приналежності адреси до blocklist:
class AddressBlocklistService {
private bloomFilter: RedisBloom;
private exactBlocklist: Set<string>;
async isBlocked(address: string): Promise<BlockStatus> {
const normalized = address.toLowerCase();
// Bloom filter: хибні позитиви можливі, хибні негативи — ні
if (!await this.bloomFilter.exists(normalized)) {
return { blocked: false }; // швидка відповідь: точно не в blocklist
}
// Точна перевірка для підтвердження (bloom filter міг дати помилковий позитив)
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,
});
}
}
}
Джерела даних blocklist
| Джерело | Тип | Оновлення | Доступність |
|---|---|---|---|
| OFAC SDN List | Санкції | Кілька разів на тиждень | Безплатно |
| EU Sanctions | Санкції | При змінах | Безплатно |
| Chainalysis Sanctioned | Санкції + darknet | Real-time | Платно |
| Elliptic Lens | Darknet, шахрайство | Real-time | Платно |
| Community lists (GitHub) | Шахраї, фішинг | За внесками | Безплатно |
OFAC SDN список містить крипто адреси — їх потрібно парсити з XML файлу (SDN_Advanced.xml). Chainalysis і Elliptic надають ширші списки через API.
Автоматичне оновлення
// 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} крипто адрес`);
}
Система блокування підозрілих адрес з on-chain та off-chain компонентами, автоматичним оновленням з OFAC та Chainalysis — 2-3 тижні розробки.







