Doc protocol example tx format

Ola,

  1. Concernant l’exemple 1 de format de transaction ici => https://github.com/duniter/duniter/blob/master/doc/Protocol.md#example-1-2

dans la liste Outputs, je m’interroge si cela ne devrait pas être comme ca :

30:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)
0:0:SIG(HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY)

a la place de :

25:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)
5:0:SIG(HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY)

?


  1. Sur l’exemple 2 juste en dessous, la liste Inputs :

6:2:T:6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3:66
20:2:T:3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435:77

(le dernier chiffre relatif au numero de block) au lieu de :

6:2:6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3:0
20:2:T:3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435:10

?

et concernant le Output,
dans la mesure ou l’issuer va consommer l’ensemble de ses ressources <=> dépenser le montant total de son compte,
si c’est le cas, il n’est pas nécéssaire d’inscrire dans la liste “Outputs” quelque chose comme

0:2:SIG(key_issuer)

on peut confirmer ?


  1. l’exemple 3 ?

Exemple 1.

Non c’est bien 25. La somme des outputs est toujours égale a la somme des inputs, on a bien 30 qui devient 25+5 :slight_smile:

Si tu me doit 25 UNL mais que tu n’a pa de billet de 5 tu me donne 30UNL et que je t’en rend 5. Le bilan final c’est bien inputs : -30 pour toi et outputs : +5 pour toi et +25 pour moi

Exemple 2. Non T_INDEX ne correspond pas au numéro de bloc mais a l’index de la source dans la transaction d’origine. Lorsqu’une transaction a plusieurs outputs, chaque output a un index qui commence a zéro pour le premier puis qui s’incrémente selon l’ordre dans lequel les outputs sont écris dans la blockchain :slight_smile:

Donc dans l’exemple 2 on dit : “aller chercher la source correspondante au 11ème output de la transaction dont le hash est 3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435”

Par contre sur l’un des inputs il manque le type T effectivement je vais corriger ça :wink:

Non ce n’est pas nécessaire. Créer une nouvelle source de montant zéro n’aurait aucun sens. On ne stocke jamais le solde des comptes rappelle toi : le solde est défini par l’ensemble des sources actives (=pas consommés) si cet ensemble est vide on sait que le solde est zéro, pas besoin de le marquer en blockchain !

fait : https://github.com/duniter/duniter/commit/257328ea2afe573f71c17afe70b401d7a5850cdc

L’exemple n’est pas bon dans la doc, il est dit qu’on envoie 30 unités à BYfWYF, or c’est 25.

Si @elois tu veux bien corriger en même temps stp …

1 « J'aime »

fait : https://github.com/duniter/duniter/commit/169b9024672ca5d80baf9a9d6424fb0eaf054a32

1 « J'aime »

J’ai 2 points a signifier :

le 1er , concernant le formatage du document de transaction, chaque ligne etant séparé par un ‘\n’ dans les logiciels clients,
et que au vue de la doc sur l’api http et le retour a tx process, le champ “raw”’ induit en erreur et laisse penser que c’est ‘\r\n’ pour le composer…ici: https://github.com/duniter/duniter/blob/master/doc/HTTP_API.md#txprocess

2e point , j’ai effectuer des requetes curl pour test la signature,
je suis tombé sur :

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

qui me donne a penser que j’ai un soucis d’encodage, soit…

par contre je suis tombé sur une erreur comme :

{
“ucode”: 1002,
“message”: “Cannot read property ‘push’ of undefined”
}

dont je ne trouve pas la définition ici : https://github.com/duniter/duniter/blob/master/app/lib/common-libs/constants.ts#L129
et me semble plus liée à une erreur de JS…“cannot read…”

Oui c’est une erreur.

La définition de l’erreur 1002 est donnée ici, sur la branche dev. C’est en effet une erreur non contrôlée.

Tu devrais la voir plus en détail dans les logs de ton nœud Duniter, si tu en utilises un contrôlé par toi.

Aussi si tu reproduis l’erreur, ce serait bien que tu nous partage le document envoyé, quitte à remplacer quelques caractères de la signature pour empêcher qui que ce soit de voler les unités de monnaie afin que l’on puisse reproduire le cas systématiquement dans un test automatisé pour verrouiller un correctif.

le script bash se presente de la maniere suivante:

tx="mondoc_bien_formaté"
ev=$(python -c “import urllib; print urllib.quote_plus(’’’$tx’’’)”)
curl -H “Content-Type: application/x-www-form-urlencoded; charset=utf-8” -d “transaction=$ev” http://g1.duniter.org:10901/tx/process

pour l’instant je fais mes tests sur g1.duniter.org

a noté que depuis j’ai une erreur de signature :

“ucode”: 1002,
“message”: “Signature from a transaction must match”

de memoire (et si toutefois j’arrive a la reproduire) l’erreur 1002 etait liée aux differents tests que j’ai fait sur l’utilisation de python, tout comme j’avais le champ blockstamp = hash (erroné) au lieu de blockstamp=number + hash
j’ai testé plusieurs manip pour encode ma variable (ev) …
avec :

ev=$(python -c “import urllib; print urllib.quote(’’’$tx’’’)”)
ca me renvoyé des erreurs lors de la requete tx/process (ucode: 1005)

et un moment je suis tombé sur la 1002 (je ne sais plus comment)…


la mon probleme c’est surtout la signature qui est invalide, les différentes implementations de nacl / de l’algo ed25519 sont assez “flou”, entre l’usage du sha256 voir sha512, de comment recuperer ma cle privé en dur , c’est compliqué…


Au passage, c’est pas encore clair pour moi la situation suivante:

supposons que j’arrive a signé un document de transaction avec un numero de bloc 5000
que je garde cette transaction valide au chaud ^^
j’ai : blockstamp = 5000-HASH_BLOCK

