对于SnarkJS(https://github.com/iden3/snarkjs),有一个HTML示例显示了如何使用他们的ES6 javascript库:
<!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(中,但我不知道如何模拟Blazor对该模块的snarkjs.groth16.fullProve调用。类似于:
await myJSmodule.InvokeVoidAsync("snarkjs.groth16.fullProve", args...)
但这会产生
找不到"snarkjs.groth16.fullProve"…"narkjs"是未定义的
EDIT:最后,我遇到了两个问题:
Chrome正在缓存我的嵌入式javascript(而不是动态加载的模块(,因此运行该应用程序会导致它使用过时的缓存javascript。解决方案是长时间点击Chrome刷新按钮;空缓存和硬重新加载";。尽管我不确定这对部署的面向消费者的网站来说是否是个好兆头。
迪米特里斯下面的回答解决了第二个问题。
您可以创建一个导出calculateProof
函数的助手js模块:
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");
}
}