Pour info, je pense avoir trouvé le bug : il se produit pour les membres ayant été exclu par défaut de renouvellement puis s’étant renouvelés pour redevenir membre et se font une nouvelle fois exclure.
Dans ce cas, le champ m_index.expired_on
devrait être réinitialisé lors du renouvellement, notamment pour que la règle BR_G26 fonctionne, or il ne l’était pas :
// Join back
pushMindex(index, {
index: constants.M_INDEX,
op: constants.IDX_UPDATE,
pub: ms.issuer,
created_on: [ms.number, ms.fpr].join('-'),
written_on: [block.number, block.hash].join('-'),
writtenOn: block.number,
age: 0,
unchainables: 0,
type: 'JOIN',
expires_on: conf.msValidity,
expired_on: null, // <------- Devrait être valorisé à `0`, pas `null` !
revokes_on: conf.msValidity * constants.REVOCATION_FACTOR,
revocation: null,
chainable_on: block.medianTime + conf.msPeriod,
revoked_on: null,
leaving: null
})
Or vu que le membre déjà exclu une fois n’a pas son champ expired_on
remis à 0 convenablement, la règle d’exclusion BR_G93 - Membership expiry ne s’applique pas correctement pour la 2ème exclusion (et pour toutes les exclusions suivantes en fait) :
If MS.expired_on == null OR MS.expired_on == 0, add a new LOCAL_MINDEX entry:
MINDEX (
op = ‘UPDATE’
pub = MS.pub
written_on = BLOCKSTAMP
expired_on = HEAD.medianTime
)
Et donc quand Duniter voit passer un bloc qui exclu le membre, il ne comprend pas et refuse l’exclusion.
Concernant le bug relevé par Inso
Par conséquent, comme la BR_G93 n’est pas correctement appliquée : il manque aussi des exclusions pour ceux s’étant déjà fait exclure
Conclusion : la blockchain Ğ1-Test est invalide depuis le block#133839