SegWit как инструмент повышения безопасности
Многие пользователи интернета значительно недооценивают значение такого свойства как «гибкость» для биткоина. А именно это свойство усовершенствует обновление Segregated Witness.
Давайте обратимся к докладу, вышедшему в 2016 году под названием Bitcoin Covenants (Соглашение о Биткоине), в котором говорится о функции «хранилища». Я попытаюсь вкратце объяснить, как работает Хранилище, и как его можно применить для биткоина без SegWit (в прошлом) и для биткоина с SegWit (сейчас).
Во-первых, что же такое это Хранилище? Упрощенная версия будет выглядеть примерно так вы перемещаете свои активы на специальный адрес V («Vault» — хранилище), с которого можете переводить их исключительно на один адрес – W (от англ. withdrawal — «инициализация процесса вывода средств»). От адреса W ведут два пути. Первый вы можете переводить средства с W куда угодно, только спустя 24 часа после первоначального вывода (то есть, спустя 24 часа после транзакции V->W) используя только один ключ A. Также есть другой способ. Вы можете переводить средства без каких-либо задержек и на любой адрес, но при этом вам понадобятся и активный ключ A и ключ восстановления R (или несколько ключей восстановления).
Представляю вам диаграмму
первоначальный депозит $ ——-> V
инициировать вывод V ——-> W, используя ключ A
разблокировать средства после задержки W —(a)—> *, через ключ A и задержку в 24 часа
восстановить средства W —(b)—> *, с ключами A и R, без задержек
За Хранилищем стоит следующая теория обычные ключи просты в использовании (они всегда под рукой), но они довольно уязвимы, поэтому необходимо вводить «попытку вывода» с периодом задержки. Если транзакция законная, пользователю просто нужно подождать пока платеж пройдет. В противном случае, у пользователя есть время на то, чтобы заметить попытку вывода и устранить её при помощи ключей восстановления скажем, попросить друзей подписать транзакцию, или найти давно зарытую во дворе копию. Время задержки может быть прямо пропорционально сумме средств конкретного запроса. Если сумма небольшая, хранилище может и вовсе не использоваться, для средней суммы задержка составит 24 часа, а для долгосрочных сбережений — 72-часовую задержку, а также многоуровневое восстановление с участием доверительных лиц (друзей/родственников).
На сегодняшний день биткоин не имеет функции CheckOutputVerify, которая предлагается в докладе Covenants. Чтобы отобразить ее для Хранилища, мы можем использовать временный ключ V для адреса Хранилища и предварительно подписанную транзакцию V->W. Ключ V уничтожается сразу после поступления средств на адрес V. Дальше, вывод можно будет инициировать только через опубликование транзакции V->W. Адрес W может использовать уже доступную функцию CheckSequenceVerify, которая позволяет относительно контролировать время опубликования (например, «24 часа после публикации транзакции»), также на случай «если/вдруг что» есть возможность вернутся в начальную точку без задержек.
Если бы не было пластичности транзакций, можно было бы просто сделать следующее
Если мы сталкиваемся с пластичностью транзакций, то невозможно сделать шаги с 1 по 6 одновременно. Нам бы пришлось сохранять временный ключ V намного дольше, размещая его на диске (вместо нескольких секунд хранения в оперативной памяти), до тех пор, пока транзакция T1 не будет подтверждена, а риск реорганизации цепи не будет сведен к минимуму.
Но что еще хуже – мы создаем новую точку уязвимости. Так, для регулярных платежей реорганизация может отменить платеж, который был отправлен повторно. Если вы отправляете деньги себе – это не проблема. Но если вы удалите временный ключ, и подписанная транзакция (T2) — единственный способ восстановить ваши средства, реорганизация может заблокировать ваши средства навсегда. Вам придется немало подождать, чтобы ваши биткоины были надежно защищены транзакцией T1.
А пока вы будете в режиме ожидания, необходимо хранить ключ V, а также необходимо создать его резервную копию. Если вы уже сделали такую копию, необходимо защитить её надежным паролем, но при этом схема должна позволять хранить активный ключ A с посредственным паролем, потому что надежных паролей на самом деле нет. Получается, если ваш ключ V попал кому-то в руки, пока вы находитесь в режиме ожидания, вы автоматически теряете всю защиту злоумышленникам не надо будет использовать специально разработанную транзакцию T2, а всего лишь воспользоваться ключом V.
Поэтому бдеть над V надо сильнее, чем над A. Этого можно добиться при помощи той же системы мультиподписи, которая будет использовать для ключей восстановления R можно попросить своих друзей выступить в роли коллективного дополнительного ключа для вашего временного V, чтобы предварительно подписать транзакцию T2 (используя мою схему слепой подписи для поддержки конфиденциальности). Но теперь вы будете просить своих друзей не только о своем механизме восстановления (который вам возможно никогда не придется использовать), но придётся обращаться к ним каждый раз, когда потребуется перевести деньги в хранилище.
Как результат – кошелек должен быть намного сложнее, с большим количеством взаимодействующих частей, высокой интерактивностью с пользователем и дополнительными мерами безопасности, вместо того, чтобы позволять делать очевидные вещи простым нажатием кнопки.
СегВит приводит в порядок пластичность транзакций и позволяет создавать схемы для повышения безопасности. А это гораздо важнее, чем незначительное увеличение пропускной способности транзакций, поскольку биткоин большую часть времени хранится, и лишь изредка меняет владельца.