Счета, транзакции, газ и лимит газа на блок в эфириуме

Цель этой статьи – помочь людям понять основные принципы действия счетов (аккаунтов), транзакций и «газа» в Эфириуме, а также роль майнеров в определении размера блока.

Что такое счета?

В Эфириуме есть два типа счетов:

  • Счета внешних владельцев (Externally Owned Accounts, EOA)
  • Счета контрактов

В предстоящем обновлении Metropolis различий между ними почти не останется.

Счета внешних владельцев (EOA)

Счёт, управляемый извне:

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

Счета контрактов

Контракт:

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

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

Что такое транзакции и сообщения?

Транзакции

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

Транзакции содержат:

  • идентификатор получателя сообщения;
  • подпись, которая идентифицирует отправителя и подтверждает его намерение отправить сообщение получателю посредством блокчейна;
  • графу VALUE – количество wei для передачи от отправителя получателю;
  • поле для дополнительных данных, которое может содержать сообщение, отправленное в контракт;
  • значение GASLIMIT, представляющее собой максимальное количество вычислительных шагов, которое может занимать выполнение транзакции;
  • значение GASPRICE, представляющее собой сумму, которую отправитель готов заплатить за «газ». Одна единица газа соответствует выполнению одной простейшей инструкции, т.е. одного вычислительного шага.

Сообщения

Контракты обладают способностью отправлять «сообщения» другим контрактам. Сообщения – это виртуальные объекты, которые никогда не сериализуются и существуют только в среде выполнения Эфириума. Их можно рассматривать как средство вызова функций.

Сообщение содержит:

  • идентификатор отправителя сообщения (в скрытой форме);
  • идентификатор получателя сообщения;
  • графу VALUE – количество wei для передачи на адрес получателя вместе с сообщением;
  • поле для дополнительных данных, то есть вводных данных для контракта;
  • значение GASLIMIT, которое ограничивает количество газа, которое может быть израсходовано на выполнение программного кода, инициированное этим сообщением.

По сути, сообщение похоже на транзакцию, за исключением только того, что оно создаётся контрактом, а не внешним субъектом. Сообщение создаётся, когда контракт, выполняющий программный код, выполняет коды операций CALL или DELEGATECALL, которые создают и выполняют сообщение. Сообщения иногда также называют внутренними транзакциями. Как и транзакции, сообщения инициируют выполнение получателем своего программного кода. Таким образом, контракты могут взаимодействовать между собой точно так же, как это делают внешние субъекты. Люди часто используют термин «транзакция», имея в виду сообщение, так что этот термин может быть постепенно выведен сообществом из обращения по причине невостребованности.

Что такое газ?

Эфириум реализует на своём блокчейне среду выполнения, называемую виртуальной машиной Эфириума (Ethereum Virtual Machine, EVM). Каждая нода сети поддерживает работу EVM как части протокола верификации блока. Они проходят через транзакции, включённые в верифицируемый ими блок, и выполняют инициируемый транзакцией код в EVM. Каждая полная нода сети производит одни и те же вычисления и сохраняет одни и те же значения. Естественно, такое избыточное дублирование выполнения контракта на многих нодах делает этот процесс дорогостоящим, что в большинстве случаев создаёт стимул не использовать блокчейн для вычислений, которые можно произвести вне его. Каждая выполняемая операция имеет определённую стоимость, выраженную в количестве единиц газа. Каждая операция, выполнение которой может приносить выгоду, имеет свою стоимость в единицах газа. Здесь приведён несколько устаревший список кодов операций с расходом единиц газа на их выполнение.

Стоимость газа и транзакций

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

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

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

Оценка стоимости выполнения транзакции

Общая стоимость выполнения транзакции в эфирах зависит от двух факторов:

  • gasUsed: общее количество газа, необходимого для выполнения транзакции;
  • gasPrice: стоимость (в эфирах) единицы газа, указанная в транзакции

Общая стоимость = gasUsed * gasPrice

gasUsed

Каждому типу операций, выполняемых EVM, присвоено значение количества расходуемого газа. gasUsed – это сумма всего газа для всех выполненных операций.

Для расчёта приблизительного значения gasUsed существует estimateGas API, который можно использовать, хоть и с некотороми оговорками.

gasPrice

