Интеграция кошелька с Trezor
Trezor — второй по популярности hardware wallet после Ledger, с принципиально иной архитектурой коммуникации. Если Ledger использует нативный WebHID/WebUSB, Trezor работает через собственный мост — Trezor Suite Bridge или WebUSB-транспорт. Это влияет на то, как строить интеграцию и какие сценарии обрабатывать.
Архитектура коммуникации
Trezor Connect SDK (@trezor/connect-web) работает через iframe с доменом connect.trezor.io. Это означает: ваш код не общается с устройством напрямую — запрос уходит в iframe, тот общается с Trezor Suite Bridge (нативное приложение) или через WebUSB, получает ответ, возвращает его через postMessage.
Такой подход даёт безопасность (ключи не покидают контролируемый домен Trezor) и удобство (не нужно устанавливать дополнительного ПО при WebUSB), но создаёт зависимость от инфраструктуры Trezor.
Для приложений, которым нужна полная автономность, существует @trezor/connect (без iframe) — используется в Trezor Suite напрямую. Но для web-интеграции @trezor/connect-web — стандартный выбор.
Базовая интеграция
Инициализация:
import TrezorConnect from "@trezor/connect-web";
await TrezorConnect.init({
lazyLoad: true,
manifest: {
email: "[email protected]",
appUrl: "https://yourproject.com",
},
});
Manifest обязателен — Trezor использует его для идентификации приложения и отображения его пользователю на экране устройства.
Получение адреса:
const result = await TrezorConnect.ethereumGetAddress({
path: "m/44'/60'/0'/0/0",
showOnTrezor: true,
});
if (result.success) {
console.log(result.payload.address);
} else {
console.error(result.payload.error);
}
Подпись транзакции через TrezorConnect.ethereumSignTransaction. В отличие от Ledger, Trezor принимает не RLP, а объект с полями:
const result = await TrezorConnect.ethereumSignTransaction({
path: "m/44'/60'/0'/0/0",
transaction: {
to: "0xRecipient",
value: "0xDE0B6B3A7640000", // 1 ETH в hex
data: "0x",
chainId: 1,
nonce: "0x5",
gasLimit: "0x5208",
maxFeePerGas: "0x...", // EIP-1559
maxPriorityFeePerGas: "0x...",
},
});
EIP-712 подпись
Trezor поддерживает ethereumSignTypedData начиная с firmware 2.4.3 (Model T) и 1.10.5 (Model One). Важный нюанс: Model One имеет ограниченный экран и не может отображать сложные структуры — для него используется metamask_v4_compat: true режим с хешированием на стороне хоста.
const result = await TrezorConnect.ethereumSignTypedData({
path: "m/44'/60'/0'/0/0",
data: typedData, // стандартный EIP-712 объект
metamask_v4_compat: true,
});
Типичные проблемы
Bridge не запущен. Если пользователь не установил Trezor Suite Bridge и браузер не поддерживает WebUSB — SDK не найдёт устройство. Решение: в UI направлять на страницу установки, детектировать через TrezorConnect.getFeatures().
Popup заблокирован. @trezor/connect-web открывает popup для отображения разрешений. Браузерные блокировщики popup могут это предотвратить. Нужно инициировать вызовы только из user gesture (click).
Версия firmware. Старый firmware не поддерживает EIP-1559 транзакции. Рекомендуется проверять версию через TrezorConnect.getFeatures() и показывать предупреждение об обновлении.
Отличия от Ledger в реализации
| Аспект | Ledger | Trezor |
|---|---|---|
| Транспорт | WebHID/WebUSB напрямую | iframe + Bridge/WebUSB |
| Зависимость от инфраструктуры | Нет | connect.trezor.io |
| Формат транзакции | RLP-encoded | Объект с полями |
| Offline использование | Да | Ограниченно |
| EIP-712 на бюджетных моделях | Ограниченно | metamask_v4_compat |
Базовая интеграция с Trezor (адрес + подпись транзакций + EIP-712) — 1-2 недели с учётом тестирования на Model T и Model One и обработки всех edge cases.







