Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 4x 4x 4x 4x 4x 31x 64x 64x 64x 64x 64x 33x 31x 4x 108x 27x 27x 27x 27x 26x 27x 27x 27x 22x 22x 11x 21x 21x 21x 21x 21x 4x | import { ProjPointType } from '@noble/curves/abstract/weierstrass'; import { secp256k1 } from '@noble/curves/secp256k1'; import { encodeUint8toBase64 } from './base64.js'; import { MintKeys, Proof, SerializedBlindedSignature } from './model/types/index.js'; import { bytesToNumber } from './utils.js'; import { sha256 } from '@noble/hashes/sha256'; import { bytesToHex } from '@noble/curves/abstract/utils'; function hashToCurve(secret: Uint8Array): ProjPointType<bigint> { let point: ProjPointType<bigint> | undefined; while (!point) { const hash = sha256(secret); const hashHex = bytesToHex(hash); const pointX = '02' + hashHex; try { point = pointFromHex(pointX); } catch (error) { secret = sha256(secret); } } return point; } export function pointFromHex(hex: string) { return secp256k1.ProjectivePoint.fromHex(hex); } /* export function h2cToPoint(h2c: H2CPoint<bigint>): ProjPointType<bigint> { return secp256k1.ProjectivePoint.fromAffine(h2c.toAffine()); } */ function blindMessage(secret: Uint8Array, r?: bigint): { B_: ProjPointType<bigint>; r: bigint } { const secretMessageBase64 = encodeUint8toBase64(secret); const secretMessage = new TextEncoder().encode(secretMessageBase64); const Y = hashToCurve(secretMessage); if (!r) { r = bytesToNumber(secp256k1.utils.randomPrivateKey()); } const rG = secp256k1.ProjectivePoint.BASE.multiply(r); const B_ = Y.add(rG); return { B_, r }; } function unblindSignature( C_: ProjPointType<bigint>, r: bigint, A: ProjPointType<bigint> ): ProjPointType<bigint> { const C = C_.subtract(A.multiply(r)); return C; } function constructProofs( promises: Array<SerializedBlindedSignature>, rs: Array<bigint>, secrets: Array<Uint8Array>, keys: MintKeys ): Array<Proof> { return promises.map((p: SerializedBlindedSignature, i: number) => { const C_ = pointFromHex(p.C_); const A = pointFromHex(keys[p.amount]); const C = unblindSignature(C_, rs[i], A); const proof = { id: p.id, amount: p.amount, secret: encodeUint8toBase64(secrets[i]), C: C.toHex(true) }; return proof; }); } export { hashToCurve, blindMessage, unblindSignature, constructProofs }; |