יישום חתימה מרובה (Multisig) בארנק קריפטו נייד
חתימה על עסקה עם מפתח פרטי יחיד היא סיכון. אם המפתח נגנב או נפרץ, כל הנכסים אבודים. חתימה מרובה פותרת זאת על ידי דרישת מספר אישורים בלתי תלויים. בארנקים ניידים, אנו מיישמים שתי גישות: חוזה חכם (Safe/Gnosis) ו-MPC (חישוב רב-צדדי). הניסיון שלנו—30+ פרויקטים בבלוקצ'יין—מראה שבחירת הסכמה הנכונה קובעת גם את האבטחה וגם את חוויית המשתמש.
Gnosis Safe הוא אחד החוזים החכמים הפופולריים ביותר לחתימה מרובה; פרוטוקול GG20/GG21 משמש בפתרונות MPC (ראה תיעוד Safe ו-ויקיפדיה על חתימה מרובה).
חתימה מרובה בנייד היא לא רק "צריך N מתוך M חתימות". היא כוללת תיאום בין מכשירים או אנשים, ניהול מצב חתימה, אחסון עסקאות ממתינות, וחוויית משתמש שבה המשתמש מבין היכן הוא נמצא בתהליך. הערימה והמורכבות תלויות מאוד במה בדיוק הכוונה ב"חתימה מרובה".
שתי גישות: Safe לעומת MPC — באיזה לבחור?
| קריטריון | Safe (חוזה חכם) | MPC (ECDSA סף) |
|---|---|---|
| עקבות על-השרשרת | כן, כל חתימה מאושרת | לא, רק החתימה הסופית |
| גמישות | כל חוזה, אך גז גבוה | כל חוזה, גז נמוך |
| עיכוב חתימה | מיידי (הצבעה מחוץ לשרשרת) | 200–500 אלפיות השנייה לכל סבב חתימה |
| אבטחה | תלוי בחוזה החכם | המפתח אף פעם לא מורכב פיזית |
| מורכבות אינטגרציה | נמוכה (SDK) | גבוהה (ספריות מקוריות) |
חתימה מרובה בחוזה חכם (Safe/Gnosis). החוזה החכם בודק N חתימות לפני ביצוע. העסקה מאוחסנת בחוזה כ-pending. כל חותם מאשר באופן עצמאי דרך approveHash. פתרון פשוט לארנקי צוות. אפליקציית הנייד היא לקוח ל-API של שירות העסקאות של Safe (safe-transaction-service), אשר מאחסן עסקאות ממתינות מחוץ לשרשרת.
MPC (חישוב רב-צדדי). המפתח הפרטי אף פעם לא מורכב פיזית במקום אחד. כל צד מאחסן חלק מהמפתח, וחתימות נוצרות באופן קולקטיבי באמצעות פרוטוקולים כמו GG20 או CGGMP21 (ECDSA סף). מורכב יותר ליישום, אין עקבות על-השרשרת, עובד עם כל חוזה.
לארנקי צרכנים, לעיתים קרובות נדרש MPC (חלק אחד במכשיר, חלק אחד בשרת—סכמת 2-מתוך-2 להגנה מפני גניבת מכשיר). לארנקי חברות, Safe 3-מתוך-5 נפוץ.
השוואה: MPC יכול לספק עד פי 2 עלויות גז נמוכות יותר מ-Safe עם חותמים רבים, מכיוון שרק החתימה הסופית נרשמת על-השרשרת. עם זאת, Safe פשוט יותר לאינטגרציה ושקוף יותר לביקורת.
כיצד להגדיר Safe Multisig בנייד
אינטגרציה דרך Safe{Core} SDK:
import { SafeFactory, SafeAccountConfig } from '@safe-global/protocol-kit'
const safeAccountConfig: SafeAccountConfig = {
owners: [owner1Address, owner2Address, owner3Address],
threshold: 2,
}
const safeFactory = await SafeFactory.create({ ethAdapter })
const safe = await safeFactory.deploySafe({ safeAccountConfig })כדי לחתום על עסקה ממתינה:
const safeTransaction = await safe.createTransaction({ transactions: [{ to, data, value }] })
const txHash = await safe.getTransactionHash(safeTransaction)
const signature = await safe.signTransactionHash(txHash)
await safeTxService.proposeTransaction({ safeAddress, safeTransactionData: safeTransaction.data, safeTxHash: txHash, senderSignature: signature.data })החותם השני מקבל התראה push, רואה את פרטי העסקה, וחותם עם המפתח שלו. כאשר נאספות N חתימות, האפליקציה שולחת import { SafeFactory, SafeAccountConfig } from '@safe-global/protocol-kit' const safeAccountConfig: SafeAccountConfig = { owners: [owner1Address, owner2Address, owner3Address], threshold: 2, } const safeFactory = await SafeFactory.create({ ethAdapter }) const safe = await safeFactory.deploySafe({ safeAccountConfig }) .
תוצאות מוכחות
בפרויקט אחרון לפלטפורמת מסחר בנפח גבוה, יישמנו סכמת 2-מתוך-2 MPC באמצעות tss-lib ו-Rust bindings. זמן החתימה הממוצע היה 350 אלפיות השנייה, ועלויות הגז הופחתו ב-60% בהשוואה להגדרת Safe דומה, תוך הבטחה שמכשיר שנפרץ לבדו לא יכול לרוקן כספים.
מדוע חתימה מרובה קריטית לאבטחה
מפתח פרטי יחיד הוא נקודת כשל אחת. אם המכשיר נגנב, תוקף מקבל גישה מלאה לכספים. חתימה מרובה מבטלת את הפגיעות הזו: גם אם המכשיר נפרץ, ללא חותם שני (למשל, חלק בשרת או מכשיר נייד אחר) העסקה לא יכולה להתבצע. אנו מבטיחים יישום נכון גם עבור Safe וגם עבור MPC, עם ביקורות אבטחה בכל שלב.
כיצד לבחור בין Safe ל-MPC
ההחלטה תלויה בתרחיש:
- ארנק צוות עם שליטה בחתימה מרובה: Safe—שקוף, פשוט, קל לביקורת.
- הגנה מפני גניבת מכשיר: MPC 2-מתוך-2 (מכשיר + שרת)—המפתח אף פעם לא עוזב את החלק, גם אם השרת נפרץ.
- סודיות עסקאות: MPC—אין עקבות הצבעה על-השרשרת.
MPC: מה אנו מיישמים באופן מקורי
עבור סכמת 2-מתוך-2 (טלפון + שרת), אנו משתמשים בספריות קוד פתוח: const safeTransaction = await safe.createTransaction({ transactions: [{ to, data, value }] }) const txHash = await safe.getTransactionHash(safeTransaction) const signature = await safe.signTransactionHash(txHash) await safeTxService.proposeTransaction({ safeAddress, safeTransactionData: safeTransaction.data, safeTxHash: txHash, senderSignature: signature.data }) (Go), executeTransaction (Rust). בנייד—מודול מקורי (Swift/Kotlin) עם bindings ל-Rust דרך UniFFI או C FFI.
פרטים על יצירת מפתח (keygen)
Keygen הוא חילופי הודעות חד-פעמיים בין המכשיר לשרת דרך WebSocket. תוצאה: כל צד מקבל את החלק שלו ומאחסן אותו מקומית; המפתח המלא אף פעם לא קיים בשום מקום. לאחר keygen, ניתן לחתום על עסקאות.חתימה על עסקה: סבב חתימה אינטראקטיבי (2–4 הודעות הלוך-חזור), לוקח 200–500 אלפיות השנייה בחיבור טוב. זה מקובל, אבל יש להציג התקדמות.
ניהול עסקאות ממתינות בממשק המשתמש
רשימת עסקאות עם סטטוסים: tss-lib (כמה מתוך N נאספו), multi-party-ecdsa (ניתן לבצע), pending_signatures, ready. כל עסקה מציגה פרטים: כתובת מקבל, סכום, נתוני קריאה (מפוענחים אם ABI ידוע). הודע לחתמים דרך FCM/APNs.
מה כלול בעבודה
- ביקורת דרישות ובחירת סכמה (Safe או MPC).
- ארכיטקטורה: סכמת אחסון חלקים, התראות push, deep linking.
- אינטגרציה: שירות עסקאות Safe (1–2 שבועות) או מודול MPC מקורי (1–3 חודשים).
- בדיקות: נכונות חתימה, מקרי קצה (סירוב חותם, timeouts).
- תיעוד וסקירת קוד.
- תמיכה לאחר פריסה.
תהליך ולוח זמנים
| שלב | משך |
|---|---|
| אנליטיקה ובחירת גישה | 1–2 ימים |
| עיצוב סכמה | 3–5 ימים |
| אינטגרציה (Safe) | 1–2 שבועות |
| אינטגרציה (MPC) | 1–3 חודשים |
| בדיקות וביקורת | 1–2 שבועות |
| פריסה ותיעוד | 3–5 ימים |
העלות מחושבת באופן אישי לאחר הערכת היקף. בקש ייעוץ, ואנו נציע את הפתרון האופטימלי לתקציב שלך.
טעויות נפוצות
- לא להתחשב בעיכובי תקשורת ב-MPC—הצג התקדמות.
- לא ליישם גיבוי כאשר השרת לא זמין (עבור MPC עם שרת).
- הזנחת אותנטיות של התראות push (אפשרות לבקשות מזויפות).
קבל פתרון חתימה מרובה turnkey. צור קשר לניתוח פרויקט.







