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();
}
}
Zwei Probleme:
Supreme
, also glaube ich, dass Sie versuchen, diese Funktionsaufrufe an die Adresse 0 zu senden.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 Supreme
sich selbst bereitstellen und dann die Adresse des bereitgestellten Vertrags an Hack
den 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, sup
aber verwendet es dann nicht. Die sneak
Funktion nimmt auch eine unbenutzte Adresse.
Hier ist fester Code. Supreme
Stellen 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 value
Feld oben rechts ändern, wenn Sie die sneak
Funktion 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)();
}
}
Mike
Mike
Benutzer19510
Mike
Benutzer19510
0x
doppelten Anführungszeichen beginnt und eingeschlossen ist.Mike
Benutzer19510
Hack
)? Sind Sie sicher, dassHack
nur ein Konstruktorparameter benötigt wird?Mike