手把手教你用 bitcoinjs-lib 生成比特币地址并查询余额

·

比特币地址、私钥、UTXO、btclib——你是不是经常被这些名词绕晕?今天这篇指南将用不到 10 分钟时间,带你用 JavaScript 中最流行的工具箱 bitcoinjs-lib,在 Testnet 上亲手创建第一个比特币地址,并为它查余额。内容兼顾小白友好与开发者可用,示例代码可以直接复制进 VSCode 跑起来。


你需要提前准备的三样东西


比特币地址类型快速扫盲

所有 比特币地址 归根结底都是“某段脚本格式化后的哈希值”,只是表现层紧跟三次技术升级,于是出现下列 4 类地址:

分类前缀关键特征适合场景
SegWit Native(P2WPKH)bc1q隔离见证,无签名时可进一步压缩区块日常小额转账
SegWit P2SH(P2WSH-in-P2SH)3“向后兼容”+“隔离见证”兼得旧钱包不升级也能给你转账
Legacy P2PKH1经典格式、全网兼容、但体积最大历史流程
多签地址3bc1q(取决于封装)3/4、2/3 等门限签名DAO、公司财务
💡 隔离见证(SegWit)本质是 BIP-141 软分叉,降低了交易 malleability 与矿工费。
bitcoinjs-lib 对上述格式全部支持,你只需一行参数即可切换网络与脚本类型。

场景 A:3 分钟创建你的第一个 Testnet 钱包

Step 1:项目初始化

mkdir btc-wallet-demo && cd btc-wallet-demo
npm init -y
npm i bitcoinjs-lib@^6.1.5 ecpair@^2.1.0 tiny-secp256k1@^2.2.3

Step 2:写一段最简洁的钥匙工厂

// index.js
const bitcoin = require('bitcoinjs-lib');
const ECPairFactory = require('ecpair').default;
const ecc = require('tiny-secp256k1');

const ECPair = ECPairFactory(ecc);
const NET = bitcoin.networks.testnet;

async function createWallet() {
  const keyPair = ECPair.makeRandom({ network: NET });
  const { address } = bitcoin.payments.p2pkh({
    pubkey: keyPair.publicKey,
    network: NET
  });
  const pk = keyPair.toWIF();
  console.log('地址:', address);
  console.log('私钥:', pk);
  require('fs').writeFileSync('wallet.json', JSON.stringify({ address, pk }, null, 2));
}

createWallet();

运行 node index.js,你会得到一段输出和新的 wallet.json 文件,里面就是你的新地址和私钥。
👀 切记:私钥内容不要泄露, tester 仅用于测试网,千万别映射到主网 UTXO。

Q1:Testnet BTC 哪里领取?

A:热门水龙头如 coinfaucet.eu 每天早上刷新 0.0001 BTC,填写你的地址即可。


场景 B:用免费 API 查询余额

查询区块高度或某个地址的余额,不一定需要自己跑全节点。这里用 Blockbook 插件(已集成 JSON-RPC),可直接返回 UTXO 列表余额

👉 点这里看看如何用 3 行代码查询实时余额 3 行代码详解

调用示例:

// balance.js
const axios = require('axios');
async function getBalance(address) {
  const url = `https://your-qn-endpoint.blockbook.api/balance/${address}`;
  const { data } = await axios.get(url);
  console.log('余额 (Satoshi):', data.balance);
}
getBalance('miBB7mp8…测试网地址');

常见返回值字段:balance(未花费输出总和)、txids(所有交易 ID)、unconfirmedBalance(临时转账池余额)。


高频问题 FAQ

Q2:P2PKH 与 P2WPKH 手续费差多少?
A:实测 2024 Q4 数据,200 byte 交易节省约 35% miner fee。只有当网络阻塞时差异更明显。

Q3:bitcoinjs-lib 为什么不内置浏览器端 WebCrypto?
A:库作者优先支持 node、cjs、esm。浏览器场景需打包工具(webpack/Vite)自己引入 @node-lightning/crypto@noble/secp256k1 替代 tiny-secp256k1

Q4:如何批量生成 10 个地址?
A:只需把 ECPair.makeRandom() 放循环里,再加一个数组收集即可。注意保存对应私钥到本地 .env 级别文件并加密。

Q5:主网与测试网地址前缀会不会混淆?
A:不会。bc1q vs tb1q3 vs 2,肉眼可辨,脚本中更可显式写 bitcoin.networks.mainnet or testnet,绝不会错。

Q6:私钥丢了能找回余额吗?
A:不能。所有 DeFi / CeFi 不托管私钥,丢掉就是消失在 hash 世界,建议多重备份(硬件钱包+纸质备份)。


5 行代码升级到 SegWit Native

为未来主线网络直播更省 fee,把脚本改成 P2WPKH(Bech32)即可:

const { address } = bitcoin.payments.p2wpkh({
  pubkey: keyPair.publicKey,
  network: NET
});

前缀会由 m… Testnet 变为 tb1q…,你会看到地址长度更短且全部小写。


把地址可视化:实时余额监控

官方示例库已提供 React + WebSocket 版本,动态监听 mempool 交易。把它们改成

场景虽小,学到位后能迁移到 Lightning Network、Taproot、Ordinals 等新协议。

👉 想一步到位的实战模板?直接戳这里拿代码 极速搭建可视化面板

结语与拓展阅读

恭喜你,已经掌握用 bitcoinjs-lib 生成比特币地址的完整链路。下一步可尝试:

保持好奇、少量但频繁地测试网实战,才是真正“知行合一”。

如果你在多签脚本编码、WordPress 钱包插件,或是想看彩色币教程,欢迎留言;我们后续会持续补充实战示例,用最接地气的方式边学边赢。