Les frais d'extrinsics

Ce sujet est connexe à : Les transactions - #10 by kimamila à propos des frais de transactions.

Un point de Substrate qui diffère de Duniter v1 : un bloc peut contenir des extrinsics invalides, c-à-d qui ne sont pas légitimes du point de vue du protocole. Par exemple, une transaction qui tente d’envoyer de la monnaie sans avoir les fonds suffisants.

Dans Duniter v1, un tel bloc était purement et simplement rejeté.

:warning: attention, ce sujet ne traite pas des extrinsics qui planteraient à cause d’un bug. Dans un tel cas, le bloc entier est rejeté dans Substrate.

Pourquoi Substrate autorise-t-il des extrinsics invalides ?

Substrate implémente ce comportement mais avec des frais en tant que mécanisme anti-DoS.

En effet, que les transactions soient légitimes ou non, les nœuds vont devoir dépenser du temps pour tenter de les intégrer. Mais si les transactions sont toujours illégitimes parce qu’émises par un attaquant et que celles-ci n’ont qu’un coût marginal à être produites, alors il s’agit d’une faille permettant une attaque de type DoS.

Le fait de toujours inclure un extrinsic tout en encaissant systématiquement des frais avant d’exécuter la transaction donne un coût à l’attaque, qui devient circonscrite à la taille du portefeuille de l’attaquant. Ce portefeuille sert de caution.

Et si l’émetteur n’a pas les fonds ?

Il n’y aura pas de tentative d’exécution de la transaction, ce qui économise déjà les ressources que celle-ci aurait consommé sur le nœud qui reçoit la transaction.

De plus, la transaction n’est pas répliquée sur le réseau par les nœuds (honnêtes), sauf si celle-ci va jusqu’à être incluse dans un bloc par un forgeron attaquant. Là, oui, tout le réseau utilise des ressources pour rien. Mais dans ce cas, il est possible d’avoir des règles punitives pour le forgeron lui-même pour avoir inclus une transaction illégitime et sans caution. Il se peut qu’il faille intégrer dans le protocole que tout forgeron doit mettre en jeu une caution pour pouvoir participer à forger des blocs.

Quid des documents de WoT ?

Plus généralement, cette mécanique anti-DOS s’applique à tout extrinsic par défaut. Mais nous pouvons tout à fait autoriser les certifications et autres adhésions à ne pas avoir de frais.

Néanmoins, rappelons-nous que ces documents sont tout aussi susceptibles d’aboutir à une attaque. Le plus dangereux est le document d’adhésion qui génère de gros calculs de distance, très coûteux en CPU et RAM.

Alors que faire ? Une possibilité serait d’avoir des frais, oui, mais retournés en cas de succès de l’opération. C’est l’une des solutions préconisées par Substrate.

Mais attention là encore :slight_smile: car cela induira des conséquences pour les utilisateurs :

  • qui certifient sans faire attention (ou sans être prévenu par leur application !) et publient une certification qui n’aboutira pas : cela leur coûtera des Ğ1
  • qui renouvellent trop tôt
  • etc.

Et notamment en cas de bug du client, c’est le portefeuille qui va souffrir ! Ce qui est déjà vrai d’un client qui manipule des comptes de toute façon.

Bref, il reste à bien définir tout cela.

10 Likes

Si des actions sur la WOT peuvent induire des frais si elles n’aboutissent pas, ce serait sympa que les clients préviennent qu’une action risque de ne pas aboutir et que cela entrainera des frais.

Les punitions contre les forgerons pourraient aussi être une interdiction temporaire de la forge, non ? C’est plus cohérent et ça évite de créer un “droit au DoS” croissant avec la richesse. (comme avec le principe du pollueur-payeur, où les industriels ont parfois plus intérêt à polluer et payer de faibles taxes qu’à payer les traitements écologiques)

Pour limiter ce risque on peut aussi faire les calculs et vérifier côté client (si la machine le permet), ou avec des services externes (comme une API wotwizard). Avec toujours l’avertissement, au cas où.

3 Likes

Oui tout à fait, avoir du civil et du pénal, afin d’avoir une réponse proportionnée aux faits. Idem pour les émetteurs d’extrinsics.

Il reste à bien définir tout cela, pour l’instant c’est encore en réflexion.

Oui car on peut imaginer le cas où il y a eu un fork par exemple, que les certifications ont été émises sur une branche perdue depuis. Il ne faudrait pas pénaliser l’utilisateur honnête.

3 Likes

Notez que même si les frais sont rendus à l’utilisateur en cas de succès, cela nécessite tout de même que l’utilisateur possède le solde nécessaire pour payer les frais.
Dans tous les cas donc, un utilisateur qui n’a pas de monnaie ne pourra rien faire.

Je propose de commencer sans frais, plus précisément d’avoir une fonction de conversion des poids en frais qui retourne toujours zéro.
À noter que l’on devra quand même étalonner dès le début les «poids» de chaque extrinsic, car cela est nécessaire pour déterminer jusqu’où un bloc peut être rempli.

Le jour ou l’on commencera à avoir des problèmes de charge, il nous suffira de modifier la fonction de conversion du poids en frais, il faudra alors juste systématiser l’envoi d’un petit don aux nouveaux pour qu’ils puissent exécuter quelques extrinsics avant d’avoir leur premier DU.

2 Likes

Il n’y a que l’identité et l’adhésion initiale qui requièrent d’avoir zéro frais.

Pour tout le reste, et surtout le renouvellement d’adhésion qui implique le coûteux calcul de distance, il faudrait qu’il y en ait.

1 Like

Mais si cette adhésion initiale nécessite d’abord un parrainage (comme j’en ai vu la possibilité sur d’autres messages), elle peut aussi être liée au paiement d’une caution par le parrain.

Oui, et c’est ce que suggère aussi Eloïs ci-dessus.