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

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

下载imtoken钱包 2023-03-12 07:42:17

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

一、准备工作

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

二、构建比特币区块链数据模型

比特币数据库在哪

要分析区块链数据,你必须了解区块链的数据模型。我研究了一下比特币数据库在哪,可以总结出4个实体:块、交易、输入、输出。关系是一个区块对应多个交易,一个交易对应多个输入和多个输出。除了 Coinbase 的输入之外,一个输入对应于另一个交易中的一个输出。所以我们可以画出如下数据模型:

需要指定一些点:

1.TxId 它是一个自动递增的 int。我没有使用 TxHash 作为 Transaction 的 PK比特币数据库在哪,因为 TxHash 根本不是唯一的!不同的区块有几笔交易,也就是Coinbase的交易是一样的。这其实应该是异常数据,因为同一个TxHash只会用一次,所以这个矿工有杯。

比特币数据库在哪

2.对于共同的交易,输入预先XID为000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来不起。

3. For blocks, preid is the ID of the previous block, and the preid of the creation block is 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000? .

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

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

比特币数据库在哪

  1. View Code 

三、将区块链数据导出为 CSV

数据模型可用,接下来就是创建对应的表,然后编写程序将Bitcoin Block写入数据库。我最初使用EntityFramework来实现插入数据库的操作。但是后来发现太慢了。插入一个块甚至需要超过 10 到 20 秒,插入它的年份和月份!尝试了各种方案,比如写原生SQL,使用事务,使用LINQToSQL等等,性能都不理想。 ***终于找到了一个好办法,就是直接导出成文本文件(比如CSV格式),然后用SQL Server的Bulk Insert命令实现批量导入,这是我知道最快的写法数据库。

开源库NBitcoin用于解析Bitcoin Core下载的所有比特币区块链数据。只需使用其中的 BlockStore 类即可轻松解析区块链数据。

比特币数据库在哪

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

  1. View Code 

至于WriteBitcoin2Csv方法,是一定的Format,只需将Block、Trans、TxInput、TxOutput这四个对象写入四个文本文件即可。

四、将 CSV 导入 SQL Server

比特币数据库在哪

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

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

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

***,附上我正在导入的过程的图片。导入一天了,还没完成。估计还要一、两天。

image

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