您好,登錄后才能下訂單哦!
這篇文章主要講解了“比特幣blk.dat文件格式及讀取工具是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“比特幣blk.dat文件格式及讀取工具是什么”吧!
比特幣節(jié)點(diǎn)(Bitcoin Core)的~/.bitcoin/blocks/
目錄中的blk.dat
文件中包含了節(jié)點(diǎn)接收到的原始區(qū)塊數(shù)據(jù),這些數(shù)據(jù)文件構(gòu)成了比特幣區(qū)塊鏈的基礎(chǔ),同時(shí)也是區(qū)塊鏈數(shù)據(jù)分析獲取比特幣區(qū)塊和交易數(shù)據(jù)的最高效的途徑。
比特幣節(jié)點(diǎn)(Bitcoin Core)接收到的每個(gè)區(qū)塊都會(huì)寫(xiě)入一個(gè)blk.dat文件。出于性能考慮,節(jié)點(diǎn)不會(huì)把所有區(qū)塊寫(xiě)入單一巨型文件,而是拆分為多個(gè)blk*.dat文件。
~/.bitcoin/blocks blk00000.dat blk00001.dat blk00002.dat …
節(jié)點(diǎn)首先將收到的區(qū)塊寫(xiě)入blk00000.dat,然后如果這個(gè)文件滿了(大約128MB)就會(huì)寫(xiě)入blk00001.dat,然后是blk00002.dat...,依次類推。
在blk.dat文件中的數(shù)據(jù)以二進(jìn)制格式存儲(chǔ),節(jié)點(diǎn)收到的新區(qū)塊會(huì)追加到文件末尾。我們可以看一下創(chuàng)世區(qū)塊的內(nèi)容。讀取blk00000.dat的開(kāi)頭293個(gè)字節(jié):
f9beb4d91d01000001000000000000000000000000000000000000000000000000 00000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a 51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000 000000000000000000000000000000000000000000000000000000ffffffff4d04 ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e 63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f7574 20666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548 271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4 f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
上面的數(shù)據(jù)可以分為五個(gè)部分:
magic bytes(魔術(shù)字節(jié))和size(數(shù)據(jù)尺寸)可以用來(lái)找出來(lái)每個(gè)區(qū)塊的起止位置
block header(區(qū)塊頭)包含了區(qū)塊的頭部信息
tx count 表示區(qū)塊中的交易數(shù)量,后面的transaction data部分就是逐條交易的數(shù)據(jù)
數(shù)據(jù)結(jié)構(gòu)如下:
[ magic bytes ][ size ][ block header ][ tx count ][ transaction data ] <- 4 bytes -> <- 4 bytes -> <- 80 bytes -> <- varint -> <- remainder ->
利用size
字段分析上面的數(shù)據(jù),我們就知道要讀取整個(gè)區(qū)塊需要293個(gè)字節(jié):size的二進(jìn)制編碼為1d010000
,按如下步驟進(jìn)行處理:
轉(zhuǎn)換字節(jié)順序,得到0000011d
轉(zhuǎn)換為10進(jìn)制,得到285
因此我們?cè)偌由蟤agic bytes的4個(gè)字節(jié)和size的4個(gè)字節(jié),就得到了這個(gè)區(qū)塊 的字節(jié)數(shù)為293。
如果你在解析blk.dat文件,一定要記得區(qū)塊不一定是按先后順序排列的。例如在你處理文件時(shí)可能會(huì)讀到以下順序排列的區(qū)塊:
A B C E F D
這是因?yàn)槌鲇谛阅艿目紤],比特幣節(jié)點(diǎn)是并行下載區(qū)塊的。
這個(gè)限制是在源代碼中由宏MAX_BLOCKFILE_SIZE控制的。
正如之前所言,blk.dat文件中的數(shù)據(jù)是二進(jìn)制編碼的,因此如果你直接在文本編輯器里打開(kāi)文件,可能看不出來(lái)太多有價(jià)值的信息。有幾個(gè)工具可以幫助你。
od是一個(gè)簡(jiǎn)單的工具,它將文件內(nèi)容導(dǎo)出為你選擇的格式。例如:
od -x --endian=big -N 293 -An blk00000.dat
其中:
-x: 顯示為16進(jìn)制
--endian=big: 按big endian順序顯示字節(jié)
-N 293 : 聲明要讀取的字節(jié)數(shù)
-An:不顯示文件偏移量
od通常內(nèi)置于各種linux發(fā)行版中。
類似于od,不過(guò)hexdump可以顯示數(shù)據(jù)的ascii文本,這對(duì)于快速查看交易中包含的信息會(huì)很方便。例如:
$ hexdump -C -s 8 -n 285 blk00000.dat 00000008 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000018 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000028 00 00 00 00 3b a3 ed fd 7a 7b 12 b2 7a c7 2c 3e |....;...z{..z.,>| 00000038 67 76 8f 61 7f c8 1b c3 88 8a 51 32 3a 9f b8 aa |gv.a......Q2:...| 00000048 4b 1e 5e 4a 29 ab 5f 49 ff ff 00 1d 1d ac 2b 7c |K.^J}._I......+|| 00000058 01 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 |................| 00000068 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000078 00 00 00 00 00 00 ff ff ff ff 4d 04 ff ff 00 1d |..........M.....| 00000088 01 04 45 54 68 65 20 54 69 6d 65 73 20 30 33 2f |..EThe Times 03/| 00000098 4a 61 6e 2f 32 30 30 39 20 43 68 61 6e 63 65 6c |Jan/2009 Chancel| 000000a8 6c 6f 72 20 6f 6e 20 62 72 69 6e 6b 20 6f 66 20 |lor on brink of | 000000b8 73 65 63 6f 6e 64 20 62 61 69 6c 6f 75 74 20 66 |second bailout f| 000000c8 6f 72 20 62 61 6e 6b 73 ff ff ff ff 01 00 f2 05 |or banks........| 000000d8 2a 01 00 00 00 43 41 04 67 8a fd b0 fe 55 48 27 |*....CA.g....UH'| 000000e8 19 67 f1 a6 71 30 b7 10 5c d6 a8 28 e0 39 09 a6 |.g..q0..\..(.9..| 000000f8 79 62 e0 ea 1f 61 de b6 49 f6 bc 3f 4c ef 38 c4 |yb...a..I..?L.8.| 00000108 f3 55 04 e5 1e c1 12 de 5c 38 4d f7 ba 0b 8d 57 |.U......\8M....W| 00000118 8a 4c 70 2b 6b f1 1d 5f ac 00 00 00 00 |.Lp+k.._.....|) 0000125
其中:
-C:顯示字節(jié)及ascii文本
-s:聲明要顯示數(shù)據(jù)的偏移位置
-n:聲明要讀取的字節(jié)數(shù)
也可以指顯示原始的16進(jìn)制數(shù)據(jù):
$ hexdump -C -s 8 -n 285 blk00000.dat | cut -c 11-58 | tr '\n' ' ' | tr -d ' '
其中:
cut -c 11-58 :僅保留每行的11到58列
tr '\n' ' ' :將換行翻譯為空格
tr -d ' ' :刪除所有空格
hexdump通常內(nèi)置于各種linux發(fā)行版中。
與前兩種簡(jiǎn)單工具不同,BlockETL軟件包用于比特幣區(qū)塊鏈數(shù)據(jù)分析中的數(shù)據(jù)抽取、轉(zhuǎn)換和加載,也就是說(shuō),BlockETL是更大的區(qū)塊鏈數(shù)據(jù)分析生態(tài)中的一個(gè)基礎(chǔ)工具,當(dāng)你讀取比特幣blk.dat文件的目的是要進(jìn)一步分析數(shù)據(jù)時(shí),這個(gè)工具最有價(jià)值。
BlockETL的主要特性如下:
直接讀取原始區(qū)塊文件,抽取速度快
將原始區(qū)塊和交易數(shù)據(jù)加載至SQL數(shù)據(jù)庫(kù),便于后續(xù)的區(qū)塊鏈數(shù)據(jù)分析
支持多流水線并行處理,可自己控制并發(fā)流水線數(shù)量
結(jié)構(gòu)設(shè)計(jì)清晰,代碼便于擴(kuò)展
BlockETL是一個(gè)Java應(yīng)用,同時(shí)也是一個(gè)開(kāi)發(fā)包,支持Windows、OSX和Linux等多種操作系統(tǒng)。配置數(shù)據(jù)目錄、數(shù)據(jù)庫(kù)連接等基本信息并啟動(dòng)后,就可以看到將blk文件中的區(qū)塊和交易數(shù)據(jù)加載到SQL數(shù)據(jù)庫(kù)的進(jìn)度了:
感謝各位的閱讀,以上就是“比特幣blk.dat文件格式及讀取工具是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)比特幣blk.dat文件格式及讀取工具是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。