Ищем скам токены с помощью пузырчатых диаграмм в блокчейне TON Часть 1
Часто в криптомире слова децентрализация, смарт-контракты — это всего лишь оболочка для скама или, мягко говоря, нечестных схем.
Можно услышать Do Your Own Research — проводите исследования, но обычный человек, а не венчурная фирма, имеющая штат аналитиков, не может тратить столько времени на анализ.
Что может быть сделано?
Не отменяя DYOR, мы можем попытаться найти индикатор/дашборд, который при 20% усилий на изучение даст 80% результат — информацию о токене.
Что за показатель? — Предлагаю рассмотреть распределение предложения токенов.
Давайте рассмотрим случаи:
1) Манипуляции с Флором и объемом NFT
Покупатели NFT часто ориентируются на Флор (наименьшая цена коллекции) и объем сбора — нечестные продавцы влияют на эти показатели, перепродавая NFT между парой кошельков.
Если отобразить перепродажи на дэшборде относительно общего распределения, подобные манипуляции сразу будут видны.
2) Концентрация 25% взаимозаменяемых токенов в одних руках
Создатели токенов, часто бравируют большим количество транзакции токена, смотрите нашим токеном пользуются, правда часто это просто перкидываение токенов между парой связанных между собой кошельков — экосистема токена активна, но реальный владелец фактически один….
3) Фальшивые ДАО
Важной частью DAO является управление голосованием — важно понимать, будет ли голосование реальным или просто легитимизирующим решения пары человек. Если пара человек владеет почти всем запасом, это не ДАО.
Вы скажете, это конечно круто, но перерыть кучу кошельков отнимет уйму времени…
На сцену выходят пузырьковые диаграммы
Лучший способ визуализировать распределение токенов — пузырьковая диаграмма; это позволит вам быстро увидеть подозрительный закономерности.
В этом туториале мы соберем скрипт, который составит диаграмму топ 100 кошельков по балансу для любого Jetton в блокчейне TON!
В следующем туториале мы возьмем эти топ 100 кошельков и найдем среди них транзакции, таким образом подсветим кластеры.
Скрипт будет на python, данные будем брать из индексатора dton.io. Упор сделаем на получение данных.
Результатом станет Google Colab, который вы сможете использовать в своих исследованиях.
Как собрать данные из блокчейна TON?
Dton.io индексатор блокчейна, что значит, он собирает информацию из каждого нового блока в свою базу данных. В эту базу данных можно делать GraphQL запросы и таким образом собирать историческую информацию без парсинга всей цепочки блоков.
Две самых важных источника данных dton.io это таблица транзакций и представление последнего состояния кошельков/аккаунтов в сети. Делай запросы в данной представление и таблицу, можно собрать почти любую информацию.
В данном туториале нам пригодятся именно состояния кошельков, по состоянию мы будет определять есть ли токены
Устанавливаем зависимости
Как мы знаем GraphQL запросы отправляются в теле HTTP POST-запроса, поэтому установим requests и прочие необходимые зависимости:
# install requriments
!pip install requests
!pip install matplotlib
import requests
import string
from collections import Counter
import string
import json
Обозначим и эндпойнт dton.io:
endpoint = 'https://dton.io/graphql/'
Получим тип контракта и информацию о токене.
Для работы нашего скрипта нам нужен мастер контракт взаимозаменяемого токена на TON. Что это такое мы обсудим ниже. Но так как я хочу сделать Colab удобным для пользования, сначала надо научиться проверять что введенный адрес это именно, то что нужно.
Вариантов для этого много, можно, например, взять всю информацию из сети — взять низкоуровневый код контракта и сравнить его с требованиями стандарта взаимозаменяемого токена, но есть варианты и попроще.
Самый просто вариант, где одним запросом мы можем и проверить что это за контракт по адресу и сразу же получить информацию о токене, это вариант сделать запрос в toncenter — это HTTP API для The Open Network. Для этого у toncenter есть /getTokenData:
#Note api has limits
API_ENDPOINT = 'https://toncenter.com/api/v2'
payload = {'address': master_addr}
r = requests.get(API_ENDPOINT+'/getTokenData', params=payload)
#print api response
print(json.dumps(r.json(), indent=2))
# Token supply
total_supply = r.json()['result']["total_supply"]
# Token name for our future diagram
token_name = r.json()['result']["jetton_content"]["data"]["name"]
В полученном результате, по полю «contract_type» можно понять, что это за тип смарт-контракта (если такой тип поддерживается сервисом).
Конструируем запрос в dton.io
Теперь мы точно знаем, что адрес введенный пользователем, это адрес мастер контракта, пришло время поговорить про стандарт взаимозаменяемых токенов.
В блокчейне TON нет единого смарт-контракта, который хранит список адресов владеющих токенов и их балансы. Вместо этого, используется шардирование смарт-контрактов — есть мастер контракт, хранящий информацию о токене и контракты кошельки — для каждого владельца токена создается свой.
Подробно останавливаться на шардировании токенов в TON в этой статье мы не будем, если вас это интересует, предлагаю вам разбор смарт-контрактов стандарта — ссылка
Так как использование смарт-контракта требует «оплаты работы» TVM газом (часть TON при любой транзакции уходит комиссией), это делает подобный стандарт крайне экономичным — уходит необходимость искать в огромном списке адреса.
Но если есть плюсы, значит есть и минусы.
Проблема шардирования смарт-контрактов с точки зрения сбора данных
Шардирование экономит газ, но список владельцев отсутствует — как тогда получить все адреса владельцев токена? Единственный вариант это пробежать по всем блокам и найти нужные нам адреса. Но к счастью есть индексаторы блокчейна, которые позволяют достать нужные нам адреса парой запросов.
В уже упомянутом нами dton.io есть представление последнего состояния кошельков/аккаунтов в сети. Соответственно нам надо добавить ограничения в запрос этого представления, которые позволят нам вывести топ 100 кошельков.
Собираем запрос в dton.io
Dton.io не только индексирует блокчейн, но и обогащает данные, для нас важно, что в представлении аккаунтов в сети есть поле parsed_jetton_wallet_jetton_address_address — для кошельков токенов это поле заполнено их мастер контрактом, его мы и будем использовать. Чтобы отсортировать только контракты кошельки токенов, проверим, что у контракта есть гет метод get_wallet_data (данный метод объязателен для токен кошельков по стандарту).
query MyQuery {
account_states(
account_state_state_init_code_has_get_wallet_data: 1
parsed_jetton_wallet_jetton_address_address: "${addr}"
workchain: 0
) {
}
}
Отсортируем по балансу и отберем первые 100 записей на странице.
query MyQuery {
account_states(
account_state_state_init_code_has_get_wallet_data: 1
parsed_jetton_wallet_jetton_address_address: "${addr}"
workchain: 0
order_by: "parsed_jetton_wallet_balance"
order_desc: true
page_size: 100
) {
}
}
Остается только прописать, что мы хотим получить адрес владельца кошелька токенов и его баланс. Получим:
query MyQuery {
account_states(
account_state_state_init_code_has_get_wallet_data: 1
parsed_jettonallet_jetton_address_address: "${addr}"
workchain: 0
order_by: "parsed_jetton_wallet_balance"
order_desc: true
page_size: 100
) {
address
parsed_jetton_wallet_balance
parsed_jetton_wallet_owner_address_address
}
}
Как обогатить данные
Думаю, вы понимаете, что биржи или служебные смарт-контракты могут иметь много исходящих транзакций, было бы классно их пометить, чтобы не считать, что что-либо скам, потому что люди просто через биржу токены меняют. Но где взять нужную базу? Идем от, проблемы, кому больше всех нужен такой датасет — конечно же кошелькам, ведь это даст им и UX — пользователям удобно видеть кто кидает ему средства например + плюс это некоторая защита от спама — если токена нет в вайтлисте, то возможно это скам или рекламная отправка токена (кидают токен, а в сообщении ссылка куда-то).
Поэтому обратим внимание на опенсорсные списки от кошелька tonkeeper:
https://github.com/tonkeeper/ton-assets
Конечно, это не все возможные связки кошельков и их владельцев, и у одного владельца может быть много кошельков, но это лучше чем ничего.
После обогащения увидим, что небольшой долей токена владеет биржа MEXC:
Пузырьковая диаграмма
Осталось построить диаграмму, подготовим цвета рандомом (код ниже по ссылке) и получим:
Но мошенники могут использовать несколько кошельков?
Да, и именно поэтому во второй части мы будем отслеживать транзакции между топ-100 кошельками и собирать кластеры.
Заключение
Мне нравится блокчейн TON своей технической изящностью, как минимум это не очередная копия Ethereum, которую разгоняют с помощью большого капитала без оглядки, а вообще зачем это нужно пользователю. Если вы хотите узнать больше о блокчейне TON, у меня есть опенсорсные уроки, благодаря которым вы научитесь создавать полноценные приложения на TON.
https://github.com/romanovichim/TonFunClessons_ru
Новые туториалы и дата аналитику я кидаю сюда: https://t.me/ton_learn
Код из данного туториала:
https://colab.research.google.com/drive/10qv2AN68F3IOwfJyLXsDiQenOhBvyN6I? usp=sharing