Könnte jemand erklären, wie man eine solche Multiplikation durchführt? Ich meine, die Logik ist in Ordnung, aber was ist aus Sicherheitssicht wichtig?
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
Dies ist aus der dapphub-Bibliothek. Den Link habe ich hiermit eingefügt: https://github.com/dapphub/ds-math/blob/master/src/math.sol
Aus Sicherheitsgründen wird sichergestellt, dass nach der Multiplikation der zurückgegebene Wert nicht überläuft.
Angenommen, wir haben eine 8-Bit-Ganzzahl ohne Vorzeichen, die Werte von 0 bis 255 speichert. Die Multiplikation von 130*2
gibt also 260 zurück, und wenn es an der Zeit ist, sie in einer Variablen zu speichern, wird sie überlaufen und speichert den Wert 5
. Das require
fragliche überprüft also, ob wir, wenn wir die umgekehrte Operation durchführen, den Anfangswert erhalten sollten, was bei einem Überlauffehler nicht möglich ist.
y == 0
wird eine Ausnahme bei der Erkennung des obigen Falls sein, sodass der Code dies separat betrachtet.
Weitere Informationen: 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");
}
überprüft x-y <= x
und wenn Bedingung( x-y <= x
) wahr ist, kehre zurückz(x-y)
in dem Fall x-y > x
drucke das Protokoll "ds-math-sub-underflow" und wirf
Rohan Dhar
TLHBM
Rohan Dhar
TLHBM