¿Alguien podría explicar el uso de realizar una multiplicación como esta? Quiero decir que la lógica está bien, pero ¿cuál es la importancia desde el punto de vista de la seguridad?
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
Esto es de la biblioteca dapphub. He incluido el enlace adjunto: https://github.com/dapphub/ds-math/blob/master/src/math.sol
Desde el punto de vista de la seguridad, garantiza que después de la multiplicación, el valor devuelto no se desborde.
Supongamos que tenemos un entero sin signo de 8 bits que almacena valores de 0 a 255. Entonces, la multiplicación de 130*2
devolverá 260 y cuando sea el momento de almacenarlo en la variable, se desbordará y almacenará el valor 5
. Entonces, esto require
en cuestión verifica que si realizamos la operación inversa, deberíamos obtener el valor inicial que no será posible en el error de desbordamiento.
y == 0
será una excepción en la detección del caso anterior, por lo que el código lo está considerando por separado.
Para obtener más información: https://consensys.github.io/smart-contract-best-practices/known_attacks/#integer-overflow-and-underflow
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
comprueba x-y <= x
y si la condición ( x-y <= x
) es verdadera, devuelvez(x-y)
en el caso x-y > x
, imprima el registro "ds-math-sub-underflow" y arroje
Rohan Dar
TLHBM
Rohan Dar
TLHBM