Как работает Mimblewimble

@hashmap

16 мая, Москва

Вводная

Я не криптограф

Но это не важно

Начальных знаний алгебры достаточно

За одним исключением, но это не важно для понимания

Зачем?

А если спросят

Суперключ

Понимать риски и ограничения

Это весело

План

Избежать вот этого

Эллиптические кривые

Множество точек $$y^2 = x^3 + ax + b$$ где $$4a^3 + 27b^2 \ne 0$$ и точка бесконечности 0

Абелева группа

  • Замыкание: \(\forall a \in \mathbb{G}, b \in \mathbb{G}\): \(a+b \in \mathbb{G}\)
  • Ассоциативность: \((a+b)+c=a+(b+c)\)
  • Наличие нейтрального элемента 0: \(\forall a: a+0=0+a=a\)
  • Наличие обратного элемента: \(\forall a, \exists b: a+b=0 \)
  • Коммутативность: \( a+b=b+a \)

Операция сложения точек

$$P+R+Q=0$$
$$P+Q=-R$$
$$P+P$$

Умножение точки на скаляр (число)

$$nP= P + P + P .. + P$$ \(O(n)\), более эффективный алгоритм \( O(\log n)\)

Логарифм

$$Q = nP$$ зная Q и P найти n

Поле \(\mathbb{F}_p\) основанное на кольце целых чисел

  • Множество целых чисел от 0 до \(p-1\)
  • Операции сложения и умножения (с обратным эелементом, те также вычитание и деление)
  • p простое число

Пример \(\mathbb{F}_{23} \)

  • Cложение: \((18 + 9) \bmod{23} = 4\)
  • Вычитание: \((7 - 14) \bmod{23} = 16\)
  • Умножение: \( 4 \cdot 7 \bmod{23} = 5 \)
  • Обратный элемент для сложения: \( -5 \bmod{23} = 18 \)
  • Обратный элемент для умножения: \( 9^{-1} \bmod{23} = 18 \)

Эллиптические кривые над \(\mathbb{F}_p\)

$$\begin{array}{rcl} \left\{(x, y) \in (\mathbb{F}_p)^2 \right. & \left. | \right. & \left. y^2 \equiv x^3 + ax + b \pmod{p}, \right. \\ & & \left. 4a^3 + 27b^2 \not\equiv 0 \pmod{p}\right\}\ \cup\ \left\{0\right\} \end{array}$$

Дискретный логарифм

\(Q = nP\) зная \(Q\) и \(P\) найти \(n\).

Нет алгоритма полиномиального времени, но это не точно.

"Сложнее" RSA, числа могут быть меньше (меньше битность).

Теперь забываем, абстрагируемся

  • Кривая \(C\)
  • Сложение и вычитание точек \(G + H \)
  • Умножение точки на скаляр \(k \cdot H\)
  • Коммутативность и ассоциативность \((k + j) \cdot H\ = k \cdot H + j \cdot H \)
  • Дискретный логарифм сложный (умножение просто, деление невозможно)

Криптография на эллиптических кривых

  • Закрытый ключ \(k\)
  • Открытый ключ \(k \cdot H\)
  • Открытй ключ суммы двух закрытых ключей равен сумме открытых ключей \((k + j) \cdot H\ = k \cdot H + j \cdot H \)

Свойства Mimblewimble

Верификация транзакций без раскрытия сумм (сумма outputs - сумма inputs = 0)

Доказательсво владения закрытым ключом (без явной подписи ключом)

Скрываем сумму

Транзакция \( v_{i1} + v_{i2} = v_{o1}\)

Первая попытка \( v_{i1} \cdot H + v_{i2} \cdot H = v_{o1} \cdot H\)

Полный провал!

Одним фломастером можно покрасить все, кроме самого фломастера

Скрываем число \(v\)

Два фломастера!

$$r \cdot G + v \cdot H$$

  • \(r\) - закрытый ключ, также blinding factor
  • \(G, H \in C \)
  • \(r \cdot G \) - открытый ключ для \(r\)

мы построили схему обязательсва Педерсена (Pedersen Commitment)

Вторая попытка

Транзакция \( v_{i1} + v_{i2} = v_{o1}\)

\((r_{i1} \cdot G + v_{i1} \cdot H) + (r_{i2} \cdot G + v_{i2} \cdot H) = (r_{o1} \cdot G + v_{o1} \cdot H) \)

откуда \( r_{i1} + r_{i2} = r_{o1} \)

Чего мы уже добились

  • Первое свойство MW - проверка не требует раскрытия значений
  • Возможно мы можем использовать введенные закрытые ключи для доказательства владения?

Проверим!

  • Alice шлет 3 монеты (\(v \)) Bob
  • Bob выбирает blinding factor \(r\) 28
  • В блокчейн записывается \(X = 28 \cdot G + 3 \cdot H \)
  • Bob пересылает все Carol (транзакция Y) \( Y - X = 0 \cdot G + 0 \cdot H = \\ (28 \cdot G + 3 \cdot H) - (28 \cdot G + 3 \cdot H) \)
  • Bob знает закрый ключ Carol, полный провал!

Выберем другой ключ

  • Carol выбирает закрытый ключ 113

    \( Y - X = \\ (113 \cdot G + 3 \cdot H) - (28 \cdot G + 3 \cdot H) \\ = 85 \cdot G + 0 \cdot H \)

  • Избыточное значение (excess value) на \(G\) 85
  • \(85 \cdot G \) - валидный открытй ключ при закрытом ключе 85
  • \( x \cdot G + y \cdot H \) валидный открытый ключ только если \( y = 0\)

Верификация

  • \( Y - X\) - валидный открытй ключ на \(С\)
  • Две стороны коллективно знают закрытый ключ (избыточное значение)
  • Тогда \( y = 0 \Rightarrow \) не создано новых монет
  • Простейший способ доказать - подписать ключом 85
  • Это ядро транзакции (transaction kernel)

Отрицательные значения

Добавляем range proof \( v \in (0..N)\), который также требует знания закрытых ключей

Bulletproofs: Short Proofs for Confidential Transactions and More https://eprint.iacr.org/2017/1066.pdf

Транзакция MW

  • Несколько inputs (outputs предыдущих транзакций)
  • Outputs в форме \(r \cdot G + v \cdot H \) (Pedersen commitment) и range proof, r - новый закрытый ключ, v - номинал
  • Комиссия в открытом виде
  • Подпись пустого сообщения, где ключ разница между суммой всех outputs + комиссия и inputs

Легко видеть, что

  • Блок - это транзакция
  • Cut-through
  • Состояние - количество монет, непотраченные outputs и все ядра транзакций
  • World domination!