Die Ethereum-Brieftasche erlaubt keine Transaktionen, auch nicht nach ordnungsgemäßen Bedingungen

Ethereum Wallet zeigt "Es scheint, dass diese Transaktion fehlschlagen wird ......", obwohl ich if/else innerhalb von Verträgen verwendet habe, um sicherzustellen, dass der Transferwert nicht höher als der Vertragssaldo ist

  function mySales( address a) constant public canWithdraw returns (uint){
    return totalSales[a];
}

function topSalesPerson() constant public returns ( address ){
    return topsales;
}

event bonusDepleted(string);

function submitSales() public payable canWithdraw{

    uint amount = msg.value;
    uint bonus_temp;
    if (this.balance >0){
        if(amount > 50000000000000000000){
            bonus_temp = amount/10; // 10% bonus
        }
        if(bonus_temp > 20000000000000000000){
            bonus_temp = 20000000000000000000;  // max bonus = 20 ether
        }

        if (this.balance > bonus_temp){
             msg.sender.transfer(bonus_temp);  // transfer bonus in case of enough balance
        }
       else{
            msg.sender.transfer(this.balance); // else transfer remaining amount as Bonus 
       }
        owner.transfer(amount);

        Bonus[msg.sender] += bonus_temp;
        totalSales[msg.sender] += msg.value;

        if( totalSales[topsales] < totalSales[msg.sender]){
            topsales = msg.sender;
        }
    }

    if(this.balance == 0){
        bonusDepleted("Bonus has reached its limit and no bonus will be provided for future sales");
    }
}`

Wenn der Vertrag also 3 Ether hat, dann erlaubt er für 50 Ether txn, aber für 60 zeigt er eine Warnung und einen Fehler "intrinsic gas too low", wo es gerade die letzten 3 Ether hätte zurückerstatten sollen.

Auch für Readonly-Funktionen wie "mySales", wie man sie von "ethereum -wallet" aus aufruft, da es bei der Eingabe von Adressen in diese Funktion unter "Read from Contract Section" nichts zurückgibt. Ich kann es von der Befehlszeile aus verwenden.

Antworten (1)

Ich denke das Problem liegt hier:

if (this.balance > bonus_temp){
    msg.sender.transfer(bonus_temp);  // transfer bonus in case of enough balance
}
else {
    msg.sender.transfer(this.balance); // else transfer remaining amount as Bonus 
}
owner.transfer(amount);

Es gibt keine Garantie dafür, dass ausreichende Mittel für die transferbis zur vorhanden sind owner. Insbesondere wenn ein amountpositiver Zeitpunkt vorliegt und Sie die Klausel verarbeiten else, ist der Saldo des Vertrags dann Null und die Zeile danach wird die Transaktion rückgängig machen.

Eine vernünftige Lösung könnte darin bestehen, dies zu tun, transferbevor owner Sie den Bonus berechnen, aber es hängt wirklich von dem gewünschten Verhalten ab.