UNPKG

minauth-simple-preimage-plugin

Version:

A very simple Minauth plugin that allows users to authenticate by providing a preimage to a given hash.

50 lines 2.89 kB
import * as E from 'fp-ts/lib/Either.js'; import * as RTE from 'fp-ts/lib/ReaderTaskEither.js'; import { pipe } from 'fp-ts/lib/function.js'; import { Poseidon } from 'o1js'; import { z } from 'zod'; import { fieldEncDec } from 'minauth/dist/utils/fp/fieldEncDec.js'; import { wrapZodDec } from 'minauth/dist/plugin/encodedecoder.js'; import { fpInterfaceTag } from 'minauth/dist/plugin/interfacekind.js'; import { askConfig } from 'minauth/dist/plugin/proofgenerator.js'; import { askSublogger, tapLogger, tryCatch } from 'minauth/dist/utils/fp/readertaskeither.js'; import { SimplePreimageProver } from './prover.js'; import { PluginRouter } from 'minauth/dist/plugin/pluginrouter.js'; // TODO give more visibility to proof generator configs /** Schema validating serialized configuration. */ const InputConfSchema = z.object({ pluginName: z.string().min(1), password: z.string(), serverUrl: z.string() }); const confDec = { __interface_tag: fpInterfaceTag, decode: (inp) => pipe(E.Do, E.bind('rawSchema', () => wrapZodDec('fp', InputConfSchema).decode(inp)), E.bind('password', ({ rawSchema }) => fieldEncDec.decode(rawSchema.password)), E.map(({ password, rawSchema }) => ({ password, serverUrl: rawSchema.serverUrl, pluginName: rawSchema.pluginName }))) }; const generateProof = () => pipe(RTE.Do, tapLogger((logger) => logger.info('generating proof using simple password prover')), RTE.bind('config', (askConfig)), RTE.let('privateInput', ({ config: { password } }) => password), RTE.let('publicInput', ({ privateInput }) => Poseidon.hash([privateInput])), tapLogger((logger, { publicInput }) => logger.debug('publicInput', publicInput)), RTE.bind('logger', () => askSublogger('SimplePreimageProver')), RTE.bind('pluginRouterLogger', () => askSublogger('PluginRouterLogger')), RTE.bind('pluginRouter', ({ pluginRouterLogger, config }) => tryCatch(() => PluginRouter.initialize(pluginRouterLogger, config.serverUrl, config.pluginName), (err) => ({ __tag: 'failedToInitializeProver', reason: `Error initializing plugin router: ${err}` }))), RTE.let('simplePreimageConfig', ({ pluginRouter, logger }) => ({ logger: logger, pluginRoutes: pluginRouter })), RTE.bind('prover', ({ simplePreimageConfig }) => tryCatch(() => SimplePreimageProver.initialize(simplePreimageConfig), (err) => ({ __tag: 'failedToInitializeProver', reason: String(err) }))), RTE.bind('proof', ({ prover, publicInput, privateInput }) => tryCatch(() => prover.prove(publicInput, privateInput), (err) => ({ __tag: 'failedToProve', reason: String(err) }))), tapLogger((logger) => logger.info('proof generated')), RTE.map(({ proof, config }) => ({ plugin: config.pluginName, input: { proof } }))); export const generator = { confDec, generateProof }; export default generator; //# sourceMappingURL=proofgenerator.js.map