Основанный в 2017 г. предпринимателем из Китая Джастином Саном, сегодня
TRON
является одним из наиболее популярных блокчейн-проектов. Популярность этой
платформы в основном обусловлена ее высокой пропускной способностью и низкой
стоимостью транзакций, что позволяет разрабатывать на ее основе эффективные
децентрализованные приложения
(в основном игровые). В
последнее время проект TRON привлек много внимания со стороны крупных
международных корпораций, что привело к заключению сделок и партнерских
соглашений с
BitTorrent,
Samsung,
Huawei,
Opera
и т.д. В феврале 2021 г. рыночная капитализация Tronix (TRX) - нативной
криптовалюты платформы TRON - превысила $4.2 млрд.
Благодаря большому количеству созданных на ее основе приложений платформа
TRON является интересным и ценным источником данных для решения разнообразных
аналитических задач. Конечно, для реализации этих задач требуется программный
способ сбора соответствующих данных. Создатели и сообщество пользователей TRON
разработали для этого несколько
API (см. ниже) и
клиентских библиотек. Однако до недавнего времени среди подобных библиотек не
было ни одного пакета для R, несмотря на популярность этого языка среди
аналитиков. Ниже приведено краткое описание
tronr - пакета, который я
разработал для устранения указанного пробела. Этот пакет появился в результате
моей работы в последнее время над несколькими
консалтинговыми проектами, включавшими сбор и анализ данных из блокчейн-сети TRON.
Инсталляция
В настоящее время tronr можно
установить только из GitHub, что можно сделать следующим образом:
# install.packages("devtools")
devtools::install_github("next-game-solutions/tronr")
В будущем я планирую также опубликовать этот пакет в репозитории CRAN.
Примеры
Пакет позволяет собирать данные по балансу отдельных аккаунтов, транзакциям, переводам токенов и результатам выполнения умных контрактов. Кроме того пользователи имеют возможность выполнять запросы к текущим и историческим показателям статуса TRX на глобальном рынке криптовалют. Детальные примеры использования соответствующих функций можно найти в онлайн-документации tronr. Ниже я приведу лишь несколько примеров, демонстрирующих возможности пакета.
library(dplyr)
library(ggplot2)
library(tronr)
#> R toolbox to explore the TRON blockchain
#> Developed by Next Game Solutions (http://nextgamesolutions.com)
# Получение актуальной стоимости TRX, выраженной в USD, EUR и BTC (Bitcoin):
get_current_trx_price(vs_currencies = c("usd", "eur", "btc"))
#> # A tibble: 3 x 3
#> trx_price vs_currency last_updated_at
#> <dbl> <chr> <dttm>
#> 1 0.0599 usd 2021-02-21 15:57:13
#> 2 0.0494 eur 2021-02-21 15:57:13
#> 3 0.00000104 btc 2021-02-21 15:57:13
# Получение исторических данных по рыночным показателям TRX
# с последующей визуализацией динамики стоимости этой криптовалюты:
(min_timestamp <- as.POSIXct("2020-01-01 00:00:00") %>%
to_unix_timestamp()
)
#> [1] "1577836800000"
(max_timestamp = as.POSIXct("2020-05-01 00:00:00") %>%
to_unix_timestamp()
)
#> [1] "1588287600000"
price_history <- get_trx_market_data_for_time_range(
vs_currency = "usd",
min_timestamp = min_timestamp,
max_timestamp = max_timestamp
)
glimpse(price_history)
#> Rows: 121
#> Columns: 5
#> $ timestamp <dttm> 2020-01-01, 2020-01-02, 2020-01-03,...
#> $ vs_currency <chr> "usd", "usd", "usd", "usd", "usd",...
#> $ price <dbl> 0.01329452, 0.01319943, 0.01284472,...
#> $ total_trading_vol <dbl> 1134528759, 1032624901, 1056549454,...
#> $ market_cap <dbl> 877119319, 872350811, 848482045,...
price_history %>%
ggplot(aes(timestamp, price)) +
geom_line() +
theme_minimal()
# Характеристики последнего сгенерированного в сети блока:
get_block_info(latest = TRUE) %>% glimpse()
#> Rows: 1
#> Columns: 11
#> $ request_time <dttm> 2021-02-21 15:57:33
#> $ block_number <chr> "27844966"
#> $ timestamp <dttm> 2021-02-21 15:56:24
#> $ hash <chr> "0000000001a8e1666864254248f7f8d4b2e41...
#> $ parent_hash <chr> "0000000001a8e1657f864801f99717577b481...
#> $ tx_trie_root <chr> "uLCTnmEGhvpmUeqcZM3VvMxZjiPUd8sr8FPwK...
#> $ confirmed <lgl> TRUE
#> $ size <int> 34298
#> $ witness_address <chr> "TWkpg1ZQ4fTv7sj41zBUTMo1kuJEUWTere"
#> $ tx_count <int> 135
#> $ tx <list> [<tbl_df[135 x 4]>]
# Текущий баланс аккаунта:
get_account_balance(
address = "TQjaZ9FD473QBTdUzMLmSyoGB6Yz1CGpux"
) %>% glimpse()
#> Rows: 1
#> Columns: 10
#> $ request_time <dttm> 2021-02-21 15:57:36
#> $ address <chr> "TQjaZ9FD473QBTdUzMLmSyoGB6Yz1CGpux"
#> $ name <chr> "SunTRXV3Pool"
#> $ total_tx <int> 69012
#> $ bandwidth <list> [<tbl_df[1 x 20]>]
#> $ trx_balance <dbl> 5628275
#> $ n_trc20 <int> 16
#> $ trc20 <list> [<tbl_df[16 x 7]>]
#> $ n_trc10 <int> 12
#> $ trc10 <list> [<tbl_df[12 x 8]>]
# Перевод TRC-10 токенов, имевших место в течение определенного
# периода времени:
get_trc10_transfers(
related_address = "TMaBqmMRekKZMQEq3u3QrJpGDwPYZZo87V",
min_timestamp = "1577837400000",
max_timestamp = "1577837430000"
) %>% glimpse()
#> Rows: 2
#> Columns: 13
#> $ tx_id <chr> "675a3606a414f0ea09979688889df0237911d368d...
#> $ block_number <chr> "15860788", "15860784"
#> $ timestamp <dttm> 2020-01-01 00:10:27, 2020-01...
#> $ from_address <chr> "TMaBqmMRekKZMQEq3u3QrJpGDwPY...
#> $ to_address <chr> "TT5W8MPbYJih9R586kTszb4Loybz...
#> $ is_contract_from_address <lgl> FALSE, FALSE
#> $ is_contract_to_address <lgl> FALSE, FALSE
#> $ contract_result <chr> "SUCCESS", "SUCCESS"
#> $ confirmed <lgl> TRUE, TRUE
#> $ amount <dbl> 10, 10
#> $ token_id <chr> "1002830", "1002830"
#> $ token_name <chr> "AUP", "AUP"
#> $ token_abbr <chr> "AUP", "AUP"
О чем необходимо помнить при использовании tronr
При разработке этого пакета мне пришлось принять несколько субъективных решений в отношении его дизайна:
- Большинство функций, возвращающих данные по транзакциям, "под капотом" выполняют запросы к публичному API, который обеспечивает функционал вебсайта Tronscan. Это имеет следующие важные последствия:
- Tronscan API значительно медленнее, чем TronGrid API, который является официально рекомендованным механизмом извлечения больших объемов данных из блокчейн-сети TRON. Однако выбор в пользу Tronscan API был сделан в связи с более богатыми и стандартизованными данными, которые он возвращает. Это решение может быть пересмотрено в будущем по мере дальнейшего развития TronGrid API.
- Попытки выполнения частых и/или "тяжелых" (в смысле объема данных) запросов с одного и того же IP адреса потенциально могут быть расценены серверами Tronscan как DoS-атаки и привести к блокировке этого IP адреса. Поэтому пользователям tronr рекомендуется не "злоупотреблять" подобными запросами и предусматривать в своем коде соответствующие меры "предосторожности" (например, в виде небольших пауз между отдельными запросами - см. базовую функцию Sys.sleep()).
- С учетом последних двух пунктов, tronr не предназначен для разработки масштабных аналитических приложений, предусматривающих регулярный сбор больших объемов данных.
- Многие функции tronr возвращают данные в виде вложенных таблиц (nested tibbles; см. приведенные выше примеры). Можно утверждать, что подобный формат является естественным для таких данных, учитывая их иерархическую структуру. Вложенные таблицы были выбраны также в связи с тем, что они представляют собой "опрятный" (tidy) формат данных, полностью совместимый с группой пакетов tidyverse. Однако я понимаю, что не все пользователи R предпочитают работать с инструментами tidyverse, что делает tronr несколько менее доступным для таких пользователей.
Заключение
TRON - интересный проект, набирающий популярность и значимость. Сгенерированные в этой блокчейн-сети данные могут оказаться полезными для разработки разнообразных аналитических приложений (например, мониторинг трендов, учет финансовых потоков, предсказание стоимости токенов, обнаружение популярных игровых приложение, выявление необычных транзакций и т.п.). Описанный в этой статье пакет tronr позволяет собирать данные из сети TRON в формате, готовом к дальнейшему анализу практически любыми инструментами из "экосистемы" R. Я был бы благодарен получить ваши отзывы и предложения о функционале этого пакета - подробнее см. GitHub-репозиторий tronr.
Отправить комментарий