Proof-of-Identity

Salut,

J’ai jeté un oeil aux détails techniques de Duniter.

D’abord félicitations, vous avez créé à ma connaissance la première blockchain en Proof-of-Identity grâce à votre toile de confiance : être identifié (identité physique) donne droit à créer des blocks, tous autant que les autres.

Mais du coup je me demande pourquoi vous avez rajouté une sous-couche de Proof-of-Work dans votre Proof-of-Identity.
On dirait que vous n’avez pas voulu tirer au sort ceux qui auront le droit de créer un block, comme c’est fait dans pas mal de blockchains Proof-of-Stake et qui marche très bien (par exemple Tezos).
Du coup, vous avez ajouté un PoW avec une difficulté personnelle.
Sauf si vous avez ajouté des garde-fous que je n’ai pas vu, ça n’est pas sécurisé du tout, c’est presque équivalent à ce que chaque noeud choisisse tout simplement le moment où il va créer son prochain block.
Par exemple, si je veux attaquer le réseau, avec mes 10 amis malhonnetes et qui font tourner un noeud, on se coordonne pour qu’au même moment on ait tous exFact=1 et handicap=0, et à ce moment là on loue un peu de puissance de calcul pour pouvoir créer à peu près 10 blocks en 30 minutes pour réaliser un double-spend.
La PoW personnalisée n’y peut rien, et ne sert à rien. En laissant simplement les noeuds choisir quand ils créent les blocks, ça serait sujet aux mêmes attaques mais ne gaspillerait pas de l’énergie dans la PoW.

Ce qu’il vous faut c’est un algorithme de tirage au sort inclu dans le protocole, qui spécifie quelle identité a le droit de créer un block et quand. J’imagine que vous n’avez pas besoin de deposits, vu que vous pouvez bannir l’identité qui a fauté (double-baking dans Tezos).

Un petit détail sur le vocabulaire: selon moi, PoW, PoS ou Poi ne sont pas des algorithmes de consensus, mais des algorithmes de tirage au sort temporisé Sybil-résistant: c’est le mécanisme qui décide qui va avoir le droit de créer un block et quand. Le consensus c’est en général Nakamoto (heaviest chain rule) comme sur Bitcoin, mais ça peut être aussi plein d’autres algorithmes. C’est le mécanisme que chaque noeud va lancer pour savoir quel branche suivre dans les forks. Je n’ai pas trouvé le votre en regardant rapidement mais j’imagine que c’est Nakamoto aussi ? Il y a donc des blockchains PoW avec consensus de Nakamoto, comme Bitcoin, ou PoS et Nakamoto comme Tezos etc.

Je n’ai pas trouvé non plus d’infos sur la taille maximale des blocks ? Quelle est le nombre de transactions par seconde maximum que vous pouvez atteindre ?

Est-ce que vous avez publié ou vous comptez publier scientifiquement votre idée ? Ou est-ce que vous avez au moins un pdf en anglais qui détaille le projet, tous les paramètres, la WoT et les premières stats d’utilisation, histoire de pouvoir le citer ?
J’en ai pas trouvé mais j’ai pas cherché longtemps non plus.

Merci!

3 Likes

Je ne connais pour l’instant pas Tezos mais je n’ai pour l’instant pas vu de Proof of Stake vraiment sybil-resistant. Je jèterais un coup d’oeil quand j’aurais un peu plus de temps. Mais oui un tirage pseudo-aléatoire me semble mieux, notament avec l’avantage de 1 identité = 1 de stake.

Tout à fait, ça fait plaisir de lire ça alors que c’est souvent assez ambigue de manière générale dans l’univers crypto.


Pour le reste ça fait longtemps que je n’ai pas touché dans le détail le protocole de Duniter, donc je laisse la parole à quelqu’un d’autre. :slight_smile:

2 Likes

La taille d’un bloc est évolutive en fonction du précédent :

Quelle idée ? C’est pas clair. Tu parle de la théorie monétaire ou technologique de l’implémentation ?
Je suppose qu’il s’agit de la technologie de l’implémentation.
Il y a de beaux articles sur le blog qui détaillent bien ça.

1 Like

Parce qu’il fallait bien commencé quelque part, et qu’a l’époque personne n’avais en tête d’aternative tout aussi fiable.

Depuis il y a eu des réflexions, j’avais notamment fait des propositions ici :

