Créer plusieurs transactions
Les transactions effectuées par différents clients sont mises en file d'attente dans le système; les mineurs récupèrent les transactions de cette file d'attente et les ajoutent au bloc. Ils exploiteront ensuite le bloc et le mineur gagnant aurait le privilège d'ajouter le bloc à la blockchain et ainsi gagner de l'argent pour lui-même.
Nous décrirons ce processus de minage plus tard lorsque nous discuterons de la création de la blockchain. Avant d'écrire le code pour plusieurs transactions, ajoutons une petite fonction utilitaire pour imprimer le contenu d'une transaction donnée.
Affichage de la transaction
le display_transactionLa fonction accepte un seul paramètre de type transaction. L'objet dictionnaire dans la transaction reçue est copié dans une variable temporaire appeléedict et à l'aide des touches de dictionnaire, les différentes valeurs sont imprimées sur la 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 ('-----')
Ensuite, nous définissons une file d'attente de transactions pour stocker nos objets de transaction.
File d'attente de transaction
Pour créer une file d'attente, nous déclarons un global list variable appelée transactions comme suit -
transactions = []
Nous ajouterons simplement chaque transaction nouvellement créée à cette file d'attente. Veuillez noter que par souci de concision, nous n'implémenterons pas la logique de gestion des files d'attente dans ce didacticiel.
Création de plusieurs clients
Maintenant, nous allons commencer à créer des transactions. Premièrement, nous allons créer quatre clients qui s'enverront de l'argent pour obtenir divers services ou biens de tiers.
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
À ce stade, nous avons quatre clients appelés Dinesh, Ramesh, Seema et Vijay. Nous supposons actuellement que chacun de ces clients détient des TPCoins dans son portefeuille pour effectuer des transactions. L'identité de chacun de ces clients serait spécifiée à l'aide de la propriété d'identité de ces objets.
Création de la première transaction
Maintenant, nous lançons notre première transaction comme suit -
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
Dans cette transaction, Dinesh envoie 5 TPCoins à Ramesh. Pour que la transaction réussisse, nous devrons nous assurer que Dinesh a suffisamment d'argent dans son portefeuille pour ce paiement. Notez que nous aurons besoin d'une transaction genesis pour démarrer la circulation de TPCoin dans le système. Vous écrirez le code de transaction pour cette transaction de genèse très rapidement au fur et à mesure que vous lirez.
Nous signerons cette transaction en utilisant la clé privée de Dinesh et l'ajouterons à la file d'attente des transactions comme suit -
t1.sign_transaction()
transactions.append(t1)
Après la première transaction effectuée par Dinesh, nous créerons plusieurs autres transactions entre différents clients que nous avons créées ci-dessus.
Ajouter plus de transactions
Nous allons maintenant créer plusieurs autres transactions, chaque transaction donnant quelques TPCoins à une autre partie. Quand quelqu'un dépense de l'argent, il n'est pas nécessaire qu'il doive vérifier les soldes suffisants dans ce portefeuille. De toute façon, le mineur validerait chaque transaction pour le solde de l'expéditeur lors du lancement de la transaction.
En cas de solde insuffisant, le mineur marquera cette transaction comme invalide et ne l'ajoutera pas à ce bloc.
Le code suivant crée et ajoute neuf autres transactions à notre file d'attente.
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)
Lorsque vous exécutez le code ci-dessus, vous aurez dix transactions dans la file d'attente pour que les mineurs créent leurs blocs.
Opérations de dumping
En tant que gestionnaire de blockchain, vous pouvez périodiquement souhaiter revoir le contenu de la file d'attente de transactions. Pour cela, vous pouvez utiliser ledisplay_transactionfonction que nous avons développée plus tôt. Pour vider toutes les transactions de la file d'attente, il suffit d'itérer la liste des transactions et pour chaque transaction référencée, appelez ledisplay_transaction fonction comme indiqué ici -
for transaction in transactions:
display_transaction (transaction)
print ('--------------')
Les transactions sont séparées par une ligne pointillée pour les distinguer. Si vous exécutez le code ci-dessus, vous verrez la liste des transactions comme indiqué ci-dessous -
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
-----
--------------
Par souci de concision, je n'ai imprimé que les premières transactions de la liste. Dans le code ci-dessus, nous imprimons toutes les transactions commençant par la toute première transaction à l'exception de la transaction genesis qui n'a jamais été ajoutée à cette liste. Comme les transactions sont ajoutées périodiquement aux blocs, vous serez généralement intéressé à afficher uniquement la liste des transactions qui doivent encore être exploitées. Dans ce cas, vous devrez créer un fichier appropriéfor boucle pour parcourir les transactions qui ne sont pas encore minées.
Jusqu'à présent, vous avez appris à créer des clients, à les laisser entre eux et à maintenir une file d'attente des transactions en attente qui doivent être exploitées. Maintenant, vient la partie la plus importante de ce tutoriel et c'est la création d'une blockchain elle-même. Vous apprendrez cela dans la prochaine leçon.