Что такое мультиподпись биткоин
Мультиподпись. Биткоин кошелек с мультиподписью
Любая криптовалюта является цифровым кодом, существующим исключительно в электронном мире.
Этот код создается людьми, следовательно, он может ими читаться, изменяться либо использоваться в незаконных манипуляциях, связанных с воровством цифровых монет.
Чтобы предотвращать ситуации, угрожающие безопасности кода, разработчики периодически создают и вводят меры, которые усиливают защиту криптокапиталов пользователей. К таким инструментам цифровой безопасности относится мультиподпись, охраняющая большинство современных криптокошельков, блокчейн-сетей и транзакций.
Криптовалютная мультиподпись – что это?
В простой схеме используется 2 ключа – подпись организатора транзакции и подпись получателя криптомонет. Такая модель самая ненадежная, современные multisig чаще используют три ключа, где добавляется подпись независимого арбитра, контролирующего четкое исполнение условий операции.
Эта схема применяется в большинстве криптосетей с токенами и криптомонетами. Операция (транзакция либо конвертация) неосуществима, если нет какого-то элемента – приватного ключа, публичного адреса и, иногда, подтверждения контролёра.
Действие исполняется, когда есть подтверждение достоверности двумя-тремя приватными ключами.
Для чего используется Multisignature
Цели усложнения подписи операции — разделение ответственности или повышение безопасности.
Разделение ответственности подразумевает, что несколько человек должны коллегиально принять решение о переводе средств. И их решение фиксируется с помощью применения персональной цифровой подписи.
Безопасность с помощью мультисиг достигается за счет того, что ключи, необходимые для подписи, хранятся на разных устройствах. Например, один на компьютере, а другой — на смартфоне. Для того чтобы завладеть средствами, злоумышленник должен получить доступ не только к компьютеру, который связан с криптовалютным кошельком, но и к другим устройствам или местам хранения, в которых находятся другие приватные ключи.
В случае когда стороны не привлекают третью сторону, процесс может быть организован созданием общего счета с необходимостью подписать каждую операцию всеми владельцами счета. На этот счет каждая сторона отправляет залог (желательно превышающий стоимость сделки). После успешного завершения сделки залоги возвращаются. Если сделка сорвана, то залоги теряются.
Мультиподпись в Биткоин
Особенностью Биткоина и многих других сетей криптовалют является необратимость транзакций — механизм отмены вошедшей в блокчейн транзакции отсутствует, также нет возможности совершить иное действие, игнорирующего волю текущего владельца.
Но Биткоин имеет встроенный скриптовый язык, позволяющий указывать дополнительные условия для проведения транзакций. Одно из возможных условий, реализуемых через скрипты — создание биткоин-адреса, для управления которым требуется оговоренное количество подписей из заданного списка.
Первым символом, созданных с использованием мультиподписи биткоин-адресов, является тройка (обычные биткоин-адреса начинаются с единицы).
В августе 2013 года компания BitGo первой реализовала интерфейс, в котором адреса с мультиподписью клиенты компании могли создавать и использовать без прямого обращения к скриптам.
Широкое распространение получили адреса, для операций с которыми нужны любые два ключа из оговоренных трёх. Чаще всего именно это и подразумевается под термином «Мультиподпись». Они позволяют реализовать обратимые транзакции.
Преимущества мультиподписи
Во-вторых, мультиподпись помогает обезопасить себя от утери средств.
Если вы потеряли свой смартфон, если третий ключ был оставлен в автономном режиме в хранилище, и была использована схема 2-of-3, вы сможете восстановить средства с помощью оставшегося устройства в сочетании с автономным ключом.
В-третьих, решается проблема контроля доступа. Муж и жена могут построить многобуквенный кошелек, который требует, чтобы оба они совершали транзакции, и третья сторона будет контролировать, чтобы они оба были в согласии.
Недостатки использования кошелька с мультиподписью
Первый минус заключается в том, что настройка Multisig-адреса требует определенных технической базы знаний.
Топ кошельков биткоина с мультиподписью
Мультиподпись для биткоин-кошелька — это наиболее эффективный способ защитить сбережения. Это идеально подходит, когда транзакции по одному адресу должно проводить более одного человека. Метод добавляет безопасность и повышает доверие, что необходимо управляющим партнерам, фондам и другим случаям хранения средств от нескольких сторон.
Что такое мульти-подпись биткоина?
Большинство транзакций в сети биткоин (и других блокчейнов) имеют единую подпись. Это значит, что они осуществляются с использованием только одного приватного ключа. При этом блокчейны могут обрабатывать гораздо более сложные транзакции, которые требуют нескольких подписей с закрытым ключом. Транзакции с мульти-подписью также называются M-of-N или с несколькими подписями.
Кошелек с несколькими подписями требует более одного закрытого ключа для проведения любых транзакций. На практике это означает, что вы можете настроить кошелек так, чтобы для выполнения транзакции требовалось 4 из 7 авторизованных подписей. Только когда транзакция подписана 4 авторизованными сторонами, она становится действительной. Это идеальный способ сохранения средств в безопасном состоянии, управления активами компании или сообщества и даже восстановления, если вы потеряете один ключ.
Какой биткоин-кошелек с мульти-подписью выбрать?
Мы отобрали несколько кошельков. Для этого учитывали их популярность у сообщества, функции и отзывы.
Armory Bitcoin Wallet
Кошелек Armory позиционирует себя как “единственный кошелек с открытым исходным кодом с поддержкой мульти-подписи и холодного хранения”. Разработчики этого проекта до этого работали над криптографией в Verisign — над разработкой спецификацией проверки личности в Интернете.
Через кошелек можно управлять приватными ключами в автономном режиме, то есть дает холодное хранение. Пароли защищены от считывания видеокартами функцией key-stretching. Также в нем доступно разделение ключа на 7 подписей.
Armory Wallet полезен для площадок, типа бирж, которым нужно хранить много монет в холодном хранилище, при этом не менять ключи постоянно.
Открытый исходный код позволяет сообществу проверить надежность разработчика и совместно искать баги.
Кошелек Armory доступен для Windows, Linux и Mac.
У этого кошелька большая коллекция видео-инструкций для тонкой настройки.
Electrum
Electrum подвергался хакерским атакам, но это не уменьшило его популярность. Он один из старейших биткоин-кошельков, который имеет не только мульти-подписи, но и функцию холодного хранения.
Electrum поставляется с открытым исходным кодом по лицензии MIT. Это позволяет любому пользователю запускать ноду Electrum Bitcoin, чтобы улучшить децентрализацию сети. Он также интегрирован с аппаратными кошельками Trezor и Ledger.
Electrum поддерживает до 15 из 15 авторизованных подписей. Это самое большое число из всех кошельков с мульти-подписью.
Есть мобильное приложение для Android, который есть в Google Play. Отзывы неоднозначные: есть хвалебные, но есть жалобы по юзабилити. Настольная версия доступна для Windows, Linux и Mac OS.
BitGo
BitGo поставляет решение для бизнес-пользователей. Он поддерживает множество криптовалют кроме биткоина и используется для горячих кошельков многих бирж. Кошелек позволяет подтверждать транзакции 3 из 3 подписями. Также он совместим с аппаратным кошельком.
BitGo использует несколько ролей: администратор, спонсор, только просмотр — они ограничивают доступ на разных уровнях. Администратор может управлять политикой и учетной записью, а “только просмотр” подходит для аудита. Еще в функционал входят различные ограничения и стратегии, белые списки, окончательная подпись (тот, кто утверждает последним). Единственный минус, что кошелек работает через командную строку без графического интерфейса.
BitPay
BitPay Wallet — это официальный кошелек процессинга BitPay. Он поддерживает мульти-подпись с двумя из трех авторизованных подписчиков. Он основан на open source кошельке Copay, но сам не является открытым проектом.
BitPay использует собственные сервера для проведения транзакции, а хранение ключей происходит только на устройстве. Этим решением проект избегает фишинговых атак, но является централизованным, что в случае DDoS-атак приведет к отказу.
BitPay поддерживает приложения для iOS и Android и версии для Windows, Linux и Mac OS, расширение Chrome.
The BTC.com
С этим кошельком неоднозначная ситуация. В iTunes у него 4 звезды, но отзывы плохие. Возможно, часть их оценок поставлена ботами.
Он был создан в 2016 году компанией Bitmain как понятный кошелек с мульти-подписью 2 из 3. Он выпущен для веб, Android и iOS. Ключи хранятся на устройстве пользователя и не пересылаются на сервер. Кошелек поддерживает BTC, BCH.
Три ключа для мульти-подписи генерируются так:
Если вы заметили какую-либо подозрительную активность в кошельке, вы можете «приостановить» ее, указав BTC.com не подписывать транзакцию. Если у вас есть два ключа, то решение BTC.com не повлияет на перевод транзакции. Этот кошелек подходит как персональное решение с большим уровнем безопасности.
Важность мульти-сиг кошельков
Все кошельки с множеством подписей работают по одному и тому же принципу совместного использования закрытых ключей. Это создает дополнительный уровень безопасности, поскольку к деньгам нельзя получить доступ, используя только один ключ.
На практике каждый кошелек по-разному использует мульти-подпись. В некоторых из них разрешено всего 3 из 3 авторизаторов, а в некоторых — 15 из 15 авторизаторов. Есть те, что используют мульти-подпись одного пользователя на двух устройствах, а, например, BitGo ориентирован на корпоративного клиента. При правильной настройке мультисигнатурный биткоин-кошелек будет идеальным решением для дополнительной безопасности и снижения рисков.
Выбор подходящего кошелька будет зависеть от ваших потребностей. Проведите свое исследование, учитывая факты из этой статьи.
Что такое мультиподпись? Что такое кольцевая подпись?
Что такое мультиподпись?
Мультиподпись (англ. – multisignature или multisig) – это технология подписания транзакций несколькими приватными ключами для повышения уровня безопасности и конфиденциальности в процессе одобрения отправки транзакций.
Мультиподпись является разновидностью пороговой подписи, реализованной как проверка условий, заданных на базовом скриптовом языке криптовалюты.
Как и когда возникла технология мультиподписей?
Хотя технология мультиподписей получила широкое распространение в мире криптовалют, ее фундаментальные принципы существовали задолго до создания биткоина.
На протяжении столетий принцип мультиподписи использовался для защиты безопасности монастырских склепов или крипт, в которых хранились останки святых. Настоятель монастыря раздавал монахам части ключей от гробниц. Ни один монах не мог получить доступ к священным останкам единолично и похитить их.
Технологию мультиподписи впервые имплементировали в биткоин-адреса в 2012 году. Первый кошелек с функцией мультиподписи создали в 2013 году. В настоящее время их больше десятка.
Как работает технология мультиподписей?
Доступ к средствам, хранимым на multisig-кошельке, возможен лишь в том случае, когда одновременно предоставляются две или более подписей.
Простой аналогией служит банковская ячейка или сейф с двумя замками и двумя ключами. Один ключ хранит Мария, другой – Хуан. Они могут открыть ячейку только в том случае, если одновременно предъявят оба ключа. По отдельности они не могут открыть ячейку без одобрения другого.
Таким образом, multisig-кошельки обеспечивают дополнительный уровень безопасности. С помощью этой технологии пользователи могут избежать проблем, часто возникающих в случае кошельков с одним приватным ключом, имеющих единую точку отказа и уязвимых к атакам киберпреступников, которые постоянно разрабатывают новые техники «фишинга».
Поскольку для перемещения средств кошельки с функцией мультиподписи требуют более одной подписи, они также подходят бизнесам и корпорациям, желающим хранить средства в кошельках совместного пользования.
Какие существуют разновидности мультиподписей?
1-из-2: объединенный счет двух бизнес-партнеров – подписи любой из сторон достаточно, чтобы тратить средства.
2-из-2: объединенный накопительный счет двух бизнес-партнеров – для расходования средств требуются обе подписи, что не позволяет одному из владельцев счета тратить средства без одобрения другого.
2-из-2: кошелек с двухфакторной аутентификацией: один хранится в компьютере, другой – в смартфоне. Средства не могут расходоваться без подписи обоих устройств.
3-из-5: адрес для пожертвований с низким уровнем доверия – каждый из пяти доверенных участников проекта хранит приватный ключ. Три человека могут расходовать средства, но переводить пожертвования на адрес проекта может любой. Такая схема уменьшает риск растраты, взлома, заражения вирусами и утраты средств из-за того, что один участник теряет интерес к проекту. В блокчейне отображается то, какой приватный ключ был использован в финальной подписи, что улучшает возможность учета.
2-из-3: покупатель-продавец с не требующим доверия условным счетом (эскроу) – покупатель переводит деньги на 2-из-3 адрес, продавец выступает в качестве третьего арбитра.
Если транзакция проходит успешно, покупатель и продавец оба подписывают транзакцию, возвращая средства продавцу. Если происходит сбой, они могут подписать транзакцию по возвращению средств покупателю.
Если они не могут согласиться, оба обращаются к третьей стороне, которая выступает в качестве арбитра и обеспечивает второй подписью ту сторону, которую считает того заслуживающей. Арбитр не может похитить средства, поскольку имеет лишь один ключ.
2-из-3: совет из трех управляющих хранит средства компании или организации – эти средства нельзя расходовать без согласия любых двух из трех управляющих. Для крупных организаций возможны более крупные мультиподписные транзакции – 3-из-5, 5-из-9 и т. д.
2-из-3: кошелек горячего хранения для бизнесов. Биткоин-биржа хранит один приватный ключ онлайн, другой приватный ключ – в качестве бумажного резерва. Отдельная компания по защите кибербезопасности хранит третий ключ онлайн и подписывает транзакции только после проверки ряда факторов (отсутствие/присутствие в черных и белых списках, непревышение лимита числа выводов за определенный период, двухфакторная аутентификация, соответствие регуляторным нормам и т. д.). Если горячий кошелек биржи или компании взламывается, биткоины невозможно похитить. Если компания по киберзащите прекращает работу, биржа может получить доступ к средствам посредством бумажного резерва.
2-из-3: децентрализованная ячейка холодного хранения – один из ключей хранится у пользователя в сейфе дома, второй – в банковской ячейке, а копию третьего ключа хранят близкий друг пользователя и его родственник в своем офисе. Домашняя ячейка защищена от грабителей, поскольку расходование средств требует визита к другу, в банк или в офис.
1 или 3-из-4: распределенный резерв – первичный пользователь может использовать кошелек по желанию, но если этот владелец утрачивает свои приватные ключи, то их можно восстановить с помощью трех из четырех других доверенных друзей/организаций. Один ключ хранится в банковской ячейке, три другие хранятся у друзей. В случае смерти владельца ячейка со средствами, согласно его завещанию, может быть передана одному из доверенных друзей или кому-то, кто может воспользоваться помощью со стороны доверенных друзей.
Что такое кольцевые подписи?
Кольцевая подпись – разновидность криптографической цифровой подписи, которую может поставить любой член группы пользователей, каждый из которых имеет ключ.
Один из параметров безопасности цифровой подписи состоит в том, что вычислительными средствами невозможно установить, ключ какого члена группы использовался для того, чтобы поставить подпись. Кольцевые подписи аналогичны групповым подписям, но отличаются от них в двух аспектах: невозможно деанонимизировать индивидуальную подпись, а подписантами могут стать, без дополнительной настройки, члены любой группы пользователей.
Название «кольцевая подпись» происходит от кольцеподобной структуры алгоритма генерации подписи.
Кто и когда изобрел кольцевые подписи?
Кольцевые подписи изобрели криптографы Рон Ривест, Ади Шамир и Яэль Тауман Калай и представили эту технологию на международной конференции ASIACRYPT в 2001 году.
Изначальная концепция предусматривала, что кольцевые подписи будут функционировать в качестве способа защиты от утечки секретной информации – в частности, из правительственных офисов. Впоследствии первоначальная модель была оптимизирована.
В 2006 году Эйитиро Фуджисаки и Котаро Судзуки предложили решение под названием Traceable Ring Signatures, позволяющее исправить уязвимость технологии кольцевых подписей (риск манипуляции со стороны злокозненных или безответственных подписантов). Оптимизированная версия этой разновидности кольцевой подписи в настоящее время применяется в монетах CryptoNote и обеспечивает неотслеживаемость отправителя в транзакции P2P, скрывая источник входов в транзакции.
В 2015 году Monero Research Labs выдвинула концепцию кольцевых конфиденциальных транзакций (Ring Confidential Transactions), которую представил и имплементировал разработчик Bitcoin Core Грегори Максвелл. Расширяя возможности анонимизации, присущие изначальной кольцевой подписи, кольцевые конфиденциальные транзакции скрывают не только тождество отправителя, но и суммы транзакций между отправителем и получателем.
Как работают кольцевые подписи?
Кольцевые подписи выводят технологию групповых подписей на новый уровень, обеспечивая пользователю повышенный уровень конфиденциальности. В формате транзакций P2P в криптовалютах криптовалют – например, CryptoNote – кольцевые подписи защищают отправителя, скрывая принимающую сторону транзакции таким образом, что вычислительными средствами невозможно определить, кто является подписантом транзакции.
Кольцевые подписи – более изощренная схема, чем типичные цифровые подписи, такие как ECDSA или подписи Шнорра.
Кольцевые подписи могут требовать множества различных открытых ключей для верификации. «Кольцевой» подпись называется потому, что она состоит из ряда частичных цифровых подписей от разных пользователей. Вместе эти подписи образуют уникальную подпись. Группа подписей известна как кольцо и может быть произвольно выбрана из выходов от других пользователей на блокчейне.
Концептуально, кольцевые подписи аналогичны схеме, в рамках которой несколько сторон подписывают чек из совместного банковского счета, однако средствами криптографии подписант из числа членов группы скрывается.
Структура кольцевой подписи (на примере криптовалюты Monero):
Автоматическое создание уникальных одноразовых ключей позволяет предотвратить соединимость транзакций и возможно благодаря оптимизации ключевого обмена по методу Диффи–Хеллмана.
Что такое ключевое изображение?
Конфиденциальные валюты, такие как Monero, сталкиваются с проблемой двойной траты. Отсутствие решения делает эти сети бесполезными в качестве цифровой валюты, поэтому нашлось решение в виде использования ключевых изображений в сочетании со схемой кольцевых подписей.
Ключевое изображение – это криптографический ключ, получаемый из потраченного выхода, и является частью каждой транзакции кольцевой подписи. Существуют только одно уникальное ключевое изображение для каждого выхода на блокчейне. Список всех использованных ключевых изображений сохраняется на блокчейне.
В силу криптографических особенностей ключевых изображений невозможно провести корреляцию между выходом на блокчейне и его ключевым изображением. Любые новые кольцевые подписи, использующие дубликат ключевого изображения, автоматически отвергаются как попытка двойной траты.
Что такое кольцевые конфиденциальные транзакции (Ring CTs)?
Ring CTs – это улучшенная модификация технологии кольцевых подписей. Если главным назначением кольцевых подписей служит обеспечение конфиденциальности отправителя транзакции, то кольцевые конфиденциальные транзакции разрабатывались преимущественно для того, чтобы повысить конфиденциальность для отправителя и получателя, скрывая сумму транзакции.
В первоначальном формате кольцевой подписи выходы «разбивались» на отдельные кольца, поскольку кольцевые подписи могли содержать только равноценные выходы. Из-за этого третьи стороны могли видеть истинные суммы транзакций. Благодаря использованию Ring CTs транзакции хранятся не в прозрачном блокчейне, таком как блокчейн биткоина, а в «замутненном».
Транзакции, в которых используются Ring CTs, уже не нужно разбивать на части и включать в кольца равноценных выходов – кошелек в криптовалюте, использующей Ring CTs, может произвольно выбирать членов кольца из выхода любой суммы.
Ring CTs также используют схему обязательства, реализуемую посредством доказательства диапазона, которое подтверждает, что сумма, используемая в транзакции, больше 0 и меньше энного числа; при этом, суммы транзакций не раскрываются. Таким образом, внешние наблюдатели не в состоянии видеть транзакцию, но благодаря криптографической верификации могут быть уверены, что транзакция действительна.
Как работает мультиподпись в Биткоине
Multisignature address
Multisignature address (multisig address, если сокращенно) — это такой Биткоин адрес, к которому привязано сразу несколько пар ECDSA ключей. Каждая пара состоит из личного и открытого ключей. Схемы комбинаций, согласно которым можно использовать эти ключи, могут быть различными. Более того, можно установить условия, при которых нужно будет предоставить несколько подписей, чтобы потратить монеты с адреса.
Bitcoin транзакция, которая использует мультиподпись
Более детально это можно отобразить схематически. Пока достаточно будет представить образно, что multisignature address формируется путем хеширования сразу нескольких сконкатенированных открытых ключей. Детально мы рассмотрим это чуть дальше. На схеме изображена транзакция, которая тратит с multisignature address.
Серым цветом обозначена область заголовка. Он содержит два поля. Синим цветом обозначены два входа, а зеленым — два выхода. В первом входе находятся заполненные поля: записано хеш-значение предыдущей транзакции, которая тратит данные монеты, номер выхода и т. д. Поле scriptSig содержит открытый ключ и подпись, что характерно для обычной транзакции.
Обратим внимание на второй вход транзакции. В поле scriptSig находится другая комбинация данных: перечислено два открытых ключа и две подписи. Они должны проверяться этими открытыми ключами соответственно. Это и есть тот вход транзакции, который тратит монеты с multisignature address. Именно так будет выглядеть доказательство владения монетами.
Варианты комбинаций ключей
Существуют различные комбинации ключей при использовании multisignature address. Наиболее используемыми вариантами являются 2-из-2, 2-из-3, а также 3-из-3. Максимально возможный вариант — 15-из-15.
Самая простая комбинация — 2-из-2. Она подразумевает, что есть multisignature address, к которому привязано две пары ключей, по сути, захешировано два открытых ключа подряд и получен некоторый адрес. Чтобы потратить монеты с этого адреса, нужно предоставить две подписи, которые будут верифицироваться двумя имеющимися открытыми ключами, конкатенация и хеширование которых в нужном порядке должны давать то же значение адреса. Обобщая, есть два заранее установленных ключа и нужны обязательно две подписи, которые будут проверяться этими ключами соответственно.
Схема использования multisignature address 2-из-3 подразумевает, что любые два ключа из трех заранее установленных должны быть задействованы для проверки двух подписей, представленных в качестве доказательства владения монетами. Иначе говоря, чтобы потратить монеты, нужно предоставить две подписи, которые будут проверены двумя открытыми ключами из предустановленных трех.
Комбинация 3-из-3, как вы уже поняли, требует три подписи, которые будут проверяться тремя заранее установленными ключами. Максимальной в отношении количества необходимых подписей и открытых ключей будет схема 15-из-15.
Давайте пройдемся по вариантам применения указанных комбинаций.
Представьте, что муж и жена захотели вести общий бюджет.
Они договариваются, что только при согласии каждого из них средства из бюджета будут тратиться на определенные нужды. С помощью Биткоина это можно реализовать достаточно просто. Они создают multisignature address по данной схеме, где один ключ контролирует жена, а второй — муж. Тогда все доходы семья будет получать на такие адреса, а тратиться средства смогут только по обоюдной договоренности.
Предугадывая ваш вопрос о сценарии, когда муж и жена не договорятся, представим, что жена считает необходимой покупку стиральной машины, потому что она устала стирать руками, а муж считает, что это не такая уж и тяжелая работа, а будет целесообразнее потратить все монеты на последнюю модель PlayStation и проводить таким образом досуг. Жена обижается на мужа и съедает бумажку со своим личным ключом, делая невозможной трату с этого адреса вообще.
Как избежать такой ситуации и защитить монеты от окончательной потери монет?
Есть возможность создать транзакцию, которая потратит все средства с нужного адреса, несмотря на то, что сумма заранее неизвестна. На вход подается не сумма, а ссылка на транзакцию, откуда эти монеты могут быть потрачены. Есть такое понятие, как hash type, — это способ покрытия подписью транзакций. Он позволяет создать подпись заранее, а некоторые данные транзакции, например вход, можно будет подставить позже. Таким образом, можно создать транзакцию, которая потратит монеты из еще не существующей транзакции, и применить ее позже, т. е. когда это будет нужно.
Более того, на эту транзакцию можно поставить ограничение LockTime. Оно позволяет не подтверждать транзакцию сразу, а отложить ее на некоторый срок. Итак, муж и жена сразу после создания multisignature address, еще до получения любых платежей, могут создать две LockTime транзакции, в которых все будущие монеты будут перенаправлены на обычные адреса мужа и жены, которые они контролируют самостоятельно. При этом транзакции будут отсроченными и могут быть подтверждены только, например через два месяца. Эти транзакции могут быть распечатаны на бумаге и храниться в сейфе у каждого по отдельности. Если возникнет ситуация, когда монеты находятся на балансе multisignature address, а ключи потеряны (один или оба), то монеты становятся замороженными. Но есть LockTime транзакция. Тот, кто опубликует такую транзакцию, сможет вывести эти средства на действующий внешний адрес. Монеты будут сохранены. Это был упрощенный пример, однако возможны и более сложные механизмы.
Допустим, есть группа людей, у которых есть общий бюджет.
Они создают multisignature address, в котором есть три ключа, но для подписи транзакции достаточно двух подписей. При согласии участников, которые составляют большинство группы, эти средства могут быть потрачены. Иначе говоря, любые два участника из трех могут потратить монеты. Им для этого достаточно распространить транзакцию в сеть.
Пример с Wallet сервисом
Есть более интересный способ применения комбинации 2-из-3 и он используется в так называемых сервисах кошельков. Сервис кошелька в данном контексте не стоит путать с обычным Биткоин кошельком, который пользователь контролирует самостоятельно. Сервис не предоставляет полноценное хранилище для монет и не владеет ими, а только оказывает услуги для удобной работы.
Если представить подобную ситуацию схематично, то один ключ принадлежит непосредственно сервису, второй генерируется только пользователем (и только ему известен), третий ключ генерируется и хранится тоже пользователем, но отдельно. После этого вычисляются открытые ключи, соответствующие этим личным, и составляется multisignature address. Туда поступают монеты и теперь условия траты ограничиваются.
Представим, что мы имеем дело с некоторым веб-сервисом и на его ресурс можно войти через браузер. Браузером подгружается код Биткоин кошелька, который по этому адресу получает список не потраченных монет, рассчитывает их баланс и готов потратить. Если пользователь хочет потратить монеты, то он прямо в браузере составляет транзакцию и подписывает ее своей (одной из необходимых) подписью.
Заметим, что личный ключ пользователь может получать либо из своего пароля, либо ключ может случайным образом генерироваться, шифроваться паролем пользователя и храниться у сервиса. Тогда пользователь посылает запрос сервису, получает контейнер с зашифрованным ключом, расшифровывает своим паролем и уже имеет доступ к своему личному ключу.
Когда пользователь подписывает транзакцию, она отправляется на сторону сервиса, чтобы он поставил вторую необходимую подпись и отправил транзакцию. Сервис уточняет факт необходимости подписания транзакции через второй канал аутентификации, то есть через установленный заранее другой канал, которым может быть звонок на мобильный телефон, SMS, сообщение на электронную почту и прочие способы альтернативной коммуникации (вплоть до личного визита, если того требует уровень безопасности). Когда сервис удостоверился, что запрос на подпись транзакции действительно инициирует зарегистрированный пользователь, он ставит недостающую подпись с помощью своего ключа. После этого транзакция становится валидной и может быть распространена в сеть для подтверждения.
Третий ключ используется в тех случаях, когда сервис отказывает в обслуживании. ПО генерирует этот ключ и предлагает его сохранить удобным для вас способом. Пользователь обычно хранит его в надежном месте. Если сервис отказывает в обслуживании, то пользователь может подписать транзакцию своими ключами (вторым и третьим). Если же второй ключ хранился на стороне сервиса, то защищенный контейнер с этим ключом будет заранее отправлен пользователю по альтернативному каналу передачи данных, например на электронную почту. Пользователь расшифровывает контейнер с ключом при помощи своего пароля.
Пользователь получает два необходимых личных ключа и вводит в специальное ПО, которое сервис предоставил заранее. Далее это ПО работает уже автономно на компьютере пользователя, без участия сервиса. Стоит отметить, что этим ПО следует пользоваться только в крайних случаях, когда сервис отказывает в обслуживании (т. е. его взломали, он поврежден или перестал существовать). Тогда пользователь подписывает транзакцию своими ключами и переводит монеты куда нужно.
Преимущества Wallet сервисов с подписью 2-из-3
На преимуществах таких Wallet сервисов остановимся подробнее. Это безопасный способ хранения, потому что сервис не владеет всем необходимым набором ключей — он владеет только одной частью, которой недостаточно, чтобы завладеть средствами. Причем доступа к средствам не имеет ни сам сервис, ни хакер, который его может взломать.
Удобство такого подхода состоит в том, что пользователю не обязательно иметь защищенный доступ к этому сервису. Он может иметь обычное устройство, которое может быть заражено вирусами или контролироваться мошенниками, а данные могут быть скомпрометированы или заменены. Но злоумышленнику недостаточно владеть только этим устройством, потому что из него можно добыть только одну из двух подписей.
Еще одно преимущество состоит в том, что если сервис отказывает в обслуживании, то пользователь не теряет доступ к своим монетам. Это были только некоторые из возможных схем использования multisignature адресов, которых достаточно для знакомства.
Меры предосторожности при работе с мультиподписью
И теперь стоит поговорить о мерах предосторожности, касательно мультиподписи. В случае 2-из-2 нужно создавать LockTime транзакции, которые смогут перевести заблокированные средства на определенный адрес. Это актуально, когда происходит потеря ключей.
Если вы используете multisignature address 2-из-3, то очень важно хранить ключи в надежном месте. В случае потери одного из трех ключей нужно сразу переводить средства и не дожидаться момента, когда будут потеряны 2 ключа из 3 необходимых.
Как работает Bitcoin Script (на примере)
Чтобы понять детальнее, как работает мультиподпись, нам нужно немного поговорить о том, как работает Bitcoin Script: как задаются правила траты монет, как им удовлетворять, какие существуют операции описания правил, что такое Bitcoin Script и как устроено его выполнение.
Рассмотрим пример простого случая траты монет, где есть обычный адрес, к которому привязан хеш одного открытого ключа, соответствующий скрипт, который задает условия траты, и скрипт, который удовлетворяет этим условиям.
На схеме слева мы видим стек данных, а справа сам скрипт. Первые две части строки script — signature и открытый ключ, — так называемый unlocking script, то есть скрипт, который указывается во входе транзакции, которая тратит монеты. После этого следует набор данных, который указывается в выходе транзакции — это называется locking script. Иначе говоря, тут представлена конкатенация двух скриптов: скрипт, отпирающий монеты, и скрипт, запирающий монеты. В случае, когда транзакция будет валидироваться уже узлом сети, эти два скрипта объединяются для выполнения проверки условий траты монет. Таким образом сначала идет unlocking script, а за ним следует locking script.
После этого идет последовательное выполнение полного набора операндов и данных. Точка выполнения идет последовательно по каждому операнду и каждому участку данных. Если точка выполнения попадает на участок данных, то они помещаются в стек. Как мы видим на схеме, курсор выполнения скрипта в верхней части указывает на данные подписи, которые после помещаются в стек.
Далее, курсор выполнения указывает на открытый ключ — он также помещается в стек.
Третьим шагом идет выполнение операции дубликации, что подразумевает копирование верхушки стека и помещение этих данных повторно в стек.
После этого выполняется хеширование с помощью хеш-функции Hash-160. Это значит, что верхушка стека хешируется сначала алгоритмом SHA-2 на длине 256 бит, а потом функцией RIPEMD-160 на длине 160 бит. Операция точно такая, как при хешировании открытого ключа и получении адреса. Фактически это она и есть.
Мы имеем стек, подпись, открытый ключ и хеш-значение открытого ключа. Курсор выполнения скрипта указывает на адрес, который был задан в выходе транзакции, то есть то хеш-значение открытого ключа, которое указывалось, когда монеты на него отправлялись. Эта часть данных тоже попадает в стек.
Следующей выполняется операция проверки на идентичность equal verify.
Два верхних элемента стека сравниваются. Если они побайтово полностью одинаковые, то эти данные удаляются из стека и считается, что проверка прошла успешно. После этого в стеке остаются signature и public key. Соответственно, операция check signature берет эти два операнда и проверяет подпись открытым ключом. Если подпись верна относительно транзакции, которая сейчас проходит проверку, потому что подпись покрывает часть транзакции, соответственно, нужно взять хеш-значение от определенных полей этой транзакции. Это задается отдельным байтом структуры hash type, то есть берется хеш-значение и подается на вход верификации подписи вместе с самой подписью и открытым ключом. Если проверка происходит корректно, то результат проверки — true, это значение кладется в стек. На этом выполнение скрипта заканчивается. Данные передаются в вызывающую функцию и там проверяются. Если в стеке находится значение true, значит верификация данного входа транзакции прошла корректно. Если все входы транзакции были корректно проверены, то и вся транзакция считается правильной.
Мы познакомились с тем как работает Bitcoin Script для проверки простых входов и выходов транзакции. Теперь мы поговорим о том, как организована и как работает multisignature при использовании Bitcoin Script.
Однажды было предложено BIP16, которое задает новый концепт в протоколе Биткоина — так называемый pay to script hash (P2SH). Это возможность задать правила траты монет не открытым скриптом, где вы подряд прописываете операнды и некоторые данные, которые потом выполняются рассмотренным нами образом, а в виде хеш-значения от нужного вам скрипта, то есть контрольной суммы от этих операндов. Это позволило в выходе транзакции задавать большие и сложные условия траты монет, но при этом сам выход оставался коротким.
Чтобы потратить эти монеты при таких условиях, на входе транзакции нужно указать данные, удовлетворяющие этому скрипту, и исходный скрипт целиком, чтобы доказать, что вы знаете, какие условия были заданы при отправке монет, чтобы хеш-значение исходного скрипта совпало с адресов на который были отправлены монеты. Иначе говоря, доказать, что вы знаете условия, и удовлетворить этим условиям.
Это предложение по улучшению Биткоина было принято 3 января 2012 года. Фактически в день рождения Биткоина. Сейчас оно активно применяется для реализации multisignature address.
Как работает P2SH
Давайте рассмотрим на примере, как это работает. Для построения транзакции нам понадобится иметь представление о таких понятиях, как Redeem Script, Locking Script и Unlocking Script.
Redeem Script содержит в себе открытые ключи, к которым будет привязан multisignature address. В данном случае мы рассматриваем комбинацию ключей “2-из-5”. Сначала идет значение 2, то есть мы указываем, что необходимо будет 2 подписи, которые будут проверяться соответствующими открытыми ключами. После этого следуют открытые ключи, в нашем случае их 5. Далее мы указываем значение 5, так как мы указали 5 открытых ключей, а когда данные будут считываться в обратном порядке это значение понадобиться, чтобы понять, сколько ключей нужно прочесть. После этого указывается операция проверки мультиподписи (operation check multisignature).
Locking Script — скрипт, который указывается в выходе транзакции, которая платит на multisignature address. Здесь будет производиться операция получения хеш-значения, с которой мы подробно уже знакомились. Далее следует хеш-значение Redeem Script, которое занимает 20 байт. После этого проводится операция по проверке соответствия данных фактическому хеш-значению.
Unlocking Script является конкатенацией скриптов на входе транзакции со скриптами в выходе транзакции, которая платила на этот адрес. Есть две подписи, необходимые для траты монет, и полный Redeem Script, который позже будет захеширован и проверен на предмет соответствия адресу, на который были отправлены монеты. После этого скрипт будет выполняться целиком, в том числе для проверки мультиподписи.
Важно, что есть ограничения на максимальный размер для каждого из перечисленных скриптов и это 520 байт. Это число было рассчитано, исходя из того, что в Unlocking Script может поместиться максимум 15 подписей и 15 соответствующих открытых ключей, а также несколько операций для проверки этих значений. Именно так было получено некоторое число, которое при округлении дало 520 байт. Следует сказать, что это число получено с расчетом на то, что multisignature address типа “15 из 15” является достаточно разумным пределом для практического применения. Redeem Script при использовании большого количества подписей становится очень большим по объему. Тот пользователь, который использует multisignature address или другие P2SH адреса, при трате монет с них имеет очень большие по объему транзакции. Это значит, что для подтверждения своих транзакций ему придется платить большие комиссии.
Преимущества P2SH
Отдельно рассмотрим преимущества P2SH. Первое из них состоит в том, что такие адреса могут быть закодированы в привычный вид с использованием Base58, в котором их длина составляет 34 символа. В соответствии с BIP13, которое определяет правила установки версионного байта для Биткоин адресов, кодированных Base58Check, начинаться адрес будет с тройки, то есть туда вставляется определенный версионный байт.
На примере вы можете видеть P2SH адрес.
Это может быть не обязательно multisignature address. Redeem Script может описывать не только multisignature address, но и другие сложные правила траты монет.
Добавим, что это не единственный способ организации мультиподписи в Биткоине. Можно и не использовать P2SH, а в выходе, который будет платить на multisignature address, не хеш-значение от скрипта, а сам скрипт, то есть перечислять прямо в выходе все открытые ключи и ставить операцию проверки multisignature. Однако при оправке монет на такой адрес вы сразу разглашаете открытые ключи, так как они будут находиться в открытом доступе и в этот момент на них будут храниться монеты.
И еще одним недостатком является то, что отправитель монет на multisignature address имеет транзакцию большого объема, за которую придется платить большую комиссию. Вряд ли отправитель захочет переплачивать за то, что получатель хочет использовать multisignature. P2SH дает возможность переложить комиссионные затраты на получателя. Если получатель хочет принимать монеты на multisignature address, то он сам будет оплачивать большие транзакции, что является более справедливым подходом.
Добавим, что P2SH позволяет реализовать разные комбинации такого multisignature (2-из-2, 2-из-3 и другие).
Схематично рассмотрим отправку на multisignature address.
Представим, что Алиса хочет заплатить Бобу, который использует только multisignature addresses. Для этого Боб локально на своем компьютере (кстати, вместо Боба может быть какая-то организация) генерирует несколько личных ключей, получает из них соответствующие открытые ключи, которые конкатенируются определенным образом. Чаще всего открытые ключи представлены сначала закодированными Base58Check, а потом они сортируются в алфавитном порядке, после чего конкатенируются.
Такой подход оправдывает себя, когда требуется перерасчет открытых ключей из личных. Их нужно конкатенировать точно в таком же порядке, потому что следующим шагом будет создание Redeem Script и его хеширование. Если точно такие же ключи попадут в Redeem Script, но в другом порядке, мы получим другое хеш-значение и другой адрес. Это повлечет за собой определенные недоразумения. Поэтому перед конкатенацией открытые ключи нужно отсортировать согласно некоторому правилу. И чаще всего используют сортировку по алфавиту в системе счисления Base58.
Итак, Боб посчитал хеш-значение от Redeem Script. Он может его представить в виде 20 байт и отправить Алисе, сказав, что это multisignature address с использованием P2SH. Однако Боб может закодировать его с версионным байтом, как обычный адрес, и просто отправить Алисе. Алиса поймет по версионному байту, что это multisignature address, составит транзакцию и соответствующим образом заполнит ее выход, чтобы Боб получил свои монеты. Далее она распространяет транзакцию в сеть. Они дожидаются подтверждения и Боб принимает платеж от Алисы. Замен Боб, например, оказывает услугу или передает товар.
Наступает момент, когда Боб хочет потратить эти монеты. Следует понимать, что полный Redeem Script не был разглашен публично, пока монеты находились на его multisignature адресе. И даже Алиса не видела, какие именно открытые ключи использовал Боб, сколько их там было и т. д. Она вообще не знает, по каким правилам этот P2SH адрес составлен, multisignature address это или нет и т. д. Соответственно, атаки на электронно-цифровую подпись (на эллиптическую кривую) еще невозможны.
Допустим, Боб хочет отправить платеж Еве.
Она генерирует новый адрес и дает его Бобу. Он создает заготовку транзакции, во входе которой он указывает ту транзакцию, в которой он получил монеты от Алисы, а на выходе — адрес Евы. Теперь он должен предоставить доказательства владения монетами, которые он тратит. Для этого он берет два своих личных ключа (выше мы упоминали, что его multisignature address предполагает вариант “2-из-5”), из которых вычисляет две подписи к данной транзакции. Далее, он берет полный Redeem Script и добавляет его во вход транзакции.
Обратите внимание, что данный Redeem Script должен храниться у Боба на компьютере целиком либо он должен запомнить порядок, в котором он использовал открытые ключи для составления этого скрипта. Если же он применял определенные правила сортировки, то он должен запомнить их. Он также должен помнить, что к определенным личным ключам привязан multisignature address. Без этих знаний Боб не знал бы, какими из его личных ключей оперировать и в каком порядке их следует хешировать для получения нужного адреса.
Итак, у него есть две подписи и полный Redeem Script. Транзакция считается верной и Боб ее распространяет в сеть, а после дожидается подтверждения. Это основное из того, что касается траты с multisignature address.
Вопросы
Сейчас мы переходим к вашим вопросам.
— Можно ли один и тот же кошелек запустить одновременно на трех разных компьютерах и начать синхронизацию?
Скорее всего, речь идет о каком-то узле сети: либо SPV узле, либо полном узле. Было использовано несколько разных компьютеров и один и тот же кошелек. А под кошельком подразумеваются личные ключи. Есть несколько полных узлов, которые реализуют функциональность кошельков. На этих узлах мы вставляем одни и те же личные ключи и начинаем синхронизацию. Скорее всего, при полной синхронизации с сетью мы увидим на каждом кошельке, который использует свой узел, один и тот же баланс. Если же вы увидите изменения на одном узле, то после синхронизации с сетью вы увидите точно такие же изменения на всех остальных узлах. Транзакция не остается в секрете, она распространяется по всем узлам, которые ее верифицируют и отображают соответствующие изменения, если это касается их адресов. Фактически да, можно использовать одни ключи на нескольких узлах, но все транзакции тоже будут синхронизироваться автоматически. Биткоины точно от этого не удвоятся и, более того, не утроятся.
— Как P2SH работает с Segregated Witness?
Segregated Witness — это такая структура транзакций, где доказательства владения монетами выносятся в отдельную структуру, они не попадают в блокчейн, но при валидации транзакций они распространяются вместе, то есть все валидаторы проверяют правильность транзакций по отдельной структуре с доказательством. После подтверждения транзакции доказательства не сохраняются, так как смысла это не имеет. Есть также преимущества в построении таких цепочек транзакций, в которых определенные монеты без фактического подтверждения в текущей транзакции уже тратятся в следующей, построенной на ее основе, но они не распространяются в сеть. Таким образом, формируются цепочки транзакций, которые не разглашают доказательства владения монетами. Это облегчает передачу данных и добавляет приватность. Для Segregated Witness был использован другой тип адресов, он содержит немного другие операнды. Есть возможность отправлять монеты, которые хранятся на обычных адресах, в том числе P2SH адресах, на адреса Witness P2SH.
— Адреса с тройки начинаются в Lighting Network?
По BIP13 определены правила, по которым выбирается версионный байт для Биткоин адресов в test-нете, других валютах и т. п. Да, Lighting Network использует multisignature адреса, которые тоже применяют P2SH способ задания условий.
— Почему нельзя персонализировать кошелек, то есть привязать его к конкретной личности?
Биткоин как протокол платежной системы не требует идентификации личности кошелька, потому что он работает по законам математики, а математика не позволяет описать человека, как личность. Более того, это не является необходимым условием для проверки транзакций. Здесь достаточно электронно-цифровой подписи. Кто может генерировать такие подписи, тот и является их владельцем — к протоколу Биткоина это не относится. Следовательно, подписью может владеть человек, группа из нескольких человек, робот и т. д.
Что касается персонализации, то если вы устанавливаете связь конкретного адреса с конкретной личностью, то вы нарушаете приватность и можете деанонимизировать часть сети с определенной долей вероятности. В общем случае база данных открыта, но никаких данных о личностях в ней нет.
— Если валюта не майнится, а таких валют 70-80%, можно ли им доверять?
Хорошо написано, что это валюта, а не криптовалюта, потому что криптовалюта работает по таким же принципам, как и Биткоин, то есть все процессы максимально децентрализованы: эмиссия, верификация транзакций, хранение данных, принятие изменений и т. д. Но есть такие валюты, мы будем называть их цифровыми валютами, у которых не все из перечисленных процессов децентрализованы. Одним из вариантов может быть централизованная эмиссия, то есть нет такого понятия как добыча, майнинг, то есть нет решения сложной задачи. По такому принципу работает Ripple, Stellar, цифровая валюта NXT, Cardano. Там были применены другие принципы распространения монет среди пользователей, например, через ICO, доказательство личности и т. д. Из-за того, что не все процессы могут быть децентрализованы и независимы, нельзя любую цифровую валюту назвать криптовалютой. Кроме того, вопрос о доверии к той или иной валюте носит личностный характер. Вы сами принимаете решение о размере этого доверия. Нужно учитывать цели, для которых валюта используется, а также ее риски и ограничения.