Je pense aussi qu’on pourrai se passer de la PoW gràçe a la WoT mais il faudrait qu’on prenne le temps de réfléchir a une conception puis de réaliser une POC sur une nouvelle monnaie de test. Or aujourd’hui on n’est pas assez nombreux, pas suffisamment dispo a cause de nos taff UNL, et l’on a hélas des impératifs prioritaires pour maintenir la G1 en production :stuck_out_tongue:

1 Like

Hélas non mais ça nous est régulièrement demandé, si quelqu’un a envie de produire un tel document se serait une excellente contribution :slight_smile:

Sur la partie WoT il y a déjà un article détaillé en anglais ici : Duniter | Deep-dive into the Web of Trust

1 Like

C’est en quelque sorte l’idée, oui, au sens où l’on souhaite qu’il existe une rotation, un partage de l’écriture. Mais la PoW est uniquement là pour la synchronisation (= avoir une seule parole à la fois), pas pour la sécurité.

Déjà faire cela signifie partager sa clé privée de membre à un tiers, ce qui est dangereux, mais admettons. Admettons également que cette puissance soit très supérieure à la puissance de tout le reste du réseau.

Selon cette hypothèse tu pourrais créer 10 blocs d’affilée. Et ensuite ? Réaliser un double-spend ? Duniter ne prétend pas être au niveau paiement instantané, mais de niveau virement. Celui qui attend trop peu prend un risque, attaquants ou non : il peut tout simplement exister des forks aléatoires, sans la moindre volonté de nuire.

Donc, je ne vois pas de problème ici.

Le fait de tirer au sort ne changerait rien non plus dans l’hypothèse où les 10 attaquants partagent leur clé secrète et qu’au moins l’un d’eux est tiré à chaque tour.

Il existe sûrement de très bons algorithmes pour évacuer la PoW, mais encore une fois elle n’est pas là pour la sécurité. Et c’est la raison pour laquelle également, la consommation d’énergie n’est pas du tout du même ordre de grandeur que les autres crypto-monnaies, elle est largement plus faible (= 100W par nœud membre).

La véritable sécurité c’est : dans tous les cas et à tout instant, 1/3 des membres calculants sont exclus de l’écriture, et calculer un bloc ne donne pas droit à création monétaire. Puis, il existe des paliers (= handicap) afin de tenter de lisser le partage sur les 2/3 restants.

Bien sûr cette mécanique de sécurité peut être améliorée, nous en avons déjà parlé lors des RML12 concernant l’algorithme actuel, mais aussi d’autres propositions ont été faites sur ce forum depuis bien longtemps.

Pour l’instant, rien n’a été suffisamment convaincant pour être codé par quelque personne motivée, et encore moins adopté par les membres actuels de la Ğ1. Mais, comme dirait l’autre, y a qu’à.

Merci pour ta réponse. Je n’ai pas trouvé dans ce lien le détail du calcul et si il y a une limite haute.

Oui, j’imagine un pdf qui décrit précisément mais succinctement les choix d’implémentation, la WoT etc, comme point d’entrée à votre écosystème pour des chercheurs/devs en crypto non francophones.

D’accord, mais mon point est que ça n’est pas fiable. Cela étant dit, quand vous avez commencé ça ne devait pas être fréquent de trouver des blockchains PoS qui fonctionnent.

En effet c’est déjà énorme ce que vous avez fait avec votre WoT!
Sans réinventer la roue, aujourd’hui je pense que vous pourriez piquer l’algo de tirage pseudo-aléatoire à une de ces blockchains…

1 Like

Merci, oui c’est bien pour la WoT

1 Like

Le calcul est régi par la règle BR_G50 :

On pourrait s’en inspirer en effet, après notre protocole est quand même très spécifique, il y aurai forcément des adaptations a faire. Mais comme je l’ai dit, pour le moment ce n’est pas la priorité des contributeurs actuels, si de nouveaux contributeurs s’impliquent ça peut changer :wink:

Tirer au sort parmis les membres fait que tirer N=10 malhonnetes parmis 1700 personnes est très improbable, alors que avec la PoW individuelle, il faut finalement que de l’ordre de 1700*2/3 raspberries pour pouvoir créer une bonne partie des N prochains blocks.

Ah, je pensais que l’attente pour être sûr qu’une transaction est irréversible était du même ordre que la règle des 6 blocks généralement accepté dans Bitcoin par exemple.
Il me semble qu’avec ce mécanisme de PoW individuelle, pour avoir une transaction irréversible il faut attendre 5min x le nombre de membres supposés corrompus.
Un tirage au sort des identités par le protocole pourrait vous mettre au même niveau que les autres blockchains avec un temps de confirmation de l’ordre des 6 blocks.

