Що таке «цибулева маршрутизація» в Lightning Network і як вона працює

Оригінальний автор: LORENZO Компіляція: btcstudy

Комп’ютери в мережі спілкуються один з одним відповідно до протоколів. Тут «протокол» відноситься до системи правил, які визначають, як повідомлення мають передаватися та інтерпретуватися. Частина передачі платіжних повідомлень мережевого протоколу Lightning описана BOLT#4, також відомий як «Протокол маршрутизації Onion (Протокол маршрутизації Onion)».

Onion Routing — це технологія, яка передувала Lightning Network на 25 років. Він також використовується в Tor, звідки походить назва «Tor» («The Onion Router»). Lightning Network використовує дещо модифіковану версію під назвою «цибулева маршрутизація на основі джерела», скорочено «SPHINX». У цій статті ми поговоримо про те, як працює цибулева маршрутизація.

Навіщо використовувати цибулеву маршрутизацію?

У світі існує багато різних протоколів зв’язку, але оскільки Lightning Network є платіжною мережею, має сенс вибрати протокол, який розкриває якомога менше інформації про платіж, що пересилається.

Якби Lightning Network використовувала той самий протокол, що й Інтернет, кожен посередник знав би, хто був відправником платежу, хто був одержувачем і ким були інші посередники на шляху. Цибулева маршрутизація є хорошим вибором, оскільки її характеристики гарантують проміжні вузли:

  • Знайте лише свій попередній вузол (який надіслав вам повідомлення) і наступний вузол (куди ви хочете переслати повідомлення).
  • не знає довжини всього шляху;
  • Не знаючи, де ти на шляху.

Огляд цибулевої маршрутизації

Давайте використаємо посилку як аналогію, щоб пояснити, як працює маршрутизація цибулі.

Припустимо, Аліса хоче заплатити Діні. По-перше, Алісі потрібно знайти можливий шлях для її оплати:

Аліса→Боб→Чан→Діна

Потім вона будує «цибулю». Вона починає з Діною (з кінця стежки). Вона кладе секретне повідомлення (вміст платежу) у пакет, надісланий Діні, і замикає його ключем, відомим тільки їй і Діні. Тепер вона кладе цей пакунок в інший пакунок, щоб надіслати його Чану, і замикає пакунок для Чана ключем, відомим тільки їй і Чану. Правильно і так далі.

Аліса відправляє останню цибулину (пакет) першому посереднику на шляху, Бобу. Боб відкриває свій пакет власним ключем і бачить, що наступний пакет для Чана. Тож він переслав пакунок Чану. Те саме стосується Чана. Розпакувавши пакунок, він переслав його Діні. Нарешті Діна відкрила власний пакет і знайшла в ньому платіжне повідомлення.

У цибульній маршрутизації такі посередники, як Боб і Чан, не знають ні змісту повідомлення, надісланого Діні, ні довжини всього шляху платежу. Єдине, що вони знають, це хто переслав їм посилку і хто її отримає наступним. Це гарантує конфіденційність повідомлення та конфіденційність шляху. Кожен посередник може торкатися лише спеціально створеного для TA шару повідомлень.

У маршрутизації цибулини Lightning Network на основі джерела відправник вибирає шлях платежу та створює повну цибулину для цього шляху, що можна розглядати як діру конфіденційності (Примітка перекладача: місце розташування одержувача в мережі має бути відкрито для відправника). Інші схеми маршрутизації, такі як «сліпа маршрутизація» (китайський переклад), вирішують цю проблему шляхом обфускації частини шляху платежу до відправника. Однак у цій статті ми зосередимося виключно на SPHINX.

Зберіть цибулю

Тепер давайте подивимося на специфікацію цибулевої маршрутизації. На початку нам потрібно визначити такі речі:

  • Відправником є «початковий вузол» (Аліса);
  • Приймач - «кінцевий вузол» (Діна);
  • Кожен проміжний вузол на платіжному шляху є «стрибком» (Боб і Чан);
  • Інформація про зв’язок між кожним стрибком називається «хоп-навантаженням».

Побудувати стрибковий вантаж

Після того, як Аліса вибрала платіжний шлях, вона отримує інформацію для кожного платіжного каналу з протоколу переговорів, щоб створити корисне навантаження для кожного стрибка, по суті кажучи кожному стрибку, як створити HTLC для платежу, що пересилається (хеш-контракт блокування часу).

