Bitcoin Forum

Local => Oбcyждeниe Bitcoin => Topic started by: neo_rage on March 15, 2012, 01:33:14 AM



Title: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 01:33:14 AM
Как сделать несколько кошельков с одной цепочкой блоков [единый blk0001.dat и blkindex.dat]?

Многие из вас наверняка пользуются несколькими кошельками, запуская Bitcoin-клиент с разными значениями параметра -datadir.
Например, один кошелек - для мелочи(или майнинга), другой - для крупных сумм :)
При этом каждый кошелек, будучи запущен, каждый раз синхронизируется с сетью, скачивая одну и ту же цепочку блоков, и сохраняя её в {DATADIR}/blk0001.dat и {DATADIR}/blkindex.dat.
И вам приходится ждать, несмотря на то, что вы только что запускали другой кошелек, и он уже синхронизировался с сетью.

Сразу возникает идея - заставить программу использовать разные кошельки[wallet.dat и все прилегающее к ним] с одной-единственной копией цепочки блоков.
Сразу уточню: речь идет не о одновременной работе нескольких кошельков, а о экономии времени на синхронизацию цепочки блоков при последовательном запуске нескольких кошельков.

Официальный клиент Bitcoin, к сожалению, не предоставляет такую возможность.

Однако, счастливые пользователи Linux или Windows Vista/Windows 7/Windows 2000/Windows XP смогут обойти это ограничение.
Как - описано ниже.

ПРЕДУПРЕЖДЕНИЕ: Все, описанное в данной статье, вы делаете на свой страх и риск! Претензии по возможным проблемам не принимаются!

Ну вот, отмазался, можно продолжать :)

Рассмотрим вариант с двумя кошельками, использующими единую цепочку блоков.

Определяемся, где у нас будут храниться кошельки и файлы цепочки блоков [Примечание 1: внимание пользователям Windows 2000/Windows XP! Папки с кошельками и с цепочкой блоков должны находиться в пределах одного раздела(т.е., например, на диске C:)].

Допустим, лежать и кошельки, и цепочка блоков у нас будут по адресу C:\bitcoin_data\  [для unix, соответственно, /home/bitcoin_data/ ]
В этой папке мы создадим три подпапки:
Wallet1 (первый кошелек)
Wallet2 (второй кошелек)
blockchain (цепочка блоков).

В папку "blockchain" у нас будет грузиться наша цепочка блоков.
В ней мы дополнительно создадим три пустых файла:
blk0001.dat    [это цепочка блоков]
blkindex.dat    [это индекс блоков, для быстрого поиска]
.lock      [по этому файлу программа определяет, что файлы блоков сейчас заняты другим экземпляром кошелька. Именно этот файл мешает вам запустить две копии кошелька, а в нашем случае - запустить два разных кошелька на одной цепочке блоков.]

А дальше мы просто создаём symlink'и! [для Windows 2000/Windows XP это будут hardlink, но разницы почти никакой, см. Примечание 1]

