Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Integración y Desarrollo11 min de lectura

web3.js para Ethereum: Arquitectura, Proveedores y un Flujo de Trabajo de Integración Reproducible

Una guía práctica y consciente de versiones sobre web3.js: cómo asigna llamadas de JavaScript a JSON-RPC de Ethereum, cómo elegir y probar proveedores, y cómo diagnosticar los fallos que aparecen en dapps reales.

TL;DR

web3.js es una colección de bibliotecas JavaScript y TypeScript que permiten a una aplicación comunicarse con un nodo de Ethereum o compatible con EVM a través de HTTP, WebSocket o IPC. No almacena tus claves ni el estado de la cadena; traduce llamadas a métodos como web3.eth.getBalance en solicitudes JSON-RPC y formatea las respuestas. Este artículo explica esa capa de traducción, muestra cómo configurar un proveedor mediante una variable de entorno y proporciona un procedimiento repetible para verificar la conectividad y medir el comportamiento del proveedor sin inventar cifras. También cubre la división de versiones entre la línea heredada 1.x y la línea modular 4.x, porque la mayoría de los errores de integración se remontan a suposiciones incorrectas sobre cuál está instalada.

Alcance y la respuesta directa

web3.js es una biblioteca del lado del cliente, no un nodo ni una billetera. Su trabajo es serializar tu intención en JavaScript en llamadas JSON-RPC de Ethereum, enviarlas a través de un proveedor y decodificar lo que devuelve. Si solo recuerdas una cosa, recuerda esto: cada método de web3.js es un envoltorio tipado y delgado sobre un método RPC, y casi todos los problemas en producción son un problema de proveedor, un problema de versión o un problema de ABI/codificación.

Esta guía asume que estás construyendo una aplicación JavaScript o TypeScript contra Ethereum mainnet, una testnet o una cadena compatible con EVM, y que ya tienes una cuenta de prueba con fondos o un caso de uso de solo lectura. Separa tres cosas que a menudo se confunden: el comportamiento documentado de la biblioteca, las recomendaciones sobre cómo estructurar una integración y las mediciones que debes ejecutar tú mismo contra tu propio proveedor.

  • Documentado: web3.js admite transportes HTTP, WebSocket e IPC y refleja los espacios de nombres JSON-RPC de Ethereum.
  • Recomendado: inyecta la URL RPC a través de configuración, nunca la codifiques directamente y fija la versión mayor de tu biblioteca.
  • Medido por ti: latencia, tasa de errores y comportamiento de límite de velocidad de cualquier endpoint específico.

Requisitos previos y suposiciones de versión

Antes de escribir código, confirma en qué versión mayor estás. La línea 1.x es la API documentada durante mucho tiempo que muchos tutoriales aún describen, mientras que la línea 4.x es una reescritura modular en TypeScript con paquetes separados, BigInt nativo, compilaciones ESM y CommonJS, y soporte de plugins. Las dos no son compatibles de forma directa, por lo que un fragmento copiado de un tutorial de 1.x puede fallar silenciosamente o lanzar un error en una instalación de 4.x.

Necesitarás Node.js con un gestor de paquetes, un endpoint RPC accesible para tu red objetivo y, para operaciones de escritura, una estrategia de firma. Para trabajo de solo lectura, una URL RPC simple es suficiente. Para transacciones, debes decidir de antemano si firmas localmente con un objeto de cuenta o delegas la firma a una billetera del navegador, porque esa decisión cambia tu proveedor y tu modelo de seguridad.

node --version
npm view web3 version
npm ls web3

Cómo web3.js asigna llamadas de JavaScript a JSON-RPC

La biblioteca está organizada en módulos que siguen aproximadamente los espacios de nombres RPC del nodo. El módulo web3-eth, accesible como web3.eth, contiene métodos como getBalance, getBlockNumber y sendSignedTransaction. Cuando llamas a web3.eth.getBalance(address), la biblioteca construye una solicitud JSON-RPC con el método eth_getBalance, adjunta la dirección y una etiqueta de bloque como latest, y la entrega al proveedor configurado.

