Устаревание транзакций
Транзакция, отправляемая на 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", см. Транзакции как доказательство долей
Соответственно, если транзакция ссылается на блок, который присутствует только в побочной цепи, данная транзакция будет отброшена нодой в любом случае.