UNPKG

@unirep/circuits

Version:

Client library for circuit related functions which are used in UniRep protocol.

234 lines (233 loc) 9.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildSignupControl = exports.buildUserStateTransitionControl = exports.buildReputationControl = exports.buildEpochKeyControl = exports.decodeSignupControl = exports.decodeUserStateTransitionControl = exports.decodeReputationControl = exports.decodeEpochKeyControl = exports.shiftBits = exports.formatProofForSnarkjsVerification = exports.formatProofForVerifierContract = void 0; const CircuitConfig_1 = require("./CircuitConfig"); /** * Format snark proof for verifier smart contract * @param proof The proof of `SnarkProof` type * @returns An one dimensional array of stringified proof data */ const formatProofForVerifierContract = (proof) => { return [ proof.pi_a[0], proof.pi_a[1], proof.pi_b[0][1], proof.pi_b[0][0], proof.pi_b[1][1], proof.pi_b[1][0], proof.pi_c[0], proof.pi_c[1], ]; }; exports.formatProofForVerifierContract = formatProofForVerifierContract; /** * Format an one dimensional array for `snarkjs` verification * @param proof The string array of the proof * @returns The `SnarkProof` type proof data */ const formatProofForSnarkjsVerification = (proof) => { return { pi_a: [BigInt(proof[0]), BigInt(proof[1]), BigInt('1')].map((x) => x.toString()), pi_b: [ [BigInt(proof[3]), BigInt(proof[2])].map((x) => x.toString()), [BigInt(proof[5]), BigInt(proof[4])].map((x) => x.toString()), [BigInt('1'), BigInt('0')].map((x) => x.toString()), ], pi_c: [BigInt(proof[6]), BigInt(proof[7]), BigInt('1')].map((x) => x.toString()), protocol: 'groth16', curve: 'bn128', }; }; exports.formatProofForSnarkjsVerification = formatProofForSnarkjsVerification; /** * Shift `shiftBits` bits and compute the **AND** operation in `variableBits` bits `data`. * For example, Get `data` from LSB `20` to `30` bits. * Then use `shiftBits(data, 20, 10)` to get the `10` bits data. * @param data The raw data in `bigint` type. * @param shiftBits The shifted bits. * @param variableBits The output data bits. */ const shiftBits = (data, shiftBits, variableBits) => { return (data >> shiftBits) & ((BigInt(1) << variableBits) - BigInt(1)); }; exports.shiftBits = shiftBits; /** * Decode the raw control field to desired data. * @param control The raw control field generated by `genProofAndPublicSignals` * @param config The circuit config. Default: `CircuitConfig.default` * @returns \{ `nonce`, `epoch`, `attesterId`, `revealNonce`, `chainId` \} */ const decodeEpochKeyControl = (control, config = CircuitConfig_1.CircuitConfig.default) => { const { NONCE_BITS, EPOCH_BITS, ATTESTER_ID_BITS, REVEAL_NONCE_BITS, CHAIN_ID_BITS, } = config; let accBits = BigInt(0); const nonce = (0, exports.shiftBits)(control, accBits, NONCE_BITS); accBits += NONCE_BITS; const epoch = (0, exports.shiftBits)(control, accBits, EPOCH_BITS); accBits += EPOCH_BITS; const attesterId = (0, exports.shiftBits)(control, accBits, ATTESTER_ID_BITS); accBits += ATTESTER_ID_BITS; const revealNonce = (0, exports.shiftBits)(control, accBits, REVEAL_NONCE_BITS); accBits += REVEAL_NONCE_BITS; const chainId = (0, exports.shiftBits)(control, accBits, CHAIN_ID_BITS); return { nonce, epoch, attesterId, revealNonce, chainId, }; }; exports.decodeEpochKeyControl = decodeEpochKeyControl; /** * Decode the raw control field to desired data. * @param control The raw control field generated by `genProofAndPublicSignals` * @param config The circuit config. Default: `CircuitConfig.default` * @returns \{ `minRep`, `maxRep`, `proveMinRep`, `proveMaxRep`, `proveZeroRep`, `proveGraffiti` \} */ const decodeReputationControl = (control, config = CircuitConfig_1.CircuitConfig.default) => { const { REP_BITS, ONE_BIT } = config; let accBits = BigInt(0); const minRep = (0, exports.shiftBits)(control, accBits, REP_BITS); accBits += REP_BITS; const maxRep = (0, exports.shiftBits)(control, accBits, REP_BITS); accBits += REP_BITS; const proveMinRep = (0, exports.shiftBits)(control, accBits, ONE_BIT); accBits += ONE_BIT; const proveMaxRep = (0, exports.shiftBits)(control, accBits, ONE_BIT); accBits += ONE_BIT; const proveZeroRep = (0, exports.shiftBits)(control, accBits, ONE_BIT); accBits += ONE_BIT; const proveGraffiti = (0, exports.shiftBits)(control, accBits, ONE_BIT); return { minRep, maxRep, proveMinRep, proveMaxRep, proveZeroRep, proveGraffiti, }; }; exports.decodeReputationControl = decodeReputationControl; /** * Decode the raw control field to desired data. * @param control The raw control field generated by `genProofAndPublicSignals` * @param config The circuit config. Default: `CircuitConfig.default` * @returns \{ `attesterId`, `toEpoch` \} */ const decodeUserStateTransitionControl = (control, config = CircuitConfig_1.CircuitConfig.default) => { const { ATTESTER_ID_BITS, EPOCH_BITS } = config; let accBits = BigInt(0); const attesterId = (0, exports.shiftBits)(control, accBits, ATTESTER_ID_BITS); accBits += ATTESTER_ID_BITS; const toEpoch = (0, exports.shiftBits)(control, accBits, EPOCH_BITS); return { attesterId, toEpoch, }; }; exports.decodeUserStateTransitionControl = decodeUserStateTransitionControl; /** * Decode the raw control field to desired data. * @param control The raw control field generated by `genProofAndPublicSignals` * @param config The circuit config. Default: `CircuitConfig.default` * @returns \{ `attesterId`, `epoch`, `chainId` \} */ const decodeSignupControl = (control, config = CircuitConfig_1.CircuitConfig.default) => { const { ATTESTER_ID_BITS, EPOCH_BITS, CHAIN_ID_BITS } = config; let accBits = BigInt(0); const attesterId = (0, exports.shiftBits)(control, accBits, ATTESTER_ID_BITS); accBits += ATTESTER_ID_BITS; const epoch = (0, exports.shiftBits)(control, accBits, EPOCH_BITS); accBits += EPOCH_BITS; const chainId = (0, exports.shiftBits)(control, accBits, CHAIN_ID_BITS); return { attesterId, epoch, chainId, }; }; exports.decodeSignupControl = decodeSignupControl; /** * Encode data to a 253 bits variable. * @param params The data is going to be encoded. \{ `nonce`, `epoch`, `attesterId`, `revealNonce`, `chainId` \} * @param config The circuit config. Default: `CircuitConfig.default` * @returns a 253 bits control. */ const buildEpochKeyControl = (params, config = CircuitConfig_1.CircuitConfig.default) => { const { chainId, revealNonce, attesterId, epoch, nonce } = params; const { NONCE_BITS, EPOCH_BITS, ATTESTER_ID_BITS, REVEAL_NONCE_BITS } = config; let control = BigInt(0); let accBits = BigInt(0); control += BigInt(nonce) * BigInt(revealNonce); accBits += NONCE_BITS; control += BigInt(epoch) << accBits; accBits += EPOCH_BITS; control += BigInt(attesterId) << accBits; accBits += ATTESTER_ID_BITS; control += BigInt(revealNonce) << accBits; accBits += REVEAL_NONCE_BITS; control += BigInt(chainId) << accBits; return control; }; exports.buildEpochKeyControl = buildEpochKeyControl; /** * Encode data to a 253 bits variable. * @param params The data is going to be encoded. \{ `minRep`, `maxRep`, `proveMinRep`, `proveMaxRep`, `proveZeroRep`, `proveGraffiti` \} * @param config The circuit config. Default: `CircuitConfig.default` * @returns a 253 bits control. */ const buildReputationControl = (params, config = CircuitConfig_1.CircuitConfig.default) => { const { minRep, maxRep, proveMinRep, proveMaxRep, proveZeroRep, proveGraffiti, } = params; const { REP_BITS, ONE_BIT } = config; let control = BigInt(0); let accBits = BigInt(0); control += minRep; accBits += REP_BITS; control += maxRep << accBits; accBits += REP_BITS; control += proveMinRep << accBits; accBits += ONE_BIT; control += proveMaxRep << accBits; accBits += ONE_BIT; control += proveZeroRep << accBits; accBits += ONE_BIT; control += proveGraffiti << accBits; return control; }; exports.buildReputationControl = buildReputationControl; /** * Encode data to a 253 bits variable. * @param params The data is going to be encoded. \{ `attesterId`, `toEpoch` \} * @param config The circuit config. Default: `CircuitConfig.default` * @returns a 253 bits control. */ const buildUserStateTransitionControl = (params, config = CircuitConfig_1.CircuitConfig.default) => { const { attesterId, toEpoch } = params; const { ATTESTER_ID_BITS } = config; let control = BigInt(0); let accBits = BigInt(0); control += BigInt(attesterId); accBits += ATTESTER_ID_BITS; control += BigInt(toEpoch) << accBits; return control; }; exports.buildUserStateTransitionControl = buildUserStateTransitionControl; /** * Encode data to a 253 bits variable. * @param params The data is going to be encoded. \{ `attesterId`, `epoch`, `chainId` \} * @param config The circuit config. Default: `CircuitConfig.default` * @returns a 253 bits control. */ const buildSignupControl = (params, config = CircuitConfig_1.CircuitConfig.default) => { const { attesterId, epoch, chainId } = params; const { ATTESTER_ID_BITS, EPOCH_BITS } = config; let control = BigInt(0); let accBits = BigInt(0); control += BigInt(attesterId); accBits += ATTESTER_ID_BITS; control += BigInt(epoch) << accBits; accBits += EPOCH_BITS; control += BigInt(chainId) << accBits; return control; }; exports.buildSignupControl = buildSignupControl;