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

Ramp Network Crypto On-Ramp: Integración, Verificación y Solución de Problemas

Una guía práctica de ingeniería para integrar el on-ramp y off-ramp de criptomonedas de Ramp Network, verificar transacciones on-chain y diagnosticar los modos de fallo que importan en producción.

TL;DR

Ramp Network es un ramp de fiat a cripto y de cripto a fiat que permite a los usuarios comprar, vender e intercambiar activos digitales desde dentro de una wallet o dApp mientras mantienen la custodia de sus claves. Para los desarrolladores, la superficie de integración es pequeña —un widget o SDK, un receptor de webhooks y una conexión RPC para confirmar la transferencia on-chain resultante—, pero los modos de fallo son sutiles porque la liquidación fiat, el KYC y la confirmación en la blockchain ocurren en relojes diferentes. Este artículo explica el modelo mental, recorre un procedimiento de integración y verificación ejecutable, y muestra cómo medir y solucionar problemas en cada etapa. Separa el comportamiento documentado del ramp de las comprobaciones que debes ejecutar contra tu propia infraestructura.

Alcance y el modelo mental de un ramp de criptomonedas

Un ramp de criptomonedas es el puente entre un riel de pago (tarjeta, transferencia bancaria, método local) y una dirección de blockchain. Ramp Network opera como un on-ramp y off-ramp no custodial: el usuario completa el KYC y paga fiat, y el ramp entrega el activo comprado a una dirección que el usuario controla. El ramp nunca posee las claves privadas del usuario, por lo que la integración suele describirse como un widget incrustado en una wallet de autocustodia.

La consecuencia importante para la ingeniería es que una sola compra abarca tres sistemas independientes con relojes diferentes: el procesador de pagos fiat (de segundos a días, según el método y las comprobaciones antifraude), la capa de cumplimiento y liquidación del ramp (variable) y la blockchain de destino (tiempo de bloque más la política de confirmación). Tu integración debe tratar estos como máquinas de estado separadas y reconciliarlas, en lugar de asumir una única señal de éxito síncrona.

Esta guía asume que eres un desarrollador que integra un ramp en una wallet, un front end de exchange o una dApp, y que ya tienes un endpoint RPC para la cadena de destino. Si aún no has elegido uno, las recomendaciones de endpoints del RPC Assistant y el directorio de redes de OnFinality son los puntos de partida adecuados; este artículo se centra en la metodología de integración y verificación.

  • Ramp se encarga de la recaudación fiat, el KYC y la entrega de activos; tú te encargas de la wallet, la dirección y la confirmación on-chain.
  • La dirección de la wallet del usuario es la clave de unión entre el registro off-chain del ramp y tu verificación on-chain.
  • Nunca marques una compra como completada solo con una callback del lado del cliente: confirma la transferencia on-chain.

Requisitos previos y supuestos antes de empezar

Necesitas una clave de API y la configuración del entorno desde el panel de desarrollador de Ramp Network, un endpoint HTTPS accesible públicamente para recibir webhooks y una URL RPC para cada cadena que pretendas soportar. También necesitas una forma de mapear tu ID de usuario interno a la dirección de wallet que recibirá los fondos, porque ese mapeo es lo que te permite reconciliar los eventos de webhook con las transferencias on-chain.

Trata todas las credenciales como secretos del lado del servidor. La clave pública del widget puede exponerse al navegador, pero los secretos de firma de webhooks y cualquier clave de API del servidor nunca deben enviarse al cliente. Usa claves separadas para sandbox y producción, y mantén el flujo de sandbox en tu CI para que las regresiones de integración se detecten antes del lanzamiento.

Por último, decide tu política de confirmación por cadena antes de escribir código. Una política de una confirmación está bien para un flujo de testnet de bajo valor, pero es insegura para compras en mainnet de alto valor en cadenas con finalidad probabilística. Documenta la política junto al código para que sea revisable.

Incrustar el widget del ramp y pasar la dirección de destino

La integración típica carga el SDK de Ramp en el navegador, lo configura con tu clave pública y la dirección de wallet del usuario, y abre el widget cuando el usuario elige comprar. La dirección que pasas es la dirección a la que el ramp entregará, por lo que debe validarse y normalizarse antes de que se abra el widget: una dirección EVM con checksum o una dirección Solana en base58, según la cadena.

El siguiente ejemplo es una configuración mínima del lado del navegador. Reemplaza los marcadores de posición con valores de tu panel y del estado de tu propia aplicación. Los nombres exactos de las opciones los define la versión del SDK que instales, así que fija la versión y lee sus notas de lanzamiento al actualizar.

// Browser: open the Ramp widget for a purchase
// npm install @ramp-network/ramp-instant-sdk
import { RampInstantSDK } from '@ramp-network/ramp-instant-sdk';

