Przejdź do głównej zawartości

UTXO. Jak działa i dlaczego Bitcoin wygląda jak gotówka.

"UTXO to najprościej mówiąc, niewydane kawałki Bitcoina, które działają bardziej jak banknoty niż saldo na koncie bankowym - gdy je wydajesz, znikają i powstają nowe. Co dzieje się pod spodem każdej transakcji Bitcoin i dlaczego model UTXO ma takie znaczenie."

O co w ogóle chodzi z UTXO?

Jakiś czas temu uczestniczyłem w wykładzie o blockchain i kryptowalutach ale mimo kilkunastu lat w temacie, słuchało mi się go zaskakująco ciężko. Po pierwsze: prowadzący liznął temat i nic poza tym. Po drugie: wątpię, że ktokolwiek to zrozumiał. Pomyślałem, że może od czasu do czasu wrzuce tutaj artykuł, w których będę tłumaczył terminologię blockchain łopatologicznie. Będę skupiał się na Bitcoin SV, ale wiedzę można spokojnie odnosić również do BTC - tam, gdzie są różnice, wyraźnie je wyjaśnię.

Większość tekstów o UTXO skupia się na skrócie i definicji, a nie na tym, jak Ty faktycznie wydajesz bitcoina - przez to widzisz tylko techniczne terminy, a nie prosty model zachowania. Tymczasem UTXO nie jest żadnym rocket science: to konsekwentne trzymanie się analogii gotówki, gdzie każda transakcja spala stare banknoty i tworzy nowe. Sieć utrzymuje zbiór niewydanych outputów (nowych banknotów), czyli UTXO set. Portfel natomiast wyszukuje te UTXO, nad którymi użytkownik może sprawować kontrolę i sumuje ich wartości. Kiedy raz złapiesz tę metaforę, reszta technikaliów - ID transakcji, indeksy wyjść, skrypty, podpisy - stanie bardzo prosta.

utxo zachowuje się jak gotówka

UTXO = Unspent Transaction Output

UTXO to skrót od Unspent Transaction Output, czyli niewydane wyjście transakcji. To sposób, w jaki Bitcoin (BTC, BCH i BSV) liczy Twoje, hmm.. saldo. Zamiast jednego salda jak w banku, sieć przechowuje listę konkretnych niewydanych wyjść, które możesz wydać - każdy taki kawałek to właśnie UTXO.

Twoje saldo w portfelu to tak naprawdę suma wszystkich tych niewydanych kawałków, które portfel znajduje na blockchainie i pokazuje jako jedną liczbę, żebyś nie zwariował patrząc na listę dziesiątek drobnych wejść. W praktyce, to portfel/aplikacja zarządza sposobem wydawania Twoich UTXO, a zwykły użytkownik nie musi się martwić (i wiedzieć) jak to działa. I właśnie dlatego dwa portfele pokazujące dokładnie to samo saldo mogą w rzeczywistości posiadać zupełnie inny zestaw UTXO. O zarządzaniu UTXO (z poziomu technicznego) pisałem w tym artykule podczas budowania transakcji w pythonie :) 

Portfel, który nie ma salda

W tradycyjnym systemie bankowym masz jedno konto PL12 1240 0000... i podsumowanie: 4273,19 zł - bank aktualizuje ten numer przy każdym przelewie.

W UTXO jest inaczej: nie ma konta z saldem, są tylko wyjścia transakcji, które albo są wydane, albo niewydane (UTXO) i to z nich składa się Twój majątek. Gdy Twój portfel pokazuje Ci "0,52 BSV lub BTC", tak naprawdę sumuje np. trzy niezależne UTXO: 

  1. 0,20 BSV od Ani, 
  2. 0,15 BSV od Marka,
  3. 0,17 BSV od Jarka.

Gotówka vs konto bankowe

Najprostsze porównanie: UTXO zachowuje się jak fizyczna gotówka. Kiedy płacisz 10 zł za kawę banknotem 50zł, nie skreślasz na nim kwoty 50zł i nie wpisujesz długopisem 40zł, tylko wydajesz cały banknot, a kasjer wydaje Ci resztę w postaci 40zł - a to 40zł staje się Twoim UTXO.

System kontowy nie zadziała w Twoim fizycznym portfelu z banknotami, on działa tak jak konto w banku, zmienia numer: odejmuje 10 zł od Twojego salda i dodaje 10 zł do salda kawiarni.

