Cryptocurrency Forensics. Część 3 – Śledzenie transakcji w sieci Bitcoin.
autor: TMG
Celem trzeciej części serii Cryptocurrency Forensics jest analiza przepływu środków pomiędzy portfelami/ adresami w sieci Bitcoin (polecamy część 1 oraz część 2 serii dla lepszego zrozumienia poruszanych tu zagadnień).
Nie będziemy skupiać się na mechanizmie zakładania czy operowania portfela, jeżeli jednak ktoś chce zgłębić tematykę od strony użytkownika – zapraszamy pod ten adres.
1. Klucze kryptograficzne i adresy.
W czasie czynności śledczych, możemy natrafić na ślady takie jak portfele (na maszynie) czy zapiski (papier, maszyna) – dlatego musimy rozpoznać pewne ich formaty, które mogą nam umożliwić odzyskanie środków.
Klucze kryptograficzne
Przy zakładaniu portfela wykorzystane zostaną klucze (lub pośrednie rozwiązanie: fraza seed – omówiona w następnym punkcie):
- Prywatny – na bazie którego stworzony zostanie z kolei klucz publiczny.
- Publiczny – finalnie, w procesie haszowania (czyli przekształcania danych w krótki i unikalny ciąg znaków o stałej długości), zostanie utworzony adres Bitcoina (przez portfel).
Obydwa klucze generowane są na maszynie użytkownika (z ang. non custodial wallets) w momencie konfiguracji portfela. Dodajmy, że portfele giełdy kryptowalut (z ang. custodial wallets), nie generują kluczy po stronie użytkownika.
Klucz prywatny i publiczny działają jako para i są matematycznie połączone (będą używane do odbierania transakcji, autoryzacji i podpisywania).
Obecnie najczęściej spotykane są portfele, zgodne ze standardem BIP-32.
Tab. 1 Spotykane reprezentacje kluczy w portfelu Bitcoina (za: https://en.bitcoin.it/wiki/List_of_address_prefixes).
| Format | Długość | Zaczyna się od | Przykład reprezentacji klucza | Do czego używany |
| Raw (czyli tzw. surowy) | 256 bitów/ 64 znaki | Losowo | ab1edf9e… | Narzędzia/ developerzy |
| WIF (Wallet import Format) uncompressed | 51 znaków | 5 lub 6 | 5Hwgr3u… | Legacy wallets lub tylko 1 adres w portfelu |
| WIF compressed | 52 znaki | L lub K | L1aW4au… | Legacy wallets lub tylko 1 adres w portfelu |
| Mini Private Key (BIP-63) | 22 znaki | S | s6c56bn… | Już praktycznie nie używany, eksperymentalny |
| Master Key (BIP-32) | 111 znaków | xprv | xprv9s21… | Nowoczesne portfele (np. Electrum), wieloadresowe |
Fraza seed
W czasie konfiguracji portfel poda losowo generowane słowa (od 12 do 24), jest to tzw. fraza seed (z ang. ziarno). Fraza ta podawana jest użytkownikowi jednorazowo, a on powinien zachować ją/ zapisać w bezpiecznym miejscu.
Posiadając ją można przejąć portfel użytkownika (będzie ona używana do odzyskiwania portfela, w przypadku utraty klucza).
W uproszczeniu możemy przyjąć, że z tej frazy wyprowadzane będą klucze w portfelu Bitcoina.
Adresy
Z klucza publicznego portfel Bitcoin stworzy pulę adresów i to te adresy użyte będą do otrzymywania UTXO (od innych użytkowników sieci) oraz reszty z nie wydanych transakcji UTXO (czyli de facto nowe UTXO trafiające na adres „reszty”).
Należy nadmienić, że adresy Legacy (P2PKH) charakteryzuje kompatybilność z wieloma portfelami ale zazwyczaj ich używanie wiąże się z wyższymi opłatami transakcyjnymi (są „cięższe” w kontekście danych, bardziej obciążają sieć), nowsze generacje podpisów z kolei generują niższe opłaty (są „lżejsze”), poprawiają prywatność struktury transakcji oraz zwiększają skalowalność sieci.
Podobnie jak przy kluczach, format adresów będzie wynikał między innymi z ewolucji sieci.
Tab. 2 Różne formaty adresów w sieci Bitcoin (za: https://learnmeabitcoin.com/technical/keys/address/).
| Typ skryptu | Nazwa potoczna | Istnieje od | Przykład | Prefix | Ilość znaków |
| P2PKH | Legacy | 2009 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 1 | 26-35 |
| P2SH | Nested SegWit | 2012 | 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy | 3 | 26-35 |
| P2WPKH | Native SegWit | 2017 | bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 | bc1q | 42 |
| P2WSH | Witness Script | 2017 | bc1qrp33g0q5c5txsp9arysrx4k6zdkq4cyc7eef2rustlsyctftavvqqmuw36 | bc1q | 62+ |
| P2TR | Taproot | 2021 | bc1p5d7rjq7g6r4jdyhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297 | bc1p | 62-63 |
2. Identyfikacja adresu reszty z transakcji.
Szczegółowo mechanizm reszty opisaliśmy w części 2 serii .
Przed rozwinięciem punktu należy wspomnieć o transakcjach typu Coinbase – są to transakcje związane z nagrodą za rozwiązanie bloku (dla górnika) – nie będzie tu adresu reszty, a także transakcji poprzedzających w historii rejestru (blockchaina).
Analiza transakcji pod kątem adresu reszty umożliwi:
- identyfikację kolejnego adresu w portfelu nadawcy i dodanie go do puli adresów do śledzenia (tworzenie klastra),
- identyfikację nowego portfela nadawcy jeżeli adres reszty znajduje się poza portfelem z którego została nadana transakcja (np. inny format adresu reszty),
- identyfikację adresu odbiorcy celem dalszej analizy,
- zmapowanie zależności pomiędzy adresami.
Jednocześnie należy zaznaczyć, że nowoczesne portfele często generują nowy adres dla każdej nowej transakcji (większość z nich może zarządzać setkami takich adresów równocześnie) oraz najczęściej przeprowadzają one operacje związane z resztą automatycznie, bez angażowania użytkownika (może to utrudniać analizę).
Formuła na określenie kwoty reszt w transakcji Bitcoin to:
Wysłana suma (nadawca) - otrzymana suma (odbiorca) - opłata (nadawca) = kwota reszty
Jeżeli:
Wysłana suma (nadawca) = UTXO wydane całkowicie, wówczas brak reszty (brak nadwyżki).
Poniżej podane są najczęściej używane sposoby identyfikacji adresu reszty (należy zaznaczyć, że opisane metody mają charakter probabilistyczny/ heurystyczny – w związku z czym, wyniki muszą zostać potwierdzone z kilku źródeł):
a) Powtórzenie tego samego adresu (z ang. Address reuse)
Dany adres w portfelu nadawcy pojawia się jako input dla UTXO a reszta wraca na ten sam adres z którego została wysłana (jako nowe UTXO).
Jest to jednak sytuacja bardzo rzadka (nie jest to zalecane ze względu na zmniejszenie prywatności), może jednak wystąpić.
Przykład takiej transakcji (input 8 i output 1):
b) Użycie tego samego formatu adresu dla inputu i reszty (z ang. Common prefix).
Kiedy adres nadania UTXO ma taki sam format jak adres do odbioru UTXO reszty (prefixy z tabeli 2).
Skuteczność tej metody maleje jednak w nowoczesnych portfelach (software celowo używa rozwiązań zwiększających anonimizację transakcji).
Przykład takiej transakcji (input 0 i output 1):
c) Pełna kwota nadania vs kwota reszty (z ang. Round amount).
Kiedy nadawca wysyła pełną liczbę bitcoinów, odbiorca otrzymuję równą jego ilość ale reszta jest już częścią nieregularną.
Przykład takiej transakcji (input 0 i output 1):
d) Strumień inputów i „mała” reszta (z ang. Multiple inputs).
Portfel nadawcy agreguje fundusze z różnych adresów którymi zarządza (na każdym z nich jest mniejsza kwota niż wymagana), żeby osiągnąć łączną kwotę zaplanowanego UTXO, a produkuje takie outputy jak: „duży/ -e” (dla odbiorcy) i „mały” (jako reszta).
Przykład takiej transakcji:
e) Aktywność w przyszłych transakcjach (z ang. Future spend).
Kiedy adres reszty nie jest ewidentny w danym momencie ale może pojawić się w przyszłej transakcji, jako adres z którego zostanie wysłana nowa transakcja (UTXO), co potwierdzi przynależność adresu do portfela nadawcy.
Przykład takiej transakcji:
- otrzymanie reszty (output 0, w dacie 12.2019): https://blockchair.com/bitcoin/transaction/834f0262ab38b5d77a11b65a441faf5554ef186f51802e8f3701e62800227ff0
- użycie adresu reszty do nadania UTXO (input 1, w dacie 01.2020): https://blockchair.com/bitcoin/transaction/e25415d600f4b6711732a5179266efa53a02669b27abdb675922899d2c677da7
f) analiza kombinowana – łącząca część lub wszystkie powyższe.
3. Klastry adresów Bitcoin.
Przy okazji mechanizmu reszty płynnie przejdziemy do pojęcia klastra (z ang. cluster) adresów/ portfeli – czyli technik analitycznych służących grupowaniu adresów, które mogą być kontrolowane przez jedną osobę/ organizację.
Szczegółowo analitykę tego typu przedstawia ten wpis (link: https://bitcoinmagazine.com/technical/the-scroll-a-brief-history-of-wallet-clustering).
Wróćmy na chwilę do transakcji typu Coinbase, jeżeli posiada ona kilka adresów na które jest wysyłana to istnieje duże prawdopodobieństwo, że adresy te należą do jednej osoby/ organizacji.
W technikach tych zawierają się:
- Badanie strumienia inputów (z ang. Multi Input Heuristic) – które może kontrolować nadawca. Adresy te mogą tworzyć osobne klastry (portfele) i nie muszą należeć do tylko jednego klastra.
- Badanie adresów reszty (z ang. Change Address Heuristic) – wskazanie nowych adresów kontrolowanych przez jedną osobę/ organizację i rozszerzenie puli tych śledzonych.
- Badanie cech identyfikujących portfel (z ang. Wallet Fingerprinting) – identyfikacja software’u który był użyty (portfela) w transakcji by później można było identyfikować adresy należące do do jednego portfela w transakcjach wieloadresowych.
Tab. 3 Przykłady narzędzi do śledzenia transakcji/ adresów w sieci Bitcoin (za: https://github.com/codeluu/blockchain-osint)
| Kategoria | Nazwa narzędzia / platformy | Krótki opis i zastosowanie | Link / Źródło |
| Open source | GraphSense | Framework do ekstrakcji i analizy danych blockchain; budowanie grafów transakcji. | https://github.com/graphsense/graphsense |
| BlockSci | Narzędzie do analizy blockchainów i szybkie klastrowanie adresów (Python). | https://github.com/citp/BlockSci | |
| WalletExplorer | Śledzenie historii transakcji i proste klastrowanie adresów. | https://www.walletexplorer.com/ | |
| Blockchair | Eksploracja transakcji, wizualizacja grafów, podstawowe klastrowanie. | https://blockchair.com/ | |
| Mempool | Eksploracja transakcji, wizualizacja grafów, podstawowe klastrowanie. | https://mempool.space/bitcoin | |
| Komercyjne / Premium | Chainalysis | Analiza grafów transakcji, klastrowanie adresów, identyfikacja podmiotów. | https://www.chainalysis.com/ |
| TRM Labs | Platforma blockchain intelligence – klastrowanie, monitorowanie. | https://www.trmlabs.com/ |
Wynikowo tworzony jest graf który umożliwia reprezentację wizualną takiej analizy w sposób przyjazny dla odbiorcy.
Rys. 1 Przykład grafu (za: https://github.com/mattconsto/blockchain-tracer?tab=readme-ov-file ) – kolorami oznaczone są klastry adresów (osobne portfele).

4. Mechanizmy używane przez przestępców do „zacierania śladów” (specyficzne dla sieci Bitcoin).
W toku czynności śledczych trafimy na próby ukrycia tego jak przebiegła transakcja lub gdzie finalnie trafiły środki.
Najczęściej obserwowane w praktyce śledczej mechanizmy zestawiono w poniższej tabeli.
Tab. 4 Mechanizmy ukrywania transakcji w sieci Bitcoin (za – plik do pobrania: https://go.chainalysis.com/2025-Crypto-Crime-Report.html )
| Mechanizm | Szacunkowa skala wykorzystania | Przykłady/Narzędzia |
| CoinJoin | Bardzo wysoka (dominuje). Mixing usług w darknet markets, ransomware (wyplaty), kradzieże giełd, money laundering. | Wasabi, Whirlpool, JoinMarket |
| PayJoin | Niska/ umiarkowana. Unikanie AML w małych transakcjach, fraudy | BTCPay Server, JoinMarket P2EP |
| Lightning Network | Rosnąca (jednak niski udział w globalnym wolumenie). Mikropłatności w darknet, szybkie transfery w scamach, unikanie chain analysis. | LND, c-lightning, submarine swaps |
| Time-delayed spending | Rosnąca (często w kampaniach ransomware i fraudach długoterminowych). Ransomware (raty), fraudy inwestycyjne (lockupy), money laundering. | nLockTime, CLTV, cykliczne wypłaty |
Omówmy zatem po krótce poszczególne typy mechanizmów ukrywania przebiegu transakcji:
a) CoinJoin
Technika łączenia wielu inputów i outputów od różnych użytkowników w jednej transakcji aby utrudnić dojście do powiązania pomiędzy adresami nadawców i odbiorców.
Jak rozpoznać: Wiele inputów (> 5-10) i równa ilość outputów o identycznych kwotach, brak oczywistego powiązania input-output.
Przykład transakcji (Wasabi Wallet CoinJoin): https://blockchair.com/bitcoin/transaction/074b02b446a3d55b26c33582f7a1b44691cd94ae87f50f430288b3213fea596a
b) PayJoin
To technika w której odbiorca płatności współtworzy transakcję z nadawcą, gdzie odbiorca dokłada swoje UTXO do tej samej transakcji, aby „zaciemnić” jej właściwy przebieg.
Utrudnia to śledzenie kto komu wysłał BTC oraz ukrywa powiązania pomiędzy adresami.
Rozpoznanie PayJoin wyłącznie na łańcuchu jest trudne (nie różnią się od zwykłych transakcji w sposób ewidentny), jednak często transakcje te mają nietypowy podział input/output i brak oczywistego change outputu.
Jak rozpoznać: transakcja ma więcej niż jednego nadawcę (input), adresy nie mają oczywistego związku (np. pochodzą z różnych portfeli), większa liczba inputów niż typowa transakcja płatnicza.
Przykład transakcji (za: https://en.bitcoin.it/wiki/JoinMarket#Probable_examples_of_JoinMarket_CoinJoins ):
c) Lightning Network (tzw. Layer 2)
Opis tego mechanizmu znajduje się w części 2 serii.
Dodatkowo ten wpis rozszerza temat dość znacznie: https://calebandbrown.com/blog/bitcoin-lightning-network-explained/ .
Główne narzędzia do analizy kanałów w sieci Lightning to:
- 1ML (https://1ml.com) – statystyki sieci, lista kanałów wraz z historią (kanały prywatne są niewidoczne).
- OKLink (https://www.oklink.com/bitcoin/node-list) – lista aktywnych node’ów (eksplorer węzłów). Serwis prowadzi własną indeksację, dlatego wyniki mogą różnić się od tych z 1ML.
- Mempool (https://mempool.space/lightning) – omówiony w tabeli 3, pokazuje „P2WSH multisig” lub etykietę „Lightning” (tylko dla transakcji on chain).
Cechy transakcji Lightning na blockchainie:
- Transakcja typu funding (otwarcie kanału):
- Wyjściem jest UTXO typu P2WSH 2-of-2 (adres bc1q…) o określonej pojemności (wartości) kanału (np. 0.01 BTC).
- Wygląda jak zwykła wpłata na specjalny adres z dwoma kluczami.
Przykład transakcji typu funding: https://mempool.space/tx/1d0fc139b999e6b116d4239c11fb9dc74ee53842a30fbb15ce929585e15f18a6
- Transakcja typu closing (zamknięcie kanału):
- Wejście: to samo UTXO (P2WSH 2-of-2 bc1q…) z kanału otwarcia.
- Wyjścia: 2 zwykłe adresy (P2WPKH bc1q… lub P2TR bc1p…) z podziałem środków + czasem timelock (dotyczy to głównie tzw. force close).
Przykład transakcji typu closing: https://mempool.space/tx/a3b23982331300ef8d23bd90b64e939758835515642a65ba64234bf2cae2ac7a
d) Time delayed spending
Mechanizm Bitcoin umożliwiający odroczenie „wydania” środków dopiero po określonym czasie/ bloku, czyli są one „zamrożone” do jakiegoś konkretnego momentu w czasie.
Bardziej szczegółowo mechanizm został opisany tu: https://learnmeabitcoin.com/technical/transaction/locktime
Jak rozpoznać: Transakcja w eksploratorze (mempool, blockstream itp.) ma parametry na które możemy zwrócić uwagę jako potencjalny time lock, np. nLockTime > niż obecny blok / czas; locktime > 0; sequence < `0xffffffff`; pojawiają się parametry `OP_CHECKLOCKTIMEVERIFY` lub `OP_CHECKSEQUENCEVERIFY`.
Wykorzystanie Mempool.space umożliwi dostrzeżenie takiego mechanizmu. Narzędzie to pokazuje parametr np. `nSequence` w sekcji „Szczegóły”.
Narzędzie to w tej konkretnej transakcji
https://mempool.space/pl/tx/13e100dd08b6da0a7426ea520b0bb3ae54cef79dd045e2e4f7116023df3a5c95
wskazuje pole `Czas blokady` ustawiony na wartość bloku 198 370 a tymczasem sama transakcja znajduje się w bloku 198 359 – mamy opóźnienie wykonania.
Można skorzystać również z blockstream – narzędzie to w transakcji
https://blockstream.info/tx/13e100dd08b6da0a7426ea520b0bb3ae54cef79dd045e2e4f7116023df3a5c95
Wskazuje parametr `Lock time` – jego wartość może być porównana z parametrem `Block Height` do którego się odnosi i widać, że `Locktime` > `Block Height` oraz jest > 0, w związku z czym wiemy, że transakcja ma ustawiony timelock ją opóźniający.
Analiza blockchain to tylko jeden z elementów nowoczesnego śledztwa. W cyfrowym świecie każda aktywność pozostawia ślad. Jeśli potrzebujesz sprawdzić wiarygodność kontrahenta, zweryfikować majątek dłużnika lub znaleźć informacje ukryte w ogólnodostępnych źródłach, sprawdź, jak wykorzystujemy profesjonalny wywiad OSINT do zabezpieczania interesów naszych klientów.
