Ich habe einen sehr einfachen Solidity-Vertrag:
contract AccessManager {
mapping(address => bool) public registry;
function grantAccess(address assetAddr) {
registry[assetAddr] = true;
}
function isAuthorized(address assetAddr) constant returns (bool) {
return registry[assetAddr];
}
}
Die Logik ist einfach: Immer wenn ich die Methode grantAccess (...) aufrufe, muss eine Adresse (die als Methodenargument übergeben wird) mit dem Wert "true" zur Zuordnung hinzugefügt werden.
Das Problem ist, dass dieser einfache Code nicht funktioniert. Nachdem ich eine Transaktion zum Ausführen der Methode grantAccess("0x.....") gesendet habe, rufe ich die Methode isAuthorized("0x....) auf und sie gibt immer "false" zurück. Ich habe es mit der Chrome-Erweiterung namens " Sol“ und mit der .NET Etherum API. Das Ergebnis ist immer gleich: Die Vertragsmethode isAuthorized(...) gibt „false“ zurück, egal was ich tue.
So nenne ich Kontaktmethoden in der Sol-Erweiterung:
Ich denke, das Problem besteht darin, eine Zeichenfolge als Adressargument zu übergeben, aber ich habe einen anderen Vertrag, in dem ich etwas Ähnliches mache und es funktioniert einwandfrei.
Hatte jemand ähnliche Probleme?
Haben Sie Ihren Code lokal oder im Speicher (VM) oder in der Blockchain ausgeführt? Ich habe Ihren Code ausprobiert, er scheint zu funktionieren (0 = falsch vor dem Gewähren des Zugriffs und 1 = wahr danach)
Versuchen Sie, Ihrer GrantAccess-Funktion ein Ereignis hinzuzufügen;
event ev(bool is_granted)
function grantAccess(address assetAddr) {
registry[assetAddr] = true;
ev(registry[assetAddr]);
}
Da die Kommentare, die die Lösung beschrieben, in den Chat verschoben wurden und seitdem bereits zwei Personen Zeit mit meinem (gelösten) Problem verbracht haben, schreibe ich als Antwort eine kurze Zusammenfassung dessen, was passiert ist.
Eingang:
Ursprünglich enthielt mein Code ein Ereignis, das ausgelöst wurde, nachdem die Vertragsmethode grantAccess(...) aufgerufen wurde. Da ich nie Probleme mit der Chrome-Erweiterung „Sol“ hatte, erweckte dies den falschen Eindruck, dass meine Änderungen irgendwie rückgängig gemacht wurden, nachdem die Methodenausführung abgeschlossen war.
Nachdem @kobigurk meinen Code in der neuesten Version von Browser-Solidity getestet hatte, wurde deutlich, dass das Problem in der Chrome-Erweiterung "Sol" und nicht im Vertrag selbst liegt. Aus irgendeinem Grund kann die Erweiterung "Sol" eine vom Server empfangene Antwort nicht korrekt dekodieren und zeigt ständig den Standardrückgabewert ("false" für bool-Typ, "0" für uint). Ich habe denselben Vertrag getestet, aber mit "uint" als Rückgabetyp von der Methode "grantAccess" und immer "0" erhalten. Das bedeutet, dass das letzte Byte irgendwie ignoriert wird.
Die Lösung ist also einfach: Klonen Sie den neuesten Quellcode von "Browser-Solidity" und verwenden Sie ihn anstelle der Chrome-Erweiterung "Sol".
Danke an alle, die Zeit damit verbracht haben, mir zu helfen!
q9f
SCBürgel
Wolodymyr Usarskyj
q9f
Wolodymyr Usarskyj