Lokaler Solidity-Validierungsaufruf vor dem Senden einer Zustandsänderungstransaktion

Ich habe einen Anwendungsfall, bei dem der Benutzer in der Lage sein sollte, den Status eines Vertrags nur zu ändern, wenn die Eingaben eine Validierungsprüfung bestehen. Die Validierungen sind jedoch teuer in der Durchführung und können lokal durchgeführt werden, da sie nur von den Funktionsparametern abhängen. Ist es möglich, die Validierung mit einem Vertragsaufruf durchzuführen und dann, wenn sie bestanden wird, die zustandsändernde Transaktion mit einer Sendetransaktion zu übertragen?

Das ist das Beispiel, das ich im Sinn habe:

contract A {

    uint8 stateVariable = 0;

    //constant callable function for expensive verification
    function constantVerifier(uint8 param) constant {
        //expensive verification
        require(param <= 5);
        //broadcast transaction to change state of this instance
        A(this).changeState();
    }

    //state changing function
    function changeState() {
        //only this contract allowed to change state
        require(msg.sender == address(this));
        //change state
        stateVariable++;
    }
}

Dieses spezielle Snippet ändert den Status nicht. Ist es möglich, so etwas in Solidity zu erreichen? Was ist im Allgemeinen das Entwurfsmuster, um teure Überprüfungen durchzuführen, bevor der Vertragsstatus geändert wird?

Antworten (1)

Sie können aufteilen constantVerifier, um eine teure Überprüfung zu vermeiden. Der Code wie folgt:

contract A {

    uint8 stateVariable = 0;

    //constant callable function for expensive verification
    function constantVerifier(uint8 param) constant returns (bool){
        if (param <= 5) {
            return true;
        }
        return false;
    }

    //state changing function
    function changeState() {
        //only this contract allowed to change state
        require(msg.sender == address(this));
        //change state
        stateVariable++;
    }

}

Zuerst sollten Sie constantVerifierdie Funktion aufrufen, um zu prüfen, ob der Parameter gültig ist. Wenn Sie zurückkehren trueund dann anrufen changeState, oder nichts. Hoffe es hilft~

Mir ist gerade aufgefallen, wie dumm das offensichtlich war. Danke :)
EDIT: Oh warte. Ich brauche die Funktion changeState(), die nur aufgerufen wird, wenn die Überprüfung bestanden wird. Die obige Lösung gibt mir eine Möglichkeit, den Zustand zu ändern, auch wenn die Parameter nicht gültig sind. Das sollte nicht passieren
Beginnen Sie zuerst Vertrag A und rufen Sie dann diesen Code auf:if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Das würde mich immer noch Gas kosten und außerdem den Gasverbrauch aufgrund des zusätzlichen Anrufs erhöhen, wie in diesem Thread angegeben: ethereum.stackexchange.com/q/13851/5791 Ich suche nach einem gebührenfreien, nicht zustandsverändernden vertrauenswürdigen Validierungsmechanismus , wenn es möglich ist
@KetanBhokray Die ConstantVerifier-Funktion ist eine konstante Funktion, sie verbraucht kein Gas.
Bitte überprüfen Sie den obigen Link. Eine konstante Funktion verbraucht kein Gas, solange sie nur auf einem lokalen Knoten aufgerufen wird. Wenn sie von einer nicht konstanten Funktion aufgerufen wird, kostet sie Gas, da die Operationen der konstanten Funktion auf einem entfernten Knoten ausgeführt werden