Вызов функции, который не изменяет стоимость газа в состоянии контракта

Я несколько раз читал, что на Эфириуме все стоит газа. Но когда я пишу и использую функцию, которая не меняет состояние контракта (т.е. суммирует два параметра и возвращает сумму), это не стоит никакого газа.

Итак, что на самом деле означает утверждение «в Эфириуме все стоит газа»?

Ответы (1)

Функции, которые не изменяют состояние, могут быть явно записаны как функции только для чтения с использованием модификаторов viewи pure(ранее constant).

  • view: будет считывать состояние, но не изменять его.
  • pure: Не нуждается в доступе к состоянию и не изменит его.

Клиент также может вызывать любую функцию, используя .call()метод Web3.

Во всех трех случаях применяется следующее:

  1. Контракт будет работать на локальном процессоре с использованием локальной копии блокчейна (если это вообще необходимо), и не будет никакой сетевой проверки.
  2. Учет газа EVM применяется и будет отслеживаться. То есть, если в контрактную функцию входит учет газа (сколько осталось?), то она будет работать в штатном режиме в режиме «пробной проработки», используя call(), например. То же самое относится и к ситуациям «без газа». Вместе с запросом должно быть предоставлено достаточное количество газа.
  3. Поскольку нет проверки сети, нет возможности изменить состояние. Это включает в себя тот факт, что эфир, потраченный на поставку газа, фактически возвращается. Точнее, он так и не был отправлен, потому что сеть не была проинформирована.

Каждый OPCODE уровня ассемблера имеет определенную стоимость. Было бы несколько более точным обобщением сказать, что все операции по изменению состояния стоят газа. Я хотел бы сказать, что чтение бесплатно. В конце концов, они есть, если их правильно реализовать. Надеюсь, приведенные выше детали прояснят ситуацию.

Надеюсь, это поможет.