Счета, транзакции, газ и блокировка газовых лимитов в Ethereum

Счета, транзакции, газ и блокировка газовых лимитов в Ethereum

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

Какие аккаунты?

EOA против контрактных счетов

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

  • Внешние счета
  • Контракты Счета

Внешние счета (EOA)

Внешне контролируемый счет

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

Контокоррентные счета

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

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

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

операции

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

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

Сообщения

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

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

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

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

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

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

Газ и транзакционные издержки

Каждая транзакция должна включать лимит газа (иногда называемый startGas) и плату, которую она готова платить за газ. У майнеров есть выбор: включить транзакцию и получить комиссию или нет. На самом деле, сегодня все транзакции в конечном итоге забираются майнерами, но размер комиссии за транзакцию, которую пользователь выбирает для отправки, влияет на то, сколько времени потребуется, пока транзакция будет добыта. Если общее количество газа, используемого на этапах вычисления, порожденных транзакцией, включая исходное сообщение и любые дополнительные сообщения, которые могут быть инициированы, меньше или равно пределу газа, то транзакция обрабатывается. Если общее количество газа превышает лимит газа, то все изменения отменяются, за исключением того, что транзакция все еще действует и майнер может по-прежнему взимать плату. Блокчейн показывает, что была сделана попытка транзакции, но она не обеспечила достаточное количество газа, и все контрактные операции были отменены. Весь избыточный газ, не использованный при выполнении транзакции, возвращается отправителю в виде эфира. Поскольку оценки стоимости газа являются лишь приблизительными, многие пользователи переплачивают за газ, чтобы гарантировать, что их транзакция будет принята. Это нормально, потому что любой избыток газа возвращается вам.

Оценка трансакционных издержек

Общая стоимость транзакции зависит от 2 факторов:

gasUsed: общее количество газа, потребляемое транзакцией

Общая стоимость = использованный газ цена на газ

gasUsed

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

gasPrice

Пользователь конструирует и подписывает транзакцию, и каждый пользователь может указать любой желаемый gasPrice, который может быть нулевым. Тем не менее, клиенты Ethereum, запущенные на Frontier, имели стандартную цену за газ 0,05e12 wei. Поскольку майнеры оптимизируют свои доходы, если большинство транзакций подаются с ценой gasPrice 0.05e12 wei, будет трудно убедить майнера принять транзакцию, которая указала бы более низкий или нулевой gasPrice.

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

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

Следовательно, общая плата за передачу составит 0,00042 эфира.

Отправка токенов обычно занимает

100000 газа, поэтому общая плата за передачу увеличивается до 0,001 ETH. 0,002 ETH.

Что такое «блок ограничения газа»?

Пределы газа блока. это максимальное количество газа, разрешенное в блоке, чтобы определить, сколько транзакций может поместиться в блок. Например, допустим, у нас есть 5 транзакций, где каждая транзакция имеет ограничение по газу 10, 20, 30, 40 и 50. Если ограничение по блоку газа составляет 100, то первые четыре транзакции могут поместиться в блоке. Майнеры решают, какие транзакции включить в блок. Другой майнер может попытаться включить последние 2 транзакции в блок (50 40), и у них есть место только для включения первой транзакции (10). Если вы попытаетесь включить транзакцию, в которой используется больше газа, чем текущий лимит блокировки газа, она будет отклонена сетью, и ваш клиент Ethereum выдаст вам сообщение «Транзакция превышает лимит блокировки газа». Автором этого примера послужила публикация Ethereum StackExchange от «ethers».

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

Кто решает, что такое лимит газа блока?

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

Счета, транзакции, газ и блокировка газовых лимитов в Ethereum

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

Майнеры на Ethereum используют программу майнинга, такую ​​как ethminer, которая подключается к клиентскому узлу geth или Parity Ethereum. У geth и Parity есть опции, которые майнеры могут изменить. Здесь перечислены параметры командной строки geth для майнинга, а параметры Parity здесь.

Что такое «DoS» сети Ethereum?

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

Вредоносный DoS

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

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

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

Non-Malicious DoS

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

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

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

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

Что майнеры должны сделать, чтобы это исправить?

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

Предлагаемая настройка

объяснение

паритет

Предлагаемая настройка

объяснение

gas-floor-target Количество газа на блок для цели при запечатывании нового блока (по умолчанию: 4700000).

gas-cap Ограничение того, насколько мы увеличим лимит газа на блок из-за объема транзакции (по умолчанию: 6283184).

Другие варианты добычи

Посетите страницы параметров CLI для geth и Parity, чтобы увидеть полный список параметров, которые майнеры могут настроить для оптимальной настройки своих параметров.