Анализ графа NFT-транзакций с Neo4j и Cypher

Автор Категория ,
Анализ графа NFT-транзакций с Neo4j и Cypher

В рамках нашего нового курса по графовым алгоритмам в бизнес-приложениях, сегодня рассмотрим популярную сегодня тему про невзаимозаменяемые токены в криптовалютах и не только. Пример анализа графа по NFT-транзакциям в графовой СУБД Neo4j с помощью инструкций языка запросов Cypher.

Что такое NFT и причем здесь блокчейн с криптовалютами

Уникальный или невзаимозаменяемый токен (non-fungible token, NFT) представляет собой единичный криптографический сертификат цифрового объекта, который не может быть заменен аналогичным. Обычно токены взаимозаменяемы по своей природе, но NFT имеет возможность передавать сертификат через механизм, применяемый в криптовалютах. Хотя по закону об авторском праве NFT сам по себе не является подтверждением права на владение цифровым активом и не препятствует копированию объекта, а лишь закрепляет за владельцем специальную цифровую метку, сегодня он часто используется в качестве артефакта собственника. Если NFT может формировать только реальный владелец и передавать его далее вместе с передачей прав на исходный цифровой объект, NFT может считаться маркером текущего владельца. Первые эксперименты с NFT начались с ростом интереса к криптовалютам и технологии блокчейна в 2013-2014 гг. На февраль 2022 года общая стоимость всех NFT оценивается на уровне $16 млрд, что не превышает 1% криптовалютного рынка, оцениваемого в $2 трлн. Наибольшую долю стоимости (46,6 %) составляют NFT-изображения для пользовательских аватаров в соцсетях, далее идут игровые NFT-предметы (19,8 %), а затем коллекционные токены (13,5 %).

При том, что NFT критикуют из-за высоких затрат на электроэнергию и огромного углеродного следа при проверке транзакций, такие токены сегодня активно используются на многих платформах для подтверждения факта владения цифровыми активами и права их использования [1]. Поскольку в финансовом выражении наибольший интерес к NFT обусловлен криптовалютами, именно этот вариант использования мы и рассмотрим далее с помощью графовой базы данных Neo4j и ее языка запросов Cypher.

Анализ графа NFT-транзакций в Neo4j: статистика и проекции

В конце 2021 году было собран и проанализирован датасет из более 6 миллионов NFT-транзакций, входящих в 4600 коллекций и 6 категорий, получены из блокчейнов Ethereum и WAX с июня 2017 года по апрель 2021 года. Если рассматривать транзакции как связи между трейдерами, все эти данные можно представить в виде направленного графа. Каждая транзакция описывается метаданными NFT, имеет дату и цену в криптовалюте, а также в долларах США. Для цифровых произведений искусства имеется URL-адрес изображения, а также сведения о том, является ли NFT частью коллекции и к какой категории он принадлежит [2]. Исходный датасет выложен в открытый доступ и доступен для использования по лицензии CC-BY 4.0 [3].

Граф NFT-транзакций
Граф NFT-транзакций

Загрузив данные в Neo4j, проанализируем некоторые статистики данных по NFT-транзакциям с помощью запросов Cypher. Сперва оценим количество узлов и связей с помощью процедуры apoc.meta.stats:

CALL apoc.meta.stats
YIELD nodeCount, relCount, labels

В результате этого запроса можно получить информацию об основных характеристиках графа: он содержит около 11 миллионов узлов и 23 миллиона связей. Следующий запрос позволит узнать количество транзакций и общий объем, а также среднюю цену NFT по годам:

MATCH (t:Transaction)
RETURN t.Datetime_updated.year AS year,
count(*) AS transactions,
sum(t.Price_USD) AS totalVolume,
avg(t.Price_USD) AS averagePrice
ORDER BY year

Получается, в 2018 году было всего 450 тысяч транзакций, а в 2021 году до апреля это число достигло почти три с половиной миллиона. За прошедшие годы средняя цена и общий объем выросли почти до 750 миллионов долларов США за первые четыре месяца 2021 года. Оценим, сколько транзакций было оценено ниже или выше одного доллара:

MATCH (t:Transaction)
WHERE exists(t.Price_USD)
RETURN CASE WHEN t.Price_USD > 1 THEN true ELSE false END AS moreThanDollar,
count(*) AS count

Около 55% процентов транзакций были оценены более чем в один доллар. А оставшиеся почти 2,7 млн транзакций стоили менее одного доллара. Рассмотрим распределение транзакций на сумму более одного доллара с помощью процедуры apoc.agg.statistics:

MATCH (t:Transaction)
WHERE exists(t.Price_USD) AND t.Price_USD > 1
RETURN apoc.agg.statistics(t.Price_USD) AS result

Средняя цена сделок свыше одного доллара составляет 266 долларов США. Но 99% транзакций были на сумму менее 3349 долларов США. Поэтому очень малая доля NFT были действительно дорогими, при этом максимальная стоимость транзакции составила $7,5 миллионов. Теперь оценим коллекции NFT и их среднюю стоимость:

