Можете ли вы предоставить более подробную информацию здесь? Были ли вы бежите двоичные файлы релиз? Какая версия? Какая операционная система? Как вы убить процесс? Какое состояние было это, когда вы принесли его обратно? Какие ошибки вы получили? Будет ли это возможно для Вас, чтобы обеспечить courrupted бумажник и базы данных / каталог для меня?
Я хочу начать с того, я думаю, что в целом bitcoind тверд. Весь этот эксперимент начался в неформальной обстановке. Мой друг работает над проектом, который требует счетов, и я в основном изучаю эту тему из любопытства. Я видел много сообщений, рекомендуя не использовать функции счетов, и я хотел бы видеть для себя, насколько я могу взять вещи, прежде чем они ломаются.
Я бегала старую версию (которая случилась быть установлена с моей Оружейной, например), 8.2.2-бета (80202). Вы абсолютно правы, я, вероятно, следует попробовать это снова на последней версии.
Я буду рад предоставить файлы базы данных к вам (это все на testnet), но в настоящее время они очень велики. Wallet.dat является 85Mb. Свяжитесь со мной напрямую, пожалуйста, и я пришлю вам ссылку для загрузки.
Я бегу на Windows 7 и делает звонки с Python 2.7.
Я не намеренно убить процесс, но когда я изначально настроил свой код, который я использовал эту конструкцию, которая, кажется, возникла проблема:
Процесс = subprocess.Popen ([r'C: \ Program Files (x86) \ Bitcoin \ демон \ bitcoind.exe», '-testnet', '-rpcuser = тест', '-rpcpassword = test1'])
time.sleep (20) #give bitcoind время запуска; умнее всего было бы проверить подключение к сети в цикле, но для наших целей это нормально
пытаться:
#run различные тесты в цикле
в конце концов:
process.terminate ()
Вызов прекращается () является то, что, как представляется, привести к коррупции. Позже я стал немного умнее, как я приобрел опыт как с bitcoind и Python:
Процесс = subprocess.Popen ([r'C: \ Program Files (x86) \ Bitcoin \ демон \ bitcoind.exe», '-testnet', '-rpcuser = тест', '-rpcpassword = test1'])
time.sleep (20) #give bitcoind время запуска; умнее всего было бы проверить подключение к сети в цикле, но для наших целей это нормально
пытаться:
#run различные тесты в цикле
в конце концов:
если клиент не None:
client.stop ()
time.sleep (5)
process.terminate ()
Но все еще не 100% OK. В настоящее время я получаю это когда я начинаю вверх:
Предупреждение: Предупреждение: ошибка чтения wallet.dat! Все ключи правильно читать, но данные транзакции или запись адресной книги могут отсутствовать или быть неправильными.
В своем нынешнем состоянии, является ли этот вопрос с базой данных бумажника или с базой данных цепи, я не в состоянии выполнять некоторые операции бумажника:
>>> client.getbalance ()
Traceback (самый последний вызов последнего):
файл "", Строка 1, в <модуль>
файл "C: \ python27 \ Lib \ сайт-пакеты \ jsonrpc \ proxy.py", Строка 45, в __call__
поднять JSONRPCException (соответственно [ 'ошибки'])
JSONRPCException
Я предполагаю, что вы тратили неподтвержденные монеты в этих операциях? Принимая несколько секунд за расходами является известным артефактом текущего программного обеспечения behavior- кода, который проходит неизрасходованные монеты имеет факторный иш сложности. Хотя это может быть improved- есть патчи доступны, а просто отключить расходы неподтвержденных выходов позволяет избежать это-, так как общая пропускная способность сети не очень большая, я в основном считал это ошибкой полезным при обескураживающих неумелых атаках отказа в обслуживании, так что я не лично считал приоритетом. (И большинство людей, которые заметили его, кто упомянул его мне, кажется, есть только проводит испытания или попытки атак отказа в обслуживании ...)
Я не уверен, но я считаю, что входы были подтверждены. Я начал с 5 подтвердил BTC и послал 0.0001 на случайный адрес в бумажнике на каждой итерации. Код ниже.
Мне кажется, все или большую часть задержки не в коде, а с дисковыми операциями, а более конкретно промывке wallet.dat (который теперь 85Mb). В любом случае, я не считаю, что это будет серьезной проблемой.
Это код, который я использовал в моем тесте:
Заполняем кошелек с 50K счетов и продолжительность испытания перемещения средств между счетами внутри:
импорт подпроцесс
время импорта
импорт дата и время
импорт ОС
импорт shutil
импорт timeit
от jsonrpc импорта ServiceProxy
от случайного импорта randrange
#config
#location из "пустой" бумажник файл (только по умолчанию ( «») учетная запись существует)
blankWalletFile = r'C: \ Users \ User \ AppData \ Roaming \ Bitcoin \ testnet3 \ wallet.empty.dat»
#location файла живого бумажника; этот файл будет резервное копирование, а затем восстановлен после завершения теста
liveWalletFile = r'C: \ Users \ User \ AppData \ Roaming \ Bitcoin \ testnet3 \ wallet.dat»
#The количество счетов, которые будут созданы
account_count = 50000
#The количества случайных переводов для выполнения между счетами
transfer_count = 10000
Защиту resetWallet (account_count = 1):
#back вверх живой бумажник
shutil.copy (liveWalletFile, '.bak' liveWalletFile +)
если account_count > 1: #see, если у нас уже есть бумажник файл с таким количеством счетов
source_wallet_file = liveWalletFile + '' + Ул (account_count)
если не os.path.isfile (source_wallet_file):
печать ( «бумажник файл не существует, начиная с пустым файлом»)
source_wallet_file = blankWalletFile
еще:
печать ( «файл существует бумажник, повторное использование существующего файла бумажник»)
#overwrite живой бумажник с пустым бумажником
shutil.copy (source_wallet_file, liveWalletFile)
Защиту restoreLiveWallet ():
#make копии этого файла тестового бумажника для использования в будущем
shutil.copy (liveWalletFile, liveWalletFile + '' + ул (account_count))
#overwrite тест бумажник с резервной копией живым бумажника
shutil.move (liveWalletFile + '.bak', liveWalletFile)
Защиту createAccounts (клиент, количество):
для я в диапазоне (0, количество):
client.move ( '', 'счетом% d' % я, 1e-8)
#print (client.getbalance ( 'счетом% d' % я))
Защиту performRandomTransfers (клиент, количество):
account1 = ''
account2 = getRandomAccount (account_count)
для я в диапазоне (0, количество):
client.move (account1, account2, 1e-8)
account1 = account2
account2 = getRandomAccount (account_count, account1)
Защиту getRandomAccount (account_count, except_account = ''):
счет = except_account
в то время как счета == except_account:
Счета% d '% randrange Account = (0, account_count)
вернуть учетную запись
Защита основные ():
печать (datetime.datetime.now (). время ())
resetWallet (account_count)
печать ( 'начиная bitcoind ...')
Процесс = subprocess.Popen ([r'C: \ Program Files (x86) \ Bitcoin \ демон \ bitcoind.exe», '-testnet', '-rpcuser = тест', '-rpcpassword = test1'])
time.sleep (10) #give bitcoind время запуска; умнее всего было бы проверить подключение к сети в цикле, но для наших целей это нормально
печать ( 'bitcoind начал')
пытаться:
Клиент = ServiceProxy ("Http: // Тест: test1 @ локальный: 18332")
actual_account_count = LEN (client.listaccounts ())
печать ( "Есть в настоящее время {} accounts'.format (actual_account_count))
to_create_count = account_count - actual_account_count + 1
если actual_account_count < account_count:
печать (% to_create_count ", создающий% D счетам)
Total_time = timeit.timeit (лямбда: createAccounts (клиент, to_create_count), число = 1)
печать ( "время, прошедшее с начала создания {0: d} счета: {1: .2f} seconds'.format (to_create_count, Total_time))
печать (datetime.datetime.now (). время ())
печать 'выполнения% d случайных трансфертов% transfer_count
Total_time = timeit.timeit (лямбда: performRandomTransfers (клиент, transfer_count), число = 1)
печать «время, прошедшее выполнения {0: D} переводы: {1: .2f} seconds'.format (transfer_count, Total_time)
печать ( "Есть в настоящее время {} accounts'.format (LEN (client.listaccounts ())))
#print (client.listaccounts ())
печать (datetime.datetime.now (). время ())
печать ( "закрытие bitcoind ...)
client.stop ()
time.sleep (5)
в конце концов:
process.terminate ()
restoreLiveWallet ()
если __name__ == "__главный__":
главный()
Выполнение внешних переводов между счетами:
импорт подпроцесс
время импорта
импорт дата и время
импорт ОС
импорт shutil
импорт timeit
от jsonrpc импорта ServiceProxy
от случайного импорта randrange
#config
transfer_count = 50 #The числа случайных передач для выполнения между счетами
account_count = 50000 #number существующих счетов в кошельке
Защиту performRandomTransfer (клиент, actual_count):
account1 = getRandomAccount ()
account2 = getRandomAccount (account1)
адрес = client.getaccountaddress (account2)
если (client.getbalance (account1) > 1e-4):
Тх = client.sendfrom (account1, адрес, 1e-4)
Элиф client.getbalance () > 1e-4:
Тх = client.sendtoaddress (адрес, 1e-4)
еще:
поднять Exception ( «Нет баланса, доступных в любой учетной записи»)
actual_count [0] = 1 +
печать (ТХ)
Защиту getRandomAccount (except_account = ''):
счет = except_account
в то время как счета == except_account:
Счета% d '% randrange Account = (0, account_count)
вернуть учетную запись
Защита основные ():
печать (datetime.datetime.now (). время ())
печать ( 'начиная bitcoind ...')
Процесс = subprocess.Popen ([r'C: \ Program Files (x86) \ Bitcoin \ демон \ bitcoind.exe», '-testnet', '-rpcuser = тест', '-rpcpassword = test1'])
time.sleep (20) #give bitcoind время запуска; умнее всего было бы проверить подключение к сети в цикле, но для наших целей это нормально
печать ( 'bitcoind начал')
пытаться:
Клиент = ServiceProxy ("Http: // Тест: test1 @ локальный: 18332")
печать (datetime.datetime.now (). время ())
печать 'выполнения% d случайных трансфертов% transfer_count
actual_count = [0]
Total_time = timeit.timeit (лямбда: performRandomTransfer (клиент, actual_count), число = transfer_count)
печать «время, прошедшее выполнения {0: D} переводы: {1: .2f} seconds'.format (actual_count [0], Total_time)
печать (datetime.datetime.now (). время ())
в конце концов:
печать ( "закрытие bitcoind ...)
если клиент не None:
client.stop ()
time.sleep (5)
process.terminate ()
если __name__ == "__главный__":
главный()