const widget = new RampInstantSDK({
  hostAppName: 'Example Wallet',
  hostLogoUrl: 'https://example.com/logo.png',
  url: 'https://app.ramp.network/',
  userAddress: window.walletAddress, // validated, checksummed address
  swapAsset: 'ETH_ETH',              // asset identifier from Ramp docs
  fiatCurrency: 'EUR',
  fiatValue: 100,
});

widget.on('*', (event) => {
  // Client events are UX hints only; do not settle orders here.
  console.log('ramp widget event', event.type);
});

widget.show();

Recibir y verificar webhooks en tu servidor

Ramp envía eventos de webhook a medida que la compra avanza por sus estados. Tu servidor debe verificar la firma, persistir el payload sin procesar y actualizar un registro interno de pedido indexado por el identificador de compra del ramp. No confíes en el monto del activo del payload como definitivo hasta que lo hayas emparejado con una transferencia on-chain.

El manejador de abajo es deliberadamente defensivo: verifica la firma, responde rápido y encola el trabajo de reconciliación. Los endpoints de webhook que realizan trabajo lento en línea tienden a agotar el tiempo de espera y provocar reintentos, lo que produce procesamiento duplicado. La idempotencia sobre el identificador de compra es obligatoria.

# Server: verify a Ramp webhook and enqueue reconciliation
import hmac, hashlib, json, os
from flask import Flask, request, abort

app = Flask(__name__)
WEBHOOK_SECRET = os.environ['RAMP_WEBHOOK_SECRET'].encode()

@app.post('/webhooks/ramp')
def ramp_webhook():
    raw = request.get_data()
    signature = request.headers.get('X-Ramp-Signature', '')
    expected = hmac.new(WEBHOOK_SECRET, raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, signature):
        abort(401)

    event = json.loads(raw)
    purchase_id = event['payload']['purchase']['id']
    # Idempotent upsert keyed by purchase_id, then enqueue on-chain check
    enqueue_reconciliation(purchase_id, event)
    return {'ok': True}, 200

Confirmar la transferencia entregada con una llamada RPC

El webhook te dice que el ramp cree que ha enviado fondos; la cadena te dice si esos fondos llegaron realmente a la dirección esperada. Reconciliar significa consultar la dirección de destino en busca de transferencias que coincidan con el activo, el monto y la ventana de tiempo esperados, y luego registrar el hash de la transacción contra el pedido.

Para cadenas EVM, la primitiva más fiable es escanear las transacciones recientes de la dirección y filtrar por el contrato del token y la contraparte. Para compras de activos nativos, compara el delta de saldo alrededor de la ventana de entrega esperada. El script de abajo es un diagnóstico que puedes ejecutar manualmente contra cualquier RPC_URL; imprime transacciones candidatas para revisión en lugar de tomar una decisión automática de liquidación.

#!/usr/bin/env bash
# Diagnose: list recent transactions for a destination address
RPC_URL="https://your-rpc-endpoint.example"
ADDRESS="0xYourDestinationAddress"

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

# For token deliveries, query the token contract's Transfer logs filtered
# by the destination address and the expected block range.
curl -s "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"eth_getLogs\",\"params\":[{\"address\":\"0xTokenContract\",\"fromBlock\":\"0xSTART\",\"toBlock\":\"latest\",\"topics\":[\"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\",null,\"0x000000000000000000000000YourAddressWithout0x\"]}]}"

Un procedimiento de medición para la latencia y el éxito del ramp

No puedes mejorar lo que no mides, y el rendimiento del ramp está dominado por los rieles fiat y el cumplimiento normativo más que por la blockchain. Construye un pequeño arnés de medición que registre la marca de tiempo de cada etapa de cada pedido: apertura del widget, finalización del KYC, autorización del pago, recepción del webhook y confirmación on-chain. Almacena estos como eventos estructurados para que puedas calcular distribuciones de latencia etapa por etapa.

Ejecuta el arnés contra tu entorno de sandbox con un conjunto fijo de métodos de pago y cadenas, y registra los resultados en una tabla como la de abajo. No rellenes números de otra fuente: llena la tabla solo con valores que tu arnés haya observado realmente, y anota el tamaño de muestra y la fecha junto a ella.

  • | Etapa | Métrica | Tu valor observado | Tamaño de muestra |
  • | Apertura del widget → KYC completo | segundos medianos | (medir) | (n) |
  • | Pago autorizado → webhook recibido | segundos p50 / p95 | (medir) | (n) |
  • | Webhook recibido → confirmado on-chain | segundos p50 / p95 | (medir) | (n) |
  • | Tasa de éxito de pedidos de extremo a extremo | porcentaje | (medir) | (n) |

