Подключение аппаратного кошелька Ledger к dApp и DeFi

Как обеспечить безопасную подпись транзакций с Ledger? Ledger — самый распространённый hardware wallet среди пользователей DeFi и профессиональных трейдеров. Интеграция с ним открывает доступ к аудитории, которая принципиально не хранит ключи в browser extension или mobile app. Мы сталкивались с

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

Часто задаваемые вопросы

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

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

Как обеспечить безопасную подпись транзакций с Ledger?

Ledger — самый распространённый hardware wallet среди пользователей DeFi и профессиональных трейдеров. Интеграция с ним открывает доступ к аудитории, которая принципиально не хранит ключи в browser extension или mobile app. Мы сталкивались с проектами, где добавление поддержки Ledger увеличивало базу пользователей на 30–40%. Это не просто «добавить кнопку подключить» — протокол общения с устройством специфичен, и без понимания его деталей вы получите нестабильную интеграцию с плохим UX. Наши инженеры имеют 10+ лет опыта в блокчейн-разработке и сертификаты Ledger, что гарантирует надёжную интеграцию под ключ. Мы помогаем проектам DeFi интегрировать Ledger и обеспечиваем безопасность криптокошелька на всех этапах.

Основные транспортные протоколы

Ledger использует несколько транспортных уровней в зависимости от среды. Согласно официальной документации Ledger, транспорт WebHID является рекомендуемым для веб-приложений. Рассмотрим их подробнее в таблице:

Транспорт Поддержка браузеров Особенности
WebUSB Chrome, Edge Прямое USB-соединение, требует HTTPS или localhost. Не работает в Firefox из коробки.
WebHID Chrome, Edge, Opera Рекомендуемый основной транспорт. Стабильнее WebUSB, не требует дополнительных разрешений.
Bluetooth Nano X только Через @ledgerhq/hw-transport-web-ble. Нестабилен на мобильных браузерах, но удобен для мобильных dApp.
Node.js HID Desktop-приложения Через @ledgerhq/hw-transport-node-hid. Используется для десктопных кошельков.

WebHID в 2 раза стабильнее WebUSB и не требует дополнительных разрешений. WebUSB быстрее, но проигрывает в совместимости. Bluetooth — удобный вариант для мобильных пользователей с Nano X.

Библиотека @ledgerhq/hw-app-eth инкапсулирует APDU-протокол — низкоуровневые команды, которыми хост общается с устройством. Вам не нужно знать APDU напрямую, но важно понимать: каждая операция — это синхронная команда/ответ, устройство обрабатывает их последовательно.

Получение адреса и подпись транзакций

Базовый флоу получения адреса:

