Aex Pass
Un pase para entrar a un Meet que no se puede usar dos veces, controlado por un contrato en Stellar.
La idea
Organizar un Meet pagado tiene dos problemas: saber quién pagó y evitar que un mismo pase se use dos veces. Normalmente eso lo controla una planilla o un servidor del organizador, y hay que confiar en él. Aex Pass pone esas reglas en un contrato: un programa público en la blockchain que las aplica solo y que nadie puede cambiar, ni siquiera el anfitrión.
Anfitrión
Organiza el Meet, cobra el pase y deja entrar a la gente.
Invitado
Compra su pase y lo usa para entrar.
Contrato
Las reglas del evento, guardadas en la blockchain. Nadie se las puede saltar.
Las dos reglas
Regla 1
Solo tiene pase quien lo compró
buy exige la firma del comprador y cobra en la misma operación: o se paga y se anota el pase, o no pasa nada. Cada cuenta puede comprar un solo pase.
Regla 2
Cada pase se usa una sola vez
check_in solo lo puede firmar el anfitrión, y solo acepta un pase comprado. Un pase usado se rechaza siempre, lo intente quien lo intente.
¿Cómo sabe el contrato quién es el anfitrión? Lo guardó al nacer. No lo recibe como dato en cada llamada, así que nadie puede hacerse pasar por él.
El recorrido de un pase
Cada cuenta tiene un pase que pasa por tres estados. Solo se puede avanzar, nunca volver atrás.
- Si alguien sin pase intenta entrar,
check_inlo rechaza con el error 3. - Si alguien que ya compró intenta comprar otra vez,
buylo rechaza con el error 2.
Qué hace cada función
| Función | Quién firma | Qué hace | Costo |
|---|---|---|---|
| __constructor(host, token, price, name) | El anfitrión, al desplegar | Guarda las reglas del evento: quién cobra, con qué activo, cuánto y cómo se llama. Corre una sola vez. | Comisión de despliegue |
| buy(buyer) | El invitado | Cobra el precio, se lo paga al anfitrión, anota el pase como Bought y publica el evento bought. | Comisión + renta |
| check_in(buyer) | El anfitrión | Pasa el pase de Bought a Used y publica el evento checked_in. | Comisión |
| pass_of(buyer) | Nadie | Devuelve el estado del pase de esa cuenta: sin pase, Bought o Used. | Gratis (lectura) |
| name() · price() · host() | Nadie | Devuelven la configuración del evento. | Gratis (lectura) |
El contrato está escrito en Rust con soroban-sdk, compilado a WebAssembly y publicado en Stellar testnet. El código completo tiene unas 160 líneas y está en GitHub ↗.
Qué guarda en la blockchain
Las reglas del evento
Anfitrión, activo, precio y nombre. Se escriben una vez, al desplegar, en el storage de la instancia del contrato.
Un dato por cada pase
Pass(dirección) = Bought o Used, en el storage persistente. Es lo que consulta pass_of.
Eventos
bought (quién compró y a qué precio) y checked_in (quién entró). Son avisos para que otras apps se enteren; el estado real está en el storage.
Lo que no guarda: el link del Meet
Todo lo que está en la blockchain lo puede leer cualquiera. El anfitrión comparte el link por fuera; el contrato solo prueba quién pagó y quién entró.
Cuando algo sale mal
Antes de enviar una transacción, el CLI o la página la simula. Si el contrato la rechaza, la simulación falla con un código de error y la transacción no se envía: no queda registrada y no se cobra nada.
| Código | Nombre | Cuándo pasa |
|---|---|---|
| #1 | InvalidPrice | Al desplegar, con un precio de 0 o menos. |
| #2 | AlreadyBought | Una cuenta intenta comprar un segundo pase. |
| #3 | NoPass | El anfitrión hace check-in de alguien que no compró. |
| #4 | AlreadyUsed | Un segundo check-in con el mismo pase. |
Cuánto cuesta
Cada transacción paga una comisión a la red. Estas son las reales de mi ejecución con el CLI:
- Desplegar
- 0,011 XLM
- Comprar
- 17,64 XLM
- Check-in
- 0,00076 XLM
- Leer
- Gratis
¿Por qué la compra costó tanto? Guardar datos en la red cuesta renta, y cada dato tiene un tiempo de vida (TTL). buy extiende ese tiempo a 120 días para el pase, el contrato y su código, y casi toda la comisión fue esa renta. Es XLM de prueba, pero la lección es real: el plazo hay que ajustarlo a la duración del evento.
Glosario
- Blockchain
- Un registro público y compartido que nadie puede editar a escondidas. Stellar es una blockchain.
- Testnet (red de prueba)
- Una copia de Stellar para practicar. Funciona igual que la real, pero el XLM no vale dinero.
- Contrato
- Un programa que vive en la blockchain y aplica reglas por sí solo.
- Stellar CLI
- La herramienta oficial de Stellar para la terminal: compila, publica y usa contratos con comandos.
- Invocar
- Llamar a una función de un contrato, como buy (comprar) o check_in (dejar entrar).
- Cuenta
- Una dirección pública (empieza con G) y una llave secreta. La dirección se puede compartir; la llave no.
- Firmar
- Aprobar una operación con la llave secreta. El contrato comprueba que firmó la persona correcta.
- Transacción
- Un pedido enviado a la red, como «comprar pase». Queda registrado para siempre y se ve en el explorador.
- Simular
- Probar una transacción antes de enviarla. Si la simulación falla, no se envía y no se cobra nada.
- Evento
- Un aviso público que deja el contrato cuando pasa algo: bought (compró) y checked_in (entró).
- Storage (almacenamiento)
- Los datos que guarda el contrato en la red. Guardarlos tiene un costo: la renta.
- TTL
- El tiempo de vida de un dato guardado. Mientras más largo, más renta se paga.
- XLM y stroops
- XLM es la moneda de Stellar. Un stroop es su unidad mínima: 1 XLM son 10.000.000 stroops.
- Explorador
- Una página que muestra todo lo que pasa en la blockchain. Aquí usamos stellar.expert.