Der Aufruf eines anderen Vertrags im Remix-Browser funktioniert nicht wie erwartet

Ich bin kein Solidity-Experte. Ich versuche, eine Funktion für einen anderen Vertrag aufzurufen, damit sie Werte aktualisiert, aber das tut es nicht. Ich verwende den Online-Remix-Browser. Der aufzurufende Vertrag ist Supreme. Ich kann sehen, dass Getter- und Setter-Werte wie erwartet funktionieren. Der Anrufervertrag ist Hack. Wenn die Sneak-Funktion von Contract Hack 1 Ether mehr als den Wert der Kosten sendet, wird der Absender groß. Wenn zum Beispiel Sneak Calls Supreme mit Cost = 2 Ether funktionieren, dann werden die Kosten 2, der Sender ersetzt die Position „groß“. Wenn ich die Adresse vom ersten Vertrag an den Caller-Vertrag übergebe und 2 Ether als Wert gebe. Klicke auf Setter, dann überprüfe ich die Kosten, es bleibt 1 Äther. Ich habe so viele Möglichkeiten ausprobiert, aber ich komme nicht weiter.

contract Supreme {
    address public big;
    uint256 public cost;

    function Supreme() 
      public
    {
        big = msg.sender;
        cost = 3 ether;
    }

    function Road() 
      external
      payable
    {
        require(msg.value >= cost);
        big.transfer(msg.value);
        big = msg.sender;

        cost += 1 ether;
    }
}

Das ist der Anrufervertrag

    import "browser/Supreme.sol";
contract Hack{
Supreme public sup;

Supreme s;
function Hack(Supreme _sup){
    sup = _sup;
}
function sneak(address addr) public payable{
 s.Road.value(msg.value)();
  }
   function() payable{
   s.Road(); 
   }  
}

Antworten (1)

Zwei Probleme:

  1. Es sieht nicht so aus, als würden Sie jemals eine Instanz von erstellen Supreme, also glaube ich, dass Sie versuchen, diese Funktionsaufrufe an die Adresse 0 zu senden.
  2. Sie senden keinen Äther, wenn Sie anrufen s.Road().

Für die erste Ausgabe können Sie entweder Ihren Vertrag bereitstellen lassen Supreme:

sup = new Supreme();

oder (wahrscheinlicher, was Sie wollen) Sie können Supremesich selbst bereitstellen und dann die Adresse des bereitgestellten Vertrags an Hackden Konstruktor übergeben:

function Hack(Supreme _sup) {
    sup = _sup;
}

Um das zweite Problem zu beheben, fügen Sie Ihrem Anruf einen Wert hinzu:

s.Road.value(msg.value)();

BEARBEITEN

Ihr neuer Code hat andere Probleme. Es verfolgt, supaber verwendet es dann nicht. Die sneakFunktion nimmt auch eine unbenutzte Adresse.

Hier ist fester Code. SupremeStellen Sie sicher, dass Sie beim Erstellen die Adresse des bereitgestellten Vertrags übergeben Hack. Das bedeutet, dass Sie die Adresse dieses Vertrags (z. B. "0x123abc...") in das Textfeld neben der Schaltfläche „Erstellen“ eingeben müssen. Senden Sie dann Ether, indem Sie das valueFeld oben rechts ändern, wenn Sie die sneakFunktion aufrufen.

import "browser/Supreme.sol";
contract Hack {
    Supreme public sup;

    function Hack(Supreme _sup) public {
        sup = _sup;
    }

    function sneak() public payable {
        sup.Road.value(msg.value)();
    }
}
Danke @smart. Ich habe den Hack-Vertrag geändert, wie Sie es empfohlen haben. Ich kann jedoch immer noch nicht die erwarteten Ergebnisse sehen. Mir ist aufgefallen, dass auf der linken Seite des Remix-Browsers ein Fehler angezeigt wird, wenn ich auf Setter „Sneak“ klicke. Ich übergebe Adresse sowie 3 Äther. Hier ist der Fehler: transact to Hack.sneak errored: Error encoding arguments: SyntaxError: JSON.parse: erwartet ',' or ']' after array element at line 1 column 3 of the JSON data
Wenn ich nur ethers(3) angebe und keine Adresse als Input an Hack übergebe, mit der Annahme, dass Hack die Adresse wahrscheinlich automatisch abholen würde, dann erhalte ich die folgende Fehlermeldung: transact to Hack.sneak errored: VM error: revert. revert Die Transaktion wurde in den Ausgangszustand zurückgesetzt. Hinweis: Der Konstruktor sollte zahlbar sein, wenn Sie einen Wert senden. Debuggen Sie die Transaktion, um weitere Informationen zu erhalten
Siehe meine Bearbeitung. Ich bin verwirrt darüber, was Sie versucht haben, aber hoffentlich hilft Ihnen mein aktualisierter Code.
Danke @smart. Ich habe den gleichen Code verwendet, den Sie oben angegeben haben. Wenn ich auf die Schaltfläche „Erstellen“ klicke, nachdem ich die aus dem Supreme-Vertrag kopierte Adresse angegeben habe. Es zeigt mir weder Sneak noch Setter/Getter. Stattdessen erhalte ich den folgenden Fehler: Erstellung von Hackfehler: Fehler beim Codieren von Argumenten: SyntaxError: JSON.parse: erwartetes ',' oder ']' nach Array-Element in Zeile 1, Spalte 3 der JSON-Daten
Können Sie mir genau sagen, was Sie in das Feld neben "Erstellen" eingeben? Es sollte eine hexadezimale Zeichenfolge sein, die mit 0xdoppelten Anführungszeichen beginnt und eingeschlossen ist.
Ich gebe 0xdc04977a2078c8ffdf086d618d1f961b6c546222 in das Feld neben „Erstellen“ ein. Ich habe es von 'Supreme at 0xdc04977a2078c8ffdf086d618d1f961b6c546222 (Speicher)' kopiert.
Fehlen dir die doppelten Anführungszeichen? Sind Sie sicher, dass Sie den richtigen Vertrag bereitstellen ( Hack)? Sind Sie sicher, dass Hacknur ein Konstruktorparameter benötigt wird?
ja doppeltes Anführungszeichen fehlte. Ich war mir dessen nicht bewusst. Vielen Dank für die Lösung meines Problems.