logo
咨询企业版

周边工具特性讲解

Web3 链上风险分析 Demo 及使用教程

背景

随着加密货币和 DeFi 的快速发展,链上资产转移与洗钱、欺诈等非法活动日益频繁。

传统地址分析往往局限于单地址或单笔交易,难以追踪多层嵌套的资金流向和实体关联。

图数据库能够将链上地址、交易、以及链下身份信息(如设备、IP、邮箱)关联起来,形成完整的风险图谱,帮助监管机构或安全团队识别黑名单地址、追踪资金链路、发现隐蔽团伙。

本 Demo 以 Web3 场景为例,建立包含用户、加密地址、转账关系以及链下信息的图模型,并通过多个查询示例展示如何追踪资金流向、发现与黑名单地址的关联。

点此立即体验

图模型设计

💡实际使用场景中,可对 Schema 进行相应修改与管理,为便于在线体验,本 Demo 暂不支持。

首先创建图类型与图空间,并执行以下语句以定义节点、边结构及属性:

CREATE GRAPH TYPE IF NOT EXISTS `web3_risk_type` AS {
  NODE TYPE `user` (LABEL `user`{`user_id` STRING NOT NULL, `name` STRING DEFAULT NULL, `age` INT64 DEFAULT NULL, `education` STRING DEFAULT NULL, `gender` STRING DEFAULT NULL, `occupation` STRING DEFAULT NULL, `occupation_status` STRING DEFAULT NULL, `is_black_node` BOOL DEFAULT NULL, `zhangli` STRING DEFAULT NULL, `marital_status` STRING DEFAULT NULL, PRIMARY KEY (`user_id`)}),
  NODE TYPE `address` (LABEL `address`{`address` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`address`)}),
  NODE TYPE `card` (LABEL `card`{`card` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`card`)}),
  NODE TYPE `crypto_address` (LABEL `crypto_address`{`crypto_address` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`crypto_address`)}),
  NODE TYPE `email` (LABEL `email`{`email` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`email`)}),
  NODE TYPE `device` (LABEL `device`{`device` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`device`)}),
  NODE TYPE `id_no` (LABEL `id_no`{`id_no` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`id_no`)}),
  NODE TYPE `ip` (LABEL `ip`{`ip` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`ip`)}),
  NODE TYPE `phone` (LABEL `phone`{`phone` STRING NOT NULL, `is_black_node` BOOL DEFAULT NULL, PRIMARY KEY (`phone`)}),
  EDGE TYPE `transfer` (`crypto_address`)-[LABEL `transfer`{}]->(`crypto_address`),
  EDGE TYPE `user_address` (`user`)-[LABEL `user_address`{}]->(`address`),
  EDGE TYPE `user_card` (`user`)-[LABEL `user_card`{}]->(`card`),
  EDGE TYPE `user_crypto_address` (`user`)-[LABEL `user_crypto_address`{}]->(`crypto_address`),
  EDGE TYPE `user_device` (`user`)-[LABEL `user_device`{}]->(`device`),
  EDGE TYPE `user_ip` (`user`)-[LABEL `user_ip`{}]->(`ip`)
}

CREATE GRAPH `web3_risk_graph` :: `web3_risk_type`

1 . 节点

节点类型 标签 核心属性
用户 user user_id, name, age, education, gender, occupation, is_black_node
加密地址 crypto_address crypto_address, is_black_node
IP 地址 ip ip, is_black_node
设备 device device, is_black_node
邮箱 email email, is_black_node
银行卡 card card, is_black_node
身份证 id_no id_no, is_black_node
地址(物理) address address, is_black_node
手机号 phone phone, is_black_node

2.边

边类型 起始节点 → 目标节点 说明
transfer crypto_addresscrypto_address 链上转账关系(资金流向)
user_crypto_address usercrypto_address 用户持有加密地址
user_ip userip 用户关联 IP
user_device userdevice 用户使用设备
user_email useremail 用户绑定邮箱(本 Demo 未使用,但可扩展)
user_card usercard 用户绑定银行卡
user_id_no userid_no 用户绑定身份证(本 Demo 未使用,但可扩展)
user_address useraddress 用户关联物理地址

数据导入

💡💡本 Demo 仅预置约百名用户及数千条关联关系用于体验,实际应用中,数据量可达亿级、百亿级甚至更多,具体可按需配置。

使用 INSERT 语句分别导入用户、加密地址、转账关系等数据。

以下为部分示例:

-- 导入用户节点
TABLE `t_user` { `is_black_node`,`user_id`,`name`,`age`,`education`,`zhangli`,`marital_status`,`gender`,`occupation`,`occupation_status` } = 
(false,"370049199707080851","张忠岚",18,"小学","12","未知","女","产品经理","自由职业"),
(false,"430026199806220831","欧阳玢瑾",15,"初中","27","未知","女","其他","其他"),
...
(false,"410111197709112345","王路",30,"博士","30","未婚","男","医生","在职")
USE `web3_risk_graph`
FOR re IN `t_user`
INSERT (@`user` {`user_id`: re.`user_id`, `name`: re.`name`, `age`: CAST(re.`age` AS INT64), `education`: re.`education`, `gender`: re.`gender`, `occupation`: re.`occupation`, `occupation_status`: re.`occupation_status`, `is_black_node`: CAST(re.`is_black_node` AS BOOLEAN),`zhangli`: re.`zhangli`,`marital_status`:re.`marital_status`})

