Как транзакции распространяются через сеть биткойнов? (В глубине)

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

Я кратко прочитал в документе, что существует своего рода очередь транзакций, которую узел хранит для каждого соседа, и что они будут выбирать только случайное (?) количество этих транзакций и отправлять сообщение INV этим узлам.

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

Любая помощь будет здорово, спасибо!

Ответы (2)

Я кратко прочитал в документе, что существует своего рода очередь транзакций, которую узел хранит для каждого соседа, и что они будут выбирать только случайное (?) количество этих транзакций и отправлять сообщение INV этим узлам.

Обратите внимание, что это относится к Bitcoin Core. Другое программное обеспечение полного узла может не демонстрировать такое поведение.

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

Однако не все транзакции в списке отправляются. Только некоторые из них отправлены. Чтобы выбрать, какие транзакции будут отправлены, ваш узел отсортирует список транзакций по количеству предков, которые у него есть (чтобы родительские транзакции ретранслировались перед дочерними транзакциями) и по их скорости. Транзакции с наименьшим количеством предков и самой высокой ставкой вознаграждения будут наверху. Транзакции выбираются из этого отсортированного списка до тех пор, пока сообщение INV не достигнет своего предела (что случается редко) или не останется транзакций. После выбора транзакций отправляется INV.

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

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

Причина, по которой это помогает с конфиденциальностью, заключается в том, что шпионский узел, который подключился к вашему узлу, не всегда сможет знать, какие транзакции получил ваш узел и как выглядит ваш мемпул. Он не сможет узнать, какие транзакции вы получили первыми. Кроме того, из-за случайных задержек, если транзакция исходит от вашего узла, возможно, что узел, подключенный непосредственно к вашему узлу, сначала получит вашу транзакцию от кого-то еще, тем самым снижая достоверность такого анализа.

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

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

В заданном канале узел внутренне подписывается на следующие события, связанные с получением новых входящих транзакций:

  • 1) INVсообщение от коллеги
  • 2) TXсообщение от коллеги
  • 3) Мероприятие по организации локального мемпула (принимаются новые TX)

Если он получает INV с новым TXID от партнера, он запросит полную транзакцию с помощью GETDATA(INV). Если он получит сообщение TX, оно будет либо принято, либо отклонено в мемпуле. После принятия (событие организации локального пула памяти [3]) обработчик отправит сообщение INV(TX) всем каналам (за исключением того, где TX был впервые замечен).

Я не знаю очередей транзакций с отдельными каналами ни в одной реализации Биткойн.