Всем привет. Хочу предложить вам поразмышлять на следующую тему. Если говорить кратко, то у меня складывается впечатление, что есть такие узлы, цель которых использовать другие узлы для ребалансировки, при этом сами эти узлы выступают в роли неких таких паразитов. Сейчас я расскажу примерно схему, как мне кажется, по которой они работают. Если кратко – картинка к этому посту хорошо иллюстрирует смысл статьи.
Чтобы понять именно механизм, который для неких узлов является паразитическим, представьте себе следующее.
Вы владелец узла, например, его назовем узел А, и вы ставите перед собой цель участвовать в маршрутизации платежей честно. И вот вы запускаете свой узел, кладете на него биткоины и открываете каналы, скажем, например, на узел B, C, D, E и так далее. Рассмотрим для примера четыре узла, с которыми мы установили каналы. После открытия каналов вы ставите со своей стороны комиссию, например, 100 ppm. Для тех, кто не знает, это означает, что 100 миллионных частей вы берете от суммы платежа за отправку на платежа на тот удаленный узел. То есть это комиссии, которые работают на финансовом потоке, который идёт из вашего узла в сторону удалённого узла.
И вот вы открыли четыре канала, и возьмем, например, для примера, что в каждый канал вы положили по миллиону сатоши. Таким образом, емкость вашего узла составила 4 миллиона сатоши, и у вас открыто четыре канала, по миллиону сатоши каждый. Конечно, в такой конфигурации платежи не начнут ходить, потому что на вас нету входящей ликвидности. Например, вы купили канал или договорились с кем-то, и на вас открыли, предположим, три канала, также по одному миллиону сатоши. Скажем, это каналы будут F, G, H.
В результате у вас узел стал обладать емкостью 7 миллионов сатоши, 3 миллиона сатоши – это входящая на вас ликвидность и 4 миллиона сатоши – исходящая от вас ликвидность. В такой конфигурации платежи начнут ходить сами собой, если ваш узел представляет интерес для кошельков платильщиков, которые выбирают ваш узел, потому что находят оптимальные маршруты для комиссии через ваш узел. В данной конфигурации все комиссии, исходящие от вас – 100 ppm, но для тех, кто платит кому-либо, и чей кошелек выбирает ваш узел, он, конечно, на своем пути использует еще и комиссии, которые установлены на других узлах по пути платежа. Первоначально это будут узлы F, G, H, потому что именно с них финансовые потоки могут идти через ваш узел дальше в первоначальный момент времени.
Предположим, что узлы F, G, H имеют комиссию 200 ppm. Таким образом, если мы возьмем хотя бы часть маршрута, который пролегает через узел F до вашего узла A и затем идет на узел B, например, то такая часть маршрута заберет комиссию 200 ppm (F -> A) плюс 100 ppm, которую заберет уже ваш узел (A -> B). После нескольких платежей от узлов F, G, H часть ликвидности перекачается на ваш узел в этих каналах с этими узлами, а часть ликвидности перейдет на узлы B, C, D и E, например. Чтобы лучше себе это представлять, можно представить себе такую картину, что ваш узел А имеет трубочки с этими семью узлами, и на каждой стороне этих трубочек находятся емкости, из которых перекачивается жидкость. Примерно как гидравлическая система. Это я расказал, для общей понимании картины нашего примера.
Все прекрасно и казалось бы всё работает. Но теперь представим себе следующий этап. К вам приходит, например, скажем, узел М и открывает на вас канал. Возьмем, например, для примера 10 миллион сатоши.
А теперь представьте, что он в какой-либо момент очень быстро пересылает через ваш узел, например, 3 миллиона сатоши, и все эти 3 миллионов сатоши расползаются через все другие каналы с другими узлами, и ликвидность перекачивается на удаленные узлы.
Помните, что все началось с того, что мы поместили на наш узел А 4 миллиона сатоши и открыли 4 канала? Таким образом, через наш узел может пройти ликвидность не больше этого размера, потому что мы не владеем более 4 миллионов сатоши. Таким образом, подключившийся узел М может максимум через свой один канал выдавить, так сказать, ликвидность в другие каналы не более 4 миллионов сатоши. Все мелкие комиссии и резервы на открытие каналов и так далее я сейчас упускаю для упрощения.
И вот представим, что теперь, после того, как узел М открыл на нас канал и за короткий промежуток времени перелил со своей стороны на нашу сторону 3 миллиона сатоши в канал между узлом А и М, то все эти 3 миллиона сатоши перекачались, получается, в другие семь каналов на удаленные узлы. И после такого сценария у нас: канал между А и М имеет на нашей стороне 3 миллиона сатоши, а на остальных 7 каналах наша ликвидность размазана и в сумме составляет примерно 1 миллион сатоши (из первоначальных 4 миллионов сатоши три миллиона “выдавились” за счёт влитой ликвидности от узла M).
А теперь для полноты картины представьте себе, что узел М с другими узлами сети имеет каналы, и на стороне узла М комиссии на те каналы составляют, например, 1000 ppm.
Теперь представьте, что некий кошелек в сети решил использовать для подбора маршрутов участок пути от узла B до A, затем от A до M и от некого канала от M до, например, X узла. При этом, как я сказал, на канале от M до X стоит 1000 ppm. Получается, что этот некий кошелек должен заплатить комиссию 200 ppm узлу B, 100 ppm узлу А, нашему узлу, и 1000 ppm узлу М. Скорее всего, такой маршрут не будет использован, если в сети есть другие каналы с меньшими комиссиями. Причем наш узел не будет выбран, потому что на пути попался узел M с его дикими большими комиссиями. Конечно, тут стоит добавить ещё то, что этот мифический кошелёк отправитель выбирал и другие наши каналы для отправки, но они завершились неудачей, потому что ликвидности на нашей стороне нет (это я говорю о наших каналах с узлами B, C, D, E, F, G, H). А в той именно ситуации, которую я описал выше, вся фактически наша ликвидность после тех действий узла М находится только в канале между нами и узлом М (3 миллиона сатоши). И ведь эти средства нельзя просто перекинуть в другие каналы и они не могут быть просто использованы нами для других каналов! И получается, что они становятся как бы “запертыми” и становятся заложниками, потому что, чтобы воспользоваться теперь нашей ликвидностью, три четверти от того, что мы имеем, мы должны пользоваться узлом М для пересылки. А у него большие комиссии на пересылку через него. И вот тут становится очень неприятная ситуация…
Какие способы решения?
Делать ребаланс?
Теперь давайте подумаем, что мы можем в такой ситуации предпринять. Делать ребаланс будет экономически невыгодно, потому что нам придется перекачать ликвидность через узел М и придется узлу М заплатить 1000 ppm и принять в какой-либо наш канал другой, из которого мы затем будем использовать комиссии 100 ppm, то есть мы уйдем просто в минус.
Закрыть канал
Мы можем закрыть канал с узлом M, к тому же мы не потеряем на комиссиях закрытия канала, потому что инициатором канала открытия был узел M, и он оплатит все комиссии за закрытие канала. Но это потеря времени, потому что придется ждать завершающей транзакции, затем открытием канала на другой узел, и более того, если узел M довольно ведет агрессивную политику, он может снова к нам подсоединиться с еще большей ликвидностью и проделать все то же самое.
Закрыть канал
Другой вариант – можно поднять комиссии на всех других наших каналах, чтобы таким узлам, как узел М, было экономически невыгодно открывать на нас каналы и перекачивать таким образом ликвидность. Я более чем уверен, что основная цель таких узлов, как узел М, является не то, что они специально вредят, а то, что они используют узлы, у которых другие каналы с меньшими исходящими комиссиями (как наш узел), для ребаланса на свою сторону, для того чтобы зарабатывать на комиссиях уже от других каналов. То есть в нашем примере, когда узел М перекачивал 3 миллиона сатоши в нашу сторону, он это делал многими платежами, и те платежи шли через другие наши каналы на узел B, C, D, E, F, G, H и, таким образом, он перегнал свою ликвидность и перекачал ее в свои другие каналы, на которых у него исходящая ликвидность, исходящая комиссия уже высокая, например, 1000 ppm. Можно только порадоваться за узел М, за его такой бизнес. Но нам придется не радоваться за самих себя. Итак, как я сказал уже выше, еще один вариант — это поднять комиссии на всех других наших каналах. Но мы таким образом делаем плохо другим пользователям сети Лайтнинг, потому что становимся заложниками таких узлов, как М, и вынуждены увеличивать комиссии для сети Лайтнинг. Гонка за повышение комиссии может идти долго и непонятно чем закончится.
Запретить открывать каналы на нас?
Еще один вариант, который мне видится, это можно на своем узле запретить открывать на нас каналы и делать это только по договоренности или покупая каналы на рынке с ликвидностью. С моей точки зрения это плохой способ, потому что это не способствует улучшению сети Лайтнинг, потому что вы занимаетесь неким таким цензурированием и не идет на пользу этой сети.
Запрет открытия каналов по условию
Еще как частый случай такого способа борьбы, как запрет открывать каналы, можно рассмотреть установку так называемого Observer. Это способ, когда вы пишете алгоритм, на основе которого ваш алгоритм будет говорить программному обеспечению вашего узла, можно ли открывать с удаленным узлом канал, когда тот коннектится к вам и делает запрос на открытие на вас входящего канала. В таком случае можно в этом алгоритме предусмотреть какую-либо проверку, на основе которой вы будете решать, можно ли открыть, например, пытаться предугадать, пришел ли к вам этот узел наподобие узла M или нет. Мне кажется, это более лучший способ, чем просто запрещать открывать каналы.
Например, давайте попробуем подумать, как можно определять такие узлы быстро и по каким признакам. Мне пришел в голову пока что простой алгоритм, что мы всегда имеем в памяти обработанный граф сети, в котором мы пробегаем по каждому узлу, смотрим все его каналы и высчитываем, например, медианную комиссию, исходящую от него в каждом из каналов. Если эта комиссия, скажем, выше пороговой величины, например, она выше величин, которые мы используем для своего узла, в нашем примере это 100 ppm, ну, например, получается, что если коннектящийся узел на нас имеет медианную комиссию для канала меньше или равно 100 ppm, то мы будем позволять таким узлам открывать на нас входящие каналы. Ведь если мы так делаем, то узлы, которые открывают на нас входящие каналы, лишены экономической выгоды делать ребаланс через наш узел, потому что он будет экономически невыгоден.
Можно добавить новой ликвидности из своих средств
Как ещё один вариант, конечно – можно добавить ликвидности самому и открыть новые каналы на узлы, которые хорошо себя зарекомендовали. Но это не спасёт от случая, когда тот узел откроет ещё один новый канал и снова “вкачает” свою некачественную ликвидность в наш узел, “выдавив” новую нашу добавленную ликвидность на другие каналы.
Какие ассоциации есть с этим методом?
Если посмотреть на всю картину целиком, то можно подобрать несколько ассоциаций, которые могут характеризовать такое поведение. Например, можно было бы привести такой пример. Вы открываете свой магазин для продажи дешевых вещей, набиваете его полки товарами, ставите низкие ценники, но спустя очень короткое время к вам приходит богатый чувак с чемоданом денег и скупает у вас практически все товары по низким ценам, уходит к себе в свой магазин и там их выставляет и вешает ценники гораздо дороже, чем они стоили у вас.
Также можно эту ситуацию характеризовать так, что такие узлы, как узел М, занимаются выдавливанием вас с рынка комиссий и с рынка платежей Bitcoin Lightning, потому что после таких трюков, которые они проделывают, ваш узел перестает нормально маршрутизировать платежи, вы как бы отключаетесь от рынка комиссий, а тот узел после ребаланса продолжает зарабатывать на комиссиях. Потому что он перекачивает средства посредством одного канала, который открыл с вами, средства в кучу других своих каналов, которые будут использованы для других маршрутов уже по высоким комиссиям.
Что мог бы сделать тот узел M, чтобы не вредить другим?
Если подумать о том, что мог бы сделать тот узел М, чтобы не вредить другим узлам, таким как мой, то тут мне видится следующий путь, способ. Узел М должен рассматривать все каналы, которые он имеет, и те каналы, которые у него опустошились. Вместо того, чтобы делать ребаланс через такие узлы, как мой узел, тому узлу более правильно было бы открывать новый канал на узел с опустошенным каналом, и таким образом он бы уже имел два канала и мог бы продолжать посылать ликвидность на тот узел, скажем, например, на узел Х.
Ведь для него здесь затраты практически такие же, может быть чуть выше. Получается, что когда он открывает на меня один канал, то он формирует одну транзакцию на открытие, а затем с помощью этого пополняет дешево все свои опустошенные каналы. Если же бы он действовал так, как я пишу здесь выше, то, конечно, ему бы пришлось открыть несколько каналов на те узлы, где опустошились каналы. Это было бы ему стоило чуть-чуть дороже. Но опять же, мне кажется, что если учитывать еще те комиссии, которые он платит моему узлу, пусть и маленькие, для ребаланса, то, возможно, он бы все равно не затратил бы особо больше, чем делает это тем способом, который поступает.
Но поскольку он выбирает именно тот путь, которым действует, то у меня сейчас все-таки закрадывается ощущение, что делается это специально для того, чтобы выдавить такие узлы с низкими комиссиями с рынка платежей Биткоин Лайтнинг сети.
Заключение
Пока что других способов, как решать эту проблему, мне пока в голову не пришло. Если у вас есть какие-либо предложения и мысли по этому поводу, было бы интересно их услышать. Конечно, в данной ситуации я рассмотрел только ситуацию, когда узел М приходит к нам и открывает на нас канал с целью ребаланса. Вполне могут быть узлы, которые не занимаются ребалансом, а открывают каналы чисто по альтруистическим соображениям или для расширения своего влияния на сеть. Но в любом случае я рассматривал здесь ситуацию, когда приходящие узлы имели у себя каналы с другими узлами именно с высокими комиссиями. Потому что в ином случае такие узлы становятся наоборот полезными. Если у такого узла М были бы каналы с низкими комиссиями, как у нас или даже меньше, то более вероятно, такой финансовый поток сразу бы начинал идти и в их сторону, и не складывалось бы такой тупиковой ситуации, когда на нашей стороне накапливается ликвидность только в канале с таким узлом, а на остальных каналах эта ликвидность выдавливается и так и остается.
Если вам интересно узнать, выдумал ли я такой сценарий, то нет. Это реальный случай, которые происходил и происходит сейчас с моим узлом. Этот узел M – узел с названием “c=“. Вчера я закрыл с ним канал, использовал ликвидность для открытия на другой эффективный узел, а сегодня он снова пришёл, открыл новый канал и опять перекачал ликвидность.