Как стать автором
Обновить
0
Wirex
Мобильный банкинг нового поколения

Иллюзия уровня консенсуса

Время на прочтение 9 мин
Количество просмотров 3.8K
Автор оригинала: James Prestwich
Ethereum — децентрализованная платформа, служащая основой для работы умных контрактов — приложений, работающих в точности согласно их программному коду, без малейшей вероятности простоя, цензуры, вмешательства мошенников или сторонних агентов.
— Ethereum.org




Мы, разработчики, любим верить в уровень консенсуса, возлагающий на себя решение всех сложных задач распределенных систем, позволяя нам писать приложения. Майнеры обитают на уровне консенсуса, занимаясь своими майнерскими делами. Разработчики сидят на прикладном уровне и пишут смарт-контракты — программы, которые работают внутри Виртуальной машины Эфириума (EVM). Наши децентрализованные приложения взаимодействуют с компьютером, полагаясь на его целость и сохранность.

Мы знаем, что EVM работает на основе консенсуса, и нам не нужно думать об этом механизме до тех пор, пока он работает. Не думаем мы и о майнерах, ведь в конце концов, нет никакой необходимости понимать принцип работы полупроводников или особенности проектирования микросхем современных компьютеров. Но, увы, это удобное и предсказуемое разделение между уровнями — не более чем иллюзия. Иллюзия уровня консенсуса, которая помогает нам забыть, что майнеры нам не друзья.

На практике переход от контрактов к консенсусу — явление гораздо менее плавное, и не такое однозначное, как принято считать. Создание блоков влияет на состояние EVM, что в свою очередь сказывается на вызовах умных контрактов и в результате влияет на работу децентрализованных приложений и их пользователей. Чем медленнее блоки, тем медленнее децентрализованные приложения. Чем блоки быстрее, тем приложения быстрее. Пустые блоки приводят к остановке работы приложений.

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

Беговая дорожка майнеров


Майнеры вам не друзья. Впрочем и не враги. Они не хотят причинять вам вред, просто не могут этого избежать. Таковы требования Proof-of-Work. Майнерам приходится вступать в жестокую конкуренцию за право получить весьма небольшую маржу. Они застряли на «беговой дорожке майнеров», где темп задают быстрейшие из бегунов.



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



Если ваша рентабельность составляет 1%, то 1% снижение доходов лишает вас прибыли. Если хэшрейт майнера становиться хоть немного меньше текущей нормы, он отстает от остальных своих коллег. С другой стороны, 1% рост дохода ведет к удвоению прибыли. Даже небольшой отрыв в эффективности позволяет майнеру получить гораздо больше денег для их реинвестирования в оборудование. И отрыв таких участников все больше возрастает, в результате чего менее успешные конкуренты со временем уже не могут им ничего противопоставить. Proof-of-Work провоцирует майнеров искать небольшие преимущества, совершенствовать любые аспекты процесса и пользоваться этим, чтобы сбрасывать конкурентов с беговой дорожки.

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



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

Существуют некоторые очень эффективные и неочевидные пути. К сожалению, они вредны для остальных пользователей системы. Я бы хотел акцентировать внимание на способах, с помощью которых майнеры могут увеличить прибыль и снизить расходы путем отбора денег у людей и систем, которые полагаются на работу блокчейнов. Пока вы будете читать этот материал, постарайтесь не забыть, что майнеры не хотят забирать ваши деньги, им приходится это делать. Proof of Work требует от них повышения конкурентоспособности.

Как майнеры могут вмешаться


Майнерам доступно множество способов вмешательства в работу EVM и работающих в ней приложений. Поскольку каждый майнер имеет возможность управлять блоками, которые он генерирует, он также может контролировать изменение состояний в этом блоке. Давайте пробежимся по некоторым простейшим методам, не вдаваясь слишком глубоко в детали. Для каждого из них попытаемся определить стратегию вмешательства, кто при этом пострадает и как на этом могут заработать майнеры.

Изменение порядка транзакций

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



Допустим я хочу отправлять другу платежи. Я создам простой контракт с тремя функциями: deposit, unlock и retrieve. Вызов deposit переводит средства на хранение. Всякий раз, когда хочу отправить ему деньги, я делаю unlock 5 эфиров. Мой друг вызывает функцию retrieve, которая отправляет ему все не заблокированные с помощью deposit средства. Если майнер видит транзакции unlock и retrieve в одном блоке, он может поменять их местами и retrieve будет вызвана раньше. Вызов retrieve позволит получить все свободные, не находящиеся на хранении средства. После этого будет вызван unlock. В результате мой друг будет вынужден отправить retrieve-транзакцию снова, повторно заплатив комиссию за нее.



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

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

