Polkadot-API(PAPI) 소개 및 사용 가이드

Polkadot 생태계에서 분산형 애플리케이션(dApp), 웹 페이지, 지갑 개발자는 일반적으로 개발에 JavaScript와 TypeScript를 사용합니다. Polkadot SDK 기반 블록체인과의 상호작용은 전통적으로 Polkadot JS 라이브러리에 주로 의존해 왔습니다. 그러나 최근 Polkadot 생태계에서 많은 주목을 받고 있는 새로운 도구인 Polkadot-API(PAPI) 가 등장했습니다. 이 도구는 보다 현대적이고 모듈식 개발 경험을 제공하며 라이트 클라이언트에 최적화되어 있습니다. 본 논문에서는 PAPI의 특성, 환경구성, 기본 사용법, 실제 개발에서의 장점 등을 소개한다.

PAPI의 특징

Polkadot-API(PAPI)는 분산 애플리케이션(dApp) 개발자를 위한 모듈식 구성 가능 라이브러리로, 특히 " 가벼운 클라이언트 우선 " 접근 방식을 위해 설계되었습니다. 이 플랫폼의 목표는 개발자가 효율적이고 완전히 분산된 애플리케이션을 구축하는 데 도움이 되는 포괄적인 도구 세트를 제공하는 것입니다. PAPI에는 다음과 같은 특징이 있습니다.

  • 경량 클라이언트 최적화: JSON-RPC 사양 의 새로운 버전을 통해 완전히 분산된 상호작용을 지원합니다.

  • 강력한 TypeScript 지원: 온체인 메타데이터를 통해 자동으로 유형 정의와 문서를 생성하고, 개발 작업을 간소화하며, 온체인 스토리지, 상수, 트랜잭션, 이벤트 및 런타임 호출에 원활하게 액세스할 수 있습니다.

  • 다중 체인 호환성: 개발자가 여러 블록체인에 동시에 연결할 수 있도록 하고 다중 설명자 지원 및 런타임 업데이트 호환성 검사를 제공합니다.

  • 성능 최적화: 불필요한 리소스 묶음을 방지하기 위해 기본 BigInt 유형 , 동적 가져오기 , 모듈식 하위 경로를 활용하여 성능을 향상시킵니다.

  • 유연한 API 옵션: Promise 기반 API와 관찰 가능한 API를 지원하고, Polkadot.js와의 통합을 용이하게 하며, 브라우저 확장 프로그램이나 개인 키를 통한 서명 옵션을 제공합니다.

이 모든 요소 덕분에 PAPI는 분산형 애플리케이션을 구축하고 개발 효율성을 개선하는 동시에 애플리케이션 성능과 확장성을 최적화하는 데 이상적인 도구가 되었습니다. 실제 사용 관점에서 볼 때 PAPI의 가장 매력적인 기능 중 하나는 체인의 메타데이터를 기반으로 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

체인의 메타데이터 가져오기

Polkadot의 릴레이 체인처럼 스크립트에서 이미 기본 지원이 있으며 이름으로 직접 얻을 수 있습니다 . help를 실행하면 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라는 숨겨진 디렉토리가 프로젝트 디렉토리에 나타나고, 여기서 얻은 메타데이터를 기반으로 유형 파일이 생성됩니다.

Polkadot-API(PAPI) 소개 및 사용 가이드

원칙은 설명자를 포함하여 packagejson에 종속성을 추가하는 것 입니다.

 "dependencies": { "@polkadot-api/descriptors": "file:.papi/descriptors",

프로그래밍 경험

백그라운드 로그를 보고 디버깅을 용이하게 하기 위해 코드는 로컬 노드와 상호 작용합니다. 공식 문서에 따르면 클라이언트는 Smoldot과 같은 다양한 모드를 지원합니다 . 여기서는 기본 웹 모드만 보여드리겠습니다.

클라이언트 API 가져오기

먼저, ws 공급자를 통해 체인의 RPC 노드 주소와 포트를 지정한 다음 클라이언트를 초기화합니다. 모든 유형은 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를 통해 체인과 간단히 상호작용할 수 있습니다. 여기서는 잔액에 대한 상수와 변수를 얻습니다 . 이 코드는 각각 계좌의 최소 잔액과 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 dotApi.constants.Balances.ExistentialDeposit()).toString(); console.log(existentialDeposit); const balance = await dotApi.query.System.Account.getValue("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"); console.log(balance["data"]["free"].toString()); }

