Python Blockchain - Classe di transazione

In questo capitolo, creiamo un file Transactionclasse in modo che un cliente possa inviare denaro a qualcuno. Tieni presente che un cliente può essere sia un mittente che un destinatario del denaro. Quando desideri ricevere denaro, un altro mittente creerà una transazione e specificherà il tuopublicindirizzo in esso. Definiamo l'inizializzazione di una classe di transazione come segue:

def __init__(self, sender, recipient, value):
   self.sender = sender
   self.recipient = recipient
   self.value = value
   self.time = datetime.datetime.now()

Il init il metodo accetta tre parametri: quello del mittente public chiave, quella del destinatario publicchiave e l'importo da inviare. Questi vengono memorizzati nelle variabili di istanza per essere utilizzati da altri metodi. Inoltre, creiamo un'altra variabile per memorizzare l'ora della transazione.

Successivamente, scriviamo un metodo di utilità chiamato to_dictche combina tutte le quattro variabili di istanza sopra menzionate in un oggetto dizionario. Questo è solo per mettere l'intera informazione della transazione accessibile attraverso una singola variabile.

Come sai dal tutorial precedente che il primo blocco nella blockchain è un file Genesisbloccare. Il blocco Genesis contiene la prima transazione avviata dal creatore della blockchain. L'identità di questa persona può essere tenuta segreta come nel caso dei Bitcoin. Quindi, quando viene creata questa prima transazione, il creatore può semplicemente inviare la sua identità comeGenesis. Pertanto, durante la creazione del dizionario, controlliamo se il mittente èGenesise in tal caso assegniamo semplicemente un valore stringa alla variabile identità; altrimenti, assegniamo l'identità del mittente al fileidentity variabile.

if self.sender == "Genesis":
   identity = "Genesis"
else:
   identity = self.sender.identity

Costruiamo il dizionario usando la seguente riga di codice

return collections.OrderedDict({
   'sender': identity,
   'recipient': self.recipient,
   'value': self.value,
   'time' : self.time})

L'intero codice per to_dict metodo è mostrato di seguito -

def to_dict(self):
   if self.sender == "Genesis":
      identity = "Genesis"
   else:
      identity = self.sender.identity

   return collections.OrderedDict({
      'sender': identity,
      'recipient': self.recipient,
      'value': self.value,
      'time' : self.time})

Infine, firmeremo questo oggetto dizionario utilizzando la chiave privata del mittente. Come prima, usiamo l'infrastruttura PKI con l'algoritmo SHA. La firma generata viene decodificata per ottenere la rappresentazione ASCII per la stampa e la memorizzazione nella nostra blockchain. Ilsign_transaction il codice del metodo è mostrato qui -

def sign_transaction(self):
   private_key = self.sender._private_key
   signer = PKCS1_v1_5.new(private_key)
   h = SHA.new(str(self.to_dict()).encode('utf8'))
   return binascii.hexlify(signer.sign(h)).decode('ascii')

Ora lo testeremo Transaction classe.

Classe di transazione di prova

A tale scopo, creeremo due utenti, chiamati Dinesh e Ramesh. Dinesh invierà 5 TPCoin a Ramesh. Per questo prima creiamo i client chiamati Dinesh e Ramesh.

Dinesh = Client()
Ramesh = Client()

Ricorda che quando installi un file Client classe, il public andVerrebbero create chiavi private univoche per il client. Poiché Dinesh sta inviando il pagamento a Ramesh, avrà bisogno della chiave pubblica di Ramesh che si ottiene utilizzando la proprietà di identità del cliente.

Pertanto, creeremo l'istanza della transazione utilizzando il seguente codice:

t = Transaction(
   Dinesh,
   Ramesh.identity,
   5.0
)

Si noti che il primo parametro è il mittente, il secondo parametro è la chiave pubblica del destinatario e il terzo parametro è l'importo da trasferire. Ilsign_transaction recupera la chiave privata del mittente dal primo parametro per cantare la transazione.

Dopo aver creato l'oggetto transazione, lo firmerai chiamando il suo sign_transactionmetodo. Questo metodo restituisce la firma generata nel formato stampabile. Generiamo e stampiamo la firma utilizzando le seguenti due righe di codice:

signature = t.sign_transaction()
print (signature)

Quando esegui il codice sopra, vedrai l'output simile a questo -

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

Ora che la nostra infrastruttura di base per creare un cliente e una transazione è pronta, ora avremo più clienti che eseguono più transazioni come in una situazione di vita reale.