@alexbosworth/blockchain

中文文档
4.12.0发布于 2026/10/17MIT零依赖近 30 天下载 3.3万

区链数据实用方法

中文使用文档
文档目录32 节
  1. 方法
  2. 压缩输入数
  3. 交易组件
  4. 解码Base58
  5. 解码Base58 地址
  6. 解码Bech32 地址
  7. 解码Wif
  8. 编码Base58 地址
  9. 编码Bech32 地址
  10. hashForP2pkh 维基百科中的相关条目: 花生花
  11. hashForP2wpkh 页面存档备份,存于互联网档案馆
  12. idForBlock 数据
  13. 用于交易
  14. idFor 交易组件
  15. 无锁定时间Id用于交易
  16. 非WitnessHashto 签名
  17. 数字AsCompactInt
  18. 输出脚本格式
  19. p2ms 脚本
  20. p2pkh 输出脚本
  21. p2sh 输出脚本
  22. p2tr 输出脚本
  23. p2wpkh 输出脚本
  24. p2wsh 输出脚本
  25. 上一个块
  26. 查询
  27. 脚本脚本元素
  28. 脚本元素
  29. 交易大小
  30. 来自组件的交易
  31. 未签名的Tx 从 Psbt
  32. v0Hashto 签名

区链

与区块链数据合作的通用方法

方法

压缩输入数

将整数转换为正则数

{
  encoded: <Compact Integer Encoded Number Buffer Object>
  [start]: <Buffer Offset Start Index Number>
}

@returns
{
  bytes: <Byte Count Number>
  number: <Integer Number>
}

示例

const {compactIntAsNumber} = require('@alexbosworth/blockchain');

// Decode the plain number from the encoded compact int bytes
const {number} = compactIntAsNumber({encoded: Buffer.from('fdfd00', 'hex')});

交易组件

获取十六进制编码交易的组件

{
  transaction: <Hex Encoded Transaction String>
}

@throws
<Error>

@returns
{
  inputs: [{
    id: <Spending Transaction Id Hex String>
    script: <ScriptSig Script Hex String>
    sequence: <Sequence Number>
    vout: <Spending Transaction Output Index Number>
    [witness]: [<Script Stack Element Hex String>]
  }]
  locktime: <Timelock nLockTime Number>
  outputs: [{
    script: <ScriptPub Script Hex String>
    tokens: <Tokens Count Number>
  }]
  version: <Version Number>
}

解码Base58

解码一个已编码的字符串进入其有效载荷

{
  encoded: <Base58Check Encoded String>
}

@throws
<Error> when the string has invalid characters or a bad checksum

@returns
{
  payload: <Decoded Payload Buffer Object>
}

解码Base58 地址

来自基数58地址字符串的衍生输出散列和版本数据

{
  address: <Base58 Encoded Address String>
}

@throws
<Error>

@returns
{
  hash: <Output Hash Buffer Object>
  version: <Script Version Byte Number>
}

解码Bech32 地址

解码 Bech32 地址字符串以获取地址细节

{
  address: <Bech32 Encoded Address String>
}

@throws
<Error>

@returns
{
  prefix: <Human Readable Prefix String>
  program: <Output Data Buffer Object>
  version: <Witness Version Number>
}

解码Wif

解码 WIF 编码的私钥

以压缩形式生成公钥 is_compressed 真实

未指定网络时, 接受任何已知网络的WIF

所支持的网络: btc, btcregtest, btcsignet, btctestnet4

{
  [network]: <Network Name String>
  wif: <WIF Encoded Private Key String>
}

@throws
<Error>

@returns
{
  is_compressed: <Public Key Is Compressed Bool>
  private_key: <Private Key Buffer Object>
}

示例

const {createECDH} = require('node:crypto');

const {decodeWif} = require('@alexbosworth/blockchain');

// Decode the private key and the public key compression from a mainnet WIF
const {is_compressed, private_key} = decodeWif({
  network: 'btc',
  wif: 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617',
});

// The WIF signals if the public key is compressed or uncompressed
const format = is_compressed ? 'compressed' : 'uncompressed';

const ecdh = createECDH('secp256k1');

// Derive the public key from the private key
ecdh.setPrivateKey(private_key);

const publicKey = ecdh.getPublicKey(null, format);

编码Base58 地址

将输出散列和版本数据编码为基数58地址字符串

{
  hash: <Output Hash Buffer Object>
  version: <Script Version Byte Number>
}

@throws
<Error>

@returns
{
  address: <Base58 Encoded Address String>
}

示例

const {encodeBase58Address, hashForP2pkh} = require('@alexbosworth/blockchain');

// The P2PKH output hash is the hash160 of the compressed public key
const {hash} = hashForP2pkh({key: publicKey});

// Encode the P2PKH address paying to the public key hash
const {address} = encodeBase58Address({hash, version: 0});

编码Bech32 地址

作为 Bech32 地址字符串编码地址细节

