
Измерение gas— это концепция, фундаментальная для Aptos и многих других блокчейнов — она определяет абстрактное измерение количества вычислительных ресурсов и ресурсов хранения, необходимых для выполнения и хранения транзакции. Это похоже на работу автомобиля на бензине или отопление на природном газе. График газа затем систематизирует эти затраты для всех операций и используется для расчета количества газа, используемого во время выполнения транзакции.
Наши усилия по составлению графика подачи газа для Aptos были настоящим приключением! Move был плохо подготовлен к надлежащему графику газа. Его последнее воплощение фактически предназначалось для работы вообще без газа и, следовательно, имело только тривиальную систему.
Чтобы эффективно взимать плату, наш процесс в Aptos заключался в следующем:
- Определить наши принципы,
- Подготовьте структуру оценки для определения цен за операцию,
- Построить систему учета газа и алгебру безопасного газа для Move,
- Импортируйте структуру восходящего газа в Aptos,
- Сделайте газовую структуру осведомленной о хранении,
- Наконец, уточняйте, уточняйте и уточняйте газовый график.
Принципы
Наши определяющие принципы:
- Стоимость операции должна быть напрямую связана с доступными ресурсами в сети (например, ЦП, память, сеть, операции ввода-вывода хранилища, использование пространства и т. д.). Кроме того, эта стоимость должна отражать эволюцию изменений стоимости ресурсов с течением времени из-за новых технологий и усовершенствований процессов.
- Газ должен устанавливаться внутрисетевым управлением и легко настраиваться.
- Gas предотвращает DoS-атаки на фиксированный набор ресурсов в сети, и может потребоваться быстрая корректировка с помощью предложений по управлению в зависимости от ситуации в сети.
- Цена на газ Aptos отражает стремление Aptos Foundation ускорить рост и сделать блокчейн доступным для всех.
- Мотивируйте правильный выбор в дизайне — например, уделяйте первостепенное внимание безопасности, модульности, утверждениям и использованию событий.
Измерение gas
Когда пользователь отправляет транзакцию, он также должен указать в транзакции два количества:
- Максимальное количество газа: Измеряется в газовых единицах. Это максимальное количество единиц газа, которое пользователь (то есть отправитель транзакции) готов потратить для выполнения транзакции.
- Цена за единицу газа: измеряется в октнах за единицу газа , где 1 окта = 0,00000001 APT (= 10$^{-8}$). Это цена газа, которую пользователь готов платить.
Во время исполнения транзакции взимается плата:
- Внутренняя стоимость с фиксированной базой плюс дополнительные для крупных транзакций.
- Затраты на выполнение для выполнения инструкций Move.
- Стоимость чтения для чтения данных из постоянного хранилища.
- Затраты на запись для записи данных в постоянное хранилище.
Окончательную комиссию за транзакцию можно рассчитать путем умножения общего количества потребленного газа (измеряемого в единицах газа) и цены за единицу газа. Например, если транзакция потребляет 670 единиц газа, а цена за единицу газа, указанная пользователем в транзакции, составляет 100 окта за единицу, то конечная комиссия за транзакцию составит 670 * 100 = 67000 октав = 0,00067 APT.
Если во время выполнения транзакции заканчивается газ, с отправителя будет взиматься плата в зависимости от максимального количества газа, и все изменения, сделанные этой транзакцией, будут отменены.
Построение графика gas
Базовая конфигурация
Есть несколько составляющих газового графика, не относящихся к специфике отдельной операции. К ним относятся размер транзакции и максимальное количество единиц газа (отличное от максимального количества газа, которое пользователь указывает в транзакции).
Размер транзакции
Для большинства транзакций размер транзакции, вероятно, будет порядка килобайта. Однако публикация модуля Move может легко занимать несколько килобайт, а Aptos Framework — порядка 100 КБ. Кроме того, размер большинства пользовательских модулей обычно составляет от 4 КБ до 40 КБ. Первоначально мы установили значение размера транзакции на 32 КБ, но сообщество быстро отреагировало и попросило больше места, чтобы упростить разработку приложений, поэтому размер был изменен на 64 КБ.
Очень большие транзакции вызывают расходы на полосу пропускания во всей сети и могут отрицательно сказаться на производительности. В случае злоупотребления мемпулы поощряются к игнорированию более крупных транзакций, поэтому наш подход состоит в том, чтобы найти баланс между максимальным размером транзакции и доступностью.
Максимальное количество единиц gas
Максимальное количество единиц газа в расписании газа определяет, сколько операций может выполнять транзакция. Обратите внимание, что это отличается от максимального количества газа, которое пользователь указывает в транзакции.
Максимальное количество единиц газа в газовом расписании напрямую влияет на то, как долго может выполняться транзакция. Установка слишком высокого значения может привести к транзакциям, которые негативно скажутся на производительности блокчейна. Например, пользователь может забыть добавить приращение в цикле while, что приведет к бесконечному циклу, что, к сожалению, является распространенной ошибкой. Мы обнаружили, что даже с нашим самым большим обновлением инфраструктуры мы по-прежнему использовали менее 90% максимального количества газовых единиц графика газа, которое установлено на уровне 1 000 000.
Исполнение
Чтобы оценить затраты на выполнение, мы создали тестовую среду и использовали Valgrind для профилирования Move VM во время выполнения этой платформы. Результатом этого является набор аннотированного исходного кода, который сообщает нам, сколько машинных инструкций потребовала каждая строка кода.
С помощью описанного выше профилирования мы получили приблизительную оценку относительной стоимости всех инструкций Move и нативных функций.
Однако мы заметили, что у этого метода есть некоторые проблемы со встроенными функциями: они не включаются автоматически в подсчет вызывающего кода. Мы также увидели, что это происходило только тогда, когда мы профилировали определенные инструкции Move, и мы смогли обойти это, сложив числа.
Впоследствии, рассмотрев парадигмы кодирования, повышающие надежность и безопасность системы, команда пришла к окончательному числу выполняемых машинных инструкций. Это число, в свою очередь, сопоставлялось с единицами хранения и максимального количества газа, чтобы определить их текущие значения в графике подачи газа.
Хранилище
Всякий раз, когда осуществляется доступ к элементу состояния реестра или данным, хранящимся в постоянном хранилище, узел Aptos выполняет чтение или запись на устройство хранения. Общее количество обращений к данным в секунду зависит от пропускной способности устройства хранения и пропускной способности IOPS. Подобно циклам ЦП для вычислительной части графика газа, доступ к данным является временным дефицитом, за который пользователи блокчейна конкурируют на рынке комиссий, пока система находится под нагрузкой. Кроме того, стоимость занятого диска для записанных данных постоянна в цепочке. Команда Aptos разработала график хранения газа с учетом этих затрат.
Доступ к любому элементу состояния и его хранение требует затрат, связанных со структурой данных ( дерево медузы Меркла ), аутентифицирующей все состояние блокчейна. Эта стоимость связана с количеством отдельных элементов состояния (из $2^{256}$). Существует также стоимость, пропорциональная размеру каждого элемента. За работу с одним элементом состояния взимается плата (за исключениями, описанными в следующем разделе):
Плата за газ хранения = Плата за товар + (Плата за байт * байты)
Читайте, творите и пишите
Любой доступ к элементу состояния попадает в одну из этих трех категорий: чтение, создание или запись. За доступ взимается плата за элемент и плата за байт, как показано в приведенном выше уравнении.
- Чтение является наиболее распространенной операцией и ограничивается только временной нехваткой ресурсов. Следовательно, плата за чтение откалибрована в зависимости от дисковых операций ввода-вывода в секунду (плата за единицу) и пропускной способности эталонной спецификации оборудования .
- Создание добавляет новый элемент в хранилище состояний. В результате create увеличивает структуру данных аутентификации и делает все более дорогим и в результате стоит больше всего. Плата за создание откалибрована в зависимости от эталонного дискового пространства, которое есть в сети. Как следствие, потребуется нетривиальное количество газа, чтобы заполнить диск предметами (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 .
Стоимость единицы стабильного gas
Независимо от стоимости выполнения операции в терминах рыночной стоимости APT или фиатной валюты, каждая операция и сама транзакция требуют фиксированной удельной стоимости относительно затрат на хранение и выполнение. Фиксированная стоимость единицы газа помогает сохранить график поставок газа статичным и не зависеть от стоимости APT на свободном рынке. Кроме того, правильный выбор числа точных цифр для газовой единицы может помочь сохранить статичность газового графика. Имея это в виду, команда достигла примерно 3-значной точности для выражения газовых единиц. Следовательно, стоимость транзакции перевода составляет примерно 700 единиц газа.
Участие сообщества
Даже после того, как мы проделали значительную работу по его разработке, график подачи газа далек от совершенства. Поскольку это общественный проект, важно, чтобы вы, члены сообщества Aptos:
- Определите странности в газовом графике, исходя из своего опыта.
- Озвучивайте свои опасения и участвуйте в обсуждениях сообщества.
- Голосуйте за предложения по управлению, связанные с газом, на Aptos.
Как скорректировать расходы на gas
График подачи газа хранится в виде сетевой конфигурации. Благодаря предложениям по управлению Aptos можно изменить плату за газ и легко добавить новые инструкции или встроенные функции.
График газа в сети разработан с возможностью расширения, что позволяет обновлять его с помощью предложений по управлению. Поскольку Aptos и сообщество Aptos продолжают улучшать Move VM и учитывают отзывы пользователей, параметры газа можно со временем корректировать.
Иногда формулы газа могут потребовать сложных изменений, выходящих за рамки конфигурации в цепочке. Эти формулы газа обычно закодированы в Rust и отличаются флагами функции газа в цепочке. Для обновления этих формул программное обеспечение узла должно быть обновлено новой формулой, отмеченной отдельным флагом функции газа. Затем программное обеспечение узла должно быть опубликовано и в значительной степени адаптировано для операторов узла. Наконец, для использования новой газовой версии необходимо опубликовать и утвердить предложение по управлению.
Будущая работа
Это первая жизнеспособная газовая структура для Move. Требовались существенные модификации как Move VM, так и Aptos-Core. Мы надеемся, что эта работа проложит путь для следующей будущей работы:
- Снизить затраты на выполнение. Наличие реалистичной газовой модели показывает, где компилятор и виртуальная машина имеют эффективность. Команда может улучшить многое из этого, чтобы снизить затраты на выполнение. Например, вызовы функций показывают возможность улучшения.
- Многомерный учет газа , позволяющий пользователям задавать отдельные бюджеты на исполнение и хранение. Пользователям тогда не пришлось бы платить непомерные цены за газ за плохо запрограммированные приложения, которые выполняются слишком долго. Это также позволило бы более точно определить максимальную цену газа для транзакции на стороне блокчейна.
- Смягчение раздутого состояния. В настоящее время нет простого способа уменьшить набор состояний, за исключением контрактов (или пользователей), которые явно удаляют вещи. Плата пользователям за удаление данных может привести к арбитражным возможностям, когда пользователи создают хранилище, когда это дешево, и удаляют его, когда это дорого. Aptos отложил решение этой проблемы, что может демотивировать разработчиков удалять данные в сети. Команда изучает концепцию TTL для каждого элемента, которая будет удалять недоступные элементы состояния по истечении TTL.
Благодарности
Особая благодарность Alnoki из Econia Labs и Роберту Чену из OtterSec за их обзоры и отзывы.