DappHub Multiply-Funktion

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

Antworten (2)

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*2gibt 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 requirefragliche ü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 == 0wird 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 <= xund wenn Bedingung( x-y <= x) wahr ist, kehre zurückz(x-y)

in dem Fall x-y > xdrucke das Protokoll "ds-math-sub-underflow" und wirf

Ich verstehe die Logik. Logik ist kein Problem. Ich habe es in meiner Frage erwähnt. Was ich verstehen muss, ist, warum wir das tun müssen? Warum nicht einfach x*y? Was sind die Auswirkungen aus sicherheitstechnischer Sicht?
ein Unfall [ medium.com/smartmesh/… passiert
Auf den Link konnte nicht zugegriffen werden. Sagt 404