Новости про богатых людей, инвестиции крупных фондов всегда на первых страницах. Людям интересно, что покупают, во что вкладывают люди имеющие крупный капитал. 

Блокчейн позволяет удовлетворить любопытство на новом уровне, ведь вся информацию доступна публично в полном объеме. В данной статья я расскажу, как достать кошельки китов блокчейна 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

Посмотреть, ранжирование коллекций из данного туториала в удобном виде можно здесь.

Код из данного туториала

Комментарии (3)


  1. badcasedaily1
    28.09.2023 10:26
    +2

    По оформлению: код в плашке выбирайте не формата «Код», формата соответствующего ЯПа.
    Ссылки необходимо добавлять тоже с помощью специальной вставки, чтобы они были кликабельными


  1. mikegordan
    28.09.2023 10:26
    +1

    ну тоесть около 80% всего саплая была сфармлена в первые 2 недели на супер ограниченный круг лиц, в момент когда о TON даже никто не знал?


    1. IvanRomanovich Автор
      28.09.2023 10:26

      Да, из-за непростой истории TON(бан от SEC) и последующей добычи TONcoin из смарт-контрактов Giver(что-то вроде IPOW схемы) у TON проблемы с распределением. И проблема даже, не в том, что большая часть саплая контролируется китами, а в их активности. Foundation пытается разные инициативы проводить связанные с перераспределением через Locker фонд, гранты, конкурсы и прочие, но пока не понятно будут ли данные инициативы успешны.