Ayúdanos a actualizar esta página.

🌏

Disponemos de una nueva versión de esta página, pero solo está en inglés por ahora. Ayúdanos a traducir la última versión.

Esta página está incompleta. Si eres un experto en el tema, por favor edita esta página y esparce tu sabiduría.

Bibliotecas de API de JavaScript

Última edición: , Invalid DateTime
Edit page

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.

Con esta finalidad, cada cliente de Ethereum implementa la especificación de JSON-RPC (protocolo Remote Procedure Call codificado en JSON) para que haya un conjunto uniforme de puntos finales "endpoints" en los que las aplicaciones pueden confiar.

Si quieres usar JavaScript para conectar con un nodo de Ethereum, puedes usar VanillaJS (Vanilla JavaScript). Sin embargo, hay varias bibliotecas de conveniencia que existen dentro del ecosistema que lo simplifican. Con estas bibliotecas, los desarrolladores pueden escribir intuitivamente métodos de una línea para iniciar requerimientos de JSON RPC (de manera oculta) que interactuán con Ethereum.

Requisitos previos

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

¿Por qué usar una biblioteca?

Estas bibliotecas eliminan en gran parte la complejidad de interactuar directamente con un nodo Ethereum. También proporcionan funciones útiles (por ejemplo, convertir ETH a Gwei) de modo que, como desarrollador, puedas dedicar menos tiempo a lidiar con las complejidades de los clientes de Ethereum y centrarte más en las características únicas de tu aplicación.

Características de la biblioteca

Conectar a nodos Ethereum

Mediante proveedores, estas bibliotecas te permiten conectarte a Ethereum y leer tus datos, ya sea sobre JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask.

Ejemplo de Ether

1// Un Web3Provider enlaza un proveedor estándar Web3, en el
2// que Metamask se inyecta como window.ethereum en cada página
3const provider = new ethers.providers.Web3Provider(window.ethereum)
4
5// El plugin Metamask también permite firmar transacciones para
6// enviar Ether y pagar el cambio de estado dentro de la blockchain.
7// Para esto, necesitamos al titular de la cuenta...
8const signer = provider.getSigner()
9
📋 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(
15 new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)
16)
17// ruta para macOS
18// en Windows, la ruta es: "\\\\.\\pipe\\geth.ipc"
19// en Linux, la ruta es: "/users/myuser/.ethereum/geth.ipc"
20
Mostrar todo
📋 Copiar

Una vez configurado, estarás habilitado para consultar en la blockchain:

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

Funcionalidad de la cartera

Estas bibliotecas te darán la funcionalidad para crear carteras, 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 "anuncia el patrón de miembro de la sala a escala seca esfuerzo de escala suave de weasel de jazz"
4walletMnemonic = Wallet.romMnemonic(mnemonic)
5
6// ...or from a private key
7walletPrivateKey = new Wallet(walletMnemonic.privateKey)
8
9walletMnemonic.ddress === walletPrivateKey.address
10// verdadero
11
12// La dirección como una promesa por la cartera de Signer API
13Mnemonic.etAddress()
14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
15
16// Una dirección de cartera también está disponible sincrónicamente
17walletMnemonic.ddress
18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
19
20// Los componentes criptográficos internos
21walletMnemonic.privateKey
22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
23walletMnemonic.ublicKey
24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
25
26// El mnemónico del monedero
27walletMnemonic.nemonic
28// {
29// locale: 'en',
30// ruta: 'm/44\'/60\'/0\'/0/0',
31// frase: 'anunciar el patrón de miembro de la sala el esfuerzo de escala seca de la escala de la unidad de jazz weasel aferrado'
32// }
33
34// Nota: Una cartera creada con una clave privada no
35// tiene un mnemónico (la derivación lo impide)
36walletPrivateKey.nemonic
37// null
38
39// Firmando un mensaje
40walletMnemonic.ignMessage("Hola Mundo")
41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
42
43tx = {
44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
45 value: utils.arseEther("1.0"),
46}
47
48// Firmando una transacción
49walletMnemonic.ignTransaction(tx)
50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
51
52// El método de conexión devuelve una nueva instancia del
53// Wallet conectado a un proveedor
54wallet = walletMnemonic.onnect(provider)
55
56// Consultando la red
57wallet.getBalance()
58// { Promise: { BigNumber: "42" } }
59wallet.etTransactionCount()
60// { Promise: 0 }
61
62// Enviando ether
63wallet.sendTransaction(tx)
64
Mostrar todo
📋 Copiar

Leer la documentación completa

Una vez configurado, podrás:

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

Interactuar con las funciones del contrato inteligente

Las bibliotecas de cliente de Javascript permiten que tu aplicación solicite funciones de contrato inteligente mediante la lectura de la Interfaz Binaria de Aplicación (ABI) de un contrato compilado.

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

Así que el siguiente contrato 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}
16
Mostrar todo
📋 Copiar

Resultaría en el siguiente JSON:

1[{
2 "tip":"constructor",
3 "pagable":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}]
25
Mostrar todo
📋 Copiar

Esto significa que puedes:

  • Enviar una transacción al contrato inteligente y ejecutarla con el 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 te dan atajos prácticos que hacen que la construcció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ás trabajando con muchos números) web3.utils.toWei // convierte los Ether a Wei por ti.

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'
9
📋 Copiar

Bibliotecas disponibles

Web3.js: API de Javascript de Ethereum.

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

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

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

Web3-wrapper: Typescript alternativo a Web3.js.

Alchemyweb3: Wrapper alrededor de Web3.js con reintentos automáticos y API mejoradas.

Más información

¿Conoces algún recurso comunitario que te haya servido de ayuda? Edita esta página y añádelo.