Для встановлення правильного HTLC кожен стрибок повинен:

  • Сума, яку потрібно переслати;
  • сплачена таємна вартість;
  • Ідентифікатор платіжного каналу, який продовжує надсилати цибулю;
  • Тривалість блокування часу.

Більшість цих даних надходить із повідомлень «оновлення каналу», які містять інформацію про комісії за маршрутизацію, запити на події та ідентифікатори платіжних каналів. Загальна сума, яку потрібно переслати, — це сума сплаченої суми плюс комісія, що стягується за кожен наступний стрибок; тоді як таємне значення платежу розраховується Діною та вставляється в рахунок-фактуру (що повідомляється цибульним повідомленням кожному хоп).

Аліса починає з останнього вузла Діни. Вона включає суму пересилання, значення тривалості блокування часу, секретне значення платежу та суму платежу в пакеті. Зауважте, що їй не потрібно додавати ідентифікатор каналу, оскільки Діна є останнім вузлом і їй не потрібно пересилати платіж іншим.

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

У корисне навантаження Чана Аліса додає ідентифікатори каналів Чана та Діни. Вона також додала суми пересилання та значення блокування часу. Нарешті Аліса створює корисне навантаження для Боба. Чан бере 100 сатоші за платіж через канал між нею та Діною, тому Аліса повинна повідомити Бобу, що перенаправлена сума є платежем плюс комісія за обробку. Згідно з повідомленням про оновлення каналу Чана, значення таймлоку також було збільшено на 20 (у блоках). Нарешті, Аліса також враховує плату Боба за обробку та вимоги до блокування часу та надає йому HTLC із довжиною блокування часу 700040 і вартістю 100200 сатоші.

Спільне секретне значення та генерація ключів

Далі Аліса готує цибулю, генеруючи спільний секрет для кожного переходу (включно з останнім вузлом). Це спільне секретне значення може бути згенеровано Алісою та цільовим переходом відповідно шляхом множення її власного закритого ключа на відкритий ключ іншої сторони.

Спільне секретне значення необхідне для цибулевої маршрутизації, дозволяючи Алісі та кожному переходу отримати той самий ключ. Потім Аліса використовує ці клавіші, щоб розплутувати кожен шар цибулі, а цей стрибок використовує ключі для розплутування.

Щоб захистити конфіденційність Аліси, вона створює одноразовий ключ сеансу для цибулі, а не використовує власний відкритий ключ вузла, щоб отримати загальне секретне значення. Вона використовує цей ключ сеансу для першого стрибка, а потім, для кожного наступного стрибка, Аліса детерміновано рандомізує ключ, помноживши останній ключ на коефіцієнт засліплення. Вони використовуються для створення спільного секретного ключа, який ми називаємо «ефемерними ключами».

Боб, Чан і Діна мають отримати те саме секретне значення, що й Аліса, тому їм потрібно знати ефемерний ключ для використання під час сеансу. Аліса розміщує лише перший ключ у цибулі, щоб зберегти розмір повідомлення. Кожен стрибок обчислює наступний ефемерний ключ і вбудовує його в цибулю для наступного вузла. Кожен стрибок може використовувати свій власний відкритий ключ і спільне секретне значення для обчислення коефіцієнта засліплення, який використовує Аліса для визначення наступного ефемерного ключа.

Як згадувалося раніше, спільне секретне значення буде використано для створення деяких ключів, і Аліса та відповідний стрибок можуть використовувати ці ключі для виконання деяких операцій над цибулею. Давайте розглянемо, що робить кожна клавіша.

Ро ключ

Ключ Rho використовується Алісою для шифрування шару цибулі; це призведе до обфускації вмісту корисного навантаження, щоб його не могли розшифрувати сторонні особи. Тільки власник ключа rho може розшифрувати корисне навантаження. Ось що має зробити вузол, який отримує цибулину: використати спільне секретне значення з Алісою, щоб отримати ключ rho, потім розшифрувати цибулину та прочитати вміст.

Мукі

Аліса використовує клавішу mu, щоб створити контрольну суму для кожного корисного навантаження. Вона також передає контрольну суму стрибку, який отримує цибулю. Цей стрибок, у свою чергу, використовує ключ mu для генерації контрольної суми отриманого корисного навантаження, перевіряючи, що вона збігається з тією, яку надає Аліса. Це робиться для перевірки цілісності корисного навантаження та перевірки того, що воно не було змінено.

