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:
- Que la signature soit valide
- 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: