Bitcoin Forum
May 09, 2024, 11:10:34 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Несколько кошельков - один blk0001.dat  (Read 5934 times)
neo_rage (OP)
Full Member
***
Offline Offline

Activity: 196
Merit: 100



View Profile
March 15, 2012, 01:33:14 AM
Last edit: March 15, 2012, 01:46:55 PM by neo_rage
 #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

Unlike traditional banking where clients have only a few account numbers, with Bitcoin people can create an unlimited number of accounts (addresses). This can be used to easily track payments, and it improves anonymity.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1715253034
Hero Member
*
Offline Offline

Posts: 1715253034

View Profile Personal Message (Offline)

Ignore
1715253034
Reply with quote  #2

1715253034
Report to moderator
LZ
Legendary
*
Offline Offline

Activity: 1722
Merit: 1072


P2P Cryptocurrency


View Profile
March 15, 2012, 05:57:03 AM
Last edit: March 15, 2012, 06:27:52 AM by lzsaver
 #2

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

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

My OpenPGP fingerprint: 5099EB8C0F2E68C63B4ECBB9A9D0993E04143362
rPman
Legendary
*
Offline Offline

Activity: 1120
Merit: 1069


View Profile WWW
March 15, 2012, 06:40:02 AM
Merited by xandry (2)
 #3

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

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

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

Activity: 196
Merit: 100



View Profile
March 15, 2012, 01:10:32 PM
Last edit: March 15, 2012, 01:44:30 PM by neo_rage
 #4

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

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

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

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

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

LZ
Legendary
*
Offline Offline

Activity: 1722
Merit: 1072


P2P Cryptocurrency


View Profile
March 15, 2012, 01:34:24 PM
Last edit: March 15, 2012, 01:47:24 PM by lzsaver
 #5

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

My OpenPGP fingerprint: 5099EB8C0F2E68C63B4ECBB9A9D0993E04143362
neo_rage (OP)
Full Member
***
Offline Offline

Activity: 196
Merit: 100



View Profile
March 15, 2012, 01:48:26 PM
 #6

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

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

LZ
Legendary
*
Offline Offline

Activity: 1722
Merit: 1072


P2P Cryptocurrency


View Profile
March 15, 2012, 01:51:49 PM
 #7

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

My OpenPGP fingerprint: 5099EB8C0F2E68C63B4ECBB9A9D0993E04143362
neo_rage (OP)
Full Member
***
Offline Offline

Activity: 196
Merit: 100



View Profile
March 15, 2012, 01:55:41 PM
 #8

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

rPman
Legendary
*
Offline Offline

Activity: 1120
Merit: 1069


View Profile WWW
March 15, 2012, 03:36:30 PM
Merited by xandry (2)
 #9

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

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

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

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

Activity: 196
Merit: 100



View Profile
March 15, 2012, 07:01:23 PM
 #10

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

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

LZ
Legendary
*
Offline Offline

Activity: 1722
Merit: 1072


P2P Cryptocurrency


View Profile
March 15, 2012, 08:20:01 PM
 #11

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

My OpenPGP fingerprint: 5099EB8C0F2E68C63B4ECBB9A9D0993E04143362
neo_rage (OP)
Full Member
***
Offline Offline

Activity: 196
Merit: 100



View Profile
March 15, 2012, 08:46:59 PM
 #12

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

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!