Ist es möglich, Einheiten zu überlaufen?

Das Ethereum-Token-Tutorial hat eine Überprüfung auf einen uint256-Überlauf.

function transfer(address _to, uint256 _value) {
    /* Check if sender has balance and for overflows */
    if (balanceOf[msg.sender] < _value || balanceOf[_to] + _value < balanceOf[_to])
        throw;

    /* Add and subtract new balances */
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
}

Ich habe nirgendwo sonst Hinweise zum Schutz vor Uint-Overflows oder Sicherheitslücken in Verträgen gefunden. Es scheint, als wäre beides üblich, wenn dies ein Problem wäre.

Antworten (3)

Ja. Hier ist ein Beispiel für Uint-Überlauf und -Unterlauf.

contract C {
    // (2**256 - 1) + 1 = 0
    function overflow() returns (uint256 _overflow) {
        uint256 max = 2**256 - 1;
        return max + 1;
    }
    
    // 0 - 1 = 2**256 - 1
    function underflow() returns (uint256 _underflow) {
        uint256 min = 0;
        return min - 1;
    }
}

Sie können den Code hier ausführen: https://remix.ethereum.org/#version=soljson-latest.js&gist=30378c5375f388a28572dd18d58f787f

Breaking changes in solidity v0.8.0+, sie setzen Überläufe mit einem Standard-Panikfehler direkt aus der Dokumentation zurück... . Genauer gesagt, sie verwenden Fehlerdaten, die einem Funktionsaufruf von Panic(uint256) entsprechen, mit einem für die Umstände spezifischen Fehlercode."

Ja, ein Überlaufen ist möglich, und seien Sie besonders vorsichtig, wenn Sie var zum Beispiel Folgendes verwenden:

In for (var i = 0; i < arrayName.length; i++) { ... }ist der Typ von i uint8, da dies der kleinste Typ ist, der erforderlich ist, um den Wert 0 zu halten. Wenn das Array mehr als 255 Elemente hat, wird die Schleife nicht beendet.

Die Verwendung von uint i(256 Bit) vermeidet das Problem.

Hinweis: Das EVM lässt keine unendliche Berechnung zu, sodass die Schleife das gesamte Gas verbraucht und die Transaktion beendet wird, wobei die Gebühren weiterhin an den Miner gezahlt werden.

Seit Solidity v0.8.0+ ist es nicht mehr möglich, uints zu über- oder unterlaufen.

Wenn Sie die Antwort von @ Noah Thorp überprüfen, sehen Sie solidity will revertund werfen einen Fehler aus.

Direkt aus den Dokumenten :

Arithmetische Operationen kehren bei Unterlauf und Überlauf zurück. Sie können ungeprüftes { ... } verwenden, um das vorherige Umbruchverhalten zu verwenden.

Dies geschieht nun automatisch!