Ich habe einen Vertrag erstellt, der die Adresse der Benutzer speichert, und ich möchte 1 Ether alle im Array gespeicherten Benutzer senden.
Hier ist mein Code
contract project{
address public user;
bytes32[10] name;
address[10] customer;
uint public i=0;
function project(){
user=msg.sender;
}
function add(bytes32 _name){
name[i]=_name;
customer[i]=msg.sender;
i++;
}
function get_address() constant returns(address[10]){
return customer;
}
function reward() {
for(uint i=0;i<10;i++)
{
customer[i].send(1);
}
}
}
Wenn ich die Methode Reward Metamask aufrufe, wird die Transaktion ausgeführt, aber Ether wird nicht übertragen.
Bitte hilf mir.
Sie versuchen, den Vertrag dazu zu bringen, Gelder zu senden, die er nicht hat. Es braucht Äther, um daraus zu schöpfen. Das Guthaben würde bei 0 beginnen, also müssen Sie a hinzufügen function() payable{}
und etwas Ether senden, um damit zu arbeiten.
Ich habe einen Abschnitt des Codes markiert, *** unsafe ***
um Missverständnisse zu vermeiden. Es gibt tiefere Bedenken, auf diese Weise mit Geld umzugehen. Ein guter nächster Schritt besteht darin, den Erfolg/Fehler der send()
Operation zu überprüfen und dann anders zu reagieren. Ich habe es eine Fehlermeldung oder eine Erfolgsmeldung ausgeben.
Ich habe einige Ereignisemitter hinzugefügt, damit Sie sehen können, was vor sich geht.
Ich hoffe es hilft.
contract project{
address public user;
bytes32[10] name;
address[10] customer;
uint public i=0;
event LogDep (address sender, uint amount, uint balance);
event LogSent(address recipient, uint amount, uint balance);
event LogErr (address recipient, uint amount, uint balance);
function project(){
user=msg.sender;
}
function depositFunds() public payable returns(bool success) {
LogDep(msg.sender, msg.value, this.balance);
return true;
}
function add(bytes32 _name){
name[i]=_name;
customer[i]=msg.sender;
i++;
}
function get_address() constant returns(address[10]){
return customer;
}
function reward() {
for(uint i=0;i<10;i++)
{
// *** unsafe pattern ***
if(customer[i].send(1)) {
LogSent(customer[i], 1, this.balance);
} else {
LogErr(customer[i], 1, this.balance);
}
}
}
}
Hier ist es in Remix, um zu zeigen, dass es funktioniert.
Wenn Sie Remix noch nie gesehen haben, gehen Sie hier https://ethereum.github.io/browser-solidity und fügen Sie einfach den Code in den Compiler ein. Sie können mit den Vertragsfunktionen interagieren.
Schritt 1: Vertrag erstellen
Schritt 2: Senden Sie dem Vertrag etwas Geld
10 Wei reichen gerade aus, um 1 an alle 10 Kunden zu senden. Wenn Sie weniger senden, sehen Sie ab Schritt 3 fehlgeschlagene Sendungen.
Schritt 3: Senden Sie txn an die Belohnung ()
Achten Sie darauf , dieses Mal NICHT wei/eth zu senden, da diese Funktion nicht kostenpflichtig ist.
Anurag Verma
Rob Hitchens
Rob Hitchens
Anurag Verma
Rob Hitchens
Rob Hitchens
Anurag Verma