Фильтрование 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 которым можно задавать аккаунт, для которого сохранять историю. Таким образом можно еще больше снизить потребление памяти, если скрипт должен отслеживать только один какой то аккаунт.