NEM 거래 내역 네트워크에서 거래소 주소 추출

경위





반년 정도 전에 Nem Network Neon이라는 NEM의 거래 내역에서 주소의 연결을 시각화하는 앱을 만들었습니다.

네트워크 분석 기법을 사용하여 이 앱에서 출력되는 거래 내역에서 거래소 주소를 찾아보세요.

(결론에서 말하면 찾을 수 있습니다)

거래 내역 획득



htps : // 네 m네온-70055. 푹 푹 빠져서 p. 코m/ 의 텍스트 박스에 적당한 주소를 넣어, 연결의 차수를 4, 1 노드에 대해서 취득하는 트랜잭션(transaction)를 10으로 해 Search 합니다.
이를 통해 중앙 주소에서 4차 연결까지 주소당 최대 10개를 검색합니다.


최대 10^4개의 주소를 찾을 수 있지만 중복이나 거래수가 적은 경우가 있으므로 1,000~10,000개의 주소를 탐색할 수 있다고 생각합니다.

모든 검색에는 시간이 걸려 버리기 때문에 몇 분 정도로 중단하고 "그래프 표시"를 눌러 표시로 이동합니다.



엄청난 수의 그래프가 나오고 브라우저도 깜짝. 동작이 무거워집니다.
그래프는 너무 무거워서 볼 수 없다고 생각하므로, 「데이터를 텍스트 표시」에 가서 거래 로그만 취득합니다*.



수집된 데이터



약 2600개의 주소와 5200개의 트랜잭션이 모였습니다.
NEM의 사용자 인구를 정확히 알고 있는 것은 아니지만, 샘플로서는 나쁘지 않은 비율이 되어 그렇습니다.

NetworkX로 시각화



파이썬 pandas와 networkx를 사용하여 분석을 수행합니다.
이전에 얻은 데이터를 다음과 같은 형식의 CSV로 변환하고 transaction.csv로 저장합니다.



그것을 vector로 변환하여 networkx의 Graph 인스턴스에 전달합니다.
다음과 같은 코드로 할 수 있습니다.

notworkx.py
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from community import community_louvain

plt.figure(figsize = (10, 10))
df_ft = pd.read_csv("transaction.csv")

vector = {}
for i in pd.concat([df_ft.iloc[:,0],df_ft.iloc[:,1]]).unique():
    vector[i] = []

for i in range(len(df_ft)):
    vector[df_ft.iloc[i,0]].append(df_ft.iloc[i,1])

G = nx.Graph(vector)

nx.draw_networkx(G,with_labels=False)
plt.show()




대표적인 특징량



networkx의 메소드를 사용하여 대표적인 특징량을 구하면 다음과 같이 되었습니다.
특징량에 대해

평균 차수 : 3.68
평균 경로 길이 : 4.48
클러스터 계수 : 0.00508
차수 분포 : 아래 그림


클러스터 계수가 상당히 낮은 값을 취하고 있습니다. 소규모 커뮤니티 내에서 활발하게 송금하는 관계는 아직 적은 것일까?

거래소 계정 확인



2600개의 주소 중에서 거래소 주소를 추출할 수 없는지 확인합니다.
거래소는 네트워크의 Hub가 되어 있다고 생각되기 때문에, 매개 중심성이라는 지표에 의해 스코어 붙입니다.

요컨대, 멀리 떨어진 노드를 연결하는 지름길과 같은 계정에 높은 점수를 매깁니다.
nx.betweenness_centrality(G)

에 의해, 중개 중심성을 계산해, 랭킹을 작성하면 이하와 같이 되었습니다.
NBGFLNRGN7QNSMDJ5XRJTLPJS6AGRKUAYTYXFUCK: 0.2162768344148873
ND2JRPQIWXHKAA26INVGA7SREEUMX5QAI6VU7HNR: 0.08638790971640656
NDTJM4XDZBNI5Z2YA7NGYD2VYDQSADFYIKQENVWE: 0.07095099671831129
NBQ73BYLVGMO7L2WFG2VVOJHOBWWJKW7D3V7UE4E: 0.06315006280213961
NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA: 0.05689201429017033
NB7GV3ELFTJ3OFA35N6RVVE5NOFPESN4CI3MM2EJ: 0.05086532189133895
NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D: 0.048117151006199364
NDBRUFE7R5OANEDE43VCTMUVRHTI6XZ7TQFVNTMU: 0.04690431473665636
NCR2CQE6AI3DIRHPHEPBSVDBOQFSHXFSQF4NIUAH: 0.041245137408139836

...

상위 5개의 주소를 살펴보면 분명히

1 수상한 계정? ( htps : // 흠 m. 네 m. 이오 / t / 흠뻑 dt 란사 c 치온 / 19513 )
2 Bittrex
3 알 수 없음
4 Cryptopia
5 자이프

되어 있습니다.
중개 중심성이라는 특징만으로도 주요 거래소와 고소한 주소를 찾을 수 있습니다 ...!

사이고에게



조금 모은 거래 이력에서 네트워크를 만들어 특징을 분석하는 것만으로 거래소를 추출할 수 있었습니다.
더 많은 거래 내역과 특징을 사용하면 재미있는 분석을 할 수 있습니다.

참고



htps : // m / go / g / ms / d c 3 에아 372b016 네 6
Nem Library를 사용하는 방법을 @golang에게 알려주었습니다.

htps : // 코 m / 히로 유키 1993 / ms / a c3 a d3029
Networkx 정보

※주・네트워크 분석의 문맥에서는, 이번 취득한 거래 로그는 Egocentric Network의 중첩이므로, 해석 대상으로서 정확하지 않은 것 같습니다. 단지 이번은 거기까지 깊은 것 생각하지 않고 단순히 많은 노드를 모으는 목적으로 사용했습니다.

좋은 웹페이지 즐겨찾기