使用圖資料分析位元幣區塊鏈
- 使用圖資料分析位元幣區塊鏈
- 一、位元幣是如何運作的,區塊鏈是什么
- 1.1、位元幣可以用來做什么?
- 1.2、在哪里可以找到區塊鏈?
- 二、區塊鏈資料是什么樣子的
- 2.1、塊`Blocks`
- 2.2、交易`Transactions`
- 三、如何將區塊鏈資料匯入到圖資料庫中
- 3.1、塊`Blocks`
- 3.2、交易`Transactions`
- 3.3、地址`Addresses`
- 四、Cypher查詢
- 4.1、塊`Block`資料處理
- 4.2、交易`Transaction`資料處理
- 五、使用區塊鏈資料做一些查詢分析
- 5.1、查詢塊`Bolck`
- 5.2、查詢交易`Transaction`
- 5.3、查詢地址`Address`
- 5.4、查尋路徑
- 六、總結
Here’s the table of contents:
使用圖資料分析位元幣區塊鏈
整個程序就是從一種格式(區塊鏈資料)獲取資料,并將其轉換為另一種格式(圖形資料庫),唯一讓這種轉換比典型資料轉換更棘手的是對于資料格式的理解;在開始之前,理解
[位元幣資料的結構會有所幫助【在第一部分會詳細說明】,另外,可以參考一些開源工具實作區塊鏈資料匯入,bitcoin-to-graph,區塊鏈(Blockchain)和位元幣(Bitcoin)是什么關系?參考鏈接文章!
一旦將區塊鏈匯入到圖資料庫中,就可以在圖形資料庫上執行SQL資料庫無法執行的分析,例如,你可以跟蹤位元幣的路徑,看看兩個不同的地址是否連接:
一、位元幣是如何運作的,區塊鏈是什么
位元幣是一種計算機程式,運行該程式之后,它可以連接到其他運行相同程式的計算機,并共享一個檔案,然而,位元幣最酷的地方在于,任何人都可以向這個共享檔案添加資料,任何已經寫入檔案的資料都不會被篡改,因此,位元幣創建了一個在分布式網路上共享的安全檔案,
1.1、位元幣可以用來做什么?
在位元幣中,添加到該檔案中的每條資料都是一筆交易,因此,這個去中心化檔案被用作數字貨幣(即加密貨幣)的“賬本”,這個“賬本”被稱為區塊鏈,
1.2、在哪里可以找到區塊鏈?
如果你運行位元幣核心程式,區塊鏈將被存盤在你電腦上的一個檔案夾中:
- Linux: ~/.bitcoin/blocks
- Mac: ~/Library/Application Support/Bitcoin/blocks
- Windows: C:\Users\YourUserName\Appdata\Roaming\Bitcoin\blocks
當您打開這個目錄時,您應該注意到不是一個大檔案,而是多個名為blkxxxx .dat的檔案,這是區塊鏈資料,但是分散在多個較小的檔案中,
二、區塊鏈資料是什么樣子的
blk.dat檔案包含塊
blocks和交易transactions的序列化資料,
2.1、塊Blocks
塊被magic bytes分隔,接下來是即將到來的塊的大小,每個塊以一個塊頭開始【塊是一個交易串列的基本容器單位】:
- 塊頭的例子:
000000206c77f112319ae21489b66774e8acd379044d4a23ea7498000000000000000000821fe1890186779b2cc232d5dbecfb9119fd46f8a9cfd1141649ff1cd907374487d8ae59e93c011832ec0399
2.2、交易Transactions
在區塊頭之后,有一個位元組告訴您區塊中即將到來的事務數,在此之后,您將依次獲得序列化的事務資料,交易只是另一段代碼,但它們在結構上更有意思,位元幣交易就是一堆描述位元幣移動的資料,它接收輸入,并創建新的輸出,
每筆交易都有相同的模式:
- 選擇輸出(就是得到輸入的程序):解鎖這些輸入,這樣就可以消費了,
- 創建輸出:將這些輸出鎖定到一個新地址,
在一系列交易之后,你會得到這樣的交易結構,這是區塊鏈的簡化圖,如你所見,它看起來像一個圖【類似于引言的那個圖】:
三、如何將區塊鏈資料匯入到圖資料庫中
通過
第一和第二部分基本弄清楚了區塊鏈資料表示什么(它看起來很像一個圖),可以繼續將它匯入到圖資料庫中了,
- 讀取blk.dat檔案,
- 解碼每一個區塊和交易,
- 將解碼的塊/事務轉換為一個Cypher查詢,
以下是如何在資料庫中表示區塊、交易和地址的可視化指南:
3.1、塊Blocks
- 創建一種
:block節點,并將其連接到所構建的前一個區塊;將區塊頭中的每個欄位設定為該節點的屬性,- 為每個區塊的節點,創建一種
:coinbase節點,代表了區塊提供的“新”位元幣,
3.2、交易Transactions
- 創建一種
:tx節點,并將它連接到我們剛才創建的:block節點;設定:tx節點的屬性為(version, locktime),- 合并已有
:output節點,并將他們關聯[:in]到:tx節點;設定unlocking code做為關系的屬性,- 創建這次交易產生的新的
:output節點;設定這些節點上各自的values和locking代碼,
3.3、地址Addresses
- 創建一種’:address’節點,并將
:output節點連接到它;同時,設定address屬性在這個節點上,(如果不同的輸出連接到相同的地址,那么它們將連接到相同的地址節點,)
四、Cypher查詢
下面是一些示例Cypher查詢,您可以使用它們作為向圖資料庫插入塊和交易資料的基準查詢,(注意點:需要解碼區塊頭和交易資料,以獲得Cypher查詢的引數,)
4.1、塊Block資料處理
- 基準Cypher
MERGE (block:block {hash:$blockhash})
CREATE UNIQUE (block)-[:coinbase]->(:output:coinbase)
SET
block.size=$size,
block.prevblock=$prevblock,
block.merkleroot=$merkleroot,
block.time=$timestamp,
block.bits=$bits,
block.nonce=$nonce,
block.txcount=$txcount,
block.version=$version,
MERGE (prevblock:block {hash:$prevblock})
MERGE (block)-[:chain]->(prevblock)
- 入參【樣例】
{
"blockhash": "00000000000003e690288380c9b27443b86e5a5ff0f8ed2473efbfdacb3014f3",
"version": 536870912,
"prevblock": "000000000000050bc5c1283dceaff83c44d3853c44e004198c59ce153947cbf4",
"merkleroot": "64027d8945666017abaf9c1b7dc61c46df63926584bed7efd6ed11a6889b0bac",
"timestamp": 1500514748,
"bits": "1a0707c7",
"nonce": 2919911776,
"size": 748959,
"txcount": 1926,
}
4.2、交易Transaction資料處理
- 基準Cypher
這個查詢使用FOREACH陳述句,它作為一個條件,只在$addresses引數實際包含一個地址時才創建:address節點,通常,FOREACH陳述句使用在需要
動態創建圖資料的場景中,
MATCH (block :block {hash:$hash})
MERGE (tx:tx {txid:$txid})
MERGE (tx)-[:inc {i:$i}]->(block)
SET tx += {tx}
WITH tx
FOREACH (input in $inputs |
MERGE (in :output {index: input.index})
MERGE (in)-[:in {vin: input.vin, scriptSig: input.scriptSig, sequence: input.sequence, witness: input.witness}]->(tx)
)
FOREACH (output in $outputs |
MERGE (out :output {index: output.index})
MERGE (tx)-[:out {vout: output.vout}]->(out)
SET
out.value= output.value,
out.scriptPubKey= output.scriptPubKey,
out.addresses= output.addresses
FOREACH(ignoreMe IN CASE WHEN output.addresses <> '' THEN [1] ELSE [] END |
MERGE (address :address {address: output.addresses})
MERGE (out)-[:locked]->(address)
)
)
- 入參【樣例】
{
"txid":"2e2c43d9ef2a07f22e77ed30265cc8c3d669b93b7cab7fe462e84c9f40c7fc5c",
"hash":"00000000000003e690288380c9b27443b86e5a5ff0f8ed2473efbfdacb3014f3",
"i":1,
"tx":{
"version":1,
"locktime":0,
"size":237,
"weight":840,
"segwit":"0001"
},
"inputs":[
{
"vin":0,
"index":"0000000000000000000000000000000000000000000000000000000000000000:4294967295",
"scriptSig":"03779c110004bc097059043fa863360c59306259db5b0100000000000a636b706f6f6c212f6d696e65642062792077656564636f646572206d6f6c69206b656b636f696e2f",
"sequence":4294967295,
"witness":"01200000000000000000000000000000000000000000000000000000000000000000"
}
],
"outputs":[
{
"vout":0,
"index":"2e2c43d9ef2a07f22e77ed30265cc8c3d669b93b7cab7fe462e84c9f40c7fc5c:0",
"value":166396426,
"scriptPubKey":"76a91427f60a3b92e8a92149b18210457cc6bdc14057be88ac",
"addresses":"14eJ6e2GC4MnQjgutGbJeyGQF195P8GHXY"
},
{
"vout":1,
"index":"2e2c43d9ef2a07f22e77ed30265cc8c3d669b93b7cab7fe462e84c9f40c7fc5c:1",
"value":0,
"scriptPubKey":"6a24aa21a9ed98c67ed590e849bccba142a0f1bf5832bc5c094e197827b02211291e135a0c0e",
"addresses":""
}
]
}
五、使用區塊鏈資料做一些查詢分析
如果已經使用上面的Cypher查詢插入了塊和交易資料,那么就可以從圖資料庫中做一些查詢分析了,
5.1、查詢塊Bolck
// 查詢塊與交易資料關系
MATCH (block :block)<-[:inc]-(tx :tx)
WHERE block.hash='$blockhash'
RETURN block, tx

5.2、查詢交易Transaction
// 查詢交易的輸入輸出關聯關系
MATCH (inputs)-[:in]->(tx:tx)-[:out]->(outputs)
WHERE tx.txid='$txid'
OPTIONAL MATCH (inputs)-[:locked]->(inputsaddresses)
OPTIONAL MATCH (outputs)-[:locked]->(outputsaddresses)
OPTIONAL MATCH (tx)-[:inc]->(block)
RETURN inputs, tx, outputs, block, inputsaddresses, outputsaddresses

5.3、查詢地址Address
// 查詢地址和輸出的關系
MATCH (address :address {address:'1PNXRAA3dYTzVRLwWG1j3ip9JKtmzvBjdY'})<-[:locked]-(output :output)
WHERE address.address='$address'
RETURN address, output

5.4、查尋路徑
查找交易和地址之間的路徑可能是你可以用位元幣區塊鏈的圖形資料庫做的最有趣的事情,所以這里有一些Cypher查詢的例子:
:output節點之間的路徑查詢
// 查詢兩個輸出之間的最短路徑
MATCH (start :output {index:'$txid:vout'}), (end :output {index:'$txid:out'})
MATCH path=shortestPath( (start)-[:in|:out*]-(end) )
RETURN path

:addresses之間的路徑查詢
// 查詢兩個地址之間的最短路徑
MATCH (start :address {address:'$address1'}), (end :address {address:'$address2'})
MATCH path=shortestPath( (start)-[:in|:out|:locked*]-(end) )
RETURN path

六、總結
本文是關于如何從blk.dat檔案(區塊鏈)獲取塊和交易資料并將它們匯入到圖資料庫的簡單指南,
我認為,如果你想對區塊鏈進行分析,這是值得的,圖資料庫是位元幣區塊鏈資料的最自然地表達,而使用SQL資料庫來進行位元幣交易資料分析,是非常困難甚至無法實作的,
為了盡量讓這個指南簡明扼要,所以沒有涉及以下內容:
- 閱讀區塊鏈,讀取blk.dat檔案很容易,然而,關于這些檔案的惱人之處在于,塊不是按順序寫入這些檔案的,這使得設定塊的高度或計算交易的費用有點棘手(但您可以圍繞它進行編碼),
- 解碼塊和交易,如果您想使用上面的Cypher查詢,您將需要通過解碼區塊頭和原始交易資料來獲得所需的引數,您可以撰寫自己的解碼器,或者嘗試使用現有的位元幣庫,
- 還有另外一些特殊格式的處理,也需要特殊考慮,但是如果你了解資料是如何組織起來的,將它轉換成不同的格式只是開發一些特定的程式而已,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/294036.html
標籤:區塊鏈

















