本指南介绍了将比特币区块链导入Neo4j图形数据库的基本步骤。
整个过程只是从一种格式(区块链数据)中获取数据,并将其转换为另一种格式(图形数据库)。唯一能使这件事比典型的数据转换稍微复杂一点的是,在开始之前需要去理解比特币数据的结构。
但是,一旦将区块链导入Neo4j,就可以对图形数据库执行SQL数据库无法实现的分析。例如,你可以按照比特币的路径查看是否连接了两个不同的地址:
在本指南中,我将介绍:
1.比特币如何运作,以及区块链是什么。
2.区块链数据是什么样的。
3.如何将区块链数据导入Neo4j。
这不是关于如何编写自己的导入工具的完整教程。但是,如果你有兴趣,可以在GitHub上找到我的比特币到neo4j代码,虽然我确信你在阅读本指南后可以写一些更干净的东西。
1.什么是比特币?
比特币是一个计算机程序。
这有点像uTorrent;你运行程序,它连接到运行相同程序的其他计算机,它共享一个文件。然而,比特币的酷炫之处在于任何人都可以向此共享文件添加数据,并且已经写入文件的任何数据都不会被篡改。
因此,比特币创建了一个在分布式网络上共享的安全文件。
你能用这个做什么?
在比特币中,添加到该文件的每个数据都是一个交易。 因此,该去中心化的文件被用作数字货币(即加密货币)的“分类帐”。
该分类帐称为区块链。
我在哪里可以找到区块链?
如果你运行比特币核心程序bitcoin core,区块链将存储在你计算机的文件夹中:
Linux:
Windows:
Mac:
当你打开此目录时,你应该注意到,你将找到多个名为blkXXXXX.dat的文件,而不是一个大文件。这是区块链数据,但是分成多个较小的文件。
2.区块链看起来像什么?
blk.dat文件包含块和交易的序列化数据。
区块
区块由magic bytes分隔,然后是即将到来的块的大小。
然后每个区块以一个block header开头:
区块基本上是交易列表的容器。区块头header就像顶部的元数据。
区块头示例:
交易
在区块头之后,有一个字节告诉你区块中即将发生的交易数。之后,你将获得一个接一个的序列化交易数据。
交易只是另一段代码,但它们在结构上更有趣。
每个交易都具有相同的模式:
1.选择输出(我们称之为输入)。
解锁这些输入以便可以使用它们。
2.创建输出。
将这些输出锁定到一个新地址。
因此,在一系列交易之后,你有一个看起来像这样的交易结构:
这是区块链的简化图。如你所见,它看起来像一个图表。
交易示例:
3.如何将区块链导入Neo4j
那么,现在我们知道区块链数据代表什么(并且它看起来很像图表),我们可以继续将其导入Neo4j。我们这样做:
通过文件阅读。
解码我们遇到的每个块和交易。
将解码的块/交易转换为Cypher查询。
这是我如何在数据库中表示区块,交易和地址的可视指南:
区块
创建一个节点,并将其连接到它构建的前一个区块。
将区块头中的每个字段设置为此节点上的属性。
创建一个节点关闭每个区块,因为它表示区块提供的“新”比特币。
在此节点上设置value属性,该属性等于此区块的区块奖励。
交易
创建一个节点,并将其连接到我们刚创建的。
此节点上的SET属性(版本,锁定时间)。
MERGE现有节点并将它们[:in]与相关联。
将解锁代码设置为关系上的属性。
创建一个新,这是交易创建的输出节点。
在这些节点上设置相应的值和锁定代码。
地址
如果上的锁定代码包含地址…
创建一个节点,并将输出节点连接到它。
将地址设置为此节点上的属性。
注意:如果不同的输出连接到同一地址,则它们将连接到同一地址节点。
4.Cypher查询
以下是一些Cypher示例查询,你可以将这些查询用于将区块和交易插入到Neo4j中。
注意:你需要解码区块头和交易数据以获取Cypher查询的参数。
区块
参数示例:
交易
注意:此查询使用FOREACH hack,它充当条件,并且只有在参数实际包含地址(即,如果它不为空)时才会创建节点。
参数示例:
5.结果
如果你使用上面的Cypher查询插入了块和交易,那么这些是你可以从图形数据库中获得的结果的一些示例。
块
交易
地址
路径
在比特币区块链的图形数据库中查找交易和地址之间的路径可能是最有趣的事情,所以这里有一些Cypher查询的例子:
在输出之间
地址之间
结论
这是一个关于如何从文件(区块链)获取区块和交易并将它们导入Neo4j数据库的简单指南。
如果你希望对区块链进行严格的图形分析,我认为这是值得的。图形数据库自然适合比特币数据,而使用SQL数据库进行比特币交易感觉就像试图将方形钉推入圆孔一样。
我试图保持这个指南紧凑,所以我没有涵盖如下内容:
1.通过区块链阅读。读取文件很简单。但是,关于这些文件的烦人之处在于区块不按顺序写入这些文件,这使得在区块上设置高度或计算交易的费用有点棘手(但你可以围绕它编写代码)。
2.解码区块和交易。如果要使用上面的Cypher查询,则需要通过解码块头和原始交易数据来获取所需的参数。你可以编写自己的解码器,也可以尝试使用现有的比特币库。
3.Segwit(Segregated Witness)隔离认证。我只给了一个Cypher查询“原始”样式的交易,这是在481,824块之前使用的唯一交易结构。但是,segwit交易的结构只是略有不同(但可能需要自己的Cypher查询)。
尽管如此,希望本指南有所帮助。
但与往常一样,如果你了解数据的工作原理,将其转换为不同的格式只需要坐下来编写工具。
领取专属 10元无门槛券
私享最新 技术干货