Введение в технологию Блокчейн
Шрифт:
В сети Bitcoin все узлы равны.
Здесь нет иерархии, и нет особых узлов или главных узлов.
Эта сеть работает через протокол TCP и имеет случайную топологию, где каждый узел связан с другими случайными узлами.
Новые узлы могут присоединиться в любое время.
Фактически, сегодня вы можете скачать клиент Bitcoin, развернуть свой компьютер в качестве узла, и он будет иметь равные права и возможности, как и любой другой узел в сети Bitcoin.
Сеть меняется со временем и очень динамична
Не существует явного способа покинуть сеть.
Вместо этого, если узел не был слышен некоторое время – три часа – это длительность, которая жестко закодирована в большинстве клиентах – другие узлы начинают забывать этот узел.
Таким образом, сеть обрабатывает узлы, переходящие в офлайн режим.
Напомним, что узлы соединяются со случайными одноранговыми узлами и нет никакой географической топологии.
Теперь предположим, что вы запустили новый узел и хотите присоединиться к сети.
Вы начинаете с простого сообщения для одного узла, о котором вы знаете.
Обычно он называется вашим семенным узлом seed node, и есть несколько разных способов поиска списков семенных узлов, к которым можно подключиться.
Вы отправляете специальное сообщение «Скажите мне адреса всех других узлов в сети, о которых вы знаете».
Вы можете повторить процесс с новыми узлами, о которых вы узнаете, столько раз, сколько хотите.
Затем вы можете выбрать, к каким из них следует подключиться, и вы станете полнофункциональным членом сети Bitcoin.
Существует несколько шагов, которые используют случайность, и результатом является то, что вы получаете случайный набор узлов.
Чтобы присоединиться к сети, все, что вам нужно знать, – это связаться с одним узлом, который уже находится в сети.
Для чего нужна сеть?
Конечно, чтобы поддерживать цепочку блоков.
Чтобы опубликовать транзакцию, мы хотим, чтобы об этом узнала вся сеть.
Это происходит с помощью простого алгоритма наводнения, иногда называемого протоколом сплетен.
Если Алиса хочет заплатить Бобу, ее клиент создает, и ее узел отправляет эту транзакцию ко всем узлам, с которыми она связана.
Каждый из этих узлов выполняет серию проверок, чтобы определить, принять и транслировать или нет дальше эту транзакцию.
Если проверки проходят успешно, узел, в свою очередь, отправляет транзакцию всем своим узлам-пирам.
Узлы, которые принимают эту транзакцию, помещают ее в пул транзакций, о которых они слышали, но которые еще не находятся в цепочке блоков.
Если узел получает транзакцию, которая уже находится
Это гарантирует, что протокол наводнения прекратится, и транзакции не будут циклически перемещаться по сети вечно.
Помните, что каждая транзакция однозначно определяется своим хешем, поэтому ее легко найти в пуле.
Теперь вопрос, когда узлы узнают о новой транзакции, как они решают, должны ли они ретранслировать ее?
Для этого существуют четыре проверки.
Первая и самая важная проверка – проверка транзакции – транзакция должна быть валидной для текущей цепочке блоков.
Узлы запускают скрипт для каждого предыдущего выхода, который тратится, и проверяют, чтобы скрипт вернул true.
Во-вторых, они проверяют, чтобы выходы, потраченные в этой транзакции, еще не были потрачены.
В-третьих, они не будут передавать уже полученную ранее транзакцию.
В-четвертых, по умолчанию, узлы будут принимать и ретранслировать «стандартные» скрипты на основе небольшого белого списка скриптов.
Все эти проверки – это просто проверки на основе здравомыслия.
Честные узлы выполняют их, чтобы попытаться поддерживать работоспособность сети, но не существует правила, согласно которому узлы должны выполнять эти проверки.
Так как это одноранговая сеть, и может присоединиться любой узел, всегда существует вероятность того, что какой-то узел будет транслировать двойные траты, нестандартные транзакции или совершенно недействительные транзакции.
Вот почему, желательно, чтобы каждый узел выполнял эти проверки.
Так как в сети существует латентность, возможно, что узлы будут иметь разные пулы ожидающих включение в блокчейн транзакций.
Это становится особенно интересным и важным, когда есть попытка двойной траты.
Предположим, что Алиса пытается заплатит один и тот же биткойн как Бобу, так и Чарли, и отправляет две транзакции примерно в одно и то же время.
Некоторые узлы сначала услышат о транзакции Алиса -> Боб, а другие сначала услышат о транзакции Alice -> Charlie.
Когда узел слышит любую из этих транзакций, он добавляет ее в свой пул транзакций, и, если он услышит о другой транзакции позже, это будет выглядеть как двойная трата.
Узел откажется от последней транзакции и не будет ретранслировать ее или добавлять ее в пул транзакций.
В результате временно между узлами возникнет разногласие о том, какие транзакции следует поместить в следующий блок.
Это называется созданием условия гонки.
Хорошей новостью является то, что все будет в порядке.
Тот, кто замайнит следующий блок, по существу разорвет эту связь и решит, какая из этих двух ожидающих транзакций должна быть окончательно помещена в блок.