@bitgo/sdk-coin-kaspa

中文文档
1.3.50发布于 2026/11/06MITTypeScriptCommonJS构建来源已验证近 30 天下载 6184

BitGo's SDK coin library for Kaspa (KASPA)

原始使用文档
文档目录19 节
  1. Overview
  2. Features
  3. Installation
  4. Usage
  5. 1. Register with BitGo SDK
  6. 2. Key Generation
  7. 3. Address Generation
  8. 4. Building a Transaction
  9. 5. Signing — Path A: Direct Private Key (non-TSS)
  10. 6. Signing — Path B: TSS / MPC (per-input DKLS sessions)
  11. 7. Broadcasting
  12. 8. Explaining / Parsing a Transaction
  13. 9. Verifying a Transaction
  14. 10. Coin Properties
  15. Key Constants
  16. Module Structure
  17. Address Format
  18. Signing
  19. References

@bitgo/sdk-coin-kaspa

BitGo's SDK module for the Kaspa (KASPA) blockchain.

Overview

Kaspa is a proof-of-work blockchain based on the GHOSTDAG protocol (a generalization of Nakamoto consensus), enabling high block rates. This module implements Kaspa's UTXO model with secp256k1 Schnorr signatures (BIP-143-like sighash) and the custom kaspa/kaspatest bech32 address format.

Supported coin identifiers:

  • kaspa — Kaspa mainnet
  • tkaspa — Kaspa testnet

Features

  • Key pair generation (secp256k1)
  • Address derivation (kaspa bech32 P2PK Schnorr)
  • UTXO transaction building
  • Schnorr signing and verification (Blake2b-256 sighash)
  • TSS/MPC support (ECDSA algorithm, per-input DKLS sessions)
  • Full serialization round-trip (hex/JSON)

Installation

yarn add @bitgo/sdk-coin-kaspa

Usage

1. Register with BitGo SDK

import { BitGo } from 'bitgo';
import { register } from '@bitgo/sdk-coin-kaspa';

const bitgo = new BitGo({ env: 'prod' });
register(bitgo);

const kaspa = bitgo.coin('kaspa');
const tkaspa = bitgo.coin('tkaspa'); // testnet

Alternatively, instantiate directly (useful in tests or scripts):

import { Kaspa, Tkaspa } from '@bitgo/sdk-coin-kaspa';

const kaspa = Kaspa.createInstance(bitgo);
const tkaspa = Tkaspa.createInstance(bitgo);

2. Key Generation

// Random key pair
const kp = kaspa.generateKeyPair();
console.log(kp.pub); // 66-char hex compressed secp256k1 public key
console.log(kp.prv); // 64-char hex private key

// Deterministic from a 32-byte seed
const seed = Buffer.from('...32 bytes...', 'hex');
const kpFromSeed = kaspa.generateKeyPair(seed);

// Validation
kaspa.isValidPub(kp.pub); // true
kaspa.isValidPrv(kp.prv); // true

Using KeyPair directly:

import { KeyPair } from '@bitgo/sdk-coin-kaspa';

const keyPair = new KeyPair(); // random
const { pub, prv } = keyPair.getKeys();

3. Address Generation

import { KeyPair } from '@bitgo/sdk-coin-kaspa';

const keyPair = new KeyPair({ prv: '<64-char-hex-private-key>' });

const mainnetAddress = keyPair.getAddress('mainnet'); // kaspa:qq...
const testnetAddress = keyPair.getAddress('testnet'); // kaspatest:qq...

kaspa.isValidAddress(mainnetAddress); // true

Computing the P2PK scriptPublicKey for a key (required when constructing UTXO inputs):

import { compressedToXOnly, buildP2PKScriptPublicKey } from '@bitgo/sdk-coin-kaspa';

const xOnlyPub = compressedToXOnly(Buffer.from(pub, 'hex'));
const scriptPublicKey = buildP2PKScriptPublicKey(xOnlyPub).toString('hex');

4. Building a Transaction

