主页 > 安卓版imtoken下载 > 如何将比特币区块链数据导入关系数据库

如何将比特币区块链数据导入关系数据库

安卓版imtoken下载 2023-05-17 07:04:27

在接触了比特币和区块链之后,我一直有一个想法,就是把比特币的所有区块链数据放到一个关系型数据库(比如SQL Server)中,然后作为比特币交易的数据仓库进行各种分析数据的。 这个想法由来已久,但一直没有付诸实施。 最近正好有一点时间,就写了一个比特币区块链的导出导入程序。

我之前的博客:区块链上的告白——用C#在比特币区块链中放一句话介绍了如何发起比特币交易。 今天我们还是用C#+NBitcoin,读取Bitcoin Core本地下载的全量区块链数据比特币跟区块链的关系,并将数据写入数据库。 如果有和我想法一样的朋友,可以参考下面是我的操作过程:

一、准备工作

我们要分析的是本地硬盘上Bitcoin Core钱包存储的比特币全量数据比特币跟区块链的关系,所以首先要下载安装Bitcoin Core,下载地址:然后等待软件同步区块链数据. 目前比特币的区块链数据约为130G,因此可能需要几天甚至一周的时间才能将所有区块链数据同步到本地。 当然,如果你很早就安装了这个软件,那就太好了。 毕竟要等几天甚至一周,真的很痛苦。

2.建立比特币区块链数据模型

分析区块链数据,需要了解区块链的数据模型。 我做了一些研究,可以总结出 4 个实体:区块、交易、输入和输出。 关系是一个区块对应多笔交易,一笔交易对应多笔输入和多笔输出。 除了 Coinbase 的输入外,一个输入对应另一个交易中的一个输出。 于是我们可以得到如下数据模型:

image

需要特别说明的几点是:

1、TxId是一个自增的int,我没有用TxHash作为Transaction的PK,那是因为TxHash根本不唯一! 不同区块有几笔第一笔交易,即Coinbase交易相同。 这其实应该是异常数据,因为同一个TxHash只能花费一次,所以这个矿工是个灾难。

2.对于共同交易,输入预示为000000000000000000000000000000000000000000000000000000000000000000000000000000,其preoutIndex为-1。 这是一个不存在的TxOutput,所以我没有在TXInput和TxOutput之间建立外键关联。

3.对于一个块,preid是上一块块的ID,而创世纪块的preid是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000 .

4. 有很多字段实际上并不在区块链数据结构中。 这些字段是我加的,方便以后分析。 导入时没有值,需要经过一定的SQL操作才能获取。 例如Trans中的TotalInAmount、TransFee等。

我使用 PowerDesigner。 建模完成后,生成SQL语句。 这是我的表创建 SQL:

区块链和比特币之间的关系_比特币跟区块链的关系_区块链技术和比特币

查看代码

3.将区块链数据导出为CSV

数据模型有了,接下来就是创建对应的表,然后写程序把比特币块写入数据库。 我本来是用EntityFramework来实现插入数据库的操作的。 但是后来发现太慢了,我什至要等10到20秒才能插入一个Block,还要等到哪年哪月再插入! 我尝试了各种方案,比如写原生SQL,使用事务,使用LINQToSQL等等,但是性能并不理想。 最后终于找到了一个好办法,就是直接导出为文本文件(比如CSV格式),然后使用SQL Server的Bulk Insert命令实现批量导入。 这是我知道写入数据库的最快方式。

开源库 NBitcoin 用于分析 Bitcoin Core 下载的所有比特币区块链数据。 只需要使用BlockStore类,就可以轻松实现区块链数据的解析。

这是我将区块链数据解析为我们的 Block 对象的代码:

区块链和比特币之间的关系_比特币跟区块链的关系_区块链技术和比特币

查看代码

至于WriteBitcoin2Csv方法,就是将Block、Trans、TxInput、TxOutput这4个对象以一定的格式写到4个文本文件中。

4. 将 CSV 导入 SQL Server

完成CSV文件的导出后,下一步就是如何将CSV文件导入到SQL Server中。 这个很简单,执行BULK INSERT命令即可。 例如,这是我在测试中使用的 SQL 语句:

bulk insert [Block] from 'F:\temp\blk205867.csv'; 
bulk insert Trans from 'F:\temp\trans205867.csv'; 
bulk insert TxInput from 'F:\temp\input205867.csv'; 
bulk insert TxOutput from 'F:\temp\output205867.csv';

当然,实际上我并没有那样做。 我每1000个Block生成4个csv文件,然后用C#连接数据库,执行批量插入命令。 执行完成后,删除生成的4个csv文件,然后继续循环导出下一批1000个Block。 因为比特币的区块链数据太大了,如果我不分批的话,那我的PC硬盘就不够用了,我怀疑我在导入SQL Server的时候能不能导入这么大的数据。

最后,附上我正在导入的流程图。 导入了一天,还没完成。 可能还需要一两天。

image

区块链数据全部进入数据库后,我要发挥想象力,看看能分析出什么有趣的结果。