Клавіша на панелі

Цей ключ використовується тільки Алісою для генерації випадкових «сміттєвих» даних. Ці дані також є частиною цибулини, і вони не мають нічого спільного з довжиною платіжного шляху, кількістю стрибків, які пройшла цибулина, і вона зберігає цибулину незмінного розміру, навіть якщо частина її вмісту не має значення. Таким чином цибулева маршрутизація приховує довжину шляху, фактично захищаючи конфіденційність відправника та одержувача.

Ключ

Цей ключ також використовується для перевірки цілісності даних, що містяться в цибулині, але тільки якщо повертається помилка. Так, це називається «гм», тому що це «му», написане задом наперед. У разі помилки платежу стрибок, який знаходить помилку, використовуватиме ключ um для створення контрольної суми, а коли попередній вузол отримає звіт про помилку, він також використовуватиме ключ um для перевірки цілісності повідомлення.

Інкапсуляція шару цибулі

Остаточне цибульне обгортання виглядає так:

Аліса тепер має корисне навантаження для кожного стрибка та спільне секретне значення для кожного стрибка. Давайте подивимося, як Аліса перетворює цю інформацію на останню цибулину. Вона починає з останнього вузла і повертається крок за кроком.

Спочатку вона створює порожнє поле довжиною 1300 байт, що є загальною довжиною всіх корисних даних onion. Потім вона використовує клавішу pad, щоб створити випадковий рядок довжиною 1300 байтів, який є сміттям, марним для будь-якого переходу. Цей крок робиться для того, щоб кожен шар цибулі виглядав однаково, тому ви не можете побачити ні загальну довжину шляху (кількість переходів), ні того, хто є відправником, а хто одержувачем.

Потім вона створює контрольну суму корисного навантаження, яке потрібно використати, і розміщує її в кінці корисного навантаження. У повідомленні до останнього вузла контрольна сума дорівнює 0, щоб повідомити Діну, що вона є останнім одержувачем цієї цибулини. Після додавання контрольної суми в кінець корисного навантаження Аліса розміщує корисне навантаження (і контрольну суму) на початку сміття та видаляє частину всього повідомлення, яка перевищує 1300 байт, так що повна довжина повідомлення становить 1300 байт.

Потім Аліса використовує ключ rho, щоб створити випадковий рядок байтів, і використовує операцію виняткового або (XOR) над корисним навантаженням цибулини, отриманим на попередньому кроці, щоб отримати обфускований корисний навантаження. Оригінальний текст корисного навантаження можна отримати за допомогою операції XOR цього випадкового байтового рядка над обфускованим текстом (Примітка перекладача: іншими словами, XOR тут є алгоритмом симетричного шифрування, а випадковий байтовий рядок є ключем). Операція XOR порівнює корисне навантаження onion із випадковим рядком байтів (створеним ключем rho) побітово, виводячи 1, лише якщо один із бітів даних дорівнює 1; це призводить до обфускованого корисного навантаження. Розумна річ в операції XOR полягає в тому, що якщо ви отримуєте правильний випадковий рядок байтів і обфусцований корисний навантаженні, вам потрібно лише запустити операцію XOR з ними ще раз, щоб отримати обфускований корисний навантаження.

Оскільки вузли, які отримують цибулю, можуть отримати той самий ключ rho, вони можуть генерувати той самий випадковий рядок байтів, що й Аліса. Ось як кожен вузол на шляху може розплутати плутанину та прочитати вміст.

Після підготовки цибулі плутанини для одного стрибка Аліса повторює ті самі кроки для наступного вузла. Ключова відмінність полягає в тому, що коли Діна закінчить цибулю, їй більше не потрібно створювати сміття. Вона просто додає обфусцовану цибулину з попереднього кроку після корисного корисного навантаження та контрольної суми та відсікає все, що перевищує 1300 байт. Наступний GIF демонструє весь процес:

Нарешті Аліса бере останню обфусцовану цибулину та додає контрольну суму, щоб Боб міг перевірити цілісність цибулини. Потім Аліса додає відкритий ключ сеансу, щоб Боб міг використовувати цей відкритий ключ для обчислення загального секретного значення. Нарешті, вона також додає байт, що представляє версію, повідомляючи іншим вузлам, як інтерпретувати дані в ньому. Для версії, описаної BOLT #4, байт версії має бути 0.

вперед цибуля

