Bitcoin Forum
April 17, 2021, 09:27:35 PM *
News: Latest Bitcoin Core release: 0.21.0 [Torrent]
 
  Home Help Search Login Register More  
  Show Posts
Pages: [1]
1  Local / Новички / Как хранить seed в блокчейне биткоина (гайд) on: January 21, 2020, 09:03:47 PM
В этом посте по пожеланию одного из пользователей форума я напишу инструкцию, как можно хранить резервную копию сид-фразы в блокчейне биткоина. Это не перевод и не пересказ (такая тема мне не встречалась), а только моя версия, как это можно сделать, поэтому конструктивная критика приветствуется. Ничего интересного и нового здесь не будет, просто собраны описания нескольких известных приемов для решения данной задачи. Дисклеймер: так как я не могу гарантировать 100% безопасность и работоспособность этого метода в будущем, я не могу советовать вам его использовать. Короче говоря, если что - я не виноват ). Сам я этот способ буду использовать как резервный и со страховкой. Страховкой служит надежная парольная фраза к сиду (известная как passphrase или 13-е (25-е) слово), которая, естественно, хранится отдельно в офлайне (и в голове). С хорошей парольной фразой даже при компрометации 12 (24) слов, взломать весь сид практически нереально.




Сид-фразу мы поместим в блокчейн транзакцией с опкодом OP_RETURN, который позволяет отправить до 80 байт произвольной информации.

1. Шифруем сид и получаем 16-ричную строку.

Так как работаем с сидом, нужно обезопаситься и использовать "холодный" компьютер. Допустим, что у меня такого нет, поэтому я физически отключил интернет и загрузился с флешки Tails (это такая анонимная и безопасная операционная система (linux) на флешке, если кто не знает).

Создаем текстовый файл seed.txt с сид-фразой (возьмем такую - runway exist coconut cinnamon attack laptop oil wild yellow drink lawn cattle), чтобы сократить строку, оставляю по 4 первые буквы каждого слова (этого достаточно для однозначной идентификации) и убираю пробелы (получилось runwexiscococinnattalaptoil_wildyelldrinlawncatt), сохраняем файл. Из этой папки запускаем терминал и даем команду:
Code:
openssl enc -aes-256-cbc -in seed.txt -out enc.txt -nosalt -k bitcointalk -iter 21000000
Тут я поставил плохой пароль bitcointalk для примера, в реальности нужно выбрать хороший пароль, длинный (символов 12 хотя бы), уникальный, но желательно легко запоминающийся. 21000000 - это число итераций функции pbkdf2, такое огромное поставил, потому что я его легко вспомню, а главное - это сильно замедляет кодирование/декодирование (мой старенький комп почти 2 минуты шифровал/расшифровывал), что делает нереальным брутфорс и позволяет использовать не очень сложный пароль. Так, получили файл с шифрованным сидом, теперь нужно получить последовательность байтов (дамп). Даем команду:
Code:
xxd -ps -c 1000 enc.txt enc_hex.txt
-c 1000 здесь - число колонок, поставил от фонаря побольше (можно было 80 поставить), без этого ключа будет разбивать по 32 байта на строку, а нам нужно одной строкой. Сохраняем файл enc_hex.txt на флешку или жесткий диск компа, выключаем, вынимаем флешку, включаем интернет и загружаем обычную систему.

