Устаревание транзакций в блокчейне Голос
Данная статья служит черновиком wiki-статьи по результатам вчерашнего обсуждения в чате Goloscore. Материал призван помочь разработчикам приложений исключить потерю транзакций при работе с блокчейном Голос. Приглашаю @goloscore на review. Текущая версия статьи находится на github.
Устаревание транзакций
Транзакция, отправляемая на golos-ноду, должна содержать поле expiration, указывающее момент времени, до которого транзакция является валидной. Если по каким-то причинам транзакция не будет включена в блок за это время, то она устареет и будет просто удалена нодой.
Что происходит при форках сети
В некоторых случаях происходит такая ситуация, при которой блок генерируется одновременно двумя делегатами, и некоторое короткое время параллельно существуют две цепи блоков. При обнаружении такой ситуации нода просматривает цепочку в обратном порядке до нахождения last irreversible block, при этом читаются все транзакции из блоков и опять попадают в очередь на включение в блоки (см. libraries/chain/database.cpp void database::pop_block()
). Самая длинная цепочка в итоге становится основной.
Чтобы исключить потерю транзакций во время форков сети, следует задавать expiration больше чем время до last_irreversible_block
, например 60 секунд.
Связь с TaPoS
В транзакции так же имеются поля ref_block_num
и ref_block_prefix
, которые как бы указывают, что "данная транзакция является валидной, если она находится в цепи, в которой имеется блок с номером X и с префиксом Y", см. Транзакции как доказательство долей
Соответственно, если транзакция ссылается на блок, который присутствует только в побочной цепи, данная транзакция будет отброшена нодой в любом случае.
Мои opensource-проекты на Голосе
- golos-witness-tools - набор скриптов для делегатов.
- golos-otkat-py - скрипт для выполнения откатов по программам апвот50-50 и апвот100.
- golos-scripts - разные полезные скрипты для Голоса на python