Фильтрование account_history


Я закоммитил в своей ветке изменения, которые я сделал относительно account_history плагина с целью снизить потребление памяти golosd и в то же время сохранить возможность получать виртуальные операции.

Взять код можно здесь https://github.com/gropox/golos/commits/less_account_history

Как это работает

У нас имеются нормальные операции, которые прописанны в протоколе. Вроде vote, comment, transfer и другие, которые могут инициировать пользователи блокчейна. Так же есть и виртуальные операции, которые генерирует нода выполняя расчеты. 

Вот список виртуальных операций

fill_convert_request_operation,
author_reward_operation,
curation_reward_operation,
comment_reward_operation,
x liquidity_reward_operation,
interest_operation,
fill_vesting_withdraw_operation,
fill_order_operation,
x shutdown_witness_operation,
fill_transfer_from_savings_operation,
hardfork_operation,
comment_payout_update_operation

Эти виртуальные операции не сохраняются в блокчейне, так как они вычисляемые. Их всегда можно вычислить на основе других данных, записанных в блокчейне. Эти операции часто очень интересны скриптописателям ботов и их можно получить коммандами get_account_history и get_ops_in_block. Обе комманды, при включенном account_history плагине возвращают как обычные, так и виртуальные операции. Для этого account_history плагин сохраняет все операции в базе данных. Получется, двойной расход памяти, так как нормальные операции и так уже хранятся в памяти. На данный момент, при включенном account_history плагине, нода потребляет ~37G памяти от shared_memory. Так как shared_memory лучше распалогать в RAM, то можно представить, на сколько дорогой становится сервер. Вот и родилась у меня идея, сохранять не все в базе данных, а только виртуальные операции. Нормальные же операции можно все еще получить командой get_block.

В конфигурационном файле config.ini можно было уже фильтровать операции и включалось это опцией filter-posting-ops. Правда тогда оставались только операции transfer и тому подобные.

Потому я добавил еще один параметр only-virtual-ops. "Пропатченная" мной нода, при включенном filter-posting-ops параметре отбрасывает только pow операции генерируемые майнерами. Мне они не интересны, и вообще я думаю майнинг должен быть все равно выпилен.

Если помимо filter-posting-ops включить only-virtual-ops, то тогда только виртуальные операции будут сохраняться в базе.

Вот пример того, что выдает get_account_history в таком случае

Как видно у @vik-а в истории остались только виртуальные операции.

Это поможет сильно экономить на памяти и в то же время, останется возможность получить виртуальные операции. Скриптописателям будет проще держать свою ноду и не нагружать публичную golos.io.

Еще бы разобраться с get_ops_in_block методом database_api, что бы он могла вытаскивать нормальные операции из блока, а виртуальные из базы, созраненные account_history плагином. То было бы еще интереснее, так как не пришлось бы переписывать скрипты, для которых интересны виртуальные операции.

Кстати у account_history_plugin есть еще один параметр track-account-range которым можно задавать аккаунт, для которого сохранять историю. Таким образом можно еще больше снизить потребление памяти, если скрипт должен отслеживать только один какой то аккаунт.

 

 

 

 

 

 

 

 

 


Комментарии 7


Чтобы читать и оставлять комментарии вам необходимо зарегистрироваться и авторизоваться на сайте.

Моя страницаНастройкиВыход
Отмена Подтверждаю
100%
Отмена Подтверждаю
Отмена Подтверждаю