Wie funktionieren Überläufe in Solidität?

Ich habe gerade das Token-Level in Zeppelin's Ethernaut beendet und am Ende haben sie erklärt, dass Überläufe in Solidität sehr häufig sind. Ich habe nicht einmal an Überläufe gedacht, ich habe nur versucht, die Token zu stehlen.

Dies ist der Code, den sie zeigen:


Überläufe sind in der Solidität sehr häufig und müssen mit Kontrollanweisungen wie den folgenden überprüft werden:

if(a + c > a) {
a = a + c;
}

Eine einfachere Alternative ist die Verwendung der SafeMath-Bibliothek von OpenZeppelin, die automatisch alle mathematischen Operatoren auf Überläufe prüft. Der resultierende Code sieht so aus:

 a = a.add(c);

Bei einem Überlauf wird der Code zurückgesetzt.


Ich kann einfach nicht verstehen, was Überläufe in der Solidität sind. Kann mir bitte jemand eine Neuling-Erklärung darüber geben, was sie sind, oder mir einen Artikel zeigen, wo ich nachsehen kann. Danke!

Antworten (2)

Von https://programtheblockchain.com/posts/2018/04/27/avoiding-integer-overflows-safemath-isnt-enough/ :

Ganzzahlen mit fester Größe haben einen Wertebereich, den sie darstellen können. Beispielsweise kann eine 8-Bit-Ganzzahl ohne Vorzeichen Werte zwischen 0 und 255 (2^8-1) speichern. Wenn das Ergebnis einer Arithmetik außerhalb dieses unterstützten Bereichs liegt, tritt ein ganzzahliger Überlauf auf. Auf der Ethereum Virtual Machine (EVM) hat ein Integer-Überlauf zur Folge, dass die höchstwertigen Bits des Ergebnisses verloren gehen. Wenn Sie beispielsweise mit 8-Bit-Ganzzahlen ohne Vorzeichen arbeiten, wird 255 + 1 = 0. Dies ist im Binärformat einfacher zu erkennen, wo 1111 1111 + 0000 0001sein sollte 1 0000 0000, aber da nur 8 Bits verfügbar sind, geht das Bit ganz links verloren, was zu einem Wert von führt 0000 0000.

Intuitiv kann man sich den Effekt eines Integer-Überlaufs als „Wrapping-Around“-Wert vorstellen.

Vielen Dank @smarx, toller Artikel, genau das, was ich brauchte

Ein Überlauf liegt vor, wenn das Ergebnis einer binären Operation (dh einer Operation mit zwei Operanden) nicht in den Typ der Operanden passt (der größere Typ, wenn sie nicht identisch sind).

Zum Beispiel:

uint8 a = 43;
uint16 b = 65500;
uint32 c = a + b;

Im obigen Code sollte das Ergebnis that cis set to sein 65543.

Der Typ von ckann diesen Wert korrekt darstellen, aber das Ergebnis von wird in (den größeren Typ von und ) a + bberechnet , was diesen Wert nicht korrekt darstellen kann.uint16ab