Составление графика газа в Aptos

vizimnokh
7 min readOct 23, 2022

--

Дата публикации в официальном блоге Medium и автор:
October 14, 2022
Aptos

Вы не можете управлять автомобилем без бензина, и вы не сможете уехать далеко, если не будете знать, сколько бензина вам нужно. Расчет газа является концепцией, основополагающей для блокчейна Aptos — он определяет абстрактное измерение количества вычислительных ресурсов и ресурсов хранения, необходимых для выполнения и хранения транзакции. Газовый график кодирует затраты на все операции в сети и рассчитывает количество газа, используемого для выполнения транзакции.

Чтобы создать первый готовый к работе график газа на Move в Аптосе, мы

  • Определили принципы,
  • Подготовили структуру оценки для определения цен за каждую операцию,
  • Построили систему расчета газа и математическое вычисление безопасного использования газа для Move,
  • Импортировали структуру подачи газа в Aptos,
  • Сделали газовую структуру доступную для хранения данных

Принципы

При принятии решений мы руководствовались 5 принципами:

  1. Взимание платы исходя из фактических затрат: стоимость операции напрямую связана с доступными ресурсами в сети (например, CPU, память, сеть, операции ввода-вывода из хранилища, использование хранилища и т. д.). Эта стоимость должна отражать эволюцию изменений стоимости ресурсов в связи с появлением новых технологий и усовершенствованием процессов.
  2. Простота конфигурирования: использование внутрисетевого управления для обновления графика газа.
  3. Обеспечение равного доступа: сеть — это общее благо, политика должна предотвращать атаки отказа в обслуживании.
  4. Поддержка роста и доступности: при здоровом стабильном состоянии Aptos Foundation предпочитает более низкую плату за газ, чтобы обеспечить лучшую доступность и способствовать росту экосистемы.
  5. Приоритет на доступность: взимание более низкой платы за операции, которые стимулируют безопасность, модульность, подтверждения и уведомления о событиях.

Измерение газа

Когда пользователь подтверждает транзакцию, он также должен указать в транзакции два значения:

  • Максимальное количество газа: измеряется в газовых единицах. Это максимальное количество единиц газа, которое пользователь (то есть отправитель транзакции) готов потратить для выполнения транзакции.
  • Цена за единицу газа: измеряется в октах за единицу газа, где 1 окта = 0,00000001 APT (= 10$^{-8}$). Это цена газа, которую пользователь готов платить.

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

Например, если транзакция потребляет 670 единиц газа, а цена за единицу газа, указанная пользователем в транзакции, составляет 100 окта за единицу, то окончательная комиссия за транзакцию составит 670 * 100 = 67000 октав = 0,00067 APT.

Если во время выполнения транзакции заканчивается газ, с отправителя будет взиматься плата в зависимости от максимального количества газа, и все изменения, внесенные этой транзакцией, будут отменены.

Построение графика газа

Базовая конфигурация

Есть несколько составляющих графика газа, не относящихся к специфике отдельной операции. К ним относятся размер транзакции и максимальное количество единиц газа (должно отличаться от максимального количества газа, которое пользователь указывает в транзакции).

Размер транзакции

Для большинства транзакций размер транзакции, вероятней всего, будет порядка килобайта. Однако публикация модуля Move может легко занимать несколько килобайт, а Aptos Framework — порядка 100 КБ. Более того, размер большинства пользовательских модулей обычно составляет от 4 КБ до 40 КБ. Изначально мы установили значение размера транзакции в 32 КБ, но сообщество быстро отреагировало и попросило больше места, чтобы упростить разработку приложений, поэтому размер был изменен на 64 КБ.

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

Максимальное количество единиц газа

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

Максимальное количество единиц газа в графике напрямую влияет на то, как долго может выполняться транзакция. Установка слишком высокого значения может привести к транзакциям, которые негативно скажутся на производительности блокчейна. Например, пользователь может забыть добавить прирост в цикле while, что приведет к бесконечному циклу. К сожалению, это является довольно распространенной ошибкой. Мы обнаружили, что даже при самом большом обновлении инфраструктуры мы по-прежнему использовали менее 90% от максимального количества газовых единиц, установленного в графике газа, которое составляет 1 000 000.

Выполнение

Чтобы оценить затраты на выполнение, мы создали контрольный фреймворк и использовали Valgrind для профилирования Move VM во время выполнения этого фреймворка. Результатом этого является набор аннотированного исходного кода, который указывает на количество машинных инструкций необходимых для каждой строки кода.

С помощью описанного выше профилирования мы получили приблизительную оценку относительной стоимости всех инструкций Move и встроенных функций.

Однако мы также заметили, что у этого метода есть определенные проблемы со встроенными функциями: они не включаются автоматически в подсчет вызывающего пользователя. Также мы обнаружили, что это происходило только тогда, когда мы профилировали определенные инструкции Move, и сложив числа, нам удалось избежать этого.

Впоследствии, рассмотрев парадигмы кодирования, повышающие надежность и безопасность системы, команда пришла к необходимому числу вычислительного оборудования. Это число, в свою очередь, сопоставлялось с единицами хранения и максимального количества газа, чтобы определить их текущие значения в графике газа.

Хранилище

