著者:Anatoly Yakovenko
Составил: Deep Wave TechFlow
Обзор
MEV — фундаментальная проблема в блокчейнах без разрешений. Как и большинство блокчейнов без разрешений, цель Solana — минимизировать MEV, который операторы цепочки извлекают из пользователей.
Подход Соланы заключается в сокращении MEV за счет максимизации конкуренции между лидерами (т. е. производителями блоков). Это означает сокращение времени слотов, уменьшение количества слотов, которые один лидер может запланировать последовательно, и увеличение количества одновременных лидеров на слот.
Вообще говоря, больше лидеров в секунду означает, что у пользователя есть больше возможностей выбрать лучшее предложение из приходящих лидеров после ожидания T секунд. Большее количество лидеров также означает, что хорошие лидеры обходятся меньшими затратами на предоставление пространства в блоке, что упрощает пользователям совершать транзакции только с хорошими лидерами и исключать транзакции от плохих лидеров. Рынок должен решить, что хорошо, а что плохо.
Более широкое видение Соланы состоит в том, чтобы создать глобальную несанкционированную систему определения цен, способную конкурировать с лучшими показателями любой централизованной биржи (CEX).
Если в Сингапуре произойдет событие, влияющее на рынок, сообщение все равно придется передать по оптоволоконному кабелю со скоростью света на CEX в Нью-Йорке. Прежде чем сообщение дойдет до Нью-Йорка, лидер сети Solana должен был передать сообщение в блоке. Если одновременно не произойдет физическое разделение Интернета, статус Соланы уже будет отражать сообщение к тому времени, когда оно достигнет Нью-Йорка. Таким образом, между CEX и Solana в Нью-Йорке не должно быть возможности арбитража.
Чтобы полностью достичь этой цели, Солане требуется множество одновременно работающих лидеров с весьма оптимистичными гарантиями подтверждения.
Настройка нескольких лидеров
Как и в текущем расписании лидеров, система настраивает каждый слот с двумя лидерами вместо одного. Чтобы различать двух лидеров, один канал помечен как A, а другой — как B. A и B могут вращаться независимо. Для реализации этого плана необходимо ответить на следующие вопросы:
Что, если блоки A и B прибудут в разное время или выйдут из строя?
Как объединить порядок транзакций в блоках А и Б?
Как распределить емкость блока между A и B?
Передача одновременных блоков
Чтобы понять процесс, нам нужно бегло взглянуть на Turbine.
Лидер разбивает блок на осколки по мере его построения. Пакет из 32 фрагментов представляет собой код стирания из 32 фрагментов кода. Партии из 64 фрагментов были подписаны ртутью и корнем и были связаны с предыдущей партией.
Каждый фрагмент отправляется по независимому детерминированному случайному пути. Ретранслятор каждой последней партии подписывает корень.
С точки зрения получателя, каждому получателю необходимо получить 32 фрагмента от аутентифицированного ретранслятора. Любые недостающие детали ремонтируются случайным образом.
Это число можно увеличить или уменьшить с небольшим влиянием на задержку.
Если предположить, что выборка пути фрагментации ретранслятора является достаточно случайной и взвешенной по долям, доли, необходимые для кооперативно разделенной сети, будут намного больше, чем ε долей, как с точки зрения времени прибытия, так и с точки зрения данных. Если получатель обнаруживает, что каждая партия из 32/64 (настраиваемых) шардов прибывает в течение времени T, то, скорее всего, каждый узел тоже делает то же самое. Это связано с тем, что 32 случайных узла достаточно велики и маловероятно, что все они случайно попадут в один и тот же раздел.
Если происходит разделение, для его разрешения необходимо достичь консенсуса. Это не влияет на безопасность, но происходит относительно медленно.
Многоблочное производство
Если передается один блок, каждый получатель (включая следующего лидера) увидит поступление пакета фрагментов для каждого блока. Если блок не завершен в течение T миллисекунд, текущий лидер пропустит блок и построит вилку без него. Если лидер неправильный, все остальные узлы проголосуют за блок, и блок лидера будет пропущен. Исправный лидер немедленно переключится на самую тяжелую вилку, указанную голосованием.
В случае многоблочной передачи каждому узлу придется подождать до Т миллисекунд, прежде чем проголосовать за наблюдаемый раздел блока. При наличии двух одновременных лидеров возможны следующие сценарии: A, B или A и B. Дополнительная задержка добавляется только в том случае, если блок задерживается. При нормальной работе все блоки должны прибыть одновременно, и каждый валидатор может проголосовать, как только прибудут оба. Поэтому на практике T может быть близким к нулю.
На защите от этой атаки необходимо сосредоточиться, так это на том, сможет ли лидер с очень небольшим количеством поставленных токенов передать блок чуть позже на границе слота, тем самым надежно вызывая разделение сети и заставляя сеть тратить много времени на решить вопрос через механизм консенсуса. Часть сети проголосует за А, часть проголосует за Б, а часть сети проголосует и за А, и за Б. Все эти три раскола ситуации необходимо разрешать посредством механизмов консенсуса.
В частности, цель нулевого соседства должна состоять в том, чтобы узлы восстанавливали блоки одновременно. Если у злоумышленника есть сотрудничающий узел в нулевом окружении, он может нормально передавать фрагменты 31/64 и позволить злоумышленнику выборочно передавать последний фрагмент в попытке создать раздел. Честные узлы могут определить, какие ретрансляторы опаздывают, и передать недостающие фрагменты любому отдельному честному узлу, как только они восстановят блок. Ретрансляторы могут продолжить передачу, если получат фрагмент откуда угодно или восстановят его. Следовательно, блоки должны быть восстановлены всеми узлами вскоре после восстановления одного честного узла. Тестирование необходимо, чтобы определить, как долго ждать, является ли оно абсолютным или взвешенным по времени прибытия каждого сегмента, а также следует ли использовать репутацию узла ставки.
Вероятность наличия солидера и ретранслятора в каждом блоке составляет примерно P долей лидера (64P долей ретранслятора). 1% ставки может быть использован для попыток атак партиями по ½ шарда, организованных злоумышленником как лидером. Поэтому обнаружение и смягчение последствий должны быть достаточно надежными.
Эта атака оказывает минимальное влияние на следующего лидера, поскольку асинхронное выполнение позволяет перенести неиспользованную мощность вперед. Таким образом, если текущий лидер заставляет следующего лидера пропустить слот, а у следующего лидера есть 4 последовательных слота, неиспользованная емкость пропущенного слота может быть перенесена, позволяя лидеру повторно включить транзакцию пропущенного слота.
Объединение одновременных блоков
Если пользователь отправляет одну и ту же транзакцию обоим лидерам A и B, чтобы увеличить их шансы на попадание в блок или на то, чтобы оказаться первым в блоке, это приведет к пустой трате ресурсов. Если это произойдет, увеличение числа одновременных лидеров приведет к очень ограниченному повышению производительности, поскольку они просто будут обрабатывать вдвое больше мусорных транзакций.
Чтобы избежать дублирования транзакций, первые N плательщиков комиссий будут определять, в каком ведущем канале транзакция действительна. В этом примере старший бит выберет A или B. Плательщики комиссий должны быть закреплены за эксклюзивным каналом, чтобы лидер мог быть уверен, что плательщик комиссий действителен и не потратил все свои лампорты (наименьшую денежную единицу в блокчейне Solana) на других лидеров.
Это заставит спамера заплатить за логически идентичную транзакцию как минимум дважды, но чтобы увеличить вероятность первой транзакции, спамер все равно может отправить логически идентичную транзакцию.
Чтобы предотвратить такое поведение, пользователи могут включить дополнительную 100% комиссию за заказ на сжигание сверх приоритетной комиссии лидера. Ордера с самой высокой комиссией исполняются в первую очередь. В противном случае используется порядок «первым поступил — первым обслужен» (FIFO). В случае ничьей порядок определяется с использованием детерминированных случайных перестановок. Таким образом, спамерам выгоднее увеличить комиссию за заказ и выполнить его первым, чем платить комиссию за включение дважды.
Чтобы обрабатывать объединенные и переупорядоченные последовательности транзакций, система должна поддерживать объединенные транзакции, что может добавлять комиссию за заказ для покрытия затрат на упорядочение всей последовательности транзакций. Плательщик комиссии действителен только в своем запланированном канале, поэтому пакет может манипулировать последовательностями только в своем собственном канале.
Альтернативно, плата за заказ может не потребоваться. Если используется порядок FIFO и со спамеров всегда взимается плата за приоритет во всех каналах, возможно, можно просто позволить рынку решить, что оплата N лидеров для увеличения стоимости возможностей включения - это то же самое, что оплата ближайшему лидеру, скорее всего. включить в транзакцию сначала стоимость оператора.
Управляйте ресурсами блоков
В сети блокчейн, когда есть два одновременных лидера, предел емкости каждого общесистемного блока должен быть распределен равномерно. В частности, не только общая емкость, но и каждый конкретный лимит, например лимит блокировки записи — ни один аккаунт не может записывать более 6 миллионов вычислительных единиц (CU), а каждый лидер может планировать только до 24 миллионов CU. Таким образом, даже в худшем случае объединенные блоки не превысят общий предел мощности системы.
Этот механизм может привести к колебаниям платы и недостаточному использованию ресурсов, поскольку плата за приоритет планирования будет определяться возможностями каждого лидера, и каждый лидер мало знает о статусе планирования других одновременных лидеров.
Чтобы смягчить недоиспользование ресурсов и связанные с этим скачки комиссий, любую неиспользованную емкость блока следует перенести на будущие блоки. То есть, если текущий объединенный блок использует значение меньше некоторого максимального. Асинхронное выполнение может отставать от вершины цепочки на величину до одной эпохи, поэтому перемещение емкости может быть весьма агрессивным.
Согласно последним данным о блоках, большинство блоков обычно заполнены на 80 %, тогда как предел блокировки записи значительно ниже 50 %. Вообще говоря, всегда должна быть некоторая свободная мощность для будущих блоков. Поскольку блоки могут временно превышать ограничения емкости, их выполнение должно происходить асинхронно с процессом консенсуса. Дополнительные сведения о предложении асинхронного выполнения см. в статье APE.