← Tots els articles

Núm. 09Beenzer

Una signatura en lloc d’una contrasenya

Beenzer no té contrasenyes. Inicies sessió signant un missatge a Phantom, i pagues un mint amb una transferència que el servidor torna a llegir a la cadena abans d’encunyar res. Això és el que impedeix cada comprovació.

Vincent Porret

Cofundador i CEO · · 4 min de lectura

Estampa 09, Ziga-zaga. Gotes i pintes sobre un bany, treta en construir el web.Passa-hi el punter per deixar caure tinta.

Beenzer fixa fotos i vídeos al lloc on es van fer, i qualsevol publicació es pot encunyar com a NFT a Solana. Així que l’app ha de respondre dues preguntes que un banc reconeixeria de seguida: qui ets?, i has pagat? Respon totes dues sense contrasenya, i sense guardar mai cap clau teva. Així ho fan l’app en React Native i el seu servidor, mentre reconstruïm l’app en Flutter.

Un missatge, no una contrasenya

El teu wallet és el teu compte: els usuaris s’identifiquen per la clau pública del seu wallet, i el nom d’usuari ve després. Per iniciar sessió, l’app demana un missatge al servidor, que n’escriu un de nou:

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

L’app obre Phantom amb un enllaç profund, Phantom mostra el missatge en text pla, i tu el signes. Després el servidor comprova la signatura amb la teva clau pública: una verificació Ed25519, amb tweetnacl. El nonce val cinc minuts, i s’esborra tan bon punt s’hi ha comprovat una signatura, sigui vàlida o no: una signatura que es filtri no es pot reutilitzar, i cada nonce dona per a un sol intent. Una connexió pot demanar un nonce, o intentar iniciar sessió, cinc vegades en deu segons.

El que torna és una sessió: 32 bytes aleatoris, vàlids durant 30 dies. El servidor només en guarda el hash SHA-256, així que una còpia de la seva base de dades no deixa entrar ningú. Al telèfon, el token es guarda a l’emmagatzematge segur del sistema.

El servidor guarda el hash de la teva sessió, mai la sessió mateixa.

Pagat una vegada

Un mint costa una tarifa fixa en SOL, 0,01 per defecte. L’app construeix una transferència simple al wallet de mercat de Beenzer, amb tu com a pagador de les comissions, i Phantom la signa. El servidor no s’ho creu sense més. Abans de retransmetre la transacció, comprova que ets tu qui paga les comissions, que cada instrucció és una transferència de System al wallet de mercat, a part de les de pressupost de còmput opcionals, i que les signatures són vàlides.

Abans d’encunyar, torna a llegir la transacció a la cadena, amb compromís confirmed, i comprova que va sortir bé i que el que va arribar de part teva al wallet de mercat cobreix la tarifa. Després escriu la signatura de la transacció en una taula de pagaments, on la signatura és la clau primària. Un mateix pagament no pot comprar dos mints: la segona vegada, la base de dades el rebutja.

Dos wallets, dues funcions

Els ingressos i els costos no comparteixen mai wallet. Les tarifes arriben al wallet de mercat. Un wallet mestre, a part, paga tot el que costa un mint: la pujada de l’arxiu a Arweave, una previsualització en GIF de tres segons quan la publicació és un vídeo, les metadades, i després el mint mateix i la impressió de la primera edició per al seu creador. Els mints es fan d’un en un, en una cua.

Hi ha un forat escrit al mateix codi. Si un mint falla després de registrar-se el pagament, res no el reemborsa automàticament: el comentari diu que cal un reemborsament o un nou intent a mà, i l’app et demana que contactis amb el suport. M’estimo més escriure-ho que fer veure que no passa.

El royalty, al token

Cada publicació s’encunya amb Metaplex com a NFT programable, en fins a 1.000 edicions del costat del servidor; el control lliscant de l’app s’atura a 50. Les revendes porten un royalty del 10 %, escrit a les metadades del token com una llista de creadors i les seves parts: el 80 % del royalty per al creador i el 20 % per a Beenzer. El token segueix el conjunt de regles que Metaplex publica per defecte per fer complir els royalties.

Res de tot això no demana un e-mail ni una contrasenya, i res no guarda cap clau teva. El servidor signa amb els seus propis wallets. El teu es queda a Phantom.

Vincent