Помещаем ли мы все транзакции в пул памяти?

Интересно, хранятся ли в пуле памяти также сиротские транзакции? Если да, то как биткойн-клиент различает осиротевшие и обычные транзакции?

Ответы (2)

Bitcoin Core поддерживает отдельный сиротский пул с транзакциями, чьи родители отсутствуют. Его основная цель — иметь дело с пирами, которые отправляют нам группы независимых транзакций в неправильном порядке, поэтому этот пул не обязательно должен быть большим.

Начиная с версии Bitcoin Core v0.13.0, все транзакции, отправляемые одноранговым узлам, отправляются пакетами и внутри этих пакетов в порядке зависимости. Это значительно уменьшило средний размер потерянных пулов в сети (с сотен до нескольких).

Спасибо, я исправил израсходованные полузнания в своем посте.

Бесхозная транзакция

«Транзакции-сироты» — это транзакции, для которых отсутствует родитель и, следовательно, по крайней мере один вход неизвестен узлу. Это может произойти, когда узел получает транзакции в неправильном порядке или когда родительский узел был дважды потрачен, и поэтому один из входов этой новой транзакции никогда не проявится. До тех пор, пока не будут соблюдены предварительные условия для транзакции, такая транзакция по существу будет казаться недействительной, поскольку узел узнает, что транзакция тратит деньги, о которых узел не знает. Мемпул не хранит осиротевшие транзакции, а собирает их в отдельный потерянный пул на тот случай, если родитель все же ретранслируется.

Сиротский блок

Блок-сирота — это блок, родитель которого неизвестен узлу. Это могло произойти в более ранних версиях Биткойна, когда более поздний блок передавался вашему узлу до того, как вы получили родителя, например, во время синхронизации. Я полагаю, что узлы сохранят блоки-сироты, по крайней мере, до тех пор, пока они не смогут точно сказать, что они не являются частью самой длинной цепочки (т.е. они синхронизируются до высоты блока-сироты).

Устаревший блок

Время от времени возникает цепная вилка, когда два майнера обнаруживают блоки на одной высоте. Как только один из двух конкурирующих блоков получит преемника, другой блок станет частью «устаревшей цепи». Как правило, узлы считают действительным только один блок той же высоты и, таким образом, игнорируют подтверждения в параллельных блоках той же высоты. Транзакции, которые были подтверждены только в одном из двух блоков на той же высоте, будут считаться неподтвержденными в другом блоке. Узлы будут считать второй блок, полученный ими на той же высоте, не частью самой длинной цепочки и просто сохранят его, чтобы иметь возможность следовать потенциальной реорганизации.

Итак, я боюсь, что я понятия не имею, какая проблема, по вашему мнению, может быть, чтобы различать блоки-сироты и не-сироты. ;) И по большей части то, что вы, вероятно, считаете «бесхозными транзакциями», является либо недействительными транзакциями, либо неподтвержденными транзакциями.

Если я упустил суть вашего вопроса, обновите свой пост и сообщите мне об этом в комментарии.

Под сиротской транзакцией я подразумевал транзакции, чьи родители отсутствуют или еще не прибыли. В таком случае узел должен ждать, пока родитель сможет подтвердить транзакцию под рукой. Это то, что я понял.