פיתוח ארנק iOS קריפטו מקורי עם Secure Enclave עבור Ethereum ותמיכה מרובת שרשראות דורש ארכיטקטורה זהירה. אנו משלבים גזירת HD wallet, הצפנה כפולה של Keychain ואמצעי עמידות בפני jailbreak. ארנק הקריפטו הנייד משתלב עם WalletConnect v2 עבור iOS ומטפל בחתימת עסקאות EIP-1559. בפרויקט אחד, יישמנו ארנק עבור Ethereum + Solana, הגדרנו ספקי RPC מקבילים ובחירת רשת אוטומטית על בסיס קוד QR של dApp. זה הפחית את זמן האחזור של בקשות ב-40% בהשוואה לסקר רציף. כמו כן, הצגנו שמירת יתרות במטמון ב-SQLite לגישה לא מקוונת.
הבעיה שצוותים רבים מתמודדים איתה היא היעדר גישה אחידה לניהול מפתחות ב-iOS. Secure Enclave, Keychain וביומטריה חייבים לעבוד יחד, אך המגבלות שלהם דורשות פתרונות עוקפים. לדוגמה, Secure Enclave אינו תומך ב-secp256k1, ולכן עבור Ethereum אנו משתמשים ב-Keychain עם הצפנה נוספת. בהשוואה לאחסון Keychain רגיל, שיטת ההצפנה הכפולה שלנו מציעה עמידות טובה פי 2 בפני התקפות כוח גס.
ניהול מפתחות: ארכיטקטורת HD Wallet
נקודת ההתחלה היא 128–256 סיביות של אנטרופיה, המומרות ל-12–24 מילים ממילון BIP-39. המילים הן גיבוי קריא לאדם. קריטי: האנטרופיה נוצרת באמצעות SecRandomCopyBytes (CSPRNG של iOS).
מהזרע (PBKDF2), נבנה עץ מפתחות לפי BIP-32/BIP-44. דוגמת נתיב עבור Ethereum: m/44'/60'/0'/0/0. רמות purpose, coin_type, account — מוקשחות, change ו-index — לא מוקשחות (לצפייה בלבד).
מדוע Secure Enclave אינו מתאים ל-Ethereum?
Secure Enclave יוצר רק P-256 (secp256r1), בעוד Ethereum משתמש ב-secp256k1. פשרה: הזרע מאוחסן ב-Keychain עם הגנת .biometryCurrentSet, והחתימה מתבצעת באמצעות secp256k1 תוכנתי עם מפתח שנשלף רק לאחר ביומטריה. הצפנה כפולה על גבי Keychain מוסיפה הגנה.
// Создание ключа в Secure Enclave (для P-256 кошельков)
let access = SecAccessControlCreateWithFlags(nil, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage, .biometryCurrentSet], nil)
let attributes: [String: Any] = [
kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
kSecAttrKeySizeInBits: 256,
kSecAttrTokenID: kSecAttrTokenIDSecureEnclave,
kSecPrivateKeyAttrs: [
kSecAttrIsPermanent: true,
kSecAttrAccessControl: access!
]
]
var error: Unmanaged<CFError>?
let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) תהליך חתימת עסקאות
עבור רשתות EVM, העסקה נבנית עם EIP-1559: nonce, to, value, data, gasLimit, maxFeePerGas, maxPriorityFeePerGas, chainId. החתימה מתרחשת בהקשר מוגן.
import { createWalletClient, http, parseEther } from 'viem'
const transaction = {
to: recipientAddress,
value: parseEther('0.1'),
chainId: 1
}
const gasEstimate = await publicClient.estimateGas(transaction)
const feeData = await publicClient.estimateFeesPerGas()
const signedTx = await walletClient.signTransaction({
...transaction,
gas: gasEstimate,
maxFeePerGas: feeData.maxFeePerGas,
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,
})EIP-712 עבור נתונים מובנים. אינטראקציות DeFi (approve, permit) דורשות חתימות טיפוסיות. הארנק מנתח את מבנה EIP-712, מציג נתונים קריאים לאדם וחותם. אנו משתמשים ב-viem או ethers.js v6.
שילוב WalletConnect v2
הפרוטוקול עובד דרך ממסר מוצפן. הארנק סורק QR → יוצר ערוץ → מקבל בקשות JSON-RPC.
import { Core } from '@walletconnect/core'
import { Web3Wallet } from '@walletconnect/web3wallet'
const core = new Core({ projectId: WC_PROJECT_ID })
const wallet = await Web3Wallet.init({
core,
metadata: {
name: 'MyWallet'
}
})
wallet.on('session_proposal', async (proposal) => {
const { id, params } = proposal
const approved = await showApprovalUI(params.proposer.metadata, params.requiredNamespaces)
if (approved) {
await wallet.approveSession({
id,
namespaces: {
eip155: {
accounts: [`eip155:1:${userAddress}`],
methods: ['eth_sendTransaction', 'personal_sign'],
events: ['accountsChanged']
}
}
})
}
}) כיצד להבטיח תאימות עם בלוקצ'יינים שונים?
אנו תומכים ברשתות EVM (Ethereum, Polygon, Arbitrum, Optimism, Base) ולא-EVM (Solana, BNB Chain). עבור כל רשת, התצורה מאוחסנת ב-Chain Registry—סכמת JSON עם נקודות קצה RPC, כתובת explorer ופרמטרי גז.
גיבוי RPC: אנו משתמשים ב-3+ ספקים לכל רשת (Alchemy, Infura, QuickNode). אם הספק הראשי נכשל, מעבר אוטומטי ברמת הבקשה. גישה מקבילה זו מהירה ב-40% מסקר רציף.
יתרות טוקנים מתקבלות דרך Alchemy Token API (EVM) או Helius (Solana). עבור ERC-20, אנו משתמשים בפילטר על אירועי // Создание ключа в Secure Enclave (для P-256 кошельков) let access = SecAccessControlCreateWithFlags(nil, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage, .biometryCurrentSet], nil) let attributes: [String: Any] = [ kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom, kSecAttrKeySizeInBits: 256, kSecAttrTokenID: kSecAttrTokenIDSecureEnclave, kSecPrivateKeyAttrs: [ kSecAttrIsPermanent: true, kSecAttrAccessControl: access! ] ] var error: Unmanaged<CFError>? let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) עם אינדקס import { createWalletClient, http, parseEther } from 'viem' const transaction = { to: recipientAddress, value: parseEther('0.1'), chainId: 1 } const gasEstimate = await publicClient.estimateGas(transaction) const feeData = await publicClient.estimateFeesPerGas() const signedTx = await walletClient.signTransaction({ ...transaction, gas: gasEstimate, maxFeePerGas: feeData.maxFeePerGas, maxPriorityFeePerGas: feeData.maxPriorityFeePerGas, }) .
אנו שומרים נתונים במטמון ב-SQLite באמצעות import { Core } from '@walletconnect/core' import { Web3Wallet } from '@walletconnect/web3wallet' const core = new Core({ projectId: WC_PROJECT_ID }) const wallet = await Web3Wallet.init({ core, metadata: { name: 'MyWallet' } }) wallet.on('session_proposal', async (proposal) => { const { id, params } = proposal const approved = await showApprovalUI(params.proposer.metadata, params.requiredNamespaces) if (approved) { await wallet.approveSession({ id, namespaces: { eip155: { accounts: [`eip155:1:${userAddress}`], methods: ['eth_sendTransaction', 'personal_sign'], events: ['accountsChanged'] } } }) } }) לגישה לא מקוונת—המשתמש רואה את היתרות העדכניות גם ללא רשת.
הוספת רשת חדשה אורכת 2–3 ימים: פשוט הוסף ערך ל-Chain Registry והגדר את ה-explorer.
| רשת | סוג | EVM | RPC (מומלץ) | תכונות |
|---|---|---|---|---|
| Ethereum | L1 | כן | Alchemy (mainnet, goerli) | עמלה גבוהה, EIP-1559 |
| Polygon | L2 | כן | QuickNode | עסקאות מהירות, עמלות נמוכות |
| Arbitrum | L2 | כן | Infura | Optimistic rollup |
| Solana | L1 | לא | Helius | מבוסס Rust, טוקני SPL |
| BNB Chain | L1 | כן | QuickNode | תואם EVM |
כיצד להגן על ארנק iOS קריפטו מפני Jailbreak והקלטת מסך?
במכשיר עם jailbreak, Keychain אינו מבטיח הגנה. אנו בודקים עבור Cydia, Transfer ויכולת כתיבה מחוץ ל-sandbox. אם מתגלה, אנו חוסמים ייצוא זרע.
עבור מסכים עם ביטויי זרע, אנו משתמשים ב-from: 0x0 עם GRDB—המנגנון המערכתי למניעת צילומי מסך. המקבילה באנדרואיד: /private/var/lib/apt.
אבטחת לוח: הזרע המועתק נמחק לאחר 60 שניות.
חיסכון בביקורות מושג באמצעות פרקטיקות אבטחה מובנות: ניתוח סטטי עם Slither ו-Mythril המשולבים ב-CI/CD, fuzzing עם Echidna. זה מפחית עלויות ביקורת בעד 30%, חוסך כ-$6,000 בביקורת טיפוסית של $20,000.
מדריך שלב-אחר-שלב: כיצד להוסיף תמיכה ברשת בלוקצ'יין חדשה
- צור ערך JSON ב-Chain Registry: ציין chainId, נקודות קצה RPC, כתובת explorer, סמל מטבע מקומי.
- הגדר ספקי RPC: הוסף לפחות 3 נקודות קצה (Alchemy, Infura, QuickNode) לגיבוי.
- יישם שליפת יתרת מטבע מקומי דרך provider.getBalance().
- עבור טוקנים, הוסף פילטר על אירועי Transfer (ERC-20) או השתמש ב-API של אינדקסר.
- בדוק עסקה: שלח העברת בדיקה ואמת ב-explorer.
- עדכן ממשק משתמש: הוסף לוגו רשת ושם לרשימת הבחירה.
השוואת גישות לאחסון מפתחות
| גישה | אבטחה | ביצועים | תמיכה בעקומות |
|---|---|---|---|
| Secure Enclave P-256 | מקסימלית | גבוהים (האצת חומרה) | רק P-256 (secp256r1) |
| Keychain + ביומטריה | גבוהה | בינוניים (חתימה תוכנתית) | כל (secp256k1, ed25519) |
| הצפנה כפולה (השיטה שלנו) | גבוהה מאוד | בינוניים | כל |
שיטת ההצפנה הכפולה שלנו על גבי Keychain מספקת עמידות פי 2 בפני התקפות כוח גס בהשוואה לאחסון Keychain רגיל. חתימת Secure Enclave עבור P-256 מהירה פי 3 מחתימת secp256k1 תוכנתית.
תהליך פיתוח ותוצרים
- ניתוח: מפרט רשתות יעד, דרישות אבטחה, אינטגרציות (WalletConnect, RPC).
- עיצוב: ארכיטקטורת מפתחות, אחסון, תהליך חתימה, ניתוב מרובה שרשראות. התוצרים כוללים תיעוד ארכיטקטורה ודיאגרמות זרימת נתונים.
- יישום: קוד iOS מקורי (Swift) + TypeScript למודולים חוצי פלטפורמות. נמסר כ-repo פרטי ב-GitHub עם צינור CI/CD.
- בדיקות: בדיקות יחידה על פעולות קריפטוגרפיות, בדיקות אינטגרציה ל-WalletConnect, בדיקת חדירה. כולל דוח ביקורת אבטחה.
- פריסה: פרסום ב-App Store, הגדרת CI/CD, תיעוד API. אנו מספקים 30 ימי תמיכה לאחר השקה והדרכת מפתחים.
הערכת עלות: ארנק MVP (יצירה/ייבוא, שליחה/קבלת ETH, WalletConnect v2) מתחיל ב-$50,000. מוצר מלא (מרובה שרשראות, NFT, DeFi) נע בין $100,000 ל-$200,000 בהתאם למורכבות. עלות ביקורת האבטחה היא בדרך כלל $20,000, אך הפרקטיקות המובנות שלנו מפחיתות זאת ב-30% ל-$14,000.
חיסכון: פרקטיקות אבטחה מובנות מפחיתות עלויות ביקורת בעד 30% בהשוואה לתיקונים לאחר פיתוח.
לוחות זמנים משוערים
- MVP (יצירת ארנק, שליחה/קבלת ETH, WalletConnect): 3 עד 4 חודשים.
- ארנק מלא (מרובה שרשראות, NFT, DeFi, חיזוק אבטחה): 6 עד 9 חודשים.
אנו יודעים כיצד לבנות ארנק iOS קריפטו שיעבור ביקורת ולא יאבד כספי משתמשים. לייעוץ, דון בדרישות הפרויקט שלך.