{
  prefix: <Human Readable Prefix String>
  program: <Output Data Buffer Object>
  version: <Witness Version Number>
}

@throws
<Error>

@returns
{
  address: <Bech32 Encoded Address String>
}

示例

const {encodeBech32Address, hashForP2wpkh} = require('@alexbosworth/blockchain');

// The P2WPKH witness program is the hash160 of the compressed public key
const {hash} = hashForP2wpkh({key: publicKey});

// Encode the P2WPKH address paying to the public key hash
const {address} = encodeBech32Address({
  prefix: 'bc',
  program: hash,
  version: 0,
});

hashForP2pkh 维基百科中的相关条目: 花生花

通过 P2PKH 获得公用钥匙的散列160

使用 hash 与 p2pkhOutputScript p2PKH 输出脚本

{
  key: <Public Key Buffer Object>
}

@throws
<Error>

@returns
{
  hash: <Public Key Hash160 Buffer Object>
}

hashForP2wpkh 页面存档备份,存于互联网档案馆

通过 P2WPKH 获得公用钥匙的大麻花序160

使用 hash 与 p2wpkhOutputScript p2WPKH 输出脚本

{
  key: <Public Key Buffer Object>
}

@throws
<Error>

@returns
{
  hash: <Public Key Hash160 Buffer Object>
}

idForBlock 数据

获得一个区块的ID:区块头的双沙256散列

{
  block: <Hex Encoded Block Data String>
}

@throws
<Error>

@returns
{
  id: <Block Id Hex Encoded String>
}

用于交易

为生序式 tx 设定标准交易ID

{
  transaction: <Hex Encoded Transaction String>
}

@throws
<Error>

@returns
{
  id: <Transaction Id Hex Encoded String>
}

idFor 交易组件

从交易组件中确定交易编号

注意: 记住输入的散列是正常 tx id 的倒转字节顺序

{
  inputs: [{
    hash: <Spending Internal Byte Order Transaction Id Buffer Object>
    script: <Script Buffer Object>
    sequence: <Sequence Number>
    vout: <Spending Transaction Output Index Number>
  }]
  locktime: <Timelock nLockTime Number>
  outputs: [{
    script: <Output Script Buffer Object>
    tokens: <Tokens Count Number>
  }]
  version: <Version Number>
}

@throws
<Error>

@returns
{
  id: <Transaction Id Hex String>
}

无锁定时间Id用于交易

获取有目击数据的交易的ID, 以及未包含的时间

{
  buffer: <Data Buffer Object>
  [start]: <Starting Offset Index Number>
}

@throws
<Error>

@returns
{
  id: <No nLockTime Transaction Id Hex String>
}

非WitnessHashto 签名

计算要签名的 SegWit 交易散列

对于 P2PK, P2PKH, 或赤色多相格, 脚本是正在花费的输出脚本

P2SH 的脚本是将脚本混入输出脚本的赎回脚本

当代码分隔符被执行时, 只通过它后面的脚本, 任何 散开前从脚本中去除剩余的代码分隔符

单一输出的签名需要匹配输入索引的输出

{
  script: <Signing Input Script Hex String>
  [sighash]: <Signature Hash Type Number>
  transaction: <Raw Transaction Hex String>
  vin: <Signing Transaction Input Index Number>
}

@throws
<Error>

@returns
{
  hash: <Hash to Sign Hex String>
}

数字AsCompactInt

将数字转换为紧凑的大小整数序列化

{
  number: <Amount to Convert to Compact Integer Serialization Number>
}

@throws
<Error>

@returns
{
  encoded: <Serialized Compact Integer Buffer Object>
}

输出脚本格式

获取地址的输出脚本

支持地址: P2PKH, P2SH, P2WPKH, P2WSH, P2TR, 未来 segwit 版本

所支持的网络: btc, btcregtest, btcsignet, btctestnet4

{
  address: <Address String>
  network: <Network Name String>
}

@throws
<Error>

@returns
{
  script: <Output Script Hex String>
}

示例

const {outputScriptForAddress} = require('@alexbosworth/blockchain');

// Get the output script to pay to an address
const {script} = outputScriptForAddress({
  address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4',
  network: 'btc',
});

p2ms 脚本

获取多相脚本和脚本散列来支付脚本

使用 hash 与 p2wshOutputScript p2WSH 输出脚本

{
  keys: [<Public Key Buffer Object>]
  required: <Signatures Required Count Number>
}

@throws
<Error>

@returns
{
  hash: <Witness Script SHA256 Hash Buffer Object>
  script: <Multisig Script Buffer Object>
}

示例

const {p2msScript, p2wshOutputScript} = require('@alexbosworth/blockchain');

// Derive the 2-of-3 multisig script and its witness script hash
const {hash} = p2msScript({keys: publicKeys, required: 2});

// Get the P2WSH output script paying to the multisig script
const {script} = p2wshOutputScript({hash});

p2pkh 输出脚本

获得公钥 Hash 输出脚本

