Una testnet es una red blockchain separada que replica el comportamiento de la mainnet lo suficientemente bien como para probar contratos, billeteras, actualizaciones e infraestructura sin arriesgar activos reales. Esta guía explica el ciclo de vida devnet-testnet-mainnet, cómo funcionan los tokens de prueba y los faucets, y cómo configurar y verificar una conexión RPC de testnet. También cubre modos de fallo comunes, los límites de la evidencia de testnet y cómo promover un cambio a mainnet con confianza.
Qué es una testnet y qué cubre esta guía
Una testnet es una red blockchain independiente que ejecuta las mismas reglas de protocolo que su contraparte mainnet pero utiliza tokens sin valor monetario. Existe para que los desarrolladores puedan desplegar contratos, ejercitar billeteras, ensayar actualizaciones de protocolo y someter la infraestructura a estrés antes de que algo toque fondos de producción. Las transacciones en una testnet no afectan el libro mayor de la mainnet, y los errores allí son recuperables.
Esta guía está escrita para desarrolladores y operadores de infraestructura que ya entienden los conceptos básicos de blockchain y necesitan un flujo de trabajo de testnet repetible. Cubre el ciclo de vida devnet-testnet-mainnet, cómo se obtienen los tokens de prueba, cómo configurar un endpoint RPC de testnet, cómo verificar que un despliegue realmente se realizó y dónde la evidencia de testnet deja de ser confiable. La selección concreta de endpoints y proveedores se deja intencionalmente al Asistente RPC; esta página se centra en el método.
Supuestos y requisitos previos
Los procedimientos a continuación asumen que tienes una billetera de testnet con fondos, un contrato o transacción que deseas ejercitar y acceso a un endpoint RPC de testnet. No necesitas un proveedor específico para seguir la guía; cualquier endpoint de testnet funcional servirá, y debes tratar la URL del endpoint como un valor de configuración en lugar de algo codificado directamente en tu proyecto.
También debes saber a qué testnet apuntas. Las redes a menudo ejecutan varias testnets paralelas con diferentes propósitos y vidas útiles, y una testnet puede quedar obsoleta o ser reemplazada. Confirma el nombre actual de la testnet y el ID de cadena desde la documentación propia de la red antes de comenzar, y mantén ese identificador en la configuración de tu proyecto para que los entornos no se confundan.
- Una dirección de billetera de testnet y su clave privada, almacenadas fuera del control de código fuente
- Una URL RPC de testnet proporcionada a través de una variable de entorno como RPC_URL
- El ID de cadena objetivo y la URL del explorador de bloques de la testnet
- Una pequeña cantidad de token nativo de testnet obtenido de un faucet
Devnet, testnet y mainnet como ciclo de vida
La mayoría de los equipos pasan por tres entornos. Una devnet es una cadena local o controlada por el equipo que se usa para iteración rápida, donde puedes restablecer el estado a voluntad y donde los tiempos de bloque y las reglas de gas pueden ser más flexibles. Una testnet es una red compartida y de cara al público que se comporta mucho más como la mainnet: tiene consenso real, pares reales y latencia real, pero sus tokens no tienen valor. La mainnet es la red de producción donde los activos tienen valor y los errores son costosos.
El valor de la etapa de testnet es que introduce condiciones que una devnet no puede reproducir. Las testnets públicas exponen tu código a tiempos de bloque realistas, contención en el mempool, límites de tasa RPC y otros participantes. Eso hace de la testnet el lugar adecuado para validar scripts de despliegue, estimaciones de gas, indexación de eventos y monitoreo antes de la promoción. Un cambio que solo se ejecutó en una devnet no ha sido probado contra las condiciones de red que encontrará en producción.
Cómo funcionan los tokens de prueba y los faucets
Los tokens de testnet se acuñan o distribuyen según las reglas de la propia red y no tienen valor de mercado. Los faucets son servicios que envían pequeñas cantidades de token nativo de testnet a una dirección solicitada para que los desarrolladores puedan pagar gas. Como los faucets son gratuitos, con frecuencia tienen límites de tasa, están protegidos por captchas o requisitos de cuenta, o son drenados por reclamos automatizados. Trata la disponibilidad del faucet como una dependencia operativa, no como una garantía.
Un hábito práctico es solicitar tokens de prueba temprano y mantener una pequeña reserva en una billetera de testnet dedicada. Si tu flujo de trabajo depende de un faucet específico, registra qué faucet usaste y cuándo, para que un fallo posterior pueda distinguirse de un problema de código. Nunca asumas que los tokens de testnet se pueden convertir en tokens de mainnet; no se puede, y cualquier servicio que afirme lo contrario es una estafa.
Configuración de una conexión RPC de testnet
El fallo más común en testnet es un endpoint mal configurado: el cliente apunta a la mainnet, a la testnet equivocada o a una URL que ha sido rotada. Mantén el endpoint y el ID de cadena en variables de entorno y verifica el ID de cadena al inicio. El siguiente fragmento de shell comprueba que el endpoint informa el ID de cadena que esperas antes de enviar cualquier transacción. Reemplaza RPC_URL y EXPECTED_CHAIN_ID con tus propios valores.
export RPC_URL="https://your-testnet-endpoint.example"
export EXPECTED_CHAIN_ID="0x0"
ACTUAL_CHAIN_ID=$(curl -s -X POST "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["result"])')
echo "expected=$EXPECTED_CHAIN_ID actual=$ACTUAL_CHAIN_ID"
[ "$ACTUAL_CHAIN_ID" = "$EXPECTED_CHAIN_ID" ] || { echo "chain ID mismatch"; exit 1; }Un procedimiento ejecutable de despliegue y verificación
Una vez que el ID de cadena coincide, despliega o envía tu transacción y luego verifícala independientemente del valor de retorno de la biblioteca cliente. Un hash de transacción no es prueba de éxito; debes leer el recibo y confirmar el campo de estado. El ejemplo de Python a continuación envía una transacción firmada a través de un endpoint RPC de testnet y luego sondea el recibo. Utiliza marcadores de posición para el endpoint, la clave y el destinatario.
El resultado de verificación esperado es un recibo cuyo estado es igual a 1 y cuyo número de bloque es mayor que cero. Si el recibo es nulo después de varios sondeos, la transacción puede seguir pendiente, puede haber sido descartada o puede haber sido enviada a una red diferente a la que estás consultando. Siempre confirma el recibo en el mismo ID de cadena que usaste para enviar.
import os, time, json, urllib.request
RPC_URL = os.environ["RPC_URL"]
PRIVATE_KEY = os.environ["PRIVATE_KEY"] # never commit this
TO_ADDRESS = os.environ["TO_ADDRESS"]
def rpc(method, params):
body = json.dumps({"jsonrpc":"2.0","id":1,"method":method,"params":params}).encode()
req = urllib.request.Request(RPC_URL, data=body, headers={"Content-Type":"application/json"})
with urllib.request.urlopen(req, timeout=30) as resp:
payload = json.load(resp)
if "error" in payload:
raise RuntimeError(payload["error"])
return payload["result"]
# Build and sign the transaction with your preferred library, then:
tx_hash = rpc("eth_sendRawTransaction", ["0xSIGNED_TX_HEX"])
print("submitted", tx_hash)
for attempt in range(30):
receipt = rpc("eth_getTransactionReceipt", [tx_hash])
if receipt is not None:
print("status", receipt["status"], "block", int(receipt["blockNumber"], 16))
assert receipt["status"] == "0x1", "transaction reverted"
break
time.sleep(2)
else:
raise TimeoutError("no receipt after polling; check network and nonce")Registro de resultados para que las pruebas sean reproducibles
Una ejecución en testnet solo es útil si otra persona puede repetirla. Registra el ID de cadena, el host del endpoint RPC (no la URL secreta completa), la dirección del contrato, los hashes de transacción y el estado del recibo observado para cada paso. Almacena estos datos en un registro de ejecución junto con el hash de commit del código bajo prueba. Cuando una ejecución posterior falle, el registro te permite separar una regresión de código de un problema de infraestructura o de faucet.
La siguiente tabla es una plantilla, no datos medidos. Complétala con tus propias ejecuciones; no copies valores de otro entorno.
- | Campo | Marcador de posición de ejemplo | Notas |
- | ID de cadena | EXPECTED_CHAIN_ID | Debe coincidir con el endpoint |
- | Host RPC | your-testnet-endpoint.example | Registra el host, no las credenciales |
- | Dirección del contrato | 0xCONTRACT | De la salida del despliegue |
- | Hash de tx | 0xTXHASH | Una fila por transacción |
- | Estado del recibo | 0x1 o 0x0 | 0x1 significa éxito |
- | Número de bloque | decimal | Confirma la inclusión |
Solución de problemas comunes de testnet
La mayoría de los problemas de testnet se dividen en unas pocas categorías. Las discrepancias de ID de cadena significan que estás consultando una red diferente a la que enviaste. Los fondos insuficientes generalmente significan que el faucet no entregó o que se agotó la reserva. Los errores de nonce significan que una transacción anterior está atascada o se envió desde la misma clave en otra cadena. La limitación de tasa de un endpoint público se manifiesta como respuestas HTTP 429 o tiempos de espera intermitentes bajo carga.
Para cada fallo, confirma la capa antes de cambiar el código. Vuelve a ejecutar la verificación del ID de cadena, consulta el saldo del remitente y obtén el recuento de transacciones para compararlo con tu nonce esperado. Si el problema es el endpoint, cambia a un proveedor gestionado en lugar de depurar alrededor de un nodo público inestable; el Asistente RPC puede ayudarte a elegir un endpoint compatible con testnet, y la guía de endpoints RPC multicadena explica cómo estructurar varias redes en un proyecto.
- Discrepancia de ID de cadena: vuelve a verificar RPC_URL y EXPECTED_CHAIN_ID
- Fondos insuficientes: confirma la entrega del faucet y mantén una reserva
- Nonce demasiado bajo o alto: compara eth_getTransactionCount con tu nonce local
- Tiempos de espera o 429: cambia a un endpoint gestionado y agrega reintentos con retroceso exponencial
- Recibo nulo: confirma que la transacción se transmitió a la misma cadena que estás sondeando
Límites de la evidencia de testnet y compensaciones
Una ejecución exitosa en testnet es evidencia sólida, no prueba. Las testnets a menudo tienen menos validadores, mercados de gas diferentes y menos tráfico adversario que la mainnet, por lo que las conclusiones de rendimiento y seguridad no se transfieren directamente. El estado de la testnet también puede restablecerse o la red quedar obsoleta, lo que significa que los fixtures de prueba de larga duración son frágiles. Trata los resultados de testnet como una puerta, no como una garantía.
También hay una compensación de costos. Los endpoints públicos de testnet son gratuitos pero tienen límites de tasa y ocasionalmente son inestables; los endpoints gestionados cuestan dinero pero ofrecen rendimiento predecible y soporte. Para una verificación de contrato única, un endpoint público suele ser suficiente. Para canalizaciones de CI que despliegan en cada commit, un endpoint gestionado con límites documentados suele ser la opción más confiable. Revisa las opciones de precios de RPC antes de comprometer una canalización con un proveedor.
Promoción de un cambio de testnet a mainnet
La promoción debe ser un paso deliberado con su propia lista de verificación. Vuelve a ejecutar el script de despliegue contra la configuración de mainnet en modo de simulación, confirma el ID de cadena y la configuración de gas, y verifica que no se haga referencia a direcciones o claves de testnet. Mantén el registro de ejecución de testnet adjunto al lanzamiento para que los revisores puedan ver qué se ejercitó realmente.
Después de la promoción, monitorea de cerca las primeras transacciones y compara su comportamiento con la ejecución en testnet. Si operas tu propia infraestructura, un nodo dedicado te da control sobre el endpoint durante la ventana de promoción. Para equipos que necesitan comparar varias redes en paralelo, el directorio de redes enumera las cadenas compatibles y su disponibilidad de testnet.
- Confirma el ID de cadena de mainnet y elimina todos los valores predeterminados de testnet
- Ejecuta el despliegue en modo de simulación y revisa el diff
- Adjunta el registro de ejecución de testnet al registro de lanzamiento
- Monitorea las primeras transacciones en mainnet contra el comportamiento esperado
Próximos pasos
Comienza estandarizando tu configuración de testnet: un archivo de entorno por red, una aserción de ID de cadena al inicio y una plantilla de registro de ejecución. Luego automatiza la verificación del recibo para que una transacción fallida no pase silenciosamente por CI. Si aún estás eligiendo un endpoint, usa el Asistente RPC para obtener una recomendación concreta y lee la guía de endpoints RPC para patrones de configuración generales. Para equipos que ejecutan su propia infraestructura, la guía de alojamiento de nodos blockchain cubre el lado operativo.