Lightning и Raiden: Решения по масштабированию блокчейна
В Биткойн-сообществе уже долгое время не утихают споры на тему проблемы масштабирования блокчейна Биткойна. Энтузиасты то и дело предлагают новые идеи и решения. В частности, введение платёжных каналов, обещает решение для проблемы масштабирования. В этой статье рассматриваются механизмы работы платёжных каналов в Биткойне и Эфириуме.
Нельзя отрицать, что Биткойн и Эфириум становятся всё более и более популярными. Вот график числа ежемесячных транзакций Биткойна в разные годы:
А вот число ежедневных транзакций Эфириума в разные годы:
Хотя это хороший знак, показывающий, что криптовалюты широко используются и принимаются, но в последнее время обнаружилась большая проблема. Из-за внезапного роста числа транзакций Биткойн и Эфириум столкнулись с серьёзными проблемами масштабируемости.
Проблемы масштабируемости обусловлены тем, как устроена система открытого реестра. Допустим, Алисе нужно отправить Бобу 1 BTC. Как будет происходить этот процесс? Алиса не может передать Бобу деньги в физическом виде, ведь биткойн – цифровая валюта. Транзакция пройдёт следующим образом:
- Алиса объявляет, что хочет отправить Бобу 1 BTC, и отправляет детали транзакции майнерам;
- Майнеры проверяют, действительно ли запрос отправила Алиса, а не кто-то другой, и затем подтверждают транзакцию, включая её в добытые блоки;
- Боб получает 1 BTC.
Так где же тут проблема?
Скорость проведения транзакции зависит от майнеров.
Когда число транзакций растёт, майнеры просто не поспевают их все проводить. Вследствие того, что транзакции подтверждаются недостаточно быстро, образуется длинная очередь.
Кроме того, существует также вопрос комиссий за транзакции. Когда майнеры добывают блок, они становятся его временными диктаторами. Это значит, что они могут задать номинальную комиссию за включение данных о транзакции в свои блоки. Однако пользователи могут заплатить более высокую комиссию, чтобы мотивировать майнеров подтвердить их транзакцию быстрее и таким образом перепрыгнуть другие транзакции, стоящие в очереди.
К сожалению, это ведёт к большой проблеме.
Обычным пользователям Биткойна, которые платят нормальную комиссию, часто приходится долго ждать подтверждения своих транзакций. Давайте посмотрим, сколько в среднем пришлось бы ждать, если бы вы заплатили минимальную комиссию.
Среднее время подтверждения (в минутах)
Если вы заплатите минимальную возможную комиссию, то вам придётся в среднем ждать 13 минут, пока ваша транзакция пройдёт. 13 минут! Чаще всего транзакциям приходится ждать, пока будет добыто несколько новых блоков (в Биткойне блок добывается в среднем раз в 10 минут), потому что ближайшие блоки уже заполнены транзакциями.
В случае Биткойна всё выглядит достаточно мрачно. Посмотрим же, как идут дела у Эфириума.
Теоретически, Эфириум должен обрабатывать 1000 транзакций в секунду. Но на практике Эфириум ограничен лимитом газа 6,7 млн на один блок.
График среднего лимита газа Ethereum (в днях)
Так как у каждого блока есть лимит газа, майнеры могут включить в него только те транзакции, чья сумма газа не превышает лимит газа для блока.
Это, опять же, ограничивает число транзакций, которые могут быть включены в блок.
Эфириум обрабатывает только 20 транзакций в секунду, а Биткойн – 7. Если сравнить это с тем фактом, что PayPal обрабатывает 193 транзакции в секунду, а Visa – 1667, то можно увидеть, почему это большая проблема, требующая быстрого решения.
Один способ, каким Биткойн решает проблему масштабирования, – это SegWit и увеличение размера блока. Однако в этой статье мы сосредоточимся на двух очень интересных предложениях, которые могут не только решить проблемы масштабирования, но и позволить проводить тысячи транзакций в секунду. Это:
- Протокол Lightning (Биткойн);
- Сеть Raiden (Эфириум).
Что такое Lightning и Raiden?
Прежде чем мы в них углубимся, необходимо объяснить две вещи.
Канал состояния – это двусторонний коммуникационный канал между участниками, позволяющий им проводить вне блокчейна транзакции, которые обычно происходят на блокчейне. Это экспоненциально сокращает время транзакции, так как подтверждение вашей транзакции больше не зависит от третьей стороны, такой как майнер.
Что же требуется для канала состояния вне блокчейна?
- Часть состояния блокчейна блокируется с помощью мультиподписи или смарт-контракта, о чём договаривается несколько участников;
- Участники взаимодействуют друг с другом, подписывая транзакции, но ничего не отправляя майнерам;
- Затем в блокчейн добавляется итог всех транзакций.
Согласно основателю Slock.it Стивену Туалу, каналы состояния могут закрываться в предварительно заданный участниками момент. Это может быть:
- Прошедшее время: например, участники могут договориться закрыть канал состояния через 2 часа после открытия;
- Достижение определённой суммы транзакций: например, закрыть канал после того, как были проведены транзакции на общую сумму $100.
Итак, на картинке выше мы видим электромобиль, напрямую взаимодействующий с заправкой и совершающий транзакции на общую сумму $39,19. Наконец, после ряда взаимодействий, вся сумма транзакций добавляется в блокчейн. Представьте, сколько времени понадобилось бы, чтобы проводить каждую отдельную транзакцию через блокчейн!
Платёжный канал – это, по сути, канал состояния, имеющий дело исключительно с платежами и микроплатежами между сторонами. Напомним, все взаимодействия в канале могли бы происходить в блокчейне, но происходят вне его. Существует несколько типов платёжных каналов, так что рассмотрим некоторые из самых популярных.
Один из самых ранних примеров платёжного канала предложил сам Сатоши Сакамото.
Эта система использует некоторые интересные свойства:
- Замена транзакции;
- Порядковый номер входа (nSequence);
- nLocktime.
nLocktime – это параметр, задающий время, раньше которого транзакция не может быть принята в блок. Концепция достаточно проста. Есть значение UINT_MAX, и nSequence не может превышать это число. Представьте, что есть неподтверждённая транзакция, которую можно изменять, прежде чем она будет включена в блок при достижении времени nLocktime ИЛИ достижении nSequence значения UINT_MAX. При каждой замене порядковый номер увеличивается.
Тем не менее с этим вариантом было связано много проблем безопасности, и он так и не был должным образом реализован.
Прежде чем продолжить, необходимо отметить две вещи.
Во-первых, выражаем благодарность Дэвиду Хардингу за объяснение платёжных каналов версии Шпильмана и CLTV.
Во-вторых, нужно объяснить, что такое адрес с мультиподписью P2SH.
В Биткойне есть два типа адресов:
- Адрес P2PKH, или Pay-to-PubKey Hash;
- Адрес P2SH, или Pay-to-Script Hash.
«Нормальный» адрес Биткойна выглядит так: 15fXdTyFL1p53qQ8NkrjBqPUbPWvWmZ3G9. Это обычный адрес P2PKH. Чтобы потратить биткойны, отправленные на этот адрес, нужно просто произвести дешифровку с помощью соответствующего приватного ключа и получить доступ.
Но в Биткойне можно присваивать более гибкие условия расходования. Можно создавать не только простые транзакции P2PKH. Народ это быстро понял и начал экспериментировать со scriptPubKey в языке сценариев Биткойна (Script).
Что такое scriptPubKey?
Вот как выглядит простая транзакция с 1 входом и 1 выходом:
scriptPubKey в выходе (Output) фактически задаёт условия расходования. Можно добавить к scriptPubKey свои строки кода и задать собственные условия расходования. Разработчики предвидели это и, чтобы отправители не могли вставлять в условия длинные строки кода, разрешили вставлять только хеш условий. Эти условия называются redeem script (сценарий погашения). В транзакции P2SH scriptPubKey содержит только хеш redeem script. Сам сценарий раскрывается и проверяется только при транзакции расходования.
С этим связано кое-что очень важное. Так как проверка сценария происходит только при транзакции расходования, ответственность по предоставлению полного redeem script переходит от отправителя к получателю. Это, в свою очередь, даёт ряд преимуществ:
- Отправитель может пересылать деньги в любую транзакцию с мультиподписью, не зная все детали транзакции. Это очень полезно. Чаще всего, когда вы тратите деньги, вас не интересует, что будет с вашими деньгами, после того как вы с ними расстались. Та же логика применима и здесь;
- Отправителю намного проще пересылать деньги на короткий и чёткий хеш (хеш сценария), чем на длинный и запутанный сценарий.
Таково общее объяснение того, что такое адрес с мультиподписью P2SH. Адрес, платящий не на публичный адрес, а на хеш сценария. Теперь вернёмся к примерам платёжных каналов.
Данный тип платёжных каналов был описан в рассылке для разработчиков Биткойна и был реализован в «bitcoinj». Версия Шпильмана использует две разных транзакции: депозит и компенсация. Давайте рассмотрим процесс:
- Алиса (продавец) даёт свой публичный ключ своему клиенту Бобу;
- Боб с помощью своего публичного ключа и публичного ключа Алисы создаёт адрес с мультиподписью P2SH, в котором, чтобы потратить полученные на него средства, потребуется одновременно подпись Алисы и Боба;
- Боб создаёт транзакцию, но не передаёт её в блокчейн. Он использует эту транзакцию для платежа на адрес с мультиподписью. Эта транзакция – депозит;
- Теперь Боб создаёт другую такую же транзакцию и записывает её поверх предыдущей. В результате первая транзакция возвращается на адрес Боба. После этого Боб объявляет блокировку по времени (timelock) для второй транзакции, чтобы удостовериться, что она не попадёт в блок раньше определённого времени, и подписывает её;
- Боб передаёт эту вторую транзакцию Алисе, которая подписывает её и возвращает Бобу. Помните, Алиса всё ещё не видела транзакцию депозита, т. е. первую транзакцию;
- Теперь у Боба есть транзакция, подписанная им и Алисой и выступающая в качестве компенсации. Поэтому, если Алиса, продавец, не выполнит определённую работу до завершения timelock, Боб может потребовать себе транзакцию компенсации;
- После того как компенсация была подписана всеми сторонами, Боб спокойно может объявить свою транзакцию депозита и добавить её в блокчейн.
Хотя версия Шпильмана была полезна для создания платёжных каналов, обеспечивающих честность продавцов, она всё же была подвержена пластичности. Когда Боб передаёт транзакцию депозита, она должна быть побайтово идентичной транзакции компенсации. В противном случае транзакция компенсации больше недействительна.
Чтобы решить эту проблему, после BIP 65 были реализованы платёжные каналы версии CLTV. Вот как они работают:
- Алиса (продавец) даёт свой публичный ключ Бобу (клиенту);
- Боб с помощью своего публичного ключа и ключа Алисы создаёт адрес P2SH, используя следующие условия: Условие 1: Любую транзакцию этого адреса подписывают и Алиса, и Боб. Условие 2: Только Боб может самостоятельно подписать транзакцию, но такая транзакция должна иметь время блокировки больше, чем у транзакции компенсации;
- Боб создаёт транзакцию депозита и передаёт её в блокчейн. Благодаря условию 2 он уверен, что может по требованию получить компенсацию;
- Вспомните, что согласно первому условию, любую транзакцию адреса P2SH должны подписать и Алиса, и Боб. Поэтому Боб (клиент) может подписать свою часть транзакции, а Алиса – свою, не раскрывая Бобу детали своей подписи. Так Алиса может передать в блокчейн окончательный платёж, прежде чем может быть передана компенсация.
Главное преимущество этого метода над версией Шпильмана – устранение уязвимости к пластичности. В версии Шпильмана Боб был ограничен необходимостью передать депозит, побайтово совпадающий с компенсацией. Теперь же такая необходимость отпала. Эти каналы используют код операции OP_CLTV, активированный благодаря BIP 65.
Хешированные контракты с блокировкой по времени, или HTLC, – одно из самых удобных применений платёжных каналов. Протокол Lightning – это фактически реализация HTLC. Что же такое HTLC? Мы уже встречались с каналами, использующими блокировку по времени. HTLC их «расширяет», добавляя к таймлокам «хешлоки».
HTLC позволяет открывать платёжные каналы, где средства могут переводиться между сторонами до предварительно согласованного срока. Эти платежи подтверждаются с помощью криптографических доказательств. Ещё одно замечательное свойство HTLC в том, что он позволяет стороне отчуждать полученные платежи и возвращать их плательщику. Кроме того, возможны платежи между разными каналами.
Благодаря HTLC также появилось ещё одно удивительное свойство, а именно кроссчейн-транзакции. Это называется атомарным кроссчейн-обменом и позволяет пользователям обменивать криптовалюту в одном блокчейне (например, биткойны в главном блокчейне) на криптовалюту в другом блокчейне (биткойны в сайдчейне).
Как работает HTLC?
Представьте, что Алиса отправляет средства Чарли через Боба.
- Алиса открывает канал с Бобом, а Боб открывает канал с Чарли;
- Предположим, что Алиса объявляет, что хочет провести транзакцию с Чарли;
- Чарли объявляет случайное число, генерирует его хеш SHA-256 и передаёт Алисе. Если Чарли выбрал число A, то он передаёт его хеш, H(A);
- Алиса отправляет Бобу 0,1 BTC с условием, что платёж может затребовать лишь тот, кто способен предоставить данные, дающие тот же хеш. Для злоупотребления средствами Бобу понадобился бы прообраз, генерирующий этот хеш. То есть, Бобу нужно число A, которого у него нет;
- Теперь Боб передаёт средства Чарли с тем же условием. Чарли закрывает платёж Боба, передавая ему прообраз A;
- Боб закрывает платёж Алисы, передавая ей A.
Сеть Lightning – это действующая вне блокчейна микроплатёжная система на основе HTLC, предназначенная для того, чтобы ускорить платежи в блокчейне. Её придумали Джозеф Пун и Таддеус Драйджа в своём whitepaper, где они намеревались решить проблемы лимита размера блока и задержек транзакций. Сеть работает поверх Биткойна, и её часто называют «вторым уровнем».
Как отмечает Джимми Сонг в статье на Medium:
«В сети Lightning создаются транзакции с двойной подписью. То есть, создаётся новый чек, который, чтобы быть действительным, должен быть подписан обеими сторонами. В чеке указывается, сколько одна сторона отправляет другой. По мере того как одна сторона переводит другой новые микроплатежи, сумма в чеке меняется, и обе стороны подписывают результат».
Перечислим некоторые свойства, которые возможны благодаря сети Lightning:
- Быстрые платежи: Платежи почти мгновенны;
- Независимость от майнеров: Транзакции проходят без проверки и подтверждения майнерами;
- Поддержка микроплатежей: Раньше микроплатежи в блокчейне Биткойна были крайне неудобны. Теперь благодаря сети Lightning они возможны;
- Поддержка мультиподписей: Транзакции проходят только в том случае, если их подтвердит каждый участник канала;
- Снижение нагрузки на блокчейн: Поскольку много транзакций проходит вне блокчейна, нагрузка на главный блокчейн существенно снижается;
- Сокращение времени ожидания: Так как транзакции проходят вне блокчейна и без вмешательства майнеров, времени ожидания практически нет;
- Масштабируемость: Увеличивается число транзакций в секунду.
Несмотря на всё её великолепие, перед сетью Lightning стояло одно препятствие, которое нужно было преодолеть. Сеть Lightning, как и все виды платёжных каналов, подвержена пластичности транзакций.
Прежде чем мы поймём, что такое пластичность транзакций, важно вкратце напомнить об одной из важнейших функций криптоэкономической модели – хешировании. Ранее мы написали подробную статью о хешировании. Если кратко, то хеш-функция принимает вход любой длины, но длина выхода всегда фиксирована.
Но для того, чтобы понять «баг пластичности транзакций», как его называют, необходимо знать о ещё одной функции хеширования. Малейшее изменение входа существенно изменит хеш на выходе.
Например, взгляните на этот тест, который мы проделали с используемым в Биткойне алгоритмом хеширования SHA-256:
Видите?
Мы лишь заменили большую букву «T» на маленькую, и посмотрите, что произошло с выходом!
Ещё одно, что вам необходимо понять о блокчейне, – это его неизменяемость, то есть, как только данные добавлены в блок, они не могут быть изменены. Хотя это предоставляет защиту от вмешательства, было одно слабое место, которое никто не предвидел.
Что если данные были изменены ещё до включения в блок? Даже если об этом позже узнают, с этим ничего невозможно поделать, потому что после включения в блок данные нельзя оттуда удалить! Именно поэтому пластичность транзакций представляет проблему.
Чем обусловлена пластичность транзакций?
Каждая транзакция Биткойна имеет данные входа и выхода.
Давайте, в частности, рассмотрим данные входа:
Здесь содержится число принятых входов транзакций и данные о подписи. С данными о подписи связано две проблемы:
- Они занимают слишком много места;
- Ими можно манипулировать, чем и вызвана пластичность транзакций.
По сути, из-за манипуляции данными о подписи может создаться видимость, что транзакция вообще не состоялась. Рассмотрим на примере.
Допустим, Боб хочет, чтобы Алиса отправила ему 3 BTC. Алиса создаёт транзакцию на 3 BTC на публичный адрес Боба, после чего отправляет её майнерам на подтверждение. Пока транзакция ждёт в очереди, Боб использует пластичность транзакции, чтобы изменить подпись Алисы и ID транзакции.
Теперь существует вероятность, что эта изменённая транзакция будет подтверждена раньше транзакции Алисы, а следовательно, заменит её. Когда Боб получит 3 BTC, он может просто сказать Алисе, что не получал их. Алиса увидит, что её транзакция не прошла, и отправит её повторно. Как следствие, Бол получит 6 BTC вместо 3 BTC.
Давайте расставим всё по своим местам. Может ли пластичность окончательно подорвать протоколы Lightning? Нет. Но она может сделать всю процедуру медленной и неприятной. Изменённые транзакции будут застревать в канале на разных шагах. Это можно полностью решить, только введя в систему доверие или задав чрезвычайно неудобные задержки по времени. Это нежелательно по многим причинам:
- Задержки могут создавать неудобства;
- Любая система, построенная на доверии, подвержена нечестности. В этом фундаментальная философия Биткойна – построить систему, совершенно не требующую доверия. Система, способная сохранять честность, не полагаясь на доверие по отношению к отдельным людям, – это идеальная система.
Таким образом, для того чтобы сеть Lightning смогла массово использоваться, необходимо было решить проблему пластичности, и такое решение предоставил SegWit.
Концепция SegWit (Segregated Witness, «отделённый свидетель») очень проста. Если большинство проблем связаны с данными о подписях в блоках, то почему бы просто не перенести их на параллельный сайдчейн? По сути, все транзакции минус данные о подписях помещаются в главный блокчейн, а все данные о подписях – в сайдчейн.
Вот как выглядит блок после SegWit:
Таким образом, изъятие данных о подписях из транзакций позволило убить сразу двух зайцев: в блоке оказалось больше места, и транзакции избавились от пластичности. SegWit одновременно решил проблему пластичности и подготовил почву для беспрепятственной интеграции сети Lightning.
Версия протокола Lightning в Эфириуме называется Raiden. В Эфириуме проходит 20 транзакций в секунду. Чтобы увеличить скорость транзакций с эфиром и токенами ERC20, вводится сеть Raiden, которая будет функционировать подобно протоколу Lightning и сделает возможными быстрые транзакции по приватным каналам.
Хотя полноценная сеть Raiden ещё не совсем готова, многие люди нуждаются в Raiden для объединения множества платежей в один. Поэтому для них была создана сеть µRaiden (микро-Raiden), позволяющая просто и быстро проводить микроплатежи.
Дело в том, что Эфириум очень непрактичен для мгновенных транзакций. Транзакции ожидают добавления в блокчейн в длинной очереди, и чаще всего, чтобы сократить время ожидания, необходимо заплатить высокую комиссию. Сеть Raiden позволит участникам проводить мгновенные платежи по платёжным каналам.
Raiden будет представлять собой сетевую структуру, работающую поверх главного блокчейна Эфириума:
Концепция Raiden разработана компанией Brainbot Technologies. Вот что сказал о Raiden её создатель и CEO Хейко Хис:
«От Raiden выиграют все блокчейн-приложения, нуждающиеся в масштабировании для использования в реальном мире. Она может использоваться для обмена активами в играх и в финансах, розничных платежей, микроплатежей за контент (представьте себе новую версию YouTube или Spotify, где авторы получают деньги непосредственно за каждую секунду просмотра). Но она также подходит в качестве инфраструктуры для более дешёвого, быстрого и безопасного корреспондентского банкинга».
Как работает Raiden?
Допустим, Алиса и Боб хотят взаимодействовать посредством Raiden. Вот как они будут это делать:
- Алиса и Боб открывают с помощью смарт-контракта платёжный канал вне блокчейна;
- Обе стороны вносят в смарт-контракт гарантийный депозит;
- Предположим, Алиса хочет переслать Бобу 3 токена. Она подписывает сообщение «3» и отправляет его Бобу. Теперь у Боба есть доказательство, что Алиса отправляет ему 3 токена;
- Теперь, допустим, Алиса хочет переслать Бобу ещё 4 токена. Она обновит состояние сообщения до «7». Это означает, что сообщение передаёт последнюю и предыдущую транзакции;
- Как только Боб захочет получить 7 токенов, он пойдёт в блокчейн и закроет канал. Он получит 7 токенов из изначального депозита канала;
- Информация будет передана в блокчейн, и сохранится лишь последняя запись о передаче 7 токенов Бобу.
Для финансирования запуска Raiden будет проведено ICO. Во время ICO инвесторы получат токены Raiden (RDN). Зачем нужны эти токены? Сеть Raiden задумана так, что в ней неизбежно будут комиссии. Участникам необходимо следить за своими каналами, чтобы никто ничего не украл. Но вместо того, чтобы круглосуточно сидеть за компьютером и следить за своими средствами, эту работу можно поручить кому-то другому и заплатить ему в RDN.
Какими свойствами обладает сеть Raiden?
- Простой и практичный прикладной программный интерфейс (API);
- Возможность масштабировать Эфириум;
- Поддержка токенов ERC20;
- Простой и быстрый перевод денег;
- Снижение нагрузки на блокчейн Эфириума.
Для масштабирования блокчейнам абсолютно необходимы решения, работающие вне блокчейна. Платёжные каналы – один из лучших способов это реализовать. Если Биткойну и Эфириуму удастся внедрить Lightning и Raiden, то это откроет безграничные возможности. Представьте себе, что можно будет проводить тысячи транзакций в секунду с ничтожно малыми комиссиями, а также производить обмен с другими блокчейнами. Всё это – больше не мечты. С нетерпением ждём, чем всё обернётся!
Примечание от БитНовостей: уважаемые читатели, обратите внимание, что образование платёжного канала в сети Lightning на Биткойне не требует предварительной покупки каких-либо ещё токенов-альткойнов, выпущенных какой-то ещё одной компанией. Только лишь биткойнов — токенов базовой сети сайдчейна Lightning — которые вернутся в соответствии с балансом участников канала при его закрытии.