UNPKG

o1js

Version:

TypeScript framework for zk-SNARKs and zkApps

65 lines 2.33 kB
import { Field, sizeInBits } from './field-bigint.js'; import { Poseidon, PoseidonLegacy } from '../../bindings/crypto/poseidon.js'; import { prefixes } from '../../bindings/crypto/constants.js'; import { createHashInput } from '../../bindings/lib/provable-generic.js'; import { createHashHelpers } from '../../lib/provable/crypto/hash-generic.js'; export { Poseidon, HashHelpers, HashInput, prefixes, packToFields, hashWithPrefix, packToFieldsLegacy, HashInputLegacy, inputToBitsLegacy, HashLegacy, }; const HashInput = createHashInput(); const HashHelpers = createHashHelpers(Field, Poseidon); let { hashWithPrefix } = HashHelpers; const HashLegacy = createHashHelpers(Field, PoseidonLegacy); /** * Convert the {fields, packed} hash input representation to a list of field elements * Random_oracle_input.Chunked.pack_to_fields */ function packToFields({ fields = [], packed = [] }) { if (packed.length === 0) return fields; let packedBits = []; let currentPackedField = 0n; let currentSize = 0; for (let [field, size] of packed) { currentSize += size; if (currentSize < 255) { currentPackedField = currentPackedField * (1n << BigInt(size)) + field; } else { packedBits.push(currentPackedField); currentSize = size; currentPackedField = field; } } packedBits.push(currentPackedField); return fields.concat(packedBits); } /** * Random_oracle_input.Legacy.pack_to_fields */ function packToFieldsLegacy({ fields, bits }) { let packedFields = []; while (bits.length > 0) { let fieldBits = bits.splice(0, sizeInBits - 1); let field = Field.fromBits(fieldBits); packedFields.push(field); } return fields.concat(packedFields); } function inputToBitsLegacy({ fields, bits }) { let fieldBits = fields.map(Field.toBits).flat(); return fieldBits.concat(bits); } const HashInputLegacy = { empty() { return { fields: [], bits: [] }; }, bits(bits) { return { fields: [], bits }; }, append(input1, input2) { return { fields: (input1.fields ?? []).concat(input2.fields ?? []), bits: (input1.bits ?? []).concat(input2.bits ?? []), }; }, }; //# sourceMappingURL=poseidon-bigint.js.map