Плата за газ, сгенерированная переменными состояния Solidity, локальными переменными и структурами

1. Государственная плата за хранение переменной

В Solidity стоимость хранения переменной состояния определяется ее типом данных. Вот некоторые распространенные типы переменных состояния и стоимость их хранения:

  • Логический (bool): Булев тип данных занимает один байт пространства при сохранении. Следовательно, стоимость хранения булевой переменной составляет 200 единиц газа.

  • Integer (int, uint): стоимость хранения целочисленного типа данных зависит от количества цифр в нем. Например, стоимость хранения типов int8 и uint8 составляет 200 единиц газа, а стоимость хранения типов int256 и uint256 — 8000 единиц газа. За каждый дополнительный бит плата за хранение будет увеличиваться на 200 газа.

  • Address (адрес): тип адреса занимает 20 байтов пространства при сохранении. Следовательно, стоимость хранения переменной типа адреса составляет 20 * 200 = 4000 газа.

  • Массив байтов фиксированной длины (bytesN): Массив байтов фиксированной длины занимает N байтов пространства при сохранении. Следовательно, стоимость хранения переменной массива байтов фиксированной длины составляет N * 200 газа.

  • Массив байтов динамической длины (байты). Массив байтов динамической длины при сохранении содержит две части: одна часть представляет собой указатель на фактические данные, а другая часть представляет собой пространство для хранения фактических данных. Стоимость хранения переменной массива байтов динамической длины представляет собой базовую стоимость плюс стоимость фактически занятых данных. Базовая плата — это стоимость, необходимая для создания указателя и размещения фактических данных, которая составляет 37000 газа. Стоимость фактического использования данных составляет 200 газа за байт. Следовательно, стоимость хранения переменной массива байтов динамической длины длиной N составляет 37000 + N * 200 газа.

  • Массив динамической длины (массив): Хранилище массива динамической длины состоит из двух частей: одна часть — это пространство для хранения длины массива, а другая часть — это пространство для хранения элементов массива. Стоимость хранения переменной массива динамической длины представляет собой базовую стоимость плюс стоимость заполнения элемента массива. Базовая плата — это стоимость, необходимая для создания длины массива, которая составляет 20000 газа. Стоимость, занимаемая элементом массива, связана с типом элемента. Например, если элемент массива является целочисленной переменной, стоимость хранения каждого элемента зависит от количества битов в целочисленной переменной.

2. Местная переменная плата за газ

В Solidity стоимость хранения локальных переменных, определенных внутри функций, определяется их типом данных и областью действия. Вот некоторые распространенные типы локальных переменных и стоимость их хранения:

  • Логический (bool): Булев тип данных занимает один байт пространства при сохранении. Следовательно, стоимость хранения булевой переменной составляет 3 газа.

  • Integer (int, uint): стоимость хранения целочисленного типа данных зависит от количества цифр в нем. Например, стоимость хранения типов int8 и uint8 составляет 3 газа, а стоимость хранения типов int256 и uint256 — 32 газа. За каждый дополнительный бит плата за хранение будет увеличиваться на 1 газ.

  • Address (адрес): тип адреса занимает 20 байтов пространства при сохранении. Следовательно, стоимость хранения переменной адресного типа составляет 3 газа.

  • Массив байтов фиксированной длины (bytesN): Массив байтов фиксированной длины занимает N байтов пространства при сохранении. Следовательно, стоимость хранения переменной массива байтов фиксированной длины составляет 3 газа.

  • Массив байтов динамической длины (байты). Массив байтов динамической длины при сохранении содержит две части: одна часть представляет собой указатель на фактические данные, а другая часть представляет собой пространство для хранения фактических данных. Стоимость хранения переменной массива байтов динамической длины представляет собой базовую стоимость плюс стоимость фактически занятых данных. Базовая плата — это стоимость, необходимая для создания указателя и размещения фактических данных, что составляет 68 газа. Стоимость фактического использования данных составляет 3 газа за байт. Следовательно, стоимость хранения переменной массива байтов динамической длины длиной N составляет 68 + N * 3 газа.

  • Массив динамической длины (массив): Хранилище массива динамической длины состоит из двух частей: одна часть — это пространство для хранения длины массива, а другая часть — это пространство для хранения элементов массива. Стоимость хранения переменной массива динамической длины представляет собой базовую стоимость плюс стоимость заполнения элемента массива. Базовая стоимость — это стоимость, необходимая для создания длины массива, которая составляет 68 газа. Стоимость, занимаемая элементом массива, связана с типом элемента. Например, если элемент массива является целочисленной переменной, стоимость хранения каждого элемента зависит от количества битов в целочисленной переменной.

3. Плата за газ для структурной структуры

 В Solidity структура — это определяемый пользователем тип данных, который может состоять из нескольких переменных. Как и для других типов данных, структурным переменным также необходимо выделять место в памяти, поэтому стоимость хранения структурных переменных зависит от типа и количества переменных-членов.

Стоимость хранения структурной переменной включает две части: базовую стоимость и стоимость пространства, занимаемого переменными-членами.

Базовая стоимость включает фиксированную стоимость создания структурной переменной. Базовая стоимость создания структурной переменной:

  • Фиксированная плата в размере 20 единиц газа за единовременное создание нового слота хранилища;
  • Стоимость хранения каждой переменной-члена, связанная с типом переменной-члена. Например, если переменная-член является целым числом типа uint256, ее хранение стоит 32 газа.

Стоимость места, занимаемого переменными-членами, зависит от их типа и количества. В частности, если переменная структуры содержит N переменных-членов, а пространство для хранения, занимаемое каждой переменной-членом, равно S_i, то стоимость хранения этой переменной структуры составляет:

Базовая стоимость + ∑S_i

Другой порядок элементов структуры не повлияет на стоимость хранения переменных. Это связано с тем, что Solidity выделяет определенное место хранения для каждой переменной-члена во время компиляции, не зависимо от ее расположения в структуре.

Когда вы определяете тип структуры, компилятор компилирует его в массив байтов фиксированного размера и назначает фиксированное смещение каждой переменной-члену в нем. Это смещение представляет собой положение переменной-члена в массиве байтов, которое определяется во время компиляции.

Следовательно, независимо от порядка, в котором вы указываете переменные-члены при определении структуры, каждая переменная-член будет выделять место в фиксированном месте и занимать фиксированное количество газа. Это также означает, что если вы измените порядок переменных-членов в структуре, Solidity не изменит стоимость хранения переменных.

Следует отметить, что если вы используете в структуре сложные типы данных, такие как динамические массивы или карты, порядок может повлиять на стоимость хранения этих типов данных. Поскольку сам динамический массив или тип карты могут занимать различное место для хранения, конкретное занимаемое пространство зависит от длины массива или карты или количества пар ключ-значение. Но порядок переменных-членов структуры не влияет на стоимость хранения этих типов данных.

Guess you like

Origin blog.csdn.net/ling1998/article/details/129546523