2. Нам нужно озаботиться тем, чтобы транзакцию с шифровкой потом нетрудно было найти. Можно, наверное, придумать разные варианты, можно ее просто записать, но я стремился ничего не записывать и поэтому выбрал вариант с созданием адреса из хеша любимого слова/фразы и последующим поиском адреса в блок-эксплорере. Для этого я использовал этот brainwallet (можно любой другой), там в поле "Brain Wallet Input" вводим незабываемое слово-ключ, например имя любимой тещи, собаки итп, здесь секьюрность не важна, если украдут этот ключ, то и на здоровье. Для примера я ввел слово bitcointalk, получаем приватник L1AHAuRLxZ14PspT4UjooZa3Jx2Y9hcKfuQpC19b4AqHq8V12u9o, импортируем его в Electrum (созданием нового кошелька из приватника, я предпочитаю bech32-адрес, поэтому импортирую с соответствующим префиксом p2wpkh:L1AHAuRLxZ14PspT4UjooZa3Jx2Y9hcKfuQpC19b4AqHq8V12u9o, в принципе, можно и легаси - особой разницы нет). Получили адрес bc1qc0kwr8clxgj63dp77sr4ql9zhexq2a6aw85ltw, перевели на него 300 сатоши (для сегвит-адреса и записи одного сида этого хватит, даже с запасом) ). С этого адреса сейчас будем отправлять транзакцию с OP_RETURN. Можно было и сразу это сделать, но я разбил на две транзакции для наглядности.

3. Копируем шестнадцатеричную строку из сохраненного в 1-м пунуте файла enc_hex.txt и в Electrum формируем транзакцию, поле "Pay to" заполняем так:
Code:
OP_RETURN наша_строка, 0
(запятую с нулем в конце не забываем).



Отправляем. Вот моя транзакция: https://www.blockchain.com/ru/btc/tx/0e0546d004f3373822178ceddb3084247912e400b75e5971e66522f6b398f123



Теперь - как восстановить исходный сид?

4. Вспоминаем ключевое слово (bitсointalk в моем примере) и получаем адрес (как во 2-м пункте). Адрес вставляем в блок-эксплорер и легко находим нашу транзакцию. Жмем на нее, открываются детали, и внизу страницы видим наш зашифрованный сид 3222e79b5c94efcea7b8e1704e1bdd8fb9257baf7bbecf1a9bb5b5a5b8da094ad570dddc7754220 c2e2359081956d238ba24429639c90b2348f15f052617aab8. Сохраняемем эту строчку в текстовый файл (у меня enc_hex.txt) и переносим его на флешку.

5. Выключаем интернет, перезагружаемся в Tails. Там копируем с флешки файл с шифровкой, запускаем из папки с файлом терминал и даем команду:
Code:
xxd -ps -r enc_hex.txt enc.txt
Затем такую:
Code:
openssl enc -aes-256-cbc -d -in enc.txt -out seed.txt -nosalt -k bitcointalk -iter 21000000

(значение параметра -iter обязательно должно совпадать с тем, которое использовали при шифровании, поэтому важно его не забыть, лучше записать где-нибудь).
Всё, открываем файл seed.txt и переписываем на бумажку сид-фразу (разделяя слова по четыре буквы). Если кошелек при вводе слов сида не предлагает возможные варианты, то полное написание слов находим в BIP39-словаре (спасибо bomj за поправку).


И последнее. Если вам необходимо сохранить сид-фразу из 24-слов, то они так просто не влезут в 80 байт. В этом случае шестнадцатеричную строку шифровки следует разбить на две части и создать два выхода OP_RETURN. Либо взять не мнемонику сид-фразы, а энтропию в iancoleman-конвертере, тогда получится ровно 80 байт.



