Хеш-функция Sha256 в Circom
Во время хакатона ETH Global Paris пыталась интегрировать циркум-схему с хешированием даты рождения, чтобы доказать, что пользователь знает дату, следуя известному руководству по среднему языку. Вот его код
pragma circom 2.0.0;
include "./circomlib/circuits/sha256/sha256.circom";
template Birthday(){
component SHA = Sha256(6);
signal input date[6];
SHA.in <== date;
signal output date_out[256];
date_out <== SHA.out;
}
component main { public [ date ] } = Birthday();
/* INPUT = {
"date": [10, 3, 0, 3, 0, 1]
} */
Ошибки с ошибкой: утверждение не выполнено.
Ошибка в строке шаблона BinSum_17: 100
Ошибка в строке шаблона SigmaPlus_18: 44
Ошибка в строке шаблона Sha256compression_97: 83
Ошибка в строке шаблона Sha256_98: 73
Ошибка в строке шаблона Birthday_99: 7
1 ответ
Я спросил своего друга Кая Джун Ира, имеет ли то, что я реализовал, какой-либо смысл. Он углубился в код SHA256 и подтвердил мои подозрения, что его реализация не самая лучшая, по крайней мере на сегодняшний день.
Кай, соавтор zrclib, порекомендовал мне использовать Poseidon, который гораздо более эффективен.
Итак, вот код схемы, который помог нам выиграть ETH Global Paris 2023:
pragma circom 2.0.0;
include "./circomlib/circuits/poseidon.circom";
template Location(){
signal input in[2];
signal output out;
component poseidon = Poseidon(2);
poseidon.inputs[0] <== in[0];
poseidon.inputs[1] <== in[1];
out <== poseidon.out;
}
component main { public [ in ] } = Location();
/* INPUT = {
"in": [100, 100]
} */