Bug dans la matrice?

Je pense qu’il y a un gros bug dans le storage gdev.
Mon sujet révélateur ici est le compte de @Maaltir 5FPRZxVJGSzi8f8o5ue6uBbnQidMGm2XTLrESiQhWFJRLwdC :

{
  nonce: 34
  consumers: 0
  providers: 2
  sufficients: 1
  data: {
    free: 3,698,398,250,752
    reserved: 0
    feeFrozen: 0
    linkedIdty: 2,703
  }
}
{
  data: {
    firstEligibleUd: 1,628 <-- really??
  }
  nextCreatableIdentityOn: 4,043,576
  oldOwnerKey: [
    5GosZYTL75W3J4K8JvtRjeNBrYAz3tgEqxV1Si5XPurJScvz
    1,250,887
  ]
  ownerKey: 5FPRZxVJGSzi8f8o5ue6uBbnQidMGm2XTLrESiQhWFJRLwdC
  nextScheduled: 4,685,738
  status: NotMember
}

Celui-ci n’est plus membre depuis le 8 Décembre. Un claimUd a donc été fait automatiquement à cette occasion.

{
  "id": "5FPRZxVJGSzi8f8o5ue6uBbnQidMGm2XTLrESiQhWFJRLwdC",
  "balance": 3698398250752,
  "totalBalance": 3698398250752,
  "identity": {
    "name": "Maaltir",
    "isMember": false,
    "firstEligibleUd": 0,
    "udHistory": [
      {
        "timestamp": "2024-12-08T21:20:54.001+00:00"
      }
    ]
  },
  "linkedIdentity": {
    "accountId": "5FPRZxVJGSzi8f8o5ue6uBbnQidMGm2XTLrESiQhWFJRLwdC"
  }
}

Problème: Son solde réel balance.free contient bien l’ensemble de ses DU car le claimUd a été effectué au moment de sa perte d’adhésion, mais son firstEligibleUd vaut toujours 1628, alors qu’il devrait valoir 0, non ?

Je n’ai pas encore été vérifier dans le code de Duniter, je voulais d’abords savoir si il s’agit d’un gros bug, ou bien d’une mauvaise interprétation de ma part ?

Résultat pour Ğecko ou Duniter Portal, son solde est beaucoup trop élevé car les DU éligibles sont doublés:

On peut patcher ça côté client en rajoutant un check si le compte a une identité au statut membre avant de calculer les DU non réclamés, mais ça ne me semble pas normal, pour moi le comportement attendu est de passer le firstEligibleUd à 0 lorsque l’identité n’est plus membre.


PS: stp @Maaltir ne touche à rien sur ton compte avant qu’on ait éclaircie ce soucis, ça m’évite de devoir chercher un autre sujet.

Je viens de patch gecko avec un check isMember:

4 Likes

Je confirme que faire perdre le statut de membre donne les DU automatiques mais ne met pas firstEligibleUd à None donc on peut encore réclamer des DU après (claimUD vérifie que firstEligibleUd n’est pas None, mais pas qu’on est membre). (pour tester, en chaîne locale, supprimer toutes les certifications reçues par Bob)

Il devrait suffire de le mettre à None dans on_removed_member.

Dans les tests unitaires on vérifie que les non-membres ne peuvent pas réclamer, mais on ne teste pas le cas de la perte du statut de membre. Il faudrait ajouter ce test.

Merci pour ce bug !

Edit: issue créée universal dividend can be claimed by former member (#272) · Issues · nodes / rust / Duniter v2S · GitLab

5 Likes

Quand tu dis passer à None, est-ce que ça signifie que sa valeur sera 0 ? Toujours un entier non nullable hein?
Je préfèrerai que ça passe à 0 plutôt que null. L’index des DU commençant à 1 ça ne pose aucun problème.

1 Like

Ok, je ne touche à rien.
Il y a 2 ou 3 jours, j’ai remarqué que mon identité était expirée d’après gecko, (c’était quand j’ai voulu certifier @cypherfury) mais je n’ai pas vu le bouton ou lien pour renouveler mon adhésion.

Tu as bien la dernière version?

Ben oui, c’est ça, j’ai quelques versions de retard, je suis encore sur V0.1.12+1084…

Bon, je touche toujours à rien, je vous laisse voir le bug…
J’attends votre feu vert pour faire quelque chose…

1 Like

Du coup tu confirmes que tu vois bien le bouton de renouvellement sur la page de ton wallet membre?

Tu dois le voir 20 jours avant expiration. Mais je n’ai pas testé si tu le vois toujours après expiration…

Je vais télécharger la dernière version et je regarderais.
Mais pas tout de suite, j’ai des trucs sur le feu.

1 Like

C’est bien une Option donc None != Some(0), et on se sert du None dans la logique. Certes on pourrait utiliser 0 comme None mais question logique ça rend les choses moins claires, et si on change les calculs plus tard on aura des problèmes. C’est l’esprit Rust d’utiliser le typage pour les différences qualitatives, comme ça le None est testé par pattern matching plutôt que par une égalité, et une erreur arithmétique ne pourra jamais faire passer de Some à None ou inversement.

None signifie l’inéligibilité au DU.

Après j’avoue que ce n’est pas très clair, je préférerais que la palette UD demande à membership qui est membre (via un provider en Config), comme ça on est absolument sûr que membre=DU. Je ne sais plus s’il y avait une raison à la structure actuelle de stocker ça dans l’identité.

Je vais proposer un correctif dans la semaine.

1 Like

J’attends encore un peu avec de renouveler mon adhésion ?

Non tu peux y aller, de toute façon j’ai patché ce comportement côté client, sur tous les clients que je maintiens…

Merci @poka pour la détection de ce bug critique et @tuxmain pour sa correction dans !299 !

3 Likes

Par contre, il y a un autre bug critique, cette fois-ci au genesis.

2 Likes

Je ne savais même pas qu’on ajoutait des identités non membres au genesis.

edit: ah oui car ils peuvent être non membre et avoir des certifications encore valides pour l’inertie de la toile, c’est vrai.

1 Like

Well done :clap: un “vilain quack” repéré et corrigé :rocket:

Quel est le truc pour le genesys ? Le saut de toile en toile ?

A priori, pour initialiser il faut 5x5 “certifications croisées” …