que dans 1 semaine, 10 mois, 50 ans
je decide de faire une requete tx/process avec ce document, et par consequent ‘loin’ du block actuel en blockchain
on est bien d’accord qu’il sera rejeté ?
si oui il y a rejet, a quelle “distance” de block ma tx reste valide ?
ou dit autrement combien de “temps” je dispose pour envoyer une requete ?

Oui.

1 semaine :

https://github.com/duniter/duniter/blob/da85e4c3ba8e18a66b0c216335454473e1c205ae/app/lib/common-libs/constants.ts#L159

yop, erreur 1002 reproduite,
quand j’envois du bouzin, 500 fois le caratere A dans tx: (et 1 fois A aussi sort l’erreur 1002)

#!/bin/bash
dom="g1.duniter.org:10901"
tx=$(perl -e “printf 'A’x500”)
echo "$tx"
ev=$(python -c “import urllib; print urllib.quote_plus(’’’$tx\n’’’)” ) [erreur 1002 avec et sans le \n]
echo ""
echo ""
echo "$ev"
echo ""
echo ""
curl -v -H “Content-Type: application/x-www-form-urlencoded; charset=utf-8” -X POST -d “transaction=$ev” http://$dom/tx/process

ucode": 1002,
“message”: “Cannot read property ‘push’ of undefined”

1 « J'aime »

Merci, ticket #1139 créé et corrigé.

Le correctif sera déployé avec la 1.6.9 de Duniter.

Yop,

j’ai du mal a saisir “l’application” de la fonction de lock XHX
.https://github.com/duniter/duniter/blob/master/doc/Protocol.md#xhx-function

le cadre d’usage, pourquoi l’utiliser, quel est l’intérêt de composer un document avec cette fonction ?


concernant les 2 functions CSV et CLTV,
a y regarder cela me semble redondant, je n’arrive pas a discerner quels peuvent être les usages où l’on va préférer l’une a l’autre

CLTV => unlock at date
CSV => unlock after time elasped

CLTV => un trigger
CSV => un compte a rebours


PS @elois, je ne peux pas être présent au RML10

Ces fonctions ont été introduites dans le cadre du crosschain trading, autrement dit de faire du change inter-blockchain sans tiers de confiance. XHX ainsi que le champ timeout des transactions permet de faire ce type d’opérations.

Je t’invite à lire la description de ces fonctions dans le wiki Bitcoin, car dans Duniter elles sont identiques.

Ces fonctions ont été introduites dans le cadre du Lightning Network pour réaliser des paiements instantanés.

1 « J'aime »

Houston,
i’ve got a problem.

La situation est la suivante,

clé => compte en banque
7t38… => beaucoup de monnaie GT
m8zQ… => 0 GT
6H8L… => 0 GT

Je test l’utilisation de XHX selon le deroulement suivant :

7t38 envois 10 a m8zQ , puis m8zQ envois les 10 a 6H8L

7t38 crée un document de transaction tel que dans la liste outputs :
SIG(m8zQ) && XHX(sha256(1234))

ok, document enregistré et validé, visible dans l’historique de 7t38 comme derniere transaction:

une vue sur les sources de m8zQ avant et apres que le document soit enregistré:

m8zQ_sources

dès lors le document de 7t38 enregistré en blockchain,

je crée donc un document dont le but est que m8zQ débloque cette ressource et envois 10 unités a 6H8L

et la je patauge, je ne comprends pas pourquoi la source est « déjà consommé »…
et je ne vois pas comment m8zQ peut utiliser ces 10 unites verrouillé par 7t38.

1 « J'aime »

Peux-tu partager ici même le document de transaction complet ? Celui qui ne passe pas. Afin que j’essaye de reproduire sur un nœud local en mode debug.

https://pastebin.com/Lrn5X1JR

C’est bon j’ai trouvé, voici une excellente leçon ! :slight_smile:

La règle est : tout compte doit posséder au moins 1,00 Ğ1. Si celui-ci possède moins d’unités que cela, les unités restantes sont immédiatement détruites (« consommées »).

Tu as envoyé 0,1 Ğ1 sur le compte (SIG(m8zQ5XSE8NjF7wcrys2UjsssnmYzbHsTSnn2nfD2vqQ) && XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4)).

Celui-ci a donc immédiatement été nettoyé. :smiley:

Merci pour ce test !

je viens d’en faire un deuxieme,
avec comme lock uniquement XHX
cle 7t38 => milliers de GT
cle ANy => 1047 units
cle 4WF => 0

7t38 cree lock
20:0:XHX(6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B)

ANy test le document en direction de 4WF:

Issuers:
ANyDaYrQVFXd7XYrJs4bbuSWaYnP3mXGc5tWB9c4V5FY
Inputs:
20:0:T:B28939C91BBB386AD00B53566FFE73B250CE0982287CB1068FD119473D28B6F0:1
Unlocks:
0:XHX(1)
Outputs:
20:0:SIG(4WFGHpVuh9tw58Ft5N5kZA5UdshPxyCvN7NZu2Der5hR)

et duniter retourne 2015 Source already consumed

Oui, c’est ce que je viens de dire : tu as envoyé 0,20 Ğ1 cette fois sur un autre compte :

XHX(6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B))

Qui après l’opération, ne possédait que 0,20 Ğ1 => le compte est immédiatement nettoyé.

D’ailleurs ce compte se finit par 2 parenthèses, je ne sais pas si la monnaie aurait pu être débloquée même avec 1 Ğ1 dessus.

@Max rappelle toi que tout les montants sont exprimés en centimes dans les documents, donc il faut que tu envoi au moins 100 sur un compte si tu veut que ça fonctionne :wink: