
在Polkadot 生態系統中,去中心化應用程式(dApp)、網頁和錢包的開發者通常使用JavaScript 和TypeScript 進行開發。與基於Polkadot SDK的區塊鏈進行交互,傳統上主要依賴Polkadot JS 函式庫。然而,最近波卡生態中出現了一款備受關注的新工具—— Polkadot-API (PAPI) ,它提供了更現代化、模組化的開發體驗,並針對輕客戶端進行了最佳化。本文將介紹PAPI 的特性、環境建置、基本用法以及其在實際開發中的優勢。
PAPI 的特徵
Polkadot-API(PAPI)是一個為去中心化應用程式(dApp)開發者提供的模組化、可組合的函式庫,專門針對「輕客戶端優先」方法設計。其目標是提供一套全面的工具,幫助開發者建立高效、完全去中心化的應用程式。 PAPI 具備以下特質:
輕客戶端優化:透過新版本的JSON-RPC 規範支援完全去中心化的互動。
強大的TypeScript 支援:透過鏈上元資料自動產生類型定義和文檔,簡化開發工作,並實現無縫存取鏈上儲存、常數、交易、事件和執行時間呼叫。
多鏈相容性:允許開發者同時連接多個區塊鏈,並提供多描述符支援和運行時更新相容性檢查。
效能最佳化:利用原生BigInt 類型、動態導入和模組化子路徑來避免捆綁不必要的資源,從而提高效能。
靈活的API 選項:支援基於承諾和可觀察的API ,方便與Polkadot.js 集成,並可透過瀏覽器擴充或私鑰提供簽章選項。
這一切都使得PAPI 成為建立去中心化應用程式的理想工具,既提高開發效率,也優化了應用程式的效能和可擴展性。從實際使用來看,PAPI 最吸引人的特點之一是它能夠基於鏈的Metadata 輕鬆生成TypeScript 類型定義,詳細文檔可參考Polkadot 官方文檔,或訪問PAPI 官方網站。
🔗 Polkadot 官方文件:
https://docs.polkadot.com/develop/toolkit/api-libraries/papi/
🔗 PAPI 官方網站:https://papi.how/
環境建構
安裝依賴
首先我們需要按照它,經過npm 或yarn 。
npm i polkadot-apiyarn add polkadot-api
取得鏈的Metadata
像波卡的relay chain,在腳本中已經有了默認的支持,可以直接使用名字來獲取,當你運行幫助,可以得到列表, polkadot,kusama 以及它們的系統平行鏈都有。
npx papi add -hUsage: polkadot-api add [options] <key>
Add a new chain spec to the list
Arguments: key Key identifier for the chain spec
Options: --config <filename> Source for the config file -f, --file <filename> Source from metadata encoded file -w, --wsUrl <URL> Source from websocket url -c, --chainSpec <filename> Source from chain spec file -n, --name <name> Source from a well-known chain (choices: "ksmcc3", "ksmcc3_asset_hub", "ksmcc3_bridge_hub", "ksmcc3_encointer", "ksmcc3_people", "paseo", "paseo_asset_hub", "paseo_people", "polkadot", "polkadot_asset_hub", "polkadot_bridge_hub", "polkadot_collectives", "polkadot_people", "rococo_v2_2", "rococo_v2_2_asset_hub", "rococo_v2_2_bridge_hub", "rococo_v2_2_people", "westend2", "westend2_asset_hub", "westend2_bridge_hub", "westend2_collectives", "westend2_people")
在新增的時候可以給一個名字
npx papi add dot -n polkadot也可以新增一個不在清單裡面的鏈,使用-w 選項。我們啟動本地伺服器一條鏈,使用預設端口,並添加。
npx papi add asset -w ws://10.0.0.11:9944在成功的新增後,專案目錄下會出現一個隱藏目錄,名字是.papi ,裡面會根據取得的Metadata 產生類型檔案。

