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.
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
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, uint
s zu über- oder unterlaufen.
Wenn Sie die Antwort von @ Noah Thorp überprüfen, sehen Sie solidity will revert
und 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!
Drachen der fünften Dimension