UNPKG

@zkpersona/noir-social-verify

Version:

A library that provides a simple way to verify ownership of social accounts by proving e-mails.

133 lines (131 loc) 15.4 kB
import { generateEmailVerifierInputs } from '@zk-email/zkemail-nr'; import { UltraPlonkBackend, UltraHonkBackend } from '@aztec/bb.js'; import { Noir } from '@noir-lang/noir_js'; // src/helpers.ts var circuitParams = { google: { maxHeadersLength: 576, maxBodyLength: 16384, extractFrom: true, extractTo: true }, x: { maxHeadersLength: 576, maxBodyLength: 16384, extractFrom: true, extractTo: true } }; var createProver = (circuit, backend) => { const prover = new ZKEmailProver(circuit, backend); return prover; }; var generateCircuitInputs = async (emailContent, circuitType) => { const inputs = await generateEmailVerifierInputs( emailContent, circuitParams[circuitType] ); return inputs; }; var ZKEmailProver = class { plonk; honk; noir; provingBackend; constructor(circuit, provingBackend) { const acirBytecode = circuit.bytecode; if (provingBackend.type === "plonk" || provingBackend.type === "all") { this.plonk = new UltraPlonkBackend( acirBytecode, provingBackend.options, provingBackend.circuitOptions ); } if (provingBackend.type === "honk" || provingBackend.type === "all") { this.honk = new UltraHonkBackend( acirBytecode, provingBackend.options, provingBackend.circuitOptions ); } this.provingBackend = provingBackend; this.noir = new Noir(circuit); } /** * Compute the witness for a given input to the circuit without generating a proof * * @param input - the input that should produce a satisfying witness for the circuit * @returns - the witness for the input and the output of the circuit if satisfiable */ async simulateWitness(input) { return await this.noir.execute(input); } /** * Generate a proof of a satisfying input to the circuit using a provided witness * * @param input - a satisfying witness for the circuit * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns proof of valid execution of the circuit */ async prove(witness, provingBackend) { const backend = this.getProvingBackend(provingBackend?.type); return await backend.generateProof(witness); } /** * Simulate the witness for a given input and generate a proof * * @param input - the input that should produce a satisfying witness for the circuit * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns proof of valid execution of the circuit */ async fullProve(input, provingBackend) { const { witness } = await this.simulateWitness(input); return this.prove(witness, provingBackend); } /** * Verify a proof of a satisfying input to the circuit for a given proving scheme * * @param proof - the proof to verify * @param provingBackend - optionally provided if the class was initialized with both proving schemes * @returns true if the proof is valid, false otherwise */ async verify(proof, provingBackend) { const backend = this.getProvingBackend(provingBackend?.type); return await backend.verifyProof(proof); } /** * End the prover wasm instance(s) and clean up resources */ async destroy() { if (this.plonk) { await this.plonk.destroy(); } if (this.honk) { await this.honk.destroy(); } } getProvingBackend(backendType) { let type; if (backendType === "plonk" || this.provingBackend.type === "plonk") { type = "plonk"; } else if (backendType === "honk" || this.provingBackend.type === "honk") { type = "honk"; } else { throw new Error( 'Specify a proving backend from either "plonk" or "honk"' ); } let backend; if (type === "plonk" && this.plonk) { backend = this.plonk; } else if (type === "honk" && this.honk) { backend = this.honk; } else { throw new Error(`Proving backend ${type} not initialized`); } return backend; } }; export { ZKEmailProver, circuitParams, createProver, generateCircuitInputs }; //# sourceMappingURL=index.mjs.map //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIiwiLi4vc3JjL3Byb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFPLElBQU0sYUFBMEQsR0FBQTtBQUFBLEVBQ3JFLE1BQVEsRUFBQTtBQUFBLElBQ04sZ0JBQWtCLEVBQUEsR0FBQTtBQUFBLElBQ2xCLGFBQWUsRUFBQSxLQUFBO0FBQUEsSUFDZixXQUFhLEVBQUEsSUFBQTtBQUFBLElBQ2IsU0FBVyxFQUFBO0FBQUEsR0FDYjtBQUFBLEVBQ0EsQ0FBRyxFQUFBO0FBQUEsSUFDRCxnQkFBa0IsRUFBQSxHQUFBO0FBQUEsSUFDbEIsYUFBZSxFQUFBLEtBQUE7QUFBQSxJQUNmLFdBQWEsRUFBQSxJQUFBO0FBQUEsSUFDYixTQUFXLEVBQUE7QUFBQTtBQUVmO0FBRWEsSUFBQSxZQUFBLEdBQWUsQ0FDMUIsT0FBQSxFQUNBLE9BQ0csS0FBQTtBQUNILEVBQUEsTUFBTSxNQUFTLEdBQUEsSUFBSSxhQUFjLENBQUEsT0FBQSxFQUFTLE9BQU8sQ0FBQTtBQUNqRCxFQUFPLE9BQUEsTUFBQTtBQUNUO0FBRWEsSUFBQSxxQkFBQSxHQUF3QixPQUNuQyxZQUFBLEVBQ0EsV0FDRyxLQUFBO0FBQ0gsRUFBQSxNQUFNLFNBQVMsTUFBTSwyQkFBQTtBQUFBLElBQ25CLFlBQUE7QUFBQSxJQUNBLGNBQWMsV0FBVztBQUFBLEdBQzNCO0FBRUEsRUFBTyxPQUFBLE1BQUE7QUFDVDtBQ3JCTyxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFDekIsS0FBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsY0FBQTtBQUFBLEVBRUEsV0FBQSxDQUFZLFNBQTBCLGNBQWdDLEVBQUE7QUFDcEUsSUFBQSxNQUFNLGVBQWUsT0FBUSxDQUFBLFFBQUE7QUFDN0IsSUFBQSxJQUFJLGNBQWUsQ0FBQSxJQUFBLEtBQVMsT0FBVyxJQUFBLGNBQUEsQ0FBZSxTQUFTLEtBQU8sRUFBQTtBQUNwRSxNQUFBLElBQUEsQ0FB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QUFDdkMsTUFBQSxPQUFBLEdBQVUsSUFBSyxDQUFBLElBQUE7QUFBQSxLQUNWLE1BQUE7QUFDTCxNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBbUIsZ0JBQUEsRUFBQSxJQUFJLENBQWtCLGdCQUFBLENBQUEsQ0FBQTtBQUFBO0FBRzNELElBQU8sT0FBQSxPQUFBO0FBQUE7QUFFWCIsImZpbGUiOiJpbmRleC5tanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbXBpbGVkQ2lyY3VpdCB9IGZyb20gJ0Bub2lyLWxhbmcvbm9pcl9qcyc7XG5pbXBvcnQge1xuICB0eXBlIElucHV0R2VuZXJhdGlvbkFyZ3MsXG4gIGdlbmVyYXRlRW1haWxWZXJpZmllcklucHV0cyxcbn0gZnJvbSAnQHprLWVtYWlsL3prZW1haWwtbnInO1xuaW1wb3J0IHsgdHlwZSBQcm92aW5nQmFja2VuZCwgWktFbWFpbFByb3ZlciB9IGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgdHlwZSB7IENpcmN1aXRJbnB1dE1hcCwgQ2lyY3VpdFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGNpcmN1aXRQYXJhbXM6IFJlY29yZDxDaXJjdWl0VHlwZSwgSW5wdXRHZW5lcmF0aW9uQXJncz4gPSB7XG4gIGdvb2dsZToge1xuICAgIG1heEhlYWRlcnNMZW5ndGg6IDU3NixcbiAgICBtYXhCb2R5TGVuZ3RoOiAxNjM4NCxcbiAgICBleHRyYWN0RnJvbTogdHJ1ZSxcbiAgICBleHRyYWN0VG86IHRydWUsXG4gIH0sXG4gIHg6IHtcbiAgICBtYXhIZWFkZXJzTGVuZ3RoOiA1NzYsXG4gICAgbWF4Qm9keUxlbmd0aDogMTYzODQsXG4gICAgZXh0cmFjdEZyb206IHRydWUsXG4gICAgZXh0cmFjdFRvOiB0cnVlLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVByb3ZlciA9IChcbiAgY2lyY3VpdDogQ29tcGlsZWRDaXJjdWl0LFxuICBiYWNrZW5kOiBQcm92aW5nQmFja2VuZFxuKSA9PiB7XG4gIGNvbnN0IHByb3ZlciA9IG5ldyBaS0VtYWlsUHJvdmVyKGNpcmN1aXQsIGJhY2tlbmQpO1xuICByZXR1cm4gcHJvdmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ2lyY3VpdElucHV0cyA9IGFzeW5jIDxUIGV4dGVuZHMgQ2lyY3VpdFR5cGU+KFxuICBlbWFpbENvbnRlbnQ6IEJ1ZmZlciB8IHN0cmluZyxcbiAgY2lyY3VpdFR5cGU6IFRcbikgPT4ge1xuICBjb25zdCBpbnB1dHMgPSBhd2FpdCBnZW5lcmF0ZUVtYWlsVmVyaWZpZXJJbnB1dHMoXG4gICAgZW1haWxDb250ZW50LFxuICAgIGNpcmN1aXRQYXJhbXNbY2lyY3VpdFR5cGVdXG4gICk7XG5cbiAgcmV0dXJuIGlucHV0cyBhcyBDaXJjdWl0SW5wdXRNYXBbVF07XG59O1xuIiwiaW1wb3J0IHtcbiAgdHlwZSBCYWNrZW5kT3B0aW9ucyxcbiAgdHlwZSBQcm9vZkRhdGEsXG4gIFVsdHJhSG9ua0JhY2tlbmQsXG4gIFVsdHJhUGxvbmtCYWNrZW5kLFxufSBmcm9tICdAYXp0ZWMvYmIuanMnO1xuaW1wb3J0IHsgdHlwZSBDb21waWxlZENpcmN1aXQsIHR5cGUgSW5wdXRNYXAsIE5vaXIgfSBmcm9tICdAbm9pci1sYW5nL25vaXJfanMnO1xudHlwZSBJbnB1dFZhbHVlID0gSW5wdXRNYXBbc3RyaW5nXTtcblxudHlwZSBDaXJjdWl0T3B0aW9ucyA9IHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRvIHByb2R1Y2UgU05BUksgZnJpZW5kbHkgcHJvb2ZzICovXG4gIHJlY3Vyc2l2ZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3ZpbmdCYWNrZW5kID0ge1xuICB0eXBlOiAnaG9uaycgfCAncGxvbmsnIHwgJ2FsbCc7XG4gIG9wdGlvbnM/OiBCYWNrZW5kT3B0aW9ucztcbiAgY2lyY3VpdE9wdGlvbnM/OiBDaXJjdWl0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjbGFzcyBaS0VtYWlsUHJvdmVyIHtcbiAgcGxvbms/OiBVbHRyYVBsb25rQmFja2VuZDtcbiAgaG9uaz86IFVsdHJhSG9ua0JhY2tlbmQ7XG4gIG5vaXI6IE5vaXI7XG4gIHByb3ZpbmdCYWNrZW5kOiBQcm92aW5nQmFja2VuZDtcblxuICBjb25zdHJ1Y3RvcihjaXJjdWl0OiBDb21waWxlZENpcmN1aXQsIHByb3ZpbmdCYWNrZW5kOiBQcm92aW5nQmFja2VuZCkge1xuICAgIGNvbnN0IGFjaXJCeXRlY29kZSA9IGNpcmN1aXQuYnl0ZWNvZGU7XG4gICAgaWYgKHByb3ZpbmdCYWNrZW5kLnR5cGUgPT09ICdwbG9uaycgfHwgcHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMucGxvbmsgPSBuZXcgVWx0cmFQbG9ua0JhY2tlbmQoXG4gICAgICAgIGFjaXJCeXRlY29kZSxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQub3B0aW9ucyxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQuY2lyY3VpdE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm92aW5nQmFja2VuZC50eXBlID09PSAnaG9uaycgfHwgcHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuaG9uayA9IG5ldyBVbHRyYUhvbmtCYWNrZW5kKFxuICAgICAgICBhY2lyQnl0ZWNvZGUsXG4gICAgICAgIHByb3ZpbmdCYWNrZW5kLm9wdGlvbnMsXG4gICAgICAgIHByb3ZpbmdCYWNrZW5kLmNpcmN1aXRPcHRpb25zXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnByb3ZpbmdCYWNrZW5kID0gcHJvdmluZ0JhY2tlbmQ7XG4gICAgdGhpcy5ub2lyID0gbmV3IE5vaXIoY2lyY3VpdCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgd2l0bmVzcyBmb3IgYSBnaXZlbiBpbnB1dCB0byB0aGUgY2lyY3VpdCB3aXRob3V0IGdlbmVyYXRpbmcgYSBwcm9vZlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSB0aGUgaW5wdXQgdGhhdCBzaG91bGQgcHJvZHVjZSBhIHNhdGlzZnlpbmcgd2l0bmVzcyBmb3IgdGhlIGNpcmN1aXRcbiAgICogQHJldHVybnMgLSB0aGUgd2l0bmVzcyBmb3IgdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0IG9mIHRoZSBjaXJjdWl0IGlmIHNhdGlzZmlhYmxlXG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdpdG5lc3MoXG4gICAgaW5wdXQ6IElucHV0TWFwXG4gICk6IFByb21pc2U8eyB3aXRuZXNzOiBVaW50OEFycmF5OyByZXR1cm5WYWx1ZTogSW5wdXRWYWx1ZSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubm9pci5leGVjdXRlKGlucHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHByb29mIG9mIGEgc2F0aXNmeWluZyBpbnB1dCB0byB0aGUgY2lyY3VpdCB1c2luZyBhIHByb3ZpZGVkIHdpdG5lc3NcbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gYSBzYXRpc2Z5aW5nIHdpdG5lc3MgZm9yIHRoZSBjaXJjdWl0XG4gICAqIEBwYXJhbSBwcm92aW5nQmFja2VuZCAtIG9wdGlvbmFsbHkgcHJvdmlkZWQgaWYgdGhlIGNsYXNzIHdhcyBpbml0aWFsaXplZCB3aXRoIGJvdGggcHJvdmluZyBzY2hlbWVzXG4gICAqIEByZXR1cm5zIHByb29mIG9mIHZhbGlkIGV4ZWN1dGlvbiBvZiB0aGUgY2lyY3VpdFxuICAgKi9cbiAgYXN5bmMgcHJvdmUoXG4gICAgd2l0bmVzczogVWludDhBcnJheSxcbiAgICBwcm92aW5nQmFja2VuZD86IFByb3ZpbmdCYWNrZW5kXG4gICk6IFByb21pc2U8UHJvb2ZEYXRhPiB7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuZ2V0UHJvdmluZ0JhY2tlbmQocHJvdmluZ0JhY2tlbmQ/LnR5cGUpO1xuICAgIHJldHVybiBhd2FpdCBiYWNrZW5kLmdlbmVyYXRlUHJvb2Yod2l0bmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGUgdGhlIHdpdG5lc3MgZm9yIGEgZ2l2ZW4gaW5wdXQgYW5kIGdlbmVyYXRlIGEgcHJvb2ZcbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gdGhlIGlucHV0IHRoYXQgc2hvdWxkIHByb2R1Y2UgYSBzYXRpc2Z5aW5nIHdpdG5lc3MgZm9yIHRoZSBjaXJjdWl0XG4gICAqIEBwYXJhbSBwcm92aW5nQmFja2VuZCAtIG9wdGlvbmFsbHkgcHJvdmlkZWQgaWYgdGhlIGNsYXNzIHdhcyBpbml0aWFsaXplZCB3aXRoIGJvdGggcHJvdmluZyBzY2hlbWVzXG4gICAqIEByZXR1cm5zIHByb29mIG9mIHZhbGlkIGV4ZWN1dGlvbiBvZiB0aGUgY2lyY3VpdFxuICAgKi9cbiAgYXN5bmMgZnVsbFByb3ZlKFxuICAgIGlucHV0OiBJbnB1dE1hcCxcbiAgICBwcm92aW5nQmFja2VuZD86IFByb3ZpbmdCYWNrZW5kXG4gICk6IFByb21pc2U8UHJvb2ZEYXRhPiB7XG4gICAgY29uc3QgeyB3aXRuZXNzIH0gPSBhd2FpdCB0aGlzLnNpbXVsYXRlV2l0bmVzcyhpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMucHJvdmUod2l0bmVzcywgcHJvdmluZ0JhY2tlbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBhIHByb29mIG9mIGEgc2F0aXNmeWluZyBpbnB1dCB0byB0aGUgY2lyY3VpdCBmb3IgYSBnaXZlbiBwcm92aW5nIHNjaGVtZVxuICAgKlxuICAgKiBAcGFyYW0gcHJvb2YgLSB0aGUgcHJvb2YgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBwcm92aW5nQmFja2VuZCAtIG9wdGlvbmFsbHkgcHJvdmlkZWQgaWYgdGhlIGNsYXNzIHdhcyBpbml0aWFsaXplZCB3aXRoIGJvdGggcHJvdmluZyBzY2hlbWVzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHByb29mIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGFzeW5jIHZlcmlmeShcbiAgICBwcm9vZjogUHJvb2ZEYXRhLFxuICAgIHByb3ZpbmdCYWNrZW5kPzogUHJvdmluZ0JhY2tlbmRcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuZ2V0UHJvdmluZ0JhY2tlbmQocHJvdmluZ0JhY2tlbmQ/LnR5cGUpO1xuICAgIHJldHVybiBhd2FpdCBiYWNrZW5kLnZlcmlmeVByb29mKHByb29mKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIHByb3ZlciB3YXNtIGluc3RhbmNlKHMpIGFuZCBjbGVhbiB1cCByZXNvdXJjZXNcbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucGxvbmspIHtcbiAgICAgIGF3YWl0IHRoaXMucGxvbmsuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ob25rKSB7XG4gICAgICBhd2FpdCB0aGlzLmhvbmsuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvdmluZ0JhY2tlbmQoYmFja2VuZFR5cGU/OiBQcm92aW5nQmFja2VuZFsndHlwZSddKSB7XG4gICAgbGV0IHR5cGU6ICdwbG9uaycgfCAnaG9uayc7XG4gICAgaWYgKGJhY2tlbmRUeXBlID09PSAncGxvbmsnIHx8IHRoaXMucHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ3Bsb25rJykge1xuICAgICAgdHlwZSA9ICdwbG9uayc7XG4gICAgfSBlbHNlIGlmIChiYWNrZW5kVHlwZSA9PT0gJ2hvbmsnIHx8IHRoaXMucHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ2hvbmsnKSB7XG4gICAgICB0eXBlID0gJ2hvbmsnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdTcGVjaWZ5IGEgcHJvdmluZyBiYWNrZW5kIGZyb20gZWl0aGVyIFwicGxvbmtcIiBvciBcImhvbmtcIidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJhY2tlbmQ6IFVsdHJhUGxvbmtCYWNrZW5kIHwgVWx0cmFIb25rQmFja2VuZDtcbiAgICBpZiAodHlwZSA9PT0gJ3Bsb25rJyAmJiB0aGlzLnBsb25rKSB7XG4gICAgICBiYWNrZW5kID0gdGhpcy5wbG9uaztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdob25rJyAmJiB0aGlzLmhvbmspIHtcbiAgICAgIGJhY2tlbmQgPSB0aGlzLmhvbms7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmluZyBiYWNrZW5kICR7dHlwZX0gbm90IGluaXRpYWxpemVkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tlbmQ7XG4gIH1cbn1cbiJdfQ==