Bitcoin SV w Pythonie
W poprzednich wpisach ( 1, 2, 3, 4 ) wygenerowaliśmy klucz prywatny, poznaliśmy adres testnet, mainnet, sprawdziliśmy saldo, pobraliśmy niewydane transakcje, zbudowaliśmy szablon transakcji i ostatecznie wysłaliśmy BSV. Teraz nauczymy się, jak sprawniej zarządzać UTXO, żebyśmy z automatu wiedzieli, ile mamy niewydanych transakcji, ile środków i na ile sobie możemy pozwolić, podczas ich wydawania.
Saldo i UTXO
W
Bitcoin (BSV) saldo adresu nie istnieje w jednym miejscu, tylko jest
sumą wszystkich niewydanych wyjść transakcji (UTXO - Unspent Transaction
Outputs) przypisanych do tego adresu.
Nasz fragment kodu:
pokazuje to saldo jako zagregowaną wartość w satoshi, ale naprawdę składa się ono z wielu osobnych UTXO, które pobieramy drugim wywołaniem:
Nasze saldo to tylko wygodny widok na wszystkie UTXO a wywołanie jego adresu, po cichu przelicza listę UTXO i pokazuje je jako jedną liczbę.
Wcześniej nasz kod odwoływał się tylko do ostatniej niewydanej transakcji i pobierał jej hash, a teraz zakładamy sytuację, że otrzymaliśmy od kogoś kilka wpłat i chcemy wydać najwcześniejszą lub wydać 2, 3 albo wszystkie jednocześnie.
Wygenerowałem sobie nowy klucz prywatny i adres i nazwałem to jako ADRES ODBIORCY, następnie z poprzedniego adresu (ADRES NADAWCY) wysłałem 3 transakcje:
- transakcja nr 1 (2 wyjścia) - ADRES ODBIORCY, reszta do ADRESU NADAWCY
- transakcja nr 2 (2 wyjścia) - ADRES ODBIORCY, reszta do ADRESU NADAWCY
- transakcja nr 3 (3 wyjścia) - jakiś adres, ADRES ODBIORCY, reszta do ADRESU NADAWCY
Zaznaczyłem na czerwono wyjścia/wejścia ADRESU ODBIORCY: 0,0,1.
SPRAWDZANIE UTXO
Wynik tego kodu daje nam taki rezultat:
Widzisz, że na saldo 888 satoshi, składają się 3 transakcje a ich kolejność to 0,0,1. (najstarsza na górze).
Teraz wystarczy dodać pętlę, która wyciągnie nam odpowiednie dane:
Wykonanie kodu daje taki rezultat:
Widzimy 3 niewydane utxo: 222, 333 i 333 satoshi, teraz chcemy wydać 400 satoshi.
Sprawdźmy co się stanie gdy użyjemy jednego UTXO z niewystarczającą liczbą satoshi:
Wykonanie kodu dało taki rezultat:
Co ciekawe pojawił się hash transakcji ale jego sprawdzenie nie zwróci żadnych szczegółów; transakcja w ogóle nie weszła do sieci więc hash, który widzisz, istnieje tylko lokalnie a nie w publicznej sieci.
Teraz musimy nieco przebudować nasz kod, żeby tak dobrać UTXO i indeksy, bo kwota była równa lub większa naszej kwocie do wydania ale na samym początku trochę praktyki:
W poprzednich przykładach, ręcznie wskazywałem jedno konkretne UTXO jako wejście transakcji. Teraz program sam wybierze kilka UTXO, które razem dadzą odpowiednią kwotę. W Pythonowym SDK dla BSV robi się to bardzo prosto - zamiast wywoływać add_input jeden raz, przechodzimy po liście wybranych UTXO i w pętli dokładamy kolejne wejścia. Dodatkowo jeszcze przed wywołaniem tx.sign() sprawdzamy opłatę i dodajemy warunek, czy wybrane UTXO + opłata pokrywaja naszą kwotę do_wydania .
Pełny kod:
Uruchamiamy kod i...
- wydaliśmy 2 UTXO, na jeden adres (400 satoshi),
- reszta wróciła do nas.

- potrafisz wygenerować klucz prywatny,
- uzyskać klucz i adres publiczny,
- sprawdzić saldo,
- pobrać UTXO i uzyskać z nich HEX,
- wysłać Bitcoina sobie lub komuś innemu i zwrócić resztę,
- zarządzać UTXO i opłatami za transakcję
**Gwarantuję Ci niezmienność moich treści**
Hash artykułu:
ID transakcji: sprawdź OP_RETURN i porównaj jego hash
Komentarze
Prześlij komentarz