Вставка транзакций


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

Давайте придумаем еще один простой смарт контракт. На этот этот раз Алиса хочет поиграть в угадайку. Она помещает 5 эфиров в контракт. Эта сумма отправляется тому, кто назовет самое близкое к загаданному число. Алиса вызывает commit с хэшем числа, тем самым гарантируя его неизменность. Все желающие могут вызвать guess и поучаствовать в угадывании. Через 2 блока Алиса вызывает reveal, чтобы все узнали, какое число было загадано.



Алиса не может жульничать, поскольку это предусмотрено контрактом. А вот у майнера такая возможность имеется. Он может дождаться и назвать свое число после того, как увидит вызов reveal. Он узнает результат еще до формирования блока! Даже если Дэвид тоже назовет 4, майнер может изменить порядок, тем самым опередив его.

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

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

Принудительные ошибки

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

Давайте создадим простой смарт-контракт для рынка. Я вывозу sell для выставления каких-нибудь токенов на продажу по заданной цене. Любой желающий может вызвать buy для покупки некоторого количества моих токенов.



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

Эта атака особенно опасна в старых версиях Solidity. Старые версии ключевых слов assert и throw передадут весь прикрепленный газ майнеру, что приведет к получению им очень высоких комиссий за отсутсвие какой либо работы. Более новые ключевые слова require и revert ограничивают использование газа исходя из фактически выполненной работы.

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

Разработчики умных контрактов могут частично предупредить подобное поведение путем внимательного изучения своих выражений revert и require. Если майнерам удастся найти верный способ загонять контракт в ошибку, они смогут собирать с ваших пользователей дополнительные комиссии. Правило номер один в таких случаях: если вызов полагается на состояние, которое может быть изменено другим пользователем, то он уязвим для принудительных ошибок.

Цензурирование

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

Допустим Алиса хочет сделать себе копилку. Она может запустить простой контракт, позволяющий ей снять деньги не ранее чем через 10 тыс. блоков. Алиса хороший человек и поэтому она хочет удостовериться, что в случае ее внезапной смерти, деньги будут отправлены хотя бы кому-то другому. Поэтому она делает так, чтобы контракт позволял майнерам забрать деньги по прошествии 50 тыс. блоков.



Каждый отдельно взятый майнер имеет сильную мотивацию не включать ее транзакцию по извлечению средств в свои блоки. Им нечего терять: если она никогда не сможет забрать деньги, они могут попытать счастье и получить их в будущем. Кроме того, она сможет снять деньги только если майнеры позволят ей это сделать. Даже если они не будут сговариваться и игнорировать ее транзакции, или проводить какую-либо атаку 51%, они все равно могут все вместе отказаться брать ее транзакцию в обработку.

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

Эскалация проблем


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

Консенсус — это не просто уровень на котором держатся наши децентрализованные приложения. На самом деле они с прикладным уровнем тесно переплетается друг с другом. Когда мы пишем программы, мы не думаем о физических свойствах кремния, поскольку знаем, что он не будет активно пытаться отобрать наши деньги. К сожалению, между EVM и кремнием есть прослойка в виде майнеров, и если им нельзя будет доверять, то нельзя будет доверять и EVM.

Разработчики Solidity должны программировать компьютер, который работает против них. EVM как таковая представляет собой «византийскую систему». Любая ее часть, подверженная неудачному исходу, в самый худший момент придет именно к нему. Сегодня мы по-прежнему находимся на очень раннем этапе понимания криптовалют, майнинга и умных контрактов. Сейчас майнеры не выказывают активного стремления оптимизировать свою деятельность за счет пользователей, но это только пока. Ethereum будет расти и когда-нибудь, мы еще будем вспоминать это время как золотой век децентрализованных приложений.

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

image
Теги:
Хабы:
+13
Комментарии 5
Комментарии Комментарии 5

Публикации

Информация

Сайт
wirexapp.com
Дата регистрации
Дата основания
2014
Численность
101–200 человек
Местоположение
Великобритания

Истории