Resultado de verificación esperado y cómo se ve un pedido saludable

Un pedido saludable produce un webhook con un estado final de éxito, una transferencia on-chain coincidente a la dirección de destino exacta y un registro interno de pedido que pasa de pendiente a liquidado exactamente una vez. Cuando reproduces el webhook, el pedido debe permanecer liquidado y no debe ocurrir ningún crédito duplicado; esa prueba de reproducción es la comprobación más valiosa de tu suite de integración.

Del lado de la cadena, el hash de la transacción en tu registro de pedido debe resolver a una transacción confirmada cuyo destinatario y monto coincidan con el pedido dentro de la tolerancia que definiste para comisiones y movimiento de precio. Si el ramp entrega un monto ligeramente distinto debido al spread o a las comisiones, tu regla de reconciliación debe tenerlo en cuenta explícitamente en lugar de exigir igualdad exacta.

Solución de problemas comunes de integración

La mayoría de los incidentes en producción se engloban en un pequeño número de categorías: discrepancias en la firma del webhook, errores de formato de dirección, discrepancias en la política de confirmación y problemas de fiabilidad del RPC. Abórdalos en ese orden, porque cada uno es más barato de descartar que el siguiente.

Las discrepancias de firma suelen provenir de calcular el HMAC sobre un cuerpo re-serializado en lugar de los bytes sin procesar, o de usar el secreto del entorno equivocado. Los errores de dirección suelen provenir de pasar una dirección EVM sin checksum o una dirección de testnet a un widget de mainnet. Las discrepancias de confirmación aparecen cuando tu política espera más confirmaciones de las que proporciona el modelo de finalidad de la cadena, dejando pedidos atascados en pendiente. Los problemas de RPC se manifiestan como tiempos de espera agotados o alturas de bloque obsoletas durante la reconciliación; un endpoint de respaldo y una comprobación de salud del retraso de la altura de bloque resuelven la mayoría.

  • Registra el cuerpo sin procesar del webhook y el prefijo de la firma calculada en caso de discrepancia; nunca registres el secreto.
  • Valida y aplica checksum a las direcciones en el límite, antes de que lleguen al widget o a la base de datos.
  • Genera una alerta cuando la altura de bloque del RPC del reconciliador se retrase respecto a la cabeza de la cadena más de tu umbral.
  • Para obtener orientación sobre selección de endpoints y failover, consulta las notas del RPC Assistant sobre endpoints fiables y la descripción general del servicio API de OnFinality.

Limitaciones, compensaciones y cuándo un ramp es la herramienta equivocada

Un ramp alojado abstrae las licencias, los métodos de pago y los controles antifraude, pero también te limita: los activos y países soportados los establece el proveedor, el KYC es obligatorio y heredas el tiempo de actividad y el comportamiento de liquidación del proveedor. Si tus usuarios ya son nativos de cripto y tienen stablecoins, un swap directo o un puente puede ser más barato y rápido que un ramp fiat.

También hay una compensación de custodia que comunicar con claridad. Un ramp no custodial mantiene las claves con el usuario, pero la pata fiat sigue involucrando intermediarios regulados. Tu documentación debe indicar claramente qué parte posee los fondos en cada etapa, porque los usuarios asumen razonablemente que "no custodial" se aplica de extremo a extremo.

Por último, trata el ramp como una dependencia entre varias. Tu verificación on-chain depende de tu proveedor de RPC, y el estado de tu pedido depende de la entrega de webhooks. Diseña para reintentos e idempotencia en ambos lados en lugar de asumir que cualquiera de los dos es perfectamente fiable.

Próximos pasos: endurecer, observar y escalar

Una vez que funcione el camino feliz, añade la prueba de reproducción, un trabajo de reconciliación que se ejecute según una programación y paneles para las latencias por etapa que mediste. Luego extiéndete a cadenas adicionales de una en una, validando la política de confirmación y el contrato del token para cada una antes de habilitarla para los usuarios.

Si necesitas rendimiento dedicado o latencia predecible para la reconciliación en muchas cadenas, revisa las opciones de nodos dedicados y la página de precios de RPC, y compáralas con tus tiempos de confirmación p95 medidos. Para elecciones concretas de endpoints y proveedores por red, usa las recomendaciones del RPC Assistant en lugar de codificar una única URL.

  • Añade pruebas de reproducción de webhooks y de entrega duplicada al CI.
  • Programa la reconciliación para detectar webhooks perdidos en minutos.
  • Revisa la guía de endpoints multicadena antes de expandirte a nuevas redes.
  • Vuelve a ejecutar el arnés de medición después de cada actualización del SDK o del proveedor.

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