@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.0
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/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
- package/benchmark/psbt-2000-inputs.bench.ts +178 -0
- package/benchmark/signing.bench.ts +147 -0
- package/browser/address.d.ts +56 -9
- package/browser/address.d.ts.map +1 -0
- package/browser/bech32utils.d.ts +9 -1
- package/browser/bech32utils.d.ts.map +1 -0
- package/browser/bip66.d.ts +11 -6
- package/browser/bip66.d.ts.map +1 -0
- package/browser/block.d.ts +117 -11
- package/browser/block.d.ts.map +1 -0
- package/browser/branded.d.ts +20 -0
- package/browser/branded.d.ts.map +1 -0
- package/browser/crypto/crypto.d.ts +1 -0
- package/browser/crypto/crypto.d.ts.map +1 -0
- package/browser/crypto.d.ts +46 -7
- package/browser/crypto.d.ts.map +1 -0
- package/browser/ecc/context.d.ts +129 -0
- package/browser/ecc/context.d.ts.map +1 -0
- package/browser/ecc/index.d.ts +11 -0
- package/browser/ecc/index.d.ts.map +1 -0
- package/browser/ecc/types.d.ts +128 -0
- package/browser/ecc/types.d.ts.map +1 -0
- package/browser/ecpair.d.ts +99 -0
- package/browser/errors.d.ts +124 -0
- package/browser/errors.d.ts.map +1 -0
- package/browser/index.d.ts +32 -5
- package/browser/index.d.ts.map +1 -0
- package/browser/index.js +12482 -101
- package/browser/io/BinaryReader.d.ts +276 -0
- package/browser/io/BinaryReader.d.ts.map +1 -0
- package/browser/io/BinaryWriter.d.ts +391 -0
- package/browser/io/BinaryWriter.d.ts.map +1 -0
- package/browser/io/MemoryPool.d.ts +220 -0
- package/browser/io/MemoryPool.d.ts.map +1 -0
- package/browser/io/base64.d.ts +13 -0
- package/browser/io/base64.d.ts.map +1 -0
- package/browser/io/hex.d.ts +67 -0
- package/browser/io/hex.d.ts.map +1 -0
- package/browser/io/index.d.ts +17 -0
- package/browser/io/index.d.ts.map +1 -0
- package/browser/io/utils.d.ts +199 -0
- package/browser/io/utils.d.ts.map +1 -0
- package/browser/merkle.d.ts +10 -1
- package/browser/merkle.d.ts.map +1 -0
- package/browser/networks.d.ts +70 -9
- package/browser/networks.d.ts.map +1 -0
- package/browser/opcodes.d.ts +1 -0
- package/browser/opcodes.d.ts.map +1 -0
- package/browser/payments/bip341.d.ts +35 -9
- package/browser/payments/bip341.d.ts.map +1 -0
- package/browser/payments/embed.d.ts +112 -1
- package/browser/payments/embed.d.ts.map +1 -0
- package/browser/payments/index.d.ts +17 -10
- package/browser/payments/index.d.ts.map +1 -0
- package/browser/payments/p2ms.d.ts +150 -0
- package/browser/payments/p2ms.d.ts.map +1 -0
- package/browser/payments/p2op.d.ts +150 -24
- package/browser/payments/p2op.d.ts.map +1 -0
- package/browser/payments/p2pk.d.ts +154 -1
- package/browser/payments/p2pk.d.ts.map +1 -0
- package/browser/payments/p2pkh.d.ts +176 -1
- package/browser/payments/p2pkh.d.ts.map +1 -0
- package/browser/payments/p2sh.d.ts +150 -1
- package/browser/payments/p2sh.d.ts.map +1 -0
- package/browser/payments/p2tr.d.ts +185 -1
- package/browser/payments/p2tr.d.ts.map +1 -0
- package/browser/payments/p2wpkh.d.ts +161 -1
- package/browser/payments/p2wpkh.d.ts.map +1 -0
- package/browser/payments/p2wsh.d.ts +146 -1
- package/browser/payments/p2wsh.d.ts.map +1 -0
- package/browser/payments/types.d.ts +94 -64
- package/browser/payments/types.d.ts.map +1 -0
- package/browser/psbt/bip371.d.ts +34 -8
- package/browser/psbt/bip371.d.ts.map +1 -0
- package/browser/psbt/psbtutils.d.ts +56 -16
- package/browser/psbt/psbtutils.d.ts.map +1 -0
- package/browser/psbt/types.d.ts +245 -0
- package/browser/psbt/types.d.ts.map +1 -0
- package/browser/psbt/utils.d.ts +64 -0
- package/browser/psbt/utils.d.ts.map +1 -0
- package/browser/psbt/validation.d.ts +84 -0
- package/browser/psbt/validation.d.ts.map +1 -0
- package/browser/psbt.d.ts +82 -118
- package/browser/psbt.d.ts.map +1 -0
- package/browser/pubkey.d.ts +27 -6
- package/browser/pubkey.d.ts.map +1 -0
- package/browser/push_data.d.ts +24 -2
- package/browser/push_data.d.ts.map +1 -0
- package/browser/script.d.ts +33 -8
- package/browser/script.d.ts.map +1 -0
- package/browser/script_number.d.ts +17 -0
- package/browser/script_number.d.ts.map +1 -0
- package/browser/script_signature.d.ts +23 -5
- package/browser/script_signature.d.ts.map +1 -0
- package/browser/transaction.d.ts +160 -18
- package/browser/transaction.d.ts.map +1 -0
- package/browser/types.d.ts +36 -38
- package/browser/types.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.d.ts +143 -0
- package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
- package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/browser/workers/ecc-bundle.d.ts +25 -0
- package/browser/workers/ecc-bundle.d.ts.map +1 -0
- package/browser/workers/index.d.ts +91 -0
- package/browser/workers/index.d.ts.map +1 -0
- package/browser/workers/psbt-parallel.d.ts +88 -0
- package/browser/workers/psbt-parallel.d.ts.map +1 -0
- package/browser/workers/signing-worker.d.ts +37 -0
- package/browser/workers/signing-worker.d.ts.map +1 -0
- package/browser/workers/types.d.ts +365 -0
- package/browser/workers/types.d.ts.map +1 -0
- package/build/address.d.ts +57 -10
- package/build/address.d.ts.map +1 -0
- package/build/address.js +80 -24
- package/build/address.js.map +1 -0
- package/build/bech32utils.d.ts +9 -1
- package/build/bech32utils.d.ts.map +1 -0
- package/build/bech32utils.js +10 -2
- package/build/bech32utils.js.map +1 -0
- package/build/bip66.d.ts +11 -6
- package/build/bip66.d.ts.map +1 -0
- package/build/bip66.js +32 -3
- package/build/bip66.js.map +1 -0
- package/build/block.d.ts +117 -11
- package/build/block.d.ts.map +1 -0
- package/build/block.js +204 -72
- package/build/block.js.map +1 -0
- package/build/branded.d.ts +20 -0
- package/build/branded.d.ts.map +1 -0
- package/build/branded.js +7 -0
- package/build/branded.js.map +1 -0
- package/build/crypto/crypto.d.ts +1 -0
- package/build/crypto/crypto.d.ts.map +1 -0
- package/build/crypto/crypto.js +1 -0
- package/build/crypto/crypto.js.map +1 -0
- package/build/crypto.d.ts +46 -7
- package/build/crypto.d.ts.map +1 -0
- package/build/crypto.js +65 -20
- package/build/crypto.js.map +1 -0
- package/build/ecc/context.d.ts +135 -0
- package/build/ecc/context.d.ts.map +1 -0
- package/build/ecc/context.js +232 -0
- package/build/ecc/context.js.map +1 -0
- package/build/ecc/index.d.ts +11 -0
- package/build/ecc/index.d.ts.map +1 -0
- package/build/ecc/index.js +11 -0
- package/build/ecc/index.js.map +1 -0
- package/build/ecc/types.d.ts +134 -0
- package/build/ecc/types.d.ts.map +1 -0
- package/build/ecc/types.js +8 -0
- package/build/ecc/types.js.map +1 -0
- package/build/errors.d.ts +124 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +155 -0
- package/build/errors.js.map +1 -0
- package/build/index.d.ts +32 -5
- package/build/index.d.ts.map +1 -0
- package/build/index.js +26 -3
- package/build/index.js.map +1 -0
- package/build/io/BinaryReader.d.ts +276 -0
- package/build/io/BinaryReader.d.ts.map +1 -0
- package/build/io/BinaryReader.js +425 -0
- package/build/io/BinaryReader.js.map +1 -0
- package/build/io/BinaryWriter.d.ts +391 -0
- package/build/io/BinaryWriter.d.ts.map +1 -0
- package/build/io/BinaryWriter.js +611 -0
- package/build/io/BinaryWriter.js.map +1 -0
- package/build/io/MemoryPool.d.ts +220 -0
- package/build/io/MemoryPool.d.ts.map +1 -0
- package/build/io/MemoryPool.js +309 -0
- package/build/io/MemoryPool.js.map +1 -0
- package/build/io/base64.d.ts +13 -0
- package/build/io/base64.d.ts.map +1 -0
- package/build/io/base64.js +20 -0
- package/build/io/base64.js.map +1 -0
- package/build/io/hex.d.ts +67 -0
- package/build/io/hex.d.ts.map +1 -0
- package/build/io/hex.js +138 -0
- package/build/io/hex.js.map +1 -0
- package/build/io/index.d.ts +17 -0
- package/build/io/index.d.ts.map +1 -0
- package/build/io/index.js +23 -0
- package/build/io/index.js.map +1 -0
- package/build/io/utils.d.ts +199 -0
- package/build/io/utils.d.ts.map +1 -0
- package/build/io/utils.js +271 -0
- package/build/io/utils.js.map +1 -0
- package/build/merkle.d.ts +10 -1
- package/build/merkle.d.ts.map +1 -0
- package/build/merkle.js +12 -1
- package/build/merkle.js.map +1 -0
- package/build/networks.d.ts +70 -9
- package/build/networks.d.ts.map +1 -0
- package/build/networks.js +90 -4
- package/build/networks.js.map +1 -0
- package/build/opcodes.d.ts +1 -0
- package/build/opcodes.d.ts.map +1 -0
- package/build/opcodes.js +1 -0
- package/build/opcodes.js.map +1 -0
- package/build/payments/bip341.d.ts +36 -9
- package/build/payments/bip341.d.ts.map +1 -0
- package/build/payments/bip341.js +35 -15
- package/build/payments/bip341.js.map +1 -0
- package/build/payments/embed.d.ts +120 -1
- package/build/payments/embed.d.ts.map +1 -0
- package/build/payments/embed.js +215 -34
- package/build/payments/embed.js.map +1 -0
- package/build/payments/index.d.ts +17 -10
- package/build/payments/index.d.ts.map +1 -0
- package/build/payments/index.js +20 -10
- package/build/payments/index.js.map +1 -0
- package/build/payments/p2ms.d.ts +159 -1
- package/build/payments/p2ms.d.ts.map +1 -0
- package/build/payments/p2ms.js +427 -108
- package/build/payments/p2ms.js.map +1 -0
- package/build/payments/p2op.d.ts +158 -24
- package/build/payments/p2op.d.ts.map +1 -0
- package/build/payments/p2op.js +379 -93
- package/build/payments/p2op.js.map +1 -0
- package/build/payments/p2pk.d.ts +162 -1
- package/build/payments/p2pk.d.ts.map +1 -0
- package/build/payments/p2pk.js +327 -58
- package/build/payments/p2pk.js.map +1 -0
- package/build/payments/p2pkh.d.ts +185 -1
- package/build/payments/p2pkh.d.ts.map +1 -0
- package/build/payments/p2pkh.js +467 -114
- package/build/payments/p2pkh.js.map +1 -0
- package/build/payments/p2sh.d.ts +159 -1
- package/build/payments/p2sh.d.ts.map +1 -0
- package/build/payments/p2sh.js +500 -152
- package/build/payments/p2sh.js.map +1 -0
- package/build/payments/p2tr.d.ts +193 -1
- package/build/payments/p2tr.d.ts.map +1 -0
- package/build/payments/p2tr.js +592 -174
- package/build/payments/p2tr.js.map +1 -0
- package/build/payments/p2wpkh.d.ts +170 -1
- package/build/payments/p2wpkh.d.ts.map +1 -0
- package/build/payments/p2wpkh.js +429 -104
- package/build/payments/p2wpkh.js.map +1 -0
- package/build/payments/p2wsh.d.ts +155 -1
- package/build/payments/p2wsh.d.ts.map +1 -0
- package/build/payments/p2wsh.js +466 -144
- package/build/payments/p2wsh.js.map +1 -0
- package/build/payments/types.d.ts +98 -64
- package/build/payments/types.d.ts.map +1 -0
- package/build/payments/types.js +17 -13
- package/build/payments/types.js.map +1 -0
- package/build/psbt/bip371.d.ts +35 -9
- package/build/psbt/bip371.d.ts.map +1 -0
- package/build/psbt/bip371.js +113 -28
- package/build/psbt/bip371.js.map +1 -0
- package/build/psbt/psbtutils.d.ts +56 -16
- package/build/psbt/psbtutils.d.ts.map +1 -0
- package/build/psbt/psbtutils.js +71 -16
- package/build/psbt/psbtutils.js.map +1 -0
- package/build/psbt/types.d.ts +249 -0
- package/build/psbt/types.d.ts.map +1 -0
- package/build/psbt/types.js +6 -0
- package/build/psbt/types.js.map +1 -0
- package/build/psbt/utils.d.ts +68 -0
- package/build/psbt/utils.d.ts.map +1 -0
- package/build/psbt/utils.js +171 -0
- package/build/psbt/utils.js.map +1 -0
- package/build/psbt/validation.d.ts +88 -0
- package/build/psbt/validation.d.ts.map +1 -0
- package/build/psbt/validation.js +149 -0
- package/build/psbt/validation.js.map +1 -0
- package/build/psbt.d.ts +84 -120
- package/build/psbt.d.ts.map +1 -0
- package/build/psbt.js +411 -412
- package/build/psbt.js.map +1 -0
- package/build/pubkey.d.ts +27 -6
- package/build/pubkey.d.ts.map +1 -0
- package/build/pubkey.js +36 -12
- package/build/pubkey.js.map +1 -0
- package/build/push_data.d.ts +24 -2
- package/build/push_data.d.ts.map +1 -0
- package/build/push_data.js +44 -12
- package/build/push_data.js.map +1 -0
- package/build/script.d.ts +33 -8
- package/build/script.d.ts.map +1 -0
- package/build/script.js +100 -36
- package/build/script.js.map +1 -0
- package/build/script_number.d.ts +17 -0
- package/build/script_number.d.ts.map +1 -0
- package/build/script_number.js +19 -0
- package/build/script_number.js.map +1 -0
- package/build/script_signature.d.ts +23 -5
- package/build/script_signature.d.ts.map +1 -0
- package/build/script_signature.js +48 -15
- package/build/script_signature.js.map +1 -0
- package/build/transaction.d.ts +160 -18
- package/build/transaction.d.ts.map +1 -0
- package/build/transaction.js +443 -176
- package/build/transaction.js.map +1 -0
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/build/types.d.ts +36 -38
- package/build/types.d.ts.map +1 -0
- package/build/types.js +175 -57
- package/build/types.js.map +1 -0
- package/build/workers/WorkerSigningPool.d.ts +174 -0
- package/build/workers/WorkerSigningPool.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.js +553 -0
- package/build/workers/WorkerSigningPool.js.map +1 -0
- package/build/workers/WorkerSigningPool.node.d.ts +124 -0
- package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.node.js +753 -0
- package/build/workers/WorkerSigningPool.node.js.map +1 -0
- package/build/workers/ecc-bundle.d.ts +25 -0
- package/build/workers/ecc-bundle.d.ts.map +1 -0
- package/build/workers/ecc-bundle.js +25 -0
- package/build/workers/ecc-bundle.js.map +1 -0
- package/build/workers/index.d.ts +91 -0
- package/build/workers/index.d.ts.map +1 -0
- package/build/workers/index.js +114 -0
- package/build/workers/index.js.map +1 -0
- package/build/workers/psbt-parallel.d.ts +117 -0
- package/build/workers/psbt-parallel.d.ts.map +1 -0
- package/build/workers/psbt-parallel.js +233 -0
- package/build/workers/psbt-parallel.js.map +1 -0
- package/build/workers/signing-worker.d.ts +37 -0
- package/build/workers/signing-worker.d.ts.map +1 -0
- package/build/workers/signing-worker.js +350 -0
- package/build/workers/signing-worker.js.map +1 -0
- package/build/workers/types.d.ts +365 -0
- package/build/workers/types.d.ts.map +1 -0
- package/build/workers/types.js +60 -0
- package/build/workers/types.js.map +1 -0
- package/package.json +66 -8
- package/scripts/bundle-ecc.ts +111 -0
- package/src/address.ts +81 -44
- package/src/bech32utils.ts +3 -3
- package/src/bip66.ts +34 -24
- package/src/block.ts +196 -84
- package/src/branded.ts +18 -0
- package/src/crypto.ts +64 -26
- package/src/ecc/context.ts +277 -0
- package/src/ecc/index.ts +14 -0
- package/src/ecc/types.ts +154 -0
- package/src/ecpair.d.ts +99 -0
- package/src/errors.ts +163 -0
- package/src/index.ts +113 -9
- package/src/io/BinaryReader.ts +461 -0
- package/src/io/BinaryWriter.ts +696 -0
- package/src/io/MemoryPool.ts +343 -0
- package/src/io/base64.ts +20 -0
- package/src/io/hex.ts +155 -0
- package/src/io/index.ts +41 -0
- package/src/io/utils.ts +283 -0
- package/src/merkle.ts +14 -9
- package/src/networks.ts +9 -9
- package/src/payments/bip341.ts +34 -33
- package/src/payments/embed.ts +244 -41
- package/src/payments/index.ts +12 -10
- package/src/payments/p2ms.ts +490 -118
- package/src/payments/p2op.ts +431 -133
- package/src/payments/p2pk.ts +370 -72
- package/src/payments/p2pkh.ts +524 -130
- package/src/payments/p2sh.ts +572 -172
- package/src/payments/p2tr.ts +686 -194
- package/src/payments/p2wpkh.ts +484 -107
- package/src/payments/p2wsh.ts +526 -164
- package/src/payments/types.ts +80 -66
- package/src/psbt/bip371.ts +68 -51
- package/src/psbt/psbtutils.ts +39 -40
- package/src/psbt/types.ts +331 -0
- package/src/psbt/utils.ts +188 -0
- package/src/psbt/validation.ts +192 -0
- package/src/psbt.ts +566 -809
- package/src/pubkey.ts +22 -23
- package/src/push_data.ts +18 -16
- package/src/script.ts +82 -64
- package/src/script_number.ts +6 -6
- package/src/script_signature.ts +33 -36
- package/src/transaction.ts +458 -238
- package/src/types.ts +231 -100
- package/src/workers/WorkerSigningPool.node.ts +887 -0
- package/src/workers/WorkerSigningPool.ts +670 -0
- package/src/workers/ecc-bundle.ts +26 -0
- package/src/workers/index.ts +165 -0
- package/src/workers/psbt-parallel.ts +332 -0
- package/src/workers/signing-worker.ts +353 -0
- package/src/workers/types.ts +413 -0
- package/test/address.spec.ts +9 -6
- package/test/bitcoin.core.spec.ts +16 -17
- package/test/block.spec.ts +8 -7
- package/test/bufferutils.spec.ts +228 -214
- package/test/crypto.spec.ts +19 -11
- package/test/fixtures/p2pk.json +0 -8
- package/test/fixtures/p2pkh.json +1 -1
- package/test/fixtures/p2sh.json +1 -1
- package/test/fixtures/script.json +1 -1
- package/test/fixtures/transaction.json +2 -2
- package/test/integration/_regtest.ts +25 -0
- package/test/integration/addresses.spec.ts +4 -3
- package/test/integration/bip32.spec.ts +2 -1
- package/test/integration/blocks.spec.ts +1 -1
- package/test/integration/cltv.spec.ts +18 -16
- package/test/integration/csv.spec.ts +37 -64
- package/test/integration/payments.spec.ts +5 -3
- package/test/integration/taproot.spec.ts +76 -83
- package/test/integration/transactions.spec.ts +38 -35
- package/test/payments.spec.ts +35 -13
- package/test/payments.utils.ts +17 -16
- package/test/psbt.spec.ts +111 -100
- package/test/script.spec.ts +11 -10
- package/test/script_signature.spec.ts +9 -11
- package/test/taproot-cache.spec.ts +694 -0
- package/test/transaction.spec.ts +32 -40
- package/test/types.spec.ts +74 -29
- package/test/workers-pool.spec.ts +963 -0
- package/test/workers-signing.spec.ts +635 -0
- package/test/workers.spec.ts +1390 -0
- package/tsconfig.base.json +34 -18
- package/tsconfig.browser.json +15 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +5 -14
- package/vite.config.browser.ts +3 -42
- package/vitest.config.integration.ts +2 -0
- package/browser/bufferutils.d.ts +0 -34
- package/browser/chunks/crypto-BhCpKpek.js +0 -2033
- package/browser/chunks/payments-B1wlSccx.js +0 -1089
- package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
- package/browser/chunks/script-DyPItFEl.js +0 -318
- package/browser/chunks/transaction-C_UbhMGn.js +0 -432
- package/browser/chunks/utils-DNZi-T5W.js +0 -761
- package/browser/ecc_lib.d.ts +0 -3
- package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/browser/hooks/HookedSigner.d.ts +0 -4
- package/browser/hooks/SignatureManager.d.ts +0 -13
- package/browser/payments/lazy.d.ts +0 -2
- package/browser/typeforce.d.ts +0 -38
- package/build/bufferutils.d.ts +0 -34
- package/build/bufferutils.js +0 -141
- package/build/ecc_lib.d.ts +0 -3
- package/build/ecc_lib.js +0 -61
- package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/build/hooks/AdvancedSignatureManager.js +0 -52
- package/build/hooks/HookedSigner.d.ts +0 -4
- package/build/hooks/HookedSigner.js +0 -64
- package/build/hooks/SignatureManager.d.ts +0 -13
- package/build/hooks/SignatureManager.js +0 -45
- package/build/payments/lazy.d.ts +0 -2
- package/build/payments/lazy.js +0 -28
- package/build/tsconfig.tsbuildinfo +0 -1
- package/src/bufferutils.ts +0 -188
- package/src/ecc_lib.ts +0 -94
- package/src/hooks/AdvancedSignatureManager.ts +0 -104
- package/src/hooks/HookedSigner.ts +0 -108
- package/src/hooks/SignatureManager.ts +0 -84
- package/src/payments/lazy.ts +0 -28
- package/src/typeforce.d.ts +0 -38
- package/tsconfig.webpack.json +0 -18
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-based parallel signing pool.
|
|
3
|
+
*
|
|
4
|
+
* Provides secure parallel signature computation using worker threads.
|
|
5
|
+
* Private keys are isolated per-worker and zeroed immediately after signing.
|
|
6
|
+
*
|
|
7
|
+
* SECURITY ARCHITECTURE:
|
|
8
|
+
* - Keys are NEVER shared via SharedArrayBuffer
|
|
9
|
+
* - Each key is cloned to ONE worker via postMessage
|
|
10
|
+
* - Keys are zeroed in worker immediately after signing
|
|
11
|
+
* - Workers can be preserved for performance or terminated for security
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { WorkerSigningPool } from '@btc-vision/bitcoin';
|
|
16
|
+
*
|
|
17
|
+
* // Get singleton pool instance
|
|
18
|
+
* const pool = WorkerSigningPool.getInstance();
|
|
19
|
+
*
|
|
20
|
+
* // Preserve workers for multiple signing operations (faster)
|
|
21
|
+
* pool.preserveWorkers();
|
|
22
|
+
*
|
|
23
|
+
* // Sign multiple inputs in parallel
|
|
24
|
+
* const result = await pool.signBatch(tasks, keyPair);
|
|
25
|
+
*
|
|
26
|
+
* // Shutdown when done (optional - cleans up workers)
|
|
27
|
+
* await pool.shutdown();
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @packageDocumentation
|
|
31
|
+
*/
|
|
32
|
+
import { WorkerState, isBatchResult, isWorkerReady, } from './types.js';
|
|
33
|
+
import { createWorkerBlobUrl, revokeWorkerBlobUrl } from './signing-worker.js';
|
|
34
|
+
/**
|
|
35
|
+
* Default configuration values.
|
|
36
|
+
*/
|
|
37
|
+
const DEFAULT_CONFIG = {
|
|
38
|
+
workerCount: typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 4 : 4,
|
|
39
|
+
taskTimeoutMs: 30000,
|
|
40
|
+
maxKeyHoldTimeMs: 5000,
|
|
41
|
+
verifySignatures: true,
|
|
42
|
+
preserveWorkers: false,
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Worker-based parallel signing pool.
|
|
46
|
+
*
|
|
47
|
+
* Manages a pool of worker threads for parallel signature computation.
|
|
48
|
+
* Provides secure key handling with immediate zeroing after use.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // Initialize pool at app startup
|
|
53
|
+
* const pool = WorkerSigningPool.getInstance({ workerCount: 4 });
|
|
54
|
+
* pool.preserveWorkers();
|
|
55
|
+
*
|
|
56
|
+
* // Use for PSBT signing
|
|
57
|
+
* const tasks = prepareSigningTasks(psbt, keyPair);
|
|
58
|
+
* const result = await pool.signBatch(tasks, keyPair);
|
|
59
|
+
*
|
|
60
|
+
* // Apply signatures to PSBT
|
|
61
|
+
* applySignatures(psbt, result.signatures);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export class WorkerSigningPool {
|
|
65
|
+
/**
|
|
66
|
+
* Singleton instance.
|
|
67
|
+
*/
|
|
68
|
+
static #instance = null;
|
|
69
|
+
/**
|
|
70
|
+
* Pool configuration.
|
|
71
|
+
*/
|
|
72
|
+
#config;
|
|
73
|
+
/**
|
|
74
|
+
* Worker pool.
|
|
75
|
+
*/
|
|
76
|
+
#workers = [];
|
|
77
|
+
/**
|
|
78
|
+
* Pending batches awaiting completion.
|
|
79
|
+
*/
|
|
80
|
+
#pendingBatches = new Map();
|
|
81
|
+
/**
|
|
82
|
+
* Worker blob URL (shared across all workers).
|
|
83
|
+
*/
|
|
84
|
+
#workerBlobUrl = null;
|
|
85
|
+
/**
|
|
86
|
+
* Whether workers are preserved between batches.
|
|
87
|
+
*/
|
|
88
|
+
#preserveWorkers = false;
|
|
89
|
+
/**
|
|
90
|
+
* Next worker ID counter.
|
|
91
|
+
*/
|
|
92
|
+
#nextWorkerId = 0;
|
|
93
|
+
/**
|
|
94
|
+
* Next task ID counter.
|
|
95
|
+
*/
|
|
96
|
+
#nextTaskId = 0;
|
|
97
|
+
/**
|
|
98
|
+
* Whether the pool is initialized.
|
|
99
|
+
*/
|
|
100
|
+
#initialized = false;
|
|
101
|
+
/**
|
|
102
|
+
* Whether the pool is shutting down.
|
|
103
|
+
*/
|
|
104
|
+
#shuttingDown = false;
|
|
105
|
+
/**
|
|
106
|
+
* Creates a new WorkerSigningPool.
|
|
107
|
+
*
|
|
108
|
+
* @param config - Pool configuration
|
|
109
|
+
*/
|
|
110
|
+
constructor(config = {}) {
|
|
111
|
+
this.#config = { ...DEFAULT_CONFIG, ...config };
|
|
112
|
+
this.#preserveWorkers = this.#config.preserveWorkers;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Gets the singleton pool instance.
|
|
116
|
+
*
|
|
117
|
+
* @param config - Optional configuration (only used on first call)
|
|
118
|
+
* @returns The singleton pool instance
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const pool = WorkerSigningPool.getInstance({ workerCount: 8 });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
static getInstance(config) {
|
|
126
|
+
if (!WorkerSigningPool.#instance) {
|
|
127
|
+
WorkerSigningPool.#instance = new WorkerSigningPool(config);
|
|
128
|
+
}
|
|
129
|
+
return WorkerSigningPool.#instance;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Resets the singleton instance (for testing).
|
|
133
|
+
*/
|
|
134
|
+
static resetInstance() {
|
|
135
|
+
if (WorkerSigningPool.#instance) {
|
|
136
|
+
WorkerSigningPool.#instance.shutdown().catch(() => { });
|
|
137
|
+
WorkerSigningPool.#instance = null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Number of workers in the pool.
|
|
142
|
+
*/
|
|
143
|
+
get workerCount() {
|
|
144
|
+
return this.#workers.length;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Number of idle workers available.
|
|
148
|
+
*/
|
|
149
|
+
get idleWorkerCount() {
|
|
150
|
+
return this.#workers.filter((w) => w.state === WorkerState.Idle).length;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Number of busy workers.
|
|
154
|
+
*/
|
|
155
|
+
get busyWorkerCount() {
|
|
156
|
+
return this.#workers.filter((w) => w.state === WorkerState.Busy).length;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Whether workers are being preserved between batches.
|
|
160
|
+
*/
|
|
161
|
+
get isPreservingWorkers() {
|
|
162
|
+
return this.#preserveWorkers;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Enables worker preservation between signing batches.
|
|
166
|
+
*
|
|
167
|
+
* When enabled, workers remain alive after completing a batch,
|
|
168
|
+
* ready for the next signing operation. This is faster but
|
|
169
|
+
* keeps workers in memory.
|
|
170
|
+
*
|
|
171
|
+
* Call shutdown() when done to terminate all workers.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* const pool = WorkerSigningPool.getInstance();
|
|
176
|
+
* pool.preserveWorkers(); // Enable at app startup
|
|
177
|
+
*
|
|
178
|
+
* // ... do many signing operations ...
|
|
179
|
+
*
|
|
180
|
+
* await pool.shutdown(); // Cleanup at app shutdown
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
preserveWorkers() {
|
|
184
|
+
this.#preserveWorkers = true;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Disables worker preservation.
|
|
188
|
+
*
|
|
189
|
+
* Workers will be terminated after each signing batch.
|
|
190
|
+
* More secure (no persistent workers) but slower for multiple batches.
|
|
191
|
+
*/
|
|
192
|
+
releaseWorkers() {
|
|
193
|
+
this.#preserveWorkers = false;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Initializes the worker pool.
|
|
197
|
+
*
|
|
198
|
+
* Creates workers and waits for them to be ready.
|
|
199
|
+
* Called automatically on first signBatch() if not called manually.
|
|
200
|
+
*
|
|
201
|
+
* @returns Promise that resolves when all workers are ready
|
|
202
|
+
*/
|
|
203
|
+
async initialize() {
|
|
204
|
+
if (this.#initialized) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (this.#shuttingDown) {
|
|
208
|
+
throw new Error('Cannot initialize pool while shutting down');
|
|
209
|
+
}
|
|
210
|
+
// Create worker blob URL (ECC library is bundled at compile time)
|
|
211
|
+
this.#workerBlobUrl = createWorkerBlobUrl();
|
|
212
|
+
// Create workers
|
|
213
|
+
const workerPromises = [];
|
|
214
|
+
for (let i = 0; i < this.#config.workerCount; i++) {
|
|
215
|
+
workerPromises.push(this.#createWorker());
|
|
216
|
+
}
|
|
217
|
+
await Promise.all(workerPromises);
|
|
218
|
+
this.#initialized = true;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Signs a batch of tasks in parallel.
|
|
222
|
+
*
|
|
223
|
+
* SECURITY: Private keys are obtained via keyPair.getPrivateKey() and
|
|
224
|
+
* cloned to workers. Keys are zeroed in workers immediately after signing.
|
|
225
|
+
*
|
|
226
|
+
* Tasks are distributed across workers and processed in batches for efficiency.
|
|
227
|
+
*
|
|
228
|
+
* @param tasks - Signing tasks (hashes, input indices, etc.)
|
|
229
|
+
* @param keyPair - Key pair with getPrivateKey() method
|
|
230
|
+
* @returns Promise resolving to signing results
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```typescript
|
|
234
|
+
* const tasks: SigningTask[] = [
|
|
235
|
+
* { taskId: '1', inputIndex: 0, hash: hash0, signatureType: SignatureType.ECDSA, sighashType: 0x01 },
|
|
236
|
+
* { taskId: '2', inputIndex: 1, hash: hash1, signatureType: SignatureType.Schnorr, sighashType: 0x00 },
|
|
237
|
+
* ];
|
|
238
|
+
*
|
|
239
|
+
* const result = await pool.signBatch(tasks, keyPair);
|
|
240
|
+
*
|
|
241
|
+
* if (result.success) {
|
|
242
|
+
* for (const [inputIndex, sig] of result.signatures) {
|
|
243
|
+
* console.log(`Input ${inputIndex}: ${sig.signature}`);
|
|
244
|
+
* }
|
|
245
|
+
* }
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
async signBatch(tasks, keyPair) {
|
|
249
|
+
const startTime = performance.now();
|
|
250
|
+
// Initialize if needed
|
|
251
|
+
if (!this.#initialized) {
|
|
252
|
+
await this.initialize();
|
|
253
|
+
}
|
|
254
|
+
if (tasks.length === 0) {
|
|
255
|
+
return {
|
|
256
|
+
success: true,
|
|
257
|
+
signatures: new Map(),
|
|
258
|
+
errors: new Map(),
|
|
259
|
+
durationMs: performance.now() - startTime,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Distribute tasks across workers
|
|
263
|
+
const workerCount = Math.min(this.#workers.length, tasks.length);
|
|
264
|
+
const taskBatches = Array.from({ length: workerCount }, () => []);
|
|
265
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
266
|
+
taskBatches[i % workerCount].push(tasks[i]);
|
|
267
|
+
}
|
|
268
|
+
// Get private key once
|
|
269
|
+
const privateKey = keyPair.getPrivateKey();
|
|
270
|
+
try {
|
|
271
|
+
// Send batches to workers in parallel
|
|
272
|
+
const batchResults = await Promise.allSettled(taskBatches.map((batch, index) => this.#signBatchOnWorker(batch, privateKey, keyPair.publicKey, index)));
|
|
273
|
+
// Collect all results
|
|
274
|
+
const signatures = new Map();
|
|
275
|
+
const errors = new Map();
|
|
276
|
+
for (let i = 0; i < batchResults.length; i++) {
|
|
277
|
+
const result = batchResults[i];
|
|
278
|
+
if (result.status === 'fulfilled') {
|
|
279
|
+
const batchResult = result.value;
|
|
280
|
+
// Add successful signatures
|
|
281
|
+
for (const sig of batchResult.results) {
|
|
282
|
+
signatures.set(sig.inputIndex, {
|
|
283
|
+
type: 'result',
|
|
284
|
+
taskId: sig.taskId,
|
|
285
|
+
signature: sig.signature,
|
|
286
|
+
inputIndex: sig.inputIndex,
|
|
287
|
+
publicKey: sig.publicKey,
|
|
288
|
+
signatureType: sig.signatureType,
|
|
289
|
+
leafHash: sig.leafHash,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
// Add errors
|
|
293
|
+
for (const err of batchResult.errors) {
|
|
294
|
+
errors.set(err.inputIndex, err.error);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// Entire batch failed - mark all tasks in batch as failed
|
|
299
|
+
const reason = result.reason;
|
|
300
|
+
const errorMsg = reason?.message ?? 'Batch signing failed';
|
|
301
|
+
// Add error for each task in the failed batch
|
|
302
|
+
const failedBatch = taskBatches[i];
|
|
303
|
+
for (const task of failedBatch) {
|
|
304
|
+
errors.set(task.inputIndex, errorMsg);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Cleanup workers if not preserving
|
|
309
|
+
if (!this.#preserveWorkers) {
|
|
310
|
+
await this.#terminateIdleWorkers();
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
success: errors.size === 0,
|
|
314
|
+
signatures,
|
|
315
|
+
errors,
|
|
316
|
+
durationMs: performance.now() - startTime,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
// SECURITY: Zero the key in main thread
|
|
321
|
+
privateKey.fill(0);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Shuts down the pool and terminates all workers.
|
|
326
|
+
*
|
|
327
|
+
* Call this when the application is done with signing operations.
|
|
328
|
+
*
|
|
329
|
+
* @returns Promise that resolves when all workers are terminated
|
|
330
|
+
*/
|
|
331
|
+
async shutdown() {
|
|
332
|
+
if (this.#shuttingDown) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
this.#shuttingDown = true;
|
|
336
|
+
// Terminate all workers
|
|
337
|
+
const terminatePromises = this.#workers.map((worker) => this.#terminateWorker(worker));
|
|
338
|
+
await Promise.all(terminatePromises);
|
|
339
|
+
// Clear state
|
|
340
|
+
this.#workers.length = 0;
|
|
341
|
+
this.#pendingBatches.clear();
|
|
342
|
+
// Revoke blob URL
|
|
343
|
+
if (this.#workerBlobUrl) {
|
|
344
|
+
revokeWorkerBlobUrl(this.#workerBlobUrl);
|
|
345
|
+
this.#workerBlobUrl = null;
|
|
346
|
+
}
|
|
347
|
+
this.#initialized = false;
|
|
348
|
+
this.#shuttingDown = false;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Creates a new worker and adds it to the pool.
|
|
352
|
+
*/
|
|
353
|
+
async #createWorker() {
|
|
354
|
+
if (!this.#workerBlobUrl) {
|
|
355
|
+
throw new Error('Worker blob URL not created');
|
|
356
|
+
}
|
|
357
|
+
const workerId = this.#nextWorkerId++;
|
|
358
|
+
// Create worker from blob URL
|
|
359
|
+
const worker = new Worker(this.#workerBlobUrl, {
|
|
360
|
+
name: `signing-worker-${workerId}`,
|
|
361
|
+
});
|
|
362
|
+
const pooledWorker = {
|
|
363
|
+
id: workerId,
|
|
364
|
+
state: WorkerState.Initializing,
|
|
365
|
+
worker,
|
|
366
|
+
currentTaskId: null,
|
|
367
|
+
taskStartTime: null,
|
|
368
|
+
};
|
|
369
|
+
this.#workers.push(pooledWorker);
|
|
370
|
+
// Wait for worker to be ready
|
|
371
|
+
await new Promise((resolve, reject) => {
|
|
372
|
+
const timeout = setTimeout(() => {
|
|
373
|
+
reject(new Error(`Worker ${workerId} initialization timeout`));
|
|
374
|
+
}, 10000);
|
|
375
|
+
const messageHandler = (event) => {
|
|
376
|
+
if (isWorkerReady(event.data)) {
|
|
377
|
+
clearTimeout(timeout);
|
|
378
|
+
worker.removeEventListener('message', messageHandler);
|
|
379
|
+
pooledWorker.state = WorkerState.Idle;
|
|
380
|
+
resolve();
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
worker.addEventListener('message', messageHandler);
|
|
384
|
+
worker.addEventListener('error', (error) => {
|
|
385
|
+
clearTimeout(timeout);
|
|
386
|
+
reject(new Error(`Worker ${workerId} error: ${error.message}`));
|
|
387
|
+
});
|
|
388
|
+
// Send init message (ECC library is bundled in worker code)
|
|
389
|
+
worker.postMessage({
|
|
390
|
+
type: 'init',
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
// Set up message handler for signing results
|
|
394
|
+
worker.addEventListener('message', (event) => {
|
|
395
|
+
this.#handleWorkerMessage(pooledWorker, event.data);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Signs a batch of tasks on a specific worker.
|
|
400
|
+
*/
|
|
401
|
+
async #signBatchOnWorker(tasks, privateKey, publicKey, workerIndex) {
|
|
402
|
+
if (tasks.length === 0) {
|
|
403
|
+
return { type: 'batchResult', batchId: '', results: [], errors: [] };
|
|
404
|
+
}
|
|
405
|
+
// Get worker at index (or wait for idle)
|
|
406
|
+
const worker = this.#workers[workerIndex] ?? (await this.#getIdleWorker());
|
|
407
|
+
// Generate unique batch ID
|
|
408
|
+
const batchId = `batch-${this.#nextTaskId++}`;
|
|
409
|
+
return new Promise((resolve, reject) => {
|
|
410
|
+
// Set up timeout
|
|
411
|
+
const timeoutId = setTimeout(() => {
|
|
412
|
+
this.#pendingBatches.delete(batchId);
|
|
413
|
+
worker.state = WorkerState.Idle;
|
|
414
|
+
worker.currentTaskId = null;
|
|
415
|
+
worker.taskStartTime = null;
|
|
416
|
+
// SECURITY: Terminate worker that exceeded key hold time
|
|
417
|
+
this.#terminateWorker(worker).catch(() => { });
|
|
418
|
+
this.#createWorker().catch(() => { });
|
|
419
|
+
reject(new Error(`Batch signing timeout for ${tasks.length} tasks`));
|
|
420
|
+
}, this.#config.maxKeyHoldTimeMs);
|
|
421
|
+
// Store pending batch
|
|
422
|
+
const pendingBatch = {
|
|
423
|
+
batchId,
|
|
424
|
+
resolve,
|
|
425
|
+
reject,
|
|
426
|
+
timeoutId,
|
|
427
|
+
};
|
|
428
|
+
this.#pendingBatches.set(batchId, pendingBatch);
|
|
429
|
+
// Mark worker as busy
|
|
430
|
+
worker.state = WorkerState.Busy;
|
|
431
|
+
worker.currentTaskId = batchId;
|
|
432
|
+
worker.taskStartTime = Date.now();
|
|
433
|
+
// Convert tasks to batch format
|
|
434
|
+
const batchTasks = tasks.map((task) => ({
|
|
435
|
+
taskId: task.taskId,
|
|
436
|
+
hash: task.hash,
|
|
437
|
+
publicKey,
|
|
438
|
+
signatureType: task.signatureType,
|
|
439
|
+
lowR: task.lowR,
|
|
440
|
+
inputIndex: task.inputIndex,
|
|
441
|
+
sighashType: task.sighashType,
|
|
442
|
+
leafHash: task.leafHash,
|
|
443
|
+
}));
|
|
444
|
+
// Create batch message
|
|
445
|
+
// SECURITY: privateKey is cloned via postMessage, NOT shared
|
|
446
|
+
const message = {
|
|
447
|
+
type: 'signBatch',
|
|
448
|
+
batchId,
|
|
449
|
+
tasks: batchTasks,
|
|
450
|
+
privateKey, // Cloned to worker, zeroed there after all signatures
|
|
451
|
+
};
|
|
452
|
+
// Send to worker
|
|
453
|
+
worker.worker.postMessage(message);
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Gets an idle worker, creating one if necessary.
|
|
458
|
+
*/
|
|
459
|
+
async #getIdleWorker() {
|
|
460
|
+
// Find idle worker
|
|
461
|
+
let worker = this.#workers.find((w) => w.state === WorkerState.Idle);
|
|
462
|
+
if (worker) {
|
|
463
|
+
return worker;
|
|
464
|
+
}
|
|
465
|
+
// No idle workers - wait for one to become available
|
|
466
|
+
// or create a new one if under limit
|
|
467
|
+
if (this.#workers.length < this.#config.workerCount) {
|
|
468
|
+
await this.#createWorker();
|
|
469
|
+
worker = this.#workers.find((w) => w.state === WorkerState.Idle);
|
|
470
|
+
if (worker) {
|
|
471
|
+
return worker;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// Wait for any worker to become idle
|
|
475
|
+
return new Promise((resolve) => {
|
|
476
|
+
const checkInterval = setInterval(() => {
|
|
477
|
+
const idleWorker = this.#workers.find((w) => w.state === WorkerState.Idle);
|
|
478
|
+
if (idleWorker) {
|
|
479
|
+
clearInterval(checkInterval);
|
|
480
|
+
resolve(idleWorker);
|
|
481
|
+
}
|
|
482
|
+
}, 10);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Handles a message from a worker.
|
|
487
|
+
*/
|
|
488
|
+
#handleWorkerMessage(worker, response) {
|
|
489
|
+
if (isBatchResult(response)) {
|
|
490
|
+
const pending = this.#pendingBatches.get(response.batchId);
|
|
491
|
+
if (pending) {
|
|
492
|
+
clearTimeout(pending.timeoutId);
|
|
493
|
+
this.#pendingBatches.delete(response.batchId);
|
|
494
|
+
worker.state = WorkerState.Idle;
|
|
495
|
+
worker.currentTaskId = null;
|
|
496
|
+
worker.taskStartTime = null;
|
|
497
|
+
pending.resolve(response);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// Ignore ready and shutdown-ack messages here (handled elsewhere)
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Terminates a worker.
|
|
504
|
+
*/
|
|
505
|
+
async #terminateWorker(worker) {
|
|
506
|
+
if (worker.state === WorkerState.Terminated) {
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
worker.state = WorkerState.ShuttingDown;
|
|
510
|
+
// Send shutdown message
|
|
511
|
+
worker.worker.postMessage({ type: 'shutdown' });
|
|
512
|
+
// Wait briefly for acknowledgment, then terminate
|
|
513
|
+
await new Promise((resolve) => {
|
|
514
|
+
const timeout = setTimeout(() => {
|
|
515
|
+
worker.worker.terminate();
|
|
516
|
+
worker.state = WorkerState.Terminated;
|
|
517
|
+
resolve();
|
|
518
|
+
}, 1000);
|
|
519
|
+
const handler = (event) => {
|
|
520
|
+
if (event.data.type === 'shutdown-ack') {
|
|
521
|
+
clearTimeout(timeout);
|
|
522
|
+
worker.worker.removeEventListener('message', handler);
|
|
523
|
+
worker.worker.terminate();
|
|
524
|
+
worker.state = WorkerState.Terminated;
|
|
525
|
+
resolve();
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
worker.worker.addEventListener('message', handler);
|
|
529
|
+
});
|
|
530
|
+
// Remove from pool
|
|
531
|
+
const index = this.#workers.indexOf(worker);
|
|
532
|
+
if (index >= 0) {
|
|
533
|
+
this.#workers.splice(index, 1);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Terminates all idle workers.
|
|
538
|
+
*/
|
|
539
|
+
async #terminateIdleWorkers() {
|
|
540
|
+
const idleWorkers = this.#workers.filter((w) => w.state === WorkerState.Idle);
|
|
541
|
+
await Promise.all(idleWorkers.map((w) => this.#terminateWorker(w)));
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Convenience function to get the singleton pool instance.
|
|
546
|
+
*
|
|
547
|
+
* @param config - Optional configuration
|
|
548
|
+
* @returns The singleton pool instance
|
|
549
|
+
*/
|
|
550
|
+
export function getSigningPool(config) {
|
|
551
|
+
return WorkerSigningPool.getInstance(config);
|
|
552
|
+
}
|
|
553
|
+
//# sourceMappingURL=WorkerSigningPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerSigningPool.js","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js-specific worker signing pool implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses worker_threads module for true parallel execution.
|
|
5
|
+
* Private keys are isolated per-worker and zeroed immediately after signing.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { WorkerPoolConfig, SigningTask, ParallelSignerKeyPair, ParallelSigningResult } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* ECC library types for Node.js worker.
|
|
12
|
+
*/
|
|
13
|
+
export declare const NodeEccLibrary: {
|
|
14
|
+
/** Pure JS @noble/secp256k1 (default, ~12KB) */
|
|
15
|
+
readonly Noble: "noble";
|
|
16
|
+
/** WASM-based tiny-secp256k1 (faster, ~1.2MB) */
|
|
17
|
+
readonly TinySecp256k1: "tiny-secp256k1";
|
|
18
|
+
};
|
|
19
|
+
export type NodeEccLibrary = (typeof NodeEccLibrary)[keyof typeof NodeEccLibrary];
|
|
20
|
+
/**
|
|
21
|
+
* Extended configuration for Node.js worker pool.
|
|
22
|
+
*/
|
|
23
|
+
export interface NodeWorkerPoolConfig extends WorkerPoolConfig {
|
|
24
|
+
/**
|
|
25
|
+
* ECC library type for signing.
|
|
26
|
+
* - NodeEccLibrary.Noble: Pure JS @noble/secp256k1 (default, ~12KB)
|
|
27
|
+
* - NodeEccLibrary.TinySecp256k1: WASM-based tiny-secp256k1 (faster)
|
|
28
|
+
*
|
|
29
|
+
* Default: NodeEccLibrary.Noble
|
|
30
|
+
*/
|
|
31
|
+
readonly eccLibrary?: NodeEccLibrary;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Worker-based parallel signing pool for Node.js.
|
|
35
|
+
*
|
|
36
|
+
* Uses worker_threads for true parallel execution.
|
|
37
|
+
* Provides secure key handling with immediate zeroing after use.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import { NodeWorkerSigningPool } from '@btc-vision/bitcoin/workers';
|
|
42
|
+
*
|
|
43
|
+
* // Initialize pool at app startup
|
|
44
|
+
* const pool = NodeWorkerSigningPool.getInstance({ workerCount: 4 });
|
|
45
|
+
* pool.preserveWorkers();
|
|
46
|
+
*
|
|
47
|
+
* // Sign batch
|
|
48
|
+
* const result = await pool.signBatch(tasks, keyPair);
|
|
49
|
+
*
|
|
50
|
+
* // Cleanup at app shutdown
|
|
51
|
+
* await pool.shutdown();
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare class NodeWorkerSigningPool {
|
|
55
|
+
#private;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a new NodeWorkerSigningPool.
|
|
58
|
+
*
|
|
59
|
+
* @param config - Pool configuration
|
|
60
|
+
*/
|
|
61
|
+
private constructor();
|
|
62
|
+
/**
|
|
63
|
+
* Gets the singleton pool instance.
|
|
64
|
+
*
|
|
65
|
+
* @param config - Optional configuration (only used on first call)
|
|
66
|
+
* @returns The singleton pool instance
|
|
67
|
+
*/
|
|
68
|
+
static getInstance(config?: NodeWorkerPoolConfig): NodeWorkerSigningPool;
|
|
69
|
+
/**
|
|
70
|
+
* Resets the singleton instance (for testing).
|
|
71
|
+
*/
|
|
72
|
+
static resetInstance(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Number of workers in the pool.
|
|
75
|
+
*/
|
|
76
|
+
get workerCount(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Number of idle workers available.
|
|
79
|
+
*/
|
|
80
|
+
get idleWorkerCount(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Number of busy workers.
|
|
83
|
+
*/
|
|
84
|
+
get busyWorkerCount(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Whether workers are being preserved between batches.
|
|
87
|
+
*/
|
|
88
|
+
get isPreservingWorkers(): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Enables worker preservation between signing batches.
|
|
91
|
+
*/
|
|
92
|
+
preserveWorkers(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Disables worker preservation.
|
|
95
|
+
*/
|
|
96
|
+
releaseWorkers(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Initializes the worker pool.
|
|
99
|
+
*
|
|
100
|
+
* @returns Promise that resolves when all workers are ready
|
|
101
|
+
*/
|
|
102
|
+
initialize(): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Signs a batch of tasks in parallel.
|
|
105
|
+
*
|
|
106
|
+
* Tasks are distributed across workers and processed in batches for efficiency.
|
|
107
|
+
*
|
|
108
|
+
* @param tasks - Signing tasks
|
|
109
|
+
* @param keyPair - Key pair with getPrivateKey() method
|
|
110
|
+
* @returns Promise resolving to signing results
|
|
111
|
+
*/
|
|
112
|
+
signBatch(tasks: readonly SigningTask[], keyPair: ParallelSignerKeyPair): Promise<ParallelSigningResult>;
|
|
113
|
+
/**
|
|
114
|
+
* Shuts down the pool and terminates all workers.
|
|
115
|
+
*
|
|
116
|
+
* @returns Promise that resolves when all workers are terminated
|
|
117
|
+
*/
|
|
118
|
+
shutdown(): Promise<void>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Convenience function to get the singleton pool instance.
|
|
122
|
+
*/
|
|
123
|
+
export declare function getNodeSigningPool(config?: NodeWorkerPoolConfig): NodeWorkerSigningPool;
|
|
124
|
+
//# sourceMappingURL=WorkerSigningPool.node.d.ts.map
|