Поэтому я дал ему идти. Я надеюсь, что кто-то будет проверять мою логику, тем более, что я новичок в Python.
$ Время ЦСИ / bitcointools / freeable.py
загруженные 125925 блоки
реальные 0m47.131s
0m43.799s пользователей
SYS 0m2.744s
$ Ls -l .bitcoin / blk0 * .dat
-RW ------- 1 jtobey jtobey 180119823 2011-05-23 00:42 .bitcoin / blk0001.dat
(Отредактировано: исправлена ошибка http://forum.bitcoin.org/index.php?topic=9461.msg137059#msg137059) Разница в bitcointools:
Код:
дифференциал --git а / deserialize.py б / deserialize.py
Индекс fe0cb09..a67645b 100644
--- а / deserialize.py
+++ б / deserialize.py
@@ -75,6 +75,7 @@ Защита deserialize_TxOut (д, owner_keys = нет):
Защиту parse_Transaction (VDS):
d = {}
+ Пуск = vds.read_cursor # XXX брейки BCDataStream абстракции, мы заботимся?
d [ 'версии'] = vds.read_int32 ()
n_vin = vds.read_compact_size ()
д [ 'txIn'] = []
@@ -85,6 +86,7 @@ Def parse_Transaction (VDS):
для г в xrange (n_vout):
д [ 'txOut']. добавить (parse_TxOut (VDS))
д [ 'Locktime'] = vds.read_uint32 ()
+ д [ 'ТХ'] = vds.input [начать: vds.read_cursor]
возвращение d
Защиту deserialize_Transaction (д, transaction_index = нет, owner_keys = нет):
результат = "% D ТХ в,% d из \ п"% (LEN (д [ 'txIn']), длина (д [ 'txOut']))
дифференциал --git а / freeable.py б / freeable.py
Новый режим файла 100755
индекс 0000000..c79f458
--- / DEV / нуль
+++ б / freeable.py
@@ -0,0 +1,87 @@
+#! / USR / бен / окр питон
+#
+# Чтение базы данных блока, выяснить, как много сделок
+# Может быть очищены и сколько байт они занимают.
+# TODO: узнать, сколько хэш Меркла может быть удалены.
+#
+от bsddb.db импорта *
+ведение журнала импорта
+импорт ОС
+импорт SYS
+
+от BCDataStream импорта *
+от блока импорта scan_blocks
+от десериализации импорта parse_Block
+от Util импорта determine_db_dir, create_env
+импорт Crypto.Hash.SHA256, как SHA256
+
+импорт binascii # отладки
+
+Защита основные ():
+ импорт optparse
+ парсер = optparse.OptionParser (использование ="% Проги [опция]")
+ parser.add_option ("--datadir", Приемник ="каталогу_данных", По умолчанию = None,
+ помощь ="Искать файлы здесь (по умолчанию Bitcoin по умолчанию)")
+ (Опционы, арг) = parser.parse_args ()
+
+ если options.datadir не None:
+ db_dir = determine_db_dir ()
+ еще:
+ db_dir = options.datadir
+
+ пытаться:
+ db_env = create_env (db_dir)
+ кроме DBNoSuchFileError:
+ logging.error ("Не удалось открыть " + Db_dir)
+ sys.exit (1)
+
+ blockfile = открыт (os.path.join (db_dir, "BLK% 04d.dat"% (1)), "Р.Б.")
+ block_datastream = BCDataStream ()
+ block_datastream.map_file (blockfile, 0)
+
+ блоки = []
+ Защиту gather_stats (block_data):
+ block_datastream.seek_file (block_data [ 'nBlockPos'])
+ blocks.append (parse_Block (block_datastream))
+ возвращающие
+
+ scan_blocks (db_dir, db_env, gather_stats)
+ blocks.reverse ()
+ печать 'загружен', LEN (блоки), 'блоки'
+
+ Тх = {}
+ total_tx = 0
+ freeable_tx = 0
+ total_bytes = 0
+ freeable_bytes = 0
+
+ для данных в блоках:
+ coinbase = True
+ для TxN в данных [ «операции»]:
+ tx_hash = SHA256.new (SHA256.new (TXN [ 'ОГО']). дайджест ()). дайджест ()
+ #Распечатать '> », Binascii.hexlify (tx_hash)
+ tx_bytes = Len (TXN [ 'ТХ'])
+ TX [tx_hash] = (tx_bytes, длина (TXN [ 'txOut']))
+ total_tx + 1 =
+ total_bytes + = tx_bytes
+
+ если coinbase:
+ coinbase = False
+ еще:
+ для txin в TxN [ 'txIn']:
+ #Распечатать '< », Binascii.hexlify (txin [ 'prevout_hash'])
+ (Байты, жить) = Ой [txin [ 'prevout_hash']]
+ если жить == 1:
+ freeable_bytes + = байт
+ freeable_tx + 1 =
+ дель ТХ [txin [ 'prevout_hash']]
+ еще:
+ ТХ [txin [ 'prevout_hash']] = (байты, жить - 1)
+
+ db_env.close ()
+
+ печать freeable_tx, 'из', total_tx, 'ТХ freeable'
+ печать freeable_bytes, 'из', total_bytes, 'ТХ байтов freeable'
+
+если __name__ == '__main__':
+ главный()
Индекс fe0cb09..a67645b 100644
--- а / deserialize.py
+++ б / deserialize.py
@@ -75,6 +75,7 @@ Защита deserialize_TxOut (д, owner_keys = нет):
Защиту parse_Transaction (VDS):
d = {}
+ Пуск = vds.read_cursor # XXX брейки BCDataStream абстракции, мы заботимся?
d [ 'версии'] = vds.read_int32 ()
n_vin = vds.read_compact_size ()
д [ 'txIn'] = []
@@ -85,6 +86,7 @@ Def parse_Transaction (VDS):
для г в xrange (n_vout):
д [ 'txOut']. добавить (parse_TxOut (VDS))
д [ 'Locktime'] = vds.read_uint32 ()
+ д [ 'ТХ'] = vds.input [начать: vds.read_cursor]
возвращение d
Защиту deserialize_Transaction (д, transaction_index = нет, owner_keys = нет):
результат = "% D ТХ в,% d из \ п"% (LEN (д [ 'txIn']), длина (д [ 'txOut']))
дифференциал --git а / freeable.py б / freeable.py
Новый режим файла 100755
индекс 0000000..c79f458
--- / DEV / нуль
+++ б / freeable.py
@@ -0,0 +1,87 @@
+#! / USR / бен / окр питон
+#
+# Чтение базы данных блока, выяснить, как много сделок
+# Может быть очищены и сколько байт они занимают.
+# TODO: узнать, сколько хэш Меркла может быть удалены.
+#
+от bsddb.db импорта *
+ведение журнала импорта
+импорт ОС
+импорт SYS
+
+от BCDataStream импорта *
+от блока импорта scan_blocks
+от десериализации импорта parse_Block
+от Util импорта determine_db_dir, create_env
+импорт Crypto.Hash.SHA256, как SHA256
+
+импорт binascii # отладки
+
+Защита основные ():
+ импорт optparse
+ парсер = optparse.OptionParser (использование ="% Проги [опция]")
+ parser.add_option ("--datadir", Приемник ="каталогу_данных", По умолчанию = None,
+ помощь ="Искать файлы здесь (по умолчанию Bitcoin по умолчанию)")
+ (Опционы, арг) = parser.parse_args ()
+
+ если options.datadir не None:
+ db_dir = determine_db_dir ()
+ еще:
+ db_dir = options.datadir
+
+ пытаться:
+ db_env = create_env (db_dir)
+ кроме DBNoSuchFileError:
+ logging.error ("Не удалось открыть " + Db_dir)
+ sys.exit (1)
+
+ blockfile = открыт (os.path.join (db_dir, "BLK% 04d.dat"% (1)), "Р.Б.")
+ block_datastream = BCDataStream ()
+ block_datastream.map_file (blockfile, 0)
+
+ блоки = []
+ Защиту gather_stats (block_data):
+ block_datastream.seek_file (block_data [ 'nBlockPos'])
+ blocks.append (parse_Block (block_datastream))
+ возвращающие
+
+ scan_blocks (db_dir, db_env, gather_stats)
+ blocks.reverse ()
+ печать 'загружен', LEN (блоки), 'блоки'
+
+ Тх = {}
+ total_tx = 0
+ freeable_tx = 0
+ total_bytes = 0
+ freeable_bytes = 0
+
+ для данных в блоках:
+ coinbase = True
+ для TxN в данных [ «операции»]:
+ tx_hash = SHA256.new (SHA256.new (TXN [ 'ОГО']). дайджест ()). дайджест ()
+ #Распечатать '> », Binascii.hexlify (tx_hash)
+ tx_bytes = Len (TXN [ 'ТХ'])
+ TX [tx_hash] = (tx_bytes, длина (TXN [ 'txOut']))
+ total_tx + 1 =
+ total_bytes + = tx_bytes
+
+ если coinbase:
+ coinbase = False
+ еще:
+ для txin в TxN [ 'txIn']:
+ #Распечатать '< », Binascii.hexlify (txin [ 'prevout_hash'])
+ (Байты, жить) = Ой [txin [ 'prevout_hash']]
+ если жить == 1:
+ freeable_bytes + = байт
+ freeable_tx + 1 =
+ дель ТХ [txin [ 'prevout_hash']]
+ еще:
+ ТХ [txin [ 'prevout_hash']] = (байты, жить - 1)
+
+ db_env.close ()
+
+ печать freeable_tx, 'из', total_tx, 'ТХ freeable'
+ печать freeable_bytes, 'из', total_bytes, 'ТХ байтов freeable'
+
+если __name__ == '__main__':
+ главный()