Creazione di più transazioni
Le transazioni effettuate dai vari client vengono messe in coda nel sistema; i minatori raccolgono le transazioni da questa coda e le aggiungono al blocco. Quindi estrarranno il blocco e il minatore vincente avrà il privilegio di aggiungere il blocco alla blockchain e quindi guadagnare dei soldi per se stesso.
Descriveremo questo processo di mining più avanti quando discuteremo della creazione della blockchain. Prima di scrivere il codice per più transazioni, aggiungiamo una piccola funzione di utilità per stampare il contenuto di una data transazione.
Visualizzazione della transazione
Il display_transactionfunzione accetta un singolo parametro di tipo di transazione. L'oggetto dizionario all'interno della transazione ricevuta viene copiato in una variabile temporanea chiamatadict e utilizzando le chiavi del dizionario, i vari valori vengono stampati sulla console.
def display_transaction(transaction):
#for transaction in transactions:
dict = transaction.to_dict()
print ("sender: " + dict['sender'])
print ('-----')
print ("recipient: " + dict['recipient'])
print ('-----')
print ("value: " + str(dict['value']))
print ('-----')
print ("time: " + str(dict['time']))
print ('-----')
Successivamente, definiamo una coda di transazione per memorizzare i nostri oggetti di transazione.
Coda di transazione
Per creare una coda, dichiariamo un global list variabile chiamata transactions come segue -
transactions = []
Aggiungeremo semplicemente ogni transazione appena creata a questa coda. Si noti che per brevità, non implementeremo la logica di gestione delle code in questo tutorial.
Creazione di più client
Ora inizieremo a creare transazioni. In primo luogo, creeremo quattro clienti che si invieranno denaro l'un l'altro per ottenere vari servizi o beni da altri.
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
A questo punto, abbiamo quattro clienti chiamati Dinesh, Ramesh, Seema e Vijay. Al momento supponiamo che ciascuno di questi clienti detenga alcuni TPCoin nei propri portafogli per le transazioni. L'identità di ciascuno di questi client verrebbe specificata utilizzando la proprietà Identity di questi oggetti.
Creazione della prima transazione
Ora, iniziamo la nostra prima transazione come segue:
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
In questa transazione Dinesh invia 5 TPCoin a Ramesh. Affinché la transazione abbia successo, dovremo assicurarci che Dinesh abbia abbastanza soldi nel suo portafoglio per questo pagamento. Nota che avremo bisogno di una transazione genesis per avviare la circolazione di TPCoin nel sistema. Scriverai il codice di transazione per questa transazione genesis molto brevemente mentre leggi.
Firmeremo questa transazione utilizzando la chiave privata di Dinesh e la aggiungeremo alla coda delle transazioni come segue:
t1.sign_transaction()
transactions.append(t1)
Dopo la prima transazione effettuata da Dinesh, creeremo molte altre transazioni tra diversi clienti che abbiamo creato sopra.
Aggiunta di altre transazioni
Ora creeremo molte altre transazioni, ogni transazione assegnerà alcuni TPCoin a un'altra parte. Quando qualcuno spende soldi, non è necessario che controlli per avere saldi sufficienti in questo portafoglio. Il minatore in ogni caso convaliderebbe ogni transazione per il saldo che il mittente ha durante l'avvio della transazione.
In caso di saldo insufficiente, il miner contrassegnerà questa transazione come non valida e non la aggiungerà a questo blocco.
Il codice seguente crea e aggiunge altre nove transazioni alla nostra coda.
t2 = Transaction(
Dinesh,
Seema.identity,
6.0
)
t2.sign_transaction()
transactions.append(t2)
t3 = Transaction(
Ramesh,
Vijay.identity,
2.0
)
t3.sign_transaction()
transactions.append(t3)
t4 = Transaction(
Seema,
Ramesh.identity,
4.0
)
t4.sign_transaction()
transactions.append(t4)
t5 = Transaction(
Vijay,
Seema.identity,
7.0
)
t5.sign_transaction()
transactions.append(t5)
t6 = Transaction(
Ramesh,
Seema.identity,
3.0
)
t6.sign_transaction()
transactions.append(t6)
t7 = Transaction(
Seema,
Dinesh.identity,
8.0
)
t7.sign_transaction()
transactions.append(t7)
t8 = Transaction(
Seema,
Ramesh.identity,
1.0
)
t8.sign_transaction()
transactions.append(t8)
t9 = Transaction(
Vijay,
Dinesh.identity,
5.0
)
t9.sign_transaction()
transactions.append(t9)
t10 = Transaction(
Vijay,
Ramesh.identity,
3.0
)
t10.sign_transaction()
transactions.append(t10)
Quando esegui il codice sopra, avrai dieci transazioni in coda per i minatori per creare i loro blocchi.
Transazioni di dumping
In qualità di gestore blockchain, potresti periodicamente rivedere i contenuti della coda delle transazioni. A tale scopo, puoi utilizzare il filedisplay_transactionfunzione che abbiamo sviluppato in precedenza. Per eseguire il dump di tutte le transazioni nella coda, è sufficiente iterare l'elenco delle transazioni e per ogni transazione a cui si fa riferimento, chiamare il filedisplay_transaction funzione come mostrato qui -
for transaction in transactions:
display_transaction (transaction)
print ('--------------')
Le transazioni sono separate da una linea tratteggiata per distinguerle. Se esegui il codice sopra, vedrai l'elenco delle transazioni come mostrato di seguito -
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
value: 15.0
-----
time: 2019-01-14 16:18:01.859915
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae14
3cbe59b3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fb
d9ee74b9e7ea12334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0
961b4f212d1fd5b5e49ae09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d0623
75799742a359b8f22c5362e5650203010001
-----
value: 6.0
-----
time: 2019-01-14 16:18:01.860966
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876
f41338c62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cc
e25be99452a81df4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47
452590137869c25d9ff83d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f0
0e321b65e4c33acaf6469e18e30203010001
-----
value: 2.0
-----
time: 2019-01-14 16:18:01.861958
-----
--------------
Per brevità, ho stampato solo le prime poche transazioni nell'elenco. Nel codice sopra, stampiamo tutte le transazioni che iniziano con la prima transazione eccetto la transazione genesis che non è mai stata aggiunta a questo elenco. Poiché le transazioni vengono aggiunte periodicamente ai blocchi, in genere sarai interessato a visualizzare solo l'elenco delle transazioni che devono ancora essere estratte. In tal caso, dovrai creare un filefor loop per iterare attraverso le transazioni che non sono ancora state minate.
Finora, hai imparato come creare client, consentire loro di tra di loro e mantenere una coda delle transazioni in sospeso che devono essere minate. Ora, arriva la parte più importante di questo tutorial e questa è la creazione di una blockchain stessa. Lo imparerai nella prossima lezione.