Примечание: Основная тема создана в английском разделе Technical Discussion.
Введение
Исходя из
описания Bitcoin, технология Blockchain изначально была разработана Сатоши Накамото как
децентрализованное решение на базе алгоритма доказательства работы Proof-of-Work. Пользователи системы могут в недоверенном окружении отправлять безопасные платежи без возможности цензурирования транзакций третьими сторонами.
Однако, использование в этой технологии достаточно простых алгоритмов майнинга часто приводит к разработке специализированного оборудования и, как результат, получения некоторыми майнерами многократного превосходства над другими майнерами, не имеющими ASIC. Кроме этого, в такой ситуации майнеры объединяют свои вычислительные мощности в
майнинг-пулы, администраторы которых раздают задания по протоколу STRATUM и получают награду за блок, добавленный в блокчейн.
В итоге, отсутствие защиты против создания крупных майнинг-пулов приводит, по сути, к
централизации майнинга и к возможности цензурирования транзакций узким кругом людей.
Решение
Для решения таких проблем предлагается использовать следущий
анти-пул алгоритм PoW. Основная идея заключается в том, что каждая итерация майнинга подписывается приватным ключом COINBASE-транзакции.
Структура заголовка блока содержит 7 полей:
- 1) block_version (4 байта)
- 2) previous_block_header_hash (32 байта)
- 3) block_timestamp (8 байт)
- 4) block_difficulty (8 байт)
- 5) transaction_count (4 байта)
- 6) merkle_root (32 байта)
- 7) block_nonce (8 байт)
Затем записывается подпись
block_header_hash_sign (64 байта).
Далее в блоке следуют COINBASE-транзакция и остальные транзакции.
Цикл майнинга состоит из 4 этапов:1) В заголовке блока изменяется число
block_nonce (8 байт).
2) Заголовок блока хешируется желательно ASIC-устойчивым или CPU-ONLY алгоритмом.
На самом деле сложность хеширования не имеет значения, так первый и второй этапы, скорее всего, будут совершаться однократно, а цикл майнинга будет состоять только из третьего и четвёртого этапов.
3) Получившийся хеш заголовка блока (32 байта) подписывается приватным ключом (K) COINBASE-транзакции при помощи асимметричного шифра ECDSA secp256k1.
sign_nonce = mod(random256bit(), N)
R = X of mulPoint(sign_nonce, G)
S = mod(invert(sign_nonce, N) * (block_header_hash + (K * R)), N)
4) В подписи хеша заголовка блока RS (64 байта) проверяется, например, количество младших нулевых битов (LSB числа S). Если это количество меньше таргетированной сложности, то число
block_nonce (8 байт) опять изменяется и цикл майнинга повторяется.
Если цикл майнинга успешен, то майнер изменяет в блоке подпись RS
block_header_hash_sign (64 байта) и как можно быстрее броадкастит этот смайненный блок в сеть.
Заключение
При такой схеме майнеры будут объединять свои вычислительные мощности, но в
границах серверной комнаты или узкой доверенной группы участников, иначе монеты с адреса COINBASE-тракзакции могут быть сразу похищены недоверенным майнером. Кроме этого, даже при внесении залога, почти невозможно будет достоверно определить, кто именно из участников группы создал транзакцию и перевёл награду за смайненный блок на другой адрес.
Если майнеры будут отправлять хеши на подпись майнинг-пулу по сети, то это будет огромный трафик с радикальным снижением эффективности майнинга. Однако, майнеры смогут изменять число
sign_nonce (32 байта) и подбирать подпись RS, которая подходит требованиям, асимметричным шифром ECDSA secp256k1
вместо хеширования заголовка блока ASIC-устойчивым алгоритмом.
Описанный анти-пул алгоритм PoW позволяет существенно
снизить централизацию майнинга. Отсутствие крупных майнинг-пулов уменьшает возможность цензурирования транзакций третьими сторонами, а также повышает шансы на получение награды за майнинг для обычных пользователей системы, имеющих полную ноду.