diff --git a/commitment-proof/src/AgeProgram.ts b/commitment-proof/src/AgeProgram.ts new file mode 100644 index 0000000..fc44eab --- /dev/null +++ b/commitment-proof/src/AgeProgram.ts @@ -0,0 +1,34 @@ +import { ZkProgram, Field, Struct } from 'o1js'; + +export class PublicInputs extends Struct({ + minimumAge: Field +}) {} + +export class PrivateInputs extends Struct({ + age: Field +}) {} + +export class PublicOutputs extends Struct({ + isValid : Field +}) {} + +export const AgeProgram = ZkProgram({ + name: 'AgeProof', + publicInput: PublicInputs, + publicOutput: PublicOutputs, + methods: { + prove: { + privateInputs: [PrivateInputs], + async method(publicInput: PublicInputs, privateInput: PrivateInputs) { + privateInput.age.assertGreaterThanOrEqual(publicInput.minimumAge); + + return { + publicOutput: { + isValid: Field(1), + }, + }; + }, + }, + }, + +}); \ No newline at end of file diff --git a/commitment-proof/src/age-interact.ts b/commitment-proof/src/age-interact.ts new file mode 100644 index 0000000..a86fe58 --- /dev/null +++ b/commitment-proof/src/age-interact.ts @@ -0,0 +1,45 @@ +import { Field } from 'o1js'; +import { AgeProgram, PublicInputs, PrivateInputs } from './AgeProgram.js'; + +console.log('Compiling AgeProgram'); +const { verificationKey } = await AgeProgram.compile(); +console.log('Compilation complete\n'); + +// Test 1: + +const minimumAge = Field(18); +const validAge = Field(25); + +console.log('Your Age (Private):', validAge.toString()); +console.log('Minimum Age Required:', minimumAge.toString()); +console.log('Generating proof'); + +const publicInput1 = new PublicInputs({ minimumAge }); +const privateInput1 = new PrivateInputs({ age: validAge }); + +const { proof: validProof } = await AgeProgram.prove(publicInput1, privateInput1); + +console.log('Proof generated!'); +console.log('Verifying proof...'); + +await validProof.verify(); +console.log('Proof is valid!\n'); + +// Test 2: Invalid + +const invalidAge = Field(17); + +console.log('Your Age (Private):', invalidAge.toString()); +console.log('Minimum Age Required:', minimumAge.toString()); +console.log('Attempting to generate proof'); + +try { + const publicInput2 = new PublicInputs({ minimumAge }); + const privateInput2 = new PrivateInputs({ age: invalidAge }); + + await AgeProgram.prove(publicInput2, privateInput2); + console.log('Invalid'); +} catch (error) { + console.log('Cannot prove age < 18'); + console.log('Error:', error instanceof Error ? error.message.split('\n')[0] : error); +} \ No newline at end of file