import { TransactionBuilderFactory, Transaction } from '@bitgo/sdk-coin-kaspa';
import { coins } from '@bitgo/statics';
import type { KaspaUtxoInput } from '@bitgo/sdk-coin-kaspa';

const utxo: KaspaUtxoInput = {
  transactionId: '<64-char-hex-prev-tx-id>',
  transactionIndex: 0,
  amount: '100000000',      // 1 KASPA in sompi (1e8)
  scriptPublicKey: '<hex>', // P2PK script of the sender's key
  sequence: '0',
  sigOpCount: 1,
};

const factory = new TransactionBuilderFactory(coins.get('kaspa'));
const builder = factory.getBuilder();

builder
  .addInput(utxo)
  .to('kaspa:qq...recipient...', '99998000') // amount in sompi
  .fee('2000');

const tx = (await builder.build()) as Transaction;

Multiple inputs:

builder
  .addInput(utxo1)
  .addInput(utxo2)
  .to(recipientAddress, '299996000')
  .fee('4000');

5. Signing — Path A: Direct Private Key (non-TSS)

// `tx.sign` takes a 32-byte Buffer (raw private key)
tx.sign(Buffer.from(privateKeyHex, 'hex'));

// Signs every input at once. Fully signed → txHex; partial → halfSigned
const signedTxHex = tx.toHex(); // SDK-internal format for round-trips

// Or via the coin interface:
const result = await kaspa.signTransaction({
  txPrebuild: { txHex: unsignedTxHex },
  prv: privateKeyHex,
} as any) as { txHex: string };

6. Signing — Path B: TSS / MPC (per-input DKLS sessions)

Kaspa is UTXO-based: every input has its own sighash (Blake2b-256, BIP-143-like). Each input requires an independent DKLS session — there is no way to produce N valid Schnorr signatures from a single signing operation.

const unsignedTx = (await builder.build()) as Transaction;
const txHex = unsignedTx.toHex();

// Step 1: one sighash Buffer per input — the messages for each DKLS session
const sighashes: Buffer[] = unsignedTx.signablePayloads; // Buffer[N]

// Step 2: run N DKLS sessions in parallel (one per sighash)
// Each session produces a 64-byte raw Schnorr signature

// Step 3: collect results and call signTransaction
const signatures = sighashes.map((hash, inputIndex) => ({
  inputIndex,
  pubKey: compressedPubKeyHex,          // 33-byte hex
  signature: dklsSession(hash),         // 64-byte hex Schnorr sig
}));

const result = await kaspa.signTransaction({
  txPrebuild: { txHex },
  signatures,
} as any) as { txHex: string } | { halfSigned: { txHex: string } };

// result.txHex      → all inputs signed
// result.halfSigned → some inputs still unsigned (partial TSS round)

7. Broadcasting

// toBroadcastFormat() returns the Kaspa RPC-compatible JSON string
const broadcastPayload = tx.toBroadcastFormat();

// toHex() is the SDK-internal round-trip format (preserves amount + scriptPublicKey
// on inputs for sighash recomputation). Do NOT send this to the Kaspa node directly.
const internalHex = tx.toHex();

8. Explaining / Parsing a Transaction

// Human-readable breakdown
const explained = await kaspa.explainTransaction({ txHex });
console.log(explained.outputs);      // [{ address, amount }]
console.log(explained.outputAmount); // total sent (sompi)
console.log(explained.fee);          // fee (sompi)

// Structured parse — inputs and outputs tagged with coin name
const parsed = await kaspa.parseTransaction({ txHex } as any);
// { inputs: [{ amount, coin: 'kaspa' }], outputs: [{ address, amount, coin: 'kaspa' }] }

9. Verifying a Transaction

const valid = await kaspa.verifyTransaction({
  txPrebuild: { txHex },
  txParams: {
    recipients: [{ address: 'kaspa:qq...', amount: '99998000' }],
  },
} as any);

console.log(valid); // true

10. Coin Properties

