אחד התרחישים הנפוצים ביותר לאובדן כספים בבורסה הוא שגיאה בעיבוד ארגון מחדש של שרשרת בלוקים (reorg): עסקה נחשבת מאושרת, אך הבלוק מתגלגל לאחור, והכסף נעלם. נקודת כאב נוספת היא מלחמות גז: בעת משיכת ETH, מחיר הגז מזנק, העסקה נתקעת, והמשתמשים נכנסים לפאניקה. אנו בונים מערכת הפקדה ומשיכה שעמידה בפני מצבים כאלה. הארכיטקטורה מבוססת על תבניות מוכחות: multi-sig, HSM, טיפול אוטומטי ב-reorg, וניהול גז אדפטיבי.
לצוות שלנו יש ניסיון של 5+ שנים בפיתוח בלוקצ'יין, והוא יישם למעלה מ-50 פרויקטים עבור בורסות קריפטו ופרוטוקולי DeFi. אנו מבטיחים שמערכת ההפקדה והמשיכה שלך תעמוד בסטנדרטים הטובים ביותר בתעשייה. צור איתנו קשר כדי לדון בארכיטקטורת הבורסה שלך — נבחן את הפרויקט ונציע את הפתרון האופטימלי.
כיצד נוצרות כתובות הפקדה?
כל משתמש מקבל כתובת הפקדה ייחודית עבור כל רשת. קיימות שתי גישות.
HD Wallet (Hierarchical Deterministic). עץ מפתחות דטרמיניסטי נוצר מזרע אב יחיד לפי BIP-32 ו-BIP-44. עבור ביטקוין: m/44'/0'/0'/0/{user_index}. עבור Ethereum: m/44'/60'/0'/0/{user_index}.
import { HDNodeWallet } from "ethers";
const masterNode = HDNodeWallet.fromMnemonic(Mnemonic.fromPhrase(MASTER_MNEMONIC));
function getDepositAddress(userId: number, coinIndex: number): string {
// m/44'/coinIndex'/0'/0/userId
const child = masterNode
.deriveChild(44 + 0x80000000) // purpose
.deriveChild(coinIndex + 0x80000000) // coin type
.deriveChild(0 + 0x80000000) // account
.deriveChild(0) // external
.deriveChild(userId);
return child.address;
}הזרע האב מאוחסן ב-HSM או בכספת מוצפנת (HashiCorp Vault). מפתחות ציבוריים ליצירת כתובות נמצאים במסד הנתונים, מפתחות פרטיים לחתימה נמצאים רק ב-HSM.
כתובת משותפת + memo — כתובת אחת לכל הבורסה, המשתמש מציין memo/tag. משמש עבור Ripple (XRP), Stellar (XLM), Cosmos. זול יותר לתחזוקה, אך שגיאה ב-memo מובילה לאובדן כספים.
ניטור עסקאות נכנסות
שירות הניטור נרשם לאירועי בלוקצ'יין:
- רשתות EVM:
import { HDNodeWallet } from "ethers"; const masterNode = HDNodeWallet.fromMnemonic(Mnemonic.fromPhrase(MASTER_MNEMONIC)); function getDepositAddress(userId: number, coinIndex: number): string { // m/44'/coinIndex'/0'/0/userId const child = masterNode .deriveChild(44 + 0x80000000) // purpose .deriveChild(coinIndex + 0x80000000) // coin type .deriveChild(0 + 0x80000000) // account .deriveChild(0) // external .deriveChild(userId); return child.address; }דרך WebSocket לצומת + סקירתeth_subscribe("logs", { address: [depositAddresses], topics: [ERC20_TRANSFER_TOPIC] })כגיבוי - ביטקוין:
eth_getBlockByNumberמ-Bitcoin Core + סריקה תקופתית של כתובות דרךzmqpubrawtx - TRON: TronGrid WebSocket או סקירת TronScan API
type DepositMonitor struct {
node EthClient
db *DB
confirmations int // минимум подтверждений
}
func (m *DepositMonitor) ProcessBlock(blockNum uint64) {
receipts := m.node.GetBlockReceipts(blockNum)
for _, receipt := range receipts {
for _, log := range receipt.Logs {
if !isERC20Transfer(log) {
continue
}
to := common.HexToAddress(log.Topics[2].Hex())
if !m.db.IsDepositAddress(to) {
continue
}
m.recordPendingDeposit(Deposit{
TxHash: receipt.TxHash,
BlockNum: blockNum,
UserAddress: to,
Token: log.Address,
Amount: new(big.Int).SetBytes(log.Data),
})
}
}
} אישורים וסופיות
מספר האישורים הנדרש תלוי ברשת ובסכום:
| רשת | אישורים מינימליים | סיבה |
|---|---|---|
| ביטקוין | 3–6 | הסתברות ל-reorg |
| Ethereum | 12–20 (או finalized) | סופיות לאחר המיזוג |
| Polygon PoS | 100–256 | סופיות checkpoint |
| BSC | 15–20 | PoSA, יותר מרכזי |
| TRON | 19 | קונצנזוס מוצק |
| Solana | 32 (finalized) | Tower BFT |
לאחר הגעה לסף האישורים, ההפקדה מזוכה ליתרת המשתמש. עד אז, היא נמצאת בסטטוס scantxoutset. אנו מציגים הפקדות ממתינות עם מחוון התקדמות.
טיפול ב-reorg: אחסון type DepositMonitor struct { node EthClient db *DB confirmations int // минимум подтверждений } func (m *DepositMonitor) ProcessBlock(blockNum uint64) { receipts := m.node.GetBlockReceipts(blockNum) for _, receipt := range receipts { for _, log := range receipt.Logs { if !isERC20Transfer(log) { continue } to := common.HexToAddress(log.Topics[2].Hex()) if !m.db.IsDepositAddress(to) { continue } m.recordPendingDeposit(Deposit{ TxHash: receipt.TxHash, BlockNum: blockNum, UserAddress: to, Token: log.Address, Amount: new(big.Int).SetBytes(log.Data), }) } } } יחד עם pending. כאשר מתגלה reorg (hash של בלוק השתנה), סמן עסקאות מושפעות כ-block_hash והפעל מחדש את הניטור.
כיצד מתבצע איחוד כספים (sweeping)?
כתובות הפקדה נמנות באלפים או מיליונים. אחסון ETH בכל כתובת הוא יקר ולא מאובטח. יש צורך באיחוד אוטומטי לארנק חם ראשי:
func (s *Sweeper) SweepAddress(depositAddr Address) error {
balance, _ := s.node.GetBalance(depositAddr)
if balance.Cmp(s.minSweepAmount) < 0 {
return nil // не стоит газа
}
// Для ERC20: сначала нужно отправить ETH на газ
if s.token != ETH {
gasCost := estimateGas(depositAddr, HOT_WALLET, token)
s.fundGas(depositAddr, gasCost)
}
// Подписываем через HSM — приватный ключ depositAddr никогда не покидает HSM
tx := s.buildTransfer(depositAddr, HOT_WALLET, balance)
signed := s.hsm.Sign(depositAddr, tx)
return s.node.SendRawTransaction(signed)
}עבור טוקני ERC20, המשימה מסובכת: יש צורך ב-ETH לגז בכתובת ההפקדה. פתרונות:
- תחנת גז: שלח ETH לפני ה-sweep, ואז בצע sweep לטוקנים
- Sweep ללא גז דרך EIP-2612/permit: אם הטוקן תומך ב-permit, הבורסה משלמת את הגז בעצמה
- Sweep בקבוצות דרך multicall: קריאה אחת אוספת כספים מכתובות מרובות
החיסכון בגז בעת שימוש ב-batch sweep יכול להגיע ל-$40,000 בחודש בנפחים גבוהים.
ארכיטקטורת משיכה
משיכה עוברת מספר שלבים:
REQUESTED → VALIDATED → APPROVED → SIGNING → BROADCASTING → PENDING → CONFIRMED VALIDATED: בדיקת יתרה, מגבלות, AML/KYC. אם עבר — שמור כספים (הפחת מהיתרה הזמינה).
APPROVED: עבור סכומים גדולים — בדיקה ידנית על ידי מפעיל הבורסה או חתימה מרובה (אישור M-of-N ממספר מפעילים). עבור סכומים קטנים — אישור אוטומטי.
SIGNING: חתום על העסקה ב-HSM או במערכת ארנק קר. לעולם אל תחתום על השרת שבו מאוחסנת לוגיקת האישור — הפרדת תפקידים.
BROADCASTING: שלח את העסקה לרשת. לאחר מכן, לא ניתן לבטל את העסקה.
ניהול גז
הבורסה חייבת לשלם גז עבור משיכות. יש צורך במערכת ניהול גז:
- ניטור
block_number/ EIP-1559reorged+func (s *Sweeper) SweepAddress(depositAddr Address) error { balance, _ := s.node.GetBalance(depositAddr) if balance.Cmp(s.minSweepAmount) < 0 { return nil // не стоит газа } // Для ERC20: сначала нужно отправить ETH на газ if s.token != ETH { gasCost := estimateGas(depositAddr, HOT_WALLET, token) s.fundGas(depositAddr, gasCost) } // Подписываем через HSM — приватный ключ depositAddr никогда не покидает HSM tx := s.buildTransfer(depositAddr, HOT_WALLET, balance) signed := s.hsm.Sign(depositAddr, tx) return s.node.SendRawTransaction(signed) } - תקציב גז: התחשבות בעלות הגז בעלות המשיכה או בעמלה
- RBF (Replace By Fee) עבור עסקאות ביטקוין תקועות
- הגדלת EIP-1559: כאשר עסקת Ethereum נתקעת — שלח מחדש עם אותו nonce ו-
REQUESTED → VALIDATED → APPROVED → SIGNING → BROADCASTING → PENDING → CONFIRMEDמוגדל
הודעות וסטטוסים
המשתמש חייב לראות את סטטוס המשיכה בזמן אמת. אינטגרציה:
- WebSocket push בכל שינוי סטטוס
- הודעות דוא"ל/טלגרם בשלבים מרכזיים (אישור, שליחה, אישור)
- Hash של עסקה עם קישור לסייר מיד לאחר השידור
כיצד מובטחת האבטחה?
בדיקות קריטיות:
- רשימת כתובות מורשות: דרישה להוספת כתובת חדשה 24-48 שעות לפני משיכה אליה. בעת הוספה — אישור בדוא"ל + 2FA.
- אנטי-פישינג: הצגת קוד אנטי-פישינג בדוא"ל ובממשק המשתמש (המשתמש מגדיר אותו). אם הוא חסר — חשדני.
- מגבלות משיכה: מגבלות יומיות לפי רמות KYC. אם חריגה — בדיקה ידנית.
- בדיקות מהירות: משיכות מרובות בפרק זמן קצר → חסימה זמנית והודעה.
הפרדת ארנקים חם/חמים/קר
- ארנק חם: רזרבה תפעולית קטנה (10-20% מנפח המשיכה היומי), תמיד מקוון, משיכות אוטומטיות
- ארנק חמים: multi-sig (2-of-3 או 3-of-5 מפתחות חומרה), ממלא את הארנק החם פעם ביום
- ארנק קר: אחסון לא מקוון, רק עבור רזרבות גדולות, נוהל גישה ידני
חלוקה: 5-10% חם, 15-20% חמים, 70-80% קר. המספרים הספציפיים תלויים בנפחים ובמודל הסיכון של הבורסה.
תשתית ואמינות
צומת לעומת ספק API: צומת מלא נותן אמינות ועצמאות. ספקי API (Alchemy, QuickNode, Infura) — נוחות אך תלות בצד שלישי. עבור בורסה בייצור: מספר ספקים + צומת משלך, עם failover אוטומטי.
Idempotency: לכל בקשת משיכה יש eth_gasPrice ייחודי. עיבוד חוזר של אותו ID לא יוצר עסקה כפולה. קריטי לשחזור לאחר תקלות.
ניטור עסקאות: לאחר השידור — בדיקה תקופתית של סטטוס העסקה. אם לאחר N דקות היא לא ב-mempool — ראה אותה כנפלה, שלח מחדש עם nonce נכון.
מה כלול בעבודה
- תיעוד ארכיטקטורה: תיאור סכמת ארנק קר/חמים/חם, לוגיקת אישורים, סכמת חתימה ושחזור מאסון.
- קוד מקור עם אינטגרציה של HSM, multi-sig, ניהול גז ובדיקות AML.
- פריסה והתקנה: הגדרת צומת, מאזני עומס, ניטור (Prometheus/Grafana).
- תיעוד API עבור frontend ופאנל ניהול.
- הכשרת צוות: סדנה על תפעול המערכת ותגובה לאירועים.
- אחריות ל-3 חודשים על באגים שזוהו וייעוץ חינם בנושא שינויים.
לוחות זמנים משוערים
| רכיב | משך |
|---|---|
| הפקדות/משיכות Ethereum + ERC20 | 4-6 שבועות |
| ביטקוין | 3-4 שבועות |
| TRON | 2-3 שבועות |
| כל רשת EVM נוספת | 1-2 שבועות |
| ניהול ארנק חם רב-מטבעי | 3-4 שבועות |
| לוח מחוונים לניהול וניטור | 2-3 שבועות |
מערכת מלאה עבור 5-7 רשתות עם אינטגרציית HSM, בדיקות AML וממשק ניהול — 3-5 חודשים. העלות מחושבת באופן אישי לאחר ביקורת על הפרויקט שלך.
הזמן פיתוח של מערכת הפקדה ומשיכה — קבל פתרון מוכן עם אחריות ותמיכה. אנו מעריכים שקיפות: כל השלבים, לוחות הזמנים והעלויות קבועים בחוזה. קבל ייעוץ — נענה על שאלות ונציע את הארכיטקטורה האופטימלית לפרויקט שלך. צור איתנו קשר להערכת עלות — תוך יומיים ננתח את התשתית שלך ונשלח הצעה מסחרית.