El proveedor es la abstracción del transporte. Un proveedor HTTP envía una solicitud por llamada y no tiene estado, lo que lo hace simple de escalar y fácil de razonar. Un proveedor WebSocket mantiene una conexión persistente y es necesario para suscripciones como nuevos encabezados de bloque o registros de eventos de contratos. IPC es un transporte de socket local, útil cuando tu aplicación se ejecuta en el mismo host que el nodo. Elegir un transporte es, por lo tanto, una decisión funcional primero y una decisión de rendimiento después.

  • HTTP: solo solicitud/respuesta; buena opción predeterminada para lecturas y escrituras del lado del servidor.
  • WebSocket: conexión persistente; necesaria para suscripciones y flujos de eventos.
  • IPC: solo local; menor sobrecarga pero acopla tu aplicación a la ubicación del nodo.

Una integración mínima de solo lectura con un proveedor configurable

El siguiente script lee el número de bloque más reciente y el saldo de una cuenta. Utiliza una variable de entorno para el endpoint, de modo que el mismo código funcione contra cualquier red. Reemplaza RPC_URL con tu propio endpoint; no lo confirmes en el control de código fuente. El ejemplo apunta a la forma de la API 4.x, donde el constructor Web3 acepta una cadena de URL de proveedor.

import { Web3 } from 'web3';

const rpcUrl = process.env.RPC_URL;
if (!rpcUrl) throw new Error('Set RPC_URL before running');

const web3 = new Web3(rpcUrl);

const blockNumber = await web3.eth.getBlockNumber();
console.log('latest block:', blockNumber.toString());

const address = '0x0000000000000000000000000000000000000000';
const balance = await web3.eth.getBalance(address);
console.log('balance (wei):', balance.toString());

Verificar la misma llamada en la capa RPC

Cuando una llamada de web3.js se comporta mal, baja una capa e emite la solicitud JSON-RPC sin procesar con curl. Si curl tiene éxito y web3.js falla, el problema está en la configuración de tu biblioteca, la codificación o la versión. Si ambos fallan, el problema es el endpoint, la red o el método en sí. Esta única comparación resuelve rápidamente la mayoría de las disputas de integración.

curl -s -X POST "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

curl -s -X POST "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"eth_getBalance","params":["0x0000000000000000000000000000000000000000","latest"]}'

Resultado esperado de la verificación y qué significa cada fallo

Una integración de solo lectura saludable devuelve un número de bloque decimal desde web3.js y un resultado codificado en hexadecimal desde la llamada curl sin procesar; ambos deben describir la misma cabeza de cadena dentro de uno o dos bloques. Si el número de bloque avanza entre ejecuciones, el endpoint está activo y siguiendo la cadena. Si la llamada de saldo devuelve 0x0 para la dirección cero, esa es una respuesta válida, no un error.

Trata un objeto de error JSON-RPC como autoritativo. Un error con código -32601 significa que el método no es compatible con ese endpoint, lo que a menudo ocurre en servicios reducidos o con acceso restringido a archivo. Un error de límite de velocidad de estilo -32005 significa que estás excediendo la cuota del proveedor. Una conexión rechazada o un tiempo de espera agotado significa que el transporte o la URL son incorrectos. Documentar estas asignaciones en tu manual de operaciones ahorra horas durante incidentes.

  • Método no encontrado: el endpoint no expone ese espacio de nombres o método.
  • Límite de velocidad: reduce la frecuencia de solicitudes o cambia a un nivel superior.
  • Tiempo de espera agotado o reinicio: verifica la URL, TLS y las reglas de salida de red.
  • Datos de cadena incorrectos: confirma que el ID de cadena del endpoint coincide con tu expectativa.

Un procedimiento de medición de proveedor reproducible

No confíes en afirmaciones anecdóticas sobre latencia, incluidas las de este artículo. Mide contra tu propia región de despliegue y carga de trabajo. Ejecuta un número fijo de llamadas idénticas a eth_blockNumber, registra el tiempo de reloj de pared por llamada y repite en varios momentos del día. Guarda el script y la salida sin procesar para que los resultados sean comparables entre proveedores y entre semanas.

Registra los resultados en una tabla con columnas para etiqueta del proveedor, región, transporte, tamaño de muestra, latencia mediana, latencia p95 y recuento de errores. Deja las celdas en blanco hasta que hayas ejecutado la prueba; la tabla a continuación es una plantilla, no un conjunto de resultados. Para una discusión más amplia sobre los criterios de selección de endpoints, consulta la guía para elegir una API RPC de Ethereum confiable y los fundamentos de endpoints RPC.

