Что именно доказывает ограничение схемы Circom a * b?

Я использую эту схему согласно официальной документации:

      
pragma circom 2.0.0;

/*This circuit template checks that c is the multiplication of a and b.*/  

template Multiplier2 () {  

   // Declaration of signals.  
   signal input a;  
   signal input b;  
   signal output c;  

   // Constraints.  
   c <== a * b;  
}

и загрузите следующий входной файл (input.json):

      {"a": "3", "b": "11"}

Затем скомпилируйте и сгенерируйте свидетельство/доказательство и проверьте:

      circom multiplier2.circom --r1cs --wasm --sym --c

node generate_witness.js multiplier2.wasm input.json witness.wtns

snarkjs powersoftau new bn128 12 pot12_0000.ptau -v
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="First contribution" -v
snarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v
snarkjs groth16 setup multiplier2.r1cs pot12_final.ptau multiplier2_0000.zkey
snarkjs zkey contribute multiplier2_0000.zkey multiplier2_0001.zkey --name="1st Contributor Name" -v
snarkjs zkey export verificationkey multiplier2_0001.zkey verification_key.json
snarkjs groth16 prove multiplier2_0001.zkey witness.wtns proof.json public.json
snarkjs groth16 verify verification_key.json public.json proof.json

Оно говорит:

      [INFO]  snarkJS: OK!

В документации сказано, что это доказывает, что я знаю коэффициенты 33. Но я нигде не ввожу 33, более того, я получаю тот же результат, если изменю схему на:

      template Multiplier2 () {  

   // Declaration of signals.  
   signal input a;  
   signal input b;  
   signal output c;  

   // Constraints.  
   c <== a * b * -1;  
}

Вопрос, как мне доказать, что я знаю множители 33, если я нигде не ввожу 33?

3 ответа

Доказательством того, что вы знаете множители «33», является то, что вы проверяемо вычислили схему умножения с входными данными и и привели к нахождению 33. Поскольку и не объявлены общедоступными, они хранятся в секрете от проверяющих. Итак, когда ваше доказательство проверено, оно сообщает проверяющему: «Кто бы ни создал это доказательство, он действительно предоставил факторы».aиbчтобы получить 33, им необходимо знать коэффициенты 33».

Вы должны увидеть 33 вpublic.jsonкак говорится в комментарии. Я думаю, что огромное число, которое вы видите, является результатом 3 * 11 * -1, потому что отрицательное число представлено каким-то другим положительным числом в конечном поле.

В качестве альтернативы вы можете ввести 33 в качестве общедоступного ввода.cи написатьc === a * b, что по сути было бы тем же самым, насколько я знаю. Однако я бы предпочел выводить значение, а не делать это.

И еще : обратите внимание, что вы могли бы создать доказательство, используяa=1иb=33, что по-прежнему будет справедливо для этой схемы, хотя вы не будете знать факторы. Это проблема со звуком! Вы можете ввести дополнительные ограничения, чтобы гарантировать, что входные данные не равны 1 и тому подобное.

input.jsonсодержит частные сигналы, в то время какpublic.jsonсодержит выходные данные, которые пользователи схем должны доказать.

В частности, используя множитель2, мы докажем, что можем получить два делителя числа 33. То есть мы покажем, что мы знаем два целых числа a и b такие, что при их умножении в результате получается число 33.

https://docs.circom.io/getting-started/proving-circuits/

Доказательства ZK — это, по сути, подписи, которые требуют знания значения, удовлетворяющего определенной функции, для правильной генерации (поэтому они доказывают знание значения); однако они не раскрывают эти значения ни одному валидатору (поэтому они имеют нулевое разглашение). Удивительно, но доказательства ZK можно построить для любой вычислимой функции.

Файл public.json включает 33. Если вы измените его, проверка не удастся.

Другие вопросы по тегам