На мой взгляд, актуальным вопросом для Bitcoin и других криптовалют является
постоянное увеличение размера блокчейна и, как следствие, необходимость хранить
большие массивы данных на клиентских машинах. Многие пользователи
не желают скачивать весь многогигабайтный блокчейн, накопившийся за годы существования криптовалюты, только лишь для того, чтобы надёжно отправить несколько транзакций. Поэтому предлагаю публиковать в этой теме
различные способы отсечения старых блоков в блокчейне.
Разумеется, весь блокчейн в любом случае необходим для
полной верификации и валидации всех транзакций, совершённых начиная с первого GENESIS-блока, а также для
анализа передачи монет с адреса на адрес. Как вариант, вместо скачивания блокчейна можно использовать режим PRUNE или онлайн-обозреватели блокчейна, но в этом случае добавляются уязвимости, основанные на доступности сайтов, фишинге и взломе DNS-серверов. Речь идёт об
альтернативных способах хранения текущих состояний адресов пользователей криптовалют для клиентских решений.
Первый способ для Bitcoin
Согласно технологии блокчейна Bitcoin, для совершения транзакции нужно знать
хеш SHA256D предыдущей транзакции и порядковый
номер непотраченного выхода в этой транзакции. Таким образом, для минимизации блокчейна требуется хранить структуру и данные по всем непотраченным выходам UTXO, а также хеши транзакций Bitcoin, содержащих эти выходы с их порядковыми номерами в транзакции.
Примерный дамп содержит 3 таблицы:1.
Список транзакций Bitcoin, содержащих
хотя бы один непотраченный выход:
1) Структура транзакции 1:
- хеш SHA256D транзакции (32 байта)
- параметры транзакции (lock_time, данные SegWit, и т.п.)
2) Структура транзакции 2
...
Таблица сортируется
побайтно по полю "Хеш транзакции" по возрастанию, порядок байтов этого поля little-endian.
2.
Список непотраченных выходов UTXO:
1) Структура выхода 1:
- выходной скрипт
- количество монет BTC на выходе
- порядковый номер транзакции согласно списку выше
- порядковый номер выхода в этой транзакции
2) Структура выхода 2
...
Таблица сортируется сначала по полю "Порядковый номер транзакции", затем по полю "Порядковый номер выхода", оба
побайтно по возрастанию, порядок байтов этих полей big-endian.
3.
Список заголовков блоков:
1) Структура заголовка 1:
- Порядковый номер блока в блокчейне
- Заголовок блока
2) Структура заголовка 2
...
Таблица сортируется
побайтно по полю "Порядковый номер блока" по возрастанию, порядок байтов этого поля big-endian. Фактически эта таблица является цепочкой заголовков блоков.
Кроме этого, дамп содержит следующие поля:- версия дампа
- название монеты
Способ отсечения старых блоков в блокчейне заключается в том, что, например,
каждый месяц определённый
доверенный человек, уважаемый в криптовалютном сообществе, создаёт вышеописанный список непотраченных выходов UTXO транзакций Bitcoin и вычисляет хеш SHA256 этого дампа. Затем он
подписывает стандартизированную строку, содержащую размер и хеш созданного файла, своим ключом ECDSA secp256k1 и публикует данный дамп на сайте. Пользователи скачивают этот файл, проверяют подпись и, в случае успешной верификации, загружают дамп
специальной версией Bitcoin Core, после чего скачивают остальные блоки,
начиная с последнего номера блока дампа.
Таким образом пользователям не нужно будет скачивать весь блокчейн на клиентские машины, а корректность данных будет основана на
доверии к человеку, создавшему список непотраченных выходов UTXO транзакций Bitcoin и подписавшему его своим ключом. К тому же, синхронизация с сетью будет занимать
минимальное время.
Второй способ для Bitcoin
Та же самая схема, но отличие заключается в том, что майнеры Bitcoin через
каждые, например, 4320 блоков (то есть примерно раз в месяц) добавляют в скрипт входа COINBASE-транзакции стандартизированный комментарий, размер и хеш SHA256 файла, содержащего список непотраченных выходов UTXO и опубликованного на сайте. Это будет означать, что майнер
подтверждает, что опубликованный список корректен и может быть использован пользователями на клиентских машинах. Если другие майнеры не будут согласны с корректностью данных, содержащихся в этом файле, они не будут продолжать майнить эту ветку, и смайненный блок станет
орфаном.
В этом случае пользователи, скачавшие и верифицировавшие опубликованный список непотраченных выходов UTXO транзакций Bitcoin, будут полагаться на
объём работы Proof-of-Work, которая была совершена
после подтверждения майнером корректности данных, содержащихся в этом файле.
На самом деле, хотя второй способ выглядит убедительнее, он практически
нереализуем, поскольку здесь требуется консенсус между майнерами Bitcoin, а в текущей ситуации майнерам всё равно, что написано во входе COINBASE-транзакции, и они будут майнить любую
валидную ветку, не проверяя корректность опубликованного файла, содержащего список непотраченных выходов UTXO. Поэтому, на мой взгляд, для Bitcoin первый способ предпочтительнее.
Однако, второй способ может быть реализован в
другой криптовалюте, консенсус которой будет
обязывать майнеров сверять размер и хеш дампа непотраченных выходов UTXO, записанных во входном скрипте COINBASE-транзакции. К тому же, для полной ноды не будет необходимости скачивать опубликованный дамп, поскольку такой файл она сможет создать
самостоятельно по заданному алгоритму.
Предлагайте здесь
другие способы отсечения старых блоков в блокчейне с полным описанием алгоритма,
не только для Bitcoin. Я буду
редактировать второй пост и добавлять ссылки на ваши идеи и решения.
Этот пост был обновлён 30.08.2019.