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' не определен

РЕДАКТИРОВАТЬ: В конце концов, у меня было две проблемы:

  1. Chrome кэшировал мой встроенный javascript (а не динамически загружаемые модули), поэтому запуск приложения привел бы к использованию устаревшего кэшированного javascript. Решение заключалось в том, чтобы долго щелкнуть кнопку обновления Chrome и выбрать «Очистить кеш и выполнить жесткую перезагрузку». Хотя я не уверен, что это хорошо для развернутых веб-сайтов, ориентированных на потребителя.

  2. Ответ Димитриса ниже позаботился о второй проблеме.

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");
    }
}
Другие вопросы по тегам