Я пытаюсь найти решение этой проблемы, связанное с порядком подтверждения транзакции и установкой значений 0
pragma solidity ^0.5.17;
contract Test {
uint256 amount;
constructor() public {}
function join() public {
amount += 100;
}
function leave() public {
amount -= 100;
}
}
Учитывая эти транзакции (проверено на ropsten):
tx 1) Присоединение к вызову Подтверждено amount == 100
tx 2) Присоединение к вызову (цена газа 1) Ожидание amount == 100 should tx3 get mined first
tx 3) Call Leave (цена газа 100) Ожидает amount == 0
Однако tx 2
всегда будет завершаться ошибкой out of gas
до тех пор, пока amount
не будет установлено обратно на 0
. Этого не происходит, если значение превышает 0
. Насколько я понимаю, установка значения в состояние 0
вместо положительного целого числа стоит больше газа, и оценка газа не принимает это во внимание. Я пробовал delete
, надеясь, что это даст возмещение за газ, чтобы компенсировать слишком низкий лимит газа, но это все равно не удалось.
Есть ли элегантный способ справиться с этим сценарием? Единственные способы, которые я могу придумать, — это переоценить газ для всех join
транзакций, что имеет свои очевидные недостатки, или никогда не возвращать amount
к 0
.