Синхронизация кошельков с Биткоин сетью

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

    По материалу этой статьи записана одна из лекций онлайн-курса по blockchain “Синхронизация кошельков с Биткоин сетью”.

    Базовые функции кошелька


    Начнем с базовой функциональности цифрового кошелька:

    • резервное копирование личных ключей;
    • прием платежей;
    • отображение баланса;
    • отображение истории транзакций;
    • отправка платежей.

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

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

    Сложности работы в распределенной сети


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

    Еще одна проблема заключается в следующем. Чтобы получить историю транзакций по определенному адресу на полном узле сети, вам придется пройтись по всему блокчейну (от genesis до last known), что достаточно долго, поскольку это большой объем данных, а грубый перебор это мало эффективный подход. Поэтому можно использовать определенные подходы с целью оптимизации запросов. Для этого применяются специальные надстройки над обычным узлом сети, которые помогают индексировать блокчейн и кэшировать некоторые данные для ускорения поиска по популярным метрикам. По такому принципу работает любой blockchain explorer, например blockchain.info, который достаточно быстро возвращает данные практически о любом адресе, о любой транзакции и т. д.

    Итак, существует несколько принципиально разных подходов к осуществлению взаимодействия и синхронизации цифрового кошелька с распределенной сетью. Давайте их рассмотрим.

    Подходы синхронизации кошелька с платежной сетью


    Есть три основных подхода. Первый предполагает, что кошелек сам является полным узлом сети Биткоин. Во втором подходе используется так называемый доверенный узел. Фактически это чужой узел сети, но пользователь кошелька ему доверяет. А третий подход предполагает прямое взаимодействие с остальными узлами сети, но в облегченном варианте, с использованием методики Simplified Payment Verification (SPV). Эта методика позволяет с достаточно высокой степенью надежности проверить подтвержденность транзакций, но не прибегать к запуску полного узла сети. Давайте чуть подробнее остановимся на каждом из этих подходов синхронизации.

    image

    Работа с полным узлом сети


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

    Недостатком этого подхода является необходимость выделить большой объем дискового пространства для хранения полного блокчейна, содержать узел сети в режиме бесперебойной работы и своевременного обновления ПО.

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

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

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

    Работа с доверенным узлом сети


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

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

    Какие же преимущества и недостатки этого подхода? Как и в предыдущем случае, хоть и косвенно, но можно влиять на проверку транзакций в сети Биткоин, потому что у пользователя остается доверенный узел сети. Преимущество состоит в том, что он освобождается от необходимости хранить полную копию блокчейна на своем устройстве. Тем не менее зависимость от доверенного узла является недостатком, ведь в случае его отказа пользователь не всегда может переключиться на другой доверенный узел. Поскольку проверка транзакций происходит на удаленном сервере, нужно убедиться в надежности канала передачи данных между кошельком и сервером, на котором происходит проверка. При таком подходе появляются угрозы таких атак как “Man in the middle”.

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

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

    Такой способ используют преимущественно мобильные кошельки, потому что он позволяет и верифицировать транзакции, и упростить работу мобильного приложения. Примерами таких мобильных кошельков для Биткоина являются Mycelium и Coinomi. Компания Distributed Lab также разработала и поддерживает кошелек под названием Bitxfy, где применен данный подход.

    Работа с SPV-узлом сети


    Третий распространенный подход к синхронизации цифрового кошелька с Биткоин сетью — это облегченный узел сети. Речь идет о Simplified Payment Verification (SPV). В этом подходе может отсутствовать необходимость запуска своих полных узлов или выбора доверенных. Предполагается, что цифровой кошелек напрямую общается с другими узлами сети: фактически выбирает несколько десятков чужих полных узлов и поддерживает с ними соединение. Отличие состоит в том, что облегченный узел общается с другими узлами на равных, обмениваясь с ними р2р сообщениями, но при этом не хранит всю историю транзакций. Здесь для проверки входящих транзакций применяется методика SPV. Фактически облегченный узел проводит только часть наиболее важных проверок из тех, что проводит полный узел сети.

    Как происходит работа в этом случае? Вместо того, чтобы получать блоки, как это делает полный узел, SPV узел получает только заголовки блоков, которые имеют гораздо меньший размер (80 байт). В заголовке содержатся необходимые данные для проверки факта подтверждения конкретной транзакции в этом блоке. Если говорить более конкретно, то в заголовке блока есть поле Merkle Root, где записано хеш-значение от всех транзакций в блоке, рассчитанное по схеме Merkle Tree.

    image

    Схема Merkle Tree позволяет проверить, входит ли хеш-значение конкретной транзакции в Merkle Root, не имея при этом всех остальных транзакций блока. Таким образом, имея транзакцию, заголовок блока и Merkle Branch для этой транзакции (можно запросить у полного узла), цифровой кошелек может убедиться, что транзакция была действительно подтверждена в конкретном блоке.

    Почему это нельзя считать полноценной верификацией транзакций? Конечно, пользователь получает независимость от конкретных узлов сети и может напрямую общаться с распределенной сетью. Для этого ему не нужно хранить весь блокчейн. Но недостаток состоит в том, что облегченный клиент самостоятельно не проверяет транзакцию полностью, потому что у вас нет всех необходимых данных для этого (например, непотраченные монеты). Он проверяет лишь факт подтверждения транзакции валидаторами — т. е. убеждается, что эту транзакцию полностью проверили другие узлы и владельцы большинства вычислительной мощности сети (майнеры). В этом случае надежность снова сводится к доверию, что большинство вычислительной мощности используются для честной работы. Иначе говоря, вы не сами проверяете транзакцию, а доверяете это большинству.

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

    Как вы уже поняли, SPV узлы требовательны к стабильной работе сетевого соединения, тем не менее часто применяются даже в мобильных приложениях. Этот подход синхронизации с платежной сетью достаточно широко распространен и используется в ряде популярных Биткоин кошельков. Среди них можно выделить Bitcoin Wallet, Electrum, а также Bread Wallet.

    Часто задаваемые вопросы


    — Где можно найти полные узлы, которым можно доверять?

    Достаточно сложно ответить, каким узлам можно доверять. Это вопрос личного предпочтения. Есть сервисы, которые предоставляют доверенную информацию, такие как Blockchain.info, — редко кто им доверяет особенно если речь идет о крупных суммах. Нужно быть очень осторожным в выборе доверенного узла, поскольку он является посредников между пользователем и платежной сетью. Однажды Blockchain.info вышел из строя на двое суток из-за проблем с DNS провайдером, Кошельки, которые использовали Blockchain.info в качестве доверенного узла, не могли синхронизироваться с Биткоин сетью и хоть как-то работать.

    — Какие гарантии дает команда кошелька и какова ее ответственность?

    Этот вопрос имеет больше юридический характер, чем технический. У любого ПО, которое распространяется официально, есть “Terms of Use”, где прописано, что вы можете предъявить разработчикам в случае, если возникли определенные проблемы в их ПО. “Terms of Use” отличаются в разных приложениях. Как и всегда, пользователь отвечает на вопрос, доверяет он разработчикам или нет, перед тем как начать использовать их продукт.

    — Кто решает, доверенный ли узел?

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

    — Сколько может быть доверенных узлов?

    Вы можете выбрать любое количество доверенных узлов, чтобы минимизировать риск потери доступа к сети. Например, три узла. Если возникнут проблемы с доступом к первому, то вы подключаетесь ко второму и продолжаете с ним работать точно по такому же принципу.

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

    Здесь нужно сказать не о монетах, а о хранении ключей, которые используются для доступа к этим монетам. Рассмотрим два варианта одной ситуации. Если уничтожен сервер, который обеспечивал доступ к сети Биткоин. То это на вас никак не повлияет. Вы временно потеряете доступ к распределенной базе данных, но у вас остануться ключи, которые позволят вам потратить эти монеты. Если же уничтожен сервер, на котором хранились ваши ключи, при этом у вас нет резервной копии этих ключей, то вы не сможете получить доступ к своим монетам.

    — Безопасно ли поставить кошелек, положить на него монеты, записать seed фразу на бумагу и удалить его?

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

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

    Можно добавить любое ПО, которое будет анализировать блокчейн. Это может быть ПО, написанное самим пользователем, а может существовать готовое решение. Все зависит от ваших целей. Если вы хотите оптимизировать запросы по поиску определенных транзакций, привязанных к определенным адресам, как это делает blockchain explorer, вы можете применить ПО, которое будет индексировать блокчейн и кэшировать определенные данные. Примером такого ПО является BitCore (поддерживается компанией BitPay). BitCore имеет открытый исходный код и вы можете его достаточно просто использовать вместе со своим полным узлом.
    Distributed Lab
    26.51
    Blockchain Experts
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 0

    Only users with full accounts can post comments. Log in, please.