
Monety, salda i konta: dlaczego „ile mam" ma trzy różne odpowiedzi
Otwórz portfel obsługujący kilka łańcuchów i, jeśli przyjrzysz się uważnie, zauważysz coś dziwnego. Saldo Bitcoina i saldo Ethereum to w obu przypadkach zwykłe liczby na ekranie, ale pod spodem liczone są w zupełnie różny sposób — a na Solanie mamy jeszcze trzecie rozwiązanie.
To nie ciekawostka. To wyjaśnia, dlaczego opłaty w Bitcoinie zależą od twojej historii transakcji, dlaczego transakcja w Ethereum może zawieść i mimo to kosztować pieniądze, i dlaczego konta na Solanie nie da się po prostu opróżnić do zera.
Model UTXO: masz monety, a nie saldo
Bitcoin nie ma kont i nie przechowuje sald. Przechowuje zbiór niewydanych wyjść transakcji — UTXO — z których każde jest odrębnym kawałkiem wartości zablokowanym jakimś warunkiem wydania.
Pomyśl o gotówce. Nie masz w kieszeni „47 złotych"; masz banknot dwudziestozłotowy, dwie dziesiątki, piątkę i dwie złotówki. Żeby zapłacić 23, wręczasz dwudziestkę i piątkę, a dostajesz 2 reszty. Banknotu nie da się rozerwać na pół.
UTXO działają dokładnie tak. Każde musi zostać wydane w całości. Żeby zapłacić 0,3 BTC z wyjścia o wartości 1 BTC, twój portfel zużywa całe BTC i tworzy dwa nowe wyjścia: 0,3 dla odbiorcy i mniej więcej 0,7 z powrotem do ciebie jako reszta. UTXO o wartości 1 BTC przestaje istnieć.
Twoje „saldo" jest zatem wielkością pochodną — portfel przeczesuje łańcuch w poszukiwaniu wyjść zablokowanych warunkami, które potrafisz spełnić, i je sumuje. Nigdzie w łańcuchu Bitcoina nie ma zapisu mówiącego, że masz jakąś konkretną kwotę.
Wynikają z tego trzy rzeczy i wszystkie trzy są praktyczne:
Opłaty zależą od twojej historii, nie tylko od kwoty. Nalicza się je za bajt, a każde wydane wejście dokłada bajtów. Zapłacenie 50 złotych z jednego dużego UTXO jest tanie; zapłacenie tych samych 50 złotych przez połączenie trzydziestu maleńkich jest drogie, bo transakcja jest fizycznie większa. Dlatego konsolidowanie UTXO, gdy opłaty są niskie, ma sens.
Reszta jest prawdziwym wyjściem, które musi gdzieś trafić. Każdy portfel załatwia to automatycznie, ale to właśnie mechanizm stojący za heurystykami adresu reszty, którymi analitycy łańcucha wiążą twoje adresy ze sobą.
Wydawanie jest z natury równoległe. Różne UTXO są niezależne, więc nic nie wymusza na twoich transakcjach sztywnej kolejności.
Bitcoin, Litecoin, Dogecoin, Bitcoin Cash, Zcash, Ravencoin i Flux — wszystkie działają w ten sposób. To starszy model i ten, w którym „nie twoje klucze, nie twoje monety" jest najbardziej dosłownie prawdziwe: nie ma konta, są tylko monety z doczepionymi warunkami.
Model kont: masz saldo i licznik
Ethereum wyrzuciło to za burtę i sięgnęło po coś bliższego księdze bankowej. Łańcuch przechowuje stan: ogromne odwzorowanie adresów na salda (a dla kontraktów — na zapisane dane). Wysłanie 0,3 ETH odejmuje 0,3 od jednej liczby i dodaje do drugiej. Żadnych wejść, wyjść ani reszty.
To prostsze i właśnie to czyni inteligentne kontrakty wykonalnymi — kontrakt potrzebuje trwałej pamięci, którą może czytać i zapisywać, co jest niewygodne, gdy świat składa się z odrębnych monet.
Ale model kont wprowadza problem, którego UTXO nie mają. Jeśli transakcja mówi tylko „odejmij Alicji 0,3", to każdy, kto ją zobaczy, mógłby rozgłaszać ją wielokrotnie i opróżnić jej konto. Lekarstwem jest nonce: licznik przypisany do konta, zawarty w każdej transakcji, który musi rosnąć dokładnie o jeden. Transakcja numer 7 może zostać wykopana dopiero po numerze 6 i tylko raz.
Nonce jest powodem, dla którego łańcuchy EVM zachowują się tak, jak się zachowują:
Twoje transakcje mają ściśle ustaloną kolejność. Jedna zablokowana transakcja blokuje wszystkie późniejsze z tego samego adresu, bo nie da się ich przetworzyć poza kolejnością.
Opłaty są pobierane nawet wtedy, gdy transakcja zawiedzie. Gaz płaci za obliczenia podjęte, a nie za obliczenia udane. Wycofane wywołanie kontraktu i tak zużyło pracę walidatorów, więc i tak kosztuje. To bez przerwy ludzi zaskakuje i jest realną różnicą wobec świata UTXO, gdzie nieprawidłowa transakcja po prostu nigdy się nie potwierdza i nic nie kosztuje.
Zarządzanie noncami to prawdziwa infrastruktura. Dla zwykłego portfela jest niewidoczne. Dla multisiga, w którym dwa urządzenia muszą się zgodzić przed rozgłoszeniem, nonce trzeba zarezerwować, śledzić i zwolnić — i dlatego obchodzenie się z noncami wraca stale przy podpisywaniu dwoma urządzeniami, zamiast być szczegółem implementacyjnym.
Ethereum, Polygon, BSC, Avalanche, Base i XDC — wszystkie używają tego modelu.
Solana: konta, które płacą czynsz
Solana też opiera się na kontach, ale z pewnym haczykiem, który zaskakuje ludzi.
Na Solanie właściwie wszystko jest kontem — twój portfel, każdy token, który trzymasz, dane każdego programu. A ponieważ te konta zajmują pamięć walidatorów, muszą utrzymywać minimalne saldo, żeby pozostać przy życiu. To zwolnienie z czynszu: wpłać dość, a konto trwa bezterminowo; spadnij poniżej, a może zostać odzyskane.
Praktyczny skutek jest taki, że trzymanie tokena SPL wymaga osobnego konta tokena, zasilonego odrobiną SOL, zanim ktokolwiek zdoła ci ten token w ogóle wysłać. Odbieranie nie jest darmowe. To nietypowe i warto to zrozumieć, zanim będzie potrzebne, bo „wysłałem ci tokeny i nic nie dotarło" to często po prostu brakujące konto tokena.
Dlaczego portfel wielołańcuchowy musi modelować wszystkie trzy
Portfel obsługujący te łańcuchy nie może mieć jednego wewnętrznego pojęcia „salda". Potrzebuje:
- Dla łańcuchów UTXO: zbioru wyjść, każde z kwotą i skryptem, plus logiki wyboru monet decydującej, które wydać.
- Dla łańcuchów EVM: pojedynczej liczby salda plus nonce'a i kolejki respektującej porządek.
- Dla Solany: salda, zbioru powiązanych kont tokenów i świadomości minimów czynszowych.
Architektura bezpieczeństwa też musi się dostosować. W łańcuchach UTXO dwa-z-dwóch w SSP to skrypt: wyjście P2WSH wymagające dwóch podpisów do odblokowania, egzekwowane przez własne reguły skryptowe łańcucha. W łańcuchach EVM nie ma odpowiednika takiego systemu skryptów dla zwykłych kont, więc multisig realizuje się przez abstrakcję konta — konto będące inteligentnym kontraktem, którego logika walidacji żąda obu podpisów. Na Solanie to adres wyprowadzony z programu, kontrolowany przez program w łańcuchu.
Trzy zupełnie różne mechanizmy, jedna idea od strony użytkownika: nic się nie ruszy bez obu urządzeń. To, że leżące pod spodem implementacje w niczym się nie przypominają, jest właśnie powodem, dla którego gwarancję trzeba ustanawiać i audytować na nowo w każdym łańcuchu, zamiast zakładać, że się przenosi.
Co to znaczy dla ciebie
Kiedy opłaty w Bitcoinie wydają się wysokie jak na drobną płatność, spójrz na swoje wejścia. Mniej liczy się kwota, a bardziej z ilu kawałków się składa.
Kiedy transakcja w Ethereum utknie, późniejsze z tego samego adresu tkwią za nią. To nonce, a nie usterka. Naprawienie pierwszej odblokowuje kolejkę.
Kiedy nieudana transakcja EVM i tak cię obciąży, model działa zgodnie z projektem. Symulacja pomaga tego uniknąć — dlatego symulowanie przed podpisem jest cenniejsze w łańcuchach opartych na kontach niż w UTXO.
Kiedy przelew tokenów na Solanie „znika", poszukaj konta tokena. Nic nie przepadło; cel mógł jeszcze nie istnieć.
Żadna z tych rzeczy nie jest dziwactwem konkretnego portfela. To konsekwencje decyzji projektowej, którą każdy łańcuch podjął lata temu, a gdy tylko dostrzeżesz, w którym modelu jesteś, mnóstwo skądinąd zagadkowych zachowań staje się przewidywalne.