p.s. Если кто-то хочет повторить, потренируйтесь сначала в тестнете, старайтесь не захламлять блокчейн бесполезным мусором.
2  Local / Кодеры / Как подписать P2SH-транзакцию в Bitcoin Core? on: October 10, 2019, 09:53:19 AM
Привет. Хочу научиться создавать P2SH-транзкции. Сделал скрипт, адрес, закинул сатошики, пытаюсь потратить, но не могу подписать транзакцию в Bitcoin Core 0.18.1 (тестнет). Даю такую команду:
Code:
signrawtransactionwithkey "0200000001a4c7dcc2418799bcff07e78b30175369c52532b4590c5d77e7029b9d200545b60000000000fdffffff01bc020000000000001976a91406e5e10f03efd4b218285699b902a42d8250d95288ac321f1800" '["cV6sEWYvtFz7EW8TJMf5Bf25c6LXVXCdFwtPQfDaUADYnexxWGML"]' '[{"txid":"b64505209d9b02e7775d0c59b43225c5695317308be707ffbc998741c2dcc7a4","vout":0,"scriptPubKey":"a9146f9b998ef68634213b3071519788a90c722aa28387", "redeemScript":"03321f18b175210231310bfe71d36cb204a22c4db0e736de7efd091cec2db3f2c49d90661232f182ac","amount":0.000007}]'
Выдает результат (не понимаю, кстати, зачем там в "hex" 2a появилось перед redeem скриптом):
Code:
{
  "hex": "0200000001a4c7dcc2418799bcff07e78b30175369c52532b4590c5d77e7029b9d200545b6000000002a2903321f18b175210231310bfe71d36cb204a22c4db0e736de7efd091cec2db3f2c49d90661232f182acfdffffff01bc020000000000001976a91406e5e10f03efd4b218285699b902a42d8250d95288ac321f1800",
  "complete": false,
  "errors": [
    {
      "txid": "b64505209d9b02e7775d0c59b43225c5695317308be707ffbc998741c2dcc7a4",
      "vout": 0,
      "witness": [
      ],
      "scriptSig": "2903321f18b175210231310bfe71d36cb204a22c4db0e736de7efd091cec2db3f2c49d90661232f182ac",
      "sequence": 4294967293,
      "error": "Unable to sign input, invalid stack size (possibly missing key)"
    }
  ]
}

Закинул транзакцию в coinb.in:
Code:
0200000001a4c7dcc2418799bcff07e78b30175369c52532b4590c5d77e7029b9d200545b6000000002903321f18b175210231310bfe71d36cb204a22c4db0e736de7efd091cec2db3f2c49d90661232f182acfdffffff01bc020000000000001976a91406e5e10f03efd4b218285699b902a42d8250d95288ac321f1800
Подписалось и отправилось без проблем, значит, получается, нигде не накосячил.

Вопрос, что я сделал не так? Или это кор не хочет кастомные скрипты принимать? Какими инструментами тогда лучше пользоваться для создания таких транзакций (желательно попроще, я не программист)?
3  Local / Кодеры / Синхронизация цепочки транзакций on: September 28, 2019, 10:21:54 AM
Теоретический вопросик.

Допустим, нужно передать битки с адреса А на адрес С через адрес В, то есть A -> B -> C, но приватник адреса В известен не только мне, но и всему миру.

Если я на локальной ноде отключусь от сети, выполню эти две транзакции (A-B и B-C без RBF) и подключусь снова, будет ли теоретическая возможность у кого-то перехватить монеты на адресе В? Просто я не понимаю, как будет происходить синхронизация этих транзакций, по отдельности или цепочки в целом?

И по RBF, я правильно понимаю, что без этого флага двойная трата сейчас практически невозможна?
4  Local / Новички / Двойная трата (Double spending) в Electrum on: April 01, 2019, 04:54:45 PM
Всем привет!

Решил поделиться с сообществом техникой выполнения двойной траты (double spend) при помощи Electrum, которой сам неоднократно пользовался, и которую считаю самой удобной и простой (из трёх мне известных). Когда-то увидел статью на стимит, тут будет ее пересказ с небольшими моими изменениями. Надеюсь, кому-то это будет интересно ).

Нам потребуется замечательная программа биткоин-клиент Electrum и какой-нибудь редактор json-файлов типа JSONedit или https://jsoneditoronline.org/ (я буду использовать второй, так как он работает на любых платформах).
Нужно сразу уточнить, что у меня всегда получалась двойная трата транзакций с RBF-флагом, сейчас во многих клиентах он стоит по умолчанию. Но если ваша транзакция без RBF-флага, то даблспенд работать скорее всего не будет (впрочем не уверен, возможно с большой комиссией и такая пройдет, надо проверять).

