@unirep/circuits
Version:
Client library for circuit related functions which are used in UniRep protocol.
234 lines (233 loc) • 9.79 kB
JavaScript
;
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;