kaspa.getChain();        // 'kaspa'
kaspa.getFamily();       // 'kaspa'
kaspa.getFullName();     // 'Kaspa'
kaspa.getBaseFactor();   // 100_000_000  (sompi per KASPA)
kaspa.supportsTss();     // true
kaspa.getMPCAlgorithm(); // 'ecdsa'

tkaspa.getChain();       // 'tkaspa'
tkaspa.getFullName();    // 'Testnet Kaspa'

Key Constants

PropertyValue
1 KASPA100_000_000 sompi
getBaseFactor()1e8
Mainnet address prefixkaspa:
Testnet address prefixkaspatest:
Address typeP2PK Schnorr (x-only secp256k1)
Signature algorithmSchnorr (Blake2b-256 sighash)
TSS algorithmecdsa (DKLS)
Multisig typeonchain

Module Structure

src/
├── kaspa.ts                    # AbstractKaspaLikeCoin, Kaspa, Tkaspa classes
├── register.ts                 # SDK registration helper
├── index.ts
└── lib/
    ├── constants.ts            # Chain constants (prefixes, decimals, default fee)
    ├── iface.ts                # TypeScript interfaces
    ├── keyPair.ts              # secp256k1 key pair + address derivation
    ├── sighash.ts              # Blake2b-256 Schnorr sighash + script utilities
    ├── transaction.ts          # Transaction class (sign / verify / explain / serialize)
    ├── transactionBuilder.ts   # UTXO transaction builder
    ├── transactionBuilderFactory.ts
    ├── utils.ts                # Address validation and encoding
    └── index.ts
test/
├── fixtures/
│   └── kaspa.fixtures.ts       # Deterministic test vectors
└── unit/
    ├── coin.test.ts
    ├── keyPair.test.ts
    ├── transaction.test.ts
    ├── transactionBuilder.test.ts
    └── utils.test.ts

Address Format

Kaspa uses a custom cashaddr-like bech32 encoding:

  • Mainnet: kaspa:<bech32-encoded-data>
  • Testnet: kaspatest:<bech32-encoded-data>
  • Version byte 0 = Schnorr P2PK (x-only secp256k1 pubkey)

Signing

Kaspa uses Schnorr signatures over secp256k1 with a Blake2b-256 sighash. The sighash preimage follows the Kaspa BIP-143-like specification. Each input is signed independently, producing a 65-byte signature: 64 bytes Schnorr + 1 byte sighash type (0x01 = SIGHASH_ALL).

References

版本与发布记录

@bitgo/sdk-coin-kaspa 共发布 54 个版本,首次发布于 2026/04/23;过去 12 个月发布了 54 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.3.50latest2026/11/062 天前
1.3.492026/11/044 天前
1.3.482026/10/309 天前
1.3.472026/10/2711 天前
1.3.462026/10/2316 天前
1.3.452026/10/2217 天前

关于 @bitgo/sdk-coin-kaspa 的常见问题

@bitgo/sdk-coin-kaspa 是什么?

BitGo's SDK coin library for Kaspa (KASPA)

如何安装 @bitgo/sdk-coin-kaspa?

在项目目录运行 npm install @bitgo/sdk-coin-kaspa,或使用 pnpm add / yarn add / bun add。

@bitgo/sdk-coin-kaspa 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bitgo/sdk-coin-kaspa 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@bitgo/sdk-coin-kaspa 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bitgo/sdk-coin-kaspa 可以商用吗?

@bitgo/sdk-coin-kaspa 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bitgo/sdk-coin-kaspa 的下载量有多少?

根据 npm 官方下载统计,@bitgo/sdk-coin-kaspa 在 2026/10/08 – 2026/11/06 这 30 天内被下载 6,184 次,日均约 206 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bitgo/sdk-coin-kaspa 还在维护吗?

最新版本 1.3.50 发布于 2026/11/06(2 天前);至今共发布 54 个版本,其中过去 12 个月发布了 54 个;首次发布于 2026/04/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。