QRcode pour les annonces Ğchange et autres

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).

C’est implémenté sur cette page, pour le test : Ğchange ad QRcode generator

Des idées de nom pour ce protocole, histoire de ne pas s’y perdre entre les différents formats ? AdCode, AdQR, ĞQR, ĞScan, ĞMarketCode, ĞAd, QRAĞ…

5 J'aimes

Voilà, le prototype est prêt !

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).

1 J'aime

@tuxmain @poka est ce que 161 octets de payload c’est trop pour un QR code où ça passe ?

Non c’est cool sur mon phone avec gecko ça passe très bien en tout cas, aussi bien que les pubkey g1 en string

1 J'aime

Alors pour cette anonce gchange:

J’obtient ce QRCode avec l’outil de tuxmain:

Avec l’app android :

J’obtiens ce résultat hexa:

Dont le code binaire est dans ce fichier:

qrcode gchange AXfA-M5faml2THvBAmPs (54 Octets)

Et qui donne en base 64 ceci:

gxYUAhLCjlLgNOyvaE+j5ddV21GQdPJ60Ia93/0ms4blXztiPKAfAXfA+M5faml2THvBAmPs

Ai-je bon ? Est-ce a partir de cette base64 que je vais devoir récupérer les info contenu dans le QRCode ?

Bon même en lisant la RFC je pige pas comment interpréter ce binaire jvaisa voir besoin d’aide ^^

J’ai testé de lire le QRcode de l’exemple de Poka avec Barecode Scanner :

�ŽR�4�hO���U�Q�t�zІ���&���_;b<�w���_jivL{�c�

@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

ok, donc les lecteurs de code barre/qrcode classique n’y liront que du charabia ?

Ç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…

1 J'aime

Bon j’ai finalement réussi à déchiffrer tes qrcodes en python en modifiant ton exemple, mais j’ai des soucis:

image

J’ai donc changé ici en:

assert qr.read(3) == b"\x83\x16\x14"

Pensant que c’est un test donc, et ça passe.

J’ai donc modifier le début en:

# 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=='

Alors qu’il s’agit su qrcode de cette annonce:

?

1 J'aime

Oups, c’est corrigé.

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)

C’est ce que j’ai fait regarde le code que j’ai changé

Ca load ce fichier:

qrcode gchange AXfA-M5faml2THvBAmPs (54 Octets)
Pourquoi j’ai pas les bonnes données ?

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.

qr = open("qrcode-AXfA-M5faml2THvBAmPs.bin","rb")
qr = BytesIO(qr.read())

print("qr.read(3): {0}".format(qr.read(3)))
# Check magic number
assert qr.read(3) == b'\x83\x16\x14'

->

$ ./main.py 
qr.read(3): b'\x83\x16\x14'
Traceback (most recent call last):
  File "./main.py", line 23, in <module>
    assert qr.read(3) == b'\x83\x16\x14'
AssertionError

Comment t’explique ça ??

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).

1 J'aime

Mais je pige pas pk mon print qr.read(3) est OK mais pas le test …

Et pk ça marchais avec ma méthode récursive et pas juste read() et son curseur …

AAAhhhhh j’ai compris !!

Si j’enlève mon print, c OK, le curseur n’a pas bougé, c bon pigé, merci !

1 J'aime

enfin pas totalement ok vue que tjrs même mauvais prix et mauvais ID:

Price: 13453.46 Ğ1
Ğchange ad ID: b’4DTsr2hPo-XXVdtRkHTyeg==’

Pour cette annonce la page me donne le contenu hexa :

8316140212c28e52e034ecaf684fa3e5d755db519074f27ad086bddffd26b386e55f3b623ca01f0177c0f8ce5f6a69764c7bc10263ec

Et en remplaçant juste la ligne du code dans le pad par :

qr = BytesIO(bytes.fromhex("8316140212c28e52e034ecaf684fa3e5d755db519074f27ad086bddffd26b386e55f3b623ca01f0177c0f8ce5f6a69764c7bc10263ec"))

ça me donne bien :

Pubkey: b'E6TxyvZADB8EwcaDhFsLTeqniGt8NpYpDpMBvdB86DCP'
Price: 40.0 Ğ1
Ğchange ad ID: b'AXfA-M5faml2THvBAmPs'