-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbsvpl.py
More file actions
340 lines (279 loc) · 15.1 KB
/
Copy pathbsvpl.py
File metadata and controls
340 lines (279 loc) · 15.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
import bitsv
import os
import time
import secrets
import requests
import colorama as color
import termcolor as colors
color.init()
def cls():
""" Czyści okno konsoli """
os.system('cls' if os.name=='nt' else 'clear')
def logo():
""" Logo """
print(colors.colored("\t ___ _ _ _ _ ", "yellow"))
print(colors.colored("\t / __(_) |_ ___ ___ (_)_ __ _____ ___ __ | |", "yellow"))
print(colors.colored("\t /__\// | __/ __/ _ \| | '_ \/ __\ \ / / '_ \| |", "yellow"))
print(colors.colored("\t/ \/ \ | || (_| (_) | | | | \__ \\ V /| |_) | |", "yellow"))
print(colors.colored("\t\_____/_|\__\___\___/|_|_| |_|___/ \_(_) .__/|_|", "yellow"))
print(colors.colored("\t |_| ", "yellow"))
print(" ")
def info():
""" Logo + Menu wyboru """
wybor = None
while wybor != "4":
print(colors.colored("\t ___ _ _ _ _ ", "yellow"))
print(colors.colored("\t / __(_) |_ ___ ___ (_)_ __ _____ ___ __ | |", "yellow"))
print(colors.colored("\t /__\// | __/ __/ _ \| | '_ \/ __\ \ / / '_ \| |", "yellow"))
print(colors.colored("\t/ \/ \ | || (_| (_) | | | | \__ \\ V /| |_) | |", "yellow"))
print(colors.colored("\t\_____/_|\__\___\___/|_|_| |_|___/ \_(_) .__/|_|", "yellow"))
print(colors.colored("\t |_| ", "yellow"))
print(" ")
print("\t MENU")
print(colors.colored("\t1. Samouczek", "green"))
print(colors.colored("\t2. Stwórz nowy klucz prywatny", "red"))
print(colors.colored("\t3. Wyślij wiadomość", "cyan"))
print("\t4. Wyjście")
print(" ")
wybor = str(input("\tWybieram: "))
if wybor == "1":
cls()
logo()
krok_1()
elif wybor == "2":
cls()
logo()
krok_2()
elif wybor == "3":
cls()
logo()
krok_3()
def krok_3():
""" Wysyłanie wiadomości do blockchain BSV """
print(colors.colored("\n\t[WYSYŁANIE WIADOMOŚCI]", "magenta"))
chain = None
while chain != "test" or chain != "main" or chain != "wyjscie":
chain = str(input("\n\tDo jakiej sieci chcesz wysłać wiadomość? (main/test/wyjscie) "))
if chain == "wyjscie":
info()
elif chain == "test" or chain == "main":
print("\tWybrałeś sieć [", chain, "]")
break
tekst = str(input("\tWpisz tutaj treść jaką chcesz wysłać i potwierdź 'enter': "))
print("\tTwoja wiadomość wygląda tak: [", tekst, "]")
odp_1 = str(input("\tCzy chcesz ją wysłać? (tak/nie) "))
if odp_1.lower() == "nie":
input("\tTo wracamy do menu :)")
info()
elif odp_1.lower() == "tak":
potwierdzenie = None
while potwierdzenie != "tak":
private_key = str(input("\tWprowadź klucz prywatny i potwierdź 'enter' : ")) # Tu wprowadzasz swój klucz prywatny
print(colors.colored("\t--------------------------------------------------------------------------------------------------", "yellow"))
print("\t", private_key)
print(colors.colored("\t--------------------------------------------------------------------------------------------------", "yellow"))
potwierdzenie = str(input("\n\tCzy klucz jest prawidłowy? (tak/nie) "))
try:
key = bitsv.Key.from_hex(private_key, network=chain) # Klucz publiczny + klucz prywatny
saldo = key.get_balance('bsv') # Saldo adresu
except ValueError:
print(colors.colored("\tValueError: non-hexadecimal number found in fromhex() arg at position 1", "red"))
input("\t'Enter' by wyjść do menu..")
cls()
info()
if float(saldo) == 0.0: # Jeżeli saldo wynosi 0 BSV
print(colors.colored("\tNie możesz wysłać wiadomości. Musisz mieć dodanie saldo.", "red"))
key = None # Adres publiczny ma wartość None
private_key = None # Klucz prywatny ma wartośc None
input("\t'Enter' by wyjść do menu..")
cls()
info()
else: # Jeżeli saldo jest większe od 0
cls() # Wymaż konsolę
logo()
list_of_pushdata = [bytes.fromhex('6d01'), tekst.encode('utf-8')] # Wygeneruj wiadomość
key.send_op_return(list_of_pushdata, fee=0) # Wyślij wiadomość
print(colors.colored("\n\t[Wiadomość została wysłana!]", "green"))
private_key = None # Zastąp klucz prywatny wartością None
print(colors.colored("\n\tSprawdzam hash transakcji..", "yellow"))
time.sleep(5) # Odczekaj 5 sekund na pobranie transakcji z blockchain
unspend = key.get_unspents() # Sprawdź niepotwierdzone/wysłane
txid_x = unspend[0]
txid = str(txid_x)
lis_0 = txid.find("'")
one_id = txid[(lis_0 + 1):(lis_0 + 65)] # Wygeneruj tylko hash transakcji
while not unspend: # Jeżeli nie ma jeszcze niewydanych/niepotwierdzonych odczekaj 5 sekund i powtórz zapytanie
time.sleep(5)
unspend = key.get_unspents()
txid_x = unspend[0]
txid = str(txid_x)
lis_0 = txid.find("'")
one_id = txid[(lis_0 + 1):(lis_0 + 65)]
key = None # Zastąp adres publiczny wartością None
print("\tHash Twojej transakcji --> ", one_id)
input("\n\tTo wracamy do menu :)")
cls()
info()
else:
input("\tTo wracamy do menu :)")
cls()
info()
def krok_2():
""" Tworzenie klucza prywatnego """
print(colors.colored("\n\t[TWORZENIE NOWEGO KLUCZA PRYWATNEGO]", "magenta"))
print("\n\tKlucz prywatny tworzony jest z pomocą modułu 'secrets' języka programowania Python.")
print(colors.colored("\tBezpieczeństwo takiego klucza to szyfrowanie 256 bitowe. ", "yellow"))
print(colors.colored("\tRozłącz się z internetem.", "red"))
print("\tTeraz naciśnij 'enter' by utworzyć nowy klucz prywatny.")
input()
bits = secrets.randbits(256) # Tworzenie klucza prywatnego
bits_hex = hex(bits)
private_key = bits_hex[2:]
print(colors.colored("\n\t--------------------------------------------------------------------------------------------------", "yellow"))
print("\tTwój klucz prywatny to:", private_key) # Klucz prywatny
print(colors.colored("\t--------------------------------------------------------------------------------------------------", "yellow"))
print(colors.colored(" *Skopiuj i Zapisz swój klucz prywatny*", "red"))
print(colors.colored("\n\tPołącz się z internetem.", "yellow"))
print("\tTeraz naciśnij 'enter' by sprawdzić listę adresów publicznych.")
input()
status_url = check_conn() # Sprawdź połączenie z internetem
while status_url != 200:
status_url = check_conn()
print(colors.colored("\n\t[*]Brak połączenia z siecią..[*]", "red"))
input("\tNaciśnij 'enter' i sprawdź ponownie.. ")
cls() # Wyczyść okno konsoli
logo()
print(colors.colored("\n\t[TWORZENIE NOWEGO KLUCZA PRYWATNEGO]", "magenta"))
new_key_main = bitsv.Key.from_hex(private_key, network="main") # Adres publiczny MAIN
new_key_test = bitsv.Key.from_hex(private_key, network="test") # Adres publiczny TEST
new_key_stn = bitsv.Key.from_hex(private_key, network="stn") # Adres publiczny STN
print(colors.colored("\n\t--------------------------------------------------------------------------------------------------", "yellow"))
print("\tTwój adres publiczny w sieci MAINNET to:", new_key_main.address)
print("\tTwój adres publiczny w sieci TESTNET to:", new_key_test.address)
print("\tTwój adres publiczny w sieci STN to:", new_key_stn.address)
print(colors.colored("\t--------------------------------------------------------------------------------------------------", "yellow"))
private_key = None # Zastąp klucz prywatny wartością None
odpowiedz = None # Zastąp adres publiczny wartością None
while odpowiedz != "tak":
odpowiedz = str(input("\n\tCzy wrócić do MENU? (tak) "))
cls()
info()
def check_conn():
""" Sprawdza połączenie z internetem """
print("\tSprawdzam połączenie..")
try:
url = "https://api.whatsonchain.com/v1/bsv/test/woc"
response = requests.get(url)
status_url = response.status_code
except:
status_url = None
return status_url
def krok_1():
""" Samouczek """
print(colors.colored("\n\t[SAMOUCZEK]", "magenta"))
print("""\n\tTen niewielki program, jest małym portfelem za pomocą którego możesz wysyłać wiadomości
do blockchaina BitcoinSV. Fakt, mógł mieć dość ciekawy interfejs graficzny ale jestem zwolennikiem
prostoty,dlatego działa w konsoli. Pomimo tego posiada potrzebne funkcje, które dają mozliwość bliższego
poznania i działania z blockchain.
Pierwszą rzeczą jaką zrobimy to założenie nowego klucza prywatnego ale SPOKOJNIE.
Zrobimy to na łańcuchu testowym :)""")
odpowiedz = None
while odpowiedz != "test":
odpowiedz = str(input("\n\tW jakiej sieci chcesz założyć klucz prywatny? (wpisz 'test' i potwierdz 'enter') "))
if odpowiedz.lower() == "test":
cls()
logo()
chain = "test"
print(colors.colored("\n\t[KROK 1]", "cyan"))
print(colors.colored("\n\tWybrałeś sieć TESTNET.", "green"))
print("\tTo jeszcze nic nie oznacza, narazie wszystko dzieje się lokalnie na Twoim komputerze.")
print("\tKlucz prywatny tworzony jest z pomocą modułu 'secrets' języka programowania Python.")
print(colors.colored("\tBezpieczeństwo takiego klucza to szyfrowanie 256 bitowe. ", "yellow"))
print("\tModuł 'secrets' jest znacznie bezpieczniejszy, ponieważ czerpie entropię bezpośrednio z systemu operacyjnego.")
print("\tTa przypadkowość jest często zbierana ze źródeł sprzętowych,")
print("\tzróżnicowania hałasu wentylatora lub dysku twardego,")
print("\talbo z istniejących wcześniej, takich jak ruchy myszy, kliknięcia itp.")
print("\tWynik takiego RNG (random number generator) jest znacznie trudniejszy do odtworzenia.")
print("\tNie możesz go odtworzyć, znając czas powstania lub mając seed, ponieważ - nie ma seed!")
print("\tKlucz prywatny który zaraz utworzymy, może być również użyty w sieci MAIN")
print("\tto dlatego, że jest bez znaczenia do jakieś sieci go utworzysz - po prostu tworzysz nowy klucz.")
print("\tMożesz teraz rozłączyć na chwilę swoje połączenie z internetem, by poczuć się bezpieczniej.")
print("\tTeraz naciśnij 'enter' by utworzyć nowy klucz prywatny.")
input()
cls()
logo()
tworzenie_klucza_prywatnego(chain)
def tworzenie_klucza_prywatnego(chain):
""" Tworzy klucz prywatny """
bits = secrets.randbits(256)
bits_hex = hex(bits)
private_key = bits_hex[2:]
print(colors.colored("\n\t[KROK 2]", "cyan"))
print("\n\tTwój klucz prywatny to:", private_key)
print(colors.colored(" *Skopiuj i Zapisz swój klucz prywatny*", "red"))
print("\tTeraz musimy sprawdzić, adres publiczny i saldo ale do tego potrzeba już połączenia z internetem")
input("\tJeśli jesteś połączony z siecią, wciśnij 'enter'")
status_url = check_conn()
while status_url != 200:
status_url = check_conn()
print(colors.colored("\t[*]Brak połączenia z siecią..[*]", "red"))
input("\tNaciśnij 'enter' i sprawdź ponownie.. ")
cls()
logo()
conn(chain, private_key)
def conn(chain, private_key):
""" Sprawdza adres publiczny i saldo """
new_key = bitsv.Key.from_hex(private_key, network=chain)
saldo = new_key.get_balance('bsv')
print(colors.colored("\n\t[KROK 3]", "cyan"))
print("\n\tBrawo! Twój adres publiczny w sieci TESTNET to:", new_key.address)
print("\tSaldo twojego portfela wynosi", saldo, "BSV")
print("\tZauważ, że adres portfela wygląda nieco inaczej.")
print("\tTo dlatego, że jest adresem publicznym w sieci testowej")
print("\tMożesz go sprawdzić, wchodząc na stronę https://whatsonchain.com/, wybrać sieć TEST,")
print("\tlub wejśc bezpośrednio na https://test.whatsonchain.com/ i wkleić adres publiczny")
odpowiedz = None
while odpowiedz != "tak":
odpowiedz = str(input("\n\tCzy chcesz przejść do [Krok 4]? (tak) "))
cls()
logo()
print(colors.colored("\n\t[KROK 4]", "cyan"))
print("\n\tTeraz zasilimy Twój adres publiczny [", new_key.address, "]")
print("\tWejdź na stronę https://test.whatsonchain.com/ i z zakładki 'Tools' wybierz 'Faucet'.")
print("\tWklej swój adres publiczny, rozwiąż reCAPTCHTA i naciśnij 'Roll!'")
print("\tPewnie zobaczyłeś, że otrzymałeś testowe BSV. OK. Teraz to sprawdźmy tutaj.")
print("\tNaciśnij enter by sprawdzić saldo.")
while float(saldo) == 0.0:
print("\tSaldo twojego portfela wynosi", saldo, "BSV")
print("\tSprawdzam połączenie..")
saldo = new_key.get_balance('bsv')
input("\tNaciśnij enter by sprawdzić ponownie.")
if float(saldo) > 0.0:
cls()
logo()
print(colors.colored("\n\tDobra wiadomość!", "green"))
print("\tSaldo twojego portfela wynosi", saldo, "BSV")
input("\tTeraz wciśnij 'enter' by przejść do wysłania wiadomości.")
cls()
logo()
wysylka_wiadomosci(new_key)
def wysylka_wiadomosci(new_key):
""" Wysyła wiadomość do blockchain """
print(colors.colored("\n\t[KROK 5]", "cyan"))
print("\n\tNasze saldo testowe jest dodatnie. Teraz wyślemy naszą pierwszą wiadomość do blockchain.")
tekst = str(input("\tWpisz tutaj treść jaką chcesz wysłać i naciśnij 'enter': "))
print("\tTwoja wiadomość wygląda tak: [", tekst, "]")
input("\tTeraz naciśnij enter by ją wysłać.")
list_of_pushdata = [bytes.fromhex('6d01'), tekst.encode('utf-8')]
new_key.send_op_return(list_of_pushdata, fee=0)
print(colors.colored("\n\tWiadomość została wysłana!", "green"))
print("\tTeraz sprawdź swój adres publiczny [", new_key.address, "] w blockchain i zobacz co wysłałeś.")
odpowiedz = None
while odpowiedz != "tak":
odpowiedz = str(input("\tCzy wrócić do MENU? (tak) "))
cls()
info()
# start
info()
print("\n\tDo widzenia!")
input()