Python Blockchain - Classe de transaction

Dans ce chapitre, créons un Transactionclasse afin qu'un client puisse envoyer de l'argent à quelqu'un. Notez qu'un client peut être à la fois un expéditeur ou un destinataire de l'argent. Lorsque vous souhaitez recevoir de l'argent, un autre expéditeur crée une transaction et spécifie votrepublicadresse dedans. Nous définissons l'initialisation d'une classe de transaction comme suit -

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

le init La méthode prend trois paramètres - l'expéditeur public clé, le destinataire publicet le montant à envoyer. Ceux-ci sont stockés dans les variables d'instance pour être utilisés par d'autres méthodes. De plus, nous créons une autre variable pour stocker l'heure de la transaction.

Ensuite, nous écrivons une méthode utilitaire appelée to_dictqui combine les quatre variables d'instance mentionnées ci-dessus dans un objet dictionnaire. Il s'agit simplement de mettre toutes les informations de transaction accessibles via une seule variable.

Comme vous le savez dans le tutoriel précédent, le premier bloc de la blockchain est un Genesisbloquer. Le bloc Genesis contient la première transaction initiée par le créateur de la blockchain. L'identité de cette personne peut être gardée secrète comme dans le cas des Bitcoins. Ainsi, lorsque cette première transaction est créée, le créateur peut simplement envoyer son identité en tant queGenesis. Ainsi, lors de la création du dictionnaire, nous vérifions si l'expéditeur estGenesiset si c'est le cas, nous attribuons simplement une valeur de chaîne à la variable d'identité; sinon, nous attribuons l'identité de l'expéditeur auidentity variable.

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

Nous construisons le dictionnaire en utilisant la ligne de code suivante

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

L'ensemble du code pour le to_dict méthode est montrée ci-dessous -

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

Enfin, nous signerons cet objet dictionnaire en utilisant la clé privée de l'expéditeur. Comme précédemment, nous utilisons la PKI intégrée avec l'algorithme SHA. La signature générée est décodée pour obtenir la représentation ASCII pour l'impression et la stocker dans notre blockchain. lesign_transaction le code de la méthode est affiché ici -

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

Nous allons maintenant tester ceci Transaction classe.

Test de la classe de transaction

Pour cela, nous allons créer deux utilisateurs, appelés Dinesh et Ramesh. Dinesh enverra 5 TPCoins à Ramesh. Pour cela, nous créons les clients appelés Dinesh et Ramesh.

Dinesh = Client()
Ramesh = Client()

N'oubliez pas que lorsque vous instanciez un Client classe, le public anddes clés privées uniques au client seraient créées. Comme Dinesh envoie le paiement à Ramesh, il aura besoin de la clé publique de Ramesh qui est obtenue en utilisant la propriété d'identité du client.

Ainsi, nous allons créer l'instance de transaction en utilisant le code suivant -

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

Notez que le premier paramètre est l'expéditeur, le deuxième paramètre est la clé publique du destinataire et le troisième paramètre est le montant à transférer. lesign_transaction La méthode récupère la clé privée de l'expéditeur à partir du premier paramètre pour chanter la transaction.

Une fois l'objet de transaction créé, vous le signerez en appelant son sign_transactionméthode. Cette méthode renvoie la signature générée au format imprimable. Nous générons et imprimons la signature en utilisant les deux lignes de code suivantes -

signature = t.sign_transaction()
print (signature)

Lorsque vous exécutez le code ci-dessus, vous verrez la sortie similaire à celle-ci -

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

Maintenant que notre infrastructure de base de création d'un client et d'une transaction est prête, nous aurons maintenant plusieurs clients effectuant plusieurs transactions comme dans une situation réelle.