Skip to content

useRpc

管理與 Kaspa 節點的 WebSocket RPC 連線。提供響應式連線狀態,以及用於查詢區塊鏈和訂閱事件的方法。

匯入

ts
import { useRpc } from 'vue-kaspa'

簽名

ts
function useRpc(options?: RpcOptions): UseRpcReturn

傳入 options 以覆蓋此可組合函式實例的插件設定。省略則使用插件預設值。

連線狀態

連線狀態為單例——所有呼叫 useRpc() 的元件共享相同的響應式 ref。

連線狀態生命週期

disconnected ──► connecting ──► connected
     ▲                              │
     │            (node drops)      │
     └──── reconnecting ◄───────────┘

                  └──► error (after max retries)

自動重連使用指數退避策略,從 1 秒開始,最多 30 秒。

響應式屬性

屬性型別說明
connectionStateReadonly<Ref<RpcConnectionState>>目前的連線狀態
isConnectedComputedRef<boolean>簡寫:connectionState === 'connected'
urlReadonly<Ref<string | null>>已連線的節點 URL(連線後填入)
networkIdReadonly<Ref<string | null>>節點回報的網路 ID
serverVersionReadonly<Ref<string | null>>節點軟體版本字串
isSyncedReadonly<Ref<boolean>>節點是否已完全與網路同步
virtualDaaScoreReadonly<Ref<bigint>>即時 DAA 分數——每個區塊更新
errorReadonly<Ref<Error | null>>最後一次連線錯誤
eventLogReadonly<Ref<RpcEvent[]>>最後 200 個 RPC 事件的環形緩衝區

連線管理

ts
const rpc = useRpc()

// Connect using plugin options
await rpc.connect()

// Connect to a specific node (overrides plugin options)
await rpc.connect({
  url: 'ws://127.0.0.1:17110',
  network: 'mainnet',
})

// Disconnect
await rpc.disconnect()

// Reconnect (disconnect + reconnect with same options)
await rpc.reconnect()

connect() 具有冪等性——在已連線時呼叫不會有任何效果。

如果你需要 txid 查詢、地址歷史、餘額或區塊探索器資料,請使用 useKaspaRest()

查詢方法

所有查詢方法都需要活躍的連線。若節點無法連線或回傳錯誤,它們會拋出 KaspaRpcError

節點資訊

ts
// Full node metadata
const info = await rpc.getInfo()
// { networkId, serverVersion, isSynced, isUtxoIndexEnabled, hasNotifyCommand, hasMessageId }

// Chain block counts
const { blockCount, headerCount } = await rpc.getBlockCount()

// Connectivity check
await rpc.ping()

區塊

ts
const block = await rpc.getBlock('abc123...')
// { hash, timestamp, blueScore, transactions: string[] }

餘額

ts
// Single address
const { address, balance } = await rpc.getBalanceByAddress('kaspa:qr...')

// Multiple addresses (batch)
const results = await rpc.getBalancesByAddresses(['kaspa:qr...', 'kaspa:qs...'])
// results: Array<{ address: string; balance: bigint }>

響應式餘額

如需即時餘額追蹤,建議使用 useUtxo() 而非 getBalanceByAddress()。它會訂閱 UTXO 變更事件並保持餘額響應式更新。

UTXO

ts
const entries = await rpc.getUtxosByAddresses(['kaspa:qr...'])
// entries: UtxoEntry[]

記憶體池

ts
// All mempool entries
const entries = await rpc.getMempoolEntries()
const entriesWithOrphans = await rpc.getMempoolEntries(true)

// Mempool entries for specific addresses
const myEntries = await rpc.getMempoolEntriesByAddresses(['kaspa:qr...'])

手續費

ts
const estimate = await rpc.getFeeEstimate()
// {
//   priorityBucket: { feerate: number, estimatedSeconds: number },
//   normalBuckets:  Array<{ feerate, estimatedSeconds }>,
//   lowBuckets:     Array<{ feerate, estimatedSeconds }>
// }

// Use feerate with useTransaction():
await tx.send({ ..., feeRate: estimate.priorityBucket.feerate })

代幣供應量

ts
const { circulatingCoinSupply, maxCoinSupply } = await rpc.getCoinSupply()

交易提交

ts
// Submit a raw signed transaction (prefer useTransaction().send() for a higher-level API)
const txId = await rpc.submitTransaction(rawTx)

UTXO 訂閱(低階)

ts
// Subscribe the node to send utxos-changed events for these addresses
await rpc.subscribeUtxosChanged(['kaspa:qr...'])

// Unsubscribe
await rpc.unsubscribeUtxosChanged(['kaspa:qr...'])

TIP

useUtxo() 會自動管理訂閱。僅在需要直接控制時才使用這些低階方法。

事件訂閱

ts
const rpc = useRpc()

// Subscribe to events
rpc.on('block-added', (event) => {
  console.log('New block:', event.data, 'at', new Date(event.timestamp))
})

rpc.on('utxos-changed', (event) => {
  console.log('UTXOs changed for addresses:', event.data)
})

rpc.on('virtual-daa-score-changed', (event) => {
  console.log('DAA score:', event.data)
})

// Remove a specific handler
const handler = (event) => { ... }
rpc.on('block-added', handler)
rpc.off('block-added', handler)

在 Vue 元件的 <script setup> 中註冊的處理器會在 onUnmounted 時自動移除。無需手動清理。

所有事件類型

事件觸發時機
connectWebSocket 連線建立
disconnectWebSocket 連線中斷
block-addedDAG 中新增了一個新區塊
virtual-chain-changed虛擬鏈(所選父鏈)被重組
utxos-changed已訂閱地址的 UTXO 發生變更
finality-conflict偵測到最終性違規(罕見)
finality-conflict-resolved最終性違規已解決
sink-blue-score-changedsink 藍分更新
virtual-daa-score-changed虛擬 DAA 分數更新(每個區塊觸發)
new-block-template有新的區塊模板可用(用於挖礦)
pruning-point-utxo-set-override修剪點 UTXO 集被覆蓋

事件日誌

事件日誌累積所有收到的事件(環形緩衝區,最後 200 個):

ts
// Read the log
console.log(rpc.eventLog.value)
// [{ type: 'block-added', data: {...}, timestamp: 1711234567890 }, ...]

// Clear it
rpc.clearEventLog()

日誌在路由切換與元件重新掛載時仍會保留。

在元件中使用

vue
<script setup lang="ts">
import { useRpc, useCrypto } from 'vue-kaspa'

const rpc = useRpc()
const crypto = useCrypto()

async function checkBalance() {
  const { balance } = await rpc.getBalanceByAddress('kaspa:qr...')
  console.log(crypto.sompiToKaspaString(balance), 'KAS')
}
</script>

<template>
  <div>
    <p>Status: {{ rpc.connectionState.value }}</p>
    <p v-if="rpc.isConnected.value">
      Node: {{ rpc.networkId.value }} v{{ rpc.serverVersion.value }}
    </p>
    <button @click="checkBalance" :disabled="!rpc.isConnected.value">
      Check balance
    </button>
  </div>
</template>

Released under the MIT License.