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.
Die erste sollte nichts tun, da die Anruffunktion nicht aufgerufen wird. Sie setzen einfach den Wert, den Sie mit senden möchten, call
rufen ihn dann aber nicht auf. Hier wird es erklärt :
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
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 Funktionf
auf 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
call
verwendet, um einen anderen Vertragp.data
als Nutzlast aufzurufen, undp.amount
Wei wird mit diesem Aufruf gesendet.