Decentralized Finance(DeFi)는 블록체인과 암호화폐를 사용해서 전통적인 금융(TradFi)을 복제하고 대체하려는 움직임이에요.
오늘은 빌려주고, 빌리고, 스왑하고, 마진 거래까지 할 수 있고, 심지어 자신만의 미니 헤지펀드를 체인에 만들 수도 있어요. 이 모든 게 허가 없이, 신뢰할 필요 없이 가능하다니 정말 놀랍죠?
대부분의 DeFi는 이더리움에서 이루어지고 있어요. 주목할 만한 예외 중 하나는 Sovryn 프로토콜인데, Rootstock 사이드체인 RSK를 통해 금융 기본 요소를 비트코인에 도입했답니다.
오늘 제가 다룰 프로젝트는 Graph Database인 Neo4j를 사용해서 Sovryn 프로토콜의 Knowledge Graph를 생성하는 거예요.
제 목표는 다음과 같아요.
- Sovryn 프로토콜이 실제로 어떻게 작동하는지 알아보는 거예요. 블록체인과 DeFi는 정말 빠르게 발전하고 있어서, 도구의 발전 속도보다 더 빠르거든요. 문서를 읽은 후에 해야 할 일은 소스 코드를 읽어보는 것, 스마트 컨트랙트를 살펴보거나 원시 블록 수준 데이터를 보는 건데, 둘 다 어렵고 직관적이지 않아요. 특히 이 분야를 처음 접하는 개발자에게는 더더욱 그렇겠죠.
- Sovryn에 대한 강력한 데이터 세트를 얻어 보세요. 프로토콜의 활동을 이해하고 싶은데 개발자가 공식 앱에서 답변을 제공하지 않는다면 블록 데이터를 파헤쳐야 하죠. 이건 좀 투박하고, 많은 데이터가 사람이 읽기 어렵게 되어 있어요. 게다가 데이터 요약을 얻는 것도 쉽지 않고요. 이 transaction은 스왑을 설명하는데, 비트코인(기술적으로 WRBTC)과 스테이블 코인 테더(Tether) 사이의 스왑이에요. 그런 transaction을 모두 찾고 싶다면 어떻게 해야 할까요? 오늘은 전체 체인을 다운로드하고 ABI와 상호 작용해야 할 거예요. 블록체인 개발 대신 데이터 과학에 시간을 쏟고 싶다면 이는 심각한 진입 장벽이 되겠죠.
체인 그래프 그리기
블록체인 데이터의 Knowledge Graph를 생성하려면 몇 가지 다른 유형의 Node만 정의하면 돼요. Block, Transaction, Address, Token, Contract, 그리고 LogEvent죠. Token과 Contract는 Address의 하위 유형이에요. 엄밀히 말하면 Token과 Contract가 꼭 필요한 건 아니지만, 사람이 무슨 일이 일어나고 있는지 이해하도록 돕는 데는 확실히 편리하답니다.
각 Block은 0개 이상의 Transaction을 CONTAIN하게 될 거예요. Transaction은 많은 활동이 이루어지는 곳이죠. 각 transaction은 한 Address에서 from되고 다른 사람에게 있을 수도 있어요. 이 Address가 알려진 것을 설명하는 경우 Tokens 또는 Contract라면 해당 정보가 입력될 거예요.
각 transaction에는 하나 이상의 LogEvent가 있어요. 이러한 이벤트는 각각 다양한 Address(또는 토큰 또는 계약)를 CALLS하죠. 이 Knowledge Graph를 만들 때 여러 ABI를 구문 분석하여 각 Knowledge Graph의 정보를 CALLS해요.
그 결과 블록체인의 모든 풍부함을 포착할 수 있는 간단한 스키마가 탄생했어요! 정말 만족스럽죠!
지식 정보 빠르게 둘러보기
저와 함께 투어를 하고 싶으시다면, 저장소를 확인해 보세요. 또는 동영상 둘러보기도 있답니다.
한 가지 목표는 프로토콜의 데이터를 Python으로 직접 로드하는 것이에요.
이를 위해 Neo4j 세션 주위에 래퍼를 배치하여 약간의 구문을 제공했어요. 쿼리를 직접 입력할 수 있는 knowledge_graph.Query 객체죠. 먼저 사용 가능한 데이터가 있는 몇 가지 블록을 살펴볼까요?
from sovrynkg.knowledge_graph import Query
q = Query()
q.add("MATCH (b:Block) RETURN b.height as height ORDER BY height LIMIT 10")
q.data()
[{'height': 2742418},
{'height': 2742441},
{'height': 2742445},
{'height': 2742446},
{'height': 2742448},
{'height': 2742450},
{'height': 2742451},
{'height': 2742453},
{'height': 2742457},
{'height': 2742460}]
2742418은 모든 것이 시작된 곳이에요. 해당 블록의 transaction을 살펴볼게요. 해당 데이터를 가져오는 Cypher 쿼리는 다음과 같아요.
MATCH (b:Block)-[:CONTAINS]->(tx:Transaction)-[:HAS_EVENT]->
(le:LogEvent)-[:CALLS]-(addy:Address)
WHERE b.height=2742418
RETURN b, tx, le, addy
암호 해독: 이는 주어진 블록 높이를 가진 블록을 찾고, 또한 Transaction, LogEvent, 그리고 어떤 Address와 연결되어 있는지 찾는 쿼리예요 (기억하세요, Token과 Contract 또한 Address랍니다).
CALLS 관계를 검사해 보세요.
"name": "OwnershipTransferred",
"newOwner": "0x7be508451cd748ba55dcbe75c8067f9420909b49",
"previousOwner: "0x0000000000000000000000000000000000000000"
The첫 번째 거래Sovryn 프로토콜에서는 계약을 생성합니다. RSK 계약은 소유자로부터 소유권을 "이전"함으로써 생성됩니다.null주소.
그래서 뭐죠? 나는 돈 때문에 여기 있어요
돈을 쫓아보자구요. 합리적으로 찾아보세요높은 value거래
q = Query()
q.add("
MATCH (tx:Transaction) RETURN tx ORDER BY tx.value DESC LIMIT 1")
result = q.only()
result
{'tx': {'gas_price': 60000000,
'gas_offered': 172201,
'gas_spent': 172201,
'gas_quote': 0,
'gas_quote_rate': 4083,
'tx_offset': 4,
'value_quote': 7350,
'tx_hash': '0xcaefac99f076cd6e9e02a2b1309056eebab634f7cdf0ff28b7050dbc37c9110d',
'value': 1800000000000000000,
'successful': True}}
이 거래는 무려1.8 래핑된 BTC($55,000 USD)와 관련이 있네요! (BTC는 소수점 이하 18자리까지 지급돼요).
자세한 내용을 알아볼까요? 다음(약간 장황한) 쿼리를 사용해서 해당 단일 transaction과 관련된 모든 것을 가져와 볼게요.
위의 쿼리와 매우 유사하지만 이번에는Address비트코인이 전송됐다고TO and FROM, 기타 모든 정보 외에도.
MATCH (b:Block)-[:CONTAINS]->(tx:Transaction)
WHERE tx.tx_hash="0xbef02237efff3788082b28d74e34c7c245e1e8ea6a5b1da4d40967ddd08fd5a8"
MATCH (frm:Address)<-[:FROM]-(tx)-[:TO*0..1]-(to:Address)
MATCH (tx)-[:HAS_EVENT]->(le:LogEvent)-[:CALLS]-(addy:Address)
RETURN tx, le, addy, frm, to
이 transaction은 다음과 같은 거래인 것 같아요.loan. 누가 소유하든지from주소0x5d0eeaeabd5123e3d557c8a552134f24c6271a741.8 WRBTC를 빌렸네요.
이 address는 Sovryn 프로토콜의 일부로 문서화된 어떤 계약이나 토큰과도 일치하지 않는 것 같으니까, 아마도 체인에 있는 누군가일 거예요.
대규모 분석
이 다채로운 원은 모두 훌륭하지만, 의미 있는 양의 데이터를 분석하고 싶다면 어떻게 해야 할까요?
Knowledge Graph를 사용해서 더 큰 규모의 분석도 수행할 수 있어요. 한 유형의 토큰을 다른 유형의 동일한 금전적 value로 교환하는 스왑을 살펴볼게요.
이 예에서는 결과 수를 제한하지만limit and skip키워드 인수를 입력하고 모든 데이터를 가져올 수 있어요.
import plotly.express as px
from sovrynkg.swaps import get_swap_df
df = get_swap_df(skip=1000, limit=1000)
df.head()
좋아요, 데이터가 있네요. 이제 그걸 이해하려고 노력해 봅시다. address에 대한 자세한 정보를 얻으려면 내장된 도구를 사용할 수 있어요.
import sovrynkg.contracts as contracts
wrbtc = contracts.BY_NAME['WRBTC']
wrbtc, wrbtc.address
(<Token WRBTC:0x542…677d>, '0x542fda317318ebf1d3deaf76e0b632741a7e677d')
강력한 방법으로 데이터프레임을 분할할 수 있어요. 의 역사를 살펴볼까요.WRBTC/USDT 여기에서 교환하세요.
bt_pair = df[df.to_token=='WRBTC']
bt_pair = bt_pair[bt_pair.from_token=='USDT']
#both WRBTC and USDT have 18 decimals
bt_pair['exchange_rate'] = bt_pair.from_amount/bt_pair.to_amount
fig = px.line(bt_pair, x='signed_at', y='exchange_rate',
title='WRBTC vs USDT swap on Sovryn')
fig.show()
모든 질문에 대한 답변을 제공하는 Knowledge Graph
Knowledge Graph의 놀라운 점은 여러분이 떠올릴 수 있는 거의 모든 질문에 대한 답변이 어떻게든 데이터에 내장되어 있다는 것이에요.
그걸 찾기 위한 query를 작성할 만큼 영리해야 한다는 거죠.Neo4j를 사용한 Knowledge Graph 작성이 블록체인을 탐색하기 위한 좋은 도구가 되는 것은 탐색의 풍부함 때문이에요.
- 프로토콜은 어떻게 작동하나요?
- 가장 큰 사용자는 누구인가요?
- 하나의 암호화폐 쌍 또는 다른 암호화폐 간의 가격 변동에 대한 주요 지표가 있나요?
- Sovryn 팀의 마케팅 활동에 외부 데이터셋이 프로토콜 거래량에 영향을 미치는지 궁금하신가요?
SQL 데이터베이스를 구축해서 쿼리 날려본 경험이 있다면, 완전히 다른 질문을 바로 받게 될 때 어떤 기분인지 공감하실 거예요.
Ethereum, 그리고 그 너머
Bitcoin의 RSK 사이드체인은 Ethereum 가상 머신과 호환되기 때문에, 동일한 코드를 Ethereum에 적용해서 전체 체인을 매핑할 수도 있어요.
지속적으로 업데이트되는 Knowledge Graph와 편리한 SDK가 함께 제공된다면 정말 유용한 패키지가 되겠죠?
혹시 관심 있는 분이 계시다면 언제든지 연락 주세요!
GitHub 저장소는 에 있으니, 직접 사용해보고 싶다면 참고하세요.
- Bitcoin
- Blockchain
- DeFi
- Ethereum
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'Ontology & Knowledge Graph' 카테고리의 다른 글
| 5분 인터뷰: Nulli 창립자 겸 CEO, Derek Small에게 듣는 이야기 (0) | 2026.06.18 |
|---|---|
| 그래프로 풀어보는 ESG 보고의 모든 것 (0) | 2026.06.18 |
| 제품 DNA 해독: AI & Knowledge Graph로 PDM을 한 단계 업그레이드하다 (1) | 2026.06.17 |
| 데이터 모델링, 핵심만 짚어드립니다 (0) | 2026.06.17 |
| 데이터 파이프라인 심층 분석: Knowledge Graph를 활용한 데이터 리니지 추적 (0) | 2026.06.17 |