Каждый пользователь, создавая и подписывая транзакцию, может указать любое значение gasPrice (оно может быть и нулевым). Однако в клиентах Эфириума для версии Frontier значение gasPrice по умолчанию равно 0,05e12 wei. Поскольку майнеры стремятся оптимизировать соотношение своих доходов и расходов, если в большинстве транзакций gasPrice будет составлять 0,05e12 wei, убедить майнера принять транзакцию с меньшим либо нулевым значением gasPrice может оказаться непросто.

Пример расчёта стоимости транзакции

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

Лимит газа можно сравнить с количеством литров бензина для автомобиля, а цену единицы газа – со стоимостью литра.

Если бензин для автомобиля стоит около 40 руб. за литр, то в Эфириуме цена единицы газа составляет 20 Gwei. Для того чтобы наполнить бак вашего автомобиля, вам понадобится, скажем 50 литров бензина по 40 руб. = 2 000 руб. Для транзакции же это может быть 21 000 единиц газа по 20 Gwei = 0,00042 ETH.

Таким образом, общая сумма комиссии за выполнение транзакции составит 0,00042 эфира.

Для трансфера токенов, как правило, требуется от ~50 000 до ~100 000 газа – соответственно, стоимость такой транзакции составляет 0,001–0,002 ETH.

Что такое «лимит газа на блок»?

Лимит газа на блок – это максимальное количество газа, которое можно израсходовать при формировании каждого блока. Таким образом ограничивается количество транзакций, которое можно включить в один блок. Предположим, что у нас есть 5 транзакций с лимитом расходуемого газа 10, 20, 30, 40 и 50 единиц. Если лимит газа на блок равен 100, то в один блок можно включить первые 4 транзакции. Решение о том, какие транзакции включить в блок, принимают майнеры. Другой майнер может попробовать включить в блок последние 2 транзакции (50+40), и тогда в этом блоке останется место ещё только для первой транзакции (10). Если вы попытаетесь включить в блок транзакцию, для выполнения которой требуется больше газа, чем допускается лимитом газа для текущего блока, то такой блок будет отклонён сетью, а ваш клиент Эфириума отобразит соответствующее сообщение. Пример взят из этого поста Ethereum StackExchange.

По данным ethstats.net, лимит газа на блок на момент написания этой статьи составляет 4 712 357 единиц газа – то есть в один блок (формирование которого занимает, в среднем, 15–20 секунд) можно включить около 224 транзакций с предельным количеством газа 21 000 единиц. Протокол позволяет майнеру блока регулировать лимит газа на блок в 1/1024 раз (0,0976 %) в любом направлении.

Кто определяет лимит газа на блок?

Значение лимита газа на блок определяют майнеры сети. Помимо определяемого протоколом лимита газа на блок, во многих программах-клиентах устанавливается стратегия майнинга по умолчанию с минимальным лимитом газа на блок, равным 4 712 388. Майнеры могут изменить этот параметр, но многие из них оставляют настройку по умолчанию.

Как изменяется лимит газа на блок?

Майнеры в сети Эфириума используют программы для майнинга, такие, как Ethminer, которые подключаются к клиентскому узлу Geth или Parity. В Geth и Parity есть настройки, которые майнеры могут изменять. Параметры командной строки Geth для майнинга приведены здесь, параметры Parity – здесь.

Что такое DoS сети Эфириума?

Недавно был период, когда со всех сторон раздавались сообщения о том, что сеть Эфириума замедляется, забивается транзакциями и становится непригодной для использования. Многие комментаторы описывали это замедление как «DoS» сети Эфириума. Инцидент отказа в обслуживании (denial of service, DoS) произошёл, когда блоки в сети Эфириума долгое время заполнялись до отказа и образовалась большая очередь из ожидающих подтверждения транзакций. Напомним, что майнеры могут выбирать транзакции для включения в блок исходя из заложенной пользователем комиссии за выполнение транзакции. Если в очереди – или пуле транзакций, как это принято называть – скапливается несколько сотен тысяч транзакций, то это может стать причиной необычной задержки выполнения транзакций на несколько часов. Инциденты DDoS могут быть спровоцированы внешним злонамеренным воздействием либо внутренними техническими причинами.

Злонамеренные DoS

Прошлой осенью Эфириум подвергся так называемой спам-атаке транзакциями. Подробно осенняя атака описана в этом посте:

