On en vient donc à la base 2, dite binaire car nous avons deux chiffres : 0 et 1
0, 1, 10, 11, 100, 101, 110, 111, 1000, etc…
Si vous avez bien suivi, on a par exemple 7 en base 10 = 13 en base 4 = 111 en base 2
Simple non? On a fait le plus dur 🙂
Dans un smart contract, lorsque nous déclarons une variable représentant un nombre entier, nous devons préciser sa taille, c’est-à-dire son nombre de bits ou plus simplement le nombre de chiffres de sa représentation en base 2
Pourquoi? Car cela permet d’utiliser le moins de mémoire possible, prenons un cas concret
Vous faites une simulation d’un lancer de dés et vous voulez stocker le résultat dans une variable, sachant que le nombre du dés sera au maximum 6, donc 110 en base 2
il ne sera pas nécessaire de réserver autant de mémoire qu'un un nombre de taille 256, une taille 4 suffira (même de taille 3 mais on aime bien les puissances de 2 en informatique)
On arrive donc au problème d’overflow, que se passe-t-il lorsque nous faisons une addition et que le résultat et trop grand pour être contenu dans la taille choisie?
Supposons que nous avons une variable de taille 4 qui vaut 15 en base 10 donc 1111 en base 2
Nous souhaitons ajouter 1 à cette variable
Problème 1 : 1111 + 1 = 10000, 5 chiffres donc ça ne rentre pas dans notre variable de taille 4
Problème 2 : aucune erreur ne sera visible, pour le smart contract 1111 + 1 = 0
En effet, lorsque le résultat dépasse la taille maximum allouée, on boucle et on recommence de 0, on a fait ce qu'on appelle un overflow
L’overflow est un problème majeur car il peut potentiellement toucher tout ce qui concerne des nombres : le nombre de tokens que détient une adresse, des rewards de staking, …
Parlons rapidement de l’underflow, c’est comme l’overflow mais avec la soustraction
Supposons vous avez une variable de taille 4 qui vaut 0 et vous lui retirez 1, on va boucler dans l’autre sens !
0 - 1 = 1111 en base 2 = 15 en base 10 (le max possible en taille 4)
Vous voyez le problème, énumérons les solutions possibles :
1) Utiliser des tailles plus grandes (on utilise souvent la taille 256)
2) Utiliser une règle mathématique permettant de vérifier s’il y a eu overflow
La librairie OpenZeppelin en Solidity s'en charge en fournissant les méthodes .add, .sub, .mul, .div qui empêchent l’overflow et l’underflow en générant une erreur
3) Utiliser des types insensibles à ces problèmes, qui vont gérer différemment la mémoire : BigUInt sur Elrond par exemple
Voilà qui conclut ce thread, n’hésitez pas à partager, liker et follow ça me fera grandement plaisir 💪
• • •
Missing some Tweet in this thread? You can try to
force a refresh