Bulletproofs — це короткі докази діапазону з нульовим розголошенням, завдяки яким криптовалюта може приховувати суму кожної транзакції, а кожна нода все одно перевіряє, що монети не створено з нічого. У цьому посібнику пояснено зобов’язання Педерсена, навіщо прихованим сумам докази діапазону, як Bulletproofs роблять ці докази компактними і як Blocknet використовує їх на кожному виході.
Що таке Bulletproofs?
Bulletproofs — це короткі докази з нульовим розголошенням, опубліковані Бюнцом, Бутлом, Боне, Пулстрою, Вуйє й Максвеллом 2018 року. У криптовалютах вони доводять, що прихована сума лежить у допустимому діапазоні, наприклад від 0 до 2^64, не розкриваючи її. Вони не потребують довіреного налаштування, а їхній розмір зростає лише з логарифмом діапазону.
Стаття Bulletproofs: Short Proofs for Confidential Transactions and More вийшла на симпозіумі IEEE Symposium on Security and Privacy 2018 року. Автори розробили їх для конфіденційних транзакцій, у яких суми в блокчейні замінено зобов’язаннями. Щоб зрозуміти, навіщо взагалі потрібен такий доказ, почнімо із зобов’язання.
Що таке зобов’язання Педерсена?
Зобов’язання — це криптографічна версія запечатаного конверта. Ви кладете всередину число, показуєте конверт усім і пізніше можете довести, що було всередині. Ніхто не може прочитати число з конверта, а ви не можете згодом підмінити його іншим.
Зобов’язання Педерсена, описане Торбеном Педерсеном 1991 року, робить це за допомогою точок еліптичної кривої. Щоб створити зобов’язання для суми v, гаманець вибирає випадковий секрет r, який називають маскувальним множником (blinding factor), і обчислює:
C = v·G + r·H
G і H — дві фіксовані публічні точки на кривій, вибрані так, щоб ніхто не знав, як записати одну як кратне іншої. Результат C — одна 32-байтова точка. Вона має дві властивості:
- Приховування. Оскільки
rвипадковий,Cвиглядає як випадкова точка. Та сама сума, зафіксована двічі, дає два не пов’язані зобов’язання, і саме зобов’язання нічого не каже спостерігачеві проv. - Зв’язування. Після публікації
Cгаманець не може розкрити його як іншу суму. Для цього довелося б розв’язати задачу дискретного логарифма на кривій.
Як ноди перевіряють транзакцію, яку не можуть прочитати?
Зобов’язання Педерсена можна додавати. Сума двох зобов’язань є зобов’язанням до суми їхніх значень, а маскувальні множники теж додаються. Нода підсумовує зобов’язання входів транзакції та зобов’язання її виходів плюс комісію й перевіряє, що два підсумки збігаються, тож підтверджує баланс, не бачачи жодної суми.
Додавання двох зобов’язань дає (v1 + v2)·G + (r1 + r2)·H, що саме є зобов’язанням до v1 + v2. Відправник підбирає маскувальні множники так, щоб загальне маскування входів дорівнювало загальному маскуванню виходів. Якщо суми теж збалансовані, різниця між сумою входів і сумою виходів дорівнює рівно нулю, і будь-яка нода може це перевірити.
Комісія мережі — єдине публічне число в транзакції. Ноди перетворюють її на зобов’язання з нульовим маскувальним множником і додають до виходів, тож перевірка має вигляд: входи = виходи + комісія.
Навіщо прихованим сумам докази діапазону?
Арифметика зобов’язань працює за модулем дуже великого числа, порядку групи кривої, що становить приблизно 2^252. У такій арифметиці «від’ємна» сума — це просто величезна додатна. Хтось міг би витратити вхід на 10 монет і створити два виходи, один на 11, а другий на «мінус 1». Зобов’язання ідеально зійшлися б, і з нічого з’явилася б 1 монета, прихована від усіх спостерігачів.
Доказ діапазону закриває цю прогалину. Він доводить, що сума всередині зобов’язання лежить між 0 і 2^64, не кажучи, яка вона. Коли кожен вихід обмежено таким чином, кілька виходів ніколи не можуть у сумі дати число, достатньо велике, щоб перейти через порядок групи, тож збалансовані зобов’язання означають збалансовані суми.
Ранні схеми конфіденційних транзакцій використовували докази діапазону, розмір яких зростав лінійно з кількістю бітів. Bulletproofs зростають лише з логарифмом, що зменшує 64-бітовий доказ до кількох сотень байтів.
Як працюють Bulletproofs?
Bulletproof доводить діапазон у три кроки.
- Розкласти суму на біти. 64-бітова сума стає вектором із 64 бітів. Той, хто доводить, створює зобов’язання до цього вектора й показує про нього два факти: кожен елемент дорівнює 0 або 1, а біти, зважені степенями двійки, у сумі дають зафіксовану суму.
- Звести ці факти до одного скалярного добутку. За допомогою випадкових викликів (challenges) той, хто доводить, згортає всі ці умови в одне твердження про скалярний добуток двох векторів. Оскільки виклики випадкові, хибне твердження проходить перевірку лише з мізерною ймовірністю.
- Довести скалярний добуток діленням навпіл. У кожному раунді той, хто доводить, надсилає дві точки кривої,
LіR, і обидва вектори згортаються до половини довжини. Після log2(64) = 6 раундів залишається одна пара чисел.
Саме це ділення навпіл і визначає розмір. Анотація статті оцінює доказ діапазону в 2·log2(n) + 9 елементів групи й поля для n-бітового діапазону. Для 64 бітів це 12 точок із шести раундів плюс ще 9, разом 21 елемент, або 672 байти, якщо кожен елемент займає 32 байти.
Доказ неінтерактивний. Замість живого перевіряльника, який надсилає виклики, обидві сторони виводять їх, хешуючи стенограму доказу, — це стандартна техніка, відома як евристика Фіата — Шаміра. Bulletproofs також не потребують довіреного налаштування: генератори публічні й виводяться відкрито, а безпека спирається лише на припущення про складність дискретного логарифма. Кілька доказів можна агрегувати, додаючи лише логарифмічну кількість елементів, а перевірку можна виконувати пакетами.
Хто використовує Bulletproofs?
Monero ввімкнув Bulletproofs в оновленні мережі 18 жовтня 2018 року (реліз v0.13.0), щоб зменшити розмір транзакцій. Бібліотека bulletproofs на Rust від проєкту dalek-cryptography реалізує їх над групою Ristretto кривої Curve25519, і криптографічна бібліотека Blocknet побудована на ній.
Як Blocknet приховує кожну суму?
У Blocknet кожен вихід кожної транзакції містить зобов’язання Педерсена замість суми, і кожен вихід має власний 64-бітовий Bulletproof. Конфіденційність є частиною формату транзакцій без прозорого режиму, тож надіслати платіж із видимою сумою неможливо.
Ось що перевіряє нода, перш ніж прийняти транзакцію:
- Кожен доказ діапазону. Bulletproof кожного виходу мусить пройти перевірку щодо його зобов’язання, доводячи, що сума лежить між 0 і 2^64. Докази використовують стенограму з міткою «Blocknet Range Proof», яка прив’язує кожен доказ до Blocknet.
- Баланс. Кожен вхід містить зобов’язання псевдовиходу, а кільцевий підпис доводить, що воно фіксує ту саму суму, що й справжня монета, яка витрачається, не розкриваючи, котрий це учасник кільця. Потім нода перевіряє, що псевдовиходи в сумі дорівнюють виходам плюс комісія.
- Нові монети. Винагорода за блок відповідає публічному графіку, тож для намайненого виходу нода відтворює зобов’язання, яке очікує для цієї висоти, і перевіряє збіг.
Це можна побачити в оглядачі Blocknet. Сторінка транзакції показує суми як «hidden · Pedersen commitments», а кожен вихід — своє зобов’язання, зашифроване мемо й доказ діапазону «672 bytes · Bulletproof», тобто саме той розмір, який передбачають наведені вище розрахунки.
Отримувач усе одно бачить справжню суму. Кожен вихід містить суму, зашифровану секретом, спільним для гаманців відправника й отримувача, і гаманець отримувача розшифровує її приватним ключем перегляду. Суму бачать дві сторони платежу й більше ніхто.
Приховані суми працюють разом з іншими рівнями Blocknet: кільцеві підписи по 16 виходах приховують відправника, одноразові стелс-адреси приховують отримувача, а Dandelion++ приховує, де транзакція увійшла в мережу. Посібник з функцій конфіденційності Blocknet розбирає кожен із них.
Отримайте власні приватні BNT
Простий спосіб отримати монети з прихованими сумами — намайнити їх. Blocknet використовує вимогливий до пам’яті доказ роботи Argon2id, який можна майнити на звичайному комп’ютері, а seine майнить його на вашому CPU разом із будь-якими GPU NVIDIA і налаштовується сам, без жодної конфігурації. Кожна виплата, яку надсилає вам bntpool.com, надходить як приватний вихід зі зобов’язанням і Bulletproof. Посібник з майнінгу проведе вас від завантаження до прийнятих шар за кілька хвилин.
Поширені запитання
Чи потребують Bulletproofs довіреного налаштування?
Ні. Bulletproofs спираються лише на припущення про складність дискретного логарифма, те саме, на якому ґрунтуються підписи на еліптичних кривих, і використовують публічні параметри, які може вивести будь-хто. Немає ні церемонії налаштування, ні секрету, який хтось мусить потім знищити, і приватні монети, зокрема Monero і Blocknet, використовують їх для своїх доказів діапазону.
Якого розміру доказ діапазону Bulletproofs?
Один 64-бітовий Bulletproof містить 2 × log2(64) + 9 = 21 елемент. У групі Ristretto кожен елемент займає 32 байти, тож кожен доказ має 672 байти, і саме стільки оглядач Blocknet показує для кожного виходу. Розмір зростає з логарифмом діапазону, тож подвоєння кількості бітів додає лише два елементи.
Хто бачить суму транзакції Blocknet?
Лише відправник і отримувач. Блокчейн зберігає для кожного виходу зобов'язання Педерсена й доказ діапазону, а також суму, зашифровану секретом, спільним для двох гаманців. Гаманець отримувача розшифровує її приватним ключем перегляду. Комісія мережі — єдине публічне число, тож ноди можуть додати її до перевірки балансу.
Як ноди знають, що монети не створено з нічого, якщо суми приховані?
Кожна нода перевіряє дві речі для кожної транзакції. Зобов'язання Педерсена мають сходитися, тобто входи дорівнюють виходам плюс комісія, і кожен вихід мусить містити дійсний доказ діапазону, що його сума лежить між 0 і 2^64. Разом це виключає приховану інфляцію, не розкриваючи жодної суми.