Crear transacciones múltiples
Las transacciones realizadas por varios clientes se ponen en cola en el sistema; los mineros toman las transacciones de esta cola y las agregan al bloque. Luego extraerán el bloque y el minero ganador tendría el privilegio de agregar el bloque a la cadena de bloques y, por lo tanto, ganar algo de dinero para sí mismo.
Describiremos este proceso de minería más adelante cuando analicemos la creación de la cadena de bloques. Antes de escribir el código para múltiples transacciones, agreguemos una pequeña función de utilidad para imprimir el contenido de una transacción determinada.
Visualización de la transacción
los display_transactionLa función acepta un solo parámetro de tipo de transacción. El objeto de diccionario dentro de la transacción recibida se copia a una variable temporal llamadadict y utilizando las teclas del diccionario, los distintos valores se imprimen en la consola.
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 ('-----')
A continuación, definimos una cola de transacciones para almacenar nuestros objetos de transacción.
Cola de transacciones
Para crear una cola, declaramos un global list variable llamada transactions como sigue -
transactions = []
Simplemente agregaremos cada transacción recién creada a esta cola. Tenga en cuenta que, por brevedad, no implementaremos la lógica de gestión de colas en este tutorial.
Crear varios clientes
Ahora, comenzaremos a crear transacciones. Primero, crearemos cuatro clientes que se enviarán dinero entre ellos para obtener diversos servicios o bienes de otros.
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
En este punto, tenemos cuatro clientes llamados Dinesh, Ramesh, Seema y Vijay. Actualmente asumimos que cada uno de estos clientes tiene algunos TPCoins en sus billeteras para realizar transacciones. La identidad de cada uno de estos clientes se especificaría utilizando la propiedad de identidad de estos objetos.
Creación de la primera transacción
Ahora, iniciamos nuestra primera transacción de la siguiente manera:
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
En esta transacción, Dinesh envía 5 TPCoins a Ramesh. Para que la transacción sea exitosa, tendremos que asegurarnos de que Dinesh tenga suficiente dinero en su billetera para este pago. Tenga en cuenta que necesitaremos una transacción de génesis para iniciar la circulación de TPCoin en el sistema. Escribirás el código de transacción para esta transacción génesis muy pronto a medida que sigas leyendo.
Firmaremos esta transacción con la clave privada de Dinesh y la agregaremos a la cola de transacciones de la siguiente manera:
t1.sign_transaction()
transactions.append(t1)
Después de la primera transacción realizada por Dinesh, crearemos varias transacciones más entre diferentes clientes que creamos anteriormente.
Agregar más transacciones
Ahora crearemos varias transacciones más, y cada transacción entregará algunos TPCoins a otra parte. Cuando alguien gasta dinero, no es necesario que verifique si hay suficientes saldos en esta billetera. De todos modos, el minero validaría cada transacción por el saldo que tiene el remitente al iniciar la transacción.
En caso de saldo insuficiente, el minero marcará esta transacción como inválida y no la agregará a este bloque.
El siguiente código crea y agrega nueve transacciones más a nuestra cola.
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)
Cuando ejecute el código anterior, tendrá diez transacciones en la cola para que los mineros creen sus bloques.
Transacciones de dumping
Como administrador de blockchain, es posible que desee revisar periódicamente el contenido de la cola de transacciones. Para ello, puede utilizar eldisplay_transactionfunción que desarrollamos anteriormente. Para volcar todas las transacciones en la cola, simplemente itere la lista de transacciones y para cada transacción referenciada, llame aldisplay_transaction funciona como se muestra aquí -
for transaction in transactions:
display_transaction (transaction)
print ('--------------')
Las transacciones están separadas por una línea discontinua para distinguirlas. Si ejecuta el código anterior, verá la lista de transacciones como se muestra a continuación:
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
-----
--------------
Por brevedad, he impreso solo las primeras transacciones de la lista. En el código anterior, imprimimos todas las transacciones que comienzan con la primera transacción, excepto la transacción de génesis, que nunca se agregó a esta lista. Como las transacciones se agregan a los bloques periódicamente, generalmente le interesará ver solo la lista de transacciones que aún no se han extraído. En ese caso, deberá crear unfor bucle para iterar a través de las transacciones que aún no se extraen.
Hasta ahora, ha aprendido cómo crear clientes, permitirles entre ellos y mantener una cola de las transacciones pendientes que se van a extraer. Ahora, viene la parte más importante de este tutorial y es crear una cadena de bloques en sí. Aprenderá esto en la próxima lección.