const samples = [];
for (let i = 0; i < 50; i++) {
  const start = performance.now();
  await web3.eth.getBlockNumber();
  samples.push(performance.now() - start);
}
samples.sort((a, b) => a - b);
const median = samples[Math.floor(samples.length / 2)];
const p95 = samples[Math.floor(samples.length * 0.95)];
console.log({ median, p95, errors: 0 });

Plantilla de tabla de resultados para tus propias ejecuciones

Etiqueta del proveedorRegiónTransporteMuestrasMediana (ms)p95 (ms)ErroresNotas
endpoint Atu regiónHTTP50
endpoint Btu regiónHTTP50
endpoint Atu regiónWebSocket50

Completa esta tabla solo con valores que hayas observado. Si necesitas una recomendación concreta de endpoint en lugar de un método de medición, el Asistente RPC cubre opciones breves de proveedor y red; esta página se mantiene deliberadamente en la metodología para que tus números sigan siendo tuyos.

Solución de problemas de los fallos que realmente ocurren

El fallo más común de web3.js es un desajuste de versión. El código escrito para 1.x a menudo utiliza patrones que cambiaron en 4.x, incluida la forma en que se construyen los proveedores y cómo se devuelven los valores BigInt. Fija la versión mayor en package.json y lee las notas de migración antes de actualizar. El segundo más común es un proveedor que funciona para lecturas pero no para suscripciones, porque el endpoint no admite WebSocket o no permite eth_subscribe.

Las interacciones con contratos añaden una tercera clase de fallo: errores de ABI y codificación. Si una llamada a un método se revierte o devuelve datos no decodificables, confirma que el ABI coincide con el bytecode desplegado y que estás pasando valores en las unidades esperadas. Una cuarta clase es la gestión de nonce y gas en escrituras; una transacción atascada suele ser una colisión de nonce o un reemplazo con precio insuficiente, no un error de la biblioteca. Para rutas de escritura, mantén las claves de firma fuera de los paquetes del cliente y prefiere la firma del lado del servidor o una billetera.

  • Fija la versión mayor de web3 y prueba las actualizaciones en staging.
  • Confirma que el endpoint admite el transporte y los métodos que utilizas.
  • Valida el ABI contra el contrato desplegado antes de depurar más.
  • Registra los errores JSON-RPC sin procesar junto con la llamada de web3.js que los produjo.

Limitaciones y compensaciones

web3.js es un cliente entre varios, y su línea 4.x es modular, lo que reduce el tamaño del paquete pero añade complejidad de gestión de paquetes. Las suscripciones sobre WebSocket requieren lógica de reconexión que debes escribir tú mismo; un socket caído no reproduce automáticamente los eventos perdidos. Los proveedores HTTP son más simples pero no pueden enviar eventos, por lo que los diseños basados en eventos necesitan WebSocket o una estrategia de sondeo con su propio costo de latencia.

La elección del proveedor es una compensación separada. Los endpoints públicos compartidos son convenientes para el desarrollo pero pueden limitar la velocidad o restringir consultas de archivo. La infraestructura dedicada ofrece un rendimiento predecible a un costo mayor. Si tu carga de trabajo es intensa o sensible a la latencia, revisa las opciones de nodos dedicados y los precios de RPC antes de comprometerte, y confirma que las redes que necesitas sean compatibles.

Próximos pasos para una integración lista para producción

Pasa de un único endpoint codificado directamente a un proveedor configurado con un respaldo, añade registro estructurado alrededor de cada llamada RPC y ejecuta el procedimiento de medición anterior de forma programada para que notes las regresiones antes que los usuarios. Añade una verificación de estado que compare el ID de cadena y la altura de bloque del endpoint con una segunda fuente. Para aplicaciones multicadena, mantén una configuración de proveedor por cadena y nunca asumas la paridad de métodos entre redes EVM.

Si aún estás decidiendo qué endpoint o red usar, entrega esa pregunta concreta al Asistente RPC en lugar de adivinar, y mantén esta página como referencia para verificar lo que elijas. Lecturas relacionadas incluyen las mejores consideraciones de proveedores RPC para proyectos web3 y la guía de endpoints RPC multicadena.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar