Ir al contenido principal
Change page

Bibliotecas de API de JavaScript

Última edición: @FreddyAndresParra(opens in a new tab), 28 de junio de 2024

Para que una aplicación web interactúe con el blockchain de Ethereum (es decir, para que lea datos de blockchain y/o envíe transacciones a la red), este debe conectarse a un nodo de Ethereum.

Para este proposito, cada cliente de Ethereum implementa una especificacion JSON-RPC para que haya un grupo uniforme de métodos en que las aplicaciones pueden confiar.

Si quiere usar JavaScript para conectar con un nodo de Ethereum, puede usar VanillaJS (Vanilla JavaScript). Sin embargo, hay varias bibliotecas de conveniencia que existen dentro del ecosistema que simplifican esto mucho más. Mediante estas bibliotecas, los desarrolladores pueden escribir métodos intuitivos de una línea para iniciar solicitudes JSON RPC (de manera invisible), que interactúan con Ethereum.

Tenga en cuenta que desde La Fusión, dos piezas conectadas de software de Ethereum― un cliente de ejecucion y un cliente de consenso― son necesarias para ejecutar un nodo. Asegúrese de que su nodo incluya tanto un cliente de ejecución como un cliente de consenso. Si su nodo no se encuentra en su computadora local (por ejemplo, se ejecuta en una instancia de AWS), actualice las direcciones IP en el tutorial según corresponda. Para obtener más información, vea nuestra página sobre ejecutar un nodo.

Requisitos previos

Además de para comprender JavaScript, podría ser útil entender la pila de Ethereum y los clientes de Ethereum.

¿Por qué usar una biblioteca?

Estas bibliotecas eliminan en gran parte la complejidad de interactuar directamente con un nodo Ethereum. Estas también proporcionan funciones útiles (p. ej., convertir ETH a Gwei) para que así un desarrollador gaste menos tiempo tratando con las complejidades de los clientes de Ethereum y pase más tiempo enfocado en la funcionalidad única de tu aplicación.

Características de la biblioteca

Conectar a nodos Ethereum

Mediante proveedores, estas bibliotecas le permiten conectarse a Ethereum y leer sus datos, ya sea sobre JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask.

Ejemplo de Ethers

1// Un proveedor de navegador envuelve un proveedor de Web3 estándar, que es
2// lo que MetaMask inyecta como window.ethereum en cada página
3const provider = new ethers.BrowserProvider(window.ethereum)
4
5// El complemento MetaMask también permite firmar transacciones para
6// enviar ether y pagar para cambiar de estado dentro de la cadena de bloques.
7// Para esto, necesitamos al titular de la cuenta...
8const signer = provider.getSigner()
Copiar

Ejemplo de Web3js

1var web3 = new Web3("http://localhost:8545")
2// o
3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
4
5// cambiar proveedor
6web3.setProvider("ws://localhost:8546")
7// o
8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))
9
10// Utilizando un proveedor IPC en node.js
11var net = require("net")
12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // ruta para macOS
13// o
14var web3 = new Web3(new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net))
15// ruta para macOS
16// en Windows, la ruta es: "\\\\.\\pipe\\geth.ipc"
17// en Linux, la ruta es: "/users/myuser/.ethereum/geth.ipc"
Mostrar todo
Copiar

Una vez configurado, estará habilitado a consultar en la cadena de bloques:

  • números de bloque
  • estimaciones del gas
  • eventos de contrato inteligente
  • id de la red
  • y más...

Funcionalidad de la cartera

Estas bibliotecas le darán la funcionalidad para crear billeteras, administrar claves y firmar transacciones.

A continuación se incluyen algunos ejemplos de Ethers

1// Crear una instancia de la cartera desde un mnemonic...
2mnemonic =
3"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
4
5walletMnemonic = Wallet.fromPhrase(mnemonic)
6
7// ... o desde una clave privada
8walletPrivateKey = new Wallet(walletMnemonic.privateKey)
9
10walletMnemonic.address === walletPrivateKey.address
11// verdadero
12
13// La dirección como una promesa según la API del firmante
14walletMnemonic.getAddress()
15// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
16
17// Una dirección de billetera también está disponible de forma sincrónica
18walletMnemonic.address
19// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
20
21// Los componentes criptográficos internos
22walletMnemonic.privateKey
23// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
24walletMnemonic.publicKey
25// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
26
27// La billetera mnemónica
28walletMnemonic.mnemonic
29// {
30// locale: 'en',
31// path: 'm/44\'/60\'/0\'/0/0',
32// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'
33// }
34
35// Nota: Una billetera creada con una clave privada no
36// tiene un mnemónico (la derivación lo impide)
37walletPrivateKey.mnemonic
38// nulo
39
40// Firmando un mensaje
41walletMnemonic.signMessage("Hello World")
42// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
43
44tx = {
45 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
46 value: utils.parseEther("1.0"),
47}
48
49// Firmando una transacción
50walletMnemonic.signTransaction(tx)
51// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
52
53// El método de conexión devuelve una nueva instancia de
54// Billetera conectada a un proveedor
55wallet = walletMnemonic.connect(provider)
56
57// Consultando la red
58wallet.getBalance()
59// { Promise: { BigNumber: "42" } }
60wallet.getTransactionCount()
61// { Promise: 0 }
62
63// Envío de Ether
64wallet.sendTransaction(tx)
Mostrar todo
Copiar

Lea la documentación completa(opens in a new tab)

Una vez configurado, podrá:

  • crear cuentas
  • enviar transacciones
  • firmar transacciones
  • y más...

Interactuar con las funciones del contrato inteligente

Las bibliotecas de clientes Javascript permiten que su aplicación invoque funciones de contratos inteligentes mediante la lectura de la Interfaz Binaria de Aplicación (ABI) de un contrato compilado.

La ABI esencialmente explica las funciones del contrato en un formato JSON y le permite usarlo como un objeto JavaScript normal.

Así que el siguiente contrato de Solidity:

1contract Test {
2 uint a;
3 address d = 0x12345678901234567890123456789012;
4
5 function Test(uint testInt) { a = testInt;}
6
7 event Event(uint indexed b, bytes32 c);
8
9 event Event2(uint indexed b, bytes32 c);
10
11 function foo(uint b, bytes32 c) returns(address) {
12 Event(b, c);
13 return d;
14 }
15}
Mostrar todo
Copiar

Resultaría en el siguiente JSON:

1[{
2 "type":"constructor",
3 "payable":false,
4 "stateMutability":"nonpayable"
5 "inputs":[{"name":"testInt","type":"uint256"}],
6 },{
7 "type":"function",
8 "name":"foo",
9 "constant":false,
10 "payable":false,
11 "stateMutability":"nonpayable",
12 "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
13 "outputs":[{"name":"","type":"address"}]
14 },{
15 "type":"event",
16 "name":"Event",
17 "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
18 "anonymous":false
19 },{
20 "type":"event",
21 "name":"Event2",
22 "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
23 "anonymous":false
24}]
Mostrar todo
Copiar

Esto significa que puede:

  • Enviar una transacción al contrato inteligente y ejecutar su método
  • Promover la estimación del gas que tomará un método de ejecución cuando se ejecute en la máquina virtual EVM
  • Desplegar un contrato
  • Y mucho más...

Funciones de utilidad

Las funciones de utilidad le dan atajos prácticos que hacen que la construcción o creación sea más fácil con Ethereum.

Los valores de ETH vienen en Wei por defecto. 1 ETH = 1.000.000.000.000.000.000 WEI (esto significa que está trabajando con muchos números) web3.utils.toWei convierte ether a Wei.

Y en ethers esto sería así:

1// Obtener el saldo de una cuenta (por dirección o nombre ENS)
2balance = await provider.getBalance("ethers.eth")
3// { BigNumber: "2337132817842795605" }
4
5// A menudo tendrás que formatear la salida para el usuario
6// que prefiere ver los valores en Ether (en lugar de Wei)
7ethers.utils.formatEther(balance)
8// '2.337132817842795605'
Copiar

Bibliotecas disponibles

Web3.js: API de Javascript de Ethereum.

Ethers.js: Implementación completa de billetera de Ethereum y utilidades en JavaScript y TypeScript.

The Graph: Un protocolo para indexar datos de Ethereum y IPFS, y consultarlos usando GraphQL.

light.js: Una biblioteca de JS de alto nivel optimizada para clientes ligeros.

Web3-wrapper: Alternativa de Typescript para Web3.js.

Alchemyweb3: Wrapper en torno a Web3.js con reintentos automáticos y API mejoradas.

Alchemy NFT API: API para obtener datos NFT, incluyendo propiedad, metadatos de atributos y más.

viem: Interfaz de TypeScript para Ethereum.

Más información

¿Conoce algún recurso de la comunidad que le haya servido de ayuda? Edite esta página y añádalo.

  • Nodos y clientes
  • Entornos de desarrollo
  • Configurar Web3js para utilizar la cadena de bloques de Ethereum en Javascript: Instrucciones para configurar web3.js en su proyecto.
  • Invocar un contrato inteligente desde JavaScript: con el token DAI, vea cómo invocar funciones de contratos usando Javascript.
  • Enviar transacciones usando web 3.0 y Alchemy: Tutorial de paso a paso para enviar transacciones desde el backend.

¿Le ha resultado útil este artículo?