它的原則是在packagejson 裡面增加一個依賴,包含descriptor 。
"dependencies": {"@polkadot-api/descriptors": "file:.papi/descriptors",
程式設計體驗
為了查看後台日誌方便調試,程式碼都是和本地的節點進行互動。從官方文件來看, client 是支援不同的模式的,例如Smoldot,這裡只示範基本的web 方式。
取得Client API
首先透過ws provider 指定鏈的RPC 節點位址和端口,然後初始化一個client。所以的類型是透過getTypedApi方法來取得的,這種取得的方式十分便捷,對於習慣強型別程式設計的開發者非常友善。
類型的定義就是上一個步驟使用指令產生的。
import { asset } from '@polkadot-api/descriptors';import { createClient } from 'polkadot-api';import { getWsProvider } from 'polkadot-api/ws-provider/web';
async function main() { const provider = getWsProvider('ws://10.0.0.11:9944'); const client = createClient(provider); const dotApi = client.getTypedApi(asset);
得到常數和變數
然後透過api 可以簡單和鏈交互,這裡取得balances 裡面的一個常數和變數。代碼分別列印帳號的最小餘額和帳號Alice 的可用餘額。
import { asset } from '@polkadot-api/descriptors';import { createClient } from 'polkadot-api';import { getWsProvider } from 'polkadot-api/ws-provider/web';
async function main() { const provider = getWsProvider('ws://10.0.0.11:9944'); const client = createClient(provider); const dotApi = client.getTypedApi(asset); const existentialDeposit = (await console.log(existentialDeposit); const balance = await dotApi.query.System.Account.getValue("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"); console.log(balance["data"]["free"].toString()); dotApi.constants.Balances.ExistentialDeposit()).toString(); }
main()
發送交易
這裡完成一個最簡單的從Alice 到Bob 的轉帳操作。得到api 後,我們分別匯入Alice 和Bob 二個帳號,並初始化Alice 的signer,把Bob 的public key 轉換成MultiAddress 的格式。最後簽名並發送這個交易。
import { MultiAddress } from "@polkadot-api/descriptors"import { asset } from '@polkadot-api/descriptors';import { getPolkadotSigner } from "polkadot-api/signer"import { createClient } from 'polkadot-api';import {import { getWsProvider } from 'polkadot-api/ws-provider/web';sr25519,DEV_PHRASE,entropyToMiniSecret,mnemonicToEntropy, ss58Address} from "@polkadot-labs/hdkd-helpers"import { sr25519CreateDerive } from "@polkadot-labs/hdkd"
async function main() { const provider = getWsProvider('ws://10.0.0.11:9944'); const client = createClient(provider); const dotApi = client.getTypedApi(asset);
const entropy = mnemonicToEntropy(DEV_PHRASE) const miniSecret = entropyToMiniSecret(entropy) const derive = sr25519CreateDerive(miniSecret)
const alice = derive("//Alice") const bob = derive("//Bob") const signer = getPolkadotSigner(alice.publicKey, "Sr25519", alice.sign)
const dest = MultiAddress.Id(ss58Address(bob.publicKey)) const result } const result = await dotApi.tx.Balances.transfer_keep_alive({ dest, value: BigInt(123), }).signAndSubmit(signer) console.log(result) main()
當交易成功完成後,結果的格式如下
{txHash: '0x803428a07a2e1c6de378e84a01249bc4f237df546a719bcd369e0418800f54cc',block: {index: 2,number: 1162,hash: '0x17aeb0944a33b848655c6fc3945bae1a3bd436e5fe92b0f15a2d7fe027764cc7'},ok: true,events: [{ type: 'Balances', value: [Object], topics: [] },{ type: 'Balances', value: [Object], topics: [] },{ type: 'Balances', value: [Object], topics: [] },{ type: 'Treasury', value: [Object], topics: [] },{ type: 'Balances', value: [Object], topics: [] },{ type: 'TransactionPayment', value: [Object], topics: [] },{ type: 'Systemment', value: [Object], topics: []},{ type: 'System', value: [Object], topics: [] }
監聽事件
在Dapp 的開發中,對事件的處理也是必不可少的,以下的程式碼演示鏈如何取得。
import { asset } from '@polkadot-api/descriptors';import { createClient } from 'polkadot-api';import { getWsProvider } from 'polkadot-api/ws-provider/web';
async function main() { const provider = getWsProvider('ws://10.0.0.11:9944'); } const client = createClient(provider); const dotApi = client.getTypedApi(asset); dotApi.event.Balances.Transfer.watch().pipe().forEach(console.log) main()
取得的事件格式如下。對於監聽還可以應用一些Filter ,可以透過發送者,接收者位址過濾等等,這些可以自己去嘗試。
{meta: {phase: { type: 'ApplyExtrinsic', value: 2 },block: {hash: '0x9aa50c25fcc0801ab98d588a8faf8648a98b51adc01ebe2816e381348e6275c2',number: 1078,to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty',parent: '0xcf12ee84af9eff68b525d1d0c6a6b032accc914e80f05ed78b4d62d8170e076c'}},payload: {from: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty',amount: 1000000000000n}}
總結
PAPI 相較於傳統的Polkadot JS 函式庫,提供了更現代化的開發體驗,特別是對TypeScript 類型定義的自動生成,使得開發者能夠更清晰地理解鏈上資料結構,大大提高了開發效率。其模組化設計、輕客戶端優先的策略以及多鏈相容性,使其成為Polkadot 生態中值得關注的新工具。當然,由於PAPI 仍在持續優化中,開發者在使用過程中可能會遇到一些bug,歡迎大家積極回饋並貢獻PR 。希望PAPI 能進一步推動波卡生態發展,為開發者提供更便利的區塊鏈互動方式!
「區塊鏈技術開發入門17 期」正式開啟報名
由OneBlock+ 和Polkadot 共同推出的「區塊鏈技術開發入門17 期| Polkadot 上的Solidity 開發」即將啟程!本期課程將於2025 年3 月7 日正式開課,歷時6 週,包含6 個錄播課程、 6 個Task 任務及多個Workshop 。透過系統化學習與實踐,幫助你深入探索區塊鏈技術,開啟加密未來的新篇章!
✨ 本期課程完全免費開放,採申請入學制,名額有限!立即點擊下方連結填寫申請表,審核通過後我們將主動聯絡你,鎖定學習席位!
🔗立即申請入學:
https://wj.qq.com/s2/17653871/18t2/

