Введение
Все, кто хоть раз переводили криптовалюту, сталкивались с комиссиями систем, в которых работали. В биткойне таким образом поднимается приоритет и ускоряется выполнение транзакции перевода. В эфириуме всё немного сложнее - плата взимается за любую транзакцию сети, будь то перевод денег, токенов или исполнение функций смарт контрактов. Суть данного механизма не только в начислении вознаграждения майнеру, открывшему блок, в который вошла данная транзакция, но и в защите всей сети от преднамеренных или ошибочных действий пользователей, которые без данной комиссии могли бы обрушить всю систему.
В сети эфириума принято называть такую комиссию газом (GAZ) и она начисляется по принципу "двойного этапа", в отличие от явного указания размера оплаты транзакции биткойна. Порой, пользователи эфириума не в состоянии точно понять, что от них хотят, когда им предлагается указать стоимость газа. Конечную сумму комиссии также явно не видно. Её можно ограничить лишь сверху, но точное количество потраченных ETH будет известно только после выполнения транзакции, по завершении которой все не забранные комиссией монеты будут возвращены вам обратно. Как правило, такой механизм не влечёт за собой никаких опасных последствий для пользователей и не вызывает особых подозрений. Но если транзакция будет слишком большой и превысит предел заданного пользователем максимального размера газа, то вся транзакция будет возвращена в исходное состояние, а комиссия окажется потраченной.
Необходимость комиссии в сети Ethereum
Оплата труда майнеров
Согласно теории майнинга, для мотивирования децентрализованных участников сети на проверку транзакций блокчейна приходится платить. Никакие другие механизмы не заставят непричастных к транзакциям участников запускать добровольно на своём оборудовании программы проверки. Только деньги, которые с одной стороны вознаграждают майнера за выполненную работу, а с другой стороны, они же должны откуда-то браться... Об этом читайте далее. Природа происхождения денег, идущих на поощрение майнеров, двулика - это и новые монеты, эмиссия которых происходит с каждым новым открытым блоком, и это комиссия с каждой транзакции, чтобы не так много новых денег пускать в оборот, поскольку данное явление приводит к инфляции.
Защита сети
Итак, мы определились, что комиссия идёт на поощрение майнеров за проделанную ими работу по верификации транзакций блоков блокчейна. Но в сети эфириума комиссия выполняет ещё одну очень важную функцию - защиту сети от падений, которые могли бы быть реализованы программным путём. Всё дело в том, что в основе виртуальной машины эфириума лежит использование полноценного языка программирования, на котором без особых усилий можно реализовать такие вычисления, которые будут происходить бесконечно. Подобная практика приведёт к падению всех нод сети, на которых будет запущен подобный код.
Комиссия в эфириуме реализована таким образом, чтобы быть пропорциональной сложности вычислений в коде контрактов. Т.е. чем более сложное вычисление необходимо для выполнения функции смарт контракта, тем больше за вызов этой функции придётся заплатить комиссии. Добавьте сюда ограничение по объёму вычислений, которые могут содержаться в отдельном блоке, добавляемом майнерами в блокчейн, перемноженное на уплату комиссии при добавлении новых контрактов в сеть и получите остановку возможного попадания в блокчейн эфириума контрактов с подобным кодом.
Понятно, что выполнение сложных функций становится не очень выгодным, а выполнение бесконечных циклов бессмысленным.
Принцип подсчёта
Комиссия в эфириуме реализована в форме отдельной абстрактной величины, пропорциональной сложности вычислений и именуемой газом (GAZ). Данная величина оплачивается эфиром по ценам, заданным пользователями сети, именуемым ценой газа (GAZ PRICE). Цена газа указывается за единицу газа. Транзакция измеряется объёмом газа. Соответственно, за транзакцию необходимо заплатить стоимость всего насчитанного газа, т.е:
Стоимость транзакции = GAZ * GAZ PRICE.
Получается, что стоимость выполнения кода в сети эфириума прямо пропорциональна сложности расчётов. Коэффициентом пропорциональности является жадность пользователей, запускающих данный код на выполнение, поскольку именно они задают второй параметр – цену газа.
Уплата GAZ за транзакции в сети
Итак, вы готовы создать транзакцию, например, сделав перевод эфира другому участнику сети, но перед вами возник обсуждаемый нами параметр - лимит газа (GAZ LIMIT). Как правильно его задать, чтобы не переплатить, и чтобы транзакция выполнилась?
Напомним, что все транзакции в эфириуме измеряются газом пропорционально затратам на своё вычисление. Чем больше процессорного времени потребуется на выполнение кода транзакции, тем больше газа она будет стоить. С другой стороны, нет такой расчётной единицы как газ. Это единица условная и пользователи платят за неё стоимость, которую сами и устанавливают, манипулируя ценой газа при отправке в сеть очередной транзакции. Вторым параметром, доступным для управления пользователей при создании транзакции является предел газа. Он показывает, какой объём вычислений пользователь готов оплатить в рамках запускаемой транзакции. Разберём оба параметра по-отдельности.
GAZ LIMIT
Предел газа, это сколько примерно вы готовы потратить в самом худшем для вас случае, когда транзакция написана криво и потребляет комиссии больше положенного. Стандартный перевод эфира или любого токена сопровождается съеданием стандартного объёма газа. Криво написанный перевод токена может потребовать больше, но больше в разумных пределах. Если перевод токена требует намного больше газа, то зачем вам связываться с таким токеном, который изначально был некачественно написан... Но вместе с тем, любая функция смарт контракта может быть написана таким образом, что её выполнение будет длиться очень долго, или даже бесконечно. Соответственно, такие функции будут потреблять очень много газа в разрешённых параметром GAZ LIMIT пределах (или даже весь газ в случае если не насытятся пределами).
Таким образом, если вы укажете меньший предел газа, чем потребуется для выполнения данной транзакции, то просто лишитесь комиссии за указанный объём газа. Если укажите намного больше, то получите "сдачу" обратно, при условии, что транзакция вложилась в ваш лимит. Ну а если вы указали большой предел газа, а транзакция оказалась неправильно написанной и затребовала весь разрешённый газ за своё выполнение, то вы лишитесь всех тех ETH, которые стоят за GAZ в соответствие с вашей ценой газа.
GAZ PRICE
Данный параметр регулирует цену за единицу газа. Задаёт его пользователь при запуске транзакции в регулируемых виртуальной машиной пределах. По сути, увеличение цены газа предлагает майнерам большую стоимость за проверку вашей транзакции. Если сеть загружена, это должно ускорить процесс майнинга. Если сеть не штормит очередное громкое ICO, то можно оставлять параметр на минимальном уровне, ваша транзакция итак найдёт один из ближайших блоков.
Лучший способ сэкономить на стоимости транзакции, это уменьшение стоимости единицы газа. Лимит газа лучше оставлять на предложенном системой уровне, если изменение не рекомендовано поставщиком смарт контракта.
Подсчёт наглядно просматривается на конкретном примере.
Допустим, вы хотите перевести 0.006 ETH другу. При этом у вас на кошельке собственно и есть только ровно 0,006 этих ETH.
Перевести ровно 0.006ETH система вам не позволит, поскольку у вас будут заданы не нулевые параметры GAS LIMIT и GAS Price. Допустим, вы оставили их по умолчанию:
GAS LIMIT = 21000
GAS PRICE = 21GWEI
Тогда система подсчитает что вы максимум можете перевести:
0.006 – 21000*0.000000021 = 0.005559
На фото выше было взято другой значение gas prise, потому результат был иным. Eth были получены из GWEI при помощи вот такого калькулятора:
Gas limit для токенов будет на порядок выше чем для эфира, но всё же это небольшие суммы комиссии при оперировании гораздо большими суммами переводимых денег. Ощущаться будет только при большом количестве мелких переводов.
Учёт при разработке смарт контрактов
Добавление новых смарт контрактов в блокчейн это такая же транзакция, как и обычные операции в сети эфириума. За неё также нужно платить и принцип подсчёта будет тем же самым – GAZ PRISE * GAS LIMIT. Но здесь есть несколько важных тонкостей.
При деплое вы заплатите за весь объём вычислений, в том числе и за код бесплатных функций чтения. Это позволяет пресекать добавление в блокчейн функций бесконечного чтения.
Разработка смарт контрактов подразумевает аккуратное обращение с кодом для минимизации стоимости всех функций. Это особенно критично для тех функций, которые будут исполняться пользователями контракта чаще всего.
Создание контрактов дорогостоящее в понятиях GAZ мероприятие. Вообще, существуют листинги стоимости базовых операций solidity, но стоимость создания контрактов, особенно это актуально для динамически создаваемых контрактов, достаточно высока.
При выгрузке решений в сеть следует обязательно проверить стоимость каждой функции. Причём в тестовой сети проверять стоимость нужно по нескольку раз, сравнивая объём газа с предыдущим. Неправильно написанные функции могут требовать за выполнение с каждым разом всё больше и больше газа, что может закончиться плачевно для всего решения. Блокчейн, как известно, ошибок не прощает.
Заключение
Механизм вознаграждения майнеров за счёт комиссии с авторов транзакций известен со времён биткойна. Именно он позволил превратить децентрализованные приложения в полноценные криптовалютные системы.
Комиссия в сети эфириума достаточно своеобразная, по причине неоднородности объёмности транзакций, вызванной полноценным языком программирования, лежащим в основе виртуальной машины эфириума. Она не безопасна при неправильном управлении лимитом, и может привести к потере существенных средств, если не повезёт. Но в большинстве случаев, механизм работает достаточно сбалансированно и предсказуемо.