Vertrag mit Zuordnung (Adresse->bool) funktioniert nicht wie erwartet

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:

AccessManager Sol

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?

Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben . :-)
Ich kann dein Problem nicht rekonstruieren. Ich kopiere deinen genauen Code in ethereum.github.io/browser-solidity/#version=0.3.6 und kann die Zugriffsrechte richtig einstellen und erhalten (versuche, z sicher, dass Sie eine gültige Adresse haben).
Hallo Sebastian! Wir haben dieses Problem bereits gelöst. Die Lösung wurde in Kommentaren beschrieben. Leider hat @5chdn alle Kommentare in den Chat verschoben und jetzt werden diese Informationen "de facto" gelöscht, weil niemand Chats liest :D Lange Rede kurzer Sinn: Dies ist ein Fehler in der Chrome-Erweiterung, der auf Browser-Solidity basiert. Serverantworten werden nicht korrekt dekodiert. Die neueste Version von Browser-Solidity macht es richtig.
@VolodymyrUsarskyy Bitte platzieren Sie Ihre Antwort nicht im Beitrag oder in den Kommentaren Ihrer Frage (oder im Chat: P). Es ist völlig in Ordnung, Ihre eigene Frage zu beantworten . Dies wird in Zukunft Benutzern helfen, die möglicherweise mit denselben Problemen konfrontiert sind. Vielen Dank!
Eigentlich war das keine wirkliche Lösung für mein Problem. Wir haben gerade entdeckt, dass die Chrome-Erweiterung einen Fehler enthält :) Aber ich habe die ganze Geschichte als Antwort gepostet, damit jeder sehen kann, was getan wurde. Danke!

Antworten (2)

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)

Geben Sie hier die Bildbeschreibung ein

Versuchen Sie, Ihrer GrantAccess-Funktion ein Ereignis hinzuzufügen;

  event ev(bool is_granted)
  function grantAccess(address assetAddr) {
        registry[assetAddr] = true;
        ev(registry[assetAddr]);
    }
Hallo Badr! Thx für deinen Beitrag. Das Problem wurde gelöst und die Lösung in den Kommentaren beschrieben. Leider wurden Kommentare in den Chat verschoben :( Um es kurz zu machen: Ich denke, dies ist ein Fehler in der Chrome-Erweiterung, die auf Browser-Solidity basiert. Serverantworten werden nicht korrekt dekodiert. Die neueste Version von Browser-Solidity tut dies wie erwartet. Ereignis ist im Originalcode vorhanden und wurde wie erwartet ausgelöst, aber die Erweiterung "Sol" zeigte immer wieder falsche Ergebnisse (was wirklich verwirrend war).

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:

  1. Das Problem wurde in der Chrome-Erweiterung „Sol“ beobachtet, die auf Browser-Solidity basiert
  2. Ich konnte diesen Fehler nur reproduzieren, als ich an einer privaten Blockchain arbeitete. Im Modus "lokale (virtuelle) Blockchain" funktionierte alles wie erwartet.

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!