Ich habe zwei Solidity-Verträge, wobei der Vertrag Caller
von einem zweiten Vertrag abhängt Callee
. Contract Callee
bietet eine öffentliche Ansichtsfunktion, die die Gültigkeit einer Zeichenfolge (z. B. eines Passworts) gemäß einigen internen Regeln überprüft. Caller
muss einen String in seiner eigenen Funktion durch Aufrufen prüfen Callee
, bevor er weiterverarbeiten kann. Außerdem Caller
muss die Funktion von Callee
mit aufgerufen werden delegatecall
, da die interne Gültigkeitsprüfung die aufrufende Adresse berücksichtigt.
contract Caller {
function doSomething(string _text, address _callee) public {
bool valid = bool(_callee.delegatecall(
bytes4(keccak256("check(string _text)")), _text)
);
require(valid == true);
/* further process if text is valid */
}
}
contract Callee {
function check(string _text) public view returns(bool){
/* validity check */
return true;
}
}
Das Problem mit diesem Code ist, dass der Aufruf der Funktion check
asynchron zu sein scheint und daher die require
Anweisung in der Funktion doSomething
immer fehlschlägt. Ist das ein Problem von delegatecall
? Gibt es eine Möglichkeit, die externe Funktion synchron aufzurufen?
Ich habe endlich die Antwort auf mein Problem gefunden: Leider kann man keine Werte von Funktionsaufrufen von Delegatecall empfangen.
Nulik
DELEGATECALL
Opcode:func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)
Sebastian Dine
Nulik
ret
Variable enthält das[]byte
von DELEGATECALL zurückgegebene Array. Vielleicht können Sie einen kleinen Teil Ihres Vertrages in Assembler schreiben, also rufen Sie DELEGATECALL auf und fangen diesen Rückgabewert ab. Dieser Rückgabewert wird anoutOffset
Position in den Speicher gestellt.Sebastian Dine
ret
Variable zeigt an, ob die Verarbeitung der aufgerufenen Funktion erfolgreich war.Nulik
ret
ist die Ausgabe, die von der EVM zurückgegeben wird. Wenn ein Fehler aufgetreten ist, wird dieerror
. Diese Ausgabe ist gemäß ABI codiert. Wenn Sie abi.Unpack() aufrufen,ret
erhalten Sie den Wert entsprechend seinem Typ. Zum Beispiel werden alle Ganzzahlen in 32-Byte-Arrays gespeichert, alle Zeichenfolgen haben zuerst die Zeichenfolgenlänge und dann folgen Zeichenfolgendaten und so weiter ...