Bitcoin Forum
August 05, 2015, 10:29:06 AM *
News: New! Latest stable version of Bitcoin Core: 0.11.0 [Torrent]
 
   Home   Help Search Donate Login Register  
Pages: [1]
  Print  
Author Topic: Несколько кошельков - один blk0001.dat  (Read 3364 times)
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 01:33:14 AM
 #1

Как сделать несколько кошельков с одной цепочкой блоков [единый blk0001.dat и blkindex.dat]?

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

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

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

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

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

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

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

Определяемся, где у нас будут храниться кошельки и файлы цепочки блоков [Примечание 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 - мой кошелек для цифровых эквивалентов пива Smiley

1438770546
Hero Member
*
Offline Offline

Posts: 1438770546

View Profile Personal Message (Offline)

Ignore
1438770546
Reply with quote  #2

1438770546
Report to moderator
Be very wary of relying on JavaScript for security on sites such as blockchain.info and brainwallet.org. The site can change the JavaScript at any time unless you take unusual precautions, and browsers are not generally known for their airtight security.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1438770546
Hero Member
*
Offline Offline

Posts: 1438770546

View Profile Personal Message (Offline)

Ignore
1438770546
Reply with quote  #2

1438770546
Report to moderator
1438770546
Hero Member
*
Offline Offline

Posts: 1438770546

View Profile Personal Message (Offline)

Ignore
1438770546
Reply with quote  #2

1438770546
Report to moderator
1438770546
Hero Member
*
Offline Offline

Posts: 1438770546

View Profile Personal Message (Offline)

Ignore
1438770546
Reply with quote  #2

1438770546
Report to moderator
1438770546
Hero Member
*
Offline Offline

Posts: 1438770546

View Profile Personal Message (Offline)

Ignore
1438770546
Reply with quote  #2

1438770546
Report to moderator
LZ
Moderator
Legendary
*
Offline Offline

Activity: 1316


Satoshi everywhere!


View Profile WWW

Ignore
March 15, 2012, 05:57:03 AM
 #2

Не хватает надписи: "все делаете на свой страх и риск, автор не несет никакой ответственности". Smiley

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

"Never invest unless you can afford to lose your entire investment."  ©  S3052
Feel free to contact me using Tox: 1EC1F6C383802827336F7CA03E0E6886356634457A4E70C3CE2807C6F4D46A79FD0B583EA33A
rPman
Legendary
*
Offline Offline

Activity: 1078


View Profile WWW

Ignore
March 15, 2012, 06:40:02 AM
 #3

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

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

Здесь не может находиться ваша реклама Smiley
Protect a future of bitcoin, use p2pool
Donation in BTC: 19fv5yYtfWZ9jQNjx2ncmu1TTrvg5CczZe
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 01:10:32 PM
 #4

Не хватает надписи: "все делаете на свой страх и риск, автор не несет никакой ответственности". Smiley

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

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

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

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

LZ
Moderator
Legendary
*
Offline Offline

Activity: 1316


Satoshi everywhere!


View Profile WWW

Ignore
March 15, 2012, 01:34:24 PM
 #5

Любопытно, надо протестировать. Полагаю, что только один из кошельков должен быть подключен к сети. Roll Eyes

"Never invest unless you can afford to lose your entire investment."  ©  S3052
Feel free to contact me using Tox: 1EC1F6C383802827336F7CA03E0E6886356634457A4E70C3CE2807C6F4D46A79FD0B583EA33A
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 01:48:26 PM
 #6

Любопытно, надо протестировать. Полагаю, что один из кошельков нужно изолировать от сети. Roll Eyes
Дисклеймер добавил, кстати Smiley
А зачем его изолировать от сети? Речь же не идет о одновременной работе кошельков. Последний запущенный кошелек обновляет общую базу.
С другой стороны, можно и изолировать - тогда только один кошелек из нескольких будет обновлять базу.
Если рассинхронизация, о которой говорил rPman, может быть - то только один синхронизирующийся с сетью кошелек решит проблему.
В любом случае, одновременно запущен может быть только один кошелек, иначе не получится.

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

LZ
Moderator
Legendary
*
Offline Offline

Activity: 1316


Satoshi everywhere!


View Profile WWW

Ignore
March 15, 2012, 01:51:49 PM
 #7

Тогда все встает на свои места. Я думал, что речь об одновременной работе. Smiley

"Never invest unless you can afford to lose your entire investment."  ©  S3052
Feel free to contact me using Tox: 1EC1F6C383802827336F7CA03E0E6886356634457A4E70C3CE2807C6F4D46A79FD0B583EA33A
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 01:55:41 PM
 #8

Одновременная работа - это сходу куча проблем.
А мне надоело ждать синхронизации нескольких кошельков, вот я и нашел решение, а потом решил поделиться. Smiley

rPman
Legendary
*
Offline Offline

Activity: 1078


View Profile WWW

Ignore
March 15, 2012, 03:36:30 PM
 #9

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

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

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

Здесь не может находиться ваша реклама Smiley
Protect a future of bitcoin, use p2pool
Donation in BTC: 19fv5yYtfWZ9jQNjx2ncmu1TTrvg5CczZe
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 07:01:23 PM
 #10

Разумеется, речь идет о последовательной работе.

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

LZ
Moderator
Legendary
*
Offline Offline

Activity: 1316


Satoshi everywhere!


View Profile WWW

Ignore
March 15, 2012, 08:20:01 PM
 #11

Директорию database тоже ведь следует линковать? По идее, это не обязательно, но мало ли что. Undecided

"Never invest unless you can afford to lose your entire investment."  ©  S3052
Feel free to contact me using Tox: 1EC1F6C383802827336F7CA03E0E6886356634457A4E70C3CE2807C6F4D46A79FD0B583EA33A
neo_rage
Full Member
***
Offline Offline

Activity: 196



View Profile

Ignore
March 15, 2012, 08:46:59 PM
 #12

Нет, зачем? Пусть будет раздельная. По-моему, там только логи. Я не линковал
 Smiley

Pages: [1]
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!