Boolesche Rückgabemethode: Eingabe mit "if" oder require() validieren?

Open Zeppelins Mintable Token hat die Methode, mint(address _to, uint256 _amount) ... returns (bool)neue Token zu erstellen. Ich möchte ein Angebotslimit einführen und bin mir nicht sicher, wie ich die Eingabe richtig validieren soll. Soll ich require(), throw verwenden oder ist es vorzuziehen, einen booleschen Wert zurückzugeben, wie der Aufrufer es erwarten könnte?

Welche Folgen haben diese Optionen?

function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
    // TODO: validate amount is not too big.

    // Validate with require():
    // require((totalSupply + _amount) <= SUPPLY_LIMIT);

    // Or validate with if:
    // if ((totalSupply + _amount) > SUPPLY_LIMIT) return false;

    // Or throw?
    // if ((totalSupply + _amount) > SUPPLY_LIMIT) throw;

    totalSupply = totalSupply.add(_amount);
    if (totalSupply == SUPPLY_LIMIT) mintingFinished = true;

    balances[_to] = balances[_to].add(_amount);
    Mint(_to, _amount);
    Transfer(0x0, _to, _amount);

    assert(totalSupply <= SUPPLY_LIMIT);

    return true;
}

Der Anrufvertrag sieht so aus:

contract Crowdsale {

    // ...

    function buyTokens(address beneficiary) public payable {
        require(beneficiary != 0x0);
        require(validPurchase());

        // ...
        token.mint(beneficiary, tokens); // return value not used
        // ...
  }
}

Antworten (2)

Ich möchte ein Angebotslimit einführen und bin mir nicht sicher, wie ich die Eingabe richtig validieren soll. Soll ich require(), throw verwenden oder ist es vorzuziehen, einen booleschen Wert zurückzugeben, wie der Aufrufer es erwarten könnte

Es ist ziemlich einfach, dass die Methode bool zurückgibt, und ich würde vorschlagen, wenn und bool zurückzugeben (Zustand ist entweder wahr oder falsch definiert).

in Bezug auf require/ throw würde es "Ungültiger Opcode" zurückgeben und es würde auch das gleiche Gas wie oben verwenden und einen undefinierten Status (ungültiger Opcode / nicht sehr benutzerfreundlich) zurückgeben, was nicht bevorzugt wird. Häufiger wird require verwendet, wenn Sie den Zustand einer Variablen ändern, was hier nicht der Fall ist.

Als Lösung akzeptiert, da dies meine Frage direkt beantwortet. Danke!

Eigentlich sollten Sie das nicht in der Funktion mint() des Tokens überprüfen.

Wenn Sie Open Zeppelin verwenden, haben Sie dort den canMint-Modifikator, der das Prägen erlaubt, solange mintingFinished falsch ist.

Der beste Ansatz wäre also, zumindest meiner Meinung nach und nach Mustern in anderen Kontrakten, zu überprüfen, ob Token nicht über die harte Obergrenze in der Funktion buyTokens() hinaus geprägt werden.

Später, wenn der Crowdsale beendet ist, sollten Sie token.finishMinting() aufrufen, um zu verhindern, dass Sie nach dem Crowdsale neue Token prägen können.