Каждый раз, когда осуществляется доступ к элементу состояния реестра или данным, хранящимся в постоянном хранилище, нода Aptos выдает команду на чтение или запись на устройство хранения. Общее количество обращений к данным в секунду зависит от пропускной способности устройства хранения и пропускной способности IOPS. Подобно циклам CPU для вычислительной части графика газа, доступ к данным является временным дефицитом, за который пользователи блокчейна конкурируют на рынке комиссий, пока система находится под нагрузкой. Кроме того, стоимость занятого диска для записанных данных постоянна в сети. Команда Aptos разработала график хранения газа с учетом этих затрат.

Доступ к любому элементу и его хранение требует затрат, связанных со структурой данных (Jellyfish Merkle Tree) аутентифицирующей все состояние блокчейна. Эта стоимость связана с количеством отдельных элементов состояния (из $2^{256}$). Существует также стоимость, пропорциональная размеру каждого элемента. За работу с одним элементом состояния взимается плата (с исключениями, описанными в следующем разделе):

Плата за газ при хранении = Плата за файл + (Плата за байт * байты)

storage gas fee = item_fee + (byte_fee * bytes)

Читайте, создавайте и пишите

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

  • Чтение — наиболее распространенная операция, которая ограничивается только временной нехваткой ресурсов. Следовательно, плата за чтение откалибрована в зависимости от дисковых операций ввода-вывода в секунду (плата за единицу) и пропускной способности эталонной спецификации оборудования.
  • Создание добавляет новый элемент в хранилище состояния. В результате увеличивается структура данных аутентификации и цена. Плата за создание откалибрована в зависимости от эталонного дискового пространства, которое есть в сети. Как следствие, потребуется нетривиальное количество газа, чтобы заполнить диск файлами (item_fee) и байтами (byte_fee).
  • Запись обновляет существующий элемент в хранилище состояния. Следовательно, запись не создает дополнительных расходов в структуре данных аутентификации. Тем не менее, изменив существующие файлы на более крупные байты, диск все же можно испортить. Следовательно, мы взимаем байты в обновленном файле так же, как и байты при создании.

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

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

  • per_item_read: откалибровано по количеству операций ввода-вывода
  • per_byte_read: откалиброван по реальной пропускной способности
  • per_item_create: откалибровано по целевому количеству предметов
  • per_byte_create: откалиброван по целевому общему размеру — первый 1 КБ включен в каждый элемент
  • per_item_write: то же самое с per_item_read
  • per_byte_write: то же самое с per_byte_create

Для получения дополнительной информации: https://aptos.dev/concepts/base-gas/#storage-gas.

Стоимость единицы стабильного газа

Независимо от стоимости выполнения операции в терминах рыночной стоимости APT или фиатной валюты, каждая операция и сама транзакция требуют фиксированной удельной стоимости относительно затрат на хранение и выполнение. Фиксированная стоимость единицы газа помогает сохранить график поставки газа статичным и не зависеть от стоимости APT на свободном рынке. Кроме того, правильный выбор числа точных цифр для газовой единицы может помочь сохранить статичность графика газа. Имея это в виду, команда достигла примерно 3-значной точности для выражения газовых единиц. Следовательно, стоимость транзакции перевода составляет примерно 700 единиц газа.

Как скорректировать расходы на газ

График газа хранится в виде внутрисетевой конфигурации. С помощью предложений по управлению Aptos, плату за газ можно легко изменить, а также можно изменить принцип работы или другие функции.

График газа в сети разработан так, чтобы его можно было расширять, что позволяет обновлять его с помощью предложений по управлению. Поскольку Aptos и сообщество Aptos продолжают улучшать Move VM и учитывают отзывы пользователей, параметры газа можно со временем корректировать.

Иногда формулы газа могут потребовать сложных изменений, выходящих за рамки конфигурации сети. Эти формулы газа обычно закодированы в Rust и помечаются флажками в сети. Для обновления этих формул программное обеспечение ноды должно быть обновлено новой формулой, отмеченной отдельным флажком. Затем программное обеспечение ноды должно быть опубликовано и в значительной степени адаптировано для операторов нод. Наконец, для использования новой газовой версии необходимо опубликовать и утвердить предложение по управлению.

Планы на будущее

Это первая жизнеспособная газовая структура для Move. Требовались существенные модификации как MoveVM, так и Aptos-Core. Мы надеемся, что упростит следующие задачи:

  • Снизить затраты на выполнение. Наличие реалистичной газовой модели показывает, где компилятор и виртуальная машина имеют эффективность. Команда может улучшить многое из этого, чтобы снизить затраты на выполнение. Например, вызовы функций показывают возможность улучшения.
  • Многомерный учет газа, позволяющий пользователям задавать отдельные бюджеты на исполнение и хранение. Пользователям тогда не пришлось бы платить непомерные цены за газ за некачественно запрограммированные приложения, которые выполняются слишком долго. Это также позволило бы более точно определить максимальную цену газа для транзакции на стороне блокчейна.
  • Смягчение состояния. Плата пользователям за удаление данных может привести к арбитражным возможностям, когда пользователи создают хранилище, когда это дешево, и удаляют его, когда это дорого. Aptos отложил решение этой проблемы, что может демотивировать разработчиков удалять данные в сети. Команда изучает концепцию TTL для каждого элемента, которая будет удалять недоступные элементы состояния по истечении TTL.

Благодарности

Особая благодарность Алноки из Econia Labs и Роберту Чену из OtterSec за их обзоры и отзывы.

Оригинал статьи: https://medium.com/508d5686a350

--

--

vizimnokh

Smth new for me and russian introduction into crypto projects