На Windows 7/Windows Vista symlink создается командой mklink (описание команды http://www.windows7home.net/how-to-create-symbolic-link-in-windows-7/)   из cmd, который надо запустить от администратора [пуск - в поисковое поле вводим "cmd", видим вверху "cmd.exe", щелкаем правой клавишей мыши по нему, выбираем "Запустить от имени администратора".]

На Windows 2000/Windows XP symlink создать нельзя, поэтому мы будем создавать hardlink [смотрите Примечание 1] (описание команды http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fsutil_hardlink.mspx).

На linux symlink создается командой ln (описание команды http://rus-linux.net/MyLDP/consol/hdrguide/rusman/ln.htm) из консоли.

Примерно так(для Windows 7/Windows Vista):
Первый кошелек.
mklink C:\bitcoin_data\Wallet1\blk0001.dat   C:\bitcoin_data\blockchain\blk0001.dat
mklink C:\bitcoin_data\Wallet1\blkindex.dat   C:\bitcoin_data\blockchain\blkindex.dat
mklink C:\bitcoin_data\Wallet1\.lock   C:\bitcoin_data\blockchain\.lock
Второй кошелек.
mklink C:\bitcoin_data\Wallet2\blk0001.dat   C:\bitcoin_data\blockchain\blk0001.dat
mklink C:\bitcoin_data\Wallet2\blkindex.dat   C:\bitcoin_data\blockchain\blkindex.dat
mklink C:\bitcoin_data\Wallet2\.lock   C:\bitcoin_data\blockchain\.lock

Примерно так(для Windows 2000/Windows XP)[см. Примечание 1]:
Первый кошелек.
fsutil hardlink create C:\bitcoin_data\Wallet1\blk0001.dat C:\bitcoin_data\blockchain\blk0001.dat
fsutil hardlink create C:\bitcoin_data\Wallet1\blkindex.dat C:\bitcoin_data\blockchain\blkindex.dat
fsutil hardlink create C:\bitcoin_data\Wallet1\.lock C:\bitcoin_data\blockchain\.lock
Второй кошелек.
fsutil hardlink create C:\bitcoin_data\Wallet2\blk0001.dat C:\bitcoin_data\blockchain\blk0001.dat
fsutil hardlink create C:\bitcoin_data\Wallet2\blkindex.dat C:\bitcoin_data\blockchain\blkindex.dat
fsutil hardlink create C:\bitcoin_data\Wallet2\.lock C:\bitcoin_data\blockchain\.lock

Примерно так(для Linux):
Первый кошелек.
ln /home/bitcoin_data/blockchain/blk0001.dat /home/bitcoin_data/Wallet1/blk0001.dat
ln /home/bitcoin_data/blockchain/blkindex.dat /home/bitcoin_data/Wallet1/blkindex.dat
ln /home/bitcoin_data/blockchain/.lock /home/bitcoin_data/Wallet1/.lock
Второй кошелек.
ln /home/bitcoin_data/blockchain/blk0001.dat /home/bitcoin_data/Wallet2/blk0001.dat
ln /home/bitcoin_data/blockchain/blkindex.dat /home/bitcoin_data/Wallet2/blkindex.dat
ln /home/bitcoin_data/blockchain/.lock /home/bitcoin_data/Wallet2/.lock
[Внимание: в Windows был иной порядок параметров]

Пути можно менять, учитывая ограничения для Windows 2000/Windows XP, указанное в Примечании 1.

Вызывать кошельки будете, указывая параметр -datadir.
Например, для Windows это:
bitcoin-qt.exe -datadir=C:\bitcoin_data\Wallet1\     [первый кошелек]
bitcoin-qt.exe -datadir=C:\bitcoin_data\Wallet2\     [второй кошелек]

Вот и все!

Если вам понравилась эта статья: 1GtXRBvh8egB6H8iWJUgaZwnDdhdAx6hfU - мой кошелек для цифровых эквивалентов пива :)


Title: Re: Несколько кошельков - один blk0001.dat
Post by: LZ on March 15, 2012, 05:57:03 AM
Не хватает надписи: "все делаете на свой страх и риск, автор не несет никакой ответственности". :)

Я так вот делать не буду. Нет уверенности, что одновременная запись приведет к чему-то хорошему.


Title: Re: Несколько кошельков - один blk0001.dat
Post by: rPman on March 15, 2012, 06:40:02 AM
Если это чудо работает, то не 'по причине' а 'вопреки', дело в том что подобное возможно тупо из-за идеологического бага windows/linux (или правильнее говорить posix), дело в том что информация о блокировке файла не переносится на hardlinks (softlinks в windows могут быть только директории), а значит вопреки запретам разума и логики базы данных, два или более клиентов bitcoin в вашем случае пишут в один и тот же файл базы данных (что естественно не предполагает драйвер berkley). Причина что у вас это еще работает - то что клиенты находятся на одном компьютере и значит скорее всего получают одну и ту же информацию из mesh сети синхронно, соответственно и пишут так же одну и ту же информацию, вот конфликта и не возникает.

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


Title: Re: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 01:10:32 PM
Не хватает надписи: "все делаете на свой страх и риск, автор не несет никакой ответственности". :)

