Как обозреватели блоков определяют распространение через узлы/протокол P2P?

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

Например, BlockCypher предоставляет значение «доверия» для неподтвержденных транзакций:

введите описание изображения здесь

Это всегда заставляло меня задаться вопросом, как именно они могут вычислить это? Есть ли у них лично большая распределенная сеть узлов, за которой постоянно следят? Конечно, это было бы неэффективным с точки зрения затрат и менее децентрализованным.

В их документации указано:

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

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

Ответы (2)

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

Благодаря этим соединениям они могут прослушивать то, что транслируют все эти узлы. В текущем протоколе ретрансляции P2P узел объявляет своим партнерам, что у него есть транзакция ( invсообщение). Затем он ожидает запроса на него ( getdata) перед отправкой транзакции ( tx). Таким образом, кто-то, прослушивающий множество узлов, сможет узнать, какие узлы имеют транзакцию, основываясь на том, объявили ли они транзакцию. Вероятно, именно так Blockcypher вычисляет «количество пулов памяти с tx».

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

По сути, нет, цифры, приведенные для такого рода вещей, обычно бессмысленны.

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

В случае, связанном с betcoin dice и ghash.io, они продемонстрировали бы абсолютную уверенность в подтверждении, однако пул майнинга просто включал альтернативные транзакции, которые не тратили на сервис каждый раз, когда их ставка была отрицательной. Для сайта ставок с преимуществом дома в 1% им нужно иметь возможность делать это более 1% времени, чтобы атака была для них финансово выгодной. Это происходило в течение нескольких месяцев, и никто этого не замечал, пользователи не прекращали пользоваться пулом или применяли какие-либо другие карательные меры. «Надежность транзакций» или другие инструменты работают только в неконфликтной среде, которой Биткойн не является.

Может ли узел просто спросить своих пиров, существует ли транзакция в их мемпуле с помощью запроса getData?

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