Voici une proposition de protocole pour des QRcodes représentant des annonces Ğchange (et autres potentiellement) : RFC sur le pad.
Le QRcode contiendrait essentiellement l’ID de l’annonce, la clé publique pour le paiement, et le prix. Il fait la même taille en pixels que celui d’une clé publique en base 58. (il est codé directement en binaire)
Dans un ğmarché, on pourrait scanner les affichettes des articles qu’on achète avec Ğecko, pour les payer ensuite.
Le client peut, en comparant les données du QRcode et celles de Ğchange, vérifier que l’annonce n’a pas été modifiée (par le vendeur ou par un nœud malveillant).
Il se peut qu’il bug avec des clés de moins de 44 caractères…
J’ai dû complexifier l’encodage du montant, car :
la monnaie doit pouvoir changer
il y a des prix en DU ou en Ğ1
le DU est un nombre à virgules, et on ne peut pas savoir à combien l’arrondir
Il y a donc un code par monnaie/unité (actuellement, uniquement pour Ğ1-unité et Ğ1-DU). Le prix en DU est stocké avec deux nombres (soit n le nombre sans la virgule, et e>=0 tel que n×10^-e égale le prix en DU).
@tuxmain Est-ce que tu as comparé avec un format d’encodage full string (comme les qrcodes de clés cesium) avec les mêmes données que dans la RFC actuelle ce que ça donnerait en terme de taille de QRCode ?
@Candidesk8 oui il faut interpréter chaque octet grace à la RFC de tux, mais il manques des précisions
Ça donne 49 pixels de côté chez moi, ça passe. Tu veux mettre plus de données dedans ?
Oui, mais tu peux récupérer les infos à partir du binaire directement, c’est plus simple.
Ok j’ai commencé à écrire un exemple de décodage en Python sur le pad.
Même avec un format ASCII, les lecteurs de QRcode généralistes ne connaîtront pas ce format, donc ça sera du charabia ASCI plutôt que du charabia non-ASCII…
# BytesIO adds a stream interface to bytes
qr = bytes
qr = 0
with open("qrcode-AXfA-M5faml2THvBAmPs.bin", "rb") as f:
while (byte := f.read(3)):
if (qr == 0):
qr = byte
else:
qr = qr + byte;
# print(qr)
qr = BytesIO(qr)
# Check magic number
assert qr.read(3) == b"\x83\x16\x14"
Et j’ai pour résultat:
$ ./main.py
Price: 13453.46 Ğ1
Ğchange ad ID: b'4DTsr2hPo-XXVdtRkHTyeg=='
Si tu as un fichier tu peux directement utiliser ton fichier à la place du BytesIO, il a aussi la méthode read.
Du coup je viens de voir que j’avais juste oublié de lire la clé publique… (alors l’ID de l’annonce lu est en fait la première moitié de la clé publique)
Euh non, tu lis d’abord tout le fichier pour le mettre dans un BytesIO (d’une manière bizarre d’ailleurs, pas besoin de lire par paquets de 3). On peut juste faire qr = open("fichier","rb") et supprimer toutes les lignes jusqu’à celle avec BytesIO incluse.
J’ai ajouté la lecture de la clé publique dans le code sur le pad.
Edit: et la page web affiche maintenant le contenu du QRcode en hexa, en bas.
Un stream possède un curseur, donc qr.read(n) retourne n octets à partir du curseur et décale le curseur de n octets. Le premier read retourne les 3 premiers octets, le second retourne les 3 d’après.
Pour bouger le curseur sans lire, par exemple pour lire deux fois la même chose, tu peux utiliser la méthode seek (ou juste le mettre dans une variable).