Jak wygląda transakcja w modelu UTXO

Każda transakcja ma wejście lub wejścia (inputs) i wyjście lub wyjścia (outputs): wejścia to UTXO, które wydajesz, wyjścia to będą nowe UTXO, które powstaną po transakcji.

Schemat transakcji UTXO w Bitcoin

Wejście (na obrazku TX1) zawsze wskazuje konkretne stare wyjście (poprzednie UTXO) po jego ID/hashu transakcji i indeksie oraz musi spełnić warunek wydania, zapisany w poprzednim outputcie, dostarczając odpowiednie dane, np. podpis lub dane do skryptu. Ten warunek też wymaga wyjaśnienia.

Warunek wydania

O co chodzi z tym warunkiem wydania i dostarczeniem odpowiedniego podpisu? Już tłumaczę :) Transakcja w portfelach jest widoczna tak:
 A płaci ---- 0,3 BSV ----> B
Zakładamy zwykły scenariusz, że Bob nigdy nie bawił się w kryptowaluty, tylko pobrał portfel a Alicja wyśle mu trochę Bitcoina (tak jak na powyższym obrazku).

Myślisz sobie, że jak Alicja wysłała do Boba Bitcoin, to Bob jest w posiadaniu 0,3 Bitcoina. No nie do końca. Boba otrzyma transakcję, portfel zaktualizuje mu saldo, już nie będzie miał 0 tylko 0,3 ale czy Bob może wydać te środki? Bob dowie się o tym dopiero, jak będzie chciał wydać te 0,3 kolejnej osobie. No to przychodzi ten moment i Bob chce wysłać Dżonowi 0,1 BSV. Wpisuje adres Dżona, wpisuje kwotę i naciska "wyślij". Co się dzieje pod spodem, w portfelu:

Transakcja Bitcoin UTXO odblokowanie

Portfel Boba buduje transakcję, w której jako input (wejście) wskazuje konkretne UTXO (wyjście Alicji z pierwszego obrazka), czyli konkretny output transakcji TX2, identyfikowany przez TXID, w której to Alicja mu wysłała 0,3 BSV oraz indeks tego outputu, czyli UTXO #B (tzw. vout - normalnie jest to liczba od 0, 1, 2, 3 itd.. ):

Następnie wskazuje kwotę do wydania 0,1 BSV oraz adres Dżona. Teraz, żeby to mogło się wysłać, protokół Bitcoin, sprawdza coś takiego: OK, Bob, podałeś mi hash transakcji, w której płaciła Ci Alicja, oraz indeks konkretnego outputu, którym płaciła Ci Alicja ale pokaż mi teraz czy faktycznie możesz wydać te 0,3 BTC. Abstrakcja co nie? Przecież Alicja już mu wysłała 0,3 BTC, to co on jeszcze musi udowodnić?

Portfel Boba wtedy robi coś takiego; no racja Alicja wysłała mi 0,3 BSV wskazując mój adres, to ja udowodnię, że mogę wydać te środki. Bob nawet nie ogarnia, że coś takiego robi jego portfel, on tylko wciska "Wyślij". Portfel podpisuje transakcję, podpis jest zgodny i transakcja może zostać zaakceptowana przez węzły jako ważna, a następnie trafić do bloku i Dżon otrzymuje 0,1 BSV, a Bob otrzymuje 0,1999 BSV reszty jako nowe UTXO. Później Dżon, jak będzie chciał wydać cokolwiek z tego 0,1 BSV, też będzie musiał to udowodnić; Bob pomimo tego, że wysłał sobie resztę, również będzie musiał to udowodnić. 

W typowej transakcji użytkownika wydawane UTXO trzeba wydać w sposób spełniający warunek zapisany w poprzednim outputcie, często za pomocą podpisu cyfrowego. Właściwie to 99,999% transakcji w BTC to płatność na adres, w BSV jest ich mniej.

Można więc bardzo upraszczając powiedzieć:

zwykła płatność = udowodnij, że masz właściwy klucz prywatny

Ale nic nie stoi na przeszkodzie, żeby do tego warunku dołożyć kolejny. Załóżmy, że Alicja wysyła Bobowi 0,3 BSV, ale mówi: "Bob, możesz wydać te środki tylko wtedy, gdy oprócz udowodnienia, że posiadasz właściwy klucz prywatny, podasz jeszcze określone słowo."

