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 Нет, зачем? Пусть будет раздельная. По-моему, там только логи. Я не линковал
:) |