← Tous les articles

N° 09Beenzer

Une signature au lieu d’un mot de passe

Beenzer n’a pas de mots de passe. On se connecte en signant un message dans Phantom, et on paie un mint par un virement que le serveur relit sur la chaîne avant de minter quoi que ce soit. Voici ce que chaque vérification empêche.

Vincent Porret

Cofondateur et CEO · · 4 min de lecture

Estampe 09, Chevrons. Des gouttes et des peignes sur un bain, tirée quand le site est construit.Pointez dessus pour faire tomber de l’encre.

Beenzer épingle photos et vidéos à l’endroit où elles ont été prises, et chaque post peut être minté en NFT sur Solana. L’app doit donc répondre à deux questions qu’une banque reconnaîtrait tout de suite : qui êtes-vous, et avez-vous payé ? Elle répond aux deux sans mot de passe, et sans jamais détenir une seule de vos clés. Voici comment l’app React Native et son serveur s’y prennent, pendant qu’on reconstruit l’app en Flutter.

Un message, pas un mot de passe

Votre wallet est votre compte : les utilisateurs sont identifiés par la clé publique de leur wallet, et le nom d’utilisateur vient ensuite. Pour se connecter, l’app demande un message au serveur, qui en écrit un nouveau :

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

L’app ouvre Phantom par un lien profond, Phantom affiche le message en clair, et vous le signez. Le serveur vérifie ensuite la signature avec votre clé publique : une vérification Ed25519, avec tweetnacl. Le nonce vaut cinq minutes, et il est effacé dès qu’une signature a été vérifiée avec lui, valide ou non : une signature qui fuite ne peut pas être rejouée, et chaque nonce ne donne droit qu’à un essai. Une connexion peut demander un nonce, ou tenter de se connecter, cinq fois en dix secondes.

En retour, vous recevez une session : 32 octets aléatoires, valables 30 jours. Le serveur n’en garde que l’empreinte SHA-256 : une copie de sa base de données ne permet à personne d’entrer. Sur le téléphone, le jeton est rangé dans le stockage sécurisé du système.

Le serveur garde l’empreinte de votre session, jamais la session elle-même.

Payé une fois

Un mint coûte un montant fixe en SOL, 0,01 par défaut. L’app construit un simple virement vers le wallet de marché de Beenzer, avec vous comme payeur des frais, et Phantom le signe. Le serveur ne s’en remet pas à la confiance. Avant de relayer la transaction, il vérifie que vous en êtes le payeur des frais, que chacune de ses instructions est un virement System vers le wallet de marché, à part d’éventuelles instructions de budget de calcul, et que ses signatures sont valides.

Avant de minter, il relit la transaction sur la chaîne, au niveau confirmed, et vérifie qu’elle a réussi et que ce qui est arrivé de votre part sur le wallet de marché couvre le montant. Puis il écrit la signature de la transaction dans une table des paiements, dont elle est la clé primaire. Un même paiement ne peut pas acheter deux mints : la deuxième fois, la base de données le refuse.

Deux wallets, deux rôles

Les recettes et les coûts ne partagent jamais un wallet. Les montants payés arrivent sur le wallet de marché. Un wallet maître, distinct, paie tout ce que coûte un mint : l’envoi du média sur Arweave, un aperçu GIF de trois secondes quand le post est une vidéo, les métadonnées, puis le mint lui-même et l’impression de la première édition pour son créateur. Les mints passent un par un, dans une file d’attente.

Un manque est écrit dans le code lui-même. Si un mint échoue après l’enregistrement de son paiement, rien ne le rembourse automatiquement : le commentaire dit qu’il faut un remboursement ou un nouvel essai à la main, et l’app vous demande de contacter le support. Je préfère l’écrire que faire comme si cela n’arrivait pas.

La redevance, dans le jeton

Chaque post est minté avec Metaplex en NFT programmable, en 1 000 éditions au plus côté serveur ; le curseur de l’app s’arrête à 50. Les reventes portent une redevance de 10 %, écrite dans les métadonnées du jeton sous forme de liste de créateurs et de leurs parts : 80 % de la redevance au créateur, 20 % à Beenzer. Le jeton suit le jeu de règles que Metaplex publie par défaut pour faire respecter les redevances.

Rien de tout cela ne demande d’e-mail ni de mot de passe, et rien ne détient l’une de vos clés. Le serveur signe avec ses propres wallets. Le vôtre reste dans Phantom.

Vincent