比特幣 SDK 完整使用指南

本指南深入介紹主流比特幣 SDK 的使用方法,幫助開發者快速上手比特幣應用開發。

比特幣 SDK 完整使用指南

本指南深入介紹主流比特幣 SDK 的使用方法,幫助開發者快速上手比特幣應用開發。

SDK 總覽

語言生態

語言主要 SDK活躍度文件完整性
JavaScriptbitcoinjs-lib良好
Pythonpython-bitcoinlib良好
Rustrust-bitcoin良好
Gobtcd/btcutil良好
Javabitcoinj良好
SwiftBitcoinKit一般

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-libpython-bitcoinlibrust-bitcoin
地址生成
交易簽名
PSBT部分
SPV
腳本編寫
Taproot

選擇建議

常見問題

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 測試。

相關連結

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!