Ваше векторное обязательство не имеет ослепляющего фактора, то есть оно не скрывает, относятся ли два разных обязательства к одному и тому же списку $a_i$ составные части. В зависимости от характера $a_i$ компонентов, также может быть возможно провести перебор обязательств, чтобы определить компоненты, которые оно представляет.
Мы можем легко исправить это, добавив ослепляющий фактор. $b$:
$C = a_0G_0 + a_1G_1 + ... + a_{n-1}G_{n-1} + bH$
Мы хотим показать, что каждый компонент $a_i$ является положительным целым числом, меньшим, чем $2^s$.
Для этого мы создаем и объявляем $(n\cdot с)$ обязательства, каждое из которых имеет свой равномерно случайный ослепляющий фактор $b_{i,j}$, куда $0\leq i <n$ и $0\leq j <s$. Каждое обязательство $C_{i,j}$ рассчитывается как $C_{i,j} = (z_{i,j}\cdot 2^j)G_i + b_{i,j}H$, куда $z_{i,j}$ является $0$ или же $1$ и представляет $j$й бит компонента $a_i$.
Верификатор может вычислить $C'=\сумма C_{i,j}$. Мы можем продемонстрировать, что $С$ представляет тот же список $a_i$ компоненты как $С'$ путем предоставления подписи для открытого ключа $(С-С')$ на базовой точке $Ч$. Закрытый ключ для точки $(С-С')$ будет значение $b-\сумма b_{i,j}$.
Теперь мы продемонстрировали две вещи: $С$ является приверженность тому же списку компонентов, что и $С'$, и что каждый компонент $a_i$ создается в виде списка не более $s$ бит (и, следовательно, должно быть положительным целым числом).
Остается лишь продемонстрировать, что каждое из заявленных обязательств $C_{i,j}$ действительно является обязательством $0$ или к $2^jG_i$.
Это может быть достигнуто с помощью любого типа кольцевой подписи, которая подтверждает закрытый ключ для любого $C_{i,j}$ или же $(C_{i,j} - 2^jG_i)$ на базовой точке $Ч$ известен. Для этого вы можете использовать пуленепробиваемые или более простые для понимания кольцевые подписи Борромео.