Ich habe einen Vertrag mit dem Namen Call
:
contract Call {
...
function () payable {
// TODO: Call the call function in the main contract
// and forward all funds (msg.value) sent to this contract
// and passing in the following data: msg.sender
}
}
Hier ist der Main
Vertrag:
contract Main {
...
function call(address senderAddress) public {
// Make the code in here run when someone sends ethers to the Call contract
}
}
Ich möchte also, dass jedes Mal, wenn jemand den Call
Vertrag sendet, alle Ether an den Main
Vertrag weitergeleitet werden, während die call
Funktion im Main
Vertrag mit den erforderlichen Argumenten ausgeführt wird.
Ist das möglich?
Update per @Girish-Kommentar, in Solidity 0.6+ hat sich die Syntax geändert zu:address.function{value:msg.value}(arg1, arg2, arg3)
Die allgemeine Syntax zum Aufrufen einer Funktion in einem anderen Vertrag mit Argumenten und zum Senden von Geldern lautet:address.func.value(amount)(arg1, arg2, arg3)
func
muss den payable
Modifikator haben (für Solidity 0.4+).
Um die Antwort von @Edmund mit diesen wichtigen Details zu vervollständigen, hier ist ein Beispiel, das kompiliert:
pragma solidity ^0.4.0;
contract PayMain {
Main main;
function PayMain(address _m) {
main = Main(_m);
}
function () payable {
// Call the handlePayment function in the main contract
// and forward all funds (msg.value) sent to this contract
// and passing in the following data: msg.sender
main.handlePayment.value(msg.value)(msg.sender);
}
}
contract Main {
function handlePayment(address senderAddress) payable public {
// senderAddress in this example could be removed since msg.sender can be used directly
}
}
Er betont auch, was er geschrieben hat:
Seien Sie sich bewusst, dass dies nur funktioniert, wenn die Leute, die das Geld senden, genug Gas schicken, um den Anruf nach Main und alles, was Sie darin tun, abzudecken.
Ja, das ist möglich. Rufen Sie jedoch nicht call
"anrufen" an - es bittet um Ärger.
Sie benötigen den Vertrag, der die Zahlung erhält, um die Adresse Ihres Hauptvertrags zu kennen. Wenn Sie sich vorstellen, dass es in einer Variablen namens main_addr gespeichert ist und Main eine Methode namens handlePayment() hat, können Sie es mit etwas wie dem folgenden aufrufen:
Main m = Main(main_addr);
m.handlePayment();
Dies kann auch Parameter annehmen, z. B. möchten Sie ihm mitteilen, was Sie eingegeben haben msg.sender
und msg.value
.
Seien Sie sich bewusst, dass dies nur funktioniert, wenn die Leute, die das Geld senden, genug Gas schicken, um den Anruf nach Main und alles, was Sie darin tun, abzudecken. In manchen Situationen kann es besser sein, ein Ereignis einfach im kostenpflichtigen Vertrag zu protokollieren und es später zu bearbeiten.
Sieg
msg.sender
, ist der Wert vonmsg.sender
die Adresse vonPayMin
Girish Thimmegowda
eth