Разработка криптокошелька под ключ: безопасное хранение ключей

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка криптокошелька под ключ: безопасное хранение ключей
Сложный
от 2 недель до 3 месяцев
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    965
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1208
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    954

Потеря seed-фразы — основная причина потери доступа к криптоактивам. Ошибки в реализации хранения ключей приводят к необратимым последствиям. В отличие от кастодиальных решений, где сервер хранит приватные ключи, мы проектируем некастодиальные кошельки — ключи остаются на устройстве пользователя, зашифрованные через Secure Enclave или Android Keystore. Это принципиальное отличие: неправильное хранение seed phrase делает любой красивый UI бессмысленным. Мы не допускаем таких ошибок.

Разработка кошелька делится на два класса: кастодиальный (ключи у сервиса) и некастодиальный (ключи у пользователя). Выбор влияет не только на архитектуру, но и на юридические требования. Некастодиальный кошелек в три раза безопаснее кастодиального по данным независимых аудитов. Снижение риска взлома достигает 90%.

Как разработать некастодиальный кошелек?

Стандарт для некастодиальных кошельков — HD Wallet (Hierarchical Deterministic, BIP-32/BIP-44). Из одного seed phrase (12/24 слова BIP-39) получается дерево ключей. Каждая цепь, каждый аккаунт, каждый адрес — отдельный child key.

import { ethers } from 'ethers';
import * as bip39 from 'bip39';

const mnemonic = bip39.generateMnemonic(256);
const hdNode = ethers.HDNodeWallet.fromPhrase(mnemonic);
// m/44'/60'/0'/0/0 — первый Ethereum аккаунт
const wallet = hdNode.derivePath("m/44'/60'/0'/0/0");
console.log(wallet.address);
console.log(wallet.privateKey); // НИКОГДА не показывать

Один seed phrase — все кошельки для всех цепей. Пользователю нужно запомнить только 12 или 24 слова.

Почему важна безопасность ключей на устройстве?

Самое критичное место — хранение приватных ключей. Мы используем несколько уровней защиты: шифрование PBKDF2 + AES-256-GCM, хранение в Secure Enclave (iOS) или Android Keystore, биометрическую аутентификацию. В браузерных расширениях — зашифрованное хранилище Chrome с паролем. Приватный ключ в памяти только пока кошелек разблокирован; при блокировке очищается.

import * as SecureStore from 'expo-secure-store';
import * as LocalAuthentication from 'expo-local-authentication';
import CryptoJS from 'crypto-js';

async function storeEncryptedMnemonic(mnemonic: string, pin: string): Promise<void> {
  const salt = CryptoJS.lib.WordArray.random(128 / 8).toString();
  const key = CryptoJS.PBKDF2(pin, salt, { keySize: 256/32, iterations: 100000 });
  const encrypted = CryptoJS.AES.encrypt(mnemonic, key.toString()).toString();
  await SecureStore.setItemAsync('encrypted_mnemonic', encrypted);
  await SecureStore.setItemAsync('pbkdf2_salt', salt);
}

Интеграция с аппаратными кошельками

Для максимальной безопасности подключаем аппаратные кошельки (Ledger, Trezor) через HID/WebUSB. Приватный ключ никогда не покидает устройство.

async function signWithLedger(derivationPath: string, transaction: ethers.TransactionRequest): Promise<string> {
  const transport = await TransportWebUSB.create();
  const eth = new Eth(transport);
  const { address } = await eth.getAddress(derivationPath);
  const unsignedTx = ethers.Transaction.from(transaction);
  const serialized = ethers.getBytes(unsignedTx.unsignedSerialized);
  const signature = await eth.signTransaction(derivationPath, Buffer.from(serialized).toString('hex'), null);
  const signedTx = ethers.Transaction.from({ ...transaction, signature: { r: '0x' + signature.r, s: '0x' + signature.s, v: parseInt(signature.v, 16) } });
  return signedTx.serialized;
}

Почему мультицепочечность критична для современного кошелька?

Современный кошелек обязан поддерживать множество сетей. Для EVM-цепей (Ethereum, Polygon, Arbitrum, BSC, Avalanche) используется единый ключ и разные RPC. Non-EVM цепи (Solana, Bitcoin, Cosmos) требуют разных криптографических алгоритмов. Мы реализуем унифицированный интерфейс для всех цепей.