MATCH (collection)<-[:IN_COLLECTION]-(n:NFT)<-[:FOR_NFT]-(t:Transaction)
WHERE exists (t.Price_USD)
RETURN collection.Collection AS collection,
avg(t.Price_USD) AS averagePrice,
count(distinct n) AS numberOfNfts
ORDER BY averagePrice DESC
LIMIT 5

Определим, какие трейдеры выполнили больше всего транзакций:

MATCH (t:Trader)
RETURN coalesce(t.username, t.address) AS username,
size((t)-[:BOUGHT]->()) AS bought,
size((t)-[:SOLD]->()) AS sold
ORDER BY bought + sold desc LIMIT 5;

А теперь рассмотрим, кто из трейдеров наторговал на самую большую сумму в долларах США:

MATCH (t:Trader)
OPTIONAL MATCH (t)-[:BOUGHT]->(bt)
WITH t, sum(bt.Price_USD) AS boughtVolume
OPTIONAL MATCH (t)-[:SOLD]->(st)
WITH t, boughtVolume, sum(st.Price_USD) AS soldVolume
RETURN t.username AS username,
t.address AS address,
boughtVolume,
soldVolume
ORDER BY boughtVolume + soldVolume
DESC LIMIT 5

Понять, какие пользователи перепродали NFT с наибольшей прибылью, поможет следующий Cypher-запрос:

MATCH (t:Trader)-[:SOLD]->(st:Transaction)-[:FOR_NFT]->(nft)
WHERE st.Price_USD > 100000
MATCH (t)-[:BOUGHT]->(bt:Transaction)-[:FOR_NFT]->(nft)
WHERE st.Datetime_updated_seconds > bt.Datetime_updated_seconds
RETURN coalesce(t.username, t.address) as trader,
nft.Image_url_1 as nft,
nft.ID_token AS tokenID,
st.Datetime_updated_seconds AS soldTime,
st.Price_USD AS soldAmount,
bt.Datetime_updated_seconds as boughtTime,
bt.Price_USD AS boughtAmount,
st.Price_USD - bt.Price_USD AS difference
ORDER BY difference DESC LIMIT 5

Построим предполагаемую направленную взвешенную сеть транзакций между трейдерами: направление отношения укажет на поток денег, а вес будет представлять объем. Будем использовать Cypher-проекции для проектирования виртуальной сети, которая представляет собой преобразованную версию базового хранимого графа.

CALL gds.graph.create.cypher("nft",
"MATCH (t:Trader) WHERE NOT t.username = 'NullAddress' RETURN id(t) as id",
"MATCH (t1:Trader)-[:BOUGHT]->(t)<-[:SOLD]-(t2:Trader)
RETURN id(t1) AS source, id(t2) as target, coalesce(sum(t.Price_USD),1) as
weight")

Сперва проведем анализ методом слабо связанных компонентов, который используется для поиска сообществ:

CALL gds.wcc.stats("nft")
YIELD componentCount, componentDistribution

Результат этого Cypher-запроса показал, что сеть транзакций довольно разобщена: выявлено 5287 отдельных компонентов, и самый большой из них содержит всего около 12% трейдеров. Причем более 75% компонентов состоят из одного пользователя, который одновременно является и получателем, и отправителем. Это означает, что пользователь может продать токен самому себе. Наконец, выполним алгоритм ArticleRank, который является разновидностью алгоритма PageRank для поиска влиятельных лиц в сети на основе меры центральности, о чем мы писали здесь:

CALL gds.articleRank.stream("nft")
YIELD nodeId, score
WITH gds.util.asNode(nodeId) AS node, score
ORDER BY score DESC
LIMIT 5
RETURN node.username as username,
score,
size((node)-[:BOUGHT]->()) as boughtCount,
size((node)-[:SOLD]->()) as soldCount,
apoc.coll.sum([(node)-[:BOUGHT]->(t) | coalesce(t.Price_USD,0) ]) as
boughtVolume,
apoc.coll.sum([(node)-[:SOLD]->(t) | coalesce(t.Price_USD,0) ]) as
soldVolume

Больше примеров про использование Neo4j и Cypher для графовой аналитики больших данных в бизнес-приложениях вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков больших данных в Москве:

Источники

  1. https://ru.wikipedia.org/wiki/Невзаимозаменяемый_токен
  2. https://3dnews.ru/1060023/sovokupnaya-stoimost-nft-ne-previshaet-1-kriptovalyutnogo-rinka
  3. https://towardsdatascience.com/exploring-the-nft-transaction-with-neo4j-cba80ead7e0b
  4. https://osf.io/wsnzr/?view_only=319a53cf1bf542bbbe538aba37916537
  5. https://github.com/tomasonjo/blogs/blob/master/nft/NFT%20analysis.ipynb