мой вопрос: если «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();
}
спасибо АК
Если вы ищете альтернативу 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
, он будет выброшен прямо оттуда без внесения каких-либо изменений в состояние.
Для вашего случая и большинства случаев вы должны использовать 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); }
упрача
Аникет
Аникет
else
раздел, так как это связано с функциональностью тогоrequire
, что он будет выдаваться, если какое-либо из переданных условий не будет выполнено, используйте тот же код, который я добавил в ответ.упрача
Аникет
Аникет
require(isMinting, "Not allowed");
Rest в порядке, он будет работать таким же образомАникет
упрача
Аникет