Я так вот делать не буду. Нет уверенности, что одновременная запись приведет к чему-то хорошему.
А где вы тут увидели одновременную запись? Там отдельно написано про файл-маркер блокировки.

Если это чудо работает, то не 'по причине' а 'вопреки', дело в том что подобное возможно тупо из-за идеологического бага windows/linux (или правильнее говорить posix), дело в том что информация о блокировке файла не переносится на hardlinks (softlinks в windows могут быть только директории)
Никаких проблем не возникает. Уточню: информация о блокировке файла отлично переносится, т.е. softlink - это просто ссылка на файл. Она прозрачна для исполняемых программ.
А если сам файл открыт для приоритетного доступа - значит, он заблокирован, писать в него в любом случае не получится.
Помимо этого, сам клиент открывает файлы блоков для приоритетной записи, так что каши не будет. Я проверял.
Я проверял даже без блокировочного файла - возникает ошибка исполнения, т.к. файл блоков уже открыт предыдущим экземпляром программы для приоритетного доступа. Файлы блоков при этом изменениям не подвергаются - я проверял их контрольные суммы.
Однако, для большей надежности, я делаю софтлинк и на на блокировочный файл тоже.

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

Причина что у вас это еще работает - то что клиенты находятся на одном компьютере и значит скорее всего получают одну и ту же информацию из mesh сети синхронно, соответственно и пишут так же одну и ту же информацию, вот конфликта и не возникает.
Откуда тут будет конфликт, если цепочка блоков в любом случае идентична для всех и скачивается из сети?


Title: Re: Несколько кошельков - один blk0001.dat
Post by: LZ on March 15, 2012, 01:34:24 PM
Любопытно, надо протестировать. Полагаю, что только один из кошельков должен быть подключен к сети. ::)


Title: Re: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 01:48:26 PM
Любопытно, надо протестировать. Полагаю, что один из кошельков нужно изолировать от сети. ::)
Дисклеймер добавил, кстати :)
А зачем его изолировать от сети? Речь же не идет о одновременной работе кошельков. Последний запущенный кошелек обновляет общую базу.
С другой стороны, можно и изолировать - тогда только один кошелек из нескольких будет обновлять базу.
Если рассинхронизация, о которой говорил rPman, может быть - то только один синхронизирующийся с сетью кошелек решит проблему.
В любом случае, одновременно запущен может быть только один кошелек, иначе не получится.

Кстати, я уже около 2 недель пользуюсь описанной мной схемой, и пока не столкнулся с проблемами. :)


Title: Re: Несколько кошельков - один blk0001.dat
Post by: LZ on March 15, 2012, 01:51:49 PM
Тогда все встает на свои места. Я думал, что речь об одновременной работе. :)


Title: Re: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 01:55:41 PM
Одновременная работа - это сходу куча проблем.
А мне надоело ждать синхронизации нескольких кошельков, вот я и нашел решение, а потом решил поделиться. :)


Title: Re: Несколько кошельков - один blk0001.dat
Post by: rPman on March 15, 2012, 03:36:30 PM
Если речь идет о последовательной работе с кошельками, то самое простое - тупо перезапуск клиента с подменой wallet.dat, это даже можно автоматизировать элементарным скриптом при появлении новых блоков.

p.s. нужно идеи из клиента Electrum (информация о блоках загружается по специальному протоколу с сервера, хоть публичного хоть своего) внедрить в официальный клиент..

К сожалению клиент Electrum не позволяет использовать RPC и майнить.


Title: Re: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 07:01:23 PM
Разумеется, речь идет о последовательной работе.

Подменять wallet.dat я считаю неправильным. Я вообще считаю неправильным производить частые операции с файлом кошелька - это переносит его в группу риска.


Title: Re: Несколько кошельков - один blk0001.dat
Post by: LZ on March 15, 2012, 08:20:01 PM
Директорию database тоже ведь следует линковать? По идее, это не обязательно, но мало ли что. :-\


Title: Re: Несколько кошельков - один blk0001.dat
Post by: neo_rage on March 15, 2012, 08:46:59 PM
Нет, зачем? Пусть будет раздельная. По-моему, там только логи. Я не линковал
 :)