Как узел SPV проверяет неподтвержденную транзакцию?

Алиса платит Бобу 1 БТД с простой транзакцией типа «оплата за адрес». Через три секунды после того, как Алиса транслирует свою транзакцию, кошелек «Упрощенная платежная верификация» (SPV) Боба отображает сообщение о том, что транзакция получена.

Как именно это работает? Какие проверки, если таковые имеются, делают кошелек Боба перед показом сообщения?

Многие документы SPV, которые я видел, делают неопределенные заявления о проверке «высота» и «глубина». Эти обсуждения не помогают, потому что они не описывают фактический процесс.

Ясное заявление, которое я нашел, появляется в документации BitcoinJ (в разделе «Ожидаемые транзакции»):

  

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

https://bitcoinj.github.io/security-model

Другими словами, полное доверие помещается в сеть только для передачи действительных транзакций. Сеть не должна передавать двойные траты или транзакции, использующие фиктивные монеты. Поэтому реле и только реле выдают за действительность неподтвержденной транзакции. Если злоумышленник может контролировать ваше интернет-соединение (например, через точку доступа Wi-Fi или VPN), он может отправить вам поддельные неподтвержденные транзакции и разорвать вас.

Является ли это тем, что узлы SPV обрабатывают неподтвержденные транзакции?

Кажется, что SPV-узел может сделать лучше. Например, не мог ли кошелек Боба проверить, что израсходованные монеты существовали за один раз? Запросить путь и транзакцию Merkle для всех исходящих точек, указанных в списке входных данных неподтвержденной транзакции. Если исходные транзакции не могут быть найдены, транзакция Алисы пытается использовать поддельные монеты.

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

Если ни одна из этих проверок не возможна сегодня, что должно произойти, чтобы они стали возможными?

6 голосов | спросил Rich Apodaca 11 FebruaryEurope/MoscowbWed, 11 Feb 2015 20:52:19 +0300000000pmWed, 11 Feb 2015 20:52:19 +030015 2015, 20:52:19

2 ответа


2

Во-первых, nobody следует полагаться исключительно на неподтвержденные транзакции. Это в равной степени относится к операторам полного узла и пользователям кошельков SPV.

  

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

Да, это можно сделать сейчас. Я сомневаюсь, что сейчас кошельки делают это, так как с нынешним дизайном сети P2P он будет медленным, а не окончательным.

Это будет медленным, потому что сетевой протокол не позволяет запрашивать произвольные транзакции. Чтобы получить определенную транзакцию, вы должны установить фильтр цветения , а затем сохранить запрос блоки merkle , пока не найдете блок, содержащий транзакцию. В случае отрицательного поиска это потребует запроса блока merkle для каждого блока в цепочке блоков или загрузки около 32 МБ данных и принуждения вашего полного узла-партнера для сканирования всей цепочки блоков на 30 ГБ.

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

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

  

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

Нет, это принципиально невозможно, потому что неподтвержденная транзакция - это просто данные. Алиса могла создать и транслировать транзакцию T, платящую Бобу, а затем создать транзакцию T '(двойную трату), которую она хранит в секрете на своем жестком диске. Поскольку это секрет, вы не знаете о T ', но это все еще действительная двойная трата.

Существуют различные предложения, позволяющие полным узлам передавать информацию о вещательных двойных тратах, таких как Гавина Андресена ретранслировать первые двойные траты или заменить Peter Todd , но ни один из этих может обеспечить метод проверки того, что для конкретного ввода нет двойных затрат.

Также возможно изменить, как Bitcoin проверяет подписи, требующие либо математических одноразовые подписки ECDSA или консенсусные одноразовые подписи . Это не остановило бы двойные траты, но это означало бы, что любой, у кого было две подписи для одного и того же входа, мог бы создать третье трат, беря на себя все деньги. (Например, если шахтер, работающий с полным узлом, получил T и T ', он мог бы создать и разделить T3 с полным значением ввода для себя.)

Это явно заставило бы задуматься о создании публичных двойных расходов, но это не остановило бы их. Хуже того, есть некоторые легкие способы устранения препятствий для систематических мошенников, но обычные пользователи, такие как вы и я, которые иногда вынуждены делать двойные расходы по законным причинам (например, потому что транзакция не подтверждается)не могли безопасно сделать их больше.

ответил David A. Harding 12 FebruaryEurope/MoscowbThu, 12 Feb 2015 00:35:12 +0300000000amThu, 12 Feb 2015 00:35:12 +030015 2015, 00:35:12
1

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

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

ответил Jimmy Song 11 FebruaryEurope/MoscowbWed, 11 Feb 2015 22:59:33 +0300000000pmWed, 11 Feb 2015 22:59:33 +030015 2015, 22:59:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132