בעיה אופיינית בבורסות קריפטו: סוחרים מתלוננים על עמלות גבוהות ולא גמישות, שותפים לא רואים את התשלומים שלהם, ומפתחי API חסרים או מאוחסנים בטקסט פשוט. פתרנו את זה עבור תריסר בורסות — הנה איך.
אנו מפתחים מבני עמלות גמישים עבור בורסות קריפטו. מפתחות API הם המקבילה התכנותית של שם משתמש/סיסמה, המאפשרים לסוחרים ולשותפים לנהל רמות עמלה. מערכת מפתחות API תקינה פירושה הרשאות גמישות, אחסון מאובטח ויומן ביקורת מפורט. במשך יותר מ-5 שנים השלמנו יותר מ-50 פרויקטים עבור בורסות ופלטפורמות DeFi. יישום הגדרת תעריפים גמישה מאפשר לסוחרים עם נפחי מסחר מ-100 BTC לחסוך עד $5000 בחודש על עמלות, ושותפים מקבלים תשלומים של עד 30% מהעמלות ממשתמשים מופנים.
מודל נתונים של עמלות ומפתחות API
type APIKey struct {
ID string // публичный ключ (например: "ak_prod_a1b2c3d4...")
Secret string // хэш секрета (NEVER хранить plain text)
UserID int64
Label string // "Trading Bot", "Portfolio Tracker"
// Разрешения
Permissions APIPermissions
// Ограничения
IPWhitelist []string // если пустой — любой IP
ExpiresAt *time.Time
// Статус
IsActive bool
LastUsedAt *time.Time
CreatedAt time.Time
}
type APIPermissions struct {
// Trading
SpotTrade bool
MarginTrade bool
FuturesTrade bool
// Account
ReadAccount bool // балансы, история
Withdraw bool // ВНИМАНИЕ: высокий риск
// Market Data
ReadMarketData bool // всегда включено для бесплатного доступа
}הרשאת משיכה — ההרשאה המסוכנת ביותר. המלצה: דרוש אישור נפרד בעת הפעלתה, רשימת כתובות לבנות נפרדת למפתח זה, והודעת דוא"ל.
הגדרת רמות עמלה למשתמשים שונים
כל מפתח API יכול להיות מקושר לקבוצת עמלה. לדוגמה, עבור סוחרים עם נפח >100 BTC — עמלת יוצר של 0.1%, עבור שותפים — תשלומי הפניה של 20% מהעמלה. קבוצות מוגדרות בפאנל הניהול, והחישובים מתבצעים בזמן אמת.
מיפוי קבוצה למפתח:
type FeeGroup struct {
ID int64
Name string // "Gold Trader", "Partner"
MakerFee float64
TakerFee float64
ReferralPct float64 // 0.2 = 20%
}
type APIKey struct {
// ... предыдущие поля
FeeGroupID int64
}בעת עיבוד הזמנה, העמלה נלקחת מהקבוצה המקושרת למפתח. אם אין מפתח מקושר, נעשה שימוש בתעריף ברירת המחדל של הבורסה.
הגדרת רמות עמלה ב-5 שלבים:
- צור קבוצות עמלה בפאנל הניהול — הגדר שם, עמלת יוצר/לוקח, אחוז תשלום הפניה.
- קשר את הקבוצה למפתח API דרך שדה
type APIKey struct { ID string // публичный ключ (например: "ak_prod_a1b2c3d4...") Secret string // хэш секрета (NEVER хранить plain text) UserID int64 Label string // "Trading Bot", "Portfolio Tracker" // Разрешения Permissions APIPermissions // Ограничения IPWhitelist []string // если пустой — любой IP ExpiresAt *time.Time // Статус IsActive bool LastUsedAt *time.Time CreatedAt time.Time } type APIPermissions struct { // Trading SpotTrade bool MarginTrade bool FuturesTrade bool // Account ReadAccount bool // балансы, история Withdraw bool // ВНИМАНИЕ: высокий риск // Market Data ReadMarketData bool // всегда включено для бесплатного доступа }(ראה מודל לעיל). - הגדר הרשאות למפתח: spot_trade, withdraw, read_account וכו'.
- הגדר רשימת IP לבנה — הגבל גישה לכתובות מהימנות בלבד.
- הפעל יומן ביקורת — כל בקשה ל-API מתועדת לניתוח מאוחר יותר.
יצירת מפתחות ואחסונם
import (
"crypto/rand"
"encoding/hex"
"golang.org/x/crypto/bcrypt"
)
func GenerateAPIKey() (publicKey, secretKey string, err error) {
// Public key: 32 байта, hex encoded
pubBytes := make([]byte, 16)
if _, err = rand.Read(pubBytes); err != nil {
return
}
publicKey = "ak_" + hex.EncodeToString(pubBytes)
// Secret: 32 байта, hex encoded
secBytes := make([]byte, 32)
if _, err = rand.Read(secBytes); err != nil {
return
}
secretKey = hex.EncodeToString(secBytes)
return
}
func HashSecret(secret string) (string, error) {
// bcrypt для хранения — медленный hash, устойчив к brute force
hash, err := bcrypt.GenerateFromPassword([]byte(secret), bcrypt.DefaultCost)
return string(hash), err
}
func VerifySecret(secret, hash string) bool {
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(secret)) == nil
}קריטי: המפתח הסודי מוצג למשתמש פעם אחת בעת היצירה. רק ה-hash של bcrypt מאוחסן במסד הנתונים. אם המשתמש מאבד את הסוד, יש ליצור מפתח חדש.
פרטי אחסון סוד
המפתח הסודי מוצג למשתמש פעם אחת בעת היצירה ולעולם אינו מאוחסן בטקסט פשוט. רק ה-hash של bcrypt מאוחסן במסד הנתונים. אם המשתמש מאבד את הסוד, יש ליצור מפתח חדש. עבור אימות [HMAC](https://en.wikipedia.org/wiki/HMAC), אנו משתמשים בהצפנת AES-256 נפרדת עם מפתח מ-HSM, המונעת שחזור של הסוד המקורי.למה חשוב בידוד עמלות לפי שותף?
כל שותף מקבל מפתח API משלו עם הרשאות מוגבלות — גישת קריאה בלבד לסטטיסטיקה וניהול ההפניות שלו. זה מונע דליפות נתונים ומניפולציות על עמלות. אנו מבטיחים ששותף אחד לא יכול לראות את התעריפים של אחר. יישום מערכת כזו מאפשר לסוחרים עם נפחי מסחר מ-100 BTC לחסוך עד $5000 בחודש על עמלות, ושותפים מקבלים תשלומים של עד 30% מהעמלות ממשתמשים מופנים.
Middleware לאימות
func APIKeyAuthMiddleware(db *DB) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
apiKeyID := r.Header.Get("X-API-Key")
signature := r.Header.Get("X-Signature")
timestamp := r.Header.Get("X-Timestamp")
if apiKeyID == "" || signature == "" {
writeError(w, 401, "Missing authentication headers")
return
}
// 1. Находим ключ по public ID
apiKey, err := db.GetAPIKey(apiKeyID)
if err != nil || !apiKey.IsActive {
writeError(w, 401, "Invalid API key")
return
}
// 2. Timestamp проверка (анти-replay, ±5 сек)
ts, _ := strconv.ParseInt(timestamp, 10, 64)
if abs(time.Now().UnixMilli()-ts) > 5000 {
writeError(w, 401, "Timestamp out of range")
return
}
// 3. Верификация подписи (HMAC-SHA256)
body, _ := io.ReadAll(r.Body)
r.Body = io.NopCloser(bytes.NewBuffer(body))
message := r.Method + r.URL.RequestURI() + timestamp + string(body)
// Используем секрет из кэша (hash recovery невозможен — нужен отдельный cache)
if !verifyHMAC(message, apiKey.SecretForVerification, signature) {
writeError(w, 401, "Invalid signature")
return
}
// 4. IP whitelist
if len(apiKey.IPWhitelist) > 0 {
clientIP := getClientIP(r)
if !contains(apiKey.IPWhitelist, clientIP) {
writeError(w, 403, "IP not whitelisted")
return
}
}
// 5. Обновляем last_used_at асинхронно
go db.UpdateLastUsed(apiKey.ID)
// Передаём контекст
ctx := context.WithValue(r.Context(), "api_key", apiKey)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
}הערה חשובה: אימות HMAC דורש ידיעת הסוד, אך אנו מאחסנים רק hash של bcrypt. פתרון: בעת יצירת מפתח, אנו מאחסנים את הסוד בצורה מוצפנת (AES-256 עם מפתח מ-HSM) אך ורק לצורך אימות HMAC, לא להצגה למשתמש.
בדיקות הרשאות
func RequirePermission(perm string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
apiKey := r.Context().Value("api_key").(APIKey)
hasPermission := false
switch perm {
case "spot_trade":
hasPermission = apiKey.Permissions.SpotTrade
case "withdraw":
hasPermission = apiKey.Permissions.Withdraw
case "read_account":
hasPermission = apiKey.Permissions.ReadAccount
}
if !hasPermission {
writeError(w, 403, fmt.Sprintf("Permission denied: %s required", perm))
return
}
next.ServeHTTP(w, r)
})
}
}
// Использование:
router.POST("/api/v1/orders", APIKeyAuthMiddleware(db), RequirePermission("spot_trade"), handler.PlaceOrder)
router.POST("/api/v1/withdrawals", APIKeyAuthMiddleware(db), RequirePermission("withdraw"), handler.CreateWithdrawal) השוואת ארכיטקטורות מערכות עמלה
| מאפיין | בסיסי (תעריפים קבועים) | גמיש (קבוצות ומפתחות API) |
|---|---|---|
| גמישות תעריפים | אחד לכולם | אישי לכל קבוצה |
| ניהול | ידני בקוד | דרך פאנל ניהול ומפתחות API |
| תשלומי שותפים | לא | כן, עם ביקורת לכל מפתח |
| אבטחה | מינימלית | Hashing, רשימת IP לבנה, יומן ביקורת |
| מדרגיות | מוגבלת | עד 100,000 RPS |
הארכיטקטורה הגמישה עם מפתחות API טובה פי 3 מהקבועה במהירות ניהול התעריפים ופי 5 באבטחה בזכות hashing ורשימות לבנות. בנוסף, המערכת שלנו מפחיתה את זמן הפריסה ב-50% לעומת בנייה מאפס.
יומן ביקורת
כל בקשה ל-API מתועדת לצורכי אבטחה. יומן הביקורת מאוחסן בטבלה המחולקת לפי תאריך עם אינדקסים על type FeeGroup struct { ID int64 Name string // "Gold Trader", "Partner" MakerFee float64 TakerFee float64 ReferralPct float64 // 0.2 = 20% } type APIKey struct { // ... предыдущие поля FeeGroupID int64 } ו-FeeGroupID. מבנה: id, api_key_id, user_id, method, path, IP, status_code, latency. הנתונים נשמרים למשך 90 יום, ולאחר מכן נמחקים אוטומטית.
מה כלול בפיתוח מפתח מלא
| שלב | תוצאה | לוח זמנים |
|---|---|---|
| ניתוח דרישות | תיעוד עם לוגיקה עסקית וארכיטקטורה | 3-5 ימים |
| עיצוב מסד נתונים | דיאגרמת ER, סכמות טבלאות, מיגרציות | 2-3 ימים |
| פיתוח API (Go/Rust) | API מלא מסוג REST/WebSocket עם אימות | 14-21 ימים |
| ממשק משתמש לניהול עמלות | לוח בקרה ב-React עם טבלאות וחלונות מודאליים | 10-14 ימים |
| בדיקות (יחידה, אינטגרציה, fuzz) | כיסוי >90%, דוח אבטחה | 5-7 ימים |
| פריסה ותיעוד | גישת staging, מדריך מנהל | 2-3 ימים |
סה"כ: 4 עד 6 שבועות עד לפתרון מוכן. נבחן את הפרויקט שלך ביום עסקים אחד — צור קשר לייעוץ חינם.
המומחיות והערבויות שלנו
- יותר מ-5 שנים בפיתוח חוזים חכמים ו-backend לבורסות באמצעות Solidity, Rust, Go.
- יותר מ-50 פרויקטים מוצלחים: מ-DEX ועד פלטפורמות מרכזיות.
- ערבות אבטחה: כל מערכת עוברת ביקורת קוד ובדיקות fuzz.
- מהנדסים מוסמכים (ConsenSys Academy, Solidity Developer).
- אנו מספקים חבילת תיעוד מלאה: מפרט API, מדריך מנהל, תוכנית תמיכה.
- השגת זמינות של 99.9% עם התשתית החזקה שלנו.
- עלות פרויקט טיפוסית נעה בין $15,000 ל-$30,000.
הזמן פיתוח של מערכת עמלות גמישה — כתוב לנו בטלגרם או בדוא"ל. קבל ייעוץ ארכיטקטוני והערכת עלות תוך יום.







