比特幣 SDK 完整使用指南
本指南深入介紹主流比特幣 SDK 的使用方法,幫助開發者快速上手比特幣應用開發。
比特幣 SDK 完整使用指南
本指南深入介紹主流比特幣 SDK 的使用方法,幫助開發者快速上手比特幣應用開發。
SDK 總覽
語言生態
| 語言 | 主要 SDK | 活躍度 | 文件完整性 |
|---|---|---|---|
| JavaScript | bitcoinjs-lib | 高 | 良好 |
| Python | python-bitcoinlib | 高 | 良好 |
| Rust | rust-bitcoin | 高 | 良好 |
| Go | btcd/btcutil | 高 | 良好 |
| Java | bitcoinj | 中 | 良好 |
| Swift | BitcoinKit | 中 | 一般 |
bitcoinjs-lib 完整教學
環境設定
npm install bitcoinjs-lib
npm install tiny-secp256k1
npm install ecpair
npm install bip32
npm install bip39
金鑰管理
BIP-39 助記詞
const { payments, dummy } = require('bitcoinjs-lib');
const { ECPairFactory } = require('ecpair');
const tinysecp = require('tiny-secp256k1');
const { BIP32Factory } = require('bip32');
const bip39 = require('bip39');
const ECPair = ECPairFactory(tinysecp);
const BIP32 = BIP32Factory(tinysecp);
// 從助記詞生成錢包
const mnemonic = bip39.generateMnemonic();
const seed = await bip39.mnemonicToSeed(mnemonic);
const root = BIP32.fromSeed(seed, bitcoin.networks.bitcoin);
// 派生路徑
// m/84'/0'/0'/0/0 - Native SegWit (Bech32)
// m/49'/0'/0'/0/0 - SegWit (P2SH)
// m/44'/0'/0'/0/0 - Legacy (P2PKH)
const child = root.derivePath("m/84'/0'/0'/0/0");
const keyPair = ECPair.fromPrivateKey(child.privateKey);
console.log(`助記詞: ${mnemonic}`);
console.log(`地址: ${payments.p2wpkh({ pubkey: keyPair.publicKey }).address}`);
地址類型
P2PKH(Legacy)
const keyPair = ECPair.makeRandom({ network: bitcoin.networks.bitcoin });
const { address } = payments.p2pkh({ pubkey: keyPair.publicKey });
// 輸出: 1ABCD...
P2SH(Nested SegWit)
const inner = payments.p2wpkh({ pubkey: keyPair.publicKey });
const { address } = payments.p2sh({ redeem: inner });
// 輸出: 3ABCD...
P2WPKH(Native SegWit)
const { address } = payments.p2wpkh({ pubkey: keyPair.publicKey });
// 輸出: bc1qABCD...
P2WSH(P2TR - Taproot)
const { pubkey } = payments.p2tr({
internalPubkey: keyPair.publicKey.slice(1, 33) // 移除奇偶標記
});
// 輸出: bc1pABCD...
交易建構
完整交易範例
const bitcoin = require('bitcoinjs-lib');
const { ECPairFactory } = require('ecpair');
const tinysecp = require('tiny-secp256k1');
const axios = require('axios');
const ECPair = ECPairFactory(tinysecp);
const network = bitcoin.networks.bitcoin;
async function sendBitcoin(fromPrivateKey, toAddress, amountSatoshi) {
// 1. 建立密鑰對
const keyPair = ECPair.fromWIF(fromPrivateKey, network);
const fromAddress = bitcoin.payments.p2wpkh({ pubkey: keyPair.publicKey }).address;
// 2. 獲取 UTXO
const utxos = await axios.get(
`https://blockstream.info/api/address/${fromAddress}/utxo`
);
// 3. 估算礦工費
const feeRates = await axios.get('https://blockstream.info/api/fee-estimates');
const feeRate = Math.ceil(feeRates.data.hourFee);
// 4. 計算金額
const utxo = utxos.data[0];
const fee = 225 * feeRate; // 預估交易大小
const sendAmount = amountSatoshi;
const changeAmount = utxo.value - sendAmount - fee;
if (changeAmount < 0) throw new Error('餘額不足');
// 5. 建立交易
const txb = new bitcoin.TransactionBuilder({
network,
maximumFeeRate: 1000 // sat/vB
});
txb.addInput(utxo.txid, utxo.vout, undefined, Buffer.from('0020' + '00'.repeat(32), 'hex'));
txb.addOutput(toAddress, sendAmount);
txb.addOutput(fromAddress, changeAmount);
// 6. 簽名
txb.sign(0, keyPair, undefined, bitcoin.Transaction.SIGHASH_ALL, utxo.value);
// 7. 廣播
const txHex = txb.build().toHex();
const result = await axios.post('https://blockstream.info/api/tx', txHex);
return result.data;
}
PSBT 交易
建立 PSBT
const { Psbt } = require('bitcoinjs-lib');
function createPSBT(keyPair, utxos, toAddress, amount) {
const psbt = new Psbt({ network });
// 添加輸入
utxos.forEach(utxo => {
psbt.addInput({
hash: utxo.txid,
index: utxo.vout,
witnessUtxo: {
script: Buffer.from('0020' + '00'.repeat(32), 'hex'),
value: utxo.value
}
});
});
// 添加輸出
psbt.addOutput({
address: toAddress,
value: amount
});
return psbt;
}
python-bitcoinlib 完整教學
安裝
pip install python-bitcoinlib
基本操作
金鑰生成
from bitcoin import SelectParams
from bitcoin.wallet import CBitcoinSecret, P2PKHAddress
from bitcoin.core import x, b2x
# 選擇網路
SelectParams('mainnet')
# 生成私鑰
secret = CBitcoinSecret.from_random()
# 取得地址
address = P2PKHAddress.from_pubkey(secret.pub)
print(f"私鑰: {secret}")
print(f"地址: {address}")
創建交易
from bitcoin.transaction import Transaction, TxIn, TxOut, sign_transaction
# 創建交易
tx = Transaction()
tx.version = 1
# 添加輸入
tx.add_input(TxIn(
prev_tx=bytes.fromhex('...' * 32),
prev_index=0
))
# 添加輸出
tx.add_output(TxOut(
nValue=100000, # satoshi
scriptPubKey=bytes.fromhex('...') # 目標地址腳本
))
# 簽名交易
signed_tx = sign_transaction(tx, [private_key])
print(signed_tx.hex())
rust-bitcoin 完整教學
Cargo.toml 依賴
[dependencies]
rust-bitcoin = "0.30"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
金鑰與地址
use rust_bitcoin::util::address::Address;
use rust_bitcoin::util::key::PrivateKey;
use rust_bitcoin::network::constants::Network;
use rust_bitcoin::secp256k1::Secp256k1;
fn main() {
let secp = Secp256k1::new();
// 生成私鑰
let mut rng = rand::thread_rng();
let (_, private_key) = secp.generate_keypair(&mut rng);
let priv_key = PrivateKey::new(private_key, Network::Bitcoin);
// 生成地址
let pub_key = priv_key.public_key(&secp);
let address = Address::p2wpkh(&pub_key, Network::Bitcoin).unwrap();
println!("私鑰: {}", priv_key);
println!("地址: {}", address);
}
交易處理
use rust_bitcoin::consensus::encode::serialize;
use rust_bitcoin::Transaction;
fn create_transaction() -> Transaction {
Transaction {
version: 1,
input: vec![],
output: vec![],
lock_time: 0,
}
}
fn main() {
let tx = create_transaction();
let serialized = serialize(&tx);
println!("{}", hex::encode(serialized));
}
btcd (Go) 完整教學
基礎連接
package main
import (
"fmt"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/rpcclient"
"github.com/btcsuite/btcd/chaincfg/chainhash"
)
func main() {
connCfg := &rpcclient.ConnConfig{
Host: "localhost:8332",
User: "user",
Pass: "pass",
HTTPPostMode: true,
DisableTLS: true,
}
client, err := rpcclient.New(connCfg, nil)
if err != nil {
panic(err)
}
defer client.Shutdown()
// 獲取最佳區塊哈希
hash, err := client.GetBestBlockHash()
fmt.Println(hash)
// 獲取餘額
balance, err := client.GetBalanceMin(1)
fmt.Println(balance)
}
發送交易
func sendToAddress(client *rpcclient.Client, toAddress string, amount float64) (string, error) {
return client.SendToAddress(toAddress, amount, "send", "memo", true)
}
SDK 比較與選擇
功能比較
| 功能 | bitcoinjs-lib | python-bitcoinlib | rust-bitcoin |
|---|---|---|---|
| 地址生成 | ✓ | ✓ | ✓ |
| 交易簽名 | ✓ | ✓ | ✓ |
| PSBT | ✓ | 部分 | ✓ |
| SPV | ✓ | ✓ | ✓ |
| 腳本編寫 | ✓ | ✓ | ✓ |
| Taproot | ✓ | ✓ | ✓ |
選擇建議
- Web 應用:bitcoinjs-lib
- 後端服務:python-bitcoinlib, btcd
- 高效能需求:rust-bitcoin
- 區塊鏈瀏覽器:btcd
常見問題
Q:選擇哪個 SDK 開始開發?
A:如果是 Web 開發,推薦 bitcoinjs-lib;Python 後端推薦 python-bitcoinlib。
Q:如何處理比特幣精度問題?
A:始終使用 satoshi(最小單位)進行計算,最後才轉換為 BTC 顯示。
Q:SDK 是否支援所有比特幣升級?
A:主流 SDK 通常會在新功能發布後數週內支援,請檢查最新版本。
Q:如何確保交易費用合理?
A:使用 fee API(如 mempool.space)獲取建議費用率。
Q:比特幣測試用哪個網路?
A:開發期間使用 regtest,功能完成後使用 testnet 測試。
相關連結
相關文章
- 比特幣開發環境完整搭建指南 — 本指南協助開發者從零開始搭建比特幣開發環境,涵蓋不同技術棧的開發需求。
- 比特幣測試網完整指南 — 深入介紹比特幣測試網路(Testnet)和回歸測試網路(RegTest)的使用方法和最佳實踐。
- 比特幣生態系統數據儀表板完整教學:工具比較與自建指南 — 全面介紹比特幣生態系統中的主要數據監控工具,包括區塊鏈瀏覽器、專業分析平台、費用估算工具等,並提供自建比特幣數據監控系統的實務教學。
- 比特幣基礎設施完整教學:從零建構節點與挖礦系統 — 深入教學如何自建節點、選擇 ASIC 礦機、理解礦池運作機制,以及為何運行自己的節點至關重要。
- 比特幣錢包完整比較 — 深入比較市場主流比特幣錢包的功能特性、安全性與適用場景,幫助用戶選擇最適合的錢包解決方案。
延伸閱讀與來源
這篇文章對您有幫助嗎?
請告訴我們如何改進:
0 人覺得有帮助
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!