Python Blockchain - Clase de transacción

En este capítulo, creemos un Transactionclase para que un cliente pueda enviar dinero a alguien. Tenga en cuenta que un cliente puede ser tanto un remitente como un destinatario del dinero. Cuando desee recibir dinero, otro remitente creará una transacción y especificará supublicdirección en él. Definimos la inicialización de una clase de transacción de la siguiente manera:

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

los init El método toma tres parámetros: el del remitente public clave, el destinatario publicclave, y la cantidad a enviar. Estos se almacenan en las variables de instancia para su uso por otros métodos. Además, creamos una variable más para almacenar la hora de la transacción.

A continuación, escribimos un método de utilidad llamado to_dictque combina las cuatro variables de instancia mencionadas anteriormente en un objeto de diccionario. Esto es solo para poner toda la información de la transacción accesible a través de una sola variable.

Como sabe por el tutorial anterior, el primer bloque de la cadena de bloques es un Genesisbloquear. El bloque Génesis contiene la primera transacción iniciada por el creador de la cadena de bloques. La identidad de esta persona puede mantenerse en secreto como en el caso de Bitcoins. Entonces, cuando se crea esta primera transacción, el creador puede enviar su identidad comoGenesis. Así, al crear el diccionario, comprobamos si el remitente esGenesisy si es así, simplemente asignamos algún valor de cadena a la variable de identidad; de lo contrario, asignamos la identidad del remitente alidentity variable.

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

Construimos el diccionario usando la siguiente línea de código

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

El código completo para el to_dict El método se muestra a continuación:

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

Finalmente, firmaremos este objeto de diccionario usando la clave privada del remitente. Como antes, usamos la PKI incorporada con el algoritmo SHA. La firma generada se decodifica para obtener la representación ASCII para imprimirla y almacenarla en nuestra blockchain. lossign_transaction el código del método se muestra aquí -

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

Ahora probaremos esto Transaction clase.

Prueba de clase de transacción

Para ello crearemos dos usuarios, denominados Dinesh y Ramesh. Dinesh enviará 5 TPCoins a Ramesh. Para esto primero creamos los clientes llamados Dinesh y Ramesh.

Dinesh = Client()
Ramesh = Client()

Recuerde que cuando crea una instancia Client clase, la public andSe crearían claves privadas únicas para el cliente. Como Dinesh está enviando el pago a Ramesh, necesitará la clave pública de Ramesh que se obtiene utilizando la propiedad de identidad del cliente.

Por lo tanto, crearemos la instancia de transacción usando el siguiente código:

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

Tenga en cuenta que el primer parámetro es el remitente, el segundo parámetro es la clave pública del destinatario y el tercer parámetro es la cantidad a transferir. lossign_transaction El método recupera la clave privada del remitente del primer parámetro para cantar la transacción.

Una vez creado el objeto de transacción, lo firmará llamando a su sign_transactionmétodo. Este método devuelve la firma generada en formato imprimible. Generamos e imprimimos la firma usando las siguientes dos líneas de código:

signature = t.sign_transaction()
print (signature)

Cuando ejecute el código anterior, verá un resultado similar a este:

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

Ahora que nuestra infraestructura básica para crear un cliente y una transacción está lista, ahora tendremos múltiples clientes realizando múltiples transacciones como en una situación de la vida real.