Wtedy samo podpisanie transakcji już nie wystarczy. Bob musi dostarczyć dwa elementy:
  1.     poprawny podpis cyfrowy, potwierdzający, że posiada odpowiedni klucz prywatny,
  2.     dodatkową informację, np. tekst LUBIE_ALICJE.
Dopiero gdy oba warunki zostaną spełnione, UTXO może zostać wydane i Bob może wysłać Dżonowi 0,1 BSV.

NIE-typowe transakcje w Bitcoin SV

Tak naprawdę, by wykonać transakcję Bitcoin (BSV), nie potrzebujesz nawet adresu nadawcy lub odbiorcy. Model UTXO jest bardzo elastyczny. Liczy się to, czy potrafisz spełnić warunek wydania zapisany w danym outputcie.

W Bitcoin SV jest to coś fenomenalnego! Możliwe jest stworzenie transakcji, w której nadawca w ogóle nie wskazuje konkretnego adresu odbiorcy. Zamiast tego tworzy UTXO o wartości, powiedzmy, 100 BSV i zapisuje w jego skrypcie warunek, który musi zostać spełniony, aby te środki wydać. Warunkiem może być na przykład dostarczenie określonego słowa, liczby albo konkretnej sekwencji danych. Nadawca może więc opublikować taką transakcję np. c3b1iu23gvuhuhd8844jhj..  na forum i napisać:

"Kto chce odebrać te 100 BSV, niech zbuduje transakcję, która spełni warunek zapisany w tym UTXO."

Załóżmy, że wymaganym słowem jest: 100BitcoinówFajnaSprawa

Osoba, która chce przejąć te środki, musi znaleźć konkretny output, czyli wskazać TXID i indeks vout, a następnie zbudować transakcję, która dostarczy wymagane dane i spełni zapisany w nim warunek. Jako output nowej transakcji może wskazać już swój własny adres.

W uproszczeniu wygląda to więc tak:
  • wskazuje txid: c3b1iu23gvuhuhd8844jhj..
  • wskazuje vout: 2
  • wskazuje warunek: 100BitcoinówFajnaSprawa
  • wskazuje swój adres:  1Be77gchGhsd5.. 
100BSV trafia na jego adres 1Be77gchGhsd5.. !

To dobrze pokazuje jedną z najważniejszych rzeczy dotyczących UTXO: UTXO nie jest przywiązane do osoby ani nawet koniecznie do adresu. Jest przywiązane do warunku, który trzeba spełnić, aby móc je wydać. Pokazywałem podobny sposób w tym wpisie: Python Bitcoin bsv-sdk: R-Puzzle.

UTXO wydajesz w całości

Kluczowa cecha: UTXO jest niepodzielne w momencie wydawania - albo wydajesz je całe, albo wcale.

Jeśli chcesz wysłać 0.1 BSV, a masz tylko jedno UTXO o wartości 0.2 BTC, to transakcja zużywa całe 0.2 BSV jako wejście, tworzy nowe wyjście 0.1 BSV dla odbiorcy i drugie wyjście 0.1 BSV jako resztę z powrotem do Ciebie.

Nie ma opcji, że przetniesz to na pół i wydasz połowę, a potem znowu weźmiesz to samo UTXO. Nie - stare UTXO po transakcji przestaje istnieć, a jego wartość jest podzielona na nowe UTXO, które stają się nowymi monetami w obiegu.

Skąd biorą się pierwsze UTXO?

No dobrze, ale skoro UTXO zawsze jest wyjściem wcześniejszej transakcji, to pojawia się naturalne pytanie: skąd wzięło się pierwsze UTXO? Tutaj mamy wyjątek od całego mechanizmu.

Każdy blok może zawierać specjalną transakcję coinbase. I nie chodzi tutaj o giełdę; coinbase transaction to specjalny typ transakcji tworzonej przez górnika. Jej pierwsze wejście, nie wskazuje żadnego wcześniejszego UTXO. To właśnie dzięki temu protokół może utworzyć nowe bitcoiny w ramach nagrody za wydobycie bloku. Output takiej transakcji staje się następnie normalnym UTXO i może być później wydany.

Czyli w dużym uproszczeniu:

coinbase → pierwsze UTXO → zwykła transakcja → kolejne UTXO → kolejna transakcja → kolejne UTXO

