Remix - Solidity IDE - Высокие требования к газу

Составили «Аукционный договор» и получили предупреждение о повышенных требованиях к газу. Означает: не может запустить его. Ниже строки с комментариями и те строки, которые я включил (//Часть 1 Задача n Строка n).

// CANNOT BE EXECUTED !!! GAS REQUIREMENTS HIGH
function bid(uint _itemId, uint _count) public payable{
    //Part 1 Task 4. Implement the three conditions below. 
    //   4.1 If the number of tokens remaining with the bidder is < count of tokens bid, revert
    //   4.2 If there are no tokens remaining with the bidder, revert.
    //   4.3 If the id of the item for which bid is placed, is greater than 2, revert.
    //   Hint: "tokenDetails[msg.sender].remainingTokens" gives the details of the number of tokens remaining with the bidder.
    if (tokenDetails[msg.sender].remainingTokens < _count) return; //Part 1 Task 4 – line 1
    if (_itemId > 2) return;                                       //Part 1 Task 4 – line 2

    //Part 1 Task 5. Decrement the remainingTokens by the number of tokens bid
    //   Hint. "tokenDetails[msg.sender].remainingTokens" should be decremented by "_count".
    (tokenDetails[msg.sender].remainingTokens - _count);           //Part 1 Task 5 – 1 line

    bidders[tokenDetails[msg.sender].personId].remainingTokens= tokenDetails[msg.sender].remainingTokens; //updating the same balance in bidders map. 
    Item storage bidItem = items[_itemId]; 
    for(uint i=0; i<_count;i++) { 
        bidItem.itemTokens.push(tokenDetails[msg.sender].personId); 
    }
} 

Кто-нибудь, кто может помочь?

Ответы (1)

Вы берете переменную _countв качестве параметра функции, а функция public. Поэтому любой, кто запускает функцию, может решить, сколько итераций проходит ваш цикл. Оценщик газа не может знать, есть ли 1 итерация или 1 миллион итераций, и поэтому он, вероятно, предполагает худшее и говорит, что требования к газу слишком высоки.

Тем не менее, я думаю, вы сможете запустить его, если дадите разумную _countсумму. Просто игнорируйте предупреждения.

Вы никогда не должны давать конечному пользователю возможность определять, сколько итераций должно пройти что-либо. Это должно решаться в вашей внутренней логике. Я не совсем уверен, что должен делать ваш цикл, но вы должны переосмыслить его.

PS Вы должны использовать requireвместо ваших if ... returnзаявлений.