Doc protocol example tx format

je souhaite savoir quelle est la priorité des operateurs && et || avant de me lancer dans une serie de tests

a savoir une expression dans la liste des outputs telle que :

SIG(1) && SIG(2) || SIG(3)

A) sera-t-elle rejetée ?

B)
est evaluée comme :
( SIG(1) && SIG(2) ) || SIG(3)

ou bien :
SIG(1) && ( SIG(2) || SIG(3) )


edit :
pour rappel,
avant toute consideration de mon questionnement
malgré la doc ici :
.https://github.com/duniter/duniter/blob/master/doc/Protocol.md#output-condition-examples
et cet exemple plutot parlant :
(SIG(HgTT…) && (CLTV(1489677041) || CSV(3600)))

j’ai validé précèdemment une transaction avec une “pseudo erreur” de parsing, une parenthese en trop …
d’où ce post

Elle ne sera pas rejetée mais évaluée comme B ou C, cependant il ne faut pas faire cela, je suis d’avis qu’un tel document devrait être rejeté, voici pourquoi :

Le comportement d’une tel combinaison pouvant dépendre des implémentations il conviens de toujours spécifier explicitement la priorité via des parenthèses, en effet un même script de conditions de déblocage doit pouvoir être utilisé par plusieurs programmes, y compris des clients, et être toujours interprété de la même façon, il est donc prohibée de se baser sur la priorité implicite des opérateurs entre eux, c’est trop risqué !

1 Like

La règle est déjà explicite il me semble : il n’y a pas de priorité entre opérateurs, et la lecture se fait de gauche à droite.

Donc dans : SIG(1) && SIG(2) || SIG(3)

On évalue :

  • SIG(1) && SIG(2) = A
  • puis
  • A || SIG(3) = B

On évalue alors B pour savoir si la condition de déverrouillage est remplie.

Après l’utilisation de parenthèses permet de s’assurer du respect de la priorité désirée, et c’est certainement une bonne pratique pour les clients. Mais je ne vois pas de besoin d’interdire quoi que ce soit ici.

2 Likes