Zobacz jak wygląda pierwsze UTXO w eksploratorze: txid/4a5e1e4baab8..

I tak powstaje cały łańcuch przepływu wartości. Warto przy okazji wiedzieć, że UTXO pochodzące z transakcji coinbase nie można wydać od razu - obowiązuje okres dojrzewania wynoszący 100 bloków.

UTXO vs model konta

W systemie opartym na kontach blockchain musi przechowywać globalny stan: drzewo wszystkich adresów wraz z saldami, licznikami transakcji i ewentualnym kodem kontraktów.

Każda nowa transakcja lub wywołanie smart contractu czyta ten stan, aktualizuje go i zapisuje z powrotem, co tworzy zależności i kolejność wykonywania - dwie transakcje dotykające tego samego konta nie mogą być przetworzone niezależnie.

W modelu UTXO nie ma jednego wspólnego stanu kont - są tylko niezależne wyjścia; jeśli dwie transakcje zupełnie nie dzielą wejść, mogą być walidowane równolegle, bo każda "żyje" w swoim kawałku transakcji.

Skalowalność: dlaczego UTXO lubi równoległość

Jak już wiemy, każde UTXO jest niezależną jednostką wartości, którą można zweryfikować bez oglądania się na salda - protokół sprawdza m.in., czy wskazane UTXO istnieje i nie zostało wcześniej wydane oraz czy transakcja spełnia warunki jego wydania. To sprawia, że walidacja transakcji jest równoległa: wiele transakcji zużywających różne UTXO można liczyć jednocześnie, bo nie modyfikują wspólnej zmiennej w postaci jednego salda.

W systemie kontowym każda transakcja dotyka globalnego stanu i konkretnego konta, więc powstają wąskie gardła na popularnych adresach i kontraktach - tu UTXO ma przewagę, zwłaszcza w wysokiej przepustowości, do której celuje BSV.

Prywatność

UTXO zachęca użytkowników do generowania nowych adresów dla kolejnych transakcji, więc historia przepływu środków nie jest przypięta na stałe do jednego adresu użytkownika.

Każdy nowy UTXO może być związany z innym adresem, co utrudnia czytanie salda jednej osoby, choć oczywiście analityka blockchain nadal potrafi wiele połączyć ;)

W modelu kontowym wygoda ma cenę: masz jeden widoczny adres, stan konta i wszystkie transakcje lecą przez ten sam adres, to ułatwia tworzenie pełnego profilu aktywności użytkownika - UTXO trochę to rozbija na mniejsze kawałki, ale-  nie oszukujmy się - nie czyni Cię niewidzialnym.

UTXO w portfelu

Z punktu widzenia zwykłego użytkownika, każdy portfel ukrywa cały ten mechanizm i pokazuje jedno saldo, ale pod spodem operuje listą UTXO, które dobiera jako wejścia do transakcji - często łącząc kilka mniejszych w jedno większe wydanie.

Takie dokładanie UTXO wpływa na rozmiar transakcji i opłaty: im więcej drobnych kawałków trzeba wrzucić do wejść, tym cięższa transakcja i tym wyższa prowizja, stąd pojęcie zarządzania UTXO (pisałem o tym tutaj)  i konsolidacji wielu małych UTXO w jeden większy UTXO.

W praktyce jeśli często dostajesz małe płatności, Twój portfel z czasem staje się zbiorem drobniaków, które warto od czasu do czasu połączyć w jedną większą transakcję konsolidującą, żeby późniejsze płatności były tańsze i prostsze.

Ale o transakcji i kilku ciekawych pojęciach, które warto znać, jeszcze tutaj napiszę.

Cześć!


Płacę za czytanie mojego bloga. Dowiedz się więcej.

RELAX4000 VERIFIED
UTXO łopatologicznie i dlaczego Bitcoin działa jak gotówka.
opublikowano: 08 września 2026
HASH
zweryfikowany w blockchain SPRAWDŹ ZAPIS →

Komentarze

Popularne posty

Status w życiu: confirmed. Dobra, super, a co dalej?

Python Bitcoin bsv-sdk: pierwsza transakcja

Discord kontra Forum – dlaczego Twój mózg tęskni za phpBB

🔐 Portfele BRC-100 / BSV
Połącz kompatybilny portfel BSV z tym blogiem.
Dowiedz się więcej →
🟢 Portfel połączony
Identity Public Key