Данная статья посвящена рассмотрению off-chain платежных каналов: их типам, принципам работы и особенностям применения. Представленный материал поможет понять, почему идея платежных каналов является революционной в системах учета финансов. Мы поговорим о платежных каналах именно для Биткоина. Эта статья будет полезна тем, кто еще не знаком с концепцией платежных каналов, а также даст понимание принципов работы lightning network.

Платежные каналы и основные сведения о них


Что такое платежный канал?


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

Преимущества платежного канала


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

Еще одно интересное преимущество состоит в том, что взаимодействие участников канала можно вести приватно. Соответственно, детали каждого микроплатежа остануться в тайне от всех остальных, хотя сам факт использования платежного канала между конкретными Биткоин адресами будет известен всем.

Особенности платежного канала


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

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

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

Платежные каналы могут быть однонаправленными и двунаправленными, mono-directional или bi-directional соответственно. Это зависит от самой методики реализации канала.

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

В упрощенном варианте работу платежного канала можно изобразить на такой схеме.

image

Есть Биткоин сеть. Есть два пользователя: Алиса и Боб. У них есть Биткоин кошельки с дополнительным модулем для работы платежного канала по определенной методике. Эти модули обмениваются данными для проведения платежей непосредственно.

Чья идея?


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

О методах реализации платежных каналов


Мы рассмотрим четыре основных.
Spillman-style payment channels — это максимально простой вариант одностороннего канала с ограниченным временем существования и неограниченным количеством платежей.

Позже было принято еще одно усовершенствование протокола Биткоин и стали возможны CLTV-style payment channels, которые представляют собой усовершенствованный предыдущий метод.

Poon-Dryja payment channels — это метод двунаправленных каналов с неограниченным временем работы. Они требуют еще нескольких обновлений протокола Биткоина, которые недавно были приняты. Кроме того, эти каналы используются при проектировании lightning network.

Decker-Wattenhofer duplex payment channels — это вариант использования двух однонаправленных каналов одновременно, усовершенствуя их свойства за счет формирования не последовательной цепочки заменяемых транзакций, а целого дерева заменяемых транзакций. Кроме того, в таких каналах может быть больше двух участников.

Мы детальнее остановимся на первых двух методах, но для начала повторим некоторые особенности работы протокола Биткоин.

Кое-что из протокола Биткоина


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

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

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

Spillman-style payment channels


Итак, Spillman-style payment channels — это метод создания mono-directional платежных каналов, где есть роль отправителя и роль получателя. Время работы такого канала устанавливается отправителем произвольно, при этом получатель может досрочно закрыть канал.

Давайте разберем основные шаги работы такого канала на схеме.

image

Для удобства восприятия представим, что есть некоторый сервис, который торгует доступом к глобальной сети через wi-fi точку доступа, и некоторый клиент, который хочет получить доступ в сеть на сутки. Услуга будет стоить один биткоин. Очевидно, что клиент не доверяет сервису на такую сумму и хочет оплачивать трафик посекундно.

Тогда они решают открыть платежный канал на сутки с суммой в один биткоин. Сервис генерирует новую пару ключей для электронной подписи и передает открытый ключ клиенту. Клиент в свою очередь генерирует новую пару ключей и использует свой открытый ключ и открытый ключ сервиса для формирования multisignature адреса 2-из-2. Далее, клиент формирует транзакцию номер один, в которой он отправляет один биткоин на multisignature адрес, подписывает ее, но не распространяет в Биткоин сеть, поскольку сервис может подставить клиента и отказаться подписывать любые транзакции для дальнейшей передачи одного биткоина.

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

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

В данном случае транзакция номер один называется funding transaction, а вторая — refunding transaction.

Каким же образом выполняется взаимодействие при расчетах в рамках платежного канала? Давайте рассмотрим следующую схему.

image

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

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

Как же выполняется закрытие канала?

image

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

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

CLTV-style payment channels


Давайте теперь рассмотрим улучшенную версию этого метода, а именно CLTV-style payment channels.

Этот метод платежных каналов стал применим после того, как было проведено softfork обновление Биткоина с добавлением нового скриптового кода — OP_CHECKLOCKTIMEVERIF. Особенность его состоит в том, что теперь в выходе транзакции можно задать такие правила, по которым монеты могут быть потрачены только в транзакции с установленным параметром nLockTime не меньше заданного. На деле это означает, что помимо прочих условий, монеты могут быть потрачены только спустя определенный промежуток времени. Теперь, с использованием скриптовых операций ветвления условий, а именно IF-ELSE, можно задать разные условия траты в зависимости от времени. Преимущество этих платежных каналов, по сравнению с предыдущими, заключается в том, что не нужно создавать refund транзакцию. Вместо этого можно прописать двойное условие траты монет в выходном скрипте funding транзакции. То есть до наступления времени закрытия канала монеты можно потратить по правилам multisignature, а после закрытия будет достаточно одной подписи.

Как же применяются платежные каналы?


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

В случае с lightning network есть дополнительные сложности и особенности. Это выработка общепринятого формата коммутации каналов и протокола общения узлов. Важно, чтобы кошельки от одних разработчиков могли работать с кошельками от других. Еще одной сложностью является вопрос маршрутизации в этой сети. Задача такая, что нужно найти наиболее короткий путь передачи ценности с учетом того, что в каждом канале есть ограничения на сумму перевода в каждую сторону.

Особенности работы сети


На следующей схеме давайте рассмотрим особенности функционирования Биткоин сети и lightning network.

image

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

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

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

Актуальные вопросы


Рассмотрим часто задаваемые вопросы по теме платежных каналов и lightning network.

— Насколько платежи в каналах надежны по сравнению с обычными Биткоин транзакциями?

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

— Ограничена ли пропускная способность в каналах и lightning network?

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

— Должны ли участники канала доверять друг другу?

Нет, механизм платежных каналов предусматривает защиту от любых злонамеренных действий взаимодействующих сторон.

— Какая польза от каналов человеку, который хочет отправить только один платеж?

Если человек хочет избавиться от последних монет и больше не планирует принимать и отправлять платежи, то ему нет смысла открывать канал, нужно отправить обычную on-chain транзакцию. Во всех остальных случаях открытие канала будет полезным.

Этой теме также посвящена одна из лекций онлайн-курса по Blockchain “Off-chain payment channels”.

Комментарии (0)