Wie rufe ich die Get-Methode eines Vertrags von einem anderen auf?

Ich möchte eine Methode eines Vertrags aus einem anderen Vertrag aufrufen. Ich habe diesen Beitrag bereits gelesen: Aufruf eines Vertrags zu einer anderen Vertragsmethode , aber es funktioniert bei mir nicht.

Wenn ich den Aufrufer erstelle und versuche, die Set()-Methode auszuführen, funktioniert es perfekt, aber wenn ich Get() aufrufe, gibt es immer '0' zurück.

Kann mir jemand helfen?

Dies sind meine einfachen Codes:

pragma solidity ^0.4.0;


contract callee{

    uint public x;

    constructor() public
    {
        x = 1;
    }

    function set (uint k) public
    {
        x = k;
    }

    function get () public view returns (uint)
    {
        return x;
    }

}

contract caller{

    callee c;

    constructor() public
    {
        c = new callee();
    }

    function get() public view returns (uint k)
    {
        return c.get();
    }

    function set(uint k) public
    {
        c.set(k);
    }

    function get_calle() public view returns (callee)
    {
        return c;
    }


}

Ich verwende Web3 Provider und Remix zum Testen.

Ich habe versucht, get() vom Angerufenen aufzurufen, nachdem ich seinen Standort erhalten hatte, und es gibt den richtigen Wert zurück, sodass die set()-Methoden funktionieren. Warum kann ich get() nicht vom Aufrufer verwenden?

Methodenaufruf von Remix mit Web3

Danke schön!

Antworten (1)

Das, calleewas Sie erstellt haben, ist nicht dasjenige, callermit dem es interagiert. Es schafft ein neues.

Ersetzen

c = new callee();

mit

c = callee(0xabcdef);

Aber anstatt 0xabcdefdie Adresse des eingesetzten calleeVertrages einzugeben.

Das ist nicht der Punkt. Ich möchte einen neuen Angerufenen erstellen und seinen Status bearbeiten. Ich stelle einfach den Anrufervertrag bereit, der den Angerufenen erstellt, und führe dann das Get nach dem Set aus. Wie Sie im Bild sehen können, arbeite ich an demselben Angerufenen, aber das get() des Aufrufers gibt 0 zurück, während das get() des Angerufenen 10 zurückgibt.
Ah, ich verstehe, mein Fehler. Ich habe es mit Remix getestet, mit Injected Web3 auf Rinkeby und habe das gleiche Problem. Konnte setvon caller, erhielt aber nur genaue getErgebnisse von callee. Aber als ich die Adresse von kopierte caller, entfernte callerund eine Instanz unter dieser Adresse wieder öffnete, getscheint es zu funktionieren. Bekommst du das gleiche Ergebnis?
Ich habe es versucht, aber ich bekomme immer 0
Es ist seltsam, es könnte ein Fehler mit Remix sein, denn wie gesagt, es funktioniert für mich, wenn ich den Aufrufer neu starte, und ich sehe kein Problem mit Ihrem Solidity-Code.
OK danke! Was soll ich versuchen?
Wenn es sich um ein Problem mit Remix handelt, können Sie einen anderen Browser ausprobieren oder zur Registerkarte „Support“ gehen und dort um Hilfe bitten.
Ich habe versucht, nur Geth zu verwenden (ABI definieren, Vertrag abbauen und Methode aufrufen), aber das Ergebnis ist immer 0. Wenn ich in JavaScript VM teste, funktioniert es perfekt, wo kann das Problem liegen? Ich brauche bitte dringend eure Hilfe!