Was ist der Unterschied zwischen .call.value() und .call.value()()

contract Test {

    function Test(){
        msg.sender.call.value(0);
        msg.sender.call.value(0)();
    }

}

Was ist hier der Unterschied zwischen dem ersten und zweiten Anruf? Meine Vermutung ist, dass der erste eigentlich nichts tut, aber dies kompiliert tatsächlich.

Antworten (2)

Die erste sollte nichts tun, da die Anruffunktion nicht aufgerufen wird. Sie setzen einfach den Wert, den Sie mit senden möchten, callrufen ihn dann aber nicht auf. Hier wird es erklärt :

Jeder externe Funktionsaufruf in Solidity kann auf zwei Arten modifiziert werden:

  1. Sie können Ether zusammen mit dem Anruf hinzufügen
  2. Sie können die für den Anruf verfügbare Gasmenge begrenzen

Von: https://solidity.readthedocs.io/en/v0.4.11/frequently-asked-questions.html#what-does-p-recipient-call-value-p-amount-p-data-do

Was tut p.recipient.call.value(p.amount)(p.data)? Jeder externe Funktionsaufruf in Solidity kann auf zwei Arten modifiziert werden:

Sie können Ether zusammen mit dem Anruf hinzufügen. Sie können die für den Anruf verfügbare Gasmenge begrenzen. Dies geschieht durch „Aufrufen einer Funktion für die Funktion“:

f.gas(2).value(20)()ruft die modifizierte Funktion fauf und sendet dadurch 20 Wei und begrenzt das Gas auf 2 (also wird dieser Funktionsaufruf höchstwahrscheinlich kein Gas mehr haben und Ihre 20 Wei zurückgeben).

Im obigen Beispiel wird die Low-Level-Funktion callverwendet, um einen anderen Vertrag p.dataals Nutzlast aufzurufen, und p.amountWei wird mit diesem Aufruf gesendet.