Mapping für msg.sender scheint nicht zu funktionieren

Zustandsvariable ist dies:mapping(address=>uint) public userVotes;

Jetzt habe ich eine Funktion:

function votePresident(uint _id) external {
        presidents[_id-1].voteCount++;
        userVotes[msg.sender] = _id;
        Voter(msg.sender, _id, userVotes[msg.sender]);
    }

Die letzte Zeile ist ein Ereignis. Was hier also passiert, ist, dass ich nach dem Ausführen dieser Funktion eine Adresse des Ausführenden in ein Mapping als Schlüssel und Wert einfüge, wenn er übergeben wird. Dann protokolliere ich es.

Ich habe eine andere Funktion, wo ich diese userVotes verwende

function getPresident(uint _index) public view returns (uint, string, uint, string, uint) {
        President storage president = presidents[_index];
   return (president.voteCount, president.hashImage, president.id, president.name, userVotes[msg.sender] );
    }

Schauen Sie sich in der Rückleitung den letzten Parameter an, userVotes[msg.sender]. Leider gibt es immer 0 zurück. Ich weiß nicht, warum es das tut. Ich habe das Protokoll überprüft, nachdem ich die erste Funktion ausgeführt hatte, und ich habe keine 0 gesehen. Ich habe nur den tatsächlichen Wert gesehen. Bitte helfen Sie. Wenn ich die getPresident-Funktion in Remix aufrufe, gibt sie den tatsächlichen Wert und nicht 0 zurück.

Haben Sie versucht, Ihren Code zu vereinfachen, um die Teile zu isolieren, von denen Sie glauben, dass sie defekt sind? Versuchen Sie, ein minimales, vollständiges und überprüfbares Beispiel zu erstellen . Im Allgemeinen verwenden Sie msg.senderin diesen Situationen gut, wie ich sehen kann.
Die Frage ist, warum derselbe Code bei remix funktioniert.
Verglichen mit was? Ich glaube nicht, dass Sie erwähnt haben, auf welcher Plattform dieser Code fehlschlägt ...
Ich verwende web3, um die Anrufe zum Vertrag zu tätigen. Wenn ich den Vertrag bereitstelle und versuche, ihn mit Remix zu testen, funktioniert er mit Remix, aber wenn ich dieselbe Funktion getPresident aufrufe, die oben angegeben ist, ist userVotes[msg.sender] immer 0.
Fügen Sie einen Link zu Ihrer Vertragsbereitstellung hinzu. Wissen Sie, ob Ihre Transaktionen erfolgreich abgebaut wurden?
Scheint also getPresidentzu funktionieren. Was nicht funktioniert, ist Ihr JavaScript-Code, der es aufruft. Sie haben diesen Code nicht geteilt, aber ich vermute im Dunkeln, dass Sie keine fromAdresse weitergeben.
Ich denke, Sie erraten es richtig, mein Freund. Ich komme nicht vorbei. Es ist eine kostenlose Funktion und ich verwende sie als "call()". können diese Ansichtsfunktionen auch "from:account" von web3 übergeben werden?
Sie sollten eine Antwort auf Ihre eigene Frage posten, um anderen zu helfen, die möglicherweise auf ein ähnliches Problem stoßen.

Antworten (1)

Jeder könnte es brauchen.

Manchmal vergessen Sie möglicherweise, ein Konto zu übergeben, wenn Sie tatsächlich eine kostenlose Methode aufrufen, die nur etwas zurückgibt. In meinem Fall habe ich eine kostenlose (No-Gas) Funktion aufgerufen und weil ich die Sendetransaktion nicht verwendet habe, habe ich vergessen, den Kontonamen zu übergeben. Sie können das Konto wie für die Sendefunktion an die Anruffunktion übergeben.