Bitcoin Forum
May 08, 2024, 02:18:20 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

1715134700
Hero Member
*
Offline Offline

Posts: 1715134700

View Profile Personal Message (Offline)

Ignore
1715134700
Reply with quote  #2

1715134700
Report to moderator
"Your bitcoin is secured in a way that is physically impossible for others to access, no matter for what reason, no matter how good the excuse, no matter a majority of miners, no matter what." -- Greg Maxwell
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
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!