wie werden verträge mit eth "geladen"?

Wenn wir das folgende Beispiel betrachten, wie werden wir Consumerdas Geld haben, um die 800 Benzin zu bezahlen, die zum Laufen notwendig sind InfoFeed.feed? Durch welchen Mechanismus wird die anrufende Person Consumer.callFeed()belastet?

contract InfoFeed {
  function info() payable returns (uint ret) { return 42; }
}
contract Consumer {
  InfoFeed feed;
  function setFeed(address addr) { feed = InfoFeed(addr); }
  function callFeed() { feed.info.value(10).gas(800)(); }
}
Dem Anrufer callFeedwerden keine Kosten in Rechnung gestellt. Der CustomerVertrag zahlt die ETH aus seinem eigenen Guthaben, das wahrscheinlich null ist, sodass der Anruf fehlschlägt.

Antworten (2)

Der Absender der ursprünglichen Transaktion zahlt für das gesamte Gas. Das Gas jeder internen Transaktion wird von ihnen bezahlt. In diesem Fall würde jeder, der callFeed() aufruft (oder wer auch immer etwas anderes aufruft, das callFeed() aufruft), diese 800 Gas zahlen.

Ich denke, das OP spricht von Geldern, die als Wert gesendet werden, nicht von Gas.

Normalerweise kann der Wert entweder in der Transaktion, die callFeed() aufruft, oder in einer vorherigen Transaktion zum Vertrag an den Verbrauchervertrag gesendet werden.

In diesem Fall hat der Verbrauchervertrag jedoch keine Funktionen, die als zahlbar gekennzeichnet sind. Daher sehe ich, kompiliert mit einer neueren Version von solc, keine Möglichkeit, ihn zu bezahlen, außer möglicherweise die seltsamen, kniffligen Methoden, wie das Festlegen als Begünstigter der Selbstmord eines anderen Vertrags oder das Festlegen der Vertragsadresse als Coinbase und das Mining eines Blocks.

Das Beispiel muss wahrscheinlich aktualisiert werden, um eine kostenpflichtige Funktion einzuschließen.