Как обеспечить безопасную подпись транзакций с 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 под ключ — мы оценим ваш проект и предложим оптимальное решение. Получите консультацию по вашему проекту уже сегодня.