pour revenir sur XHX
pass=(1234
avec la parenthese ouvrante devant les chiffres 1234
tel que

XHX( sha256(pass) ) = XHX(7F5361A072CA58DF990C03679DA50181627B1B098247606BD801A295DBA45860)

(1234 <=> 7F5…60
et par consequent pour deverouiller => XHX((1234)

enregistrement:
.https://g1-test.cgeek.fr/blockchain/block/73966

avec le hash de la transaction:
1525D58C9B6135E8AD5D5BF7C27598D75147AB22F96A0EB922736669569A40D9
le T_INDEX = 1 :wink:

mon nouveau doc pour consommer:

Issuers:
7t38cKwaBN9e6KymPnPS7SDc4bSJEMML1mTyKg4sDtiY
Inputs:
100:0:T:1525D58C9B6135E8AD5D5BF7C27598D75147AB22F96A0EB922736669569A40D9:1
Unlocks:
0:XHX((1234)
Outputs:
100:0:SIG(7t38cKwaBN9e6KymPnPS7SDc4bSJEMML1mTyKg4sDtiY)

Duniter return => 1005 Document has unkown fields or wrong line ending format

le document complet:
https://pastebin.com/PifzFYPh

Note: si j’ecris en unlock : 0:XHX(1234) <=> je tombe bien sur un wrong unlocker , ce qui est attendu … juste pour signaler a priori que je n’ai pas de champs dans le document qui font défaut.

Comptes le nombre de parenthèses ouvrantes et fermantes :slight_smile:

mot de passe => (1234
il y a la parenthese ouvrante inclus dans le mot de passe puis les chiffres 1234

je ne comprends pas où je fais une erreur de parenthese…
j’ai bien

XHX(pass)

?

@Max pour un parseur de code, une parenthèse n’est pas un caractère anodin… il te faut au moins protéger le mot de passe avec des (double) quotes. Et que se passerait-il si tu avais une parenthèse fermante dans le mot de passe? Comment un parseur pourrait-il savoir quelle parenthèse est la bonne pour terminer le terme qu’il est en train d’isoler?

Ah oui d’accord … bon sur le principe Duniter accepte ce mot de passe pour la fonction XHX (je viens de tester dans le fichier grammar-test.js), par contre effectivement tu t’exposes à des erreurs incompréhensibles en mettant une parenthèse précisément à cet endroit où une parenthèse fermante à la fin.

Là tu vas te prendre des erreurs à la réception de la TX, il se peut même qu’aucun bloc contenant ce mot de passe de déverrouillage ne soit accepté, rejetant celui-ci sur sa forme. Sur le fond par contre, pas de soucis.

https://github.com/duniter/duniter/blob/master/app/lib/common-libs/constant

XHX ne supporte que les lettres et chiffres. Mais ce genre d’élément mériterait d’être précisé dans la doc :slight_smile:

2 Likes

oui jytou

j’ai justement ecris la un cas d’exception qui peut arriver si l’application client ne fais pas attention en amont du mot de pass choisis avant le sha256,
duniter ne voit que le je sha256 donc l’accepte sans probleme, c est normal

sha256 <=> 7F5361A072CA58DF990C03679DA50181627B1B098247606BD801A295DBA45860

par contre , pour moi, c’est duniter qui sur une expression telle que XHX((1234) dans l’unlock de la future transaction
doit prendre la premiere parenthese a cote du X

XHX(

puis aller jusqu’a la derniere parenthese fermante

)

pour extraire le mot de passe

(1234

Je rappel que ma transaction a etait validé dans un block :wink:
la il me semble que ca pose probleme, je ne peut pas deverouiller pour utiliser la ressource

Oui, d’accord. Quelle est ton intention avec tout cela ?

1 Like

Ce serait un bug du client dans ce cas !

Duniter ne peut qu’accepter n’importe quel hash, même un hash écrit “au hasard” sans connaitre les données d’entrées.

Donc le client doit s’assurer de pouvoir garder les données d’entrées et qu’elles soient valides suivant le protocole Duniter. Rien de choquant à ça.

Je suis entierement d’accord avec toi inso,
appelé ca un bug, question de semantique,

imagine un dev qui par “inattention” ou encore completement mal intentionné shunt ces documents,…

c’est pourquoi j’insiste quand meme sur le faite que duniter puisse faire un parsing de l’expression XHX((1234)
et extraire XHX(pass)

Un dev mal intentionné peut shunter n’importe quel document, en les envoyant vers une clé publique aléatoire.Pas besoin de jouer avec la fonction XHX pour ça…

L’intention c’est le questionnement suivant:

Qui va-t-on pointer du doigt si toutefois ce cas arrive ?

  1. Le logiciel client, qui n’est qu’une porte d’entrée …

  2. Duniter, le coeur du systeme…

Les deux seront mis en cause et a mon avis a plus forte raison le coeur du systeme…
tout autant qu’il me semble indécent de proposer aux utilisateurs sans capacité d’analyse des codes sources des logiciels clients de leur dire : “vous avez un doute ? jetez un oeil sur le code”

Me concernant, je fais mon applis, donc peu m’importe ce que propose les autres logiciels à qui je ne jette pas la pierre, je peux gérer ce cas particulier, no problemo

Je pense également au fait que rien n’empeche de s’approprier les sources de ces applis clients, shunté le bouzin, proposer sous un même nom cette appli, en stipulant que c’est bien le code originel de l’auteur qui de faite, sera pointé du doigt…

Au final , si le parsing est effectué côté Duniter , la question est réglée.

Mais le problème existe sur toutes les crypto. Un logiciel client qui envoie la monnaie vers l’adresse AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, tu vas demande au “coeur du système” de vérifier que c’est une véritable adresse dont quelqu’un connait la clé ?

je parle bien du parsing de la fonction XHX
XHX((1234)
quand il y a besoin de unlock, ni + ni -

Tu n’as pas répondu à la question. Au maximum 30 mots suffisent.

Exemple : « Mon intention est de montrer que la fonction XHX ne fonctionne pas comme je pense qu’elle devrait fonctionner. ».

Mon intention premiere c’est de comprendre comment tout ca fonctionne :wink:
je lis la doc, je me fais une “image” de comment ca fonctionne,
et je test :slight_smile:

Mais une clé publique, qu’est-ce que c’est sinon un unlock asymétrique ?
Un XHX n’est qu’un unlock symétrique, ni plus, ni moins.

Il n’y a pas de raison valable de le corriger : si les clients et les serveurs respectent le protocole, tout fonctionne bien.