Bug de synchro sur Ğ1-Test

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 :confused:

Conclusion : la blockchain Ğ1-Test est invalide depuis le block#133839 :roll_eyes:

6 Likes