@bcts/frost-hubert 1.0.0-beta.0 → 1.0.0-beta.1
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-CCVhHzG7.cjs} +20 -21
- package/dist/{cmd-Bw9_i2_f.cjs.map → cmd-CCVhHzG7.cjs.map} +1 -1
- package/dist/{cmd-CS1uJtuD.mjs → cmd-DNsHd19v.mjs} +20 -21
- package/dist/{cmd-CS1uJtuD.mjs.map → cmd-DNsHd19v.mjs.map} +1 -1
- package/dist/{common-lThIvJmZ.cjs → common-7-BOgaTt.cjs} +2 -3
- package/dist/{common-lThIvJmZ.cjs.map → common-7-BOgaTt.cjs.map} +1 -1
- package/dist/{common-CvH6dFvQ.mjs → common-Cf1UvJaP.mjs} +3 -3
- package/dist/{common-CvH6dFvQ.mjs.map → common-Cf1UvJaP.mjs.map} +1 -1
- package/dist/{common-lKP5EzHy.cjs → common-CnvAUC2b.cjs} +3 -3
- package/dist/{common-lKP5EzHy.cjs.map → common-CnvAUC2b.cjs.map} +1 -1
- package/dist/{common-DUWvtc08.mjs → common-DNrD_-EI.mjs} +2 -2
- package/dist/{common-DUWvtc08.mjs.map → common-DNrD_-EI.mjs.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-BpC0rz93.mjs} +6 -6
- package/dist/{finalize-CNTDj6aS.mjs.map → finalize-BpC0rz93.mjs.map} +1 -1
- package/dist/{finalize-BRgJK-Xv.cjs → finalize-Cb0obTSo.cjs} +6 -6
- package/dist/{finalize-BRgJK-Xv.cjs.map → finalize-Cb0obTSo.cjs.map} +1 -1
- package/dist/{finalize-BfLgzn8f.cjs → finalize-DHEnKobp.cjs} +5 -5
- package/dist/{finalize-BfLgzn8f.cjs.map → finalize-DHEnKobp.cjs.map} +1 -1
- package/dist/{finalize-UPyI1yb1.cjs → finalize-DQ0VGUHO.cjs} +7 -7
- package/dist/{finalize-UPyI1yb1.cjs.map → finalize-DQ0VGUHO.cjs.map} +1 -1
- package/dist/{finalize-IA01t_Qq.mjs → finalize-DtRxHZ7H.mjs} +5 -5
- package/dist/{finalize-IA01t_Qq.mjs.map → finalize-DtRxHZ7H.mjs.map} +1 -1
- package/dist/{finalize-EC3ikHQq.mjs → finalize-T83Ko8nG.mjs} +6 -6
- package/dist/{finalize-EC3ikHQq.mjs.map → finalize-T83Ko8nG.mjs.map} +1 -1
- package/dist/frost/index.cjs +1 -1
- 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-5277FQVT.cjs → invite-1tzg0B0P.cjs} +5 -5
- package/dist/{invite-5277FQVT.cjs.map → invite-1tzg0B0P.cjs.map} +1 -1
- package/dist/{invite-DUTcfTgX.cjs → invite-BLwtexAu.cjs} +4 -4
- package/dist/{invite-DUTcfTgX.cjs.map → invite-BLwtexAu.cjs.map} +1 -1
- package/dist/{invite-IU4n0dq2.mjs → invite-Be2v2SVc.mjs} +4 -4
- package/dist/{invite-IU4n0dq2.mjs.map → invite-Be2v2SVc.mjs.map} +1 -1
- package/dist/{invite-RU-OXTNS.mjs → invite-D8mQSnFz.mjs} +5 -5
- package/dist/{invite-RU-OXTNS.mjs.map → invite-D8mQSnFz.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-CAI-x4II.cjs → receive-BR-knnGv.cjs} +6 -6
- package/dist/{receive-CAI-x4II.cjs.map → receive-BR-knnGv.cjs.map} +1 -1
- package/dist/{receive-kZMsXhbK.cjs → receive-D_r4Mryr.cjs} +6 -6
- package/dist/{receive-kZMsXhbK.cjs.map → receive-D_r4Mryr.cjs.map} +1 -1
- package/dist/{receive-D2Nn68L7.mjs → receive-dkSCSGpl.mjs} +5 -5
- package/dist/{receive-D2Nn68L7.mjs.map → receive-dkSCSGpl.mjs.map} +1 -1
- package/dist/{receive-DA_KQEgk.mjs → receive-g8EhZF2Y.mjs} +6 -6
- package/dist/{receive-DA_KQEgk.mjs.map → receive-g8EhZF2Y.mjs.map} +1 -1
- package/dist/registry/index.cjs +1 -1
- 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-CkIbA7nt.cjs} +79 -2
- package/dist/registry-CkIbA7nt.cjs.map +1 -0
- package/dist/{registry-BpCwtrRt.mjs → registry-DGjs4qDK.mjs} +74 -3
- package/dist/registry-DGjs4qDK.mjs.map +1 -0
- package/dist/{round1-BHBjru1m.cjs → round1-9FAqFvL5.cjs} +5 -5
- package/dist/{round1-BHBjru1m.cjs.map → round1-9FAqFvL5.cjs.map} +1 -1
- package/dist/{round1-CcQCGlIT.mjs → round1-B8haiMM8.mjs} +6 -6
- package/dist/{round1-CcQCGlIT.mjs.map → round1-B8haiMM8.mjs.map} +1 -1
- package/dist/{round1-Cgm7j1kI.mjs → round1-BOIE1E4O.mjs} +5 -5
- package/dist/{round1-Cgm7j1kI.mjs.map → round1-BOIE1E4O.mjs.map} +1 -1
- package/dist/{round1-4Hyx8w0x.cjs → round1-Bq0vweyQ.cjs} +5 -5
- package/dist/{round1-4Hyx8w0x.cjs.map → round1-Bq0vweyQ.cjs.map} +1 -1
- package/dist/{round1-CWSXZx5R.cjs → round1-CXkXoVQU.cjs} +9 -9
- package/dist/{round1-CWSXZx5R.cjs.map → round1-CXkXoVQU.cjs.map} +1 -1
- package/dist/{round1-7v9LlE11.mjs → round1-D8t7EzIo.mjs} +5 -5
- package/dist/{round1-7v9LlE11.mjs.map → round1-D8t7EzIo.mjs.map} +1 -1
- package/dist/{round1-DQ0fnc1H.cjs → round1-DriPu15x.cjs} +7 -7
- package/dist/{round1-DQ0fnc1H.cjs.map → round1-DriPu15x.cjs.map} +1 -1
- package/dist/{round1-CMLKN2RR.mjs → round1-Y2kcVwnR.mjs} +7 -7
- package/dist/{round1-CMLKN2RR.mjs.map → round1-Y2kcVwnR.mjs.map} +1 -1
- package/dist/{round2-BWz9SQIi.cjs → round2-AMDYMUIg.cjs} +5 -5
- package/dist/{round2-BWz9SQIi.cjs.map → round2-AMDYMUIg.cjs.map} +1 -1
- package/dist/{round2-o2Q-GMbX.cjs → round2-BHQKVJFo.cjs} +7 -7
- package/dist/{round2-o2Q-GMbX.cjs.map → round2-BHQKVJFo.cjs.map} +1 -1
- package/dist/{round2-Bl2uK93U.mjs → round2-BfetYacV.mjs} +5 -5
- package/dist/{round2-Bl2uK93U.mjs.map → round2-BfetYacV.mjs.map} +1 -1
- package/dist/{round2-Dg24w-TU.mjs → round2-Cf5CJc_8.mjs} +7 -7
- package/dist/{round2-Dg24w-TU.mjs.map → round2-Cf5CJc_8.mjs.map} +1 -1
- package/dist/{round2-LylCa84n.cjs → round2-CvrmylN1.cjs} +7 -7
- package/dist/{round2-LylCa84n.cjs.map → round2-CvrmylN1.cjs.map} +1 -1
- package/dist/{round2-CdUT-AhH.cjs → round2-Dk_w97nl.cjs} +5 -5
- package/dist/{round2-CdUT-AhH.cjs.map → round2-Dk_w97nl.cjs.map} +1 -1
- package/dist/{round2-BkNRCXgS.mjs → round2-Z2JhMwxc.mjs} +5 -5
- package/dist/{round2-BkNRCXgS.mjs.map → round2-Z2JhMwxc.mjs.map} +1 -1
- package/dist/{round2-DOA3rnV-.mjs → round2-mF6UlkT-.mjs} +6 -6
- package/dist/{round2-DOA3rnV-.mjs.map → round2-mF6UlkT-.mjs.map} +1 -1
- package/package.json +14 -14
- 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 → chunk-DakpK96I.cjs} +0 -0
- /package/dist/{chunk-CjcI7cDX.mjs → chunk-z9aeyW2b.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round2-o2Q-GMbX.cjs","names":["ARIDClass","XIDClass","JSONComponent","deserializeSignatureShare","parallelFetch","SignFinalizeContent","serializeSignatureShare","Envelope","serializeSignature","aggregateSignatures","createSigningPackage","Signature","signingStateDir","path","fs","parseAridUr","compareXidBytes","deserializeSigningCommitments","deserializePublicKeyPackage","identifierFromU16","resolveRegistryPath","Registry","signingKeyFromVerifying","parallelSend","putWithIndicator"],"sources":["../src/cmd/sign/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign coordinator round 2 command.\n *\n * Port of cmd/sign/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n XID as XIDClass,\n ARID as ARIDClass,\n Signature,\n type PrivateKeys,\n JSON as JSONComponent,\n} from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { parallelFetch, parallelSend, type CollectionResult } from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr, signingKeyFromVerifying } from \"../../dkg/common.js\";\nimport { signingStateDir, SignFinalizeContent } from \"../common.js\";\nimport { putWithIndicator } from \"../../busy.js\";\nimport {\n aggregateSignatures,\n createSigningPackage,\n deserializeSigningCommitments,\n deserializeSignatureShare,\n deserializePublicKeyPackage,\n identifierFromU16,\n serializeSignature,\n serializeSignatureShare,\n type SerializedPublicKeyPackage,\n type SerializedSigningCommitments,\n type FrostIdentifier,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type FrostPublicKeyPackage,\n} from \"../../../frost/index.js\";\n\n/**\n * Options for the sign round2 command.\n */\nexport interface SignRound2Options {\n registryPath?: string;\n groupId?: string;\n sessionId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n previewFinalize?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Result of the sign round2 command.\n */\nexport interface SignRound2Result {\n signature: string;\n signedEnvelope: string;\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n}\n\n/**\n * Data extracted from a successful signature share response.\n *\n * Port of `struct SignRound2ResponseData` from cmd/sign/coordinator/round2.rs.\n */\ninterface SignRound2ResponseData {\n signatureShare: Ed25519SignatureShare;\n finalizeArid: ARID;\n}\n\n/**\n * State loaded from start.json.\n *\n * Port of `struct StartState` from cmd/sign/coordinator/round2.rs.\n */\ninterface StartState {\n groupId: ARID;\n minSigners: number;\n participants: XID[];\n targetUr: string;\n}\n\n/**\n * Individual participant's commitment data.\n *\n * Port of `struct ParticipantCommitment` from cmd/sign/coordinator/round2.rs.\n */\ninterface ParticipantCommitment {\n commitments: Ed25519SigningCommitments;\n shareArid: ARID;\n}\n\n/**\n * State loaded from commitments.json.\n *\n * Port of `struct CommitmentsState` from cmd/sign/coordinator/round2.rs.\n */\ninterface CommitmentsState {\n commitments: Map<string, ParticipantCommitment>; // XID UR string -> commitment\n}\n\n/**\n * Validate envelope and extract signature share data (for parallel fetch).\n *\n * Port of `validate_and_extract_share_response()` from cmd/sign/coordinator/round2.rs.\n */\nfunction validateAndExtractShareResponse(\n envelope: Envelope,\n _coordinatorKeys: PrivateKeys,\n expectedSender: XID,\n expectedSessionId: ARID,\n): SignRound2ResponseData | { rejected: string } {\n // In the full implementation, we would decrypt the sealed response here\n // For now, we extract the data from the envelope directly\n\n try {\n // Check the response type\n envelope.checkSubjectUnit();\n envelope.checkType(\"signRound2Response\");\n\n // Extract session ID using objectsForPredicate and then extract subjects\n const sessionObjects = envelope.objectsForPredicate(\"session\");\n if (sessionObjects.length === 0) {\n return { rejected: \"Missing session in response\" };\n }\n const responseSession = ARIDClass.fromTaggedCbor(sessionObjects[0].subject().tryLeaf());\n if (responseSession.urString() !== expectedSessionId.urString()) {\n return {\n rejected: `Response session ${responseSession.urString()} does not match expected ${expectedSessionId.urString()}`,\n };\n }\n\n // Extract participant XID (sender check)\n const participantObjects = envelope.objectsForPredicate(\"participant\");\n if (participantObjects.length === 0) {\n return { rejected: \"Missing participant in response\" };\n }\n const participantXid = XIDClass.fromTaggedCbor(participantObjects[0].subject().tryLeaf());\n if (participantXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Unexpected response sender: ${participantXid.urString()} (expected ${expectedSender.urString()})`,\n };\n }\n\n // Extract signature share (JSON-serialized)\n const shareObjects = envelope.objectsForPredicate(\"signature_share\");\n if (shareObjects.length === 0) {\n return { rejected: \"Missing signature_share in response\" };\n }\n const signatureShareJson = JSONComponent.fromTaggedCbor(shareObjects[0].subject().tryLeaf());\n const signatureShareData = JSON.parse(signatureShareJson.toString()) as { share: string };\n const signatureShare = deserializeSignatureShare(signatureShareData.share);\n\n // Extract finalize ARID (response_arid)\n const responseAridObjects = envelope.objectsForPredicate(\"response_arid\");\n if (responseAridObjects.length === 0) {\n return { rejected: \"Missing response_arid in response\" };\n }\n const finalizeArid = ARIDClass.fromTaggedCbor(responseAridObjects[0].subject().tryLeaf());\n\n return { signatureShare, finalizeArid };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { rejected: `Failed to parse response: ${message}` };\n }\n}\n\n/**\n * Collect signature shares in parallel with progress display.\n *\n * Port of `collect_shares_parallel()` from cmd/sign/coordinator/round2.rs.\n */\nasync function collectSharesParallel(\n client: StorageClient,\n registry: Registry,\n commitmentsState: CommitmentsState,\n coordinator: XIDDocument,\n sessionId: ARID,\n timeoutSeconds?: number,\n): Promise<CollectionResult<SignRound2ResponseData>> {\n // Build requests from commitments\n const requests: [XID, ARID, string][] = [];\n\n for (const [xidUr, entry] of commitmentsState.commitments) {\n const xid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n requests.push([xid, entry.shareArid, name]);\n }\n\n const coordinatorKeys = coordinator.inceptionPrivateKeys();\n if (!coordinatorKeys) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n const session = sessionId;\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) => {\n return validateAndExtractShareResponse(envelope, coordinatorKeys, xid, session);\n },\n {\n timeoutSeconds,\n verbose: false,\n },\n );\n}\n\n/**\n * Build a finalize event containing all signature shares.\n *\n * Port of `build_finalize_event()` from cmd/sign/coordinator/round2.rs.\n */\nfunction buildFinalizeEvent(\n _sender: XIDDocument,\n sessionId: ARID,\n signatureSharesByXid: Map<string, Ed25519SignatureShare>,\n): SignFinalizeContent {\n // Build the content with session and all signature shares\n let content = SignFinalizeContent.new().addAssertion(\"session\", sessionId);\n\n for (const [xidUr, share] of signatureSharesByXid) {\n const xid = XIDClass.fromURString(xidUr);\n const shareHex = serializeSignatureShare(share);\n const shareJson = JSONComponent.fromString(JSON.stringify({ share: shareHex }));\n const entry = Envelope.new(xid).addAssertion(\"share\", shareJson);\n content = content.addAssertion(\"signature_share\", entry);\n }\n\n return content;\n}\n\n/**\n * Aggregate signature shares and verify the result.\n *\n * Port of signature aggregation logic from cmd/sign/coordinator/round2.rs.\n */\nfunction aggregateAndVerifySignature(\n signingCommitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n signatureSharesByIdentifier: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n targetDigest: Uint8Array,\n): { signature: Signature; signatureUr: string } {\n // Create signing package\n const signingPackage = createSigningPackage(signingCommitments, targetDigest);\n\n // Aggregate signature shares\n const aggregatedSignature = aggregateSignatures(\n signingPackage,\n signatureSharesByIdentifier,\n publicKeyPackage,\n );\n\n // Serialize the aggregated signature\n const signatureBytes = serializeSignature(aggregatedSignature);\n\n // Verify the signature is 64 bytes\n if (signatureBytes.length !== 64) {\n throw new Error(\"Aggregated signature is not 64 bytes\");\n }\n\n // Create bc-components Signature\n const signature = Signature.ed25519FromData(signatureBytes);\n const signatureUr = signature.urString();\n\n return { signature, signatureUr };\n}\n\n/**\n * Persist final signing state to disk.\n *\n * Port of `persist_final_state()` from cmd/sign/coordinator/round2.rs.\n */\nfunction persistSigningState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n signature: Signature,\n signatureSharesByXid: Map<string, Ed25519SignatureShare>,\n finalizeArids: Map<string, ARID>,\n): void {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n // Build signature shares JSON object\n const sharesJson: Record<string, unknown> = {};\n for (const [xidUr, share] of signatureSharesByXid) {\n sharesJson[xidUr] = { share: serializeSignatureShare(share) };\n }\n\n // Build finalize ARIDs JSON object\n const finalizeJson: Record<string, string> = {};\n for (const [xidUr, arid] of finalizeArids) {\n finalizeJson[xidUr] = arid.urString();\n }\n\n // Build root JSON object\n const root = {\n group: groupId.urString(),\n session: sessionId.urString(),\n signature: signature.urString(),\n signature_shares: sharesJson,\n finalize_arids: finalizeJson,\n };\n\n fs.writeFileSync(path.join(dir, \"final.json\"), JSON.stringify(root, null, 2));\n}\n\n/**\n * Load start state from disk.\n *\n * Port of `load_start_state()` from cmd/sign/coordinator/round2.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 // Find candidate paths\n const candidatePaths: [ARID, string][] = [];\n let groupDirs: [ARID, string][];\n\n if (groupHint) {\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() && entry.name.length === 64 && /^[0-9a-f]+$/i.test(entry.name)) {\n const groupId = ARIDClass.fromHex(entry.name);\n groupDirs.push([groupId, path.join(groupStateDir, entry.name)]);\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.urString() !== sessionId.urString()) {\n throw new Error(\n `start.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n if (groupInState.urString() !== groupId.urString()) {\n throw new Error(\n `start.json group ${groupInState.urString()} does not match directory group ${groupId.urString()}`,\n );\n }\n\n const minSigners = raw[\"min_signers\"];\n if (typeof minSigners !== \"number\") {\n throw new Error(\"Missing min_signers in start.json\");\n }\n\n const participantsVal = raw[\"participants\"] as Record<string, unknown> | undefined;\n if (!participantsVal || typeof participantsVal !== \"object\") {\n throw new Error(\"Missing participants in start.json\");\n }\n\n const participants: XID[] = [];\n for (const xidStr of Object.keys(participantsVal)) {\n participants.push(XIDClass.fromURString(xidStr));\n }\n // Sort by XID byte order — mirrors Rust `XID::cmp` (raw 32-byte\n // lex compare). The earlier port used\n // `urString().localeCompare(...)`, which diverges for bytes ≥ 0x80.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetUr = getStr(\"target\");\n\n return { groupId, minSigners, participants, targetUr };\n}\n\n/**\n * Load commitments state from disk.\n *\n * Port of `load_commitments_state()` from cmd/sign/coordinator/round2.rs.\n */\nfunction loadCommitmentsState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n): CommitmentsState {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n const statePath = path.join(dir, \"commitments.json\");\n\n if (!fs.existsSync(statePath)) {\n throw new Error(\n `Commitments not found at ${statePath}. Run \\`frost sign coordinator collect\\` first`,\n );\n }\n\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 commitments.json`);\n }\n return value;\n };\n\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `commitments.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n\n const commitmentsVal = raw[\"commitments\"] as Record<string, unknown> | undefined;\n if (!commitmentsVal || typeof commitmentsVal !== \"object\") {\n throw new Error(\"Missing commitments map in commitments.json\");\n }\n\n const commitments = new Map<string, ParticipantCommitment>();\n\n for (const [xidStr, value] of Object.entries(commitmentsVal)) {\n const obj = value as Record<string, unknown>;\n const commitValue = obj[\"commitments\"] as SerializedSigningCommitments | undefined;\n if (!commitValue) {\n throw new Error(\"Missing commitments value in commitments.json\");\n }\n const commitmentsDeserialized = deserializeSigningCommitments(commitValue);\n\n const shareAridRaw = obj[\"share_arid\"];\n if (typeof shareAridRaw !== \"string\") {\n throw new Error(\"Missing share_arid in commitments.json\");\n }\n const shareArid = parseAridUr(shareAridRaw);\n\n commitments.set(xidStr, {\n commitments: commitmentsDeserialized,\n shareArid,\n });\n }\n\n return { commitments };\n}\n\n/**\n * Load public key package from collected_finalize.json.\n *\n * Port of `load_public_key_package()` from cmd/sign/coordinator/round2.rs.\n */\nfunction loadPublicKeyPackage(registryPath: string, groupId: ARID): FrostPublicKeyPackage {\n const base = path.dirname(registryPath);\n const pkgPath = path.join(base, \"group-state\", groupId.hex(), \"collected_finalize.json\");\n\n if (!fs.existsSync(pkgPath)) {\n throw new Error(\n `collected_finalize.json not found at ${pkgPath}. Run \\`frost dkg coordinator finalize collect\\` first`,\n );\n }\n\n const raw = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const firstEntry = Object.values(raw)[0] as Record<string, unknown> | undefined;\n\n if (!firstEntry) {\n throw new Error(\"collected_finalize.json is empty\");\n }\n\n const publicKeyValue = firstEntry[\"public_key_package\"] as SerializedPublicKeyPackage | undefined;\n if (!publicKeyValue) {\n throw new Error(\"public_key_package missing in collected_finalize.json\");\n }\n\n return deserializePublicKeyPackage(publicKeyValue);\n}\n\n/**\n * Build a map from XID to FROST identifier.\n *\n * Port of `xid_identifier_map()` from cmd/sign/coordinator/round2.rs.\n */\nfunction xidIdentifierMap(participants: XID[]): Map<string, FrostIdentifier> {\n const map = new Map<string, FrostIdentifier>();\n for (let i = 0; i < participants.length; i++) {\n const identifier = identifierFromU16(i + 1);\n map.set(participants[i].urString(), identifier);\n }\n return map;\n}\n\n/**\n * Build signing commitments with identifiers.\n *\n * Port of `commitments_with_identifiers()` from cmd/sign/coordinator/round2.rs.\n */\nfunction commitmentsWithIdentifiers(\n commitments: Map<string, ParticipantCommitment>,\n xidToIdentifier: Map<string, FrostIdentifier>,\n): Map<FrostIdentifier, Ed25519SigningCommitments> {\n const mapped = new Map<FrostIdentifier, Ed25519SigningCommitments>();\n for (const [xidUr, entry] of commitments) {\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(`Unknown participant ${xidUr}`);\n }\n mapped.set(identifier, entry.commitments);\n }\n return mapped;\n}\n\n/**\n * Execute the sign coordinator round 2 command.\n *\n * Collects signature shares, aggregates the signature, and posts finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/coordinator/round2.rs.\n */\nexport async function round2(\n client: StorageClient,\n options: SignRound2Options,\n cwd: string,\n): Promise<SignRound2Result> {\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 is required\");\n }\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId ? parseAridUr(options.groupId) : undefined;\n\n // Load start state (finds group automatically if not specified)\n const startState = loadStartState(registryPath, sessionId, groupHint);\n const groupId = startState.groupId;\n\n const groupRecord = registry.group(groupId);\n if (!groupRecord) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Verify coordinator ownership\n if (groupRecord.coordinator().xid().urString() !== owner.xid().urString()) {\n throw new Error(\n `Only the coordinator can finalize signing. Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${owner.xid().urString()}`,\n );\n }\n\n // Load commitments state\n const commitmentsState = loadCommitmentsState(registryPath, groupId, sessionId);\n\n // Build XID to identifier map\n const xidToIdentifier = xidIdentifierMap(startState.participants);\n\n // Collect signature shares\n let signatureSharesByIdentifier: Map<FrostIdentifier, Ed25519SignatureShare>;\n let signatureSharesByXid: Map<string, Ed25519SignatureShare>;\n let finalizeArids: Map<string, ARID>;\n\n if (options.parallel === true) {\n // Parallel collection path\n const collection = await collectSharesParallel(\n client,\n registry,\n commitmentsState,\n owner.xidDocument(),\n sessionId,\n options.timeoutSeconds,\n );\n\n if (!collection.allSucceeded()) {\n // Report failures\n if (collection.rejections.length > 0) {\n console.error(\"\\nRejections:\");\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(\"\\nErrors:\");\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(\"\\nTimeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n throw new Error(\n `Signature share collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n }\n\n // Convert collection to maps\n signatureSharesByIdentifier = new Map();\n signatureSharesByXid = new Map();\n finalizeArids = new Map();\n\n for (const [xid, data] of collection.successes) {\n const xidUr = xid.urString();\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(\"Identifier mapping missing for participant\");\n }\n signatureSharesByIdentifier.set(identifier, data.signatureShare);\n signatureSharesByXid.set(xidUr, data.signatureShare);\n finalizeArids.set(xidUr, data.finalizeArid);\n }\n } else {\n // Sequential collection path\n if (options.verbose === true) {\n console.error(\n `Collecting signature shares for session ${sessionId.urString()} from ${commitmentsState.commitments.size} participants...`,\n );\n }\n\n signatureSharesByIdentifier = new Map();\n signatureSharesByXid = new Map();\n finalizeArids = new Map();\n\n for (const [xidUr, entry] of commitmentsState.commitments) {\n const xid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xid.urString();\n\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(\"Identifier mapping missing for participant\");\n }\n\n // Fetch the response\n const envelope = await client.get(entry.shareArid, options.timeoutSeconds);\n if (!envelope) {\n throw new Error(`Signature share response not found for ${participantName}`);\n }\n\n const coordinatorKeys = owner.xidDocument().inceptionPrivateKeys();\n if (!coordinatorKeys) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n const result = validateAndExtractShareResponse(envelope, coordinatorKeys, xid, sessionId);\n if (\"rejected\" in result) {\n throw new Error(`Participant rejected signRound2: ${result.rejected}`);\n }\n\n signatureSharesByIdentifier.set(identifier, result.signatureShare);\n signatureSharesByXid.set(xidUr, result.signatureShare);\n finalizeArids.set(xidUr, result.finalizeArid);\n }\n }\n\n // Verify we have enough shares\n if (signatureSharesByIdentifier.size < startState.minSigners) {\n throw new Error(\n `Only collected ${signatureSharesByIdentifier.size} signature shares, need at least ${startState.minSigners}`,\n );\n }\n\n // Build signing commitments with identifiers\n const signingCommitments = commitmentsWithIdentifiers(\n commitmentsState.commitments,\n xidToIdentifier,\n );\n\n // Get target digest\n const targetEnvelope = Envelope.fromURString(startState.targetUr);\n const targetDigest = targetEnvelope.subject().digest().data();\n\n // Load public key package\n const publicKeyPackage = loadPublicKeyPackage(registryPath, groupId);\n const verifyingKey = signingKeyFromVerifying(publicKeyPackage.verifyingKey);\n\n // Aggregate and verify signature\n const { signature, signatureUr } = aggregateAndVerifySignature(\n signingCommitments,\n signatureSharesByIdentifier,\n publicKeyPackage,\n targetDigest,\n );\n\n // Verify signature against target digest\n // @ts-expect-error - verifyingKey type mismatch\n if (verifyingKey.verify(signature, targetDigest) !== true) {\n throw new Error(\"Aggregated signature failed verification against target digest\");\n }\n\n // Attach signature to target and verify\n\n const signedEnvelope = Envelope.fromURString(startState.targetUr).addAssertion(\n \"signed\",\n signature,\n );\n const signedEnvelopeUr = signedEnvelope.urString();\n\n // Persist final state\n persistSigningState(\n registryPath,\n groupId,\n sessionId,\n signature,\n signatureSharesByXid,\n finalizeArids,\n );\n\n if (options.verbose === true) {\n console.error();\n console.error(\n `Aggregated signature for session ${sessionId.urString()} and prepared ${finalizeArids.size} finalize packages.`,\n );\n console.error(\"Signature verified against target and group key.\");\n }\n\n // Dispatch finalize events to participants\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (!signerKeys) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n if (options.verbose === true) {\n console.error(`Dispatching finalize packages to ${finalizeArids.size} participants...`);\n } else {\n // Blank line to separate get phase from put phase\n console.error();\n }\n\n // Build finalize messages\n const messages: [XID, ARID, Envelope, string][] = [];\n let previewPrinted = false;\n\n for (const [xidUr, finalizeArid] of finalizeArids) {\n const participantXid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(participantXid);\n const participantName = participant?.petName() ?? xidUr;\n\n const recipientDoc =\n xidUr === owner.xid().urString() ? owner.xidDocument() : participant?.xidDocument();\n\n if (!recipientDoc) {\n throw new Error(`Participant ${xidUr} not found in registry`);\n }\n\n const event = buildFinalizeEvent(owner.xidDocument(), sessionId, signatureSharesByXid);\n\n if (options.previewFinalize === true && !previewPrinted) {\n // Preview as unsigned, unencrypted envelope\n console.log(`# signFinalize preview for ${participantXid.urString()}`);\n console.log(event.envelope().format());\n previewPrinted = true;\n }\n\n // For now, use the plain envelope (GSTP sealing would be applied in full implementation)\n const sealed = event.envelope();\n\n messages.push([participantXid, finalizeArid, sealed, participantName]);\n }\n\n // Dispatch messages\n if (options.parallel === true) {\n // Parallel send\n console.error();\n const results = await parallelSend(client, messages, options.verbose === true);\n\n // Check for errors\n const errors: string[] = [];\n for (const [xid, result] of results) {\n if (result !== null) {\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n errors.push(`${name}: ${result.message}`);\n }\n }\n if (errors.length > 0) {\n throw new Error(`Failed to send finalize packages: ${errors.join(\"; \")}`);\n }\n } else {\n // Sequential send\n for (const [_xid, finalizeArid, sealed, participantName] of messages) {\n await putWithIndicator(\n client,\n finalizeArid,\n sealed,\n participantName,\n options.verbose ?? false,\n );\n }\n }\n\n // Print final signature and signed envelope UR\n console.log(signatureUr);\n console.log(signedEnvelopeUr);\n\n return {\n signature: signatureUr,\n signedEnvelope: signedEnvelopeUr,\n accepted: signatureSharesByIdentifier.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"round2-BHQKVJFo.cjs","names":["ARIDClass","XIDClass","JSONComponent","deserializeSignatureShare","parallelFetch","SignFinalizeContent","serializeSignatureShare","Envelope","serializeSignature","aggregateSignatures","createSigningPackage","Signature","signingStateDir","path","fs","parseAridUr","compareXidBytes","deserializeSigningCommitments","deserializePublicKeyPackage","identifierFromU16","resolveRegistryPath","Registry","signingKeyFromVerifying","parallelSend","putWithIndicator"],"sources":["../src/cmd/sign/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign coordinator round 2 command.\n *\n * Port of cmd/sign/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n XID as XIDClass,\n ARID as ARIDClass,\n Signature,\n type PrivateKeys,\n JSON as JSONComponent,\n} from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { parallelFetch, parallelSend, type CollectionResult } from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr, signingKeyFromVerifying } from \"../../dkg/common.js\";\nimport { signingStateDir, SignFinalizeContent } from \"../common.js\";\nimport { putWithIndicator } from \"../../busy.js\";\nimport {\n aggregateSignatures,\n createSigningPackage,\n deserializeSigningCommitments,\n deserializeSignatureShare,\n deserializePublicKeyPackage,\n identifierFromU16,\n serializeSignature,\n serializeSignatureShare,\n type SerializedPublicKeyPackage,\n type SerializedSigningCommitments,\n type FrostIdentifier,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type FrostPublicKeyPackage,\n} from \"../../../frost/index.js\";\n\n/**\n * Options for the sign round2 command.\n */\nexport interface SignRound2Options {\n registryPath?: string;\n groupId?: string;\n sessionId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n previewFinalize?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Result of the sign round2 command.\n */\nexport interface SignRound2Result {\n signature: string;\n signedEnvelope: string;\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n}\n\n/**\n * Data extracted from a successful signature share response.\n *\n * Port of `struct SignRound2ResponseData` from cmd/sign/coordinator/round2.rs.\n */\ninterface SignRound2ResponseData {\n signatureShare: Ed25519SignatureShare;\n finalizeArid: ARID;\n}\n\n/**\n * State loaded from start.json.\n *\n * Port of `struct StartState` from cmd/sign/coordinator/round2.rs.\n */\ninterface StartState {\n groupId: ARID;\n minSigners: number;\n participants: XID[];\n targetUr: string;\n}\n\n/**\n * Individual participant's commitment data.\n *\n * Port of `struct ParticipantCommitment` from cmd/sign/coordinator/round2.rs.\n */\ninterface ParticipantCommitment {\n commitments: Ed25519SigningCommitments;\n shareArid: ARID;\n}\n\n/**\n * State loaded from commitments.json.\n *\n * Port of `struct CommitmentsState` from cmd/sign/coordinator/round2.rs.\n */\ninterface CommitmentsState {\n commitments: Map<string, ParticipantCommitment>; // XID UR string -> commitment\n}\n\n/**\n * Validate envelope and extract signature share data (for parallel fetch).\n *\n * Port of `validate_and_extract_share_response()` from cmd/sign/coordinator/round2.rs.\n */\nfunction validateAndExtractShareResponse(\n envelope: Envelope,\n _coordinatorKeys: PrivateKeys,\n expectedSender: XID,\n expectedSessionId: ARID,\n): SignRound2ResponseData | { rejected: string } {\n // In the full implementation, we would decrypt the sealed response here\n // For now, we extract the data from the envelope directly\n\n try {\n // Check the response type\n envelope.checkSubjectUnit();\n envelope.checkType(\"signRound2Response\");\n\n // Extract session ID using objectsForPredicate and then extract subjects\n const sessionObjects = envelope.objectsForPredicate(\"session\");\n if (sessionObjects.length === 0) {\n return { rejected: \"Missing session in response\" };\n }\n const responseSession = ARIDClass.fromTaggedCbor(sessionObjects[0].subject().tryLeaf());\n if (responseSession.urString() !== expectedSessionId.urString()) {\n return {\n rejected: `Response session ${responseSession.urString()} does not match expected ${expectedSessionId.urString()}`,\n };\n }\n\n // Extract participant XID (sender check)\n const participantObjects = envelope.objectsForPredicate(\"participant\");\n if (participantObjects.length === 0) {\n return { rejected: \"Missing participant in response\" };\n }\n const participantXid = XIDClass.fromTaggedCbor(participantObjects[0].subject().tryLeaf());\n if (participantXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Unexpected response sender: ${participantXid.urString()} (expected ${expectedSender.urString()})`,\n };\n }\n\n // Extract signature share (JSON-serialized)\n const shareObjects = envelope.objectsForPredicate(\"signature_share\");\n if (shareObjects.length === 0) {\n return { rejected: \"Missing signature_share in response\" };\n }\n const signatureShareJson = JSONComponent.fromTaggedCbor(shareObjects[0].subject().tryLeaf());\n const signatureShareData = JSON.parse(signatureShareJson.toString()) as { share: string };\n const signatureShare = deserializeSignatureShare(signatureShareData.share);\n\n // Extract finalize ARID (response_arid)\n const responseAridObjects = envelope.objectsForPredicate(\"response_arid\");\n if (responseAridObjects.length === 0) {\n return { rejected: \"Missing response_arid in response\" };\n }\n const finalizeArid = ARIDClass.fromTaggedCbor(responseAridObjects[0].subject().tryLeaf());\n\n return { signatureShare, finalizeArid };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { rejected: `Failed to parse response: ${message}` };\n }\n}\n\n/**\n * Collect signature shares in parallel with progress display.\n *\n * Port of `collect_shares_parallel()` from cmd/sign/coordinator/round2.rs.\n */\nasync function collectSharesParallel(\n client: StorageClient,\n registry: Registry,\n commitmentsState: CommitmentsState,\n coordinator: XIDDocument,\n sessionId: ARID,\n timeoutSeconds?: number,\n): Promise<CollectionResult<SignRound2ResponseData>> {\n // Build requests from commitments\n const requests: [XID, ARID, string][] = [];\n\n for (const [xidUr, entry] of commitmentsState.commitments) {\n const xid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n requests.push([xid, entry.shareArid, name]);\n }\n\n const coordinatorKeys = coordinator.inceptionPrivateKeys();\n if (!coordinatorKeys) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n const session = sessionId;\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) => {\n return validateAndExtractShareResponse(envelope, coordinatorKeys, xid, session);\n },\n {\n timeoutSeconds,\n verbose: false,\n },\n );\n}\n\n/**\n * Build a finalize event containing all signature shares.\n *\n * Port of `build_finalize_event()` from cmd/sign/coordinator/round2.rs.\n */\nfunction buildFinalizeEvent(\n _sender: XIDDocument,\n sessionId: ARID,\n signatureSharesByXid: Map<string, Ed25519SignatureShare>,\n): SignFinalizeContent {\n // Build the content with session and all signature shares\n let content = SignFinalizeContent.new().addAssertion(\"session\", sessionId);\n\n for (const [xidUr, share] of signatureSharesByXid) {\n const xid = XIDClass.fromURString(xidUr);\n const shareHex = serializeSignatureShare(share);\n const shareJson = JSONComponent.fromString(JSON.stringify({ share: shareHex }));\n const entry = Envelope.new(xid).addAssertion(\"share\", shareJson);\n content = content.addAssertion(\"signature_share\", entry);\n }\n\n return content;\n}\n\n/**\n * Aggregate signature shares and verify the result.\n *\n * Port of signature aggregation logic from cmd/sign/coordinator/round2.rs.\n */\nfunction aggregateAndVerifySignature(\n signingCommitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n signatureSharesByIdentifier: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n targetDigest: Uint8Array,\n): { signature: Signature; signatureUr: string } {\n // Create signing package\n const signingPackage = createSigningPackage(signingCommitments, targetDigest);\n\n // Aggregate signature shares\n const aggregatedSignature = aggregateSignatures(\n signingPackage,\n signatureSharesByIdentifier,\n publicKeyPackage,\n );\n\n // Serialize the aggregated signature\n const signatureBytes = serializeSignature(aggregatedSignature);\n\n // Verify the signature is 64 bytes\n if (signatureBytes.length !== 64) {\n throw new Error(\"Aggregated signature is not 64 bytes\");\n }\n\n // Create bc-components Signature\n const signature = Signature.ed25519FromData(signatureBytes);\n const signatureUr = signature.urString();\n\n return { signature, signatureUr };\n}\n\n/**\n * Persist final signing state to disk.\n *\n * Port of `persist_final_state()` from cmd/sign/coordinator/round2.rs.\n */\nfunction persistSigningState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n signature: Signature,\n signatureSharesByXid: Map<string, Ed25519SignatureShare>,\n finalizeArids: Map<string, ARID>,\n): void {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n // Build signature shares JSON object\n const sharesJson: Record<string, unknown> = {};\n for (const [xidUr, share] of signatureSharesByXid) {\n sharesJson[xidUr] = { share: serializeSignatureShare(share) };\n }\n\n // Build finalize ARIDs JSON object\n const finalizeJson: Record<string, string> = {};\n for (const [xidUr, arid] of finalizeArids) {\n finalizeJson[xidUr] = arid.urString();\n }\n\n // Build root JSON object\n const root = {\n group: groupId.urString(),\n session: sessionId.urString(),\n signature: signature.urString(),\n signature_shares: sharesJson,\n finalize_arids: finalizeJson,\n };\n\n fs.writeFileSync(path.join(dir, \"final.json\"), JSON.stringify(root, null, 2));\n}\n\n/**\n * Load start state from disk.\n *\n * Port of `load_start_state()` from cmd/sign/coordinator/round2.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 // Find candidate paths\n const candidatePaths: [ARID, string][] = [];\n let groupDirs: [ARID, string][];\n\n if (groupHint) {\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() && entry.name.length === 64 && /^[0-9a-f]+$/i.test(entry.name)) {\n const groupId = ARIDClass.fromHex(entry.name);\n groupDirs.push([groupId, path.join(groupStateDir, entry.name)]);\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.urString() !== sessionId.urString()) {\n throw new Error(\n `start.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n if (groupInState.urString() !== groupId.urString()) {\n throw new Error(\n `start.json group ${groupInState.urString()} does not match directory group ${groupId.urString()}`,\n );\n }\n\n const minSigners = raw[\"min_signers\"];\n if (typeof minSigners !== \"number\") {\n throw new Error(\"Missing min_signers in start.json\");\n }\n\n const participantsVal = raw[\"participants\"] as Record<string, unknown> | undefined;\n if (!participantsVal || typeof participantsVal !== \"object\") {\n throw new Error(\"Missing participants in start.json\");\n }\n\n const participants: XID[] = [];\n for (const xidStr of Object.keys(participantsVal)) {\n participants.push(XIDClass.fromURString(xidStr));\n }\n // Sort by XID byte order — mirrors Rust `XID::cmp` (raw 32-byte\n // lex compare). The earlier port used\n // `urString().localeCompare(...)`, which diverges for bytes ≥ 0x80.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetUr = getStr(\"target\");\n\n return { groupId, minSigners, participants, targetUr };\n}\n\n/**\n * Load commitments state from disk.\n *\n * Port of `load_commitments_state()` from cmd/sign/coordinator/round2.rs.\n */\nfunction loadCommitmentsState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n): CommitmentsState {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n const statePath = path.join(dir, \"commitments.json\");\n\n if (!fs.existsSync(statePath)) {\n throw new Error(\n `Commitments not found at ${statePath}. Run \\`frost sign coordinator collect\\` first`,\n );\n }\n\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 commitments.json`);\n }\n return value;\n };\n\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `commitments.json session ${sessionInState.urString()} does not match requested session ${sessionId.urString()}`,\n );\n }\n\n const commitmentsVal = raw[\"commitments\"] as Record<string, unknown> | undefined;\n if (!commitmentsVal || typeof commitmentsVal !== \"object\") {\n throw new Error(\"Missing commitments map in commitments.json\");\n }\n\n const commitments = new Map<string, ParticipantCommitment>();\n\n for (const [xidStr, value] of Object.entries(commitmentsVal)) {\n const obj = value as Record<string, unknown>;\n const commitValue = obj[\"commitments\"] as SerializedSigningCommitments | undefined;\n if (!commitValue) {\n throw new Error(\"Missing commitments value in commitments.json\");\n }\n const commitmentsDeserialized = deserializeSigningCommitments(commitValue);\n\n const shareAridRaw = obj[\"share_arid\"];\n if (typeof shareAridRaw !== \"string\") {\n throw new Error(\"Missing share_arid in commitments.json\");\n }\n const shareArid = parseAridUr(shareAridRaw);\n\n commitments.set(xidStr, {\n commitments: commitmentsDeserialized,\n shareArid,\n });\n }\n\n return { commitments };\n}\n\n/**\n * Load public key package from collected_finalize.json.\n *\n * Port of `load_public_key_package()` from cmd/sign/coordinator/round2.rs.\n */\nfunction loadPublicKeyPackage(registryPath: string, groupId: ARID): FrostPublicKeyPackage {\n const base = path.dirname(registryPath);\n const pkgPath = path.join(base, \"group-state\", groupId.hex(), \"collected_finalize.json\");\n\n if (!fs.existsSync(pkgPath)) {\n throw new Error(\n `collected_finalize.json not found at ${pkgPath}. Run \\`frost dkg coordinator finalize collect\\` first`,\n );\n }\n\n const raw = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const firstEntry = Object.values(raw)[0] as Record<string, unknown> | undefined;\n\n if (!firstEntry) {\n throw new Error(\"collected_finalize.json is empty\");\n }\n\n const publicKeyValue = firstEntry[\"public_key_package\"] as SerializedPublicKeyPackage | undefined;\n if (!publicKeyValue) {\n throw new Error(\"public_key_package missing in collected_finalize.json\");\n }\n\n return deserializePublicKeyPackage(publicKeyValue);\n}\n\n/**\n * Build a map from XID to FROST identifier.\n *\n * Port of `xid_identifier_map()` from cmd/sign/coordinator/round2.rs.\n */\nfunction xidIdentifierMap(participants: XID[]): Map<string, FrostIdentifier> {\n const map = new Map<string, FrostIdentifier>();\n for (let i = 0; i < participants.length; i++) {\n const identifier = identifierFromU16(i + 1);\n map.set(participants[i].urString(), identifier);\n }\n return map;\n}\n\n/**\n * Build signing commitments with identifiers.\n *\n * Port of `commitments_with_identifiers()` from cmd/sign/coordinator/round2.rs.\n */\nfunction commitmentsWithIdentifiers(\n commitments: Map<string, ParticipantCommitment>,\n xidToIdentifier: Map<string, FrostIdentifier>,\n): Map<FrostIdentifier, Ed25519SigningCommitments> {\n const mapped = new Map<FrostIdentifier, Ed25519SigningCommitments>();\n for (const [xidUr, entry] of commitments) {\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(`Unknown participant ${xidUr}`);\n }\n mapped.set(identifier, entry.commitments);\n }\n return mapped;\n}\n\n/**\n * Execute the sign coordinator round 2 command.\n *\n * Collects signature shares, aggregates the signature, and posts finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/coordinator/round2.rs.\n */\nexport async function round2(\n client: StorageClient,\n options: SignRound2Options,\n cwd: string,\n): Promise<SignRound2Result> {\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 is required\");\n }\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId ? parseAridUr(options.groupId) : undefined;\n\n // Load start state (finds group automatically if not specified)\n const startState = loadStartState(registryPath, sessionId, groupHint);\n const groupId = startState.groupId;\n\n const groupRecord = registry.group(groupId);\n if (!groupRecord) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Verify coordinator ownership\n if (groupRecord.coordinator().xid().urString() !== owner.xid().urString()) {\n throw new Error(\n `Only the coordinator can finalize signing. Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${owner.xid().urString()}`,\n );\n }\n\n // Load commitments state\n const commitmentsState = loadCommitmentsState(registryPath, groupId, sessionId);\n\n // Build XID to identifier map\n const xidToIdentifier = xidIdentifierMap(startState.participants);\n\n // Collect signature shares\n let signatureSharesByIdentifier: Map<FrostIdentifier, Ed25519SignatureShare>;\n let signatureSharesByXid: Map<string, Ed25519SignatureShare>;\n let finalizeArids: Map<string, ARID>;\n\n if (options.parallel === true) {\n // Parallel collection path\n const collection = await collectSharesParallel(\n client,\n registry,\n commitmentsState,\n owner.xidDocument(),\n sessionId,\n options.timeoutSeconds,\n );\n\n if (!collection.allSucceeded()) {\n // Report failures\n if (collection.rejections.length > 0) {\n console.error(\"\\nRejections:\");\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(\"\\nErrors:\");\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(\"\\nTimeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n throw new Error(\n `Signature share collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n }\n\n // Convert collection to maps\n signatureSharesByIdentifier = new Map();\n signatureSharesByXid = new Map();\n finalizeArids = new Map();\n\n for (const [xid, data] of collection.successes) {\n const xidUr = xid.urString();\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(\"Identifier mapping missing for participant\");\n }\n signatureSharesByIdentifier.set(identifier, data.signatureShare);\n signatureSharesByXid.set(xidUr, data.signatureShare);\n finalizeArids.set(xidUr, data.finalizeArid);\n }\n } else {\n // Sequential collection path\n if (options.verbose === true) {\n console.error(\n `Collecting signature shares for session ${sessionId.urString()} from ${commitmentsState.commitments.size} participants...`,\n );\n }\n\n signatureSharesByIdentifier = new Map();\n signatureSharesByXid = new Map();\n finalizeArids = new Map();\n\n for (const [xidUr, entry] of commitmentsState.commitments) {\n const xid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(xid);\n const participantName = participant?.petName() ?? xid.urString();\n\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(\"Identifier mapping missing for participant\");\n }\n\n // Fetch the response\n const envelope = await client.get(entry.shareArid, options.timeoutSeconds);\n if (!envelope) {\n throw new Error(`Signature share response not found for ${participantName}`);\n }\n\n const coordinatorKeys = owner.xidDocument().inceptionPrivateKeys();\n if (!coordinatorKeys) {\n throw new Error(\"Coordinator XID document has no inception private keys\");\n }\n\n const result = validateAndExtractShareResponse(envelope, coordinatorKeys, xid, sessionId);\n if (\"rejected\" in result) {\n throw new Error(`Participant rejected signRound2: ${result.rejected}`);\n }\n\n signatureSharesByIdentifier.set(identifier, result.signatureShare);\n signatureSharesByXid.set(xidUr, result.signatureShare);\n finalizeArids.set(xidUr, result.finalizeArid);\n }\n }\n\n // Verify we have enough shares\n if (signatureSharesByIdentifier.size < startState.minSigners) {\n throw new Error(\n `Only collected ${signatureSharesByIdentifier.size} signature shares, need at least ${startState.minSigners}`,\n );\n }\n\n // Build signing commitments with identifiers\n const signingCommitments = commitmentsWithIdentifiers(\n commitmentsState.commitments,\n xidToIdentifier,\n );\n\n // Get target digest\n const targetEnvelope = Envelope.fromURString(startState.targetUr);\n const targetDigest = targetEnvelope.subject().digest().data();\n\n // Load public key package\n const publicKeyPackage = loadPublicKeyPackage(registryPath, groupId);\n const verifyingKey = signingKeyFromVerifying(publicKeyPackage.verifyingKey);\n\n // Aggregate and verify signature\n const { signature, signatureUr } = aggregateAndVerifySignature(\n signingCommitments,\n signatureSharesByIdentifier,\n publicKeyPackage,\n targetDigest,\n );\n\n // Verify signature against target digest\n // @ts-expect-error - verifyingKey type mismatch\n if (verifyingKey.verify(signature, targetDigest) !== true) {\n throw new Error(\"Aggregated signature failed verification against target digest\");\n }\n\n // Attach signature to target and verify\n\n const signedEnvelope = Envelope.fromURString(startState.targetUr).addAssertion(\n \"signed\",\n signature,\n );\n const signedEnvelopeUr = signedEnvelope.urString();\n\n // Persist final state\n persistSigningState(\n registryPath,\n groupId,\n sessionId,\n signature,\n signatureSharesByXid,\n finalizeArids,\n );\n\n if (options.verbose === true) {\n console.error();\n console.error(\n `Aggregated signature for session ${sessionId.urString()} and prepared ${finalizeArids.size} finalize packages.`,\n );\n console.error(\"Signature verified against target and group key.\");\n }\n\n // Dispatch finalize events to participants\n const signerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (!signerKeys) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n if (options.verbose === true) {\n console.error(`Dispatching finalize packages to ${finalizeArids.size} participants...`);\n } else {\n // Blank line to separate get phase from put phase\n console.error();\n }\n\n // Build finalize messages\n const messages: [XID, ARID, Envelope, string][] = [];\n let previewPrinted = false;\n\n for (const [xidUr, finalizeArid] of finalizeArids) {\n const participantXid = XIDClass.fromURString(xidUr);\n const participant = registry.participant(participantXid);\n const participantName = participant?.petName() ?? xidUr;\n\n const recipientDoc =\n xidUr === owner.xid().urString() ? owner.xidDocument() : participant?.xidDocument();\n\n if (!recipientDoc) {\n throw new Error(`Participant ${xidUr} not found in registry`);\n }\n\n const event = buildFinalizeEvent(owner.xidDocument(), sessionId, signatureSharesByXid);\n\n if (options.previewFinalize === true && !previewPrinted) {\n // Preview as unsigned, unencrypted envelope\n console.log(`# signFinalize preview for ${participantXid.urString()}`);\n console.log(event.envelope().format());\n previewPrinted = true;\n }\n\n // For now, use the plain envelope (GSTP sealing would be applied in full implementation)\n const sealed = event.envelope();\n\n messages.push([participantXid, finalizeArid, sealed, participantName]);\n }\n\n // Dispatch messages\n if (options.parallel === true) {\n // Parallel send\n console.error();\n const results = await parallelSend(client, messages, options.verbose === true);\n\n // Check for errors\n const errors: string[] = [];\n for (const [xid, result] of results) {\n if (result !== null) {\n const participant = registry.participant(xid);\n const name = participant?.petName() ?? xid.urString();\n errors.push(`${name}: ${result.message}`);\n }\n }\n if (errors.length > 0) {\n throw new Error(`Failed to send finalize packages: ${errors.join(\"; \")}`);\n }\n } else {\n // Sequential send\n for (const [_xid, finalizeArid, sealed, participantName] of messages) {\n await putWithIndicator(\n client,\n finalizeArid,\n sealed,\n participantName,\n options.verbose ?? false,\n );\n }\n }\n\n // Print final signature and signed envelope UR\n console.log(signatureUr);\n console.log(signedEnvelopeUr);\n\n return {\n signature: signatureUr,\n signedEnvelope: signedEnvelopeUr,\n accepted: signatureSharesByIdentifier.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { n as __require, t as __exportAll } from "./chunk-
|
|
1
|
+
import { n as __require, t as __exportAll } from "./chunk-z9aeyW2b.mjs";
|
|
2
2
|
import { PendingRequests, Registry, resolveRegistryPath } from "./registry/index.mjs";
|
|
3
|
-
import { c as parseAridUr, n as isVerbose, t as groupStateDir } from "./common-
|
|
4
|
-
import { n as putWithIndicator, t as getWithIndicator } from "./busy-
|
|
5
|
-
import { f as parallelFetch, m as parallelSend, p as parallelFetchConfigWithTimeout } from "./parallel-
|
|
3
|
+
import { c as parseAridUr, n as isVerbose, t as groupStateDir } from "./common-Cf1UvJaP.mjs";
|
|
4
|
+
import { n as putWithIndicator, t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
|
|
5
|
+
import { f as parallelFetch, m as parallelSend, p as parallelFetchConfigWithTimeout } from "./parallel-PZiwHZT8.mjs";
|
|
6
6
|
import { ARID, XID } from "@bcts/components";
|
|
7
7
|
import { Envelope } from "@bcts/envelope";
|
|
8
8
|
import { SealedRequest, SealedResponse } from "@bcts/gstp";
|
|
@@ -447,4 +447,4 @@ async function round2(client, options, cwd) {
|
|
|
447
447
|
//#endregion
|
|
448
448
|
export { round2 as a, validateAndExtractRound2Response as c, persistRound2Packages as i, collectRound2Parallel as n, round2_exports as o, dispatchFinalizeRequestsParallel as r, updatePendingForFinalizeFromCollection as s, buildFinalizeRequestForParticipant as t };
|
|
449
449
|
|
|
450
|
-
//# sourceMappingURL=round2-
|
|
450
|
+
//# sourceMappingURL=round2-BfetYacV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round2-Bl2uK93U.mjs","names":[],"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-BfetYacV.mjs","names":[],"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,11 +1,11 @@
|
|
|
1
|
-
import { t as __exportAll } from "./chunk-
|
|
2
|
-
import { n as compareXidBytes } from "./proposed-participant-
|
|
1
|
+
import { t as __exportAll } from "./chunk-z9aeyW2b.mjs";
|
|
2
|
+
import { n as compareXidBytes } from "./proposed-participant-Detb823_.mjs";
|
|
3
3
|
import { Registry, resolveRegistryPath } from "./registry/index.mjs";
|
|
4
|
-
import { c as parseAridUr, h as signingKeyFromVerifying } from "./common-
|
|
5
|
-
import { n as putWithIndicator } from "./busy-
|
|
6
|
-
import { f as parallelFetch, m as parallelSend } from "./parallel-
|
|
4
|
+
import { c as parseAridUr, h as signingKeyFromVerifying } from "./common-Cf1UvJaP.mjs";
|
|
5
|
+
import { n as putWithIndicator } from "./busy-BlU8_pS2.mjs";
|
|
6
|
+
import { f as parallelFetch, m as parallelSend } from "./parallel-PZiwHZT8.mjs";
|
|
7
7
|
import { aggregateSignatures, createSigningPackage, deserializePublicKeyPackage, deserializeSignatureShare, deserializeSigningCommitments, identifierFromU16, serializeSignature, serializeSignatureShare } from "./frost/index.mjs";
|
|
8
|
-
import { n as signingStateDir, t as SignFinalizeContent } from "./common-
|
|
8
|
+
import { n as signingStateDir, t as SignFinalizeContent } from "./common-DNrD_-EI.mjs";
|
|
9
9
|
import { ARID, JSON as JSON$1, Signature, XID } from "@bcts/components";
|
|
10
10
|
import { Envelope } from "@bcts/envelope";
|
|
11
11
|
import * as fs from "node:fs";
|
|
@@ -394,4 +394,4 @@ async function round2(client, options, cwd) {
|
|
|
394
394
|
//#endregion
|
|
395
395
|
export { round2_exports as n, round2 as t };
|
|
396
396
|
|
|
397
|
-
//# sourceMappingURL=round2-
|
|
397
|
+
//# sourceMappingURL=round2-Cf5CJc_8.mjs.map
|