אנו מתמודדים מדי יום עם ביטויי גיבוי שאבדו: לקוח רשם 12 מילים על פיסת נייר, הניח אותה במגירת שולחן ושכח. לפי Chainalysis, 20–25% מכלל הביטקוינים אובדים באופן בלתי הפיך בדרך זו. המהנדסים שלנו מפתחים ארנקים עם שחזור חברתי—מנגנון שמציל נכסים כאשר מפתח אובד. הזמינו הטמעה כזו במפתח מוכן: אנו מתכננים את החוזה, מגדירים אפוטרופוסים ומבצעים ביקורת. בממוצע, פרויקט אורך בין 4 ל-12 שבועות בהתאם למורכבות.
שחזור חברתי הוא רעיון של ויטליק בוטרין, שמיושם ב-Argent וב-Loopring, וזמין כעת באופן טבעי דרך Account Abstraction (ERC-4337). הארנק הוא חוזה חכם עם שני מצבים: מפתח בעלים לעסקאות יומיומיות וקבוצת אפוטרופוסים לשחזור.
כיצד פועל שחזור חברתי ברמת החוזה
קבוצת אפוטרופוסים ושחזור סף
אפוטרופוסים הם כתובות שיכולות לשנות במשותף את מפתח הבעלים. הבעלים ממנה N אפוטרופוסים וסף (בדרך כלל 3 מתוך 5). אפוטרופוסים אינם נוגעים בנכסים—הם רק קוראים ל-initiateRecovery ול-finalizeRecovery. זהו הבדל מרכזי: אפוטרופוס שנפרץ אינו יכול לגנוב כספים, אלא רק ליזום שינוי מפתח.
contract SocialRecoveryWallet {
address public owner;
mapping(address => bool) public isGuardian;
uint256 public guardianCount;
uint256 public threshold;
uint256 public recoveryDelay; // timelock в секундах
struct RecoveryRequest {
address proposedOwner;
uint256 approvalCount;
uint256 initiatedAt;
mapping(address => bool) approvals;
}
RecoveryRequest public pendingRecovery;
function initiateRecovery(address _proposedOwner) external onlyGuardian {
require(pendingRecovery.initiatedAt == 0, "Recovery already pending");
pendingRecovery.proposedOwner = _proposedOwner;
pendingRecovery.initiatedAt = block.timestamp;
pendingRecovery.approvalCount = 1;
pendingRecovery.approvals[msg.sender] = true;
}
function approveRecovery() external onlyGuardian {
require(pendingRecovery.initiatedAt != 0, "No pending recovery");
require(!pendingRecovery.approvals[msg.sender], "Already approved");
pendingRecovery.approvals[msg.sender] = true;
pendingRecovery.approvalCount++;
}
function finalizeRecovery() external {
require(pendingRecovery.approvalCount >= threshold, "Insufficient approvals");
require(
block.timestamp >= pendingRecovery.initiatedAt + recoveryDelay,
"Timelock not expired"
);
owner = pendingRecovery.proposedOwner;
delete pendingRecovery;
}
} מדוע timelock הוא קריטי
contract SocialRecoveryWallet { address public owner; mapping(address => bool) public isGuardian; uint256 public guardianCount; uint256 public threshold; uint256 public recoveryDelay; // timelock в секундах struct RecoveryRequest { address proposedOwner; uint256 approvalCount; uint256 initiatedAt; mapping(address => bool) approvals; } RecoveryRequest public pendingRecovery; function initiateRecovery(address _proposedOwner) external onlyGuardian { require(pendingRecovery.initiatedAt == 0, "Recovery already pending"); pendingRecovery.proposedOwner = _proposedOwner; pendingRecovery.initiatedAt = block.timestamp; pendingRecovery.approvalCount = 1; pendingRecovery.approvals[msg.sender] = true; } function approveRecovery() external onlyGuardian { require(pendingRecovery.initiatedAt != 0, "No pending recovery"); require(!pendingRecovery.approvals[msg.sender], "Already approved"); pendingRecovery.approvals[msg.sender] = true; pendingRecovery.approvalCount++; } function finalizeRecovery() external { require(pendingRecovery.approvalCount >= threshold, "Insufficient approvals"); require( block.timestamp >= pendingRecovery.initiatedAt + recoveryDelay, "Timelock not expired" ); owner = pendingRecovery.proposedOwner; delete pendingRecovery; } } הוא פרמטר חובה. בלעדיו: סף שנפרץ → אובדן שליטה מיידי. עם timelock (Argent משתמשת ב-24–48 שעות, למוסדיים 72+ שעות) לבעלים יש חלון לביטול. בפועל, זה מפחית את הסיכון לאובדן נכסים פי 3 בהשוואה לשחזור מיידי.
ניהול אפוטרופוסים עם עיכוב
הוספה והסרה של אפוטרופוסים משתמשות גם ב-timelock—אחרת הבעלים יכול להחליף את כל האפוטרופוסים לפני מכירה. אנו משתמשים בתבנית recoveryDelay:
mapping(address => uint256) public pendingGuardianAdditions;
uint256 public guardianAddDelay;
function scheduleAddGuardian(address _guardian) external onlyOwner {
pendingGuardianAdditions[_guardian] = block.timestamp + guardianAddDelay;
}
function confirmAddGuardian(address _guardian) external {
require(pendingGuardianAdditions[_guardian] != 0, "Not scheduled");
require(block.timestamp >= pendingGuardianAdditions[_guardian], "Timelock active");
isGuardian[_guardian] = true;
guardianCount++;
delete pendingGuardianAdditions[_guardian];
} כיצד לבחור אפוטרופוסים?
בחירת אפוטרופוסים היא משימה חברתית-ארכיטקטונית. אפשרויות:
- אנשים מהימנים: 3 אנשים קרובים, כל אחד מחזיק מפתח אפוטרופוס בארנק שלו. התוכנית הפשוטה ביותר.
- ארנק חומרה + טלפון + שירות אפוטרופוס: Ledger גיבוי + טלפון + שירות (Argent או מותאם אישית). אם שניים מתוך שלושה אובדים, שחזור.
- Multisig כאפוטרופוס: Safe{Wallet} כאפוטרופוס. שחזור דורש קוורום ב-Safe. מתאים לתאגידים.
- חוזה חכם כאפוטרופוס: חוזה timelock של הארגון, שחזור באמצעות הצבעת ממשל.
| סוג אפוטרופוס | נוחות | ביזור | מתאים ל |
|---|---|---|---|
| אנשים מהימנים (3 מתוך 5) | גבוהה | גבוה | משתמשים קמעונאיים |
| חומרה + נייד + שירות | בינונית | בינוני | משתמשים מתקדמים |
| Multisig תאגידי | נמוכה | גבוה | תאגידים |
| ממשל DAO | נמוכה מאוד | מקסימלי | בבעלות פרוטוקול |
ERC-4337 ושחזור חברתי: שחזור ללא גז
Account Abstraction (ERC-4337) הופך שחזור חברתי לתבנית טבעית. הארנק הוא כבר חוזה חכם, אין צורך להמיר EOA. UserOperation מאפשר:
- שחזור ללא גז: Paymaster מכסה גז עבור אפוטרופוסים והמשתמש.
- אישורים מצטברים: מספר אפוטרופוסים באצווה אחת.
- התחברות חברתית כאפוטרופוס: מפתח מאוחסן ב-passkey/WebAuthn בטלפון.
יישום דרך Kernel (ZeroDev) או Biconomy Smart Account v2: לשניהם מערכת תוספים שבה שחזור חברתי הוא מודול.
זרימת שחזור ERC-4337
// Guardian подписывает UserOperation для approveRecovery
const userOp = await guardianSmartAccount.buildUserOperation({
target: walletAddress,
data: wallet.interface.encodeFunctionData('approveRecovery', [])
});
// Paymaster спонсирует gas
const sponsoredOp = await paymasterClient.sponsorUserOperation(userOp);
await bundlerClient.sendUserOperation(sponsoredOp);זה משנה את חוויית המשתמש: האפוטרופוס אינו צריך ETH לגז, הוא רק חותם על אישור בטלפון.
הגנה מפני התקפות
Griefing באמצעות שחזור ספאם
כל אפוטרופוס יכול ליזום שחזור ולחסום את הארנק. פתרון: שחזור אינו חוסם עסקאות של הבעלים, או שניתן ליזום אותו רק על ידי מספר אפוטרופוסים במשותף.
הנדסה חברתית
תוקף משכנע אפוטרופוסים שהמשתמש איבד את המפתח. הגנה: timelock + התראות (אימייל/פוש/בוט טלגרם) + אימות מחוץ לרשת.
Front-running של finalizeRecovery
תוקף רואה את pendingGuardianAdd ב-mempool ומחליף את הכתובת. הגנה: commit-reveal או mempool פרטי.
תיאום אפוטרופוסים מחוץ לרשת
אפוטרופוסים זקוקים לתיאום ללא גז על הרשת. אפשרויות:
- שירות אפוטרופוס מרכזי (Argent) – נוח אך נקודת כשל מרכזית.
- IPFS + צבירת חתימות – אפוטרופוסים מפרסמים חתימות ב-IPFS, מצרף שולח batchApprove.
- הודעות מוצפנות E2E – דרך Signal/Matrix, טכנולוגיה נמוכה, עצמאות מקסימלית.
ההיברידית שלנו: שרת התראות מודיע לאפוטרופוסים, הם מאשרים דרך dApp, ומצרף יוצר אצווה.
מה כלול בפיתוח
אנו מספקים חבילה מלאה: תיעוד ארכיטקטורה, קוד מקור של חוזה חכם (Solidity), frontend (wagmi+viem), תצורות Foundry, הוראות פריסה, סמינר מקוון להכשרת הצוות וחודש תמיכה לאחר ההשקה. אנו נעריך את הפרויקט שלכם בחינם—צרו קשר.
תהליך העבודה
- ניתוח (3-5 ימים). קהל יעד, בחירת אפוטרופוסים, צורך ב-AA, ללא גז, multichain.
- עיצוב חוזה (3-5 ימים). ניהול אפוטרופוסים, פרמטרי timelock, זרימת שחזור, אינטגרציית ERC-4337.
- פיתוח (4-8 שבועות). חוזה ליבה → ניהול אפוטרופוסים → זרימת שחזור → frontend → ממשק תיאום אפוטרופוסים.
- ביקורת. חובה: החוזה מנהל כספים. אנו בודקים reentrancy, timelock, וקטורי griefing.
- בדיקות. בדיקות fork על mainnet, סימולציה מלאה של זרימת שחזור.
| שלב | משך (ימים) | תוצאה |
|---|---|---|
| ניתוח | 3-5 | מפרט טכני |
| עיצוב | 3-5 | ארכיטקטורת חוזה |
| פיתוח | 28-56 | קוד מקור, frontend |
| ביקורת | 7-14 | דוח ביקורת |
| בדיקות | 5-7 | בדיקות fork |
טכנולוגיות וכלים
Solidity 0.8.x + OpenZeppelin, Foundry, ERC-4337 SDK, wagmi + viem, WalletConnect v2. אנו משתמשים ב-Tenderly לניטור.
לוח זמנים ועלות
ארנק בסיסי ללא AA: 3-5 שבועות. עם ERC-4337, שחזור ללא גז וממשק אפוטרופוסים: 8-12 שבועות. העלות מחושבת באופן אישי—צרו קשר להערכה.
השלמנו 20+ פרויקטים בתחום השחזור החברתי במשך 5 שנות עבודה. המהנדסים שלנו הם מחברי מאמרים על ERC-4337 ותורמים לפתרונות קוד פתוח.