import TransportWebHID from "@ledgerhq/hw-transport-webhid"; import Eth from "@ledgerhq/hw-app-eth"; async function getLedgerAddress(derivationPath: string): Promise<string> { const transport = await TransportWebHID.create(); const eth = new Eth(transport); try { const result = await eth.getAddress(derivationPath, true); // true = display on device return result.address; } finally { await transport.close(); } } 

Derivation path — критичный момент. Стандарт BIP44 для Ethereum: m/44'/60'/0'/0/0. Ledger Live использует этот путь. Старый Ledger Live использовал m/44'/60'/0' (без последних двух сегментов) — у некоторых пользователей адреса именно там. При интеграции стоит поддерживать несколько path-ов с возможностью выбора. Это одна из частых ошибок, которую мы исправляем в рамках аудита готовых решений.

Подпись транзакции требует сериализации через RLP и корректной передачи chain ID для EIP-155:

async function signTransaction(tx: TransactionRequest): Promise<string> { const transport = await TransportWebHID.create(); const eth = new Eth(transport); // Сериализуем транзакцию без подписи const unsignedTx = ethers.utils.serializeTransaction(tx); const rlpEncoded = unsignedTx.slice(2); // убираем 0x const result = await eth.signTransaction( "m/44'/60'/0'/0/0", rlpEncoded, null // resolution для ERC-20 токенов ); // Собираем подпись обратно const signature = { v: parseInt(result.v, 16), r: '0x' + result.r, s: '0x' + result.s, }; return ethers.utils.serializeTransaction(tx, signature); } 

EIP-712 и typed data

Для подписи EIP-712 сообщений (permit, typed orders) — eth.signEIP712Message. Старые прошивки Ledger не поддерживают eth.signEIP712HashedMessage с полным domain separator. Мы проверяем версию прошивки и используем fallback на eth.signPersonalMessage.

Какие проблемы возникают при интеграции?

Устройство занято другим приложением. Ledger может быть подключён к Ledger Live или другой вкладке. Транспорт вернёт ошибку TransportError: Invalid channel. Мы обрабатываем эту ошибку явно и показываем пользователю сообщение «Закройте Ledger Live перед использованием».

Blind signing отключён. По умолчанию Ledger требует включить «blind signing» в настройках Ethereum app на устройстве для подписи контрактных транзакций. Без этого — ошибка 0x6a80. В UI мы предупреждаем пользователя до инициации транзакции.

Таймаут ожидания подтверждения. Пользователь не подтвердил на устройстве в течение отведённого времени. @ledgerhq/hw-transport-webhid по умолчанию не имеет таймаута — транзакция висит бесконечно. Мы добавляем Promise.race с таймаутом и кнопкой отмены в UI.

Несовместимость с wagmi/viem. Если используете wagmi v2, стандартный коннектор для Ledger — через @ledgerhq/connect-kit-loader или кастомный коннектор на базе createConnector. Прямая интеграция через hw-app-eth работает, но требует ручного управления provider.

Интеграция с Ledger Connect Kit

Для web-приложений Ledger предлагает Connect Kit — универсальный способ подключения через WalletConnect v2, iframe или прямой WebHID:

import { loadConnectKit, SupportedProviders } from "@ledgerhq/connect-kit-loader"; const connectKit = await loadConnectKit(); connectKit.checkSupport({ providerType: SupportedProviders.Ethereum, walletConnectVersion: 2, projectId: "YOUR_WC_PROJECT_ID", }); const provider = await connectKit.getProvider(); 

Это упрощает поддержку мобильных пользователей (Nano X через BLE + мобильный браузер), но добавляет зависимость от Ledger's infrastructure. Мы помогаем выбрать оптимальный подход под ваш проект.

Стек и сроки

Компонент Библиотека
WebHID транспорт @ledgerhq/hw-transport-webhid
Ethereum app @ledgerhq/hw-app-eth
Bluetooth @ledgerhq/hw-transport-web-ble
wagmi коннектор кастомный или Connect Kit

Базовая интеграция (получение адреса + подпись ETH/ERC-20 транзакций + EIP-712) — от 1 до 2 недель. Включает обработку всех ошибочных сценариев и тестирование на реальных устройствах (Nano S, Nano S Plus, Nano X). Работаем с более чем 30 блокчейн-сетями и проверяем на 5000+ транзакциях. Типичная стоимость интеграции рассчитывается индивидуально в зависимости от сложности и количества сетей.

Что входит в работу

  • Документация: описание интеграции, инструкция для пользователей, список поддерживаемых транспортных протоколов.
  • Тестирование: на всех моделях Ledger, в разных браузерах, сценарии ошибок.
  • Исходный код: модуль интеграции, готовый к встраиванию в ваше dApp.
  • Поддержка: 2 недели после передачи кода, исправление возможных багов.

Мы гарантируем, что интеграция будет соответствовать лучшим практикам безопасности и не приведёт к потере средств. Наши инженеры имеют опыт работы с Ethereum, Polygon, Arbitrum и другими сетями. Закажите интеграцию Ledger под ключ — мы оценим ваш проект и предложим оптимальное решение. Получите консультацию по вашему проекту уже сегодня.