Если вы знакомы с кошельком Electrum, тогда знаете, что он использует мнемоническую фразу (seed), обычно из 12-ти английских слов, для генерации master private key (xprv), который используется для генерации бесконечной последовательности приватных ключей (private key) и, следовательно, открытых ключей (public key) и адресов (address).
Обычно, когда люди говорят “публичный адрес”, они думают что адрес кошелька и публичный ключ одно и тоже. Это не так. Адрес кошелька (address) --- это хэш публичного ключа (public key), и им можно делиться с другими, он не содержит в себе приватной информации.
Некоторые иерархически детерминированные кошельки (HD-кошельки), для повышения безопасности, позволяют разделять создание master private key (xprv) и публичного ключей. При такой схеме, кошелек может быть настроен зная только master public key (xpub).
Плюсы такого подхода:
- кошелек может создавать столько адресов (address), сколько это необходимо;
- если master public key (xpub) будет скомпрометирован, это не позволит злоумышленнику потратить BTC из кошелька;
Также, держа по отдельности master public key (xpub) и master private key (xprv) их можно использовать в кошельках Electrum или Armory, для полностью автономного хранилища, в котором один компьютер (в автономном режиме) знает приватный ключ (xprv), а второй (подсоединен к интернету) знает только публичный ключ (xpub).
Master public key (xpub) может генерировать одну и ту же последовательность адресов (address) независимо от мнемонической фразы (seed). Таким образом, вы можете ввести master public key (xpub) в кошелек, и получить безопасный вариант только для приема средств (watch-only wallet).
Вы сможете видеть баланс кошелька, генерировать новые адреса, но не сможете отправить с него средства. BTC отправленные на сгенерированные адреса, автоматически будут отображаться в вашем кошельке.
Пару слов о мультиподписи
Мультиподпись (транзакция с несколькими подписями --- multi-signature transaction) впервые появилась в кошельке BitGo в 2013 году.
В 2015-ом году кошелек Electrum обновился до версии 2.0, где была добавлена возможность создавать адреса с мультиподписью по схеме “2-из-3” (наиболее распространенный вариант). В последней версии возможны разные вариации вплоть до “15-из-15”.
На момент написания этого поста, последний релиз кошелька Electrum-3.1.2
Актуальную версию Electrum кошелька смотрите только на официальном сайте кошелька: https://electrum.org/#download
Никогда не качайте кошельки с непроверенных источников!
Мультиподпись позволяет:
- Отправлять BTC только с одновременного согласия нескольких сторон сделки / владельцев ключей (xpub), каждый из которых должен подписать транзакцию своим ключом;
- Значительно повысить безопасность личного кошелька;
Создание мультисиг кошелька Electrum со стороны покупателя (2-из-3)
Скачайте последную версию Electrum: https://www.electrum.org/#download и запустите кошелек:
Задайте имя файлу кошелька (я задал buyer_wallet), или оставьте default_wallet и нажмите “Дальше”.
В следующем окне, вы должны выбрать какой тип кошелька хотите создать. Выберите Multi-signature wallet и нажмите “Дальше”:
Далее нужно выбрать количество подписей, необходимых для отправки с этого кошелька. В нашем случае выбираем “2-из-3” и нажимаем “Дальше”:
В следующем окне выбираем Create a new seed (Создать новую мнемоническую фразу):
Далее выбираем какой тип адресов будет поддерживать наш кошелек (я выбрал Standard), но вы можете договорится между собой о создании Segwit-кошелька.
*Примечание. Все стороны сделки обязательно должны выбрать одинаковый тип кошелька, будь то Standard или Segwit.
Далее кошелек выдаст вам сгенерированную мнемоническую фразу (seed) – фраза из 12-ти произвольных слов, необходимая для восстановления кошелька. Скопируйте ее и сохраните в безопасном месте. Google/Яндекс диски, DropBox, iCloud, черновики в электронной почте -- не являются безопасными местами. Если эта фраза попадет в чужие руки -- ваши BTC украдут. Если вы её потеряете -- потеряете BTC навсегда.
Хороший вариант, зашифровать мнемоническую фразу с помощью PGP. Вторую копию -- хранить на обыкновенной бумаге, третью -- поместить в зашифрованный контейнер, четвертую -- спрятать на “видном месте”, пятую -- можно даже здесь, все равно это будет лучшим вариантом чем облачные хранилища. Можно комбинировать все перечисленные варианты выше + добавить свои.
Помните, что безопасность ваших BTC зависит только от вас.
Далее кошелек попросит ввести мнемоническую фразу, чтобы убедиться что вы сохранили её. Введите свою мнемоническую фразу и нажмите “Дальше”.
Следующее что вы должны увидеть, это ваш master public key (xpub), которым нужно поделиться с гарантом сделки и продавцом. Все стороны сделки должны обменяться своими master public key (xpub) между собой.
Сохраните свой master public key (xpub) в текстовом редакторе и нажмите “Дальше”:
И последнее окно, где вам нужно выбрать способ добавления других подписантов (гаранта и продавца). В данном мануале я выберу Enter cosigner key (ввести ключ подписанта), то есть master public key (xpub):
Чтобы добавить подписанта №2 и №3, мне нужны их master publickey (xpub), поэтому гарант и продавец должны сделать все тоже самое, что написано выше, то есть, создать мультисиг кошелек “2-из-3” и отправить мне (покупателю) свои master publickey (xpub), последовательность добавления подписантов не имеет значения.
Вставляем в кошелек полученный master publickey (xpub) от гаранта:
Следующий шаг, master publickey (xpub) полученный от продавца:
После того как вы введете ключи подписантов master public key (xpub), кошелек попросит придумать пароль. Не пропускайте этот шаг, надежный пароль нужен, чтобы хранить средства в безопасности и осуществлять переводы.
“Зашифрованный файл кошелька” --- если вы забудете пароль от кошелька, то сможете восстановить кошелек по мнемонической фразе. Но если ваш компьютер (или файл кошелька) попадет в руки злоумышленника, без вашего пароля он не может украсть ваши BTC:
Чтобы не забывать пароли, пользуйтесь KeePassXС.
В данном мануале все кошельки создавались на одном компьютере, так что вот названия кошельков, их seed-ы и master public key (xpub), можете потренироваться и восстановить их у себя:
Название кошелька: buyer_wallet
seed: faculty rail juice copper size camp unusual speed danger mass crystal high
xpub: xpub661MyMwAqRbcGj32Tppb7WXTo27f4ZUbD6Mo8xkkaWcKEmTjmXCN2YhYBd6Yc6RmT4GTypSC3UW Wa7BhjygPED5UuHDiHBU37QFcmHSZNLd
Название кошелька: escrow_wallet
seed: minor regular avoid auto aisle window vintage intact deal stem coyote innocent
xpub: xpub661MyMwAqRbcGENw1uYVR8DNiZkvU3KJJVm8zuf7CXpCWBpMfHRGjJbneKTXwvsE3Gr6L6WW87f FWsPeQFqqGQpbZ43z9n6oPnUWWPAny6h
Название кошелька: seller_wallet
seed: goat diesel screen cluster doctor winter slush silly run diary express number
xpub: xpub661MyMwAqRbcFw6zcN2BNgpQn3hWb6oTBqeWQU7S9MTX7iNPHe95oKYxhBRtWoV94YfJrcjWRQH dgC777rr5TakKmdCJoVrHyzX3mWruRmm
Скрин созданных кошельков:
Индикатор в правом нижнем углу должен загореться зеленым. Это значит, что кошелек работает исправно и готов к работе. Обратите внимание, адрес для получения средств начинается с тройки, а не с единицы, это подтверждает что используется мультиподпись (хотя есть P2SH-P2WPKH segwit-адреса которые тоже начинаются с тройки). Также надеюсь что вы заметили заметили, что у всех сторон сделки один и тот же адрес, значит мультисиг кошелек был создан правильно.
Теперь покупателю нужно перевести необходимое количество BTC на мультисиг адрес, в данном случае используем адрес: 38BU9oXBXgmjmAu8pWSyehxbYkW22BDqtF
Помните, в данном мультисиг кошельке отправленные средства не могут быть возвращены без минимум двух подписей, из трех (“2-из-3”).
Покупатель отправляет BTC на мульсиг кошелек:
Когда продавец видит, что покупатель отправил BTC на мультисиг кошелек (желательно дождаться трех подтверждений в сети), тогда он должен исполнить свою часть сделки --- отправить покупателю товар/предоставить услугу. Когда сделка между покупателем и продавцом проходит успешно, гарант может вообще не участвовать в отправки BTC на личный адрес продавца.
Продавец может создать транзакцию (где указывает свой личный кошелек, куда должны быть отправлены BTC за предоставленный товар/услугу), подписывает транзакцию своим ключом и передает её покупателю, чтобы тот подписал своим ключом и транслировал в сеть.
Давайте рассмотрим ситуацию, когда после отправки BTC со стороны покупателя, продавец исчезает, и не выходит на связь
Так как все стороны сделки (покупатель, гарант и продавец) создали “один кошелек на троих”, но, чтобы потратить средства, нужно согласие большинства (в данном случае необходимо две подписи из трёх).
В таком случае, покупатель пишет гаранту сделки о проблеме (продавец не выходит на связь на протяжении нескольких дней), гарант пробует связаться с продавцом по указанным контактам, но ответа нет. Тогда покупатель создает транзакцию, в которой указывает свой личный адрес кошелька (куда должны вернуться BTC), подписывает транзакцию своим ключом, после чего передает подписанную транзакцию гаранту сделки в виде файла, QR-кода, текста или с помощью TXID.
При получении подписанной транзакции со стороны покупателя, гарант перепроверяет адрес, куда будут отправлены BTC, если покупатель подтверждает адрес для возврата средств, тогда гарант подписывает транзакцию своим ключом (получается “2-из-3”) и транслирует её в сеть. Таким образом BTC вернулись на личный кошелек покупателя.
Давайте посмотрим пару скринов, где покупатель хочет вернуть BTC (так как товар/услугу от продавца он не получил) на адрес, с которого они пришли
Покупатель создает транзакцию, где указывает свой личный кошелек и подписывает своим ключом:
Покупатель видит что успешно подписал транзакцию:
Теперь транзакцию нужно передать гаранту, чтобы и он её подписал, и транслировал в сеть.
1. Статус подписи;
2. “Копировать” -- копирует скрипт, который можно передать гаранту любым удобным способом. Проверить скрипт можно на сайте https://coinb.in, вкладка Verify:
Вот скрипт, кому интересно самому проверить:
010000000137f1921d1909ea4b60d473e5becde7c8c8014a52b4423a2dfec69b6424e7976d00000000fd52010001ff47304402207ee1ebb0069bd21080b67a1422a1dd854fc3feff204121dbdc94bd97186bfcbf02207744d6d166aaaa3827af9134fadf619ca8fbd802f324161dba3cc7a653d2bda10101ff4d0201524c53ff0488b21e000000000000000000a99db2f694f2786327827290aebe8165bb89c6e374f69757f86f1d388dfa743602d181eea96c9a70bbca7d05e592b85511491abeaaface65d2d46a1fb8f4b79aa7000000004c53ff0488b21e000000000000000000db3e12dbc85740d9bb9046858cb73be9557adcbda6e8f0a74d474f6eb93630e9020821d6550d44d5bf01ea3c3efff302f209f734c57fdc35ccc5dc1d86a9d8f87f000000004c53ff0488b21e0000000000000000008bb34a163ee3fbf426111eb26d21e57ae0b98f0a95907fcb9afd51d88b3e90340313964abd62c145ad99e1c2c83fb1edf70e696b032f699bce913aa52fce70ad000000000053aefdffffff011f8b0600000000001976a9145a2bb3c2dd6eb177bdec8f55cca26e286285ce7f88accde60700
3. Значок QR-кода -- передать транзакцию с помощью QR-кода.
4. “Экспортировать” --- вы можете экспортировать этот же скрипт, который вы видели выше, только сразу в текстовый файл, который готов для импортирования в кошелек Electrum и последующей подписи.
Припустим покупатель решил передать транзакцию с помощью текста. Смотрим скрины со стороны кошелька гаранта:
Инструменты → Загрузить транзакцию → Из текста:
В появившееся окно гарант вставляет полученный скрипт от покупателя, и нажимает на кнопку “Загрузить транзакцию”:
После чего видит такое же окно транзакции как и покупатель. Гарант сверяет адрес возврата, с адресом откуда изначально пришли BTC на мультисиг адрес, если все в порядке, подписывает транзакцию своим ключом и транслирует в сеть:
Финальный скрин мультивалютного кошелька со стороны покупателя, гаранта и продавца:
BTC были отправлены/возвращены на адрес с которого они пришли. Покупатель не получил товар/услугу со стороны продавца и вернул свои BTC. Продавец получил негативный отзыв.
Пользуйтесь мультиподписью, и берегите свои BTC.
Спасибо за внимание.
Если эта статья была вам полезна, поддержите написание следующей.
48asCffTPEMeqbxAf2XkP16qeuRTh7vxkQDhfXfbG5LgJ8YJeJEaUsrQ86dKyuyot2KfthhPuzFFRRq L7cFi2TCV1gBSLiF
1MRDrYQfE6Vy1rqrWL6aN3iVCKofvvNA3w
https://tippin.me/@thefuzzstone
gVtQVSN8EzaTBboDFRgGMRZrbDDRpGu4wnFdjGVgzmfVbnVKRMn3
0x0c30f1De9B30C9872d920200BB03aA3b67b7E300
Ldt5cQLtaZid6oiwjM7rT6Ne2X5LjKyjpr
0xbD55b072728865d37851bEfFD200EC3B5BBE91A7