Skip to content

Latest commit

Β 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

BlockETL - 블둝체인 μ˜¨ν†¨λ‘œμ§€ 기반 μ§€μ‹κ·Έλž˜ν”„ μ‹œμŠ€ν…œ

Ethereum 블둝체인 데이터λ₯Ό ETL νŒŒμ΄ν”„λΌμΈμœΌλ‘œ μˆ˜μ§‘ν•˜μ—¬ Neo4j κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€μ— μ§€μ‹κ·Έλž˜ν”„λ‘œ κ΅¬μΆ•ν•˜κ³ , 이λ₯Ό ν™œμš©ν•œ 뢄석 APIλ₯Ό μ œκ³΅ν•˜λŠ” Kotlin/Spring Boot 기반 λ°±μ—”λ“œ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ ꡬ쑰

blocketl/
β”œβ”€β”€ blockinfra/                    # 인프라 μ„€μ •
β”‚   β”œβ”€β”€ docker-compose.yml         # Docker Compose μ„€μ •
β”‚   β”œβ”€β”€ neo4j/                     # Neo4j μ΄ˆκΈ°ν™” 슀크립트
β”‚   β”œβ”€β”€ postgres/                  # PostgreSQL μ΄ˆκΈ°ν™” 슀크립트
β”‚   β”œβ”€β”€ start.sh                   # 인프라 μ‹œμž‘ 슀크립트
β”‚   β”œβ”€β”€ stop.sh                    # 인프라 쀑지 슀크립트
β”‚   └── README.md                  # 상세 λ¬Έμ„œ
β”‚
β”œβ”€β”€ src/main/kotlin/com/jun/blocketl/
β”‚   β”œβ”€β”€ domain/                    # 도메인 λͺ¨λΈ
β”‚   β”‚   β”œβ”€β”€ blockchain/            # 블둝체인 데이터 λͺ¨λΈ
β”‚   β”‚   β”œβ”€β”€ graph/                 # Neo4j κ·Έλž˜ν”„ λ…Έλ“œ λͺ¨λΈ
β”‚   β”‚   └── meta/                  # PostgreSQL 메타데이터 λͺ¨λΈ
β”‚   β”‚
β”‚   β”œβ”€β”€ repository/                # 데이터 μ ‘κ·Ό 계측
β”‚   β”‚   β”œβ”€β”€ graph/                 # Neo4j Repository
β”‚   β”‚   └── meta/                  # JPA Repository
β”‚   β”‚
β”‚   β”œβ”€β”€ etl/                       # ETL νŒŒμ΄ν”„λΌμΈ
β”‚   β”‚   β”œβ”€β”€ EthereumEtlService.kt  # 블둝체인 데이터 μˆ˜μ§‘
β”‚   β”‚   └── GraphBuilderService.kt # κ·Έλž˜ν”„ λΉŒλ“œ
β”‚   β”‚
β”‚   β”œβ”€β”€ service/                   # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”œβ”€β”€ GraphQueryService.kt   # κ·Έλž˜ν”„ 쿼리
β”‚   β”‚   └── AmlAnalysisService.kt  # AML 뢄석
β”‚   β”‚
β”‚   β”œβ”€β”€ api/                       # REST API
β”‚   β”‚   β”œβ”€β”€ BlockchainGraphController.kt
β”‚   β”‚   β”œβ”€β”€ AmlController.kt
β”‚   β”‚   └── EtlController.kt
β”‚   β”‚
β”‚   └── config/                    # μ„€μ •
β”‚       β”œβ”€β”€ Neo4jConfig.kt
β”‚       β”œβ”€β”€ KafkaConfig.kt
β”‚       β”œβ”€β”€ CacheConfig.kt
β”‚       └── OpenApiConfig.kt
β”‚
└── src/main/resources/
    └── application.yml             # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •

λΉ λ₯Έ μ‹œμž‘

1. 인프라 μ‹€ν–‰

cd blockinfra
./start.sh

λ˜λŠ” Windowsμ—μ„œ:

cd blockinfra
docker-compose up -d

2. Ethereum RPC μ„€μ •

src/main/resources/application.yml νŒŒμΌμ„ μ—΄κ³  Alchemy API Keyλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€:

blockchain:
  etl:
    ethereum:
      rpc-url: https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_KEY

무료 API Key λ°œκΈ‰: https://www.alchemy.com/

3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

./gradlew bootRun

4. API 접속

μ£Όμš” κΈ°λŠ₯

1. 블둝체인 ETL νŒŒμ΄ν”„λΌμΈ

Ethereum λΈ”λ‘μ²΄μΈμ—μ„œ 블둝과 νŠΈλžœμž­μ…˜ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ν•©λ‹ˆλ‹€.

