Почему snarkjs, работающий на Node.js, выдает экземпляр std::bal_alloc?
Я запускаю snarkjs поверх Node.js на машине Linux x64 с 256 ГБ ОЗУ, и у меня есть схема zk-SNARK, состоящая из ограничений ~28M.
Я хочу выполнить командуsnarkjs zkey new
для создания файла zkey из схемы, скомпилированной с помощью circom, но когда задача обрабатывает ограничения из входного файла, она всегда терпит неудачу при обработке ограничения 10-11M, выдавая ошибкуstd::bad_alloc
исключение.
Я попытался увеличить размер кучи JavaScript до 200 ГБ, добавив параметр узла.--max-old-space-size=204800
, но это не решило проблему.
Похоже, это не проблема, связанная с нехваткой памяти, поскольку в случае сбоя процесс использует ~40 ГБ памяти. Я также не думаю, что это проблема с попыткой выделить слишком большую непрерывную часть памяти, потому что snarkjs обрабатывает этот случай, создавая вектор векторов, если количество ограничений превышает определенный порог (1^20).
Я использую Node.js 18.17.0 и snarkjs 0.7.0, но я пробовал и другие версии, но проблема все еще существует.
Выход
Вывод (я добавил отпечаток в исходный код snarkjs, чтобы увидеть, при каком ограничении он терпит неудачу), который я получаю:
node --max-old-space-size=204800 node_modules/.bin/snarkjs zkey new build/my_step.r1cs resources/powersOfTau28_hez_final_25.ptau build/my_step_p1.zkey
[INFO] snarkJS: Reading r1cs
[INFO] snarkJS: Reading tauG1
[INFO] snarkJS: Reading tauG2
[INFO] snarkJS: Reading alphatauG1
[INFO] snarkJS: Reading betatauG1
processing constraints: 0/28173676
processing constraints: 500000/28173676
processing constraints: 1000000/28173676
processing constraints: 1500000/28173676
processing constraints: 2000000/28173676
processing constraints: 2500000/28173676
processing constraints: 3000000/28173676
processing constraints: 3500000/28173676
processing constraints: 4000000/28173676
processing constraints: 4500000/28173676
processing constraints: 5000000/28173676
processing constraints: 5500000/28173676
processing constraints: 6000000/28173676
processing constraints: 6500000/28173676
processing constraints: 7000000/28173676
processing constraints: 7500000/28173676
processing constraints: 8000000/28173676
processing constraints: 8500000/28173676
processing constraints: 9000000/28173676
processing constraints: 9500000/28173676
processing constraints: 10000000/28173676
processing constraints: 10500000/28173676
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
Схема
Схему, для которой я пытаюсь создать файл zkey, можно найти по адресу https://github.com/leonardovona/beacon-relay/blob/main/circuits/circuits/my_step.circom .
Действия по воспроизведению
Шаги для воспроизведения:
- Скомпилируйте схему:
circom my_step.circom --O1 --r1cs
- Создайте файл zkey:
node --max-old-space-size=204800 node_modules/.bin/snarkjs zkey new my_step.r1cs powersOfTau28_hez_final_25.ptau my_step.zkey