Новости про богатых людей, инвестиции крупных фондов всегда на первых страницах. Людям интересно, что покупают, во что вкладывают люди имеющие крупный капитал.
Блокчейн позволяет удовлетворить любопытство на новом уровне, ведь вся информацию доступна публично в полном объеме. В данной статья я расскажу, как достать кошельки китов блокчейна TON с помощью запроса в индексатор dton.io.
Также поговорим, как можно просто обогатить данные. Пример, того, что мы получим в конце, можно посмотреть тут.
В конце статьи будет весь код и google colab.
Что такое dton.io?
Dton.io индексатор блокчейна, что значит, он собирает информацию из каждого нового блока в свою базу данных. В эту базу данных можно делать GraphQL запросы и таким образом собирать историческую информацию без парсинга всей цепочки блоков.
Две самых важных источника данных dton.io это таблица транзакций и представление последнего состояния кошельков/аккаунтов в сети. Делай запросы в данной представление и таблицу, можно собрать почти любую информацию.
В данном туториале нам пригодятся именно состояния кошельков, будем брать баланс
Устанавливаем зависимости
Как мы знаем GraphQL запросы отправляются в теле HTTP POST-запроса, поэтому установим requests и прочие необходимые зависимости:
# install requriments
!pip install requests
import requests
import string
Обозначим и эндпойнт dton.io:
endpoint = 'https://dton.io/graphql/'
Достаем счета
Воспользуемся представлением состояния счетов,
query = '''
{
account_states(
workchain: 0
page_size: 100
){
balance: account_storage_balance_grams
address
}
}
'''
Получим, некоторые адреса и их балансы, возникает вопрос как достать топ 100? Для этого у индексатора есть поле order by в которое можно писать поле по которому упорядочить ответ.
Упорядочиваем выборку
Так как нас интересует баланс, добавим сортировку по полю account_storage_balance_grams.
#how many sales were there in the last 24 hours
def getTopHundredTonOwners(endpoint):
query = '''
{
account_states(
order_by: "account_storage_balance_grams"
order_desc: true
workchain: 0
page_size: 100
){
balance: account_storage_balance_grams
address
}
}
'''
response = requests.post(endpoint, json={'query': query})
data = response.json()['data']['account_states']
return data
Вот они топ 100 кошельков, но что это за кошельки, может это биржи или какие-то технические кошельки?
Как обогатить данные
Конечно, большинство из топ 100 просто кошельки, но попадаются и биржи и спец. кошельки и было бы круто сопоставить адрес и его название если такое имеется. Но где взять нужную базу? Идем от, проблемы, кому больше всех нужен такой датасет - конечно же кошелькам, ведь это даст им и UX - пользователям удобно видеть кто кидает ему средства например + плюс это некоторая защита от спама - если токена нет в вайтлисте, то возможно это скам или рекламная отправка токена (кидают токен а в сообщении ссылка куда-то).
Поэтому обратим внимание на опенсорсные списки от кошелька tonkeeper:
https://github.com/tonkeeper/ton-assets
Конечно, это не все возможные связки кошельков и их владельцев, и у одного владельца может быть много кошельков, но это лучше чем ничего.
Обогащаем и трюк с эксплорером
Также было бы удобно, чтобы у нас был не просто адрес а сразу ссылка на эксплорер блокчейна с этим адресом, для этого надо привести адрес в другую форму.
Адреса смарт-контрактов, работающих в TON, выражаются в двух основных форматах:
Raw hex addresses: исходное полное представление адресов смарт-контрактов
User-friendly addresses: расширенные адреса для удобства пользователей
Подробнее про адреса в документации. Чтобы перевести адрес из одного вида в другой воспользуемся скриптом, который в данном туториале разбирать не будем, но в самом конце туториала будут все ссылки на код.
Соберем все это вместе:
url = "https://raw.githubusercontent.com/tonkeeper/ton-assets/main/accounts.json"
resp = requests.get(url=url)
assets_list = resp.json()
for row in top_hundred:
for asset in assets_list:
if('0:'+row['address'].lower() == asset['address']):
row['name'] = asset['name']
print(asset['name'])
else:
pass
#row['name'] = None
row['tonscan'] = "https://tonscan.org/address/" + account_forms('0:'+row['address'])['bounceable']['b64url']
row['normalized_balance'] = round(int(row['balance']) /1000000000)
Получим:
Что можно улучшить
В следующем туториале мы добавим каким процентом TONcoin владеют киты от общего предложения TONcoin и кумулятивного.
Заключение
Мне нравится блокчейн TON своей технической изящностью, как минимум это не очередная копия Ethereum, которую разгоняют с помощью большого капитала без оглядки, а вообще зачем это нужно пользователю. Если вы хотите узнать больше о блокчейне TON, у меня есть опенсорсные уроки, благодаря которым вы научитесь создавать полноценные приложения на TON.
https://github.com/romanovichim/TonFunClessons_ru
Новые туториалы и дата аналитику я кидаю сюда: https://t.me/ton_learn
Посмотреть, ранжирование коллекций из данного туториала в удобном виде можно здесь.