Глоссарий / Lightning и layer 2
Ключ отзыва
- Что такое ключ отзыва?
- Ключ отзыва представляет собой ослепленный публичный ключ, который блокирует выходы с задержкой и HTLC-выходы транзакции обязательства Lightning; ваш контрагент по каналу может потратить их в тот момент, когда вы раскроете секрет, отзывающий это состояние.
Каждая транзакция обязательства в Lightning несет ветку отзыва, которую никто не может подписать, пока одна из сторон не раскроет секрет для конкретного обязательства. BOLT 3 нумерует эти секреты от 281 474 976 710 655 вниз, и принимающий узел может хранить каждый из них в массиве из 49 ячеек. Публикация состояния, которое вы уже отозвали, позволяет вашему контрагенту забрать весь баланс канала, и именно поэтому сид-фраза не может служить резервной копией для Lightning.
Как это работает
Ключ отзыва устроен намеренно так, что ни одна из двух сторон канала не может вычислить его приватную половину в одиночку.
Когда ваш узел готовит новое обязательство для вашего контрагента, он берет свой revocation_basepoint и per_commitment_point контрагента, умножает каждый из двух на SHA256 от пары, записанной в конкатенации с этим же point впереди, и складывает результаты. BOLT 3 формулирует свойство одной строкой: конструкция гарантирует, что ни узел, предоставляющий basepoint, ни узел, предоставляющий point, не могут узнать приватный ключ без секрета другого узла. Приватный ключ нигде не существует, пока не придет вторая половина.
Этот приход является сообщением. Как только ваш контрагент проверил вашу подпись на своем новом обязательстве, он отвечает сообщением revoke_and_ack, тип сообщения 133, которое несет per_commitment_secret размером 32 байта для только что выведенного из обращения состояния плюс point для следующего. С этого момента вы можете вычислить revocationprivkey для старого состояния, и ваш контрагент не может это отменить.
Ключ появляется в выходах двух видов. Выход to_local представляет собой P2WSH, witness-скрипт которого читается как OP_IF, revocationpubkey, OP_ELSE, to_self_delay, OP_CHECKSEQUENCEVERIFY, OP_DROP, local_delayedpubkey, OP_ENDIF, OP_CHECKSIG: владелец должен переждать to_self_delay блоков, а обладатель ключа отзыва тратит немедленно со стеком свидетеля из подписи и 1. Каждый выход HTLC несет тот же ключ, сведенный хешем до 20 байт через RIPEMD160 поверх SHA256, и BOLT 5 требует, чтобы наказывающий узел также изъял этим ключом средства из транзакций HTLC-success и HTLC-timeout обманщика.
Именно в хранении замысел становится остроумным. Канал может израсходовать 281 474 976 710 655 секретов для конкретных обязательств, по одному на состояние, все порожденные из одного непредсказуемого начального значения в 256 бит перестановкой битов и хешированием, причем индекс убывает, а не возрастает. Поскольку из секрета, индекс которого оканчивается нулями, выводятся все секреты от него до следующей границы степени двойки, принимающий узел хранит только 49 пар значения и индекса и восстанавливает остальное по требованию. BOLT 3 также заставляет принимающий узел заново выводить свои прежние секреты из каждого нового поступления в качестве проверки, так что контрагент, тихо сменивший начальное значение, изобличается на месте, а не в момент закрытия.
Почему это важно, когда вы покупаете биткоин
Ключи отзыва являются причиной, по которой баланс Lightning ведет себя совсем не так, как ончейн-биткоины, которые присылает вам биржа.
Из 41 кошелька, обозреваемых на этом сайте, те, что дают вам доступ к Lightning, решают проблему состояний заметно по-разному, и это разделение объясняет их оценки. Phoenix запускает на смартфоне настоящий самодостаточный узел за стандартной сид-фразой BIP39 на пути BIP84, и наш обзор прямо указывает, что сид-фраза служит ончейн-резервом, а не каналом: если бы ACINQ исчезла, вы принудительно закрыли бы канал, подождали примерно 720 блоков, около пяти дней, и восстановили средства ончейн с помощью Electrum. Muun полностью отказывается от списка слов и выдает вам файл Emergency Kit, содержащий оба ключа мультиподписи плюс выходные дескрипторы, исходя из опубликованного довода, что мнемоника резервирует ключи, тогда как ее биткоины живут в скриптах, о которых кошельку тоже нужно сообщить. Кастодиальный режим по умолчанию у Wallet of Satoshi устраняет проблему, устраняя из нее вас: компания хранит все секреты, и поэтому здесь она имеет статус предостережения и рейтинг 2,7, и поэтому она могла прекратить обслуживание клиентов из США 23 ноября 2023 года и отозвать сервис на всей территории Европейского союза на рубеже 2026 года, оставив держателям в ЕС только режим самостоятельного хранения. BlueWallet работает в режиме самостоятельного хранения ончейн и имеет за это рейтинг 4,2, тогда как баланс Lightning там находится в аккаунте LNDHub, который ваша ончейн-фраза восстановления не покрывает.
Протокол все же дает вам одну страховку, и ее стоит знать точно. Если вы переподключаетесь с устаревшим состоянием, channel_reestablish раскрывает его: сообщение вашего контрагента называет номер отзыва выше, чем вы ожидали, и возвращает последний per_commitment_secret, который вы отправили, что доказывает честность требования. BOLT 2 затем указывает, что вы не должны транслировать свою собственную транзакцию обязательства и вместо этого следует отправить ошибку с просьбой к контрагенту признать канал несостоявшимся. Это правило, которому следует честное программное обеспечение, а не гарантия консенсуса, и оно защищает вас только пока вы сами воздерживаетесь от публикации устаревшего состояния. BOLT 5 излагает соответствующую обязанность прямо: узел не должен транслировать транзакцию обязательства, для которой он уже раскрыл per_commitment_secret.
На практике риск живет внутри вашего принимающего кошелька и больше нигде. Покупка на любой из 63 бирж, отслеживаемых здесь, и вывод через Lightning не подвергает вас ему, потому что каналы биржи являются проблемой биржи. Ваш риск начинается в тот момент, когда биткоины попадают туда, где узел должны запускать вы.
Тестовый вектор BOLT 3, ключ за ключом
BOLT 3 приводит в приложении разобранный пример вывода, и его чтение является самым быстрым способом увидеть, что обе половины ключа отзыва несут нагрузку.
Начните с revocation_basepoint 036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2 и per_commitment_point 025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486. Хеширование basepoint первым дает efbf7ba5a074276701798376950a64a90f698997cce0dff4d24a6d2785d20963, а хеширование point первым дает cbcdd70fcfad15ea8e9e5c5a12365cf00912504f08ce01593689dd426bca9ff0. Умножьте каждую точку на хеш, в котором она стоит первой, сложите два результата, и получится revocationpubkey 02916e326636d19c33f13e8c0c3a03dd157f332f3e99c317c141dd865eb01f8ff0.
Ничто в этом публичном ключе не выдает приватный. Он появляется только после того, как контрагент раскроет соответствующий per_commitment_secret, 1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100, и тогда те же два хеша сочетаются с этим секретом и секретом basepoint, давая revocationprivkey d09ffff62ddb2297ab000cc85bcb4283fdeb6aa052affbc9dddcf33b61078110. Одно обновление канала, одно раскрытие, и публичный ключ, который мгновение назад был украшением, становится правом на весь выход.
Ключ отзыва vs сид-фраза
Ключ отзыва и сид-фраза оба являются секретами, от которых зависят ваши деньги, и только один из них можно записать на бумаге.
Сид-фраза статична. Двенадцать или двадцать четыре слова фиксируют каждый ключ, который кошелек когда-либо выведет, дополнительные копии делают вас надежнее, а старая копия ровно так же хороша, как свежая. Секреты отзыва переворачивают все три свойства. Они приходят по одному на каждое обновление канала, внутри revoke_and_ack, от другой стороны; важные копии представляют собой раскрытия вашего контрагента, которые ваша собственная сид-фраза восстановить не может; а старая копия состояния канала является не резервной копией, а обязательством, потому что действовать по ней неотличимо от мошенничества. Схема хранения из 49 ячеек существует именно потому, что эти секреты меняются слишком часто, чтобы их записывать.
Практическое следствие заключается в предупреждении, которое повторяет каждый кошелек Lightning. Восстановите кошелек Lightning только из слов и начните тратить, и вы заново опубликовали состояние, которое уже отозвали, а это единственное, что BOLT 5 прямо запрещает, и единственное, чего ключ отзыва вашего партнера по каналу ждал.