拥有创建新令牌的方法mint(address _to, uint256 _amount) ... returns (bool)。我想介绍一个供应限制,我不知道如何正确地验证输入。我是应该使用require(),抛出,还是应该像调用者所期望的那样返回布尔值?
这些选择的后果是什么?
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;
}呼叫合同如下所示:
contract Crowdsale {
    // ...
    function buyTokens(address beneficiary) public payable {
        require(beneficiary != 0x0);
        require(validPurchase());
        // ...
        token.mint(beneficiary, tokens); // return value not used
        // ...
  }
}发布于 2017-11-11 12:09:26
我想介绍一个供应限制,我不知道如何正确地验证输入。我是使用require(),抛出,还是像调用者所期望的那样返回布尔值?
该方法直接返回bool,我建议使用if和返回bool(状态定义为true或false)。
对于请求/抛出,它将返回“无效的Opcode”,还会使用上述相同的气体,并返回未定义的sate (无效的Opcode/不太友好的用户),这是不可取的。当您更改变量的状态时,通常会使用require,这不是这样的情况。
发布于 2017-11-11 13:39:10
实际上,您不应该在令牌的mint()函数中检查这个值。
如果您使用的是Open,那么这里有canMint修饰符,只要mintingFinished是假的,就允许造币。
因此,最好的方法,至少在我看来,以及在其他契约中遵循的模式是,检查令牌是否超过了buyTokens()函数中的硬上限。
稍后,当众销售结束时,您应该调用token.finishMinting(),以阻止您能够在众包之后创建新的令牌。
https://ethereum.stackexchange.com/questions/30460
复制相似问题