Polkadot-API (PAPI) 簡介與使用指南

在Polkadot 生態系統中,去中心化應用程式(dApp)、網頁和錢包的開發者通常使用JavaScript 和TypeScript 進行開發。與基於Polkadot SDK 的區塊鏈進行交互,傳統上主要依賴Polkadot JS 函式庫。然而,最近波卡生態中出現了一款備受關注的新工具——Polkadot-API (PAPI),它提供了更現代化、模組化的開發體驗,並針對輕客戶端進行了最佳化。本文將介紹PAPI 的特性、環境建置、基本用法以及其在實際開發中的優勢。

Polkadot-API (PAPI) 簡介與使用指南

在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-api yarn add polkadot-api

取得鏈的Metadata

像波卡的relay chain,在腳本中已經有了默認的支持,可以直接使用名字來獲取,當你運行幫助,可以得到列表, polkadot,kusama 以及它們的系統平行鏈都有。

 npx papi add -h Usage: 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 產生類型檔案。

Polkadot-API (PAPI) 簡介與使用指南

它的原則是在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/

Polkadot-API (PAPI) 簡介與使用指南

分享至:

作者:OneBlock Community

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:OneBlock Community如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
4小時前
9小時前
11小時前
15小時前
16小時前
2025-12-29 12:00

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读