D’ac, donc taille non bornée mais qui ne peut augmenter que doucement. J’aurais aussi mis une taille max par précaution…

Je comprends :grimacing: Merci pour les détails en tout cas!

Po (IWS) ne sont pas les consensus de leur blockchain mais elle y contribuent. car il y a une equivalence entre un consensus et un log d’execution ordonné il existe bien quelques hacks qui s’en passe mais bonne chance pour faire un consensus sans timestamp commun. ca n’est pas le consensus a proprement parlé mais c’est quand meme un peu une clef de voute du consensus

1 Like

D’abord le chiffre 1700, s’il doit représenter la réalité actuelle de la Ğ1, n’est pas bon. Il y a certes 1700 membres, mais seulement 30-40 membres qui calculent des blocs.

Si tu tires 10 parmi 1700 comme élus pouvant écrire le prochain bloc, la blockchain va très rapidement s’arrêter. Si tu tires 10 parmi 40 (reflet plus proche de la réalité), alors il y a des chances suffisamment grandes pour écrire une série de 10 blocs sans problèmes, et à plusieurs reprises.

D’où le fait que Duniter ne se repose pas sur le tirage au sort, mais plutôt sur la PoW personnalisée, excluante.

Certes tu peux le voir comme ça si tu veux. Mais comme le réseau est identifié, il suffit de l’observer et ainsi on peut utiliser la règle des 0 blocs. Par contre si un fork est observé, mieux vaut attendre sa résolution avant d’aller plus loin.

D’accord, donc computationellement ça coûte vraiment pas grand chose d’attaquer la chaîne pour écrire N blocks au moment où l’on veut, dans le but de réécrire l’histoire récente, à supposer qu’il y ait N attaquants, et que le consensus soit Nakamoto (est-ce que c’est le cas ?).

Mon point est justement que la PoW personnalisée n’apporte rien à ce problème.
Pour info, dans Tezos toutes les adresses ne sont pas tirées au sort d’office, les noeuds peuvent se signaler (c’est une opération qui s’inscrit sur la blockchain) pour être tiré au sort dans les prochains tirages, ce qui évite de tirer au sort des adresses qui ne font pas tourner un noeud.

C’est quoi la règle des 0 blocks ? Un fork peut ne pas être observé (attaque Selfish Mining).

J’aime bien l’idée, mais comment se protègent ils du spam de signalisation ?

1 Like

Non en effet ça ne coûte pas cher en capacité de calcul. Et le consensus actuel suit la règle 3 blocs + 15 minutes d’avance. Mais si l’on suppose N > 12 (et même moins), peu importe ces 15 minutes, c’est un détail qui n’aide que les forks honnêtes.

Mais grosso-modo oui, c’est possible de réécrire l’historique récent. Duniter lui-même refuse toutefois de dépiler des blocs au-delà de 100 dans le passé, mais ce n’est pas inscrit dans le protocole vu que ce n’est pas contrôlable.

Ce n’est pas la PoW personnalisée en elle-même qui tente de résoudre le problème, mais le fait qu’elle porte en elle une exclusion (1/3 des participants). On pourrait tout aussi bien exprimer cette exclusion sans passer par la PoW, c’est n’est qu’un medium.

Oui, c’est une piste qu’on envisage pour appliquer des contrôles sur ceux qui veulent écrire dans la blockchain. D’abord se signaler, puis prendre graduellement du pouvoir d’écriture.

Mais du coup, une fois que vous avez les tirés au sort, vous faites comment pour la synchronisation ? J’entends par-là le fait de se mettre d’accord sur le prochain bloc écrit. Est-ce une synchronisation active à la Algorand ? Est-ce de la PoW ? Autre chose ?

C’est une règle qui a cours jusqu’à maintenant sur la Ğ1 : étant donné que les participants son identifiés (blocs signés) et maillés socialement, alors :

  • une attaque par Selfish Mining est peu probable car leurs auteurs peuvent être contactés et retrouvés
  • en cas de précédent, la fenêtre de tir pour cette attaque devient connue, et donc on peut en déduire les moments où il existe un risque

Certes, c’est une règle dont la validité décroît à mesure que le nombre de membres augmente.