Fuente original: https://www.savjee.be/2018/10/Signing-transactions-blockchain-javascript/
Creando un generador de claves
Para resolver este problema tenemos que firmar transacciones. Lo hacemos con un par de llaves público y privado. La clave pública se usará como la dirección de nuestra billetera y se puede compartir libremente, mientras que la clave privada se utilizará para firmar transacciones. Esto significa que solo podemos gastar dinero en una billetera si tenemos la clave privada asociada.El mismo sistema se utiliza en Bitcoin, Euthereum y otras criptomonedas.
Así que vamos a empezar generándonos una clave pública y privada.
keygenerator.js
un archivo llamado keygenerator.js
para eso:
Usamos la biblioteca elíptica para generar un par de llaves. También tenemos que instalar el paquete:
npm install elliptic
Ahora vamos a ejecutarlo!
node keygenerator.js
El script devolverá una clave pública y privada. Anótelos, se usarán como la dirección de su billetera y como una forma de obtener fondos de su billetera.
Your public key: 0481758cb017885d884d1a8eb309c82e2644bc1776a0244b000adef2bb05755e8bbca68905b1387cf2e97b044a4287befa9400c1bd6c2ee6bf1241341ab4338f7a Your private key: 854de2a5ab09aa1ed51fd878a917c9778f606ca010effb7bc488c643744b9a38
Cambiar clase de transacción
Ahora tenemos que adaptar nuestra clase de
Transaction
. Agregaremos un método que nos permita firmar una transacción, verificar la firma y también vamos a calcular el hash de las transacciones.
Vamos a empezar con el hash:
¿Por qué necesitamos calcular un hash para cada transacción? Bueno, porque no queremos firmar todos los datos en el objeto Transacción. Solo vamos a firmar el hash de la transacción.
A continuación, vamos a crear un método
signTransaction
, que debe aceptar signingKey
como parámetro.
También agregamos un cheque para verificar que la clave dada coincida con el remitente de la transacción. Recuerde: solo puede firmar transacciones cuando salen de su propio bolsillo. No puedes gastar las monedas de otra persona.
Finalmente, podemos agregar un método
isValid
que verificará la firma en la transacción y devolverá true
si todo es correcto o false
si alguien ha intentado manipular una transacción y la firma no es válida:Clase de bloque
Para poner una transacción en una cadena de bloques, debe agregarla a un Bloque. Un bloque puede contener múltiples transacciones, por lo que para hacer nuestras vidas un poco más fáciles, haré un método simple que compruebe si todas las transacciones dentro de un bloque son válidas y están firmadas correctamente.
Simplemente
isValid
todas las transacciones y llamamos a su método isValid
:
Eso es todo para la clase Block. ¡Ahora pasemos a nuestra gran clase de Blockchain!
Clase blockchain
Finalmente tenemos que adaptar nuestra clase Blockchain.
Comenzaremos por cambiar el método
isChainValid
. En este momento, observa todos los bloques y verifica que todos apuntan hacia el bloque anterior correcto. Podemos mantener todos esos cheques, pero también tenemos que verificar si el bloque contiene transacciones válidas y firmadas.
¡Podemos usar el método
hasValidTransactions
que acabamos de agregar a nuestra clase Block! ¡Conveniente!
Entonces también tenemos que cambiar nuestro método
createTransaction
. Comenzaré por cambiarle el nombre a addTransaction
porque eso tiene más sentido. El método no crea una transacción, solo acepta un objeto de Transaction
que el usuario le da.
A continuación, debemos asegurarnos de que un usuario solo pueda agregar una transacción válida a nuestra cadena de bloques. Eso significa verificar si las direcciones
from
y to
se completan y que la transacción se ha firmado correctamente:
¡Y eso es todo lo que tenemos que hacer!
Probando todo!
Estamos listos para probar nuestra nueva implementación. Comencemos importando la clave privada que generamos al comienzo de esta publicación:
Una vez que tengamos nuestra clave, ¡podemos crear una nueva instancia de
Blockchain
y realizar una transacción! En este caso, soy el único en la red, así que solo enviaré mi dinero a una clave pública aleatoria. Sin embargo, tenga en cuenta que al hacer esto, sus monedas quedarán guardadas para siempre en esa dirección.
Después de que extrajimos un nuevo bloque, podemos verificar nuestro saldo al darle al método nuestra clave pública:
Esto informará que el saldo en mi billetera es de 90. Eso se debe a que recibo 100 monedas por extraer un nuevo bloque (recompensa de minería) y gasté 10 monedas al enviar una transacción.
A prueba de manipulaciones
Al igual que antes, nuestro Blockchain permanece a prueba de manipulaciones. De hecho, podría decir que es aún más resistente ahora porque requerimos que las transacciones se firmen con una clave privada.
Limitaciones y conclusión
Este blockchain tiene algunas limitaciones. Todavía te permite gastar más monedas que tienes en tu billetera y no tiene una red P2P. ¡Mas para seguir!
Descargo de responsabilidad y código fuente
Esto de ninguna manera es una implementación completa de blockchain! Solo tiene fines educativos, para comprender cómo funciona un blockchain a nivel técnico.
El código fuente de este proyecto está disponible en GitHub .