{
  hash: <Public Key Hash Buffer Object>
}

@throws
<Error>

@returns
{
  script: <Output Script Buffer Object>
}

p2sh 输出脚本

获取对脚本的付费 Hash 输出脚本

{
  hash: <Script Hash Buffer Object>
}

@throws
<Error>

@returns
{
  script: <Output Script Buffer Object>
}

p2tr 输出脚本

获取报酬到磁带输出脚本

{
  hash: <Taproot Hash Buffer Object>
}

@throws
<Error>

@returns
{
  script: <Output Script Buffer Object>
}

p2wpkh 输出脚本

获取给目击公钥 Hash 输出脚本

{
  hash: <Witness Public Key Hash Buffer Object>
}

@throws
<Error>

@returns
{
  script: <Output Script Buffer Object>
}

p2wsh 输出脚本

获取给目击脚本 Hash 输出脚本

{
  hash: <Witness Script Hash Buffer Object>
}

@throws
<Error>

@returns
{
  script: <Output Script Buffer Object>
}

上一个块

鉴于一个生块, 返回上一个块 ID

{
  block: <Hex Encoded Block String>
}

@throws
<Error>

@returns
{
  previous: <Previous Block Id Hex String>
}

查询

在块内查找匹配的交易

{
  block: <Hex Encoded Raw Block String>
  [ids]: [<Transaction Id Hex String>]
  [outputs]: [<Output Script Hex String>]
}

@throws
<Error>

@returns
{
  outputs: [{
    script: <Output Script Hex String>
    tokens: <Output Value Number>
    transaction_id: <Transaction Id Hex String>
    transaction_vout: <Transaction Output Index Number>
  }]
  transactions: [{
    id: <Transaction Id Hex String>
    transaction: <Hex Encoded Raw Transaction String>
  }]
}

脚本脚本元素

将序列化的脚本映射到脚本元素阵列

{
  script: <Script Hex String>
}

@throws
<Error>

@returns
{
  [elements]: [<Data Buffer>, <Script OP_CODE Number>]
}

脚本元素

将脚本缓冲元素的阵列映射到一个完全成形的脚本

{
  elements: [<Data Buffer>, <Script OP_CODE Number>]
}

@throws
<Error>

@returns
{
  script: <Script Hex String>
}

交易大小

获取六进制编码交易的重量和虚拟大小

{
  transaction: <Hex Encoded Transaction String>
}

@throws
<Error>

@returns
{
  vsize: <Transaction Virtual Size Number>
  weight: <Transaction Weight Units Number>
}

来自组件的交易

从其组成部分中形成六进制编码交易

{
  inputs: [{
    id: <Spending Transaction Id Hex String>
    script: <ScriptSig Script Hex String>
    sequence: <Sequence Number>
    vout: <Spending Transaction Output Index Number>
    [witness]: [<Script Stack Element Hex String>]
  }]
  locktime: <Timelock nLockTime Number>
  outputs: [{
    script: <ScriptPub Script Hex String>
    tokens: <Tokens Count Number>
  }]
  version: <Version Number>
}

@throws
<Error>

@returns
{
  transaction: <Hex Encoded Transaction String>
}

未签名的Tx 从 Psbt

从 PSBT 获取未签名的交易

{
  psbt: <PSBT Hex String>
}

@throws
<Error>

@returns
{
  transaction: <Unsigned Transaction Buffer Object>
}

v0Hashto 签名

计算要签名的 v0 证人交易散列

脚本是用于输出的 BIP 143 脚本代码

P2WPKH的脚本代码是公钥散列的P2PKH脚本h

P2WSH 的脚本代码是目击脚本

{
  script: <Signing Input Script Hex String>
  [sighash]: <Signature Hash Type Number>
  tokens: <Spending Output Tokens Number>
  transaction: <Raw Transaction Hex String>
  vin: <Signing Transaction Input Index Number>
}

@throws
<Error>

@returns
{
  hash: <Hash to Sign Hex String>
}

版本与发布记录

@alexbosworth/blockchain 共发布 32 个版本,首次发布于 2023/05/14;过去 12 个月发布了 22 个版本。

版本发布日期距今
4.12.0latest2026/10/1721 天前
4.11.02026/10/0929 天前
4.10.02026/10/041 个月前
4.9.02026/10/011 个月前
4.8.02026/09/032 个月前
4.7.22026/09/022 个月前

关于 @alexbosworth/blockchain 的常见问题

@alexbosworth/blockchain 是什么?

区链数据实用方法

如何安装 @alexbosworth/blockchain?

在项目目录运行 npm install @alexbosworth/blockchain,或使用 pnpm add / yarn add / bun add。

@alexbosworth/blockchain 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/alexbosworth__blockchain 是否存在。

@alexbosworth/blockchain 需要什么版本的 Node.js?

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

@alexbosworth/blockchain 可以商用吗?

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

@alexbosworth/blockchain 的下载量有多少?

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

@alexbosworth/blockchain 还在维护吗?

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