Parser verify transaction

Yop,

je m’interroge sur cette methode _verify,

  1. la condition ligne 48 est toujours vraie <=> l’instanciation de la variable “err” ligne 43 et de son initialisation à null.

  2. ligne 54, la clé “code” , je suppose qu’elle devrait avoir comme valeur “NO_BLOCKSTAMP”

  3. en l’état, si j’ai toutefois les deux erreurs qui surviennent , seul celle concernant le blockstamp va être retournée sans avoir connaissance de celle concernant la version, on execute la ligne 51 puis la ligne 54 et cette derniere ecrase l’information. (pourquoi pas…)

ne sachant pas comment tu gères le retour de la fonction (par ailleurs si elle est utilisée) je te propose toutefois de la reduire, a savoir si ces variables n’ont pas besoin d’être déclarées, les supprimer, de maniere a ne garder que les deux conditions et de retourner l’objet aussitôt l’erreur rencontrée :

if ( !a || !b )
    return {code: 150, message: "Version unknown"};
if ( !c || !d )
    return {code: 151, message: "Blockstamp is required"};
return false;

Enfin, ayant réalisé ma 1ere transac :wink:
je me demande si il y a un parsing qui n’est peut etre pas tout a fait exact ou si cela vient de python,

j’ai effectué mon 1er test avec la ligne suivante du champ “Comment” :

Comment: Merci pour la contribution, 1er test tx @ 15:11:24-05/10/17

avec des caracteres respectant le protocole duniter/doc/Protocol.md at master · duniter/duniter · GitHub

encodé avec la lib python décrite dans ce poste Doc protocol example tx format - #10 by Max

ca donne

Comment%3A+Merci+pour+la+contribution%2C+1er+test+tx+%40+15%3A20%3A22-05%2F10%2F17%0A

et je fusse gentillement recalé :

“ucode”: 1005,
“message”: “Document has unkown fields or wrong line ending format”

1 Like

Oui tes interrogations et propositions de correction sont fondées, il s’agit d’une très vieille implémentation vérifiant le format d’une transaction. En fait la fonction est redondante avec d’autres vérifications plus lointaines.

J’ai gardé ces vérifications car elles interviennent très tôt dans le contrôle et évite des traitements plus lourds ensuite. Ce parser tout comme ses collègues mériteraient largement un refactoring général, avec un fonctionnement plus clair et explicite.

Voici le ticket #1143 pour ne pas oublier.

Tu as inscrit :

Comment%3A+Merci+pour+la+contribution%2C+1er+test+tx+%40+15%3A20%3A22-05%2F10%2F17%0A

Ç’aurait dû être :

Comment: Merci+pour+la+contribution%2C+1er+test+tx+%40+15%3A20%3A22-05%2F10%2F17%0A

En effet tu modifiais le délimiteur du champ qui est Comment: .

pour + de précision,

j’ai eu le retour ucode 1005 :

avec cette phrase de commentaire:

alors que la phrase suivante à validé la transaction avec le meme encodage:

Comment: Merci pour la contribution

d’où mon étonnement…

Mais du coup tu as compris l’erreur et comment la corriger ?

Non, je n’ai pas capté et je n’ai pas regardé pourquoi elle ne passe pas la 1ere string…
a voir si ca vient de la regex…

https://github.com/duniter/duniter/blob/dev/app/lib/common-libs/constants.ts#L26
https://github.com/duniter/duniter/blob/dev/app/lib/common-libs/parsers/transaction.ts#L15

Je t’ai pourtant donné explicitement la réponse plus haut.

Je crois avoir compris ce que tu m’as dit ,

cependant entre les 2 tests j’ai changé une partie du commentaire qui n’a rien a voir avec le début de la ligne c’est pour ca que je suis confus, ca me semble étonnant (c’est surement python…)

je ferais d’autres tests de mon coté voir ce que ca donne en recommencant et voir l’encodage qui doit me mettre dedans…


je ferais mes prochains tests sur gtest

je ne garantis pas que ca fail toujours, voila le script tel que ma variable ev est en parametre de curl :

#!/bin/bash
mdate=$(date '+%H:%M:%S-%d/%m/%y')
comment="Merci pour la contribution"
tx=$(printf "Comment: $comment")
echo "$tx"
echo ""
ev=$(python -c "import urllib; print urllib.quote_plus('''$tx\n''')" )
echo "$ev"   ### <====== OK
echo ""
comment="Merci pour la contribution, 1er test tx @ $mdate"
tx=$(printf "Comment: $comment")
echo "$tx"
echo ""
ev=$(python -c "import urllib; print urllib.quote_plus('''$tx\n''')" )
echo "$ev" ### <===== FAIL

Tu as analysé le comportement avec la lib python-duniter-api qui est testée et validée ?