利用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对数据集的前十条交易进行了绘制,如下图:
绘制

扫描二维码关注公众号,回复: 12426397 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_47935193/article/details/113446570