Como firmar una transacción con web3 en Ropsten con Node.js
Tags: web3, transaction, node, javascript
Published: 2020-10-23 06:47:27

Hola amigos!!, como ya vieron el título de esta publicación, hoy les voy a enseñar a hacer una transacción entre cuentas de ROPSTEN 
 utilizando Node, Infura, WEB3 y Metamask.

Comenzare por explicar brevemente que son cada una de estas cosas.

# ¿Qué es web3?
Son una combinación de librerías que permiten interactuar entre un nodo local o remoto de Ethereum usando HTTP, IPC o Web Socket.

Básicamente web3 nos va a dar el poder de hacer transacciones de criptomonedas a través de una red de prueba como por ejemplo: Kovan o Ropsten.


![aa](https://dev-to-uploads.s3.amazonaws.com/i/439t1o1j9m9xdar1h2s0.png)

# ¿Qué es Metamask?

Metamask es un complemento de Google Chrome y Firefox y edge al parecer, que sirve de puente entre tu ordenador y la blockchain de Ethereum. En pocas palabras algo que te ayuda a transferir y revisar tus criptomonedas (Ether) que tienes disponible, eso y otras cosas mas que hablaremos algun dia.

 
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/yhiujoz75t08f3658vrw.png)

# ¿Qué es infura?

Infura es una plataforma que proporciona un conjunto de herramientas e infraestructuras que permiten a los desarrolladores llevar fácilmente su aplicación blockchain de la prueba, a la implementación a escala, con acceso simple y confiable a Ethereum

&nbsp;

# ¿Y que necesito para realizar una transferencia de ether?

Bueno, lo mas importante es crear 2 cuentas de Ropsten en Metamask, las cuales les puedes asignar el nombre que quieras y para ello necesitaremos su clave publica que se encuentra mas o menos ahí. 
&nbsp;

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ks0vyyj4001n57ws3i1a.png)
&nbsp;
&nbsp;
 

y necesitaremos una clave privada de una de las cuentas, esa la obtienes dando clic en los ***3 puntitos*** y en ***detalles de la cuenta*** y en exportar clave privada, le asignan una contraseña y listooo!! ya tienes la clave, (NO LA COMPARTAS MI QUERIDO AMIG@)
&nbsp;

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bxuj7jc83tc4l74dryh1.png)

&nbsp;
&nbsp;

Lo mas importante para hacer transferencia de Ether, es tener Ether y para ello necesitamos que nos donen y para ello existen las fuentes como [https://faucet.metamask.io/](https://faucet.metamask.io/) a las cuales les solicitamos que nos envien ether, solo puedes utilizarlos una vez por dia.

# Cuenta en INFURA

También necesitaremos tener una cuenta en INFURA la cual nos permitirá acceder al nodo de Ropsten, para ello tenemos que ir a la página [infura](https://infura.io/)  y crear una cuenta, es muy facil!!, cuando ya tengas una cuenta necesitaremos tener un endpoint de ropsten eso lo encuentras en la sección de settings y en ENDPOINTS seleccionas ROPSTEN 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/g2pt145bgl7pp0qlpk40.png)

y guardas esa dirección por que lo necesitaremos mas adelante.


&nbsp;
Una vez que tengas lo siguiente podremos continuar.
1.- 2 Claves publicas y 1 privada
2.- Obtener ether y asignárselo a una cuenta.
3.- 1 cuenta en Infura con el Endpoint de Ropsten

&nbsp;

Primero crearemos una carpeta en el escritorio (o donde quieras) y mediante el ***cmd** nos dirigimos a esa carpeta y ejecutamos el comando 

```javascript
npm init -y
```
e instalamos las siguientes dependencias

```javascript
npm install web3,  ethereumjs-tx
```

Después creamos una carpeta llamada src y dentro crean un archivo llamado index.js

de manera que quede de la siguiente manera.

.node_modules
.src
..index.js
.package.json

Codigo del ***index.js***

```javascript

// REQUERIMOS WEB3
const Web3 = require("web3");

// REQUERIMOS ETHEREUMTXJS-TX (ESTA LIBRERIA NOS PERMITE FIRMAR LA TRANSACCIÓN)

const EthereumTx = require("ethereumjs-tx").Transaction;

// NOS CONECTAMOS A LA RED DE ROPSTEN, AQUÍ COLOCAMOS NUESTRO ENDPOINT DE INFURA

const web3 = new Web3(
  "https://ropsten.infura.io/v3/ammmkmmj2kj3hh1ggff0ee864f8145ed"
);

// cuenta publica 1
const address1 = "AQUÍ PONEN SU CUENTA PUBLICA";

// cuenta publica 2
const address2 = "AQUÍ PONEN SU CUENTA PUBLICA NUMERO DOS";

// ESTA ES LA CLAVE PRIVADA 
const address1Key = new Buffer.from(
  "AQUI PONEN SU CLAVE PRIVADA",
  "hex"
);

web3.eth.getTransactionCount(address1, function (error, txCount) {
  
  // EN CASO DE QUE EXITA UN ERROR, LO MUESTRA EN CONSOLA
  if (error != null) {
    console.log("El error es : ", error);
  }

// RAWTX ES LA ESTRUCTURA QUE NECESITMOS PARA SABER A DONDE LO ENVIAMOS EN ESTE CASO ENVIAMOS A addres2 Y EN value ENVIAMOS 1 ETHER EN HEXADECIMAL
  let rawTx = {
    nonce: web3.utils.toHex(txCount),
    gasPrice: web3.utils.toHex(web3.utils.toWei("2", "gwei")),
    gasLimit: web3.utils.toHex(21000),
    to: address2,
    value: web3.utils.toHex("1000000000000000000"),
  };

// ASIGNAMOS A QUE NODO NOS ESTAMOS CONECTANDO EN ESTA CASO ES ROPSTEN

  const tx = new EthereumTx(rawTx, { chain: "ropsten" });

// FIRMAMOS LA TRANSFERENCIAS 
  tx.sign(address1Key);

  let serializedTx = tx.serialize();

  web3.eth
    .sendSignedTransaction("0x" + serializedTx.toString("hex"))
    .on("receipt", console.log);
});

```

Solo resta ejecutar el comando node src/index.js y debe de realizarse la transferencia de Ether entre las cuentas, si todo se ejecuta correctamente, habremos realizado una transferencia de ether entre nuestras cuentas, podremos corroborar visitando METAMASK y consultar nuestro saldo.

Bueno, hasta aquí dejo esta publicación y espero seguir subiendo publicaciones de BLOCKCHAIN, saludos!!!.