Обновление/конвертация основного кошелька биткойн между платформами

После 2 лет простоя я пытаюсь восстановить полную биткойн-ноду, одновременно меняя платформы и обновляясь до текущей версии. Все работает, кроме кошелька. Наличие кошелька приводит к сбою нового узла (segfault). Узел работает, когда отсутствует wallet.dat или указан параметр -disablewallet. Мне на самом деле не нужно, чтобы этот кошелек был полностью импортирован, просто чтобы получить связанный с ним биткойн на адрес, контролируемый новым узлом.

Я прочитал этот отчет о проблеме , в котором обвиняется версия файлов библиотеки berkley db. Я скомпилировал биткойн-ядро локально со старыми библиотеками BDB, предоставленными в соответствии bitcoin/contrib/install_db4.shс этим отчетом о проблеме, и получил тот же результат. Дело в том, что поскольку (на самом деле) платформа Windows не обеспечивает реализацию BDB, я понятия не имею, какие заголовки правильны для файла кошелька, сгенерированного ядром биткойнов Windows.

Я хочу избежать удаления и повторной загрузки всего блокчейна. Однажды я запустил, -disablewallet -assumevalid=0чтобы проверить всю цепочку блоков. Я сохраняю резервные копии всех файлов до обновления, если это помогает.

GDB отследить pastebin . Обратите внимание, что этот запуск был только подмножеством параметров cli, с которыми я обычно запускаю, в частности, отсутствует информация о rpc.

Старая установка:

  • Windows 7 про x64 SP1
  • Графический интерфейс биткойн-ядра (qt) 0.16.0
  • последняя синхронизация в начале декабря 2018 г.
  • Версия BDB неизвестна
  • datadir сидел на медленном внешнем жестком диске (ntfs)

Новый узел:

  • Debian Buster стабильная версия
  • Демон ядра биткойна 0.21, скомпилированный локально
  • синхронизация сейчас, в настоящее время в конце марта 2019 г.
  • BDB 4.8.30.NC, скомпилированный с помощью включенного сценария и обнаруженный с помощью configure
  • datadir на медленном внутреннем жестком диске sata (ext4)

Есть ли способ импортировать старый/другой формат файла wallet.dat в новый узел? Возможно, есть способ извлечь информацию о секретном ключе из указанного старого файла, чтобы ее можно было импортировать вручную? Могло ли программное обеспечение старого узла создать и отправить транзакцию со всем содержимым старого кошелька на новый адрес без предварительной полной синхронизации ? Возможно ли, чтобы старая версия ядра биткойна могла полностью синхронизироваться с современной цепочкой блоков?

e: забыл упомянуть: файл журнала ошибок db /mnt/data/blockchains/btc/blockchain/db.logпуст и сохраняет дату последнего изменения с момента первого запуска исходного узла в середине 2017 года.

e2: после перевода кошелька в базу данных версии 4.8, как предложил @PieterWuille, узел переиндексировал и напечатал несколько строк, например

2021-02-18T23:58:08Z [default wallet] Submitting wtx f7b5 to mempool for relay

но после нескольких дней работы он индексировался до высоты блока чуть менее 500000, а затем снова segfault.

Что часто работает (но убедитесь, что у вас есть резервная копия wallet.dat) в таких случаях, это запуск «db<ver>_dump old_wallet.dat | db<ver>_load new_wallet.dat», где вы заменяете <ver> соответствующим номер версии (например, db5.3_dump, db4.8_load). Это создаст файл new_wallet.dat, совместимый с любой выбранной вами версией.
Был ли старый двоичный файл Bitcoin-Qt скомпилирован самостоятельно или был релизным двоичным файлом? Двоичные файлы выпуска всегда используют BDB 4.8.
Судя по трассировке стека, это вообще не похоже на BDB. Можете ли вы попробовать начать с аргумента командной строки -upgradewallet? (конечно, сначала сделайте резервную копию wallet.dat).
@PieterWuille, старая установка была сборкой релиза (уверен на 80%). Я попробую обновить кошелек в следующий раз, когда моя текущая попытка импортировать кошелек через биткойн-кли завершится, если это не сработает. Имеет ли значение, что старый файл wallet.dat защищен паролем? В какой момент я должен ввести парольную фразу (и как)?
Вам нужна только фраза-пароль для подписи транзакций (т.е. отправки монет). Вам нужно будет предоставить его с помощью walletpassphraseRPC (или, если вы используете графический интерфейс, он просто спросит вас, когда это необходимо).
@PieterWuille это то, о чем я думал, хотя я надеялся, что именно это пошло не так с моей попыткой импорта. bitcoind говорит, что опция -upgradewallet недействительна, и я не вижу ничего похожего в файле man, который поставляется с исходным кодом. У меня чертовски много времени на поиск двоичных файлов db4.8-utils для debian. Хотя я не совсем уверен, что проблема в версии кошелька, поскольку теоретически и старая, и новая версии 4.8.
Дополнительно: я только что сделал дамп | загрузить вещь и перезапустить узел. Похоже, узел переиндексирует, начиная с блока 1. Так что это может быть хорошим знаком.

Ответы (1)

Я наконец получил это. Вот краткое резюме для будущего искателя:

  1. использовать старое программное обеспечение для запуска узла со старым файлом wallet.db
  2. запустите команду дампа кошелька. Это создает файл в текстовом формате, более переносимом, чем bdb.
  3. запустите команду загрузки кошелька на новом узле.
  4. повторно сканировать новый узел (сканирование по умолчанию не заглядывает очень далеко назад)

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