Многие в крипто-сфере слышали о проблеме «пластичности транзакций» и ее «негативных» последствиях. Но что такое «пластичность транзакций» и почему это плохо? Давайте быстро рассмотрим этот вопрос.
В такой криптовалюте, как биткоин, транзакции – это атомарные операции, с помощью которых пользователи обмениваются ценностями. Пользователи создают транзакции и публикуют их в сети. Данные об этих транзакциях распространяются по сети и в конечном итоге записываются в блокчейн. Блокчейн используется получателями для выяснения, стоит или нет подтверждать ту или иную транзакцию.
Сегодня, когда количество транзакций в сети насчитывает миллионы, как пользователи могут быстро идентифицировать их, чтобы выявить различия между ними? Как группа разрозненных по всему миру пользователей может одним и тем же образом быстро и однозначно идентифицировать транзакции, не использую при этом какую-нибудь медленную глобальную систему реестра? Ответ прост: вы используете криптографический хэш транзакции в качестве идентификатора.
Криптографический хэш позволяет любому пользователю получить своего рода «отпечатки пальцев» любых данных, используя только сами данные. «Отпечаток пальца» уникален и неизменен при расчете. Даже если вы измените хотя бы 1 бит данных, хэш «отпечатков пальцев» будет полностью изменен.
В Биткоине хэш транзакции называется TXID (зашифрованный идентификатор транзакции) и служит универсальным уникальным идентификатором для этой транзакции.
Отлично, но что такое «пластичность»?
Содержание статьи
Пластичность транзакций
Пластичность – это возможность изменения идентификатора транзакции (TXID), но без аннулирования самой транзакции. В зависимости от криптовалюты, есть много способов, как это сделать. Общий способ для всех криптовалют – через изменение подписи, на чем я сфокусируюсь в этой статье.
Благодаря математическому принципу работы цифровых подписей ECDSA, можно изменить подпись, но без ее аннулирования. Хотя это не позволяет подделывать сами подписи, злоумышленник может изменить TXID транзакции, содержащей эти подписи, а это уже может привести к серьезным последствиям.
Проблема пластичности транзакций
Предположим, что Боб переводит Элис некоторое количество биткоинов через транзакцию с идентификатором X. Предположим, что до записи в блокчейн у X появляется новый идентификатор X’. Элис получила деньги, но Боб об этом не знает. Поскольку Элис в курсе, что Боб не знает, получила она деньги или нет, она хитростью заставляет Боба снова выполнить перевод. Она повторяет это до тех пор, пока Боб наконец не осознает, что происходит, но будет уже слишком поздно. В реальном мире эта атака осуществлялась на биржах следующим образом:
В этом случае злоумышленник:
1. Запускает группу вредоносных узлов (отмечено красным)
2. Окружает узел обмена (желтый) своими вредоносными узлами.
3. Осуществляет вывод средств с биржи.
4. Как только вывод средств X осуществлен, вредоносные узлы изменяют Х на X’.
5. Информация о транзакции X’ распространяется на остальную часть сети.
Когда транзакция под X’ будет записана в следующий блок, злоумышленник уже получит выведенные средства под X’, но сервер биржи не подтвердит получение средств, так как он ищет X в блокчейне. Зная это, злоумышленник:
6. Просит биржу повторить вывод средств, так как он «не прошел».
7. Затем повторяет это снова и снова.
В зависимости от размера биржи, злоумышленник может использовать «паразитную стратегию», благодаря которой из биржи «высасываются» средства небольшими суммами и нечасто. Это позволяет злоумышленнику «тихой сапой» выкачивать деньги из обменника на протяжении долгого периода времени. В качестве альтернативы, злоумышленник может также воспользоваться «вампирской стратегией»: здесь биржа подвергается крупным грабежам настолько часто, что системные администраторы не успевают своевременно принять ответные меры.
Какова бы ни была стратегия, это является проблемой, и разработчикам криптовалют нужно ее решать.
ПРИМЕЧАНИЕ: На практике для осуществления шага (2) злоумышленнику не нужно полностью окружать узел обмена. Для выполнения атаки требуется всего несколько подключений, хотя это гарантирует меньшую вероятность успеха, т.к. чем больше узлов окружено, тем выше вероятность успеха атаки.
Решение проблемы пластичности транзакций
Биткоин (BTC) «решил» проблему пластичности транзакций с помощью протокола Segwit, который отделяет подпись от расчета идентификатора TXID и заменяет ее на непластичное обязательство хэша к этой подписи. Этот хэш служит указателем на подпись, которая хранится в другой структуре данных. Для проверки подписи транзакции верификатор использует хэш для поиска подписи в другой структуре данных, а затем выполняет обычную проверку ECDSA. Это исключает подписи как источник изменчивости транзакции, так как они хранятся вне транзакции, и хэш-указатель на подпись не может быть изменен. Изящно, но это делает зависимой другую структуру данных, которая содержит подписи. Небольшой шаг в защите транзакций в Биткоине, но тем не менее довольно значительный.
Хотя внедрение протокола Segwit само по себе было неплохой идеей, его реализация и вытекающие из нее последствия привели к расколу в биткоин-сообществе. В результате сообщество разделилось на Bitcoin (BTC) и Bitcoin Cash (BCH). Хотя Segwit анонсировался как основная причина раскола, основные проблемы были больше связаны с самим фактом развертывания Segwit, чем его технической стороной. Также, политикой «всегда софт-форк и никогда хард-форк» подразумевалось, что размер блока 1 МБ был по сути заблокирован, а это было неприемлемо для многих.
Технические аргументы против Segwit были больше связаны с его безвозмездной сложностью как софт-форка и не связаны с его надежностью как хард-форка. Segwit как софт-форк был, по мнению автора, той самой «каплей», которая переполнила чашу Биткоина. Однако Segwit как хард-форк был (и остается) технически обоснованным подходом к решению проблемы пластичности.
Нравится вам или нет, но дело уже сделано. Однако проблема пластичности все еще остается в Bitcoin Cash.