main()

거래 전송 중

여기서는 앨리스에서 밥으로의 가장 간단한 전송 작업을 완료합니다. API를 받은 후, Alice와 Bob의 계정을 각각 가져오고, Alice의 서명자를 초기화하고, Bob의 공개 키를 MultiAddress 형식으로 변환합니다. 마지막으로 거래에 서명하고 보냅니다.

 import { MultiAddress } from "@polkadot-api/descriptors" import { asset } from '@polkadot-api/descriptors'; import { createClient } from 'polkadot-api'; import { getWsProvider } from 'polkadot-api/ws-provider/web'; import { getPolkadotSigner } from "polkadot-api/signer" import { 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 = 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: 'Treasury', value: [Object], topics: [] }, { type: 'Balances', value: [Object], topics: [] }, { type: 'Treasury', value: [Object], topics: [] }, { type: 'Balances', value: [Object], topics: [] }, { type: 'TransactionPayment', 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()

획득한 이벤트의 형식은 다음과 같습니다. 발신자, 수신자 주소 등을 기준으로 필터링하는 등 모니터링에 몇 가지 필터를 적용 할 수도 있습니다. 직접 시도해 볼 수 있습니다.

 { meta: { phase: { type: 'ApplyExtrinsic', value: 2 }, block: { hash: '0x9aa50c25fcc0801ab98d588a8faf8648a98b51adc01ebe2816e381348e6275c2', number: 1078, parent: '0xcf12ee84af9eff68b525d1d0c6a6b032accc914e80f05ed78b4d62d8170e076c' } }, payload: { from: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', amount: 1000000000000n } }

요약하다

기존 Polkadot JS 라이브러리와 비교했을 때 PAPI는 보다 현대적인 개발 환경을 제공하며, 특히 TypeScript 유형 정의를 자동 생성하는 기능을 제공하여 개발자가 온체인 데이터 구조를 보다 명확하게 이해하고 개발 효율성을 크게 향상시킬 수 있습니다 . 모듈식 디자인, 가벼운 클라이언트 우선 전략, 다중 체인 호환성 덕분에 Polkadot 생태계에서 주목할 만한 새로운 도구가 되었습니다. 물론, PAPI는 아직 최적화 중이므로 개발자는 사용 중에 몇 가지 버그를 만날 수 있습니다. 적극적인 피드백과 홍보 기여를 환영합니다 . PAPI가 폴카닷 생태계의 발전을 더욱 촉진하고, 개발자들이 블록체인과 상호작용할 수 있는 더욱 편리한 방법을 제공하기를 바랍니다!

"블록체인 기술 개발 입문 17판" 등록이 시작되었습니다.

OneBlock+와 Polkadot이 공동 출시한 "블록체인 기술 개발 입문 17판 | Polkadot에서의 Solidity 개발"이 곧 시작됩니다! 본 과정은 공식적으로 2025년 3월 7일 에 시작되어, 6주 동안 진행되며, 6개의 녹화된 수업 , 6개의 과제, 여러 워크숍 으로 구성됩니다. 체계적인 학습과 실습을 통해 여러분이 블록체인 기술을 심도 있게 탐구하고 암호화의 미래에서 새로운 장을 열 수 있도록 도와드리겠습니다!

✨ 이 과정은 완전 무료이며 대중에게 공개됩니다 . 신청을 통해 입장할 수 있으며 정원이 제한되어 있습니다 ! 아래 링크를 클릭하여 신청서를 즉시 작성하세요. 신청서가 승인되면, 귀하의 학업 자리를 확보하기 위해 연락드리겠습니다!

🔗지금 입학 신청하세요:

https://wj.qq.com/s2/17653871/18t2/

Polkadot-API(PAPI) 소개 및 사용 가이드