[runtime-104] Bug critique ĞDev: substrate ne peut pas fonctionner correctement sans frais

Je vais devoir déployer un runtime 104 en urgence, car il reste encore un bug qui cause des états inconsistants:

Ce bug est causé par le fait que les frais de transaction dans la ĞDev sons forcés à zéro, or substrate n’a pas été prévu pour fonctionner sans frais de transactions, et ne peut pas fonctionner correctement sans, explications:

Tout extrinsic, qu’il réussisse où qu’il échoue, est intégré dans un bloc, sous deux conditions qui sont vérifiées AVANT d’exécuter l’extrinsic:

  1. Que la signature soit valide
  2. Que le signataire est suffisamment de fonds disponibles pour payer les frais maximums possibles, les frais maximums possibles étant calculés sans exécuter l’extrinsics, car ils dépendent uniquement de la longueur de l’extrinsic en octets, et du poids maximal de cet extrinsic (calculé grâce à la fonction générée par les benchmarks).

Si ces deux conditions sont vérifiées, alors l’extrinsic sera inclus dans le bloc, et le nonce du signataire sera incrémenté. Il est nécessaire d’intégrer l’extrinsic dans le bloc même s’il échoue, car si on intègre rien dans le bloc on ne peut pas prélever des frais au signataire, et l’on peut donc forcer un nœud à exécuter gratuitement une infinité d’extrinsics, en donc attaquer le réseau par déni de service.

Rien que pour ça il faut des frais, ces frais peuvent ensuite éventuellement être rendus au signataire à la fin de l’exécution de l’extrinsic si certaines conditions sont vérifiées (c’est là que l’on peut appliquer un quota gratuit pour les membres par exemple).

Mais l’absence de frais à d’autres conséquences, et notamment le buq #62.
En effet, s’il n’y a pas de frais, un extrinsic en échec sera toujours inscrit dans la blockchain, tant que la signature est valide, provoquant donc l’incrémentation du nonce, ce qui va mécaniquement créer le compte s’il n’existe pas.

En conséquence, on se retrouve avec un compte qui existe mais dont le solde vaut zéro, ce qui ne respecte pas la règle de l’ExistentialDeposit, et permet de remplir le storage onchain à l’infini, c’est un bug critique.

Je vais donc déployer en urgence un runtime-104, avec sudo directement (sans votes), avec le seul correctif possible: appliquer des frais d’au moins 1 centime par transaction.

Voici un test cucumber qui reproduit le bug #62:

Et voici la MR qui corrige le bug 62:

6 Likes

Le runtime upgrade s’est bien passé :partying_face:

J’ai essayé de reproduire le bug et il ne se produit plus, si j’essaye d’exécuter un extrinsic depuis un compte qui n’existe pas, j’ai bien une erreur dès la requête RPC, et rien n’est inscrit en blockchain, donc le compte n’est pas créé, ouf !

Maintenant qu’il n’y a enfin plus de bug connu qui corrompt le storage, je vais enfin pourvoir corriger le storage.

J’ai listé 8 comptes qui ont été créés en exploitant ce bug ou l’un des précédents, et qui n’ont donc pas payé la taxe de création de compte, et qui n’ont pas de random id, voici les 8 adresses concernées:

5FRCwaU7Tjc3C6pxwzNEo7423qFfknZaLaMAJTCXvzvx3gkm
5D2HHRj6zCEL9iY3CBpKy1mBMtpXUJCFDNvevBqVQAWdzqSS
5Co5AWcBiz4HaAEpu8BxLdghnCob89rFGU5yQ65WP3t2jsyB
5Ek4Ud2HLLJTVFCr2oi6RhR2HFvHCLXV2DfAvYhive7nKtJe
5G27hLdxFgtaZtwFDhs6iMp5fBgwCaoEXaKFJzk16wV6MhnG
5Chxv8CqEKGam6tDK4MJ3tnGePSkcgmTo1qkMTZuxiV2aPGN
5CwhqDT1fR9qKFaLu7TeFLaTkjLgobQVqNsZpxLXdbofe4Rb
5Ft59sefxZQdo6UCFXDc2SvDEBRbX9xXF1Ga7ukSwupMzRwL

Pour corriger le storage, je doit détruire ces 8 comptes, et verser à la trésorerie les ĞD qui se trouverait encore éventuellement dessus.

Je peut préparer un batch et le soumettre au vote, pour que vous puissiez voir comment se passe une correction du storage :slight_smile:

Je doit également y inclure la suppression de l’identité révoquée Elois2 de la pallet UdACcountStorage, pour qu’elle ne produise plus de DU. Je vais sans doute créer un sujet dédié à ce batch correctif !

7 Likes