Python Blockchain - Transaktionsklasse

Lassen Sie uns in diesem Kapitel eine erstellen TransactionKlasse, damit ein Kunde Geld an jemanden senden kann. Beachten Sie, dass ein Kunde sowohl Absender als auch Empfänger des Geldes sein kann. Wenn Sie Geld erhalten möchten, erstellt ein anderer Absender eine Transaktion und gibt Ihre anpublicAdresse darin. Wir definieren die Initialisierung einer Transaktionsklasse wie folgt:

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

Das init Methode nimmt drei Parameter - die des Absenders public Schlüssel, der Empfänger publicSchlüssel und den zu sendenden Betrag. Diese werden in den Instanzvariablen zur Verwendung durch andere Methoden gespeichert. Zusätzlich erstellen wir eine weitere Variable zum Speichern des Transaktionszeitpunkts.

Als nächstes schreiben wir eine Dienstprogrammmethode namens to_dictDadurch werden alle vier oben genannten Instanzvariablen in einem Wörterbuchobjekt kombiniert. Dies dient nur dazu, die gesamten Transaktionsinformationen über eine einzige Variable zugänglich zu machen.

Wie Sie aus dem vorherigen Tutorial wissen, ist der erste Block in der Blockchain ein GenesisBlock. Der Genesis-Block enthält die erste Transaktion, die vom Ersteller der Blockchain initiiert wurde. Die Identität dieser Person kann wie bei Bitcoins geheim gehalten werden. Wenn diese erste Transaktion erstellt wird, kann der Ersteller einfach seine Identität als sendenGenesis. Daher prüfen wir beim Erstellen des Wörterbuchs, ob der Absender istGenesisund wenn ja, weisen wir der Identitätsvariablen einfach einen Zeichenfolgenwert zu; Andernfalls weisen wir dem Absender die Identität zuidentity Variable.

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

Wir erstellen das Wörterbuch mit der folgenden Codezeile

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

Der gesamte Code für die to_dict Methode ist unten gezeigt -

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})

Schließlich signieren wir dieses Wörterbuchobjekt mit dem privaten Schlüssel des Absenders. Nach wie vor verwenden wir die integrierte PKI mit SHA-Algorithmus. Die generierte Signatur wird dekodiert, um die ASCII-Darstellung zum Drucken und Speichern in unserer Blockchain zu erhalten. Dassign_transaction Methodencode wird hier angezeigt -

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')

Wir werden dies jetzt testen Transaction Klasse.

Testen der Transaktionsklasse

Zu diesem Zweck erstellen wir zwei Benutzer, genannt Dinesh und Ramesh. Dinesh sendet 5 TPCoins an Ramesh. Zu diesem Zweck erstellen wir zuerst die Clients Dinesh und Ramesh.

Dinesh = Client()
Ramesh = Client()

Denken Sie daran, wenn Sie a instanziieren Client Klasse, die public andFür den Client eindeutige private Schlüssel werden erstellt. Da Dinesh eine Zahlung an Ramesh sendet, benötigt er den öffentlichen Schlüssel von Ramesh, der unter Verwendung der Identitätseigenschaft des Kunden abgerufen wird.

Daher erstellen wir die Transaktionsinstanz mit folgendem Code:

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

Beachten Sie, dass der erste Parameter der Absender ist, der zweite Parameter der öffentliche Schlüssel des Empfängers und der dritte Parameter der zu übertragende Betrag. Dassign_transaction Die Methode ruft den privaten Schlüssel des Absenders aus dem ersten Parameter zum Singen der Transaktion ab.

Nachdem das Transaktionsobjekt erstellt wurde, signieren Sie es, indem Sie es aufrufen sign_transactionMethode. Diese Methode gibt die generierte Signatur im druckbaren Format zurück. Wir generieren und drucken die Signatur mit den folgenden zwei Codezeilen:

signature = t.sign_transaction()
print (signature)

Wenn Sie den obigen Code ausführen, wird eine ähnliche Ausgabe angezeigt:

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

Jetzt, da unsere grundlegende Infrastruktur zum Erstellen eines Kunden und einer Transaktion bereit ist, werden wir mehrere Kunden haben, die wie in einer realen Situation mehrere Transaktionen ausführen.