Vertrag Kein Senden von Ether an ein anderes Konto

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.

Antworten (1)

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

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Schritt 3: Senden Sie txn an die Belohnung ()

Achten Sie darauf , dieses Mal NICHT wei/eth zu senden, da diese Funktion nicht kostenpflichtig ist.

Geben Sie hier die Bildbeschreibung ein

Es zeigt LogErr, wenn ich die Belohnung anrufe. Können Sie mir sagen, wie ich Ether von einer Adresse zur anderen senden kann?
Ich habe meiner ursprünglichen Antwort einige Bildschirmkappen hinzugefügt. Sie sind sich nicht sicher, ob Sie Remix schon einmal verwendet haben. Das ist es wert.
Sie haben die Möglichkeit, abzustimmen oder zu akzeptieren (oder beides), wenn die Antwort hilfreich ist. ;-) Danke.
Was Sie also sagen, wenn wir Ether an ein anderes Konto senden wollen, müssen wir Ether an den Vertrag senden. Und dann die Sendefunktion verwenden.
Ja. Der Vertrag kann keine Gelder außer seinen eigenen ausgeben. So können Sie einen überzeugend ehrlichen Vertrag mit einer offensichtlichen Funktion abschließen. Dann können die Benutzer darauf vertrauen, dass der Vertrag seine Funktion mit ihren Geldern erfüllt. Es ist nicht möglich, einen Vertrag abzuschließen, der vom Konto einer anderen Partei ausgeht.
Großartig! Mir ist klar, dass es sich um frühe Erkundungen handelt. Nur um Ihnen zu helfen, erklärt dies die Bedenken bezüglich des "unsicheren Musters". Vielleicht ist es zu diesem Zeitpunkt noch nicht klar, aber es wird mit der Zeit hilfreich sein: github.com/ConsenSys/smart-contract-best-practices/…