Щоб надіслати цей пакет цибулі, відправник створює повідомлення update_add_htlc із такими полями:

  • Ідентифікатор каналу: конкретний канал, якого стосується це повідомлення.
  • ID: ідентифікатор цього HTLC.
  • Сума: значення цього HTLC.
  • Хеш платежу: створюється одержувачем платежу.
  • Термін дії: цей HTLC закінчиться після певного блоку.
  • Цибулева посилка: цибуля, створена для цього платежу, про що згадувалося вище.
  • Додаткові дані: використовується для вказівки додаткових даних.

Після підготовки повідомлення Аліса надсилає повідомлення Бобу. Отримавши повідомлення, Боб може почати розшифровку власної цибулі. Спочатку він отримує ключ сеансу з обгортки цибулі та використовує його, щоб отримати значення спільного секрету з Алісою.

Озброївшись спільним секретним значенням, Боб генерує ключ mu для перевірки контрольної суми корисного навантаження, вбудованого в пакет onion. Якщо корисне навантаження не було змінено, контрольні суми мають збігатися.

Щоб запобігти тому, щоб інші вузли на шляху знали про довжину шляху, Боб додає 1300-байтове поле, заповнене нулями, до пакета цибулини. Потім Боб генерує випадковий рядок байтів довжиною 2600 байт із ключа rho. Боб використовує цей випадковий рядок байтів для XOR заповненого нулем корисного навантаження цибулі.

Пам’ятаєте, як я розповідав вам про те, як заплутати цибулю? Використовуйте обфускатоване корисне навантаження onion як вхідні дані та запустіть операцію «XOR» з тим самим рядком байтів, щоб отримати корисне навантаження onion перед обфускацією. Оскільки Аліса та Боб використовують однакове спільне секретне значення, генеруючи той самий ключ rho, Боб може розплутувати код. Це має додаткову перевагу в тому, що воно перетворює 1300-байтові символи на випадкових байтах.

Незамасковане корисне навантаження Боба включає дані корисного навантаження для його переходу разом із відбитком пальця. Боб зберігає цей відбиток пальця, щоб додати його до пакунку з цибулею, який він надсилає Чану. Після того, як Боб відокремлює власне корисне навантаження від повідомлення onion, він перетворює пакет onion назад до початкового розміру 1300 байт і рандомізує свій сеансовий ключ, як це зробила Аліса. Нарешті Боб додає байт версії, ключ сеансу та відбиток пальця, які він має намір розмістити в корисному навантаженні onion, і пересилає пакет onion Чану за допомогою повідомлення update_add_htlc.

Цей процес триватиме, доки повідомлення не буде надіслано до останнього вузла, Діни. Коли Діна отримує повідомлення update_add_htlc, вона може ввести хеш-значення секретного значення, згенерованого нею, що означає, що цей HTLC призначений для неї. Тож Діні просто потрібно перевірити відбитки пальців, розгадати цибулинні повідомлення та розкрити власний корисний вантаж. Ця анімація демонструє весь процес:

Вирішення проблем

Ми говоримо про історію успіху, про випадок, коли все йшло за планом, але якщо на шляху щось піде не так, ви повинні надіслати повідомлення назад, щоб повідомити всі вузли, що щось пішло не так. Цей процес схожий на звичайну маршрутизацію цибулі. Виявлення несправного вузла вимагає отримання ключа um зі спільного секретного значення, використання його для генерації випадкового байтового рядка та використання операції XOR для обфускації повернутої посилки цибулі.

Вузол, який виявить помилку, надішле повідомлення назад до попереднього вузла в платіжному шляху. Кожен переход використовує клавіші um і ammag для виконання тієї ж операції, доки відправник не отримає пакунок. Нарешті, відправник використовує ключі ammag і um для розплутування та перевірки пакета.

Помилки можуть бути викликані пакетами цибулі, вузлами або каналами. Якщо ви часто користуєтеся Lightning Network, можливо, ви стикалися з такими помилками, як «канал недоступний» або «недостатня комісія».

посилання

Опанування мережі Lightning

БОЛТ №4: Протокол маршрутизації Onion

Переглянути оригінал
Контент має виключно довідковий характер і не є запрошенням до участі або пропозицією. Інвестиційні, податкові чи юридичні консультації не надаються. Перегляньте Відмову від відповідальності , щоб дізнатися більше про ризики.
  • Нагородити
  • Прокоментувати
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити