Contexte
Une des difficultés de l’indexeur est de garder un index complet incluant des données supprimées sur Duniter à des fins d’historique. Un exemple avec ce bug : Bug subsquid - #5 by HugoTrentesaux.
Tu noteras les champs account et accountRemoved dans le schéma schema.graphql · main · nodes / duniter-squid · GitLab :
"Identity"
type Identity @entity {
"Identity index"
index: Int! @index @unique
"Current account"
# should be null for a removed identity and only in this case
account: Account @unique
"Let track the account in case identity was removed"
# should be non null for a removed identity and only in this case
accountRemoved: Account
"Name"
name: String! @index
Le champ account porte la contrainte @unique mais Duniter ne force cette contrainte que pendant un certain temps. Quand l’identité est supprimée, une autre peut être créée en utilisant le même account. Que doit faire l’indexeur dans ce cas ?
C’est pour ça que dans account, identity est unique (Identity) alors que removedIdentities est multiple ([Identity]).
"Account table identified by its ss58 address"
type Account @entity {
"current account for the identity"
identity: Identity @derivedFrom(field: "account")
"removed identities on this account"
# they are handled apart to avoid dropping the @unique constraint of account
removedIdentities: [Identity] @derivedFrom(field: "accountRemoved")
Il y aura le même problème quand on décidera de libérer des pseudos pour réutilisation. Pour l’instant, tous les outils partent du principe que [un pseudo = une identité]. Mais si Duniter libère le pseudo d’une identité supprimée il est possible qu’une autre identité l’utilise après. Dans ce cas l’indexeur devra faire la même chose : ajouter un champ nameRemoved pour garder une trace des anciennes identités qui ont utilisé ce pseudo.
Réponse
Oui, et uniquement pour les identités qui ont été supprimées de Duniter :
Tu peux donc réutiliser la même clé pour créer une autre identité sans faire crasher l’indexeur et en conservant la contrainte @unique qu’il serait très gênant d’abandonner.