利用networkx建立比特幣交易有向多重圖

一、內容簡介

上篇博客我們已經準備好了比特幣交易數據集,本次將依託networkx建立比特幣交易數據有向多重圖。
關於networkx的具體介紹可以看這裏 : https://networkx.org/

二、多向圖內容解釋

1、節點及其屬性

節點:交易賬戶地址,例如:16M3qXrGkAYppA1aJug49JtYDxQkdKGLW8
節點屬性:賬戶餘額(目前全部置0)

2、邊及其屬性

邊:由支出賬戶指向接收賬戶
邊屬性:1、交易哈希,例如:7f5a92db44be25414d5c322cc474bfcb94e538f5e511ff2776db6bf7c507bba0
	   2、區塊高度,交易所在區塊高度,例如:667300
	   3、出塊時間(時間戳),交易所在區塊出塊時間,例如:1611404276
	   4、交易金額,例如:0.002489832589155737

特別指出:如果出現兩個賬戶多次進行交易同樣可行,例如

16M3qXrGkAYppA1aJug49JtYDxQkdKGLW8->1387LuWrcYBcGtBsADix6Yo1iLox6VM4m1

進行了兩次交易,那麼節點之間的邊會有兩條

做了如下測試:

import networkx as nx

G=nx.MultiDiGraph()
G.add_nodes_from([1,2,3,4,5])
G.add_edges_from([(1,2,{
   
   'color':'blue','weight':8}),(1,2,{
   
   'color':'red','weight':9}),(1,3),(2,4),(1,4),(2,5)],)
nx.draw_networkx(G)
print(G[1][2])

輸出:節點1和2之間邊的屬性

{0: {'color': 'blue', 'weight': 8}, 1: {'color': red', 'weight': 9}}

注:即使是完全相同的屬性也會有兩條邊

三、完整代碼

from matplotlib import pyplot as plt
import networkx as nx


def main():
    # 創建有向多重圖
    g = nx.MultiDiGraph()
    # 導入文本文件數據
    with open('b_coin1.txt', 'r', encoding='utf-8') as fp:
        for i in range(5):  # 遍歷文件每條交易信息
            data = fp.readline()  # data存儲每行信息
            string = data.split()
            transaction = string[0]  # 存儲交易哈希
            block_height = string[1]  # 存儲區塊高度
            timestamp = string[2]  # 存儲出塊時間
            in_account = string[3]  # 存儲支出地址
            out_account = string[4]  # 存儲收入地址
            amount = string[5]  # 存儲單次交易金額
            # 加入節點:賬戶及其屬性(賬戶餘額,暫時全部置0)
            g.add_nodes_from([(in_account, {
   
   'balance': 0}), (out_account, {
   
   'balance': 0})])
            # 加入連邊:交易及其屬性
            g.add_edge(in_account, out_account, transaction=transaction, block_height=block_height, timestamp=timestamp, amount=amount)
        # 使用networkx和matplotlib畫出有向多重圖
        nx.draw_networkx(g)
        plt.show()
        # 查詢節點及其屬性
        find_nodes_attribute(g)
        # 查詢連邊及其屬性
        find_edges_attribute(g)


# 查詢節點及其屬性
def find_nodes_attribute(g):
    # 遍歷節點
    for idx, nd in enumerate(nx.nodes(g)):
        print(idx)  # 節點序號
        print(nd)  # 節點
        print(g.nodes[nd])  # 節點屬性


# 查詢連邊及其屬性
def find_edges_attribute(g):
    # 遍歷連邊
    for ind, edge in enumerate(nx.edges(g)):
        (u, v) = edge  # 連邊
        eg = g[u][v][0]  # 連邊屬性
        print(edge)  # 查看連邊信息
        print(eg)  # 查看連邊屬性


if __name__ == "__main__":
    main()

五、matplotlib繪製展示

上述代碼利用了matplotlib對數據集的前十條交易進行了繪製,如下圖:
繪製

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章