|
### 下载
https://zhuanlan.zhihu.com/p/7500289187
本数据集名为"Bitcoin Research with a Transaction Graph Dataset",由法国巴黎综合理工学院(Ecole Polytechnique, Palaiseau)与Coinshares(巴黎)联合创建。
该数据集以交易图为形式,全面记录了比特币用户间的交易活动,包含2.52亿个节点和7.85亿条边,覆盖了近13年的670万笔交易。每个节点和边均带有时间戳,为研究者提供了丰富的时间序列信息。
数据集的创建过程涉及从比特币区块链中提取交易细节,并采用启发式方法对交易脚本进行聚类,以识别代表真实实体的节点。此外,数据集还包含了基于实体类型的3.3万个节点标签,以及近10万个比特币地址的实体名称和类型标签。
该数据集旨在推动比特币经济网络的深入研究,特别是在分析交易模式、识别风险行为如洗钱、欺诈等方面具有重要应用价值。数据集及其源代码已公开提供,以确保研究结果的可复现性。
---
**数据集介绍**:https://www.selectdataset.com/dataset/43c3245f1c5726f337de9eaf7ccfbcd4
**下载地址**:https://figshare.com/articles/dataset/BitcoinTemporalGraph/26305093
|
|
### 构建方式
比特币交易图数据集的构建基于近13年的比特币交易历史,涵盖了670万笔交易。该数据集以图的形式呈现,包含2.52亿个节点和7.85亿条边,每个节点和边均带有时间戳。
- **节点**:代表比特币网络中的实体,如个人、组织或机构
- **边**:表示这些实体之间的价值转移
**构建流程**:
1. 从比特币区块链中提取所有交易数据
2. 通过聚类算法将相关联的脚本归类为同一实体,从而形成图中的节点
3. 排除 CoinJoin 和彩色币交易,以确保分析的准确性和一致性
|
|
### 特点
比特币交易图数据集具有多个显著特点:
- **最大公开数据集**:是目前公开可用的最大比特币交易数据集,涵盖了广泛的时间跨度和交易量,为深入研究提供了丰富的数据资源
- **时间戳信息**:每个节点和边都带有时间戳,为时间序列分析和动态网络研究提供了可能
- **丰富标签**:包含3.3万个基于实体类型的节点标签和近10万个带有实体名称和类型的比特币地址标签,有助于进行监督学习和分类任务
- **数据质量保障**:构建过程中采用了多种数据清洗和处理技术,确保了数据的质量和可靠性
|
|
### 使用方法
比特币交易图数据集可用于多种研究目的:
1. **图神经网络训练**:利用该数据集进行 GNN 模型的训练和评估,以预测节点标签或识别异常交易模式
2. **时间序列分析**:利用时间戳信息分析比特币网络的动态变化,如节点和边的数量随时间的变化趋势
3. **交互模式研究**:研究不同实体类型之间的交互模式,以及这些交互如何受到政治、经济或金融环境的影响
4. **复现与扩展**:公开可用性为复现研究结果和开展进一步的比特币相关研究提供了便利
|
|
### 背景概述
比特币交易图数据集由 Hugo Schnoering 和 Michalis Vazirgiannis 于2024年创建,旨在解决比特币交易分析中的数据稀缺问题。该数据集包含了252百万个节点和785百万条边,覆盖了近13年的比特币交易数据,是迄今为止最大的公开比特币交易数据集。其核心研究问题在于通过图结构分析比特币用户间的交易模式,以揭示网络的健康状况和增长趋势,同时识别潜在的金融犯罪风险。
### 当前挑战
- **构建挑战**:需要处理庞大的区块链数据,提取相关信息并构建图结构,需要高度专业化的比特币知识
- **分析挑战**:需应对隐私保护和金融犯罪检测的复杂性,如通过 CoinJoin 等技术增加的隐私层
- **标签挑战**:标签生成依赖于外部数据源(如 BitcoinTalk 论坛和 ChatGPT),带来数据准确性和代表性的挑战
### 经典使用场景
通过分析比特币用户之间的交易图,揭示数字经济中的价值流动模式,识别异常交易模式,为网络安全和反洗钱等领域提供有力支持。
### 解决学术问题
解决了现有数据集在比特币研究中的局限性,特别是在数据规模和时间跨度上的不足,促进网络动态变化、异常交易检测和金融犯罪识别等研究。
### 衍生相关工作
催生了大量相关研究工作,特别是在图神经网络(GNN)和金融犯罪检测领域。研究者利用该数据集训练和验证了多种 GNN 模型,如 **GCN**、**GraphSage**、**GAT** 和 **GIN**,以预测节点标签和识别异常交易。
|
|
### 数据概览
该数据集由 Hugo Schnoering 和 Michalis Vazirgiannis 于2025年发布,包含以下文件:
- **dataset.tar.gz**:压缩的 PostgreSQL 数据库,以图的形式存储比特币交易数据
- **addresses.csv**:约 10 万个带标签的比特币地址列表
数据集表示比特币用户之间的价值转移图,**节点**代表实体/用户,**边**代表实体之间的价值转移或交易。该图是**时序的**(temporal)且**有向的**(directed)。
数据库包含两张核心表:
| 表名 | 行数(约) | 说明 |
|------|-----------|------|
| node_features | 2.52 亿 | 节点特征表 |
| transaction_edges | 7.85 亿 | 交易边表 |
|
|
### 节点特征表(node_features)
约 2.52 亿行,每个节点代表一个比特币实体(由多个地址聚类而成)。
**基本属性**:
| 字段 | 说明 |
|------|------|
| `alias` | 节点标识符 |
| `label` | 节点所代表实体的类型标签 |
**度数信息**:
| 字段 | 说明 |
|------|------|
| `degree` | 节点的度 |
| `degree_in` | 入度(接收边数) |
| `degree_out` | 出度(发送边数) |
**交易计数**:
| 字段 | 说明 |
|------|------|
| `total_transaction_in` | 接收的价值转移总次数 |
| `total_transaction_out` | 发起的价值转移总次数 |
**交易金额**(单位:聪,1 聪 = $10^{-8}$ 比特币):
| 字段 | 说明 |
|------|------|
| `min_sent` | 单笔最小发送金额 |
| `max_sent` | 单笔最大发送金额 |
| `total_sent` | 累计发送总金额 |
| `min_received` | 单笔最小接收金额 |
| `max_received` | 单笔最大接收金额 |
| `total_received` | 累计接收总金额 |
**时间信息**(以区块索引表示):
| 字段 | 说明 |
|------|------|
| `first_transaction_in` | 首次接收交易的区块索引 |
| `last_transaction_in` | 最后一次接收交易的区块索引 |
| `first_transaction_out` | 首次发送交易的区块索引 |
| `last_transaction_out` | 最后一次发送交易的区块索引 |
**聚类信息**(节点可包含多个地址):
| 字段 | 说明 |
|------|------|
| `cluster_size` | 节点包含的地址数量 |
| `cluster_num_edges` | 节点内部地址之间的交易数 |
| `cluster_num_cc` | 节点内部地址交易图中的连通分量数 |
| `cluster_num_nodes_in_cc` | 聚类中非孤立地址的数量 |
|
|
### 交易边表(transaction_edges)
约 7.85 亿行,记录节点之间的价值转移关系。
| 字段 | 说明 |
|------|------|
| `a` | 发送方节点标识(alias) |
| `b` | 接收方节点标识(alias) |
| `reveal` | 从 a 到 b 首笔交易的区块索引 |
| `last_seen` | 从 a 到 b 末笔交易的区块索引 |
| `total` | 从 a 到 b 的交易总次数 |
| `min_sent` | 单笔最小发送金额(聪) |
| `max_sent` | 单笔最大发送金额(聪) |
| `total_sent` | 累计发送总金额(聪) |
|
|
### 地址标签文件(addresses.csv)
该文件包含 **103,812** 个带标签的比特币地址,字段如下:
| 字段 | 说明 |
|------|------|
| `address` | 比特币地址 |
| `entity` | 实体名称 |
| `category` | 实体类型 |
| `source` | 标签来源 |
**实体类型(category)** 包括:
- **exchange**:交易所
- **mining**:矿池
- **gambling**:赌博
- **marketplace**:市场平台
- **ransomware**:勒索软件
- **ponzi**:庞氏骗局
- **mixer**:混币器
- **faucet**:水龙头
- **bridge**:跨链桥
- **bet**:博彩
- **individual**:个人
|
|
### 导入 PostgreSQL 数据库
**1. 解压数据集**:
```bash
pigz -p 10 -dc dataset.tar.gz | tar -xvf -
```
**2. 恢复到 PostgreSQL 数据库**:
```bash
pg_restore -j <并行任务数> -Fd -O -U <用户名> -d <数据库名> dataset
```
**参数说明**:
| 参数 | 说明 |
|------|------|
| `-j` | 并行任务数,加快恢复速度 |
| `-Fd` | 指定目录格式输入 |
| `-O` | 不恢复对象所有权 |
| `-U` | 数据库用户名 |
| `-d` | 目标数据库名 |
**3. 存储空间要求**:
| 表 | 空间(含索引) |
|----|---------------|
| node_features | 约 40 GB |
| transaction_edges | 约 80 GB |
> **注意**:导入前请确保数据库服务器有足够的磁盘空间(至少 **120 GB** 可用),建议使用 SSD 存储以获得更好的查询性能。
|
import torch
from torch_geometric.datasets import Reddit # 任意图数据集均可
from torch_geometric.loader import NeighborLoader # NeighborLoader 内部会优先使用 pyg-lib
# 1. 加载一张图
dataset = Reddit(root='/wks/datasets/Reddit') # 第一次会自动下载
data = dataset[0]
# 2. 构造采样器(等价于旧版 NeighborSampler)
train_loader = NeighborLoader(
data,
num_neighbors=[25, 10], # 两层卷积:第1层25邻居,第2层10邻居
batch_size=1024, # 每次 1024 个目标节点
input_nodes=data.train_mask, # 只针对训练集节点采样
shuffle=True,
num_workers=4
)
# 3. 训练循环示例
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
for batch in train_loader:
# batch 是 Data 对象
batch = batch.to(device)
# batch.x : 子图节点特征
# batch.edge_index: 子图边
# batch.batch_size: 当前 batch 中的目标节点数(前 batch_size 个)
# batch.n_id : 子图节点在原图中的全局 id(用于特征索引)
# 这里可以接你自己的 GNN 模型
# out = model(batch.x, batch.edge_index)[:batch.batch_size]
# ...
|
|
|
|
|
|
|
|