Предупреждение: «throw» устарел в пользу «revert()», «require()» и «assert()». бросать;

мой вопрос: если «THROW» устарел, то что я должен вместо этого добавить следующий код прочности?

// This function creates Tokens  
     function createTokens() payable {
        if(isMinting == true){
            require(msg.value > 0);
            uint256  tokens = msg.value.div(100000000000000).mul(RATE);
            balances[msg.sender] = balances[msg.sender].add(tokens);
            _totalSupply = _totalSupply.add(tokens);
            owner.transfer(msg.value);
        }
        else{
            throw;
        }
    }

поэтому код должен выглядеть так:

// This function creates Tokens  
 function createTokens() payable {
 require(isMinting == true && msg.value > 0);
 uint256  tokens = msg.value.div(100000000000000).mul(RATE);
 balances[msg.sender] = balances[msg.sender].add(tokens);
 _totalSupply = _totalSupply.add(tokens);
 owner.transfer(msg.value);
    }
    else{
        throw;
    }
}

Или я должен удалить

else{ throw;

последнее обновление:

function createTokens() payable public {
    if(isMinting == true){
       require(isMinting, "Not allowed");
       require(msg.value > 0, "No funds");
        uint256  tokens = msg.value.div(100000000000000).mul(RATE);
        balances[msg.sender] = balances[msg.sender].add(tokens);
        _totalSupply = _totalSupply.add(tokens);
        owner.transfer(msg.value);
    }
    else{
        revert();
    }

спасибо АК

Ответы (2)

Если вы ищете альтернативу throw, вы можете использовать revertаналогичным образом. Функцию revertможно использовать, чтобы пометить ошибку и отменить текущий вызов. Как указано в документах Solidity:

Примечание

Раньше было ключевое слово throw с той же семантикой, что и у revert(), которое устарело в версии 0.4.13 и удалено в версии 0.5.0.

С точки зрения кода вы можете использовать requireследующее:

 function createTokens() payable {
        require(isMinting == true && msg.value > 0);
        uint256  tokens = msg.value.div(100000000000000).mul(RATE);
        balances[msg.sender] = balances[msg.sender].add(tokens);
        _totalSupply = _totalSupply.add(tokens);
        owner.transfer(msg.value);
  }

Поэтому, если isMintingне равно true, он будет выброшен прямо оттуда без внесения каких-либо изменений в состояние.

Подробнее: https://solidity.readthedocs.io/en/v0.5.0/control-structures.html#error-handling-assert-require-revert-and-exceptions

Не могли бы вы привести пример в коде, пожалуйста? Я новичок и хочу идти правильным путем. и спасибо АК
Надеюсь, отредактированный ответ поможет.
удалить elseраздел, так как это связано с функциональностью того require, что он будет выдаваться, если какое-либо из переданных условий не будет выполнено, используйте тот же код, который я добавил в ответ.
Посмотрите, все ли в порядке, пожалуйста, и скажите, так ли это в моем вопросе, ниже последнего обновления.
Ответ обновлен. Вы также можете использовать онлайн-ремикс Solidity IDE: remix.ethereum.org/…
@upracha в вашем недавнем обновлении, о котором идет речь, вы можете удалить require(isMinting, "Not allowed");Rest в порядке, он будет работать таким же образом
@upracha, если проблема решена, вы можете отметить ее как правильный ответ для сообщества.
извините, где я могу отметить правильный ответ, я здесь новенький
Нажмите «правую галочку» в левой верхней части ответа. Проверьте другие вопросы

Для вашего случая и большинства случаев вы должны использовать require(isMinting, "Unallowed");. require(false)Условие возвращает текущий вызов, т. е. изменения памяти отменяются и msg.value не передается в контракт.

throwповедение эквивалентно assert(false, "Reason"), они вызовут сбой транзакции, а также потратят весь оставшийся газ, это вернет весь стек вызовов.

Узнайте больше о неудачных транзакциях на этом примере https://gist.github.com/3esmit/8954425d2ed0322505245803d6c045e4.

function createTokens() payable { require(isMinting, "Not allowed"); require(msg.value > 0, "No funds"); uint256 tokens = msg.value.div(100000000000000).mul(RATE); balances[msg.sender] = balances[msg.sender].add(tokens); _totalSupply = _totalSupply.add(tokens); owner.transfer(msg.value); }

привет, не могли бы вы привести пример с кодом в моем вопросе, пожалуйста?
отредактированный ответ с конкретным предложением для вашего кода.
я редактирую вопрос, смотрите ниже, последнее обновление, в ремиксе этот код не показывает предупреждения, поэтому, пожалуйста, проверьте и скажите мне, хорошо ли это, и вы допустили ошибку в своем ответе, спасибо
Я не могу сделать работу за вас. Посмотрите, компилируется ли он, если да, протестируйте его. Рассмотрите возможность установки фреймворка embark и создания тестовых сценариев.