Construye con Javascript una blockchain basica. Parte 5

creando una wallet

En criptomonedas, una wallet es necesaria para recompensar a los mineros por generar bloques, así como para poder crear transacciones y enviar transacciones. En este post, crearemos una wallet. Necesitas crear un par de claves asimétricas no solo para autenticar a un usuario sino para que pueda almacenar y recuperar los datos que posee el usuario. Crearás una wallet con claves públicas y privadas. En bitcoin, el software original de la wallet es el protocolo central de bitcoin pero para no tener que almacenar la blockchain entera existen los nodos llamados SPV. La mayoría de las wallets en uso son carteras “ligeras” o lo que se llaman SPV que se sincronizan con el bitcoin-core. En blockchain, hay muchas carteras diferentes disponibles, desde las wallets online hasta las
wallets de papel donde escribes tu clave privada en una hoja de papel.

Para empezar vamos a crear un directorio llamado wallet:

> mkdir wallet

Utilizaremos la implementación de la libreria elliptic para generar combinaciones de claves públicas y privadas. Tenga en cuenta que elliptic usa SECP256k1 como implementación del algoritmo ECDSA.

La criptografía de curva elíptica (ECC) es la tecnica de encriptacion de clave pública utilizada por bitcoin. Se basa en la curva elíptica Secp256k1 para generar las claves criptográficas. Secp256k1 es la curva del algoritmo ECDSA.

Para instalar la libreria, ejecute el siguiente comando:

> npm install elliptic --save

Ahora agrega un archivo y asígnele el nombre wallet.js. Eche un vistazo al código completo abajo:

let EC = require('elliptic').ec,
 fs = require('fs');
const ec = new EC('secp256k1'),
 privateKeyLocation = __dirname + '/wallet/private_key';
exports.initWallet = () => {
 let privateKey;
 if (fs.existsSync(privateKeyLocation)) {
 const buffer = fs.readFileSync(privateKeyLocation, 'utf8');
 privateKey = buffer.toString();
 } else {
 privateKey = generatePrivateKey();
 fs.writeFileSync(privateKeyLocation, privateKey);
 }
 const key = ec.keyFromPrivate(privateKey, 'hex');
 const publicKey = key.getPublic().encode('hex');
 return({'privateKeyLocation': privateKeyLocation,
'publicKey': publicKey});
};
const generatePrivateKey = () => {
 const keyPair = ec.genKeyPair();
 const privateKey = keyPair.getPrivate();
 return privateKey.toString(16);
};

En el archivo de wallet.js, crea e inicializa el contexto EC.

const ec = new EC('secp256k1'),

Luego almacena la ubicación de la clave privada en una variable:

privateKeyLocation
privateKeyLocation = __dirname + '/wallet/private_key';

A continuación, puedes crear un método export.initWallet para generar el
clave pública-privada real, generatePrivateKey.

const keyPair = ec.genKeyPair();
const privateKey = keyPair.getPrivate();

Tenga en cuenta que generará una nueva wallet solo si no existe una.

if (fs.existsSync(privateKeyLocation))

En este post, crearemos tambien un archivo wallet.js utilizando la libreria elliptic para generar su combinación de clave pública y privada.

Para ver el código funcionando, agregue el siguiente código temporalmente al final del
archivo wallet.js. El script creará las claves pública y privada.

let wallet = this;
let retVal = wallet.initWallet();
console.log(JSON.stringify(retVal));

A continuación, cree un directorio llamado wallet para almacenar la clave privada y ejecute el script. El código inicializará el script y creará su clave pública.

> mkdir wallet
> node wallet.js
> cat wallet/private_key

Cuando ejecuta el comando node wallet.js, puede ver la clave pública. Aquí vemos el resultado:

Recuerde comentar estas líneas porque en el próximo post, crearemos una API para poder crear tus claves a través del navegador.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s