Umgang mit Parameterüberlauf

Kann der Parameterüberlauf im Vertrag verhindert werden oder muss er am Frontend behandelt werden?

Solidität:

contract parameterOverflows {

    uint8 selectedCharacter;

    modifier onlyCharacter(uint8 _character) {
        require(_character < 256);
           _;
    }

    function selectCharacter(uint8 _character) public onlyCharacter(_character) {
        selectedCharacter = _character;
    }

}

Wenn selectCharacter(257) aufgerufen wird, wird selectedCharacter zu 1, weil (glaube ich) die 257 auf 1 überläuft.

Dies könnte verhindert werden, indem die Funktion einfach nicht mit irgendetwas außerhalb des beabsichtigten Bereichs aufgerufen wird, aber ist es möglich, dies vom Vertrag aus zu verhindern? Wo genau passiert der Überlauf?

Antworten (1)

Ändern Sie einfach den Typ Ihres Parameters, um alle uint zu akzeptieren, damit Sie den Überlauf verhindern und Ihre Assertion durchführen können.

contract parameterOverflows {

    uint8 public selectedCharacter;

    modifier onlyCharacter(uint _character) {
        require(_character <= 255);
           _;
    }

    function selectCharacter(uint _character) public onlyCharacter(_character) {
        selectedCharacter = uint8(_character);
    }

}
Würde nicht 256auch überlaufen? uint8 geht von 0-255
Oh, ja, ich habe nur den Operationscode kopiert, aber Sie haben Recht. Code aktualisiert