Какие виды операций имеют отрицательную стоимость газа?

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

Ответы (2)

Единственными двумя OPCODE с отрицательной стоимостью газа являются STORAGEKILL(-15000) и GSUICIDEREFUND(-24000).

Это происходит, когда значения хранения удаляются или контакты уничтожаются.

Эти OPCODE обеспечивают возврат газа, потому что они освобождают место в блокчейне.

Цены на все OPCODE можно посмотреть здесь

Более новый «код операции» SELFDESTRUCT является псевдонимом SUICIDE; GSUICIDEREFUND напрямую относится и к SELFDESTRUCT.
Обратите внимание, что на самом деле они не требуют отрицательного газа; вместо этого они возвращают это количество газа в конце транзакции. Разница важна, если транзакция была отправлена ​​с небольшим количеством газа для начала.
После удаления массива; сколько будет возмещен газ? это будет 15.000 или 15.000 * length_of_the_array? Пожалуйста, смотрите ( ethereum.stackexchange.com/q/69882/4575 ) для более подробной информации. @эт
@TjadenHess, ты забыл о стипендии 2300.

В качестве практического дополнения к ответу Тьядена в Solidity возмещение газа выдается, когда selfdestructили deleteна основе существующих данных :

delete aприсваивает начальное значение для типа a. Т.е. для целых чисел это эквивалентно a= 0, но его также можно использовать для массивов, где он присваивает динамический массив нулевой длины или статический массив той же длины со сбросом всех элементов. Для структур он назначает структуру со всеми сброшенными элементами.

deleteне влияет на целые отображения (поскольку ключи отображений могут быть произвольными и, как правило, неизвестными). Поэтому, если вы удалите структуру, она сбросит все члены, которые не являются сопоставлениями, а также рекурсивно перейдет к членам, если они не являются сопоставлениями. Однако отдельные ключи и то, на что они сопоставляются, можно удалить.

Важно отметить, что на delete aсамом деле ведет себя как присваивание a, т. е. сохраняет новый объект в a.

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