Если вы пользовались другим биткоин-клиентом, то просто импортируйте необходимые приватные ключи в Electrum.
 
Также обязательным условием является отключенное шифрование файла кошелька, если у вас этот файл зашифрован, то эту опцию необходимо отключить в меню "Кошелек - Пароль" (пароль оставить, снять галочку с "Зашифрованный файл кошелька").

Итак, приступим ).

Исходные данные - у нас в Electrum есть неподтвержденная транзакция, которую нам нужно изменить. Если бы нам нужно было просто увеличить комиссию для прохождения зависшей транзакции, мы бы просто нажали правую кнопку мыши на транзакции во вкладке истории и выбрали пункт "Увеличить комиссию". Здесь мы будем решать более сложную задачу - изменим получателя средств.


1. Первое, что нам нужно сделать, это обмануть Electrum. Необходимо, чтобы он на время "забыл" о существовании неподтвержденной транзакции. Для этого из файла кошелька удаляем все упоминания о ней.

1.1 Делаем копию файла кошелька (на случай, если где-то ошибемся)


1.2 Открываем в браузере редактор https://jsoneditoronline.org/ .

1.3 Отключаем связь клиента с интернетом. Это можно сделать разными способами - изменить настройки Electrum, средствами операционной системы или физическим отключением - не важно, главное, чтобы в правом нижнем углу загорелся красный кружок.

1.4 Двойной щелчок мыши в окне истории по транзакции открывает окно, из верхнего поля которого копипастим куда-нибудь в блокнот идентификатор транзакции и строчку из поля "Ввод". Также смотрим и запоминаем/записываем, с какой комиссией была отправлена транзакция.


1.5 Закрываем Electrum (!)

1.6 В json-редакторе открываем файл кошелька, в поле поиска вставляем идентификатор транзакции и удаляем все ветки, где он упоминается (обычно это 7 мест). Здесь важно не удалить ничего лишнего и в то же время ничего не оставить.


1.7 Сохраняем файл вместо старого. Обратите внимание, редакторы часто любят добавлять расширение, в данном случае json, Electrum расширение по умолчанию не использует, хотя и не запрещает. Просто если будет, например default_wallet и default_wallet.json, то это будет два разных кошелька.



2. Открываем Electrum. Если все было сделано правильно, то кошелек откроется без ошибок, и мы обнаружим, что из истории транзакций та неподтвержденная транзакция исчезла.


2.1 Готовим новую транзакцию обычным способом - вставляем адрес получателя, сумму перевода и комиссию (важно - уплачиваемая комиссия должна быть выше той, которую мы запоминали в п.1.4. Нажимаем кнопку "Предпросмотр". Здесь нужно все проверить и убедиться, что в поле "Ввод" присутствует та строчка, которую мы сохранили в п.1.4. Если ее там нет, то двойной траты не получится, поэтому нужно принять меры, чтобы она там появилась (вкратце - для этого из вкладки "Монеты" нужно потратить этот вход принудительно, подробнее потом добавлю, если кому-то это понадобится).


2.2. Нажимаем кнопку "Подписать" и вводим там пароль или жмем кнопку аппаратного кошелька, в общем, как обычно ). После нажимаем "Экспортировать" и сохраняем файл с подписанной транзакцией куда-нибудь. В принципе, можно и не сохранять, а просто нажать на "Копировать", но так надежнее.

2.3 Только теперь подключаем Electrum к интернету. Когда все засинхронизирутся, обнаруживаем, что старая транзакция восстановилась. Не пугаемся, так и должно быть. Нажимаем в меню "Инструменты - Загрузить транзакцию - Из файла (если просто копировали, то "из текста")" и выбираем сохраненный в предыдущем пункте файл (если копировали в буфер, то вставляем).


2.4 Нажимаем кнопку "Разослать" и всё, дело сделано ).


Может показаться, что это сложно, но на самом деле вся процедура занимает меньше 5 минут. Рекомендую сначала потренироваться на кошках в тестнете.


 
Pages: [1]
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!