Air‑gapped portfel z animowanymi QR (BC‑UR) i PSBT/EIP‑712: budowa odpornego cold storage multi‑chain krok po kroku
Air‑gapped portfel z animowanymi QR (BC‑UR) i PSBT/EIP‑712: budowa odpornego cold storage multi‑chain krok po kroku
Czy da się bezpiecznie podpisywać transakcje Bitcoin (PSBT) i Ethereum (EIP‑712) bez USB, Bluetooth i NFC – wyłącznie kamerą? Tak. Architektura air‑gapped z animowanymi kodami QR (BC‑UR) minimalizuje wektory ataku, a jednocześnie pozwala działać w DeFi, NFT oraz z portfelami kontraktowymi (ERC‑4337). Ten przewodnik pokazuje praktyczną, mało opisywaną w polskim internecie metodę budowy wielosieciowego cold storage na bazie zwykłego, odizolowanego telefonu.
Dlaczego QR zamiast USB/NFC?
Odcięcie kanałów radiowych i przewodowych dramatycznie ogranicza powierzchnię ataku. Kamera→QR→kamera to kontrolowany, jednokierunkowy nośnik danych: żadnych sterowników, żadnych stosów protokołów, żadnego zasilania z obcego hosta. To podejście unikalnie łączy użyteczność (działa z giełdami, DeFi, NFT) z modelem zagrożeń dla długoterminowego przechowywania.
- Brak podłączania: zero USB, zero Bluetooth, zero NFC.
- Kontrolowany przepływ: tylko to, co zmieści się w ramkach UR/QR.
- Interoperacyjność: PSBT dla Bitcoina, EIP‑1559/EIP‑712 dla EVM, a nawet UserOperation (ERC‑4337) w formacie QR.
Standardy, które musisz znać (i zrozumieć)
PSBT v2 (BIP‑174/BIP‑370) – podpisy dla UTXO on‑air
PSBT to przenośny format transakcji do podpisu. W modelu air‑gapped PSBT jest kodowany jako UR:BYTES i wyświetlany jako QR. Offline’owy signer skanuje, podpisuje i zwraca finalized PSBT albo surowy tx do broadcastu.
BC‑UR (Uniform Resources) i Bytewords – kody odporne na błędy
UR to kontener binarny zaprojektowany dla urządzeń z kamerą. Wersja animated QR dzieli duże obiekty na sekwencje ramek z korekcją błędów typu fountain. Działa szybko nawet przy słabym świetle i ekranach 60 Hz.
EIP‑712 i EIP‑1559 dla EVM
EIP‑712 standaryzuje typed data – krytyczne dla podpisów w DeFi (permit2, off‑chain orders, DAO). EIP‑1559 to parametry transakcji (maxFee, maxPriorityFee). Oba formatuje się do UR i przesyła QR‑ami podobnie jak PSBT.
ERC‑4337 (Account Abstraction) – podpisy dla UserOperation
Portfele kontraktowe (4337) używają UserOperation, które też można podpisać offline i przekazać do bundlera kodem QR. To rzadko opisywany, ale rosnący przypadek użycia dla air‑gap.
BIP‑39/BIP‑85, SLIP‑39 i Miniscript/Taproot (BIP‑86)
- BIP‑39: mnemonik i passphrase (25. „słowo”).
- BIP‑85: deterministyczne, niezależne pochodne seedy do apletów (np. oddzielne seedy dla BTC i EVM z jednego „roota”).
- SLIP‑39/SSKR: dzielone sekrety (Shamir) dla recovery z wieloosobowym progiem.
- BIP‑86: standardowy Taproot single‑sig; z Miniscript można dołożyć ścieżki recovery (np. time‑lock + 2‑z‑3).
Architektura referencyjna: co dokładnie budujemy
- Sejf offline: stary smartfon z czystym systemem, tryb samolotowy, wyłączone moduły (Wi‑Fi/Bluetooth/NFC), bez kont Google/Apple.
- Oprogramowanie offline: aplikacja podpisująca open‑source obsługująca PSBT, EVM (EIP‑712/EIP‑1559) i QR/UR. Instalacja z USB‑OTG/SD po weryfikacji sum SHA‑256 i podpisu PGP.
- Urządzenie online: komputer/telefon z portfelami watch‑only, DEX‑ami, dApp‑ami i bundlerem 4337. Brak kluczy prywatnych.
- Most danych: wyłącznie kamera i animowane QR (UR). Żadnych kabli.
Krok po kroku: od zera do transakcji
1. Twardy reset i higiena urządzenia
- Przywróć ustawienia fabryczne, zaktualizuj system (ostatni raz online), wyłącz wszystkie radios, usuń konta, brak karty SIM.
- Zablokuj instalacje z nieznanych źródeł po wgraniu aplikacji (po etapie 2). Ustaw PIN + długi hasło‑boot dla pełnego szyfrowania.
2. Instalacja signera offline
- Pobierz APK/zip na komputerze, zweryfikuj PGP i SHA‑256.
- Przenieś plik na kartę SD/OTG, zainstaluj na offline telefonie, wyłącz debugowanie USB.
3. Generacja i podział sekretów
- Wygeneruj seed BIP‑39 (opcjonalnie z „diceware” dla pewności entropy). Dodaj passphrase.
- Utwórz odrębne seedy BIP‑85 dla: BTC Taproot, EVM, ew. PoS (Cosmos/Polkadot).
- Wykonaj SLIP‑39/SSKR: np. 2‑z‑3 dla dom/rekwizytorium/sejf bankowy. Testuj rekombinację zanim schowasz.
4. Polityka kluczy i adresów
- Bitcoin: BIP‑86 (Taproot single‑sig) do codziennych wypłat + Miniscript recovery (np. 2‑z‑3 po 90 dniach) dla skarbca.
- Ethereum/EVM: EOA jako signer dla portfela kontraktowego (ERC‑4337) z social recovery i session keys na małe limity.
5. Konfiguracja watch‑only
- Wyeksportuj xpub/zpub tr(…) do portfela online przez QR (UR:CRYPTO‑ACCOUNT).
- Dla EVM: wyświetl i zeskanuj adresy, dodaj je do portfela online (np. wtyczka przeglądarkowa) i do dashboardu DeFi.
6. Podpis Bitcoin: PSBT → UR → podpis → broadcast
- Utwórz PSBT online (coin control, fee rate, change policy). Zakoduj jako UR i pokazuj animowany QR.
- Offline telefon skanuje, weryfikuje sumy wejść/wyjść i adresy (whitelist), podpisuje i wyświetla z powrotem UR z podpisem.
- Online urządzenie skanuje podpisany UR, finalizuje i rozgłasza tx.
7. Podpis EVM: EIP‑1559/EIP‑712 i 4337
- Transakcja: dApp generuje payload (to, value, data, chainId, maxFee). Koder UR → animowany QR → podpis offline → UR z podpisem → wysyłka on‑chain.
- Typed data (DeFi/NFT): wyświetl offline pełne domain/primaryType/message, potwierdź enumerację pól (np. permit2: spender, value, deadline), podpisz.
- ERC‑4337: bundler przyjmuje UserOperation + podpis EOA. Ten sam rytuał QR.
Kontrole bezpieczeństwa, które rzadko trafiają do tutoriali
- Weryfikacja obrazu APK: sprawdzaj klucze PGP developera, nie tylko hash na stronie.
- Lista dozwolonych adresów w signerze: offline ekran powinien pokazywać czytelne ENS/CAIP‑10 lub pełne checksumy.
- Tryb „duress”: zaszyfrowane konto przymusowe z niskim saldem i inną passphrase.
- Faraday pouch dla telefonu‑sejfu, by wykluczyć przypadkowe emisje.
- Oddzielne BIP‑85 dla środowisk testowych, by nie „wypalić” produkcyjnego xpub w analityce dApp.
Tabela decyzyjna: co wybrać i dlaczego
| Element | Rekomendacja | Powód | Ryzyko/Trade‑off |
|---|---|---|---|
| Format wymiany | BC‑UR (animated QR) | Szybki, odporny, szeroko wspierany | Wymaga dobrej kamery/ekranu |
| BTC skarbiec | Taproot + Miniscript | Elastyczne recovery, niższe fee | Większa złożoność konfiguracji |
| EVM codzienne | 4337 + session keys | Limity i autoryzacje granularne | Zależność od bundlera/paymastera |
| Backup | SLIP‑39/SSKR 2‑z‑3 | Tolerancja utraty jednego udziału | Ryzyko kompr. przy złym podziale |
| Dystrybucja seedów | BIP‑85 sub‑seedy | Izolacja szkód, porządek | Utrata „root” = utrata wszystkiego |
Checklist: test pożarowy w 30 minut
- Adresy: wygeneruj 3 adresy BTC i EVM, zapisz checksummy.
- Mikro‑przelewy: wyślij 20 000 sat i 0,001 ETH, odbiór + change zgodne z planem.
- EIP‑712: podpisz permit2 z małym limitem i krótkim deadline.
- Recovery: odtwórz z 2‑z‑3 udziałów na innym urządzeniu offline, porównaj xpub/adresy.
- Duress: przetestuj konto przymusowe – ma działać, ale nie „widzieć” głównego skarbca.
Integracja z DeFi, NFT i DAO bez utraty modelu air‑gap
- Allowance hygiene: używaj permit2, krótkich limitów i auto‑revoków po wykonaniu zadań.
- Session keys: kontrakt 4337 z kluczami jednorazowymi dla bota/arbitrażu, ograniczonymi do wybranych metod i kwot.
- Głosowania DAO: podpisuj off‑chain (EIP‑712) i publikuj z urządzenia online.
Studium przypadku: rodzinny „mini‑fundusz” w Polsce
- Profil: 3 osoby, horyzont 5+ lat, ekspozycja BTC/ETH/USDC, sporadyczne DeFi.
- Setup: 1 telefon air‑gapped (seed root), BIP‑85 dla BTC/EVM, SLIP‑39 2‑z‑3 (dom, kancelaria, skrytka), Taproot skarbiec + 4337 z session keys.
- Operacje: 2 podpisy BTC/mies., 4 podpisy EIP‑712/kwartał. Czas podpisu QR: 10–25 s/operację.
- Incydenty: utrata jednego udziału – bez wpływu; odtworzenie trwało 14 min.
Najczęstsze błędy (i jak ich uniknąć)
- Seed na zdjęciu: nigdy. Używaj metalowego backupu i ołówka grafitowego na papierze technicznym.
- Jedna passphrase do wszystkiego: separuj trezory (BIP‑85) i środowiska.
- Brak weryfikacji pól EIP‑712: offline ekran musi pokazać każde pole; odrzuć „dziurawe” komunikaty.
- Stałe allowances: ograniczaj i cofaj po użyciu.
FAQ techniczne
- Czy QR „zaraża” offline urządzenie? Nie. To pasywne piksele – ryzyko dotyczy tylko socjotechniki (np. mylne pola EIP‑712), nie zdalnego kodu.
- Co z dużymi PSBT? UR je strumieniuje. Jeśli ramki gubią się, zmniejsz gęstość QR lub jasność ekranu.
- Jak sprawdzić integralność offline APK? Porównaj hash z repo, zweryfikuj podpis PGP developera, zachowaj logi w notatniku papierowym.
Pro / Contra w skrócie
| Aspekt | Pro | Contra |
|---|---|---|
| Bezpieczeństwo | Brak interfejsów I/O, mniejsza powierzchnia ataku | Ryzyko błędu operacyjnego użytkownika |
| Kompatybilność | PSBT, EIP‑712, 4337 przez QR | Zależność od wsparcia UR po obu stronach |
| Szybkość | Podpis w kilkanaście sekund | Wielkie payloady wolniejsze niż USB |
| Koszt | Wykorzystanie starego telefonu | Potrzebny czas na procedury i testy |
Wnioski i następne kroki
Air‑gapped podpisy QR/UR to rzadko omawiana w polskich mediach krypto technika, która łączy praktyczność DeFi/NFT z bezpieczeństwem cold storage. Klucz leży w procedurach: weryfikacja payloadu na offline ekranie, separacja seedów (BIP‑85), testy recovery i krótkie uprawnienia w DeFi.
- Zbuduj środowisko testowe na małych kwotach.
- Przeprowadź „fire drill” recovery raz na kwartał.
- Wdróż 4337 z session keys do operacji dziennych.
CTA: Jeśli prowadzisz fundusz rodzinny lub zarządzasz trezorem firmowym, zaplanuj 2‑godzinną sesję wdrożeniową: instalacja signera, konfiguracja UR/PSBT/EIP‑712, testy odtworzeniowe i symulacja ataku socjotechnicznego.

