Реле транзакций и потоки в биткойнах

Если узел имеет 100 подключений к другим узлам и получает новую транзакцию с использованием запроса getData, он отправляет сообщение inv своим 100 подключающимся узлам, верно?

Отправляет ли он также сообщение inv узлу, от которого он только что получил транзакцию, поскольку он все еще является одним из подключающихся узлов?

«Сообщения, как правило, сбрасываются периодически примерно каждые 100 мс. Однако ретрансляция транзакций происходит путем «просачивания» сообщений. Биткойн случайным образом выбирает с вероятностью 1/4 транзакции для inv-сообщения и приостанавливает остальные транзакции. Каждый сосед получает свой набор случайно выбранных транзакций, каждая из которых составляет около 1/4 доступного в данный момент набора. Только случайно выбранный «узел стекания» (ср. ретрансляция адресных сообщений) получает все транзакции немедленно. Другие соседи либо получают его позже, либо уже получили от другого соседа. Trickling снижает накладные расходы и в то же время усложняет анализ трафика, подобно тому, как миксы делают это в смешанных сетях».

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

Ответы (2)

Если узел имеет 100 подключений к другим узлам и получает новую транзакцию с использованием запроса getData, он отправляет сообщение inv своим 100 подключающимся узлам, верно?

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

Отправляет ли он также сообщение inv узлу, от которого он только что получил транзакцию, поскольку он все еще является одним из подключающихся узлов?

Как указано выше, это не так. Хотя нет правила, которое явно запрещает это, разумно не отправлять кому- invто, кто уже отправил invвам то же самое. Это экономит затраты на пропускную способность.

Мне немного трудно понять, как работает просачивание с точки зрения транзакций.

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

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

Узел, создающий транзакцию, обрабатывает эту транзакцию так же, как и любую другую, полученную по сети. Для каждого узла, к которому подключен этот узел, он добавляет эту транзакцию в список транзакций, которые он в конечном итоге отправит на этот узел. Дальше все как обычно. В следующий раз, когда он должен отправить invсообщение для определенного узла, он выбирает транзакции для inv, и созданная им транзакция может быть или не быть одной из них. После invотправки другой узел ответит сообщением getdataо том, что он хочет, что может включать или не включать созданную им транзакцию. Затем ваш узел отвечает на getdataсами транзакции.

Большое спасибо за ваш подробный ответ. Итак, если я правильно понимаю, узлы не будут отправлять сообщение INV узлам, о которых известно, что у них уже есть транзакция (то есть узлам, которые уже отправили этому узлу сообщение INV для той же транзакции). И когда узел хочет отправить tx INV своим партнерам, он добавляет его в уже существующий список транзакций, которые он хочет отправить этому конкретному узлу. Когда оно в конце концов отправляется, содержит ли это сообщение INV несколько хэшей txID или это INV для каждого хэша txid?
Когда он отправляется, он invдолжен содержать несколько txids. Однако возможно (и, возможно, вероятно), что к тому времени, когда он отправит inv, будет только один или два txid для отправки.
Возможно, стоит отметить, что цитаты в вопросе OP устарели (они относятся к старому механизму просачивания, который был заменен пакетами с распределением Пуассона несколько крупных выпусков назад в Bitcoin Core).
Что происходит с транзакциями, которые не соответствуют локальному мемпулу, все продолжают их циркулировать (получая и передавая снова, потому что они не видны)?
@VincentAlex Транзакции, которые не добавлены в мемпул узла, не передаются этим узлом. Транзакции, добавленные в мемпул узла, не передаются более одного раза. Таким образом, транзакции, которые не могут попасть в мемпулы, просто не ретранслируются. Они не продолжают циркулировать, если кто-то намеренно не ретранслирует их.

он отправляет сообщение inv своим 100 подключающимся узлам, верно?

до 99

Отправляет ли он также сообщение inv партнеру о том, что он только что получил транзакцию от

это разрешено, но нет причин для этого

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

никто ни за что не отвечает

Почему он отправляет только 99, а не 100 пиров? Если я являюсь узлом, который только что получил транзакцию, я отправляю INV всем своим партнерам об этом, не так ли — даже тому, кто только что отправил мне данные, если только не было способа отслеживать, кто отправил их мне. поэтому я не буду отправлять INV на этот узел
Это не отвечает на вопрос о практической реализации протокола ретрансляции tx, а не о том, какие модификации разрешено вносить в него узлам.