Для определения данных временной метки из p2p сети я использовал следующее:
Код:
кошка ~ / .bitcoin / debug.log > вне
Bitcoin -printblock
Я выполнил это в три отдельных общих блоках генерируются. Вот некоторые сравнения информации из заголовков каждого бревна.
Код:
68845 (всего 32963420 байт)
Загруженные 9173 адреса
LoadBlockIndex (): hashBestChain = 00000000000394ae высота = 68844
mapBlockIndex.size () = 68880
nBestHeight = 68844
Код:
68858 (всего 32771350 байт)
Загруженные 9190 адреса
LoadBlockIndex (): hashBestChain = 00000000000052ff высота = 68857
mapBlockIndex.size () = 68893
nBestHeight = 68857
Код:
68943 (всего 32837629 байт)
Загруженные 9407 адреса
LoadBlockIndex (): hashBestChain = 00000000015364ae высота = 68942
mapBlockIndex.size () = 68978
nBestHeight = 68942
Я решил, что в лог DATAS, что каждая строка, начинающаяся с "CBlock" и содержащий "NTime" были сведения о генерации блока. Однако это показалось мне странным, что выход производится из 68,858 был меньше данных, чем от 68,845.
68845 выхода журнала имеет 69,402 CBlock линии. (557 CBlock линии больше, чем блоки генерируются)
68858 выхода журнала имеет 68,893 CBlock линии. (35 CBlock линии больше, чем блоки генерируются)
68943 выхода журнала имеет 68,978 CBlock линии. (35 CBlock линии больше, чем блоки генерируются)
В обоих журналах для 68,858 и 68,943 количество CBlock линий соответствует mapBlockIndex.size (), но не для 68,845. Является ли мои данные журнала неточными или есть другое объяснение для этого?
-
После получения этой информации, я проанализирован его с помощью следующего:
Код:
Grep CBlock файл_журнала | вырезать -b 99-108 | сортировать
Это обеспечило последовательную информацию временной метки, которые я использовал для сравнения моих данных журнала в официальных DATAS производства системы p2p Bitcoin.
Как примечание, я заметил, что некоторые из меток времени не были уникальными, и дублируются.
Код:
# Grep CBlock debug.log.68943 | вырезать -b 99-108 | сортировать | туалет -l
68978
смерть .bitcoin # Grep CBlock debug.log.68943 | вырезать -b 99-108 | сортировки | Uniq | туалет -l
68938
Однако, это невозможно для журнала для 68,943 блоков только иметь данные для 68,938 (менее) блоков, поэтому я делаю вывод, что некоторые блоки были созданы в то же метке времени, как ранее созданный блок и предложения Gavin этого развенчать в том, что метки время будет уникальным [ http://bitcointalk.org/index.php?topic=457.msg4042#msg4042 ].
Сравнивая свои данные системного журнала для данных, выводимых из каротажных данных для 68,858 Я нашел образец в длительностей между блоком генерации и был в состоянии совпасть, который временная метка была связана с какой блок генерируется. Бревенчатые данные `Bitcoin -printblock` не указывает, какой блок связан с меткой времени. Поэтому я должен был либо принять или использовать свои существующие данные, которые я сделал. Тем не менее, потому что есть больше CBlock линий, то фактические сформированные блоки в файлах журнал, я не уверен относительно того, как приступить к исключению определенной CBlock линии от моего дальнейшего анализа, чтобы совпасть метки времени с сгенерированными блоками. Я заметил, что оба журнала для 68,858 и 68,943 имеют только 35 CBlock линии больше, и это может быть полезно для понимания, которые не имеют отношения CBlocks / что-то еще, но сейчас я прошу сообщества / УБС, если они могут помочь объяснить это лучше.
котировка
<ЛЧМ> Prolly от orginating часов PC
ArtForz способствовали этот кусок кода, который извлекает информацию из временной метки blk0001.dat
Код:
#! / USR / бен / окр питон
импорт структура
импорт hashlib
Защиту uint256_deser (ы):
г = 0L
для г в xrange (8):
т = struct.unpack ("<я", С [я * 4: я * 4 + 4]) [0]
г + = т << (Я * 32)
возвращение г
Защиту uint256_ser (и):
Rs = ""
для г в xrange (8):
RS + = struct.pack ("<я", у & 0xFFFFFFFFL)
U >>= 32
вернуться RS
Защиту uint256_from_compact (с):
= число-байт (с >> 24) & 0xFF
v = (с & 0xFFFFFFL) << (8 * (- 3 число-байт))
возврат v
Защиту get_difficulty (с):
вернуться поплавка (uint256_from_compact (0x1D00FFFF) * 1000 // uint256_from_compact (с)) / 1000.
Класс CBlock:
Защита десериализации (я, s):
self.nVersion = struct.unpack ("<я", С [0: 4]) [0]
self.hashPrevBlock = uint256_deser (с [4:36])
self.hashMerkleRoot = uint256_deser (ы [36:68])
self.nTime = struct.unpack ("<я", С [68:72]) [0]
self.nBits = struct.unpack ("<я", С [72:76]) [0]
self.nNonce = struct.unpack ("<я", С [76:80]) [0]
h1 = hashlib.sha256 (с [0:80]). (переваривают)
self.hash = uint256_deser (hashlib.sha256 (h1) .digest ())
если self.hash > uint256_from_compact (self.nBits):
поднять ValueError ("плохой хэш в% с" % Магнезия (сам))
self.next = []
self.blocknum = -1
Защиту __repr __ (Я):
вернуть "CBlock {вер =% 08x л.с. =% 064x гм =% 064x нт =% 08x пь =% 08x пп =% 08x ч =% 064x, п =% я}" % (Self.nVersion, self.hashPrevBlock, self.hashMerkleRoot, self.nTime, self.nBits, self.nNonce, self.hash, self.blocknum)
Защиту get_chain_len (BLK):
г = 1
в то время как Len (blk.next) == 1:
BLK = blk.next [0]
г + 1 =
если Len (blk.next) > 1:
bestchainlen = 0
для nextblk в blk.next:
chainlen = get_chain_len (nextblk)
если chainlen > bestchainlen:
bestchainlen = chainlen
г + = bestchainlen
возвращение г
Защиту readblocks (имя файла):
е = открытое (имя файла, "Р.Б.")
блоки = []
idxmap = {}
в то время как True:
пытаться:
магии = f.read (4)
если магия! = "\ Xf9 \ XBE \ XB4 \ xd9":
ломать
blklen = struct.unpack ("<я", F.read (4)) [0]
если blklen < 80:
ломать
blkdata = f.read (blklen)
если Len (blkdata) = blklen:
ломать
Кроме:
ломать
BLK = CBlock ()
blk.deserialize (blkdata)
blocks.append (BLK)
idxmap [blk.hash] = BLK
если blk.hashPrevBlock:
prevblk = idxmap [blk.hashPrevBlock]
blk.prev = prevblk
prevblk.next.append (BLK)
f.close ()
rootblk = блоки [0]
дель блоки
дель idxmap
BLK = rootblk
curblkidx = 0
в то время как True:
blk.blocknum = curblkidx
если Len (blk.next) == 0:
не blk.next = None
ломать
если Len (blk.next) > 1:
не bestnextblk = None
bestchainlen = 0
для nextblk в blk.next:
chainlen = get_chain_len (nextblk)
если chainlen > bestchainlen:
bestchainlen = chainlen
bestnextblk = nextblk
Элиф chainlen == bestchainlen:
если nextblk.nTime < bestnextblk.nTime:
bestchainlen = chainlen
bestnextblk = nextblk
blk.next = [bestnextblk]
blk.next = blk.next [0]
curblkidx + 1 =
BLK = blk.next
BLK = rootblk
в то время как BLK:
#Распечатать "% Я% я% .3f 0x% 08X" % (blk.blocknum, blk.nTime, get_difficulty (blk.nBits), blk.nBits)
avghashes = 2 ** 256 / uint256_from_compact (blk.nBits)
Распечатать "% Я% я% я" % (Blk.blocknum, blk.nTime, avghashes)
BLK = blk.next
если __name__ == "__главный__":
readblocks ("/home/necro/.bitcoin/blk0001.dat")