UNPKG

o1js

Version:

TypeScript framework for zk-SNARKs and zkApps

46 lines (38 loc) 1.14 kB
import { Circuit, circuitMain, public_, Crypto, createEcdsaV2, createForeignCurveV2, Bytes, assert, } from 'o1js'; export { Secp256k1, Ecdsa, Bytes32, Reserves }; class Secp256k1 extends createForeignCurveV2(Crypto.CurveParams.Secp256k1) {} class Ecdsa extends createEcdsaV2(Secp256k1) {} class Bytes32 extends Bytes(32) {} class Reserves extends Circuit { @circuitMain static main( @public_ message: Bytes32, signature: Ecdsa, publicKey: Secp256k1 ) { assert(signature.verify(message, publicKey)); } } console.time('generateKeypair'); let kp = await Reserves.generateKeypair(); console.timeEnd('generateKeypair'); 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([signature, publicKey], [message], kp); console.timeEnd('prove'); console.time('verify'); let isValid = await Reserves.verify([message], kp.verificationKey(), proof); assert(isValid, 'verifies'); console.timeEnd('verify');