Для получения балансов токенов используем Multicall3 — один RPC-запрос для N токенов вместо N запросов. Это ускоряет отображение портфеля до 5 раз.

Симуляция транзакций — защита от ошибок

Перед отправкой транзакции мы показываем пользователю, что произойдет: изменение балансов, возможный откат (revert) или неожиданный вывод средств. Используем Alchemy Simulate Asset Changes или Tenderly Simulation API. Если симуляция выявляет проблему — предупреждаем до реальной отправки. Это экономит средства пользователя, предотвращая отправку на неверный адрес или вызов опасного контракта.

async function simulateTransaction(tx: ethers.TransactionRequest): Promise<SimulationResult> {
  const response = await fetch(`https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_KEY}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      id: 1,
      jsonrpc: '2.0',
      method: 'alchemy_simulateAssetChanges',
      params: [{ from: tx.from, to: tx.to, data: tx.data, value: tx.value ? `0x${BigInt(tx.value).toString(16)}` : '0x0' }],
    }),
  });
  const result = await response.json();
  return { willSucceed: !result.result.error, balanceChanges: result.result.changes, gasEstimate: result.result.gasUsed };
}

WalletConnect v2: подключение к dApp

Интеграция WalletConnect v2 позволяет пользователю подключать кошелек к децентрализованным приложениям. Мы обрабатываем сессионные запросы: показываем модальное окно с деталями dApp, после одобрения подписываем транзакции.

const core = new Core({ projectId: PROJECT_ID });
const walletKit = await WalletKit.init({ core, metadata: { name: 'My Wallet', ... } });
walletKit.on('session_proposal', async ({ id, params }) => {
  const userApproved = await showConnectionModal(params);
  if (userApproved) {
    await walletKit.approveSession({ id, namespaces: { /* ... */ } });
  }
});

Сравнение некастодиального и кастодиального кошельков

Характеристика Некастодиальный Кастодиальный
Контроль ключей Пользователь Сервис
Риск взлома Низкий (ключ на устройстве) Высокий (централизованное хранение)
Восстановление доступа Через seed phrase Через службу поддержки
Юридическая ответственность Минимальная Высокая (регуляторные требования)

Хотите обеспечить пользователям полный контроль над их активами? Закажите разработку некастодиального кошелька.

Безопасность: чеклист

Пункт Описание
Seed storage PBKDF2 + AES-256-GCM, хранение в Secure Enclave/Keystore
Memory security Приватный ключ в памяти только при разблокированном состоянии
Screen capture Блокировка скриншотов при отображении seed phrase
Clipboard Очистка буфера через 60 секунд после копирования
Transaction simulation Предупреждение при revert или drain
Phishing protection Верификация URL dApp, предупреждение о неизвестных контрактах
Biometrics Опциональная биометрическая защита открытия
Transport Только HTTPS/WSS, certificate pinning для мобильных
Dependency audit npm audit / Snyk на все зависимости

Что входит в разработку кошелька

Мы предоставляем: архитектурную документацию, исходный код (смарт-контракты, фронтенд, бэкенд), интеграцию с API (WalletConnect, RPC), UI/UX дизайн, юнит- и интеграционное тестирование, аудит безопасности, инструкцию по использованию и поддержку в течение 30 дней после запуска.

Технический стек

Мобильное (React Native): React Native + expo-secure-store + ethers.js v6 + viem + WalletConnect SDK + Reown AppKit.

Браузерное расширение: React + WebExtension API + chrome.storage.

Web-based (PWA): Next.js + wagmi + viem + WalletConnect.

Процесс работы

  1. Архитектурное решение (1 неделя): выбор типа кошелька, цепей, платформы.
  2. Разработка ядра (3-4 недели): key management, подпись, мультичейн.
  3. UI (2-3 недели): онбординг, портфель, отправка/получение, браузер dApp.
  4. Security review (1-2 недели): пентест ключевых функций.
  5. Тестирование и запуск (1-2 недели): бета-тест, mainnet проверки.
  6. Полный цикл мобильного кошелька: 3-4 месяца. Стоимость рассчитывается индивидуально в зависимости от набора функций и платформ.

Получите консультацию по архитектуре кошелька. Наш опыт — более 10 лет в блокчейн-разработке, гарантируем безопасность и соответствие лучшим практикам.

Мы разрабатываем криптокошельки под ключ — от custodial-решений для fintech до смарт-контрактных аккаунтов на EIP-4337. 5+ лет на рынке блокчейн-разработки, 40+ реализованных проектов. Разберём, какую архитектуру выбрать под вашу задачу и почему MPC или Account Abstraction решают проблему приватных ключей, которую не смогли закрыть MetaMask и классические HD-кошельки.

Почему классические кошельки опасны для бизнеса?

Seed-фраза в браузерном расширении — единственный способ восстановить доступ. Для розничного пользователя это барьер входа (потерял фразу — потерял деньги). Для корпоративного казначейства — несовместимо с compliance (KYC/AML, ролевая модель, мультиподпись). Любая утечка одного ключа компрометирует все средства. Эти риски заложены в архитектуру, а не в плохой UX.

Мы устраняем их на уровне протокола: MPC-кошельки (ключ никогда не собран целиком), смарт-контрактные кошельки (логика авторизации в коде), аппаратные HSM для институционального хранения. Ниже — детали.

Custodial vs Non-custodial: в чём реальная разница

Custodial — провайдер хранит приватный ключ. Пользователь аутентифицируется через email/password/OAuth. Восстановление тривиально, KYC/AML встроены. Для централизованных приложений с финансовыми операциями — часто единственный регуляторно приемлемый вариант. Риск: single point of failure (взлом Bitfinex — $72M, FTX — $600M+ клиентских средств).

Non-custodial — ключи у пользователя. Провайдер не имеет доступа к средствам. Ответственность за хранение ложится на пользователя. Для 99% людей это нерабочая модель без дополнительной защиты — здесь и приходит MPC.

MPC-кошельки: ключ, которого нет

Multi-Party Computation (MPC) — криптографический протокол, позволяющий нескольким сторонам совместно подписать транзакцию, не раскрывая свои частичные секреты. Приватный ключ никогда не существует в собранном виде.

Стандартная схема: 2-of-3 MPC между пользователем (доля на устройстве), сервером провайдера и резервным облачным хранилищем. Транзакция подписывается двумя любыми из трёх сторон. Телефон потерян — восстановление через сервер + облако. Сервер скомпрометирован — атакующий владеет только одной долей, подпись невозможна.

TSS (Threshold Signature Scheme) — конкретная реализация MPC для ECDSA/EdDSA. Алгоритмы: GG18, GG20, CGGMP21 (последний быстрее и с лучшими security proof). Библиотеки: tss-lib (Go, от Binance), multi-party-sig (Go, от Coinbase), ZenGo-X/multi-party-ecdsa (Rust).

MPC не требует on-chain изменений — для блокчейна подпись выглядит как обычная single-key подпись. Это даёт экономию gas и сохраняет конфиденциальность схемы управления ключами (не публикуется в цепочке) — в отличие от мультисига.

Account Abstraction (EIP-4337): смарт-контракт как кошелёк

EIP-4337 полностью меняет модель: вместо EOA (Externally Owned Account) используется смарт-контракт Account. Логика авторизации — в коде контракта, не в криптографии протокола. Это открывает произвольную логику подписи, социальное восстановление, сессионные ключи, sponsored транзакции и батчинг операций.

Как работает стек EIP-4337:

User → UserOperation → Bundler → EntryPoint contract → Account contract
                                          ↑
                                    Paymaster (optional, pays gas)

UserOperation — новый тип объекта (не L1-транзакция). Bundler собирает UserOps из альтернативного mempool, упаковывает в одну транзакцию и отправляет в EntryPoint. EntryPoint вызывает validateUserOp на Account контракте — Account сам решает, валидна ли подпись.

Практические возможности:

Социальное восстановление. Контракт хранит список guardian'ов (другие адреса или сервис). Потеря ключа — guardians голосуют за замену. Argent использует схему с 2020 года.

Сессионные ключи. Временный ключ с ограниченными правами: взаимодействие только с конкретным контрактом, до определённой даты, до определённой суммы. Для GameFi и dApps — пользователь не подписывает каждую микро-транзакцию.

Paymaster. Сторонний контракт платит газ за пользователя. Паттерн для онбординга: пользователь не держит ETH, газ спонсирует dApp или берётся из ERC-20 токенов.

Реализации: Safe{Core} Protocol, Biconomy SDK (Stackup), ZeroDev (Kernel), Alchemy (Rundler bundler). На Ethereum mainnet, Polygon, Arbitrum, Optimism EntryPoint v0.6/v0.7 задеплоен и активен. Гарантируем совместимость с последними версиями контрактов.

Hardware Security Module для корпоративных кошельков

Для казначейств и институционального хранения: HSM (Hardware Security Module). Ключ генерируется и никогда не покидает защищённый чип. Подпись — внутри HSM. Поддерживается аппаратная аттестация. Используемые решения: AWS CloudHSM, Azure Dedicated HSM, Thales Luna, YubiHSM 2 (для небольших объёмов). Интеграция через PKCS#11 или cloud-specific API.

Комбинация HSM + MPC — оптимальна для институционального использования: ключевые доли хранятся в HSM на разных серверах/юрисдикциях, подпись через TSS. Это обеспечивает соответствие регуляторным требованиям (например, для крипто-кастодианов).

Интеграция с dApps: WalletConnect и стандарты

Любой кошелёк должен уметь взаимодействовать с dApps. Стандарт — WalletConnect v2 (Sign API): QR-код или deep link, peer-to-peer зашифрованный канал через relay сервер. Для браузерных расширений — EIP-1193 (Ethereum Provider API).

На фронтенде используем wagmi + viem — один интерфейс для MetaMask, WalletConnect, Coinbase Wallet, injected providers. Для Account Abstraction — EIP-5792 (wallet capabilities) и EIP-7677 (paymaster service).

Процесс разработки

  1. Threat model — кто пользователь (B2C, B2B, institutional), какие операции, каков допустимый risk model. От этого зависит архитектура.
  2. Выбор и проектирование схемы хранения ключей — MPC, HSM, мультисиг или их комбинация.
  3. Разработка Account контракта (если EIP-4337) или интеграция MPC-библиотеки.
  4. Backend — MPC-координация, управление сессиями, paymaster-сервис (если нужен).
  5. Мобильное/браузерное приложение — UI с интеграцией WalletConnect, биометрии, QR.
  6. Интеграция с dApps — EIP-1193, WalletConnect v2.
  7. Аудит контрактов и криптографических реализаций — обязательный этап. MPC-библиотеки имеют известные уязвимости (GG18 подвержен атаке при malicious participant без abort protocol). Используем библиотеки с актуальными security review (CGGMP21). Опыт прохождения аудитов у Certik, Hacken, Trail of Bits — подтверждаем сертификатами.

Что входит в работу (deliverables)

  • Исходные коды смарт-контрактов (Solidity/Rust) с документацией
  • Backend-сервис MPC-координации (на Go или Rust) с API
  • Мобильное приложение (iOS/Android) или браузерное расширение
  • Интеграция с WalletConnect, Ledger/Trezor (по необходимости)
  • Подготовка к аудиту безопасности (отчёт со списком уязвимостей)
  • Документация администратора и пользователя
  • Доступ к репозиторию, CI/CD, мониторинг (Tenderly, Etherscan API)
  • Обучение вашей команды (2-3 сессии)
  • Поддержка после запуска — 1 месяц

Сроки и стоимость

Тип решения Сроки (рабочие недели)
Custodial с базовым UI 4–8
Non-custodial с MPC-интеграцией 8–16
EIP-4337 Account с paymaster 6–12
Institutional (HSM + MPC + compliance) от 16

Стоимость рассчитывается индивидуально под ваш проект. Оценим за 1 день — напишите на почту или в Telegram. Предоставляем гарантию на код и timeline.

Типичные ошибки при разработке криптокошельков (и как их избежать)

  • Использование устаревших MPC-библиотек — GG18 без abort protocol. Выбираем CGGMP21 или tss-lib с актуальными audit report.
  • Жёсткая привязка к одному блокчейну — не закладывают абстракцию под L2/сайдчейны. Используем viem/wagmi для кросс-чейн.
  • Игнорирование MEV-атак — при использовании мультисига без таймлоков. Добавляем tx simulation (Tenderly) и sandwitching protection.
  • Отсутствие fallback-механизма восстановления — для Account Abstraction не настраивают social recovery. Закладываем с первого релиза.

Устраняем эти грабли на этапе проектирования — под каждый проект составляем threat model и security checklist.

Нужен надёжный кошелёк без компромиссов? Получите консультацию нашего архитектора — разберём вашу задачу и предложим архитектуру с точной сметой. Оставляйте заявку — ответим в течение дня.