Prévenir les débordements

Amélioration de la sécurité des contrats : débordements par le haut et par le bas

Nous allons voir une fonctionnalité de sécurité majeure à prendre en compte quand vous écrivez des smart contracts : Prévenir les débordements.

C'est quoi un débordement ?

Imaginez un uint8, qui peut seulement avoir 8 bits. Ce qui veut dire que le binaire du plus grand nombre que l'on peut stocker est 11111111 (ou en décimal, 2^8 -1 = 255).

Regardez le code suivant. A quoi est égal number à la fin ?

uint8 number = 255;
number++;

Dans ce cas, nous avons causé un débordement par le haut - number est contre-intuitivement égal à 0 maintenant, même si on l'a augmenté. (Si vous ajoutez 1 au binaire 1111111, il repart à 00000000, comme une horloge qui passe de 23:59 à 00:00).

Un débordement par le bas est similaire, si vous soustrayez 1 d'un uint8 égal 0, le résultat sera 255 (car les uint sont non signés et ne peuvent pas être négatifs).

Nous n'utilisons pas de uint8 ici, et il paraît peut probable qu'un uint256 débordera avec des incrémentations de 1 par 1 (2^256 est un nombre très grand), mais c'est toujours bon de protéger notre contrat afin que notre DApp n'est pas des comportements inattendus dans le futur.

Utiliser SafeMath

Pour prévenir cela, OpenZeppelin a créé une bibliothèque appelée SafeMath qui empêche ces problèmes.

Mais d'abord, c'est quoi une bibliothèque ?

Une bibliothèque est un type de contrat spécial en Solidity. Une de leurs fonctionnalités est que cela permet de rajouter des fonctions à un type de donnée native.

Par exemple. avec la bibliothèque SafeMath, nous allons utiliser la syntaxe using SafeMath for uint256. La bibliothèque SafeMath à 4 fonctions — addsubmul, et div. Et maintenant nous pouvons utiliser ces fonctions à partir d'un uint256 en faisant :

using SafeMath for uint256;

uint256 a = 5;
uint256 b = a.add(3);
// 5 + 3 = 8
uint256 c = a.mul(2);
// 5 * 2 = 10

Nous verrons ce que font ces fonctions dans le prochain chapitre, pour l'instant, nous allons ajouter la bibliothèque SafeMath à notre contrat.