Связано: как транзакции попадают к майнерам , но я ищу немного (и только немного) более техническое обсуждение.
Скажем, я загружаю облегченный биткойн-клиент и настраиваю кошелек на машине А. С другой машины Б я отправляю монету на этот новый кошелек.
Как моя транзакция попадает к майнеру?
Во-первых, когда вы запустите свой кошелек, он подключится к нескольким другим узлам в сети с помощью описанного здесь механизма . Эти соединения являются соединениями TCP, поэтому они представляют собой потоки данных с одного компьютера непосредственно на другой; IP-адреса известны, а передача данных осуществляется на уровне TCP.
По этому TCP-соединению два узла начнут обмениваться данными. Сначала он состоит из некоторых начальных элементов рукопожатия, таких как сообщения о версии, различные фильтры для другого узла, которые должны применяться перед отправкой данных другому узлу, и т. д. Затем он состоит из данных блока и транзакции. Обычно они сначала объявляются в inv
сообщении (в основном просто говорится: «У меня есть этот фрагмент данных»), запрашиваются с помощью getdata
сообщения (говорится «пожалуйста, дайте мне этот фрагмент данных») и отправляются с соответствующим типом сообщения ( block
, tx
и т. д. .).
Поэтому, когда вы отправляете транзакцию, ваш узел объявляет через inv
сообщение узлам, что он подключен к тому, что у него есть транзакция. Другие узлы запрашивают его, и транзакция отправляется. Затем эти узлы повторяют тот же процесс; они объявляют своим пирам, что у них есть транзакция, она запрашивается и затем отправляется. Именно так транзакция распространяется по сети. В конце концов он достигнет узлов, принадлежащих майнерам, поэтому майнеры смогут включить вашу транзакцию в свой следующий блок.
Точно так же, как машина А узнает о транзакции?
Поскольку соединения TCP являются двунаправленными, ваш узел также получает блоки и транзакции от своих одноранговых узлов. Для полных узлов он будет получать каждый блок и транзакцию, о которых знают его одноранговые узлы, что, в общем, будет являться каждым блоком и транзакцией в сети. Затем он может интерпретировать каждую транзакцию и находить те, которые относятся к вашему кошельку.
Для легкого кошелька он будет использовать специальный набор сообщений, которые позволят ему установить фильтр для транзакций, которые он получает. Этот фильтр отправляется узлам, к которым он подключен, и эти узлы будут отправлять в ваш кошелек только те транзакции, которые соответствуют этому фильтру. Затем ваш кошелек выполнит дополнительную локальную фильтрацию, чтобы определить, какие именно транзакции относятся к нему (набор фильтров может иметь ложные срабатывания).
цкурц