-- 导入加密地址节点
TABLE `t_crypto_address` { `crypto_address`, `is_black_node` } = 
("0xaad0bfba1a0db3b31ab5dadf3a1d4441deeed4c4",false),
("0xe4fc4c48bd2e9b34520ff7886d42aad4bcabba51",false),
...
("0xd07aad9a3544aa5e02a2f0fce200ecd9fbffbcfb",true)
USE `web3_risk_graph`
FOR re IN `t_crypto_address`
INSERT (@`crypto_address` {`crypto_address`: re.`crypto_address`, `is_black_node`: CAST(re.`is_black_node` AS BOOLEAN)})

关键查询示例

1. 查询用户链上转出后的直接关联用户

目的:给定一个用户,找出其持有的加密地址转出的资金最终流向了哪些其他用户,识别资金上下游关系,关联越紧密则风险等级越高。

USE `web3_risk_graph`
MATCH path=(u@`user`{`user_id`:"450055199805200521"})-[@`user_crypto_address`]->(src@`crypto_address`)-[@`transfer`]->(dst@`crypto_address`)<-[@`user_crypto_address`]-(peer@`user`)
RETURN path

基于图的解释

  • 这张图展示了从用户 450055199805200521 出发的完整资金流转路径:该用户持有的加密地址向另一个地址发起转账,而该接收地址又被其他用户所持有,从而形成了用户之间的间接资金关联。
  • 存在同一接收地址被多个用户持有、多个来源地址向同一目标地址转账的路径,揭示了潜在的团伙共用地址、资金归集或洗钱风险。
  • 如果路径中的任何地址或用户带有黑名单标记(is_black_node: true),则整条链的风险等级将显著升高,需重点排查。

2. 查询与黑名单用户共享 IP 的关联用户

目的:找出所有与某个黑名单用户共用 IP的其他用户,挖掘潜在关联账号。

USE `web3_risk_graph`
MATCH path=(blk@`user`{`user_id`:"220069199106190627"})-[@`user_ip`]->(ipnode@`ip`)<-[@`user_ip`]-(peer@`user`)
RETURN path

基于图的解释:黑名单用户 220069199106190627 与另外两个用户共同使用 15.731.65.74 IP ,可能为同一人/团伙作案,下一步需叠加更多维度以判断团伙风险。

3. 查询用户关联地址在 1-2 跳内触达的黑名单链上地址

目的:检测用户的加密地址是否通过多层转账与已知黑名单地址产生关联。

USE `web3_risk_graph`
MATCH path=(u@`user`{`user_id`:"450055199805200521"})-[@`user_crypto_address`]->(src@`crypto_address`)-[@`transfer`]->{1,2}(risk@`crypto_address`{`is_black_node`:true})
RETURN path

基于图的解释:用户 450055199805200521 的链上地址与黑名单地址存在直接资金往来(1 跳关系),属于高风险关联用户。

4. 追踪用户链上资金多跳流向(1-3 跳)

目的:全面追踪用户资金的流转路径,识别最终汇聚地址或分散模式。

MATCH path=(a@`user`{`user_id`:"450055199805200521"})-[@`user_crypto_address`]->(src@`crypto_address`)-[@`transfer`]->{1,3}(dest@`crypto_address`)
RETURN path

基于图的解释: 该资金流向拓扑图直观展示了 用户 450055199805200521(蓝色节点)名下的资产如何穿过复杂的链上网络进行扩散,绿色节点(关联地址)与黑色直线(转账)代表资金在 1 到 3 跳过程中的扩散与演变轨迹。

  • 密集区域(图中上部): 显示资金在第 1-2 跳时非常活跃,可能存在多地址归集或频繁的分散转账。
  • 稀疏区域(图中下部): 代表资金流向的末端(第 3 跳),这些地址可能是最终的提现点或冷钱包。

5. 链上地址多跳路径追踪

💡建议在 Demo 中,仅查询 5 跳内的路径

目的:针对一个可疑的链上地址,追踪其 5 跳内的资金流转路径。

USE `web3_risk_graph`
MATCH path=(src@`crypto_address`{`crypto_address`:"0xfdf3a4bfdacc3ac7e5ae831a9eb0feeb4b749fbf"})-[@`transfer`]->{5}(dest@`crypto_address`)
RETURN path LIMIT 10

基于图的解释:对资金流向进行长程穿透追踪,展示连续经过 5 次转账移动到深层地址,用于排查那些试图通过多次转账掩盖资金来源的洗钱长链。

图之所以显得疏朗,是因为代码中设置了LIMIT 10,代表从该地址发起的成千上万条路径中,系统只随机或按顺序抽取了10 条典型的长程链路进行展示,避免了视觉过载,便于审计人员逐一剖析。

总结

通过图数据库将链上交易与链下身份信息融合,Web3 风险分析可以实现:

  • 追踪资金流向,发现黑名单地址的间接关联;
  • 识别共用 IP、设备等行为的团伙;
  • 量化地址的风险等级;
  • 支持监管合规与反洗钱调查。

本 Demo 演示了从用户到地址、再到交易流转的核心查询,仅作为简单场景下的 NebulaGraph 使用参考,实际应用中可结合图算法(如 PageRank、社区发现)进一步自动化风险挖掘。