פיתוח מערכת מגבלות ואימות לבורסת קריפטו
במהלך בורסת קריפטו לסכומים גדולים ללא אימות מתאים, אתה מסתכן בחסימות מצד שותפי תשלום ורגולטורים. לדוגמה, אחד הלקוחות שלנו הפסיד 15,000 דולר מכיוון שהמערכת לא התחשבה בחלון הזזה של מגבלות — המשתמש ביצע החלפה של 4,000 דולר שלוש פעמים ברציפות בתוך 24 שעות, חרג מהסף השבועי, ונאלצנו להקפיא פעולות עד לבדיקה ידנית. מקרים כאלה אינם נדירים: ארכיטקטורת מגבלות שגויה מובילה לאובדן לקוחות ולסיכונים מוניטריים. המומחיות שלנו בפיתוח בורסות קריפטו מבטיחה שאנו מתכננים מערכות מגבלות המאזנות בין נוחות המשתמש (הם רוצים להחליף סכום גדול מיד) לבין דרישות AML (צורך להכיר את הלקוח בעת חריגה מספים). הארכיטקטורה הנכונה מפחיתה את אחוז טפסי ה-KYC הננטשים תוך שמירה על עמידה בתקני ציות לבורסת קריפטו.
כיצד ליישם חלון מתגלגל?
חלונות קבועים (00:00-23:59) יוצרים חוויית משתמש ירודה: משתמש לא יכול להחליף ב-23:50 את מה שתכנן כי המגבלה מתאפסת תוך 10 דקות. חלון מתגלגל (24 שעות נעות) פותר זאת. השוואה: חלון מתגלגל טוב פי 2.5 מחלון קבוע, ומפחית דחיות ב-40%. הנה יישום ב-TypeScript:
class LimitChecker {
async checkAndConsumeLimits(
userId: string,
amount: number,
currency: string
): Promise<LimitCheckResult> {
const tier = await this.getUserTier(userId);
const limits = LIMIT_TIERS[tier];
const usdAmount = await this.toUSD(amount, currency);
// Single transaction check
if (usdAmount > limits.perTransaction) {
return {
allowed: false,
reason: "exceeds_per_transaction_limit",
limit: limits.perTransaction,
upgradeRequired: tier !== "VERIFIED",
};
}
// Rolling 24h window
const usage24h = await this.getUsage(userId, 24 * 60 * 60 * 1000);
if (usage24h + usdAmount > limits.daily) {
return {
allowed: false,
reason: "daily_limit_exceeded",
available: limits.daily - usage24h,
resetsIn: await this.getNextResetTime(userId, "daily"),
};
}
// Rolling 30d window
const usage30d = await this.getUsage(userId, 30 * 24 * 60 * 60 * 1000);
if (usage30d + usdAmount > limits.monthly) {
return {
allowed: false,
reason: "monthly_limit_exceeded",
available: limits.monthly - usage30d,
};
}
// Если всё ок — резервируем (idempotency через Redis)
await this.reserveLimit(userId, usdAmount);
return { allowed: true, usdAmount };
}
private async getUsage(userId: string, windowMs: number): Promise<number> {
const since = new Date(Date.now() - windowMs);
return this.db.sumTransactions(userId, since);
}
} יתרונות של אימות רב-רמות
אימות רב-רמות מאפשר העלאת אמון גמישה למשתמשים. רמה אנונימית מספקת גישה לפעולות בסיסיות אך עם מגבלות נמוכות — זה מפחית עלויות ציות לעסקאות קטנות. ברגע שמשתמש מגיע לסף, המערכת מעלה אוטומטית את הרמה ומבקשת מסמכים. גישה זו מגדילה את ההמרה פי 3 בהשוואה ל-KYC מלא חובה מראש. אימות מלא (KYC מלא) מגדיל את המגבלה היומית פי 10 בהשוואה לרמה הבסיסית, ומניע לקוחות לאשר את נתוניהם.
מהו מבנה רמות האימות?
כל רמה מתאימה לדרגת מגבלה. ככל שהאימות גבוה יותר, כך המגבלות גדולות יותר והגישה למשיכות פיאט רחבה יותר. הנה מבנה טיפוסי:
| רמת אימות | מגבלה יומית (דולר) | מגבלה חודשית (דולר) | מגבלה לעסקה | משיכות פיאט | נדרש KYC |
|---|---|---|---|---|---|
| אנונימי | 500 דולר | 1,000 דולר | 500 דולר | לא | לא |
| בסיסי (אימייל+AML) | 2,000 דולר | 5,000 דולר | 2,000 דולר | לא | בסיסי |
| מלא (KYC מלא) | 50,000 דולר | 200,000 דולר | 25,000 דולר | כן | מלא |
interface LimitTier {
daily: number; // USD эквивалент
monthly: number;
perTransaction: number;
fiatsAllowed: boolean;
cryptoWithdrawalLimit: number;
requiresKYC: KYCLevel;
}
const LIMIT_TIERS: Record<string, LimitTier> = {
ANONYMOUS: {
daily: 500,
monthly: 1000,
perTransaction: 500,
fiatsAllowed: false,
cryptoWithdrawalLimit: 500,
requiresKYC: KYCLevel.NONE,
},
BASIC: { // email verified + AML screening
daily: 2000,
monthly: 5000,
perTransaction: 2000,
fiatsAllowed: false,
cryptoWithdrawalLimit: 5000,
requiresKYC: KYCLevel.EMAIL,
},
VERIFIED: { // full KYC
daily: 50000,
monthly: 200000,
perTransaction: 25000,
fiatsAllowed: true,
cryptoWithdrawalLimit: -1, // без лимита
requiresKYC: KYCLevel.FULL,
},
}; מנגנון סינון AML
כאשר חורגים מסכומים מסוימים, המערכת מעלה אוטומטית את דרישות האימות או חוסמת את העסקה. ניתן להגדיר ספי AML לפי תחום השיפוט שלך. ערכים טיפוסיים המבוססים על המלצות FATF:
| סף (דולר) | פעולה |
|---|---|
| 1,000 דולר | סינון AML נוסף של ארנק הנמען |
| 3,000 דולר | נדרש KYC מלא |
| 10,000 דולר | אישור ידני על ידי קצין ציות ודוח CTR |
מערכת זו פועלת ככלי ציות, ומבטיחה שסינון AML בקריפטו מתבצע ביעילות.
const AML_THRESHOLDS = {
ENHANCED_SCREENING: 1000, // USD — дополнительный AML скрининг
KYC_REQUIRED: 1000, // требуется базовый KYC
FULL_KYC_REQUIRED: 3000, // требуется полный KYC
SAR_REVIEW: 10000, // ручная review compliance офицером
CTR_REPORT: 10000, // Currency Transaction Report (в некоторых юрисдикциях)
};
async function preTransactionChecks(tx: ExchangeTransaction): Promise<CheckResult> {
// Автоматическое повышение требований при достижении порогов
if (tx.usdAmount >= AML_THRESHOLDS.FULL_KYC_REQUIRED) {
const kycStatus = await getKYCStatus(tx.userId);
if (kycStatus < KYCLevel.FULL) {
return {
action: "REQUIRE_KYC",
requiredLevel: KYCLevel.FULL,
message: "Для суммы свыше $3,000 требуется верификация",
};
}
}
// Скрининг при суммах выше $1,000
if (tx.usdAmount >= AML_THRESHOLDS.ENHANCED_SCREENING) {
const screenResult = await screenWallet(tx.destinationAddress, tx.asset);
if (screenResult.blocked) {
return {
action: "BLOCK",
reason: screenResult.reason
};
}
}
return { action: "ALLOW" };
} דרישת מקור כספים
עבור סכומים גדולים (בדרך כלל מ-10,000 דולר), נדרשת הצהרת מקור כספים. זה מגן על הבורסה מהאשמות בהלבנת הון ומפחית את הסיכון לחסימת חשבון בנק. ההצהרה תקפה לשנה אחת, ולאחר מכן יש לחדשה. יישום:
interface SourceOfFunds {
source: "employment" | "business" | "investments" | "inheritance" | "other";
description: string;
estimatedMonthlyVolume: number;
supportingDocuments: string[]; // IPFS hashes или S3 URLs
}
async function collectSourceOfFunds(userId: string, amount: number): Promise<boolean> {
if (amount < SOF_THRESHOLD) return true;
const existingSOF = await db.getSourceOfFunds(userId);
// SOF valid если заполнен и не истёк (пересбор раз в год)
if (existingSOF && !isExpired(existingSOF, 365)) return true;
// Запрашиваем SOF через UI
await triggerSOFCollection(userId, {
requiredFor: "transaction",
amount,
});
return false;
} טעויות נפוצות בהגדרת מגבלות עסקה
- אי התחשבות בצבירה בין נכסים. על ידי הגבלת BTC בלבד, משתמש יכול היה להחליף סכום שווה ערך ב-USDT. המערכת שלנו מצברת מגבלות בדולרים.
- התעלמות מגשרים בין רשתות. אם משתמש מעביר כספים דרך גשר, המגבלות חייבות להתחשב ברשת המקורית. אנו שומרים היסטוריה בכל הרשתות.
- חוסר אידמפוטנטיות בשמירת מגבלות. ללא אידמפוטנטיות, בקשות חוזרות עלולות להפחית את המגבלה פעמיים. אנו משתמשים ב-Redis עם TTL.
תוצרים
אנו מספקים פתרון סוהר:
- מסמך ארכיטקטוני המתאר את כל הספים והבדיקות האוטומטיות.
- קוד מקור עם חלונות מתגלגלים, סינון AML ואינטגרציית API.
- פריסה בסביבה שלך ואינטגרציה עם ספקי KYC (לדוגמה, Sumsub או Jumio).
- הדרכה לצוות שלך (מפגש אחד) וחודשיים של תמיכה.
מדדי חברה וניסיון
לחברה שלנו ניסיון של 5+ שנים בתחום הקריפטו ו-30+ פרויקטים מיושמים, כולל בורסות ופרוטוקולי DeFi. אנו מבטיחים תמיכה לאחר היישום.
צור קשר לייעוץ — ננתח את המחסנית הטכנולוגית הנוכחית שלך ונציע את התצורה האופטימלית. הזמן יישום, ומערכת המגבלות שלך תהיה מוכנה לכל נפח.







