Составили «Аукционный договор» и получили предупреждение о повышенных требованиях к газу. Означает: не может запустить его. Ниже строки с комментариями и те строки, которые я включил (//Часть 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);
}
}
Кто-нибудь, кто может помочь?
Вы берете переменную _count
в качестве параметра функции, а функция public
. Поэтому любой, кто запускает функцию, может решить, сколько итераций проходит ваш цикл. Оценщик газа не может знать, есть ли 1 итерация или 1 миллион итераций, и поэтому он, вероятно, предполагает худшее и говорит, что требования к газу слишком высоки.
Тем не менее, я думаю, вы сможете запустить его, если дадите разумную _count
сумму. Просто игнорируйте предупреждения.
Вы никогда не должны давать конечному пользователю возможность определять, сколько итераций должно пройти что-либо. Это должно решаться в вашей внутренней логике. Я не совсем уверен, что должен делать ваш цикл, но вы должны переосмыслить его.
PS Вы должны использовать require
вместо ваших if ... return
заявлений.