@bcts/frost-hubert 1.0.0-beta.0 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bin/frost.cjs +17 -19
- package/dist/bin/frost.cjs.map +1 -1
- package/dist/bin/frost.mjs +16 -17
- package/dist/bin/frost.mjs.map +1 -1
- package/dist/{busy-EZU7EKr6.cjs → busy-B_h0bNAJ.cjs} +1 -1
- package/dist/{busy-DkM2jAIZ.mjs.map → busy-B_h0bNAJ.cjs.map} +1 -1
- package/dist/{busy-DkM2jAIZ.mjs → busy-BlU8_pS2.mjs} +1 -1
- package/dist/{busy-EZU7EKr6.cjs.map → busy-BlU8_pS2.mjs.map} +1 -1
- package/dist/cmd/index.cjs +6 -7
- package/dist/cmd/index.d.cts +1 -1
- package/dist/cmd/index.d.mts +1 -1
- package/dist/cmd/index.mjs +5 -6
- package/dist/{cmd-Bw9_i2_f.cjs → cmd-Cd5Bmjy8.cjs} +26 -27
- package/dist/{cmd-Bw9_i2_f.cjs.map → cmd-Cd5Bmjy8.cjs.map} +1 -1
- package/dist/{cmd-CS1uJtuD.mjs → cmd-ChW3eHA8.mjs} +20 -21
- package/dist/{cmd-CS1uJtuD.mjs.map → cmd-ChW3eHA8.mjs.map} +1 -1
- package/dist/{common-DUWvtc08.mjs → common--IfAHVkl.mjs} +2 -2
- package/dist/{common-DUWvtc08.mjs.map → common--IfAHVkl.mjs.map} +1 -1
- package/dist/{common-lKP5EzHy.cjs → common-3msAx7hO.cjs} +4 -4
- package/dist/{common-lKP5EzHy.cjs.map → common-3msAx7hO.cjs.map} +1 -1
- package/dist/{common-CvH6dFvQ.mjs → common-4spC1kNw.mjs} +3 -3
- package/dist/{common-CvH6dFvQ.mjs.map → common-4spC1kNw.mjs.map} +1 -1
- package/dist/{common-lThIvJmZ.cjs → common-CeTqMwj0.cjs} +2 -3
- package/dist/{common-lThIvJmZ.cjs.map → common-CeTqMwj0.cjs.map} +1 -1
- package/dist/dkg/index.cjs +1 -2
- package/dist/dkg/index.cjs.map +1 -1
- package/dist/dkg/index.d.cts +1 -1
- package/dist/dkg/index.d.mts +1 -1
- package/dist/dkg/index.mjs +1 -1
- package/dist/dkg/index.mjs.map +1 -1
- package/dist/{finalize-CNTDj6aS.mjs → finalize-BAwtGCQW.mjs} +6 -6
- package/dist/{finalize-CNTDj6aS.mjs.map → finalize-BAwtGCQW.mjs.map} +1 -1
- package/dist/{finalize-BRgJK-Xv.cjs → finalize-BUUNWqKC.cjs} +9 -9
- package/dist/{finalize-BRgJK-Xv.cjs.map → finalize-BUUNWqKC.cjs.map} +1 -1
- package/dist/{finalize-IA01t_Qq.mjs → finalize-Bm5RZIox.mjs} +5 -5
- package/dist/{finalize-IA01t_Qq.mjs.map → finalize-Bm5RZIox.mjs.map} +1 -1
- package/dist/{finalize-EC3ikHQq.mjs → finalize-CELJsR4C.mjs} +6 -6
- package/dist/{finalize-EC3ikHQq.mjs.map → finalize-CELJsR4C.mjs.map} +1 -1
- package/dist/{finalize-UPyI1yb1.cjs → finalize-D091kTVy.cjs} +10 -10
- package/dist/{finalize-UPyI1yb1.cjs.map → finalize-D091kTVy.cjs.map} +1 -1
- package/dist/{finalize-BfLgzn8f.cjs → finalize-SzzTi9BL.cjs} +8 -8
- package/dist/{finalize-BfLgzn8f.cjs.map → finalize-SzzTi9BL.cjs.map} +1 -1
- package/dist/frost/index.cjs +2 -2
- package/dist/frost/index.cjs.map +1 -1
- package/dist/frost/index.d.cts.map +1 -1
- package/dist/frost/index.d.mts.map +1 -1
- package/dist/frost/index.mjs +1 -1
- package/dist/frost/index.mjs.map +1 -1
- package/dist/{index-F1iNEAJR.d.cts → index-BErX9AZF.d.cts} +3 -3
- package/dist/index-BErX9AZF.d.cts.map +1 -0
- package/dist/{index-B3c-80VS.d.cts → index-BaUVw4b1.d.mts} +2 -2
- package/dist/index-BaUVw4b1.d.mts.map +1 -0
- package/dist/{index-C8QeHNwa.d.cts → index-CD50Qtgw.d.cts} +1 -1
- package/dist/index-CD50Qtgw.d.cts.map +1 -0
- package/dist/{index-DVbWyOs7.d.mts → index-CD50Qtgw.d.mts} +1 -1
- package/dist/index-CD50Qtgw.d.mts.map +1 -0
- package/dist/{index-BgbSGpxn.d.mts → index-Drklne-Y.d.mts} +3 -3
- package/dist/index-Drklne-Y.d.mts.map +1 -0
- package/dist/{index-D3QTWkEm.d.mts → index-gkmZzEuD.d.cts} +2 -2
- package/dist/index-gkmZzEuD.d.cts.map +1 -0
- package/dist/index.cjs +7 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +6 -7
- package/dist/index.mjs.map +1 -1
- package/dist/{invite-DUTcfTgX.cjs → invite-5sYctfsS.cjs} +7 -7
- package/dist/{invite-DUTcfTgX.cjs.map → invite-5sYctfsS.cjs.map} +1 -1
- package/dist/{invite-RU-OXTNS.mjs → invite-DNlTkwzM.mjs} +5 -5
- package/dist/{invite-RU-OXTNS.mjs.map → invite-DNlTkwzM.mjs.map} +1 -1
- package/dist/{invite-5277FQVT.cjs → invite-T3L4N2m0.cjs} +8 -8
- package/dist/{invite-5277FQVT.cjs.map → invite-T3L4N2m0.cjs.map} +1 -1
- package/dist/{invite-IU4n0dq2.mjs → invite-vRv9LMEE.mjs} +4 -4
- package/dist/{invite-IU4n0dq2.mjs.map → invite-vRv9LMEE.mjs.map} +1 -1
- package/dist/{parallel-D6zc6VW4.mjs → parallel-PZiwHZT8.mjs} +1 -1
- package/dist/{parallel-D1R6ZGlY.cjs.map → parallel-PZiwHZT8.mjs.map} +1 -1
- package/dist/{parallel-D1R6ZGlY.cjs → parallel-szwYx-bi.cjs} +1 -1
- package/dist/{parallel-D6zc6VW4.mjs.map → parallel-szwYx-bi.cjs.map} +1 -1
- package/dist/{proposed-participant-Dm1Eq6mX.cjs → proposed-participant-BvHNnpcZ.cjs} +1 -2
- package/dist/{proposed-participant-Dm1Eq6mX.cjs.map → proposed-participant-BvHNnpcZ.cjs.map} +1 -1
- package/dist/{proposed-participant-cWM7iUrO.mjs → proposed-participant-Detb823_.mjs} +1 -1
- package/dist/{proposed-participant-cWM7iUrO.mjs.map → proposed-participant-Detb823_.mjs.map} +1 -1
- package/dist/{receive-DA_KQEgk.mjs → receive-Bzn87ahI.mjs} +6 -6
- package/dist/{receive-DA_KQEgk.mjs.map → receive-Bzn87ahI.mjs.map} +1 -1
- package/dist/{receive-D2Nn68L7.mjs → receive-C2Dwb_FQ.mjs} +5 -5
- package/dist/{receive-D2Nn68L7.mjs.map → receive-C2Dwb_FQ.mjs.map} +1 -1
- package/dist/{receive-kZMsXhbK.cjs → receive-Coqg6eFx.cjs} +9 -9
- package/dist/{receive-kZMsXhbK.cjs.map → receive-Coqg6eFx.cjs.map} +1 -1
- package/dist/{receive-CAI-x4II.cjs → receive-DZARudBa.cjs} +9 -9
- package/dist/{receive-CAI-x4II.cjs.map → receive-DZARudBa.cjs.map} +1 -1
- package/dist/registry/index.cjs +3 -3
- package/dist/registry/index.cjs.map +1 -1
- package/dist/registry/index.d.cts +1 -1
- package/dist/registry/index.d.mts +1 -1
- package/dist/registry/index.mjs.map +1 -1
- package/dist/{registry-9puTaRrD.cjs → registry-D-rFKk9R.cjs} +82 -5
- package/dist/registry-D-rFKk9R.cjs.map +1 -0
- package/dist/{registry-BpCwtrRt.mjs → registry-ycylEdoc.mjs} +74 -3
- package/dist/registry-ycylEdoc.mjs.map +1 -0
- package/dist/{round1-7v9LlE11.mjs → round1-BRgDPU4Y.mjs} +5 -5
- package/dist/{round1-7v9LlE11.mjs.map → round1-BRgDPU4Y.mjs.map} +1 -1
- package/dist/{round1-CWSXZx5R.cjs → round1-BwNBKLYm.cjs} +12 -12
- package/dist/{round1-CWSXZx5R.cjs.map → round1-BwNBKLYm.cjs.map} +1 -1
- package/dist/{round1-BHBjru1m.cjs → round1-C1IlXH-9.cjs} +8 -8
- package/dist/{round1-BHBjru1m.cjs.map → round1-C1IlXH-9.cjs.map} +1 -1
- package/dist/{round1-DQ0fnc1H.cjs → round1-CEbz7cnL.cjs} +10 -10
- package/dist/{round1-DQ0fnc1H.cjs.map → round1-CEbz7cnL.cjs.map} +1 -1
- package/dist/{round1-CcQCGlIT.mjs → round1-DL4N2QJ5.mjs} +6 -6
- package/dist/{round1-CcQCGlIT.mjs.map → round1-DL4N2QJ5.mjs.map} +1 -1
- package/dist/{round1-Cgm7j1kI.mjs → round1-DSaOFCar.mjs} +5 -5
- package/dist/{round1-Cgm7j1kI.mjs.map → round1-DSaOFCar.mjs.map} +1 -1
- package/dist/{round1-CMLKN2RR.mjs → round1-_fHip4H1.mjs} +7 -7
- package/dist/{round1-CMLKN2RR.mjs.map → round1-_fHip4H1.mjs.map} +1 -1
- package/dist/{round1-4Hyx8w0x.cjs → round1-ek-G6qVi.cjs} +8 -8
- package/dist/{round1-4Hyx8w0x.cjs.map → round1-ek-G6qVi.cjs.map} +1 -1
- package/dist/{round2-CdUT-AhH.cjs → round2-BD_0N7Ab.cjs} +8 -8
- package/dist/{round2-CdUT-AhH.cjs.map → round2-BD_0N7Ab.cjs.map} +1 -1
- package/dist/{round2-BkNRCXgS.mjs → round2-BLOgZeAo.mjs} +5 -5
- package/dist/{round2-BkNRCXgS.mjs.map → round2-BLOgZeAo.mjs.map} +1 -1
- package/dist/{round2-o2Q-GMbX.cjs → round2-C684Nir0.cjs} +10 -10
- package/dist/{round2-o2Q-GMbX.cjs.map → round2-C684Nir0.cjs.map} +1 -1
- package/dist/{round2-DOA3rnV-.mjs → round2-CU-yTXHT.mjs} +6 -6
- package/dist/{round2-DOA3rnV-.mjs.map → round2-CU-yTXHT.mjs.map} +1 -1
- package/dist/{round2-Bl2uK93U.mjs → round2-Cq2SD6F8.mjs} +5 -5
- package/dist/{round2-Bl2uK93U.mjs.map → round2-Cq2SD6F8.mjs.map} +1 -1
- package/dist/{round2-BWz9SQIi.cjs → round2-D8l1PUm5.cjs} +8 -8
- package/dist/{round2-BWz9SQIi.cjs.map → round2-D8l1PUm5.cjs.map} +1 -1
- package/dist/{round2-LylCa84n.cjs → round2-DhdFarwY.cjs} +10 -10
- package/dist/{round2-LylCa84n.cjs.map → round2-DhdFarwY.cjs.map} +1 -1
- package/dist/{round2-Dg24w-TU.mjs → round2-DmQvJDVj.mjs} +7 -7
- package/dist/{round2-Dg24w-TU.mjs.map → round2-DmQvJDVj.mjs.map} +1 -1
- package/package.json +16 -16
- package/dist/index-B3c-80VS.d.cts.map +0 -1
- package/dist/index-BgbSGpxn.d.mts.map +0 -1
- package/dist/index-C8QeHNwa.d.cts.map +0 -1
- package/dist/index-D3QTWkEm.d.mts.map +0 -1
- package/dist/index-DVbWyOs7.d.mts.map +0 -1
- package/dist/index-F1iNEAJR.d.cts.map +0 -1
- package/dist/registry-9puTaRrD.cjs.map +0 -1
- package/dist/registry-BpCwtrRt.mjs.map +0 -1
- package/dist/storage-B-Gu68-O.cjs +0 -79
- package/dist/storage-B-Gu68-O.cjs.map +0 -1
- package/dist/storage-Bkkliz0K.mjs +0 -74
- package/dist/storage-Bkkliz0K.mjs.map +0 -1
- /package/dist/{chunk-CZWwpsFl.cjs → rolldown-runtime-DakpK96I.cjs} +0 -0
- /package/dist/{chunk-CjcI7cDX.mjs → rolldown-runtime-z9aeyW2b.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round1-CMLKN2RR.mjs","names":["JSONWrapper"],"sources":["../src/cmd/dkg/participant/round1.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant round 1 command.\n *\n * Port of cmd/dkg/participant/round1.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, JSON as JSONWrapper, type XID } from \"@bcts/components\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n ContributionPaths,\n GroupRecord,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { groupStateDir } from \"../../common.js\";\nimport {\n buildGroupParticipants,\n groupParticipantFromRegistry,\n parseAridUr,\n parseEnvelopeUr,\n resolveSender,\n} from \"../common.js\";\nimport {\n dkgPart1,\n identifierFromU16,\n createRng,\n bytesToHex,\n type DkgRound1Package,\n type DkgRound1SecretPackage,\n} from \"../../../frost/index.js\";\nimport { Ed25519Sha512, serde } from \"@frosts/ed25519\";\nimport { decodeInviteDetails } from \"./receive.js\";\nimport { CborDate } from \"@bcts/dcbor\";\n\n/**\n * Options for the DKG round1 command.\n */\nexport interface DkgRound1Options {\n registryPath?: string;\n timeoutSeconds?: number;\n responseArid?: string;\n preview?: boolean;\n rejectReason?: string;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG round1 command.\n */\nexport interface DkgRound1Result {\n accepted: boolean;\n listeningArid?: string;\n envelopeUr?: string;\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/round1.rs lines 256-288.\n */\nasync function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Build the response body envelope.\n *\n * Port of `build_response_body()` from cmd/dkg/participant/round1.rs lines 290-308.\n */\nfunction buildResponseBody(\n groupId: ARID,\n participant: XID,\n responseArid: ARID,\n round1Package: DkgRound1Package | undefined,\n): Envelope {\n let envelope = Envelope.unit()\n .addType(\"dkgRound1Response\")\n .addAssertion(\"group\", groupId)\n .addAssertion(\"participant\", participant)\n .addAssertion(\"response_arid\", responseArid);\n\n if (round1Package !== undefined) {\n // Serialize the package to JSON and wrap as CBOR JSON\n const packageJson = serde.round1PackageToJson(round1Package);\n const jsonStr = globalThis.JSON.stringify(packageJson);\n const jsonBytes = new TextEncoder().encode(jsonStr);\n const jsonWrapper = JSONWrapper.fromData(jsonBytes);\n // Pass the JSONWrapper directly - it implements CborTaggedEncodable\n envelope = envelope.addAssertion(\"round1_package\", jsonWrapper);\n }\n\n return envelope;\n}\n\n/**\n * Serialize round 1 secret package to JSON-compatible format.\n *\n * The @frosts/ed25519 serde module doesn't provide a serializer for SecretPackage,\n * so we manually serialize it here.\n */\nfunction serializeRound1SecretPackage(secret: DkgRound1SecretPackage): Record<string, unknown> {\n // Mirrors the on-disk shape produced by Rust\n // `serde_json::to_vec_pretty(&frost::keys::dkg::round1::SecretPackage)`\n // (see `frost-rust/frost-core/src/keys/dkg.rs:120-139`):\n //\n // {\n // \"identifier\": \"<lowercase hex scalar>\",\n // \"coefficients\": [\"<hex>\", \"<hex>\", ...],\n // \"commitment\": [\"<hex>\", \"<hex>\", ...],\n // \"min_signers\": <u16>,\n // \"max_signers\": <u16>\n // }\n //\n // `frost::keys::dkg::round1::SecretPackage` is `#[serde(deny_unknown_fields)]`\n // and has no `header` field (the secret package is private to the\n // participant). The earlier port emitted a top-level `header` which\n // would fail `deny_unknown_fields` validation if Rust ever loaded\n // the file.\n //\n // `Identifier`/`SerializableScalar` serialize via\n // `serdect::array::serialize_hex_lower_or_bin` → lowercase hex for\n // JSON, which `bytesToHex` produces.\n const coefficients = secret.coefficients();\n const serializedCoefficients = coefficients.map((c: unknown) =>\n bytesToHex(\n Ed25519Sha512.serializeScalar(c as Parameters<typeof Ed25519Sha512.serializeScalar>[0]),\n ),\n );\n\n const commitment = secret.commitment;\n const commitmentCoefficients = commitment.serialize().map((c: Uint8Array) => bytesToHex(c));\n\n return {\n identifier: bytesToHex(secret.identifier.serialize()),\n coefficients: serializedCoefficients,\n commitment: commitmentCoefficients,\n min_signers: secret.minSigners,\n max_signers: secret.maxSigners,\n };\n}\n\n/**\n * Persist round 1 state to disk.\n *\n * Port of `persist_round1_state()` from cmd/dkg/participant/round1.rs lines 310-337.\n */\nfunction persistRound1State(\n registryPath: string,\n groupId: ARID,\n round1Secret: DkgRound1SecretPackage,\n round1Package: DkgRound1Package,\n): ContributionPaths {\n const dir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n const secretPath = path.join(dir, \"round1_secret.json\");\n const packagePath = path.join(dir, \"round1_package.json\");\n\n // Serialize the secret package manually since serde doesn't provide it\n const secretJson = serializeRound1SecretPackage(round1Secret);\n // Serialize the public package using the standard serde function\n const packageJson = serde.round1PackageToJson(round1Package);\n\n fs.writeFileSync(secretPath, globalThis.JSON.stringify(secretJson, null, 2));\n fs.writeFileSync(packagePath, globalThis.JSON.stringify(packageJson, null, 2));\n\n return new ContributionPaths({\n round1Secret: secretPath,\n round1Package: packagePath,\n round2Secret: undefined,\n keyPackage: undefined,\n });\n}\n\n/**\n * Execute the DKG participant round 1 command.\n *\n * Responds to the DKG invite with commitment packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/participant/round1.rs lines 66-254.\n */\nexport async function round1(\n _client: StorageClient | undefined,\n options: DkgRound1Options,\n cwd: string,\n): Promise<DkgRound1Result> {\n // Validate options\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n if (options.storageSelection !== undefined && options.preview === true) {\n throw new Error(\"--preview cannot be used with Hubert storage options\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided. Uses the shared helper from\n // `cmd/dkg/common.ts` (mirrors Rust `resolve_sender`); the\n // duplicated inline implementation that this previously called has\n // been removed.\n let expectedSender: XIDDocument | undefined;\n if (options.sender !== undefined) {\n expectedSender = resolveSender(registry, options.sender);\n }\n\n const nextResponseArid =\n options.responseArid !== undefined ? parseAridUr(options.responseArid) : ARID.new();\n\n // Resolve the invite envelope\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n // Decode the invite details\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n // Sort participants by XID byte order (mirrors Rust `XID::cmp` —\n // raw 32-byte lex compare). The earlier port used\n // `xid.urString().localeCompare(...)`, which differs from byte\n // order when bytes ≥ 0x80 are present and is locale-aware,\n // producing different FROST identifier assignments and therefore\n // different secret shares than Rust.\n const sortedParticipants = [...details.participants].sort((a, b) =>\n compareXidBytes(a.xid().toData(), b.xid().toData()),\n );\n\n const ownerIndex = sortedParticipants.findIndex(\n (doc) => doc.xid().urString() === owner.xid().urString(),\n );\n if (ownerIndex === -1) {\n throw new Error(\"Invite does not include the registry owner\");\n }\n\n const identifierIndex = ownerIndex + 1; // FROST uses 1-indexed identifiers\n if (identifierIndex > 65535) {\n throw new Error(\"Too many participants for identifiers\");\n }\n const identifier = identifierFromU16(identifierIndex);\n\n const total = sortedParticipants.length;\n if (total > 65535) {\n throw new Error(\"Too many participants for FROST identifiers\");\n }\n\n const minSigners = details.invitation.minSigners();\n if (minSigners > 65535) {\n throw new Error(\"min_signers does not fit into identifier space\");\n }\n\n // Build group participants for the registry\n const groupParticipants = buildGroupParticipants(registry, owner, sortedParticipants);\n const coordinator = groupParticipantFromRegistry(registry, owner, details.invitation.sender());\n\n // Check if we're posting to storage\n const isPosting = options.storageSelection !== undefined;\n\n // Build the response body\n let responseBody: Envelope;\n let contributions: ContributionPaths | undefined;\n\n if (options.rejectReason === undefined && isPosting) {\n // Actually posting - generate and persist round1 state\n const [round1Secret, round1Package] = dkgPart1(identifier, total, minSigners, createRng());\n\n contributions = persistRound1State(\n registryPath,\n details.invitation.groupId(),\n round1Secret,\n round1Package,\n );\n\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n round1Package,\n );\n\n // Create and save group record\n const groupRecord = new GroupRecord(\n details.invitation.charter(),\n details.invitation.minSigners(),\n coordinator,\n groupParticipants,\n );\n groupRecord.setContributions(contributions);\n groupRecord.setListeningAtArid(nextResponseArid);\n\n registry.recordGroup(details.invitation.groupId(), groupRecord);\n registry.save(registryPath);\n } else if (options.rejectReason === undefined) {\n // Preview mode - generate dummy round1 for envelope structure only\n const [, round1Package] = dkgPart1(identifier, total, minSigners, createRng());\n\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n round1Package,\n );\n } else {\n // Rejecting - no round1 needed\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n undefined,\n );\n }\n\n // Build the sealed response\n const signerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Owner XID document has no signing keys\");\n }\n\n let sealed: SealedResponse;\n if (options.rejectReason !== undefined) {\n // Build rejection error body\n const errorBody = Envelope.new(\"dkgInviteReject\")\n .addAssertion(\"group\", details.invitation.groupId())\n .addAssertion(\"response_arid\", nextResponseArid)\n .addAssertion(\"reason\", options.rejectReason);\n\n sealed = SealedResponse.newFailure(details.invitation.requestId(), owner.xidDocument())\n .withError(errorBody)\n .withState(nextResponseArid);\n } else {\n sealed = SealedResponse.newSuccess(details.invitation.requestId(), owner.xidDocument())\n .withResult(responseBody)\n .withState(nextResponseArid);\n }\n\n // Add peer continuation if present\n const peerContinuation = details.invitation.peerContinuation();\n if (peerContinuation !== undefined) {\n sealed = sealed.withPeerContinuation(peerContinuation);\n }\n\n // Handle output based on storage selection\n if (options.storageSelection !== undefined) {\n const responseEnvelope = sealed.toEnvelope(\n details.invitation.validUntil(),\n signerPrivateKeys,\n details.invitation.sender(),\n );\n\n const responseTarget = details.invitation.responseArid();\n const client = await createStorageClient(options.storageSelection);\n\n await putWithIndicator(\n client,\n responseTarget,\n responseEnvelope,\n \"Round 1 Response\",\n options.verbose ?? false,\n );\n\n if (options.verbose === true) {\n console.log(`Sent round 1 response`);\n console.log(`Listening at: ${nextResponseArid.urString()}`);\n }\n\n return {\n accepted: options.rejectReason === undefined,\n listeningArid: nextResponseArid.urString(),\n };\n } else if (options.preview === true) {\n // Show the GSTP response structure without encryption\n const unsealedEnvelope = sealed.toEnvelope(undefined, signerPrivateKeys, undefined);\n const envelopeUr = unsealedEnvelope.urString();\n console.log(envelopeUr);\n\n return {\n accepted: options.rejectReason === undefined,\n envelopeUr,\n };\n } else {\n // Print the sealed envelope\n const responseEnvelope = sealed.toEnvelope(\n details.invitation.validUntil(),\n signerPrivateKeys,\n details.invitation.sender(),\n );\n const envelopeUr = responseEnvelope.urString();\n console.log(envelopeUr);\n\n return {\n accepted: options.rejectReason === undefined,\n envelopeUr,\n };\n }\n}\n\n// `resolveSenderXidDocument` removed — it was an inline duplicate of\n// Rust `resolve_sender(registry, input)`. The shared helper now lives\n// in `cmd/dkg/common.ts` and is imported above.\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"round1-_fHip4H1.mjs","names":["JSONWrapper"],"sources":["../src/cmd/dkg/participant/round1.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant round 1 command.\n *\n * Port of cmd/dkg/participant/round1.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, JSON as JSONWrapper, type XID } from \"@bcts/components\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n ContributionPaths,\n GroupRecord,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { groupStateDir } from \"../../common.js\";\nimport {\n buildGroupParticipants,\n groupParticipantFromRegistry,\n parseAridUr,\n parseEnvelopeUr,\n resolveSender,\n} from \"../common.js\";\nimport {\n dkgPart1,\n identifierFromU16,\n createRng,\n bytesToHex,\n type DkgRound1Package,\n type DkgRound1SecretPackage,\n} from \"../../../frost/index.js\";\nimport { Ed25519Sha512, serde } from \"@frosts/ed25519\";\nimport { decodeInviteDetails } from \"./receive.js\";\nimport { CborDate } from \"@bcts/dcbor\";\n\n/**\n * Options for the DKG round1 command.\n */\nexport interface DkgRound1Options {\n registryPath?: string;\n timeoutSeconds?: number;\n responseArid?: string;\n preview?: boolean;\n rejectReason?: string;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG round1 command.\n */\nexport interface DkgRound1Result {\n accepted: boolean;\n listeningArid?: string;\n envelopeUr?: string;\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/round1.rs lines 256-288.\n */\nasync function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Build the response body envelope.\n *\n * Port of `build_response_body()` from cmd/dkg/participant/round1.rs lines 290-308.\n */\nfunction buildResponseBody(\n groupId: ARID,\n participant: XID,\n responseArid: ARID,\n round1Package: DkgRound1Package | undefined,\n): Envelope {\n let envelope = Envelope.unit()\n .addType(\"dkgRound1Response\")\n .addAssertion(\"group\", groupId)\n .addAssertion(\"participant\", participant)\n .addAssertion(\"response_arid\", responseArid);\n\n if (round1Package !== undefined) {\n // Serialize the package to JSON and wrap as CBOR JSON\n const packageJson = serde.round1PackageToJson(round1Package);\n const jsonStr = globalThis.JSON.stringify(packageJson);\n const jsonBytes = new TextEncoder().encode(jsonStr);\n const jsonWrapper = JSONWrapper.fromData(jsonBytes);\n // Pass the JSONWrapper directly - it implements CborTaggedEncodable\n envelope = envelope.addAssertion(\"round1_package\", jsonWrapper);\n }\n\n return envelope;\n}\n\n/**\n * Serialize round 1 secret package to JSON-compatible format.\n *\n * The @frosts/ed25519 serde module doesn't provide a serializer for SecretPackage,\n * so we manually serialize it here.\n */\nfunction serializeRound1SecretPackage(secret: DkgRound1SecretPackage): Record<string, unknown> {\n // Mirrors the on-disk shape produced by Rust\n // `serde_json::to_vec_pretty(&frost::keys::dkg::round1::SecretPackage)`\n // (see `frost-rust/frost-core/src/keys/dkg.rs:120-139`):\n //\n // {\n // \"identifier\": \"<lowercase hex scalar>\",\n // \"coefficients\": [\"<hex>\", \"<hex>\", ...],\n // \"commitment\": [\"<hex>\", \"<hex>\", ...],\n // \"min_signers\": <u16>,\n // \"max_signers\": <u16>\n // }\n //\n // `frost::keys::dkg::round1::SecretPackage` is `#[serde(deny_unknown_fields)]`\n // and has no `header` field (the secret package is private to the\n // participant). The earlier port emitted a top-level `header` which\n // would fail `deny_unknown_fields` validation if Rust ever loaded\n // the file.\n //\n // `Identifier`/`SerializableScalar` serialize via\n // `serdect::array::serialize_hex_lower_or_bin` → lowercase hex for\n // JSON, which `bytesToHex` produces.\n const coefficients = secret.coefficients();\n const serializedCoefficients = coefficients.map((c: unknown) =>\n bytesToHex(\n Ed25519Sha512.serializeScalar(c as Parameters<typeof Ed25519Sha512.serializeScalar>[0]),\n ),\n );\n\n const commitment = secret.commitment;\n const commitmentCoefficients = commitment.serialize().map((c: Uint8Array) => bytesToHex(c));\n\n return {\n identifier: bytesToHex(secret.identifier.serialize()),\n coefficients: serializedCoefficients,\n commitment: commitmentCoefficients,\n min_signers: secret.minSigners,\n max_signers: secret.maxSigners,\n };\n}\n\n/**\n * Persist round 1 state to disk.\n *\n * Port of `persist_round1_state()` from cmd/dkg/participant/round1.rs lines 310-337.\n */\nfunction persistRound1State(\n registryPath: string,\n groupId: ARID,\n round1Secret: DkgRound1SecretPackage,\n round1Package: DkgRound1Package,\n): ContributionPaths {\n const dir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n const secretPath = path.join(dir, \"round1_secret.json\");\n const packagePath = path.join(dir, \"round1_package.json\");\n\n // Serialize the secret package manually since serde doesn't provide it\n const secretJson = serializeRound1SecretPackage(round1Secret);\n // Serialize the public package using the standard serde function\n const packageJson = serde.round1PackageToJson(round1Package);\n\n fs.writeFileSync(secretPath, globalThis.JSON.stringify(secretJson, null, 2));\n fs.writeFileSync(packagePath, globalThis.JSON.stringify(packageJson, null, 2));\n\n return new ContributionPaths({\n round1Secret: secretPath,\n round1Package: packagePath,\n round2Secret: undefined,\n keyPackage: undefined,\n });\n}\n\n/**\n * Execute the DKG participant round 1 command.\n *\n * Responds to the DKG invite with commitment packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/participant/round1.rs lines 66-254.\n */\nexport async function round1(\n _client: StorageClient | undefined,\n options: DkgRound1Options,\n cwd: string,\n): Promise<DkgRound1Result> {\n // Validate options\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n if (options.storageSelection !== undefined && options.preview === true) {\n throw new Error(\"--preview cannot be used with Hubert storage options\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided. Uses the shared helper from\n // `cmd/dkg/common.ts` (mirrors Rust `resolve_sender`); the\n // duplicated inline implementation that this previously called has\n // been removed.\n let expectedSender: XIDDocument | undefined;\n if (options.sender !== undefined) {\n expectedSender = resolveSender(registry, options.sender);\n }\n\n const nextResponseArid =\n options.responseArid !== undefined ? parseAridUr(options.responseArid) : ARID.new();\n\n // Resolve the invite envelope\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n // Decode the invite details\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n // Sort participants by XID byte order (mirrors Rust `XID::cmp` —\n // raw 32-byte lex compare). The earlier port used\n // `xid.urString().localeCompare(...)`, which differs from byte\n // order when bytes ≥ 0x80 are present and is locale-aware,\n // producing different FROST identifier assignments and therefore\n // different secret shares than Rust.\n const sortedParticipants = [...details.participants].sort((a, b) =>\n compareXidBytes(a.xid().toData(), b.xid().toData()),\n );\n\n const ownerIndex = sortedParticipants.findIndex(\n (doc) => doc.xid().urString() === owner.xid().urString(),\n );\n if (ownerIndex === -1) {\n throw new Error(\"Invite does not include the registry owner\");\n }\n\n const identifierIndex = ownerIndex + 1; // FROST uses 1-indexed identifiers\n if (identifierIndex > 65535) {\n throw new Error(\"Too many participants for identifiers\");\n }\n const identifier = identifierFromU16(identifierIndex);\n\n const total = sortedParticipants.length;\n if (total > 65535) {\n throw new Error(\"Too many participants for FROST identifiers\");\n }\n\n const minSigners = details.invitation.minSigners();\n if (minSigners > 65535) {\n throw new Error(\"min_signers does not fit into identifier space\");\n }\n\n // Build group participants for the registry\n const groupParticipants = buildGroupParticipants(registry, owner, sortedParticipants);\n const coordinator = groupParticipantFromRegistry(registry, owner, details.invitation.sender());\n\n // Check if we're posting to storage\n const isPosting = options.storageSelection !== undefined;\n\n // Build the response body\n let responseBody: Envelope;\n let contributions: ContributionPaths | undefined;\n\n if (options.rejectReason === undefined && isPosting) {\n // Actually posting - generate and persist round1 state\n const [round1Secret, round1Package] = dkgPart1(identifier, total, minSigners, createRng());\n\n contributions = persistRound1State(\n registryPath,\n details.invitation.groupId(),\n round1Secret,\n round1Package,\n );\n\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n round1Package,\n );\n\n // Create and save group record\n const groupRecord = new GroupRecord(\n details.invitation.charter(),\n details.invitation.minSigners(),\n coordinator,\n groupParticipants,\n );\n groupRecord.setContributions(contributions);\n groupRecord.setListeningAtArid(nextResponseArid);\n\n registry.recordGroup(details.invitation.groupId(), groupRecord);\n registry.save(registryPath);\n } else if (options.rejectReason === undefined) {\n // Preview mode - generate dummy round1 for envelope structure only\n const [, round1Package] = dkgPart1(identifier, total, minSigners, createRng());\n\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n round1Package,\n );\n } else {\n // Rejecting - no round1 needed\n responseBody = buildResponseBody(\n details.invitation.groupId(),\n owner.xid(),\n nextResponseArid,\n undefined,\n );\n }\n\n // Build the sealed response\n const signerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Owner XID document has no signing keys\");\n }\n\n let sealed: SealedResponse;\n if (options.rejectReason !== undefined) {\n // Build rejection error body\n const errorBody = Envelope.new(\"dkgInviteReject\")\n .addAssertion(\"group\", details.invitation.groupId())\n .addAssertion(\"response_arid\", nextResponseArid)\n .addAssertion(\"reason\", options.rejectReason);\n\n sealed = SealedResponse.newFailure(details.invitation.requestId(), owner.xidDocument())\n .withError(errorBody)\n .withState(nextResponseArid);\n } else {\n sealed = SealedResponse.newSuccess(details.invitation.requestId(), owner.xidDocument())\n .withResult(responseBody)\n .withState(nextResponseArid);\n }\n\n // Add peer continuation if present\n const peerContinuation = details.invitation.peerContinuation();\n if (peerContinuation !== undefined) {\n sealed = sealed.withPeerContinuation(peerContinuation);\n }\n\n // Handle output based on storage selection\n if (options.storageSelection !== undefined) {\n const responseEnvelope = sealed.toEnvelope(\n details.invitation.validUntil(),\n signerPrivateKeys,\n details.invitation.sender(),\n );\n\n const responseTarget = details.invitation.responseArid();\n const client = await createStorageClient(options.storageSelection);\n\n await putWithIndicator(\n client,\n responseTarget,\n responseEnvelope,\n \"Round 1 Response\",\n options.verbose ?? false,\n );\n\n if (options.verbose === true) {\n console.log(`Sent round 1 response`);\n console.log(`Listening at: ${nextResponseArid.urString()}`);\n }\n\n return {\n accepted: options.rejectReason === undefined,\n listeningArid: nextResponseArid.urString(),\n };\n } else if (options.preview === true) {\n // Show the GSTP response structure without encryption\n const unsealedEnvelope = sealed.toEnvelope(undefined, signerPrivateKeys, undefined);\n const envelopeUr = unsealedEnvelope.urString();\n console.log(envelopeUr);\n\n return {\n accepted: options.rejectReason === undefined,\n envelopeUr,\n };\n } else {\n // Print the sealed envelope\n const responseEnvelope = sealed.toEnvelope(\n details.invitation.validUntil(),\n signerPrivateKeys,\n details.invitation.sender(),\n );\n const envelopeUr = responseEnvelope.urString();\n console.log(envelopeUr);\n\n return {\n accepted: options.rejectReason === undefined,\n envelopeUr,\n };\n }\n}\n\n// `resolveSenderXidDocument` removed — it was an inline duplicate of\n// Rust `resolve_sender(registry, input)`. The shared helper now lives\n// in `cmd/dkg/common.ts` and is imported above.\n"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
|
|
2
2
|
const require_registry_index = require("./registry/index.cjs");
|
|
3
|
-
const require_common = require("./common-
|
|
4
|
-
const require_parallel = require("./parallel-
|
|
5
|
-
const require_common$1 = require("./common-
|
|
3
|
+
const require_common = require("./common-3msAx7hO.cjs");
|
|
4
|
+
const require_parallel = require("./parallel-szwYx-bi.cjs");
|
|
5
|
+
const require_common$1 = require("./common-CeTqMwj0.cjs");
|
|
6
6
|
let _bcts_components = require("@bcts/components");
|
|
7
7
|
let _bcts_envelope = require("@bcts/envelope");
|
|
8
8
|
let _bcts_gstp = require("@bcts/gstp");
|
|
9
9
|
let node_fs = require("node:fs");
|
|
10
|
-
node_fs =
|
|
10
|
+
node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
|
|
11
11
|
let node_path = require("node:path");
|
|
12
|
-
node_path =
|
|
12
|
+
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
13
13
|
//#region src/cmd/sign/coordinator/round1.ts
|
|
14
14
|
/**
|
|
15
15
|
* Copyright © 2023-2026 Blockchain Commons, LLC
|
|
@@ -22,7 +22,7 @@ node_path = require_chunk.__toESM(node_path, 1);
|
|
|
22
22
|
*
|
|
23
23
|
* @module
|
|
24
24
|
*/
|
|
25
|
-
var round1_exports = /* @__PURE__ */
|
|
25
|
+
var round1_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
26
26
|
buildShareRequestForParticipant: () => buildShareRequestForParticipant,
|
|
27
27
|
collectCommitmentsParallel: () => collectCommitmentsParallel,
|
|
28
28
|
dispatchShareRequestsParallel: () => dispatchShareRequestsParallel,
|
|
@@ -419,4 +419,4 @@ Object.defineProperty(exports, "validateAndExtractCommitResponse", {
|
|
|
419
419
|
}
|
|
420
420
|
});
|
|
421
421
|
|
|
422
|
-
//# sourceMappingURL=round1-
|
|
422
|
+
//# sourceMappingURL=round1-ek-G6qVi.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round1-4Hyx8w0x.cjs","names":["path","fs","ARIDClass","parseAridUr","XIDClass","SealedResponse","JSONClass","parallelFetch","SealedRequest","Envelope","parallelSend","signingStateDir","resolveRegistryPath","Registry","isVerbose"],"sources":["../src/cmd/sign/coordinator/round1.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign coordinator round 1 command.\n *\n * Port of cmd/sign/coordinator/round1.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n ARID as ARIDClass,\n XID as XIDClass,\n JSON as JSONClass,\n type PrivateKeys,\n} from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport {\n parallelFetch,\n parallelSend,\n type CollectionResult,\n type ParallelFetchConfig,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\nimport { isVerbose } from \"../../common.js\";\n\n/**\n * Options for the sign round1 command.\n */\nexport interface SignRound1Options {\n registryPath?: string;\n groupId?: string;\n sessionId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n previewShare?: boolean;\n}\n\n/**\n * Result of the sign round1 command.\n */\nexport interface SignRound1Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n}\n\n/**\n * Data extracted from a successful sign round1 response.\n *\n * Port of `struct SignRound1ResponseData` from cmd/sign/coordinator/round1.rs.\n */\nexport interface SignRound1ResponseData {\n /** The signing commitments from this participant */\n commitments: unknown; // frost::round1::SigningCommitments equivalent\n /** The ARID where the participant expects the next request */\n nextRequestArid: ARID;\n}\n\n/**\n * State for a participant in the signing session.\n *\n * Port of `struct StartParticipant` from cmd/sign/coordinator/round1.rs.\n */\nexport interface StartParticipant {\n commitArid: ARID;\n shareArid: ARID;\n}\n\n/**\n * Start state for a signing session.\n *\n * Port of `struct StartState` from cmd/sign/coordinator/round1.rs.\n */\nexport interface StartState {\n groupId: ARID;\n targetUr: string;\n participants: Map<string, StartParticipant>; // Map by XID UR string\n}\n\n/**\n * Load the start state for a signing session.\n *\n * Port of `load_start_state()` from cmd/sign/coordinator/round1.rs.\n */\nfunction loadStartState(registryPath: string, sessionId: ARID, groupHint?: ARID): StartState {\n const base = path.dirname(registryPath);\n const groupStateDir = path.join(base, \"group-state\");\n\n const candidatePaths: [ARID, string][] = [];\n let groupDirs: [ARID, string][];\n\n if (groupHint !== undefined) {\n groupDirs = [[groupHint, path.join(groupStateDir, groupHint.hex())]];\n } else {\n groupDirs = [];\n if (fs.existsSync(groupStateDir)) {\n for (const entry of fs.readdirSync(groupStateDir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const dirName = entry.name;\n if (dirName.length === 64 && /^[0-9a-fA-F]+$/.test(dirName)) {\n const groupId = ARIDClass.fromHex(dirName);\n groupDirs.push([groupId, path.join(groupStateDir, dirName)]);\n }\n }\n }\n }\n }\n\n for (const [groupId, groupDir] of groupDirs) {\n const candidate = path.join(groupDir, \"signing\", sessionId.hex(), \"start.json\");\n if (fs.existsSync(candidate)) {\n candidatePaths.push([groupId, candidate]);\n }\n }\n\n if (candidatePaths.length === 0) {\n throw new Error(\"No sign start state found; run `frost sign coordinator start` first\");\n }\n if (candidatePaths.length > 1) {\n throw new Error(\"Multiple signing sessions found; specify --group to disambiguate\");\n }\n\n const [groupId, statePath] = candidatePaths[0];\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in start.json`);\n }\n return value;\n };\n\n const sessionInState = parseAridUr(getStr(\"session_id\"));\n const groupInState = parseAridUr(getStr(\"group\"));\n\n if (sessionInState.hex() !== sessionId.hex()) {\n throw new Error(\n `start.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n if (groupInState.hex() !== groupId.hex()) {\n throw new Error(\n `start.json group ${groupInState.urString()} does not match directory group ${groupId.urString()}`,\n );\n }\n\n const targetUr = getStr(\"target\");\n\n const participantsVal = raw[\"participants\"] as Record<string, Record<string, string>> | undefined;\n if (participantsVal === undefined || typeof participantsVal !== \"object\") {\n throw new Error(\"Missing participants in start.json\");\n }\n\n const participants = new Map<string, StartParticipant>();\n for (const [xidStr, value] of Object.entries(participantsVal)) {\n const xid = XIDClass.fromURString(xidStr);\n if (typeof value !== \"object\" || value === null) {\n throw new Error(\"Participant entry is not an object in start.json\");\n }\n\n const commitAridStr = value[\"commit_arid\"];\n const shareAridStr = value[\"share_arid\"];\n\n if (typeof commitAridStr !== \"string\") {\n throw new Error(\"Missing commit_arid in start.json\");\n }\n if (typeof shareAridStr !== \"string\") {\n throw new Error(\"Missing share_arid in start.json\");\n }\n\n participants.set(xid.urString(), {\n commitArid: parseAridUr(commitAridStr),\n shareArid: parseAridUr(shareAridStr),\n });\n }\n\n return { groupId, targetUr, participants };\n}\n\n/**\n * Validate and extract data from a sign commit response.\n *\n * Port of `validate_and_extract_sign_round1_response()` from cmd/sign/coordinator/round1.rs.\n */\nexport function validateAndExtractCommitResponse(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedSender: XID,\n expectedSessionId: ARID,\n): SignRound1ResponseData {\n const now = new Date();\n const sealedResponse = SealedResponse.tryFromEncryptedEnvelope(\n envelope,\n undefined,\n now,\n coordinatorKeys,\n );\n\n if (!sealedResponse.sender().xid().equals(expectedSender)) {\n throw new Error(\n `Unexpected response sender: ${sealedResponse.sender().xid().urString()} (expected ${expectedSender.urString()})`,\n );\n }\n\n if (sealedResponse.isErr()) {\n const errorEnvelope = sealedResponse.error();\n let reason = \"unknown reason\";\n try {\n const reasonEnv = errorEnvelope.objectForPredicate(\"reason\");\n if (reasonEnv !== undefined) {\n reason = reasonEnv.extractString();\n }\n } catch {\n // Keep default reason\n }\n throw new Error(`Participant rejected signInvite: ${reason}`);\n }\n\n const result = sealedResponse.result();\n\n result.checkSubjectUnit();\n result.checkType(\"signRound1Response\");\n\n const responseSession = result.tryObjectForPredicate(\"session\", (cbor) =>\n ARIDClass.fromTaggedCbor(cbor),\n );\n if (responseSession.hex() !== expectedSessionId.hex()) {\n throw new Error(\n `Response session ${responseSession.urString()} does not match expected ${expectedSessionId.urString()}`,\n );\n }\n\n const commitmentsJson = result.tryObjectForPredicate(\"commitments\", (cbor) =>\n JSONClass.fromTaggedCbor(cbor),\n );\n const commitments = JSON.parse(new TextDecoder().decode(commitmentsJson.toData())) as Record<\n string,\n unknown\n >;\n\n const nextRequestArid = result.tryObjectForPredicate(\"response_arid\", (cbor) =>\n ARIDClass.fromTaggedCbor(cbor),\n );\n\n return { commitments, nextRequestArid };\n}\n\n/**\n * Collect signing commitments in parallel.\n *\n * Port of `collect_sign_round1_parallel()` from cmd/sign/coordinator/round1.rs.\n */\nexport async function collectCommitmentsParallel(\n client: StorageClient,\n registry: Registry,\n startState: StartState,\n coordinator: XIDDocument,\n sessionId: ARID,\n timeout?: number,\n): Promise<CollectionResult<SignRound1ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xidStr, state] of startState.participants) {\n const xid = XIDClass.fromURString(xidStr);\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n requests.push([xid, state.commitArid, name]);\n }\n\n const coordinatorKeys = coordinator.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Missing coordinator private keys\");\n }\n\n const config: ParallelFetchConfig = { timeoutSeconds: timeout };\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) => {\n try {\n return validateAndExtractCommitResponse(envelope, coordinatorKeys, xid, sessionId);\n } catch (e) {\n return { rejected: e instanceof Error ? e.message : String(e) };\n }\n },\n config,\n );\n}\n\n/**\n * Build a sign share request for a participant.\n *\n * Port of `build_sign_share_request()` from cmd/sign/coordinator/round1.rs.\n */\nexport function buildShareRequestForParticipant(\n sender: XIDDocument,\n _groupId: ARID,\n sessionId: ARID,\n responseArid: ARID,\n commitments: Map<string, unknown>, // Map<XID UR string, commitments>\n): SealedRequest {\n let request = SealedRequest.new(\"signRound2\", sessionId, sender)\n .withParameter(\"session\", sessionId)\n .withParameter(\"response_arid\", responseArid);\n\n for (const [xidStr, commits] of commitments) {\n const xid = XIDClass.fromURString(xidStr);\n const commitsJson = JSONClass.fromData(new TextEncoder().encode(JSON.stringify(commits)));\n // Create envelope with xid as subject, then add commitments assertion with JSON CBOR data\n const entry = Envelope.new(xid).addAssertion(\"commitments\", commitsJson.taggedCborData());\n request = request.withParameter(\"commitment\", entry);\n }\n\n return request;\n}\n\n/**\n * Dispatch share requests to participants in parallel.\n *\n * Port of parallel dispatch logic from cmd/sign/coordinator/round1.rs.\n */\nexport async function dispatchShareRequestsParallel(\n client: StorageClient,\n registry: Registry,\n owner: OwnerRecord,\n startState: StartState,\n sessionId: ARID,\n collection: CollectionResult<SignRound1ResponseData>,\n commitments: Map<string, unknown>,\n previewShare?: boolean,\n verbose?: boolean,\n): Promise<[XID, Error | null][]> {\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now\n\n const messages: [XID, ARID, Envelope, string][] = [];\n let previewPrinted = false;\n\n for (const [xid, data] of collection.successes) {\n const xidStr = xid.urString();\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant ${xidStr} not found in start state`);\n }\n\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n let recipientDoc: XIDDocument;\n if (xid.urString() === owner.xid().urString()) {\n recipientDoc = owner.xidDocument();\n } else {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xidStr} not found in registry`);\n }\n recipientDoc = record.xidDocument();\n }\n\n const request = buildShareRequestForParticipant(\n owner.xidDocument(),\n startState.groupId,\n sessionId,\n participantState.shareArid,\n commitments,\n );\n\n if (previewShare === true && !previewPrinted) {\n const preview = request.toEnvelope(validUntil, signerKeys, undefined);\n console.log(`# signRound2 preview for ${xidStr}`);\n console.log(preview.format());\n previewPrinted = true;\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerKeys, [recipientDoc]);\n\n messages.push([xid, data.nextRequestArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n return parallelSend(client, messages, verbose);\n}\n\n/**\n * Persist collected commitments to disk.\n *\n * Port of commitments persistence logic from cmd/sign/coordinator/round1.rs.\n */\nexport function persistCommitments(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n startState: StartState,\n commitments: Map<string, unknown>,\n): string {\n const signingDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(signingDir, { recursive: true });\n\n const commitmentsPath = path.join(signingDir, \"commitments.json\");\n const commitmentsJson: Record<string, unknown> = {};\n\n for (const [xidStr, commits] of commitments) {\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant ${xidStr} not found in start state`);\n }\n\n commitmentsJson[xidStr] = {\n commitments: commits,\n share_arid: participantState.shareArid.urString(),\n };\n }\n\n const root = {\n group: groupId.urString(),\n session: sessionId.urString(),\n target: startState.targetUr,\n commitments: commitmentsJson,\n };\n\n fs.writeFileSync(commitmentsPath, JSON.stringify(root, null, 2));\n\n return commitmentsPath;\n}\n\n/**\n * Update pending requests in the registry for share phase.\n *\n * Note: In the Rust implementation, the registry doesn't track pending ARIDs\n * directly on participant records. The pending state is managed through the\n * start.json and commitments.json files in the signing state directory.\n *\n * This function is provided for API compatibility but currently does nothing.\n */\nexport function updatePendingForShare(\n _registry: Registry,\n _collection: CollectionResult<SignRound1ResponseData>,\n _startState: StartState,\n): void {\n // No-op: The Rust implementation manages pending state through files,\n // not through the registry. The share_arid values are already stored\n // in commitments.json and will be used for round 2 collection.\n}\n\n/**\n * Execute the sign coordinator round 1 command.\n *\n * Collects signing commitments from participants.\n *\n * Port of `round1()` from cmd/sign/coordinator/round1.rs.\n */\nexport async function round1(\n client: StorageClient,\n options: SignRound1Options,\n cwd: string,\n): Promise<SignRound1Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId !== undefined ? parseAridUr(options.groupId) : undefined;\n\n const startState = loadStartState(registryPath, sessionId, groupHint);\n const groupId = startState.groupId;\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n\n if (groupRecord.coordinator().xid().urString() !== owner.xid().urString()) {\n throw new Error(\n `Only the coordinator can collect signInvite responses. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, ` +\n `Owner: ${owner.xid().urString()}`,\n );\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectCommitmentsParallel(\n client,\n registry,\n startState,\n owner.xidDocument(),\n sessionId,\n options.timeoutSeconds,\n );\n\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n throw new Error(\n `Sign commit collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n }\n\n // Build commitments map\n const commitments = new Map<string, unknown>();\n for (const [xid, data] of collection.successes) {\n commitments.set(xid.urString(), data.commitments);\n }\n\n // Persist aggregated commitments\n const commitmentsPath = persistCommitments(\n registryPath,\n groupId,\n sessionId,\n startState,\n commitments,\n );\n\n // Dispatch share requests in parallel\n const sendResults = await dispatchShareRequestsParallel(\n client,\n registry,\n owner,\n startState,\n sessionId,\n collection,\n commitments,\n options.previewShare,\n options.verbose,\n );\n\n // Check for send failures\n const failures = sendResults.filter(([_, err]) => err !== null);\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send signRound2 requests to ${failures.length} participants`);\n }\n\n // Update registry pending requests\n updatePendingForShare(registry, collection, startState);\n\n const displayPath = path.relative(cwd, commitmentsPath) || commitmentsPath;\n\n if (isVerbose() || options.verbose === true) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} signInvite responses. Saved to ${displayPath}`,\n );\n console.error(`Dispatched ${collection.successes.length} signRound2 requests.`);\n }\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n };\n } else {\n // Sequential path (original behavior)\n if (isVerbose() || options.verbose === true) {\n console.error(\n `Collecting signInvite responses for session ${sessionId.urString()} ` +\n `from ${startState.participants.size} participants...`,\n );\n }\n\n const commitments = new Map<string, unknown>();\n const sendToArids = new Map<string, ARID>();\n const errors: [XID, string][] = [];\n\n const coordinatorKeys = owner.xidDocument().inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n for (const [xidStr, participantState] of startState.participants) {\n const xid = XIDClass.fromURString(xidStr);\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n try {\n const envelope = await client.get(participantState.commitArid, options.timeoutSeconds);\n\n if (envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const data = validateAndExtractCommitResponse(envelope, coordinatorKeys, xid, sessionId);\n\n commitments.set(xidStr, data.commitments);\n sendToArids.set(xidStr, data.nextRequestArid);\n\n if (isVerbose() || options.verbose === true) {\n console.error(` ✓ ${participantName}`);\n }\n } catch (e) {\n errors.push([xid, e instanceof Error ? e.message : String(e)]);\n if (isVerbose() || options.verbose === true) {\n console.error(` ✗ ${participantName}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `Sign commit collection incomplete: ${errors.length} of ${startState.participants.size} responses failed`,\n );\n }\n\n if (commitments.size !== startState.participants.size) {\n const missing: string[] = [];\n for (const xidStr of startState.participants.keys()) {\n if (!commitments.has(xidStr)) {\n missing.push(xidStr);\n }\n }\n throw new Error(`Missing signInvite responses from: ${missing.join(\", \")}`);\n }\n\n // Persist aggregated commitments\n const commitmentsPath = persistCommitments(\n registryPath,\n groupId,\n sessionId,\n startState,\n commitments,\n );\n\n // Build and send signRound2 requests\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n const validUntil = new Date(Date.now() + 60 * 60 * 1000);\n\n if (isVerbose() || options.verbose === true) {\n console.error(`Dispatching signRound2 requests to ${sendToArids.size} participants...`);\n } else {\n // Blank line to separate get phase from put phase\n console.error();\n }\n\n let previewPrinted = false;\n for (const [xidStr, sendToArid] of sendToArids) {\n const xid = XIDClass.fromURString(xidStr);\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant state not found for ${xidStr}`);\n }\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n let recipientDoc: XIDDocument;\n if (xidStr === owner.xid().urString()) {\n recipientDoc = owner.xidDocument();\n } else {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xidStr} not found in registry`);\n }\n recipientDoc = record.xidDocument();\n }\n\n const request = buildShareRequestForParticipant(\n owner.xidDocument(),\n groupId,\n sessionId,\n participantState.shareArid,\n commitments,\n );\n\n if (options.previewShare === true && !previewPrinted) {\n const preview = request.toEnvelope(validUntil, signerKeys, undefined);\n console.log(`# signRound2 preview for ${xidStr}`);\n console.log(preview.format());\n previewPrinted = true;\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerKeys, [\n recipientDoc,\n ]);\n\n await client.put(sendToArid, sealedEnvelope);\n\n if (isVerbose() || options.verbose === true) {\n console.error(` ✓ ${participantName}`);\n }\n }\n\n const displayPath = path.relative(cwd, commitmentsPath) || commitmentsPath;\n\n if (isVerbose() || options.verbose === true) {\n console.error();\n console.error(`Collected ${commitments.size} signInvite responses. Saved to ${displayPath}`);\n console.error(`Dispatched ${commitments.size} signRound2 requests.`);\n }\n\n return {\n accepted: commitments.size,\n rejected: 0,\n errors: errors.length,\n timeouts: 0,\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"round1-ek-G6qVi.cjs","names":["path","fs","ARIDClass","parseAridUr","XIDClass","SealedResponse","JSONClass","parallelFetch","SealedRequest","Envelope","parallelSend","signingStateDir","resolveRegistryPath","Registry","isVerbose"],"sources":["../src/cmd/sign/coordinator/round1.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign coordinator round 1 command.\n *\n * Port of cmd/sign/coordinator/round1.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n ARID as ARIDClass,\n XID as XIDClass,\n JSON as JSONClass,\n type PrivateKeys,\n} from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport {\n parallelFetch,\n parallelSend,\n type CollectionResult,\n type ParallelFetchConfig,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\nimport { isVerbose } from \"../../common.js\";\n\n/**\n * Options for the sign round1 command.\n */\nexport interface SignRound1Options {\n registryPath?: string;\n groupId?: string;\n sessionId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n previewShare?: boolean;\n}\n\n/**\n * Result of the sign round1 command.\n */\nexport interface SignRound1Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n}\n\n/**\n * Data extracted from a successful sign round1 response.\n *\n * Port of `struct SignRound1ResponseData` from cmd/sign/coordinator/round1.rs.\n */\nexport interface SignRound1ResponseData {\n /** The signing commitments from this participant */\n commitments: unknown; // frost::round1::SigningCommitments equivalent\n /** The ARID where the participant expects the next request */\n nextRequestArid: ARID;\n}\n\n/**\n * State for a participant in the signing session.\n *\n * Port of `struct StartParticipant` from cmd/sign/coordinator/round1.rs.\n */\nexport interface StartParticipant {\n commitArid: ARID;\n shareArid: ARID;\n}\n\n/**\n * Start state for a signing session.\n *\n * Port of `struct StartState` from cmd/sign/coordinator/round1.rs.\n */\nexport interface StartState {\n groupId: ARID;\n targetUr: string;\n participants: Map<string, StartParticipant>; // Map by XID UR string\n}\n\n/**\n * Load the start state for a signing session.\n *\n * Port of `load_start_state()` from cmd/sign/coordinator/round1.rs.\n */\nfunction loadStartState(registryPath: string, sessionId: ARID, groupHint?: ARID): StartState {\n const base = path.dirname(registryPath);\n const groupStateDir = path.join(base, \"group-state\");\n\n const candidatePaths: [ARID, string][] = [];\n let groupDirs: [ARID, string][];\n\n if (groupHint !== undefined) {\n groupDirs = [[groupHint, path.join(groupStateDir, groupHint.hex())]];\n } else {\n groupDirs = [];\n if (fs.existsSync(groupStateDir)) {\n for (const entry of fs.readdirSync(groupStateDir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const dirName = entry.name;\n if (dirName.length === 64 && /^[0-9a-fA-F]+$/.test(dirName)) {\n const groupId = ARIDClass.fromHex(dirName);\n groupDirs.push([groupId, path.join(groupStateDir, dirName)]);\n }\n }\n }\n }\n }\n\n for (const [groupId, groupDir] of groupDirs) {\n const candidate = path.join(groupDir, \"signing\", sessionId.hex(), \"start.json\");\n if (fs.existsSync(candidate)) {\n candidatePaths.push([groupId, candidate]);\n }\n }\n\n if (candidatePaths.length === 0) {\n throw new Error(\"No sign start state found; run `frost sign coordinator start` first\");\n }\n if (candidatePaths.length > 1) {\n throw new Error(\"Multiple signing sessions found; specify --group to disambiguate\");\n }\n\n const [groupId, statePath] = candidatePaths[0];\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in start.json`);\n }\n return value;\n };\n\n const sessionInState = parseAridUr(getStr(\"session_id\"));\n const groupInState = parseAridUr(getStr(\"group\"));\n\n if (sessionInState.hex() !== sessionId.hex()) {\n throw new Error(\n `start.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n if (groupInState.hex() !== groupId.hex()) {\n throw new Error(\n `start.json group ${groupInState.urString()} does not match directory group ${groupId.urString()}`,\n );\n }\n\n const targetUr = getStr(\"target\");\n\n const participantsVal = raw[\"participants\"] as Record<string, Record<string, string>> | undefined;\n if (participantsVal === undefined || typeof participantsVal !== \"object\") {\n throw new Error(\"Missing participants in start.json\");\n }\n\n const participants = new Map<string, StartParticipant>();\n for (const [xidStr, value] of Object.entries(participantsVal)) {\n const xid = XIDClass.fromURString(xidStr);\n if (typeof value !== \"object\" || value === null) {\n throw new Error(\"Participant entry is not an object in start.json\");\n }\n\n const commitAridStr = value[\"commit_arid\"];\n const shareAridStr = value[\"share_arid\"];\n\n if (typeof commitAridStr !== \"string\") {\n throw new Error(\"Missing commit_arid in start.json\");\n }\n if (typeof shareAridStr !== \"string\") {\n throw new Error(\"Missing share_arid in start.json\");\n }\n\n participants.set(xid.urString(), {\n commitArid: parseAridUr(commitAridStr),\n shareArid: parseAridUr(shareAridStr),\n });\n }\n\n return { groupId, targetUr, participants };\n}\n\n/**\n * Validate and extract data from a sign commit response.\n *\n * Port of `validate_and_extract_sign_round1_response()` from cmd/sign/coordinator/round1.rs.\n */\nexport function validateAndExtractCommitResponse(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedSender: XID,\n expectedSessionId: ARID,\n): SignRound1ResponseData {\n const now = new Date();\n const sealedResponse = SealedResponse.tryFromEncryptedEnvelope(\n envelope,\n undefined,\n now,\n coordinatorKeys,\n );\n\n if (!sealedResponse.sender().xid().equals(expectedSender)) {\n throw new Error(\n `Unexpected response sender: ${sealedResponse.sender().xid().urString()} (expected ${expectedSender.urString()})`,\n );\n }\n\n if (sealedResponse.isErr()) {\n const errorEnvelope = sealedResponse.error();\n let reason = \"unknown reason\";\n try {\n const reasonEnv = errorEnvelope.objectForPredicate(\"reason\");\n if (reasonEnv !== undefined) {\n reason = reasonEnv.extractString();\n }\n } catch {\n // Keep default reason\n }\n throw new Error(`Participant rejected signInvite: ${reason}`);\n }\n\n const result = sealedResponse.result();\n\n result.checkSubjectUnit();\n result.checkType(\"signRound1Response\");\n\n const responseSession = result.tryObjectForPredicate(\"session\", (cbor) =>\n ARIDClass.fromTaggedCbor(cbor),\n );\n if (responseSession.hex() !== expectedSessionId.hex()) {\n throw new Error(\n `Response session ${responseSession.urString()} does not match expected ${expectedSessionId.urString()}`,\n );\n }\n\n const commitmentsJson = result.tryObjectForPredicate(\"commitments\", (cbor) =>\n JSONClass.fromTaggedCbor(cbor),\n );\n const commitments = JSON.parse(new TextDecoder().decode(commitmentsJson.toData())) as Record<\n string,\n unknown\n >;\n\n const nextRequestArid = result.tryObjectForPredicate(\"response_arid\", (cbor) =>\n ARIDClass.fromTaggedCbor(cbor),\n );\n\n return { commitments, nextRequestArid };\n}\n\n/**\n * Collect signing commitments in parallel.\n *\n * Port of `collect_sign_round1_parallel()` from cmd/sign/coordinator/round1.rs.\n */\nexport async function collectCommitmentsParallel(\n client: StorageClient,\n registry: Registry,\n startState: StartState,\n coordinator: XIDDocument,\n sessionId: ARID,\n timeout?: number,\n): Promise<CollectionResult<SignRound1ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xidStr, state] of startState.participants) {\n const xid = XIDClass.fromURString(xidStr);\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n requests.push([xid, state.commitArid, name]);\n }\n\n const coordinatorKeys = coordinator.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Missing coordinator private keys\");\n }\n\n const config: ParallelFetchConfig = { timeoutSeconds: timeout };\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) => {\n try {\n return validateAndExtractCommitResponse(envelope, coordinatorKeys, xid, sessionId);\n } catch (e) {\n return { rejected: e instanceof Error ? e.message : String(e) };\n }\n },\n config,\n );\n}\n\n/**\n * Build a sign share request for a participant.\n *\n * Port of `build_sign_share_request()` from cmd/sign/coordinator/round1.rs.\n */\nexport function buildShareRequestForParticipant(\n sender: XIDDocument,\n _groupId: ARID,\n sessionId: ARID,\n responseArid: ARID,\n commitments: Map<string, unknown>, // Map<XID UR string, commitments>\n): SealedRequest {\n let request = SealedRequest.new(\"signRound2\", sessionId, sender)\n .withParameter(\"session\", sessionId)\n .withParameter(\"response_arid\", responseArid);\n\n for (const [xidStr, commits] of commitments) {\n const xid = XIDClass.fromURString(xidStr);\n const commitsJson = JSONClass.fromData(new TextEncoder().encode(JSON.stringify(commits)));\n // Create envelope with xid as subject, then add commitments assertion with JSON CBOR data\n const entry = Envelope.new(xid).addAssertion(\"commitments\", commitsJson.taggedCborData());\n request = request.withParameter(\"commitment\", entry);\n }\n\n return request;\n}\n\n/**\n * Dispatch share requests to participants in parallel.\n *\n * Port of parallel dispatch logic from cmd/sign/coordinator/round1.rs.\n */\nexport async function dispatchShareRequestsParallel(\n client: StorageClient,\n registry: Registry,\n owner: OwnerRecord,\n startState: StartState,\n sessionId: ARID,\n collection: CollectionResult<SignRound1ResponseData>,\n commitments: Map<string, unknown>,\n previewShare?: boolean,\n verbose?: boolean,\n): Promise<[XID, Error | null][]> {\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now\n\n const messages: [XID, ARID, Envelope, string][] = [];\n let previewPrinted = false;\n\n for (const [xid, data] of collection.successes) {\n const xidStr = xid.urString();\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant ${xidStr} not found in start state`);\n }\n\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n let recipientDoc: XIDDocument;\n if (xid.urString() === owner.xid().urString()) {\n recipientDoc = owner.xidDocument();\n } else {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xidStr} not found in registry`);\n }\n recipientDoc = record.xidDocument();\n }\n\n const request = buildShareRequestForParticipant(\n owner.xidDocument(),\n startState.groupId,\n sessionId,\n participantState.shareArid,\n commitments,\n );\n\n if (previewShare === true && !previewPrinted) {\n const preview = request.toEnvelope(validUntil, signerKeys, undefined);\n console.log(`# signRound2 preview for ${xidStr}`);\n console.log(preview.format());\n previewPrinted = true;\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerKeys, [recipientDoc]);\n\n messages.push([xid, data.nextRequestArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n return parallelSend(client, messages, verbose);\n}\n\n/**\n * Persist collected commitments to disk.\n *\n * Port of commitments persistence logic from cmd/sign/coordinator/round1.rs.\n */\nexport function persistCommitments(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n startState: StartState,\n commitments: Map<string, unknown>,\n): string {\n const signingDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(signingDir, { recursive: true });\n\n const commitmentsPath = path.join(signingDir, \"commitments.json\");\n const commitmentsJson: Record<string, unknown> = {};\n\n for (const [xidStr, commits] of commitments) {\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant ${xidStr} not found in start state`);\n }\n\n commitmentsJson[xidStr] = {\n commitments: commits,\n share_arid: participantState.shareArid.urString(),\n };\n }\n\n const root = {\n group: groupId.urString(),\n session: sessionId.urString(),\n target: startState.targetUr,\n commitments: commitmentsJson,\n };\n\n fs.writeFileSync(commitmentsPath, JSON.stringify(root, null, 2));\n\n return commitmentsPath;\n}\n\n/**\n * Update pending requests in the registry for share phase.\n *\n * Note: In the Rust implementation, the registry doesn't track pending ARIDs\n * directly on participant records. The pending state is managed through the\n * start.json and commitments.json files in the signing state directory.\n *\n * This function is provided for API compatibility but currently does nothing.\n */\nexport function updatePendingForShare(\n _registry: Registry,\n _collection: CollectionResult<SignRound1ResponseData>,\n _startState: StartState,\n): void {\n // No-op: The Rust implementation manages pending state through files,\n // not through the registry. The share_arid values are already stored\n // in commitments.json and will be used for round 2 collection.\n}\n\n/**\n * Execute the sign coordinator round 1 command.\n *\n * Collects signing commitments from participants.\n *\n * Port of `round1()` from cmd/sign/coordinator/round1.rs.\n */\nexport async function round1(\n client: StorageClient,\n options: SignRound1Options,\n cwd: string,\n): Promise<SignRound1Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId !== undefined ? parseAridUr(options.groupId) : undefined;\n\n const startState = loadStartState(registryPath, sessionId, groupHint);\n const groupId = startState.groupId;\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n\n if (groupRecord.coordinator().xid().urString() !== owner.xid().urString()) {\n throw new Error(\n `Only the coordinator can collect signInvite responses. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, ` +\n `Owner: ${owner.xid().urString()}`,\n );\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectCommitmentsParallel(\n client,\n registry,\n startState,\n owner.xidDocument(),\n sessionId,\n options.timeoutSeconds,\n );\n\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n throw new Error(\n `Sign commit collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n }\n\n // Build commitments map\n const commitments = new Map<string, unknown>();\n for (const [xid, data] of collection.successes) {\n commitments.set(xid.urString(), data.commitments);\n }\n\n // Persist aggregated commitments\n const commitmentsPath = persistCommitments(\n registryPath,\n groupId,\n sessionId,\n startState,\n commitments,\n );\n\n // Dispatch share requests in parallel\n const sendResults = await dispatchShareRequestsParallel(\n client,\n registry,\n owner,\n startState,\n sessionId,\n collection,\n commitments,\n options.previewShare,\n options.verbose,\n );\n\n // Check for send failures\n const failures = sendResults.filter(([_, err]) => err !== null);\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send signRound2 requests to ${failures.length} participants`);\n }\n\n // Update registry pending requests\n updatePendingForShare(registry, collection, startState);\n\n const displayPath = path.relative(cwd, commitmentsPath) || commitmentsPath;\n\n if (isVerbose() || options.verbose === true) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} signInvite responses. Saved to ${displayPath}`,\n );\n console.error(`Dispatched ${collection.successes.length} signRound2 requests.`);\n }\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n };\n } else {\n // Sequential path (original behavior)\n if (isVerbose() || options.verbose === true) {\n console.error(\n `Collecting signInvite responses for session ${sessionId.urString()} ` +\n `from ${startState.participants.size} participants...`,\n );\n }\n\n const commitments = new Map<string, unknown>();\n const sendToArids = new Map<string, ARID>();\n const errors: [XID, string][] = [];\n\n const coordinatorKeys = owner.xidDocument().inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n for (const [xidStr, participantState] of startState.participants) {\n const xid = XIDClass.fromURString(xidStr);\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n try {\n const envelope = await client.get(participantState.commitArid, options.timeoutSeconds);\n\n if (envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const data = validateAndExtractCommitResponse(envelope, coordinatorKeys, xid, sessionId);\n\n commitments.set(xidStr, data.commitments);\n sendToArids.set(xidStr, data.nextRequestArid);\n\n if (isVerbose() || options.verbose === true) {\n console.error(` ✓ ${participantName}`);\n }\n } catch (e) {\n errors.push([xid, e instanceof Error ? e.message : String(e)]);\n if (isVerbose() || options.verbose === true) {\n console.error(` ✗ ${participantName}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `Sign commit collection incomplete: ${errors.length} of ${startState.participants.size} responses failed`,\n );\n }\n\n if (commitments.size !== startState.participants.size) {\n const missing: string[] = [];\n for (const xidStr of startState.participants.keys()) {\n if (!commitments.has(xidStr)) {\n missing.push(xidStr);\n }\n }\n throw new Error(`Missing signInvite responses from: ${missing.join(\", \")}`);\n }\n\n // Persist aggregated commitments\n const commitmentsPath = persistCommitments(\n registryPath,\n groupId,\n sessionId,\n startState,\n commitments,\n );\n\n // Build and send signRound2 requests\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n const validUntil = new Date(Date.now() + 60 * 60 * 1000);\n\n if (isVerbose() || options.verbose === true) {\n console.error(`Dispatching signRound2 requests to ${sendToArids.size} participants...`);\n } else {\n // Blank line to separate get phase from put phase\n console.error();\n }\n\n let previewPrinted = false;\n for (const [xidStr, sendToArid] of sendToArids) {\n const xid = XIDClass.fromURString(xidStr);\n const participantState = startState.participants.get(xidStr);\n if (participantState === undefined) {\n throw new Error(`Participant state not found for ${xidStr}`);\n }\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xidStr;\n\n let recipientDoc: XIDDocument;\n if (xidStr === owner.xid().urString()) {\n recipientDoc = owner.xidDocument();\n } else {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xidStr} not found in registry`);\n }\n recipientDoc = record.xidDocument();\n }\n\n const request = buildShareRequestForParticipant(\n owner.xidDocument(),\n groupId,\n sessionId,\n participantState.shareArid,\n commitments,\n );\n\n if (options.previewShare === true && !previewPrinted) {\n const preview = request.toEnvelope(validUntil, signerKeys, undefined);\n console.log(`# signRound2 preview for ${xidStr}`);\n console.log(preview.format());\n previewPrinted = true;\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerKeys, [\n recipientDoc,\n ]);\n\n await client.put(sendToArid, sealedEnvelope);\n\n if (isVerbose() || options.verbose === true) {\n console.error(` ✓ ${participantName}`);\n }\n }\n\n const displayPath = path.relative(cwd, commitmentsPath) || commitmentsPath;\n\n if (isVerbose() || options.verbose === true) {\n console.error();\n console.error(`Collected ${commitments.size} signInvite responses. Saved to ${displayPath}`);\n console.error(`Dispatched ${commitments.size} signRound2 requests.`);\n }\n\n return {\n accepted: commitments.size,\n rejected: 0,\n errors: errors.length,\n timeouts: 0,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
|
|
2
2
|
const require_registry_index = require("./registry/index.cjs");
|
|
3
|
-
const require_common = require("./common-
|
|
4
|
-
const require_busy = require("./busy-
|
|
5
|
-
const require_parallel = require("./parallel-
|
|
3
|
+
const require_common = require("./common-3msAx7hO.cjs");
|
|
4
|
+
const require_busy = require("./busy-B_h0bNAJ.cjs");
|
|
5
|
+
const require_parallel = require("./parallel-szwYx-bi.cjs");
|
|
6
6
|
let _bcts_components = require("@bcts/components");
|
|
7
7
|
let _bcts_envelope = require("@bcts/envelope");
|
|
8
8
|
let _bcts_gstp = require("@bcts/gstp");
|
|
9
9
|
let node_fs = require("node:fs");
|
|
10
|
-
node_fs =
|
|
10
|
+
node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
|
|
11
11
|
let node_path = require("node:path");
|
|
12
|
-
node_path =
|
|
12
|
+
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
13
13
|
//#region src/cmd/dkg/coordinator/round2.ts
|
|
14
14
|
/**
|
|
15
15
|
* Copyright © 2023-2026 Blockchain Commons, LLC
|
|
@@ -22,7 +22,7 @@ node_path = require_chunk.__toESM(node_path, 1);
|
|
|
22
22
|
*
|
|
23
23
|
* @module
|
|
24
24
|
*/
|
|
25
|
-
var round2_exports = /* @__PURE__ */
|
|
25
|
+
var round2_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
26
26
|
buildFinalizeRequestForParticipant: () => buildFinalizeRequestForParticipant,
|
|
27
27
|
collectRound2Parallel: () => collectRound2Parallel,
|
|
28
28
|
dispatchFinalizeRequestsParallel: () => dispatchFinalizeRequestsParallel,
|
|
@@ -496,4 +496,4 @@ Object.defineProperty(exports, "validateAndExtractRound2Response", {
|
|
|
496
496
|
}
|
|
497
497
|
});
|
|
498
498
|
|
|
499
|
-
//# sourceMappingURL=round2-
|
|
499
|
+
//# sourceMappingURL=round2-BD_0N7Ab.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round2-CdUT-AhH.cjs","names":["SealedResponse","ARID","XID","getWithIndicator","isVerbose","PendingRequests","groupStateDir","path","parallelFetch","parallelFetchConfigWithTimeout","SealedRequest","Envelope","putWithIndicator","parallelSend","resolveRegistryPath","Registry","parseAridUr"],"sources":["../src/cmd/dkg/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG coordinator round 2 command.\n *\n * Port of cmd/dkg/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, type PrivateKeys, XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n type GroupRecord,\n PendingRequests,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { groupStateDir, isVerbose } from \"../../common.js\";\nimport {\n type CollectionResult,\n parallelFetch,\n parallelSend,\n type ParallelFetchConfig,\n parallelFetchConfigWithTimeout,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { parseAridUr } from \"../common.js\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * Options for the DKG round2 command.\n */\nexport interface DkgRound2Options {\n registryPath?: string;\n groupId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n preview?: boolean;\n}\n\n/**\n * Result of the DKG round2 command.\n */\nexport interface DkgRound2Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n displayPath?: string;\n}\n\n/**\n * Data extracted from a successful Round 2 response.\n *\n * Port of `struct Round2ResponseData` from round2.rs lines 601-604.\n */\nexport interface Round2ResponseData {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n/**\n * Round 2 collection result (for sequential path).\n *\n * Port of `struct Round2Collection` from round2.rs lines 206-213.\n */\ninterface Round2Collection {\n packages: Map<string, [XID, unknown][]>; // Map<XID.urString(), [recipient XID, package][]>\n nextResponseArids: [XID, ARID][];\n displayPath: string;\n}\n\n/**\n * Entry for a collected Round 2 response.\n *\n * Port of `struct CollectedRound2Entry` from round2.rs lines 359-362.\n */\ninterface CollectedRound2Entry {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n// -----------------------------------------------------------------------------\n// Validation\n// -----------------------------------------------------------------------------\n\n/**\n * Validate that the owner is the coordinator of the group.\n *\n * Port of coordinator check from round2.rs lines 86-94.\n */\nfunction validateCoordinator(groupRecord: GroupRecord, ownerXid: XID): void {\n if (groupRecord.coordinator().xid().urString() !== ownerXid.urString()) {\n throw new Error(\n `Only the coordinator can collect Round 2 responses and send finalize packages. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${ownerXid.urString()}`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Response validation and extraction\n// -----------------------------------------------------------------------------\n\n/**\n * Validate envelope and extract Round 2 data (for parallel fetch).\n *\n * Port of `validate_and_extract_round2_response()` from round2.rs lines 646-708.\n */\nexport function validateAndExtractRound2Response(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n expectedSender: XID,\n): Round2ResponseData | { rejected: string } {\n const now = new Date();\n\n let sealed: SealedResponse;\n try {\n sealed = SealedResponse.tryFromEncryptedEnvelope(envelope, undefined, now, coordinatorKeys);\n } catch (err) {\n return {\n rejected: `Failed to decrypt/parse response: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Check for error response\n if (!sealed.isOk()) {\n try {\n const error = sealed.error();\n const reasonEnv = error.optionalObjectForPredicate(\"reason\");\n const reason = reasonEnv?.extractString() ?? \"unknown reason\";\n return { rejected: `Participant reported error: ${reason}` };\n } catch {\n return { rejected: \"Participant reported error: unknown reason\" };\n }\n }\n\n // Get and validate result\n let result: Envelope;\n try {\n result = sealed.result();\n } catch {\n return { rejected: \"Response has no result envelope\" };\n }\n\n // Validate response type\n try {\n result.checkSubjectUnit();\n result.checkType(\"dkgRound2Response\");\n } catch (err) {\n return {\n rejected: `Invalid response type: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate group ID\n try {\n const groupEnv = result.objectForPredicate(\"group\");\n const groupId = groupEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n if (groupId.urString() !== expectedGroupId.urString()) {\n return {\n rejected: `Response group ID ${groupId.urString()} does not match expected ${expectedGroupId.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract group: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate participant/sender\n try {\n const participantEnv = result.objectForPredicate(\"participant\");\n const senderXid = participantEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n if (senderXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Response participant ${senderXid.urString()} does not match expected ${expectedSender.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract participant: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract next response ARID\n let nextResponseArid: ARID;\n try {\n const responseAridEnv = result.objectForPredicate(\"response_arid\");\n nextResponseArid = responseAridEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n } catch (err) {\n return {\n rejected: `Failed to extract response_arid: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract round2 packages\n const packages: [XID, unknown][] = [];\n try {\n const pkgEnvelopes = result.objectsForPredicate(\"round2Package\");\n for (const pkgEnv of pkgEnvelopes) {\n const recipientEnv = pkgEnv.objectForPredicate(\"recipient\");\n const recipient = recipientEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n const pkgJsonStr = pkgEnv.extractString();\n const pkg: unknown = JSON.parse(pkgJsonStr);\n packages.push([recipient, pkg]);\n }\n } catch (err) {\n return {\n rejected: `Failed to extract round2 packages: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n return { packages, nextResponseArid };\n}\n\n// -----------------------------------------------------------------------------\n// Sequential collection\n// -----------------------------------------------------------------------------\n\n/**\n * Fetch a Round 2 response sequentially.\n *\n * Port of `fetch_round2_response()` from round2.rs lines 364-442.\n */\nasync function fetchRound2Response(\n client: StorageClient,\n arid: ARID,\n timeout: number | undefined,\n coordinatorKeys: PrivateKeys,\n expectedGroup: ARID,\n expectedSender: XID,\n): Promise<CollectedRound2Entry> {\n const envelope = await getWithIndicator(\n client,\n arid,\n expectedSender.urString(),\n timeout,\n isVerbose(),\n );\n\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const result = validateAndExtractRound2Response(\n envelope,\n coordinatorKeys,\n expectedGroup,\n expectedSender,\n );\n\n if (\"rejected\" in result) {\n throw new Error(result.rejected);\n }\n\n return {\n packages: result.packages,\n nextResponseArid: result.nextResponseArid,\n };\n}\n\n/**\n * Collect Round 2 responses sequentially.\n *\n * Port of `collect_round2()` from round2.rs lines 216-357.\n */\nasync function collectRound2(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinatorKeys: PrivateKeys,\n groupId: ARID,\n pendingRequests: PendingRequests,\n timeout: number | undefined,\n): Promise<Round2Collection> {\n if (isVerbose()) {\n console.error(`Collecting Round 2 responses from ${pendingRequests.len()} participants...`);\n }\n\n const allPackages = new Map<string, [XID, unknown][]>();\n const nextResponseArids: [XID, ARID][] = [];\n const errors: [XID, string][] = [];\n\n for (const [participantXid, collectFromArid] of pendingRequests.iterCollect()) {\n const participantRecord = registry.participant(participantXid);\n const participantName = participantRecord?.petName() ?? participantXid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n try {\n const collected = await fetchRound2Response(\n client,\n collectFromArid,\n timeout,\n coordinatorKeys,\n groupId,\n participantXid,\n );\n allPackages.set(participantXid.urString(), collected.packages);\n nextResponseArids.push([participantXid, collected.nextResponseArid]);\n } catch (err) {\n if (isVerbose()) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n }\n errors.push([participantXid, err instanceof Error ? err.message : String(err)]);\n }\n }\n\n if (errors.length > 0) {\n if (isVerbose()) {\n console.error();\n console.error(`Failed to collect from ${errors.length} participants:`);\n }\n for (const [xid, error] of errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n throw new Error(\n `Round 2 collection incomplete: ${errors.length} of ${pendingRequests.len()} responses failed`,\n );\n }\n\n // Persist collected round2 packages\n const displayPath = persistRound2PackagesFromMap(\n registryPath,\n groupId,\n allPackages,\n nextResponseArids,\n );\n\n // Update pending requests\n const newPending = new PendingRequests();\n for (const [xid, sendToArid] of nextResponseArids) {\n newPending.addSendOnly(xid, sendToArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n\n return {\n packages: allPackages,\n nextResponseArids,\n displayPath,\n };\n}\n\n/**\n * Persist Round 2 packages from a Map (sequential collection).\n */\nfunction persistRound2PackagesFromMap(\n registryPath: string,\n groupId: ARID,\n allPackages: Map<string, [XID, unknown][]>,\n nextResponseArids: [XID, ARID][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [senderUrString, packages] of allPackages) {\n const senderMap: Record<string, unknown> = {};\n\n // Find response_arid for this sender\n const responseArid = nextResponseArids.find(([xid]) => xid.urString() === senderUrString)?.[1];\n\n if (responseArid !== undefined) {\n senderMap[\"response_arid\"] = responseArid.urString();\n }\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[senderUrString] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Parallel collection\n// -----------------------------------------------------------------------------\n\n/**\n * Collect Round 2 responses in parallel with progress display.\n *\n * Port of `collect_round2_parallel()` from round2.rs lines 607-643.\n */\nexport async function collectRound2Parallel(\n client: StorageClient,\n registry: Registry,\n pendingRequests: PendingRequests,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n timeout: number | undefined,\n): Promise<CollectionResult<Round2ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xid, arid] of pendingRequests.iterCollect()) {\n const record = registry.participant(xid);\n const name = record?.petName() ?? xid.urString();\n requests.push([xid, arid, name]);\n }\n\n const config: ParallelFetchConfig = parallelFetchConfigWithTimeout(timeout);\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) =>\n validateAndExtractRound2Response(envelope, coordinatorKeys, expectedGroupId, xid),\n config,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Persist Round 2 packages (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Persist Round 2 packages from parallel collection results.\n *\n * Port of `persist_round2_packages()` from round2.rs lines 712-758.\n */\nexport function persistRound2Packages(\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [sender, data] of successes) {\n const senderMap: Record<string, unknown> = {};\n senderMap[\"response_arid\"] = data.nextResponseArid.urString();\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of data.packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[sender.urString()] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Update pending requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Update pending requests from parallel collection results.\n *\n * Port of `update_pending_for_finalize_from_collection()` from round2.rs lines 761-777.\n */\nexport function updatePendingForFinalizeFromCollection(\n registry: Registry,\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): void {\n const newPending = new PendingRequests();\n for (const [xid, data] of successes) {\n newPending.addSendOnly(xid, data.nextResponseArid);\n }\n\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n}\n\n// -----------------------------------------------------------------------------\n// Finalize request building\n// -----------------------------------------------------------------------------\n\n/**\n * Gather packages FOR a specific recipient (from all other senders).\n *\n * Port of `gather_packages_for_recipient()` from round2.rs lines 552-571.\n */\nfunction gatherPackagesForRecipient(\n recipient: XID,\n allPackages: Map<string, [XID, unknown][]>,\n): [XID, unknown][] {\n const result: [XID, unknown][] = [];\n\n for (const [senderUrString, packages] of allPackages) {\n for (const [rcpt, pkg] of packages) {\n if (rcpt.urString() === recipient.urString()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const sender = XIDClass.fromURString(senderUrString) as XID;\n result.push([sender, pkg]);\n }\n }\n }\n\n if (result.length === 0) {\n throw new Error(`No round2 packages found for recipient ${recipient.urString()}`);\n }\n\n return result;\n}\n\n/**\n * Build a finalize request for a participant.\n *\n * Port of `build_finalize_request_for_participant()` from round2.rs lines 575-594.\n */\nexport function buildFinalizeRequestForParticipant(\n sender: XIDDocument,\n groupId: ARID,\n responseArid: ARID,\n packages: [XID, unknown][],\n): SealedRequest {\n let request = SealedRequest.new(\"dkgFinalize\", ARID.new(), sender)\n .withParameter(\"group\", groupId)\n .withParameter(\"responseArid\", responseArid);\n\n for (const [pkgSender, pkg] of packages) {\n const encoded = JSON.stringify(pkg);\n const pkgEnvelope = Envelope.new(encoded).addAssertion(\"sender\", pkgSender);\n request = request.withParameter(\"round2Package\", pkgEnvelope);\n }\n\n return request;\n}\n\n// -----------------------------------------------------------------------------\n// Send finalize requests (sequential)\n// -----------------------------------------------------------------------------\n\n/**\n * Send finalize requests sequentially.\n *\n * Port of `send_finalize_requests()` from round2.rs lines 444-550.\n */\nasync function sendFinalizeRequests(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinator: XIDDocument,\n groupId: ARID,\n collection: Round2Collection,\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build participant info: [XID, XIDDocument, sendToArid, collectFromArid]\n const participantInfo: [XID, XIDDocument, ARID, ARID][] = [];\n\n for (const [xid, sendToArid] of collection.nextResponseArids) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const collectFromArid = ARID.new();\n participantInfo.push([xid, record.xidDocument(), sendToArid, collectFromArid]);\n }\n\n if (isVerbose()) {\n console.error(`Sending finalize packages to ${participantInfo.length} participants...`);\n } else {\n console.error(); // Blank line to separate get phase from put phase\n }\n\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, recipientDoc, sendToArid, collectFromArid] of participantInfo) {\n const record = registry.participant(xid);\n const participantName = record?.petName() ?? xid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n // Gather packages FOR this recipient\n const packagesForRecipient = gatherPackagesForRecipient(xid, collection.packages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n await putWithIndicator(client, sendToArid, sealedEnvelope, participantName, isVerbose());\n }\n\n // Build pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, , , collectFromArid] of participantInfo) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch finalize requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Dispatch finalize requests in parallel.\n *\n * Port of `dispatch_finalize_requests_parallel()` from round2.rs lines 780-900.\n */\nexport async function dispatchFinalizeRequestsParallel(\n client: StorageClient,\n registry: Registry,\n registryPath: string,\n coordinator: XIDDocument,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build all_packages map for gatherPackagesForRecipient\n const allPackages = new Map<string, [XID, unknown][]>();\n for (const [xid, data] of successes) {\n allPackages.set(xid.urString(), data.packages);\n }\n\n // Build messages\n const messages: [XID, ARID, Envelope, string][] = [];\n const collectArids: [XID, ARID][] = [];\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, data] of successes) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const recipientDoc = record.xidDocument();\n const participantName = record.petName() ?? xid.urString();\n\n const collectFromArid = ARID.new();\n collectArids.push([xid, collectFromArid]);\n\n const packagesForRecipient = gatherPackagesForRecipient(xid, allPackages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n messages.push([xid, data.nextResponseArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n // Send all messages in parallel\n const sendResults = await parallelSend(client, messages, isVerbose());\n\n // Check for send failures\n const failures = sendResults.filter(([, err]) => err !== null);\n\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send finalize requests to ${failures.length} participants`);\n }\n\n // Update pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, collectFromArid] of collectArids) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Summary printing\n// -----------------------------------------------------------------------------\n\n/**\n * Print summary for parallel collection.\n *\n * Port of `print_summary_parallel()` from round2.rs lines 903-964.\n */\nfunction printSummaryParallel(\n collection: CollectionResult<Round2ResponseData>,\n displayPath: string,\n preview: [string, string] | undefined,\n): void {\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n console.error();\n console.error(\n `Round 2 collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n return;\n }\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Main entry point\n// -----------------------------------------------------------------------------\n\n/**\n * Execute the DKG coordinator round 2 command.\n *\n * Collects Round 2 responses and sends finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/coordinator/round2.rs lines 59-203.\n */\nexport async function round2(\n client: StorageClient,\n options: DkgRound2Options,\n cwd: string,\n): Promise<DkgRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerDoc = owner.xidDocument();\n\n const groupId = parseAridUr(options.groupId);\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(`Group ${options.groupId} not found in registry`);\n }\n\n // Verify we are the coordinator\n validateCoordinator(groupRecord, owner.xid());\n\n const pendingRequests = groupRecord.pendingRequests();\n if (pendingRequests.isEmpty()) {\n throw new Error(\n \"No pending requests for this group. Did you run 'frost dkg coordinator round1'?\",\n );\n }\n\n const coordinatorKeys = ownerDoc.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no private keys\");\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectRound2Parallel(\n client,\n registry,\n pendingRequests,\n coordinatorKeys,\n groupId,\n options.timeoutSeconds,\n );\n\n // Persist collected data\n const displayPath = persistRound2Packages(registryPath, groupId, collection.successes);\n\n updatePendingForFinalizeFromCollection(registry, registryPath, groupId, collection.successes);\n\n const preview = await dispatchFinalizeRequestsParallel(\n client,\n registry,\n registryPath,\n ownerDoc,\n groupId,\n collection.successes,\n options.preview ?? false,\n );\n\n printSummaryParallel(collection, displayPath, preview);\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n displayPath,\n };\n } else {\n // Sequential path (original behavior)\n // Phase 1: Collect Round 2 responses\n const collection = await collectRound2(\n client,\n registryPath,\n registry,\n coordinatorKeys,\n groupId,\n pendingRequests,\n options.timeoutSeconds,\n );\n\n // Phase 2: Send finalize packages\n const preview = await sendFinalizeRequests(\n client,\n registryPath,\n registry,\n ownerDoc,\n groupId,\n collection,\n options.preview ?? false,\n );\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n }\n\n return {\n accepted: collection.packages.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n displayPath: collection.displayPath,\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"round2-BD_0N7Ab.cjs","names":["SealedResponse","ARID","XID","getWithIndicator","isVerbose","PendingRequests","groupStateDir","path","parallelFetch","parallelFetchConfigWithTimeout","SealedRequest","Envelope","putWithIndicator","parallelSend","resolveRegistryPath","Registry","parseAridUr"],"sources":["../src/cmd/dkg/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG coordinator round 2 command.\n *\n * Port of cmd/dkg/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, type PrivateKeys, XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n type GroupRecord,\n PendingRequests,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { groupStateDir, isVerbose } from \"../../common.js\";\nimport {\n type CollectionResult,\n parallelFetch,\n parallelSend,\n type ParallelFetchConfig,\n parallelFetchConfigWithTimeout,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { parseAridUr } from \"../common.js\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * Options for the DKG round2 command.\n */\nexport interface DkgRound2Options {\n registryPath?: string;\n groupId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n preview?: boolean;\n}\n\n/**\n * Result of the DKG round2 command.\n */\nexport interface DkgRound2Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n displayPath?: string;\n}\n\n/**\n * Data extracted from a successful Round 2 response.\n *\n * Port of `struct Round2ResponseData` from round2.rs lines 601-604.\n */\nexport interface Round2ResponseData {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n/**\n * Round 2 collection result (for sequential path).\n *\n * Port of `struct Round2Collection` from round2.rs lines 206-213.\n */\ninterface Round2Collection {\n packages: Map<string, [XID, unknown][]>; // Map<XID.urString(), [recipient XID, package][]>\n nextResponseArids: [XID, ARID][];\n displayPath: string;\n}\n\n/**\n * Entry for a collected Round 2 response.\n *\n * Port of `struct CollectedRound2Entry` from round2.rs lines 359-362.\n */\ninterface CollectedRound2Entry {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n// -----------------------------------------------------------------------------\n// Validation\n// -----------------------------------------------------------------------------\n\n/**\n * Validate that the owner is the coordinator of the group.\n *\n * Port of coordinator check from round2.rs lines 86-94.\n */\nfunction validateCoordinator(groupRecord: GroupRecord, ownerXid: XID): void {\n if (groupRecord.coordinator().xid().urString() !== ownerXid.urString()) {\n throw new Error(\n `Only the coordinator can collect Round 2 responses and send finalize packages. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${ownerXid.urString()}`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Response validation and extraction\n// -----------------------------------------------------------------------------\n\n/**\n * Validate envelope and extract Round 2 data (for parallel fetch).\n *\n * Port of `validate_and_extract_round2_response()` from round2.rs lines 646-708.\n */\nexport function validateAndExtractRound2Response(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n expectedSender: XID,\n): Round2ResponseData | { rejected: string } {\n const now = new Date();\n\n let sealed: SealedResponse;\n try {\n sealed = SealedResponse.tryFromEncryptedEnvelope(envelope, undefined, now, coordinatorKeys);\n } catch (err) {\n return {\n rejected: `Failed to decrypt/parse response: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Check for error response\n if (!sealed.isOk()) {\n try {\n const error = sealed.error();\n const reasonEnv = error.optionalObjectForPredicate(\"reason\");\n const reason = reasonEnv?.extractString() ?? \"unknown reason\";\n return { rejected: `Participant reported error: ${reason}` };\n } catch {\n return { rejected: \"Participant reported error: unknown reason\" };\n }\n }\n\n // Get and validate result\n let result: Envelope;\n try {\n result = sealed.result();\n } catch {\n return { rejected: \"Response has no result envelope\" };\n }\n\n // Validate response type\n try {\n result.checkSubjectUnit();\n result.checkType(\"dkgRound2Response\");\n } catch (err) {\n return {\n rejected: `Invalid response type: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate group ID\n try {\n const groupEnv = result.objectForPredicate(\"group\");\n const groupId = groupEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n if (groupId.urString() !== expectedGroupId.urString()) {\n return {\n rejected: `Response group ID ${groupId.urString()} does not match expected ${expectedGroupId.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract group: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate participant/sender\n try {\n const participantEnv = result.objectForPredicate(\"participant\");\n const senderXid = participantEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n if (senderXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Response participant ${senderXid.urString()} does not match expected ${expectedSender.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract participant: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract next response ARID\n let nextResponseArid: ARID;\n try {\n const responseAridEnv = result.objectForPredicate(\"response_arid\");\n nextResponseArid = responseAridEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n } catch (err) {\n return {\n rejected: `Failed to extract response_arid: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract round2 packages\n const packages: [XID, unknown][] = [];\n try {\n const pkgEnvelopes = result.objectsForPredicate(\"round2Package\");\n for (const pkgEnv of pkgEnvelopes) {\n const recipientEnv = pkgEnv.objectForPredicate(\"recipient\");\n const recipient = recipientEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n const pkgJsonStr = pkgEnv.extractString();\n const pkg: unknown = JSON.parse(pkgJsonStr);\n packages.push([recipient, pkg]);\n }\n } catch (err) {\n return {\n rejected: `Failed to extract round2 packages: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n return { packages, nextResponseArid };\n}\n\n// -----------------------------------------------------------------------------\n// Sequential collection\n// -----------------------------------------------------------------------------\n\n/**\n * Fetch a Round 2 response sequentially.\n *\n * Port of `fetch_round2_response()` from round2.rs lines 364-442.\n */\nasync function fetchRound2Response(\n client: StorageClient,\n arid: ARID,\n timeout: number | undefined,\n coordinatorKeys: PrivateKeys,\n expectedGroup: ARID,\n expectedSender: XID,\n): Promise<CollectedRound2Entry> {\n const envelope = await getWithIndicator(\n client,\n arid,\n expectedSender.urString(),\n timeout,\n isVerbose(),\n );\n\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const result = validateAndExtractRound2Response(\n envelope,\n coordinatorKeys,\n expectedGroup,\n expectedSender,\n );\n\n if (\"rejected\" in result) {\n throw new Error(result.rejected);\n }\n\n return {\n packages: result.packages,\n nextResponseArid: result.nextResponseArid,\n };\n}\n\n/**\n * Collect Round 2 responses sequentially.\n *\n * Port of `collect_round2()` from round2.rs lines 216-357.\n */\nasync function collectRound2(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinatorKeys: PrivateKeys,\n groupId: ARID,\n pendingRequests: PendingRequests,\n timeout: number | undefined,\n): Promise<Round2Collection> {\n if (isVerbose()) {\n console.error(`Collecting Round 2 responses from ${pendingRequests.len()} participants...`);\n }\n\n const allPackages = new Map<string, [XID, unknown][]>();\n const nextResponseArids: [XID, ARID][] = [];\n const errors: [XID, string][] = [];\n\n for (const [participantXid, collectFromArid] of pendingRequests.iterCollect()) {\n const participantRecord = registry.participant(participantXid);\n const participantName = participantRecord?.petName() ?? participantXid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n try {\n const collected = await fetchRound2Response(\n client,\n collectFromArid,\n timeout,\n coordinatorKeys,\n groupId,\n participantXid,\n );\n allPackages.set(participantXid.urString(), collected.packages);\n nextResponseArids.push([participantXid, collected.nextResponseArid]);\n } catch (err) {\n if (isVerbose()) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n }\n errors.push([participantXid, err instanceof Error ? err.message : String(err)]);\n }\n }\n\n if (errors.length > 0) {\n if (isVerbose()) {\n console.error();\n console.error(`Failed to collect from ${errors.length} participants:`);\n }\n for (const [xid, error] of errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n throw new Error(\n `Round 2 collection incomplete: ${errors.length} of ${pendingRequests.len()} responses failed`,\n );\n }\n\n // Persist collected round2 packages\n const displayPath = persistRound2PackagesFromMap(\n registryPath,\n groupId,\n allPackages,\n nextResponseArids,\n );\n\n // Update pending requests\n const newPending = new PendingRequests();\n for (const [xid, sendToArid] of nextResponseArids) {\n newPending.addSendOnly(xid, sendToArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n\n return {\n packages: allPackages,\n nextResponseArids,\n displayPath,\n };\n}\n\n/**\n * Persist Round 2 packages from a Map (sequential collection).\n */\nfunction persistRound2PackagesFromMap(\n registryPath: string,\n groupId: ARID,\n allPackages: Map<string, [XID, unknown][]>,\n nextResponseArids: [XID, ARID][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [senderUrString, packages] of allPackages) {\n const senderMap: Record<string, unknown> = {};\n\n // Find response_arid for this sender\n const responseArid = nextResponseArids.find(([xid]) => xid.urString() === senderUrString)?.[1];\n\n if (responseArid !== undefined) {\n senderMap[\"response_arid\"] = responseArid.urString();\n }\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[senderUrString] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Parallel collection\n// -----------------------------------------------------------------------------\n\n/**\n * Collect Round 2 responses in parallel with progress display.\n *\n * Port of `collect_round2_parallel()` from round2.rs lines 607-643.\n */\nexport async function collectRound2Parallel(\n client: StorageClient,\n registry: Registry,\n pendingRequests: PendingRequests,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n timeout: number | undefined,\n): Promise<CollectionResult<Round2ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xid, arid] of pendingRequests.iterCollect()) {\n const record = registry.participant(xid);\n const name = record?.petName() ?? xid.urString();\n requests.push([xid, arid, name]);\n }\n\n const config: ParallelFetchConfig = parallelFetchConfigWithTimeout(timeout);\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) =>\n validateAndExtractRound2Response(envelope, coordinatorKeys, expectedGroupId, xid),\n config,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Persist Round 2 packages (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Persist Round 2 packages from parallel collection results.\n *\n * Port of `persist_round2_packages()` from round2.rs lines 712-758.\n */\nexport function persistRound2Packages(\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [sender, data] of successes) {\n const senderMap: Record<string, unknown> = {};\n senderMap[\"response_arid\"] = data.nextResponseArid.urString();\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of data.packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[sender.urString()] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Update pending requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Update pending requests from parallel collection results.\n *\n * Port of `update_pending_for_finalize_from_collection()` from round2.rs lines 761-777.\n */\nexport function updatePendingForFinalizeFromCollection(\n registry: Registry,\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): void {\n const newPending = new PendingRequests();\n for (const [xid, data] of successes) {\n newPending.addSendOnly(xid, data.nextResponseArid);\n }\n\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n}\n\n// -----------------------------------------------------------------------------\n// Finalize request building\n// -----------------------------------------------------------------------------\n\n/**\n * Gather packages FOR a specific recipient (from all other senders).\n *\n * Port of `gather_packages_for_recipient()` from round2.rs lines 552-571.\n */\nfunction gatherPackagesForRecipient(\n recipient: XID,\n allPackages: Map<string, [XID, unknown][]>,\n): [XID, unknown][] {\n const result: [XID, unknown][] = [];\n\n for (const [senderUrString, packages] of allPackages) {\n for (const [rcpt, pkg] of packages) {\n if (rcpt.urString() === recipient.urString()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const sender = XIDClass.fromURString(senderUrString) as XID;\n result.push([sender, pkg]);\n }\n }\n }\n\n if (result.length === 0) {\n throw new Error(`No round2 packages found for recipient ${recipient.urString()}`);\n }\n\n return result;\n}\n\n/**\n * Build a finalize request for a participant.\n *\n * Port of `build_finalize_request_for_participant()` from round2.rs lines 575-594.\n */\nexport function buildFinalizeRequestForParticipant(\n sender: XIDDocument,\n groupId: ARID,\n responseArid: ARID,\n packages: [XID, unknown][],\n): SealedRequest {\n let request = SealedRequest.new(\"dkgFinalize\", ARID.new(), sender)\n .withParameter(\"group\", groupId)\n .withParameter(\"responseArid\", responseArid);\n\n for (const [pkgSender, pkg] of packages) {\n const encoded = JSON.stringify(pkg);\n const pkgEnvelope = Envelope.new(encoded).addAssertion(\"sender\", pkgSender);\n request = request.withParameter(\"round2Package\", pkgEnvelope);\n }\n\n return request;\n}\n\n// -----------------------------------------------------------------------------\n// Send finalize requests (sequential)\n// -----------------------------------------------------------------------------\n\n/**\n * Send finalize requests sequentially.\n *\n * Port of `send_finalize_requests()` from round2.rs lines 444-550.\n */\nasync function sendFinalizeRequests(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinator: XIDDocument,\n groupId: ARID,\n collection: Round2Collection,\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build participant info: [XID, XIDDocument, sendToArid, collectFromArid]\n const participantInfo: [XID, XIDDocument, ARID, ARID][] = [];\n\n for (const [xid, sendToArid] of collection.nextResponseArids) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const collectFromArid = ARID.new();\n participantInfo.push([xid, record.xidDocument(), sendToArid, collectFromArid]);\n }\n\n if (isVerbose()) {\n console.error(`Sending finalize packages to ${participantInfo.length} participants...`);\n } else {\n console.error(); // Blank line to separate get phase from put phase\n }\n\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, recipientDoc, sendToArid, collectFromArid] of participantInfo) {\n const record = registry.participant(xid);\n const participantName = record?.petName() ?? xid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n // Gather packages FOR this recipient\n const packagesForRecipient = gatherPackagesForRecipient(xid, collection.packages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n await putWithIndicator(client, sendToArid, sealedEnvelope, participantName, isVerbose());\n }\n\n // Build pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, , , collectFromArid] of participantInfo) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch finalize requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Dispatch finalize requests in parallel.\n *\n * Port of `dispatch_finalize_requests_parallel()` from round2.rs lines 780-900.\n */\nexport async function dispatchFinalizeRequestsParallel(\n client: StorageClient,\n registry: Registry,\n registryPath: string,\n coordinator: XIDDocument,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build all_packages map for gatherPackagesForRecipient\n const allPackages = new Map<string, [XID, unknown][]>();\n for (const [xid, data] of successes) {\n allPackages.set(xid.urString(), data.packages);\n }\n\n // Build messages\n const messages: [XID, ARID, Envelope, string][] = [];\n const collectArids: [XID, ARID][] = [];\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, data] of successes) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const recipientDoc = record.xidDocument();\n const participantName = record.petName() ?? xid.urString();\n\n const collectFromArid = ARID.new();\n collectArids.push([xid, collectFromArid]);\n\n const packagesForRecipient = gatherPackagesForRecipient(xid, allPackages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n messages.push([xid, data.nextResponseArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n // Send all messages in parallel\n const sendResults = await parallelSend(client, messages, isVerbose());\n\n // Check for send failures\n const failures = sendResults.filter(([, err]) => err !== null);\n\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send finalize requests to ${failures.length} participants`);\n }\n\n // Update pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, collectFromArid] of collectArids) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Summary printing\n// -----------------------------------------------------------------------------\n\n/**\n * Print summary for parallel collection.\n *\n * Port of `print_summary_parallel()` from round2.rs lines 903-964.\n */\nfunction printSummaryParallel(\n collection: CollectionResult<Round2ResponseData>,\n displayPath: string,\n preview: [string, string] | undefined,\n): void {\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n console.error();\n console.error(\n `Round 2 collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n return;\n }\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Main entry point\n// -----------------------------------------------------------------------------\n\n/**\n * Execute the DKG coordinator round 2 command.\n *\n * Collects Round 2 responses and sends finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/coordinator/round2.rs lines 59-203.\n */\nexport async function round2(\n client: StorageClient,\n options: DkgRound2Options,\n cwd: string,\n): Promise<DkgRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerDoc = owner.xidDocument();\n\n const groupId = parseAridUr(options.groupId);\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(`Group ${options.groupId} not found in registry`);\n }\n\n // Verify we are the coordinator\n validateCoordinator(groupRecord, owner.xid());\n\n const pendingRequests = groupRecord.pendingRequests();\n if (pendingRequests.isEmpty()) {\n throw new Error(\n \"No pending requests for this group. Did you run 'frost dkg coordinator round1'?\",\n );\n }\n\n const coordinatorKeys = ownerDoc.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no private keys\");\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectRound2Parallel(\n client,\n registry,\n pendingRequests,\n coordinatorKeys,\n groupId,\n options.timeoutSeconds,\n );\n\n // Persist collected data\n const displayPath = persistRound2Packages(registryPath, groupId, collection.successes);\n\n updatePendingForFinalizeFromCollection(registry, registryPath, groupId, collection.successes);\n\n const preview = await dispatchFinalizeRequestsParallel(\n client,\n registry,\n registryPath,\n ownerDoc,\n groupId,\n collection.successes,\n options.preview ?? false,\n );\n\n printSummaryParallel(collection, displayPath, preview);\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n displayPath,\n };\n } else {\n // Sequential path (original behavior)\n // Phase 1: Collect Round 2 responses\n const collection = await collectRound2(\n client,\n registryPath,\n registry,\n coordinatorKeys,\n groupId,\n pendingRequests,\n options.timeoutSeconds,\n );\n\n // Phase 2: Send finalize packages\n const preview = await sendFinalizeRequests(\n client,\n registryPath,\n registry,\n ownerDoc,\n groupId,\n collection,\n options.preview ?? false,\n );\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n }\n\n return {\n accepted: collection.packages.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n displayPath: collection.displayPath,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as __require, t as __exportAll } from "./
|
|
1
|
+
import { n as __require, t as __exportAll } from "./rolldown-runtime-z9aeyW2b.mjs";
|
|
2
2
|
import { Registry, resolveRegistryPath } from "./registry/index.mjs";
|
|
3
|
-
import { c as parseAridUr } from "./common-
|
|
4
|
-
import { n as putWithIndicator, t as getWithIndicator } from "./busy-
|
|
3
|
+
import { c as parseAridUr } from "./common-4spC1kNw.mjs";
|
|
4
|
+
import { n as putWithIndicator, t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
|
|
5
5
|
import { createSigningPackage, deserializeKeyPackage, deserializeSigningCommitments, identifierFromU16, serializeSignatureShare, serializeSigningCommitments, signingRound2 } from "./frost/index.mjs";
|
|
6
|
-
import { n as signingStateDir } from "./common
|
|
6
|
+
import { n as signingStateDir } from "./common--IfAHVkl.mjs";
|
|
7
7
|
import { ARID, JSON as JSON$1, XID } from "@bcts/components";
|
|
8
8
|
import { CborDate } from "@bcts/dcbor";
|
|
9
9
|
import { Envelope, Function } from "@bcts/envelope";
|
|
@@ -289,4 +289,4 @@ async function round2$1(client, options, cwd) {
|
|
|
289
289
|
//#endregion
|
|
290
290
|
export { round2_exports as n, round2$1 as t };
|
|
291
291
|
|
|
292
|
-
//# sourceMappingURL=round2-
|
|
292
|
+
//# sourceMappingURL=round2-BLOgZeAo.mjs.map
|