Bitcoin SV w Pythonie
W poprzednich wpisach ( 1, 2, 3 ) 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 do siebie. Teraz nauczymy się, jak przy pomocy oficjalnego bsv-sdk dla Pythona zbudować transakcję, którą wyślemy komuśinnemu a resztę zwrócimy sobie. Cały czas działamy na naszym pliku; jeśli go nie masz, wróć do wpisu z części III.
METODA I
Krok 0: zadeklaruj adres odbiorcy
Zmienną wstaw przed rozpoczęciem funkcji asynchronicznej. Jeśli chcesz, aby wartość tej zmiennej była podawana dynamicznie, możesz pobrać ją za pomocą funkcji
input()
odbiorca =
'mnai8LzKea5e3C9qgrBo7JHgpiEnHKMhwR'
To jest adres osoby, do której wysyłasz BSV. W moim przykładzie podałem adres kranu testnet https://scrypt.io/faucet/
To jest adres osoby, do której wysyłasz BSV. W moim przykładzie podałem adres kranu testnet https://scrypt.io/faucet/
Krok 1: Pierwszy output - reszta dla Ciebie
Nasz input z poprzedniego wpisu pozostaje bez zmian, jest na ten moment wystarczająco dobry
(pobiera UTXO i jego indeks)
; zajmiemy się teraz budowaniem pierwszego wyjścia. Spójrz na ten kod i lekko zmodyfikuj poprzedni.
tx_output = TransactionOutput(
locking_script=P2PKH().lock(address_testnet),
change=
True
)
Tutaj pozbyliśmy się zmiennej satoshis ; w parametrach mamy jedynie nasz adres address_testnet oraz zmienną change= True ,która zwróci nam resztę. Tworzysz tutaj locking script typu P2PKH na własny adres, czyli mówisz: "to wyjście należy do mnie, mogę je wydać, bo mam do niego klucz prywatny".
Krok 2: Output do odbiorcy - faktyczna płatność
tx_output_1 = TransactionOutput(
locking_script=P2PKH().lock(odbiorca),
satoshis=do_wyslania,
change=
False
)
To jest drugi output - prawdziwa płatność. Tworzysz locking script P2PKH na adres odbiorcy, od tego momentu UTXO, które tu powstanie, będzie mógł wydać tylko ten, kto ma klucz prywatny do mnai8Lz..
)
To jest drugi output - prawdziwa płatność. Tworzysz locking script P2PKH na adres odbiorcy, od tego momentu UTXO, które tu powstanie, będzie mógł wydać tylko ten, kto ma klucz prywatny do mnai8Lz..
Kolejno mamy zmienną
do_wyslania
, ta wartość jest sztywna ale możesz ją też podać dynamicznie za pomocą funkcji
input()
No i ważne, ten output nie jest outputem na resztę, dlatego
change=
False
Krok 3: Składanie transakcji
tx = Transaction([tx_input], [tx_output, tx_output_1], version=1)
print(
f"{address_testnet} wysyła {do_wyslania} satoshi do {odbiorca}"
)
Tworzysz obiekt
Transaction
z listą wejść i wyjść; print to nasza informacja, co się dzieje.
Cała reszta pozostaje bez zmian.
Teraz zapisz i uruchom kod:
Cała reszta pozostaje bez zmian.
Teraz zapisz i uruchom kod:
METODA II
W przeciwieństwie do poprzedniej metody, gdzie podawałeś wszystko w konstruktorze
Transaction([...], [...]))
, tutaj najpierw tworzysz pustą transakcję, a potem dokładasz do niej klocki jeden po drugim. To świetny sposób na naukę, bo widać dokładnie kolejność działań.
Przeanalizuj ten kod z tym co już masz i zobacz różnice:
async def
create_and_broadcast_transaction():
tx = Transaction()
tx.add_input(TransactionInput(
source_transaction=Transaction.from_hex(tx_hex),
source_output_index=tx_pos,
unlocking_script_template=P2PKH().unlock(klucz_prywatny)))
tx.add_output(TransactionOutput(
locking_script=P2PKH().lock(odbiorca),
satoshis=do_wyslania))
tx.add_output(TransactionOutput(
locking_script=P2PKH().lock(address_testnet),
change=True ))
tx = Transaction()
tx.add_input(TransactionInput(
source_transaction=Transaction.from_hex(tx_hex),
source_output_index=tx_pos,
unlocking_script_template=P2PKH().unlock(klucz_prywatny)))
tx.add_output(TransactionOutput(
locking_script=P2PKH().lock(odbiorca),
satoshis=do_wyslania))
tx.add_output(TransactionOutput(
locking_script=P2PKH().lock(address_testnet),
change=True ))
tx.fee()
tx.sign()
Zaczynasz od czystej kartki tx = Transaction()
tx to teraz pusty obiekt transakcji: nie ma wejść (kto płaci?), nie ma wyjść (komu płacimy?)
Później używasz metody
.add_input(...)
na obiekcie
tx oraz .add_output(...)
Obie metody robią to samo pod maską. Ta metoda jest często łatwiejsza do zrozumienia dla początkujących, bo przypomina budowanie z klocków LEGO po kolei.
Metoda I: Tworzysz wszystko naraz, gdy masz już gotowe listy inputów/outputów.
Metoda II: widzisz proces i możesz dynamicznie dodawać elementy w pętli.
Po tych czterech wpisach znasz podstawy podstaw:
- potrafisz wygenerować klucz prywatny,
- uzyskać klucz i adres publiczny,
- sprawdzić saldo,
- pobrać UTXO i uzyskać z niej HEX,
- wysłać Bitcoina sobie lub komuś innemu i zwrócić resztę.
To co dalej? Czy to wszystko co potrafimy zrobić na tym słynnym Bitcoinie?
Ha! To zależy o którym mówimy - o BTC czy o BSV (tym oryginalnym, na którym tu piszemy).
To jak porównywanie dwóch światów, które teoretycznie mają wspólnego przodka, ale po latach poszły w tak odmienne strony, że dziś nie wiadomo, czy powinny jeszcze używać tego samego nazwiska ale o tym... przeczytasz w kolejnym wpisie.
Cześć!
Jeśli moje wpisy przypadły Ci do gustu i chcesz wesprzeć rozwój bloga, możesz postawić mi wirtualną kawę (GGwallet czeka!) albo wrzucić coś na adres BSV. Oczywiście, to całkowicie dobrowolne - blog i tak zawsze będzie dostępny za darmo. Dzięki za każde wsparcie, nawet to w formie dobrej energii! ☕😊
**Gwarantuję Ci niezmienność moich treści**
Hash artykułu:
ID transakcji: sprawdź OP_RETURN i porównaj jego hash
dziękuję.
OdpowiedzUsuń