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?
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 constantVerifier
die Funktion aufrufen, um zu prüfen, ob der Parameter gültig ist. Wenn Sie zurückkehren true
und dann anrufen changeState
, oder nichts. Hoffe es hilft~
Ketan Bhokray
Ketan Bhokray
BinGoBinBin
if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Ketan Bhokray
BinGoBinBin
Ketan Bhokray