Blazor вызывает SnarkJS
Для SnarkJS (https://github.com/iden3/snarkjs) есть пример HTML, показывающий, как использовать их библиотеку javascript ES6:
<!doctype html>
<html>
<body>
<script src="snarkjs.min.js"> </script>
<script>
async function calculateProof() {
const { proof, publicSignals } =
await snarkjs.groth16.fullProve( { a: 3, b: 11}, "circuit.wasm", "circuit_final.zkey");
</script>
</body>
</html>
Этот вызов snarkjs.groth16.fullProve отлично работает в браузере.
В Blazor я загружаю snarkjs.min.js в IJSObjectReference (myJSmodule), но я не знаю, как эмулировать вызов snarkjs.groth16.fullProve из Blazor в модуль. Что-то вроде:
await myJSmodule.InvokeVoidAsync("snarkjs.groth16.fullProve", args...)
но это производит
Не удалось найти 'snarkjs.groth16.fullProve'...'snarkjs' не определен
РЕДАКТИРОВАТЬ: В конце концов, у меня было две проблемы:
Chrome кэшировал мой встроенный javascript (а не динамически загружаемые модули), поэтому запуск приложения привел бы к использованию устаревшего кэшированного javascript. Решение заключалось в том, чтобы долго щелкнуть кнопку обновления Chrome и выбрать «Очистить кеш и выполнить жесткую перезагрузку». Хотя я не уверен, что это хорошо для развернутых веб-сайтов, ориентированных на потребителя.
Ответ Димитриса ниже позаботился о второй проблеме.
1 ответ
Вы можете создать вспомогательный js-модуль, который экспортируетcalculateProof
функция:
snarkJsInteropHelper.js
export async function calculateProof() {
const { proof, publicSignals } =
await snarkjs.groth16.fullProve({ a: 3, b: 11 }, "circuit.wasm", "circuit_final.zkey");
}
Затем в компоненте blazor:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
var module = await JS.InvokeAsync<IJSObjectReference>(
"import", "./snarkJsInteropHelper.js");
await module.InvokeVoidAsync("calculateProof");
}
}