← Todos los artículos

N.º 09Beenzer

Una firma en lugar de una contraseña

Beenzer no tiene contraseñas. Inicias sesión firmando un mensaje en Phantom, y pagas un mint con una transferencia que el servidor vuelve a leer en la cadena antes de acuñar nada. Esto es lo que impide cada comprobación.

Vincent Porret

Cofundador y CEO · · 4 min de lectura

Estampa 09, Zigzag. Gotas y peines sobre un baño, sacada al construir el sitio.Pasa el puntero por encima para dejar caer tinta.

Beenzer fija fotos y vídeos al lugar donde se tomaron, y cualquier publicación se puede acuñar como NFT en Solana. Así que la app tiene que responder a dos preguntas que un banco reconocería enseguida: ¿quién eres?, y ¿has pagado? Responde a las dos sin contraseña, y sin guardar nunca ninguna clave tuya. Así lo hacen la app en React Native y su servidor, mientras reconstruimos la app en Flutter.

Un mensaje, no una contraseña

Tu wallet es tu cuenta: los usuarios se identifican por la clave pública de su wallet, y el nombre de usuario viene después. Para iniciar sesión, la app pide un mensaje al servidor, que escribe uno nuevo:

const nonce = randomBytes(16).toString("hex");
const message = `Sign in to Beenzer\n\nWallet: ${pubkey}\nNonce: ${nonce}\nIssued: ${new Date().toISOString()}`;

La app abre Phantom con un enlace profundo, Phantom muestra el mensaje en texto plano, y tú lo firmas. Después el servidor comprueba la firma con tu clave pública: una verificación Ed25519, con tweetnacl. El nonce vale cinco minutos, y se borra en cuanto se ha comprobado una firma con él, sea válida o no: una firma que se filtre no se puede reutilizar, y cada nonce da para un solo intento. Una conexión puede pedir un nonce, o intentar iniciar sesión, cinco veces en diez segundos.

Lo que vuelve es una sesión: 32 bytes aleatorios, válidos durante 30 días. El servidor solo guarda su hash SHA-256, así que una copia de su base de datos no deja entrar a nadie. En el teléfono, el token se guarda en el almacenamiento seguro del sistema.

El servidor guarda el hash de tu sesión, nunca la sesión misma.

Pagado una vez

Un mint cuesta una tarifa fija en SOL, 0,01 por defecto. La app construye una transferencia simple al wallet de mercado de Beenzer, contigo como pagador de las comisiones, y Phantom la firma. El servidor no se lo cree sin más. Antes de retransmitir la transacción, comprueba que tú eres quien paga las comisiones, que cada instrucción es una transferencia de System al wallet de mercado, aparte de las de presupuesto de cómputo opcionales, y que sus firmas son válidas.

Antes de acuñar, vuelve a leer la transacción en la cadena, con compromiso confirmed, y comprueba que salió bien y que lo que llegó de tu parte al wallet de mercado cubre la tarifa. Después escribe la firma de la transacción en una tabla de pagos, donde la firma es la clave primaria. Un mismo pago no puede comprar dos mints: la segunda vez, la base de datos lo rechaza.

Dos wallets, dos funciones

Los ingresos y los costes nunca comparten wallet. Las tarifas llegan al wallet de mercado. Un wallet maestro, aparte, paga todo lo que cuesta un mint: la subida del archivo a Arweave, una vista previa en GIF de tres segundos cuando la publicación es un vídeo, los metadatos, y luego el mint en sí y la impresión de la primera edición para su creador. Los mints se hacen de uno en uno, en una cola.

Hay un hueco escrito en el propio código. Si un mint falla después de registrarse su pago, nada lo reembolsa automáticamente: el comentario dice que hace falta un reembolso o un reintento a mano, y la app te pide que contactes con soporte. Prefiero escribirlo a fingir que no pasa.

El royalty, en el token

Cada publicación se acuña con Metaplex como NFT programable, en hasta 1.000 ediciones del lado del servidor; el control deslizante de la app se para en 50. Las reventas llevan un royalty del 10 %, escrito en los metadatos del token como una lista de creadores y sus partes: el 80 % del royalty para el creador y el 20 % para Beenzer. El token sigue el conjunto de reglas que Metaplex publica por defecto para hacer cumplir los royalties.

Nada de esto pide un e-mail ni una contraseña, y nada guarda ninguna clave tuya. El servidor firma con sus propios wallets. El tuyo se queda en Phantom.

Vincent