Eh bien en fait c’était plus subtil. La réduction automatique n’était pas en cause car au final elle ne supprimait rien dans le CINDEX.
Non, en fait c’est le dépilement de bloc (bug#1396) : lors d’une résolution de fork, Duniter dépile les blocs pour annuler les modifications introduites par eux.
Or, dans le cas de certifications renouvelées avant terme Duniter supprimait le lien existant entre l’émetteur et le receveur, alors que pourtant ce lien existe toujours puisque même si le renouvellement est supprimé, l’ancienne certification est bien entendu toujours valable !
De ce fait pour GerardSiegle si nous rejouons la situation : état au bloc #284604 :
duniter sync g1.cgeek.fr 284604
┌─────┬────────┬──────────────────┬────────────┬─────────────────┬────────────┬────────────┬──────────────┬───────────────┐
│ row │ op │ issuer │ created_on │ written_on │ expires_on │ expired_on │ chainable_on │ replayable_on │
│ 0 │ CREATE │ CharlesAbecassis │ 96364 │ 96857-000000408 │ 1582171975 │ 0 │ 1519634701 │ 1524462301 │
│ 1 │ CREATE │ loanblanchard │ 103654 │ 106456-000001A4 │ 1584427318 │ 0 │ 1522609561 │ 1527437161 │
└─────┴────────┴──────────────────┴────────────┴─────────────────┴────────────┴────────────┴──────────────┴───────────────┘
Puis, on applique le bloc qui contient les certifications dont 1 renouvellement de CharlesAbecassis :
duniter pull g1.cgeek.fr 284605
┌─────┬────────┬──────────────────┬────────────┬─────────────────┬────────────┬────────────┬──────────────┬───────────────┐
│ row │ op │ issuer │ created_on │ written_on │ expires_on │ expired_on │ chainable_on │ replayable_on │
│ 0 │ CREATE │ CharlesAbecassis │ 96364 │ 96857-000000408 │ 1582171975 │ 0 │ 1519634701 │ 1524462301 │
│ 1 │ CREATE │ loanblanchard │ 103654 │ 106456-000001A4 │ 1584427318 │ 0 │ 1522609561 │ 1527437161 │
│ 2 │ CREATE │ AlainLebrun │ 284266 │ 284605-000001A7 │ 1640737001 │ 0 │ 1578165360 │ 1582992960 │
│ 3 │ CREATE │ CharlesAbecassis │ 278986 │ 284605-000001A7 │ 1639117359 │ 0 │ 1578165360 │ 1582992960 │
│ 4 │ CREATE │ AnneAmbles │ 282287 │ 284605-000001A7 │ 1640145167 │ 0 │ 1578165360 │ 1582992960 │
└─────┴────────┴──────────────────┴────────────┴─────────────────┴────────────┴────────────┴──────────────┴───────────────┘
Jusque-là “tout va bien” : CharlesAbecassis a bien sa certification comptée en double par Duniter : c’est conforme au protocole v11 (mais pas à la licence).
Si je revert le bloc :
duniter revert 1
Alors au moment de l’exécution de la règle BR_G27, Duniter voit :
┌─────┬────────┬──────────────────┬────────────┬─────────────────┬────────────┬────────────┬──────────────┬───────────────┐
│ row │ op │ issuer │ created_on │ written_on │ expires_on │ expired_on │ chainable_on │ replayable_on │
│ 0 │ CREATE │ loanblanchard │ 103654 │ 106456-000001A4 │ 1584427318 │ 0 │ 1522609561 │ 1527437161 │
└─────┴────────┴──────────────────┴────────────┴─────────────────┴────────────┴────────────┴──────────────┴───────────────┘
En effet le revert
a supprimé le lien existant entre GerardSiegle et CharlesAbecassis . Pourtant le CINDEX affiché est toujours bon, mais c’est en interne que la BDD est incohérente.
Conséquences
Comme indiqué dans le ticket du bug#1396 :
- Conséquence 1 : BR_G27 : les forks qui dépilent des renouvellements anticipés de certification créent potentiellement une situation de rejet d’un bloc pourtant accepté précédemment dans lequel un utilisateur pourtant légitime à entrer (relativement au protocole v11). Ce rejet dépend de la situation du membre par rapport à la limite des 5 certifications.
- Conséquence 2 : BR_G95 : les forks qui dépilent des renouvellements anticipés de certification peuvent exclure à tort des membres trop proches de la limite des 5 certifications.
Il n’est pas du tout exclu que cela se soit déjà produit.
À noter enfin que la règle de distance n’est pas affectée par cette anomalie, les liens sont toujours bien présents dans le module de calcul de WoT.
Correctif
Le correctif viendra cette semaine, avec le test automatisé de verrou. Il m’a déjà fallu un dimanche entier pour débusquer l’anomalie à cause d’une fausse piste, je suppose qu’il me faudra une autre journée pour commiter le correctif + test + commandes de débogage qui m’ont aidé (notamment celle qui vous affiche ces beaux tableaux d’INDEX).