Злоумышленник совершил DoS-атаку, постоянно вызывая в своих смарт-контрактах определённые операционные коды (опкоды), обладающие большой вычислительной сложностью для программ-клиентов, но с очень небольшой стоимостью добавления их в сеть.

Во время атаки майнерам было предложено снизить лимит газа на блок до 1,5 миллионов единиц, и позже – до 2 миллионов в другом случае. Были и другие случаи, когда майнеров просили временно снизить лимит газа на блок для отражения атаки на сеть.

Незлонамеренные DoS

Незлонамеренные DoS случаются, когда в сети скапливается так много ожидающих выполнения транзакций, что для их обработки требуется значительно больше времени, чем обычно. В последнее время рост числа кампаний по первичной продаже коинов (ICO) и их популярности также вызвали скопление в пуле большого количества транзакций. Ребята из Infura писали в своём блоге о технических подробностях.

Почему лимит газа на блок не увеличивается даже когда блоки заполнены?

Главная причина: майнеры не используют функцию изменения лимита газа.

Протокол Эфириума имеет встроенный механизм, позволяющий майнерам проголосовать за увеличение лимита газа – таким образом, размер блока может быть увеличен без необходимости выполнения скоординированного хард-форка. Первоначально этот механизм сочетался со стратегией, согласно которой майнеры должны были голосовать за размер лимита газа на блок, который должен быть не менее 4,7 миллионов, но может быть увеличен на 150% от недавнего (экспоненциального скользящего) среднего значения для последних 1024-блоков, что позволяет органично увеличивать пропускную способность сети при повышении спроса, одновременно сохраняя верхнюю границу в целях защиты от спам-атак.

Как мы уже упоминали выше, в разделе «Злонамеренные DoS», в прошлом майнерам в нескольких случаях предлагалось изменить настройки своих программ в сторону увеличения лимита газа на блок, чтобы помочь предотвратить атаки на сеть, пока не будут подготовлены необходимые исправления в протоколе. Проблема заключается в том, что некоторые майнинговые пулы никогда не меняли настройки, даже после того, как атаки стихали. Около месяца назад майнерам было предложено изменить параметры лимита газа на блок и цены единицы газа для того, чтобы снова включить опцию адаптивного ограничения количества газа на блок, так как недавние кампании по продаже токенов приводили к быстрому заполнению блоков и вызывали перегрузку блокчейна транзакциями.

ETH Gas Station – превосходный ресурс, на котором можно посмотреть актуальную информацию о том, за какой лимит газа на блок проголосовали майнинговые пулы.

Что нужно сделать майнерам для того, чтобы исправить ситуацию?

Майнеры могут изменить настройки своих программ-клиентов – Geth либо Parity – и включить опцию адаптивного определения лимита газа на блок. Примечание: представленные ниже значения взяты из этого поста в Reddit и в действительности могут быть значительно выше, как объясняется в этом посте.

Geth

Предлагаемые настройки:

—gasprice 4000000000 —targetgaslimit 4712388

Объяснение:

—targetgaslimit Целевой лимит газа устанавливает нижнее пороговое значение количества используемого газа на блок (по умолчанию: 4712388) —gasprice Минимальная цена газа для принятия транзакций для майнинга блоков (по умолчанию: 20000000000). Примечание: gasprice указывается в wei.

Parity

Предлагаемые настройки:

—gas-floor-target 4712388 —gas-cap 9000000 —gasprice 4000000000

Объяснение:

-gas-floor-target Минимальное количество газа на блок при формировании нового блока (по умолчанию: 4700000).

—gas-cap Верхняя граница того, насколько можно увеличить лимит газа на блок в зависимости от объёма транзакции (по умолчанию: 6283184).

—gasprice Минимальное количество wei за единицу газа, которое должно быть уплачено для того, чтобы транзакция была принята для майнинга блоков. Примечание: gasprice указывается в wei. Примечание 2: —gasprice является устаревшей опцией.

Другие параметры майнинга

С полным списком параметров, которые майнеры могут изменять для оптимальной настройки своих программ-клиентов, можно ознакомиться на страницах с параметрами командной строки для Geth и Parity.


Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Загрузка...

Редактор. Маркетолог. Криптоинвестор с 2014 года.