Рассмотрим пару $\mathbb{e}: \mathbb{G}_1\times \mathbb{G}_2\longrightarrow \mathbb{G}_T$ с генераторами $g_1$, $g_2$ за $\mathbb{G}_1$, $\mathbb{G}_2$ соответственно. Группы $\mathbb{G}_1$, $\mathbb{G}_2$, $\mathbb{G}_T$ имеют некоторый простой порядок $р$.
Для люка $s$, позволять $[g_1,g_1^s,\cdots,g_1^{s^N}], [g_2,g_2^s,\cdots,g_2^{s^N}]$ быть общей строкой ссылки (хотя для некоторых схем Snarks и полиномиальных обязательств параметр public не содержит $g_2^{s^i}$ за $i\geq 2$).
Данные элементы $a,b\in\mathbb{G}_1$, я хотел бы доказать в ЗК, что я знаю константу (в отличие от многочлена большей степени) $\альфа$ такой, что $ а ^ {\ альфа} = б $. Каков наиболее эффективный способ сделать это?
Пара идей, которые у меня были:
Идея 1:
Для случайно сгенерированного элемента $a_2\in\mathbb{G}_2$ (вызов), Доказывающий отправляет элемент $b_2:= a_2^{\alpha}$.
Verifier выполняет проверку сопряжения $\mathbb{e}(a,b_2) = \mathbb{e}(a_2,b)$
Идея 2
Доказывающий доказывает с нулевым разглашением, что он знает некоторый многочлен $ф(Х)$ такой, что $ а ^ {е (с)} = б $ (есть простые способы сделать это, не слишком отличающиеся от протокола Шнорра для PoK дискретных журналов)
Доказывающий отправляет элемент $b_2:= g_2^{s^N\cdot\alpha}$ (что невозможно, если $\альфа = f(s)$ для некоторого непостоянного полинома $ф(Х)$).
Верификатор проверяет доказательство, отправленное на шаге 1.
Verifier выполняет проверку сопряжения $\mathbb{e}(a,b_2) = \mathbb{e}(b,g_2^{s^N}) $
Существуют ли более эффективные протоколы, которые выполняли бы эту работу? Мне не особенно нравится идея полагаться на алгоритм хеширования, который генерирует случайные элементы группы. $\mathbb{G}_2$ как вызовы.