# 블둝 동기화 μ‹œμž‘
POST http://localhost:8080/api/v1/etl/sync/start?startBlock=0&endBlock=1000

# 동기화 재개
POST http://localhost:8080/api/v1/etl/sync/resume

μž‘λ™ 방식:

  1. Web3jλ₯Ό 톡해 Ethereum RPCμ—μ„œ 블둝 데이터 쑰회
  2. Kafka둜 블둝/νŠΈλžœμž­μ…˜ 이벀트 λ°œν–‰
  3. GraphBuilderServiceκ°€ 이벀트λ₯Ό μ†ŒλΉ„ν•˜μ—¬ Neo4j에 κ·Έλž˜ν”„ ꡬ좕
  4. PostgreSQL에 체크포인트 및 메타데이터 μ €μž₯

2. μ§€μ‹κ·Έλž˜ν”„ 기반 뢄석

Neo4j κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν™œμš©ν•œ κ³ κΈ‰ 뢄석 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ£Όμ†Œ 뢄석

# μ£Όμ†Œ 정보 쑰회
GET /api/v1/graph/address/0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb

# μ—°κ΄€ μ£Όμ†Œ μ°ΎκΈ° (2-hop)
GET /api/v1/graph/address/{address}/connected?maxHops=2

자금 흐름 좔적

# 두 μ£Όμ†Œ κ°„ 자금 이동 뢄석
GET /api/v1/graph/flow?fromAddress=0x...&toAddress=0x...

μ—”ν‹°ν‹° 뢄석

# μ—”ν‹°ν‹° 정보 쑰회 (κ±°λž˜μ†Œ, DeFi ν”„λ‘œν† μ½œ λ“±)
GET /api/v1/graph/entity/{entityId}

# μ—”ν‹°ν‹°κ°€ μ†Œμœ ν•œ λͺ¨λ“  μ£Όμ†Œ
GET /api/v1/graph/entity/{entityId}/addresses

3. AML (μžκΈˆμ„Ένƒ λ°©μ§€) 뢄석

블둝체인 μ£Όμ†Œμ˜ μžκΈˆμ„Ένƒ μœ„ν—˜λ„λ₯Ό μžλ™μœΌλ‘œ ν‰κ°€ν•©λ‹ˆλ‹€.

# μ£Όμ†Œ μœ„ν—˜λ„ 평가
POST /api/v1/aml/evaluate/0x...

# κ³ μœ„ν—˜ μ£Όμ†Œ λͺ©λ‘
GET /api/v1/aml/high-risk?minScore=70.0

μœ„ν—˜λ„ 평가 μš”μ†Œ:

  • λ―Ήμ„œ/ν…€λΈ”λŸ¬ μ‚¬μš© μ—¬λΆ€
  • 제재 λŒ€μƒ μ—”ν‹°ν‹° μ—°κ΄€μ„±
  • 비정상적인 거래 νŒ¨ν„΄
  • κ³ μœ„ν—˜ μ£Όμ†Œμ™€μ˜ μ—°κ²°μ„±
  • 계정 ν™œλ™ κΈ°κ°„ 및 κ±°λž˜λŸ‰

기술 μŠ€νƒ

μΉ΄ν…Œκ³ λ¦¬ 기술
μ–Έμ–΄ Kotlin 2.2.21
ν”„λ ˆμž„μ›Œν¬ Spring Boot 4.0.1
κ·Έλž˜ν”„ DB Neo4j 5.15.0
κ΄€κ³„ν˜• DB PostgreSQL 16
λ©”μ‹œμ§€ 브둜컀 Apache Kafka 7.5.3
μΊμ‹œ Redis 7.2
블둝체인 Web3j 4.10.3 (Ethereum)
API λ¬Έμ„œ SpringDoc OpenAPI 3

데이터 λͺ¨λΈ

Neo4j κ·Έλž˜ν”„ μ˜¨ν†¨λ‘œμ§€

(Block)-[:CONTAINS]->(Transaction)
(Transaction)-[:FROM]->(Address)
(Transaction)-[:TO]->(Address)
(Address)-[:BELONGS_TO]->(Entity)
(Entity)-[:OWNS]->(Address)

λ…Έλ“œ νƒ€μž…:

  • Block: 블둝 정보
  • Transaction: νŠΈλžœμž­μ…˜
  • Address: μ£Όμ†Œ (EOA, Contract, Exchange, DeFi λ“±)
  • Entity: μ‹€μ œ μ†Œμœ μž/쑰직
  • Contract: 슀마트 μ»¨νŠΈλž™νŠΈ
  • Token: ERC20/ERC721 토큰

