UNPKG

o1js

Version:

TypeScript framework for zk-SNARKs and zkApps

36 lines (28 loc) 1.15 kB
import { Experimental, Crypto, createForeignCurve, Bytes, assert, createEcdsa } from 'o1js'; const { ZkFunction } = Experimental; export { Secp256k1, Ecdsa, Bytes32, reserves }; class Secp256k1 extends createForeignCurve(Crypto.CurveParams.Secp256k1) {} class Ecdsa extends createEcdsa(Secp256k1) {} class Bytes32 extends Bytes(32) {} const reserves = ZkFunction({ name: 'Reserves', publicInputType: Bytes32, privateInputTypes: [Ecdsa, Secp256k1], main: (message: Bytes32, signature: Ecdsa, publicKey: Secp256k1) => { assert(signature.verify(message, publicKey)); }, }); console.time('compile'); let { verificationKey } = await reserves.compile(); console.timeEnd('compile'); let message = Bytes32.random(); let privateKey = Secp256k1.Scalar.random(); let publicKey = Secp256k1.generator.scale(privateKey); let signature = Ecdsa.sign(message.toBytes(), privateKey.toBigInt()); console.time('prove'); let proof = await reserves.prove(message, signature, publicKey); console.timeEnd('prove'); console.time('verify'); let isValid = await reserves.verify(proof, verificationKey); assert(isValid, 'verifies'); console.timeEnd('verify');