Python Blockchain - Creazione di minatori
Per abilitare il mining, dobbiamo sviluppare una funzione di mining. La funzionalità di mining deve generare un digest su una determinata stringa di messaggio e fornire una prova di lavoro. Discutiamolo in questo capitolo.
Funzione Message Digest
Scriveremo una funzione di utilità chiamata sha256 per creare un digest su un dato messaggio -
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
Il sha256 funzione richiede un file message come parametro, lo codifica in ASCII, genera un digest esadecimale e restituisce il valore al chiamante.
Funzione mineraria
Ora sviluppiamo il file minefunzione che implementa la nostra strategia di mining. La nostra strategia in questo caso sarebbe quella di generare un hash sul messaggio dato che è preceduto da un dato numero di 1. Il numero di 1 specificato è specificato come parametro permine funzione specificata come livello di difficoltà.
Ad esempio, se specifichi un livello di difficoltà 2, l'hash generato su un dato messaggio dovrebbe iniziare con due 1, come 11xxxxxxxx. Se il livello di difficoltà è 3, l'hash generato dovrebbe iniziare con tre 1, come 111xxxxxxxx. Dati questi requisiti, svilupperemo ora la funzione di mining come mostrato nei passaggi indicati di seguito.
Passo 1
La funzione di mining accetta due parametri: il messaggio e il livello di difficoltà.
def mine(message, difficulty=1):
Passo 2
Il livello di difficoltà deve essere maggiore o uguale a 1, lo assicuriamo con la seguente dichiarazione di asserzione:
assert difficulty >= 1
Passaggio 3
Creiamo un file prefix variabile utilizzando il livello di difficoltà impostato.
prefix = '1' * difficulty
Nota se il livello di difficoltà è 2 il prefisso sarebbe "11" e se il livello di difficoltà è 3, il prefisso sarebbe "111" e così via. Verificheremo se questo prefisso esiste nel digest generato del messaggio. Per digerire il messaggio stesso, utilizziamo le seguenti due righe di codice:
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
Continuiamo ad aggiungere un nuovo numero iall'hash del messaggio in ogni iterazione e genera un nuovo digest sul messaggio combinato. Come input per ilsha256 la funzione cambia in ogni iterazione, il digestanche il valore cambierebbe. Controlliamo se questodigest il valore è superiore al set prefix.
if digest.startswith(prefix):
Se la condizione è soddisfatta, interromperemo il file for loop e restituisci il file digest valore per il chiamante.
L'intero mine il codice è mostrato qui -
def mine(message, difficulty=1):
assert difficulty >= 1
prefix = '1' * difficulty
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
if digest.startswith(prefix):
print ("after " + str(i) + " iterations found nonce: "+ digest)
return digest
Per tua comprensione, abbiamo aggiunto il file print istruzione che stampa il valore digest e il numero di iterazioni necessarie per soddisfare la condizione prima di tornare dalla funzione.
Test della funzione di mining
Per testare la nostra funzione di mining, esegui semplicemente la seguente istruzione:
mine ("test message", 2)
Quando esegui il codice sopra, vedrai l'output simile a quello qui sotto -
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
Notare che il digest generato inizia con "11". Se modifichi il livello di difficoltà a 3, il digest generato inizierà con "111" e, naturalmente, richiederà probabilmente un numero maggiore di iterazioni. Come puoi vedere, un minatore con più potenza di elaborazione sarà in grado di estrarre un dato messaggio prima. È così che i minatori competono tra loro per guadagnare i loro ricavi.
Ora siamo pronti per aggiungere altri blocchi alla nostra blockchain. Impariamo questo nel nostro prossimo capitolo.