μ‚¬μš© 사둀

1. κ±°λž˜μ†Œ μž…μΆœκΈˆ λͺ¨λ‹ˆν„°λ§

// Neo4j: νŠΉμ • κ±°λž˜μ†Œλ‘œμ˜ λŒ€κ·œλͺ¨ μž…κΈˆ μ°ΎκΈ°
MATCH (from:Address)-[:SENT]->(tx:Transaction)-[:TO]->(exchange:Address)
WHERE exchange.label = 'Binance Hot Wallet'
  AND toFloat(tx.value) > 100000000000000000000  // > 100 ETH
  AND tx.timestamp >= datetime('2024-01-01')
RETURN from, tx, exchange
ORDER BY tx.value DESC

2. μžκΈˆμ„Ένƒ νŒ¨ν„΄ 탐지

// Neo4j: λ ˆμ΄μ–΄λ§ νŒ¨ν„΄ 탐지 (닀단계 자금 λΆ„μ‚°)
MATCH path = (start:Address)-[:SENT*3..5]->(end:Address)
WHERE start.address = '0x...'
  AND ALL(r IN relationships(path) WHERE toFloat(r.value) > 1000000000000000000)
RETURN path

3. DeFi ν”„λ‘œν† μ½œ μ‚¬μš©μž 뢄석

// Neo4j: Uniswap μ‚¬μš©μž 쀑 κ³ μ•‘ 거래자 μ°ΎκΈ°
MATCH (user:Address)-[:SENT]->(tx:Transaction)-[:TO]->(uniswap:Address)
WHERE uniswap.label CONTAINS 'Uniswap'
WITH user, SUM(toFloat(tx.value)) as totalVolume
WHERE totalVolume > 10000000000000000000  // > 10 ETH
RETURN user, totalVolume
ORDER BY totalVolume DESC

μ„±λŠ₯ μ΅œμ ν™”

  • Redis 캐싱: 자주 μ‘°νšŒλ˜λŠ” μ£Όμ†Œ 정보 및 κ·Έλž˜ν”„ 쿼리 κ²°κ³Ό 캐싱
  • 배치 처리: 100블둝 λ‹¨μœ„ 배치둜 ETL 처리
  • Circuit Breaker: Resilience4jλ₯Ό ν™œμš©ν•œ RPC μž₯μ•  λŒ€μ‘
  • 비동기 처리: Coroutine 기반 비동기 ETL νŒŒμ΄ν”„λΌμΈ

λͺ¨λ‹ˆν„°λ§

# Health Check
GET /actuator/health

# Metrics (Prometheus)
GET /actuator/prometheus

# ETL μƒνƒœ 확인
GET /api/v1/etl/status

개발 ν™˜κ²½

ν…ŒμŠ€νŠΈ μ‹€ν–‰

./gradlew test

λΉŒλ“œ

./gradlew build

JAR μ‹€ν–‰

java -jar build/libs/blocketl-0.0.1-SNAPSHOT.jar

λΌμ΄μ„ΌμŠ€

Apache License 2.0

참고 자료

βœ… Kotlin/Spring Boot 기반 λ°±μ—”λ“œ 개발 βœ… Neo4j κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€ ν™œμš© βœ… 블둝체인 ETL νŒŒμ΄ν”„λΌμΈ ꡬ좕 βœ… μ˜¨ν†¨λ‘œμ§€ λͺ¨λΈλ§ (μ—”ν‹°ν‹°, 관계 μ •μ˜) βœ… AML 뢄석 κΈ°λŠ₯ κ΅¬ν˜„ βœ… Kafka 이벀트 슀트리밍

핡심 강쑰점

  1. ETL νŒŒμ΄ν”„λΌμΈ: "λ…Έλ“œ/ETL이 λ§Œλ“  κ·Έλž˜ν”„/지식 λ ˆμ΄μ–΄"λ₯Ό μ–΄λ–»κ²Œ κ΅¬μΆ•ν•˜λŠ”μ§€ μ„€λͺ…
  2. κ·Έλž˜ν”„ ν™œμš©: "κ·Έλž˜ν”„DBλ₯Ό μ–΄λ–»κ²Œ Spring 기반 μ„œλΉ„μŠ€λ‘œ κ°μŒ€ 수 μžˆλŠ”μ§€" - Cypher 쿼리, Repository νŒ¨ν„΄
  3. 싀무 μ μš©μ„±: AML, μ£Όμ†Œ 라벨링, μ—”ν‹°ν‹° ν΄λŸ¬μŠ€ν„°λ§ λ“± μ‹€μ œ μœ μŠ€μΌ€μ΄μŠ€

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages