Skip to Content
dApp 接入Polkadot

Polkadot

使用 OneKey 的 Provider 集成 Polkadot 和基于 Substrate 的链。通过 window.$onekey.polkadot 或 Polkadot.js 扩展 API 访问。

OneKey 实现了 Polkadot.js 扩展接口,确保与所有 Substrate dApp 兼容。


快速链接


Provider 检测

// OneKey 注册为 Polkadot.js 扩展 const provider = window.$onekey?.polkadot // 或使用标准的 web3Enable API import { web3Enable, web3Accounts } from '@polkadot/extension-dapp'

快速开始

启用扩展

// 直接使用 OneKey provider const enabled = await provider.web3Enable('My dApp') if (enabled) { const accounts = await provider.web3Accounts() console.log('账户:', accounts) }

使用 Polkadot.js 扩展 API(推荐)

import { web3Enable, web3Accounts } from '@polkadot/extension-dapp' // 启用所有扩展(包括 OneKey) const extensions = await web3Enable('My dApp') if (extensions.length === 0) { throw new Error('未找到扩展') } // 获取所有账户 const allAccounts = await web3Accounts() console.log('账户:', allAccounts)

账户管理

获取账户

const accounts = await provider.web3Accounts() accounts.forEach(account => { console.log({ address: account.address, // Substrate 地址 name: account.name, // 账户名称 type: account.type, // 'sr25519' | 'ed25519' | 'ecdsa' genesisHash: account.genesisHash, // 可选的链创世块哈希 }) })

订阅账户变化

const unsubscribe = provider.web3AccountsSubscribe((accounts) => { console.log('账户已变更:', accounts) }) // 稍后取消订阅: unsubscribe()

签名

签名交易 Payload

签名 extrinsic payloads:

import { web3FromAddress } from '@polkadot/extension-dapp' // 获取特定账户的 injector const injector = await web3FromAddress(accountAddress) // 签名 payload const payload = { address: accountAddress, blockHash: '0x...', blockNumber: '0x...', era: '0x...', genesisHash: '0x...', method: '0x...', nonce: '0x...', specVersion: '0x...', tip: '0x...', transactionVersion: '0x...', signedExtensions: [...], version: 4, } const result = await provider.web3SignPayload(payload) console.log({ id: result.id, signature: result.signature, // 十六进制签名 })

签名原始消息

const payload = { address: accountAddress, data: '0x48656c6c6f', // 十六进制编码的消息 type: 'bytes', } const result = await provider.web3SignRaw(payload) console.log({ id: result.id, signature: result.signature, })

配合 Polkadot.js API 使用

设置

npm install @polkadot/api @polkadot/extension-dapp

连接并签名交易

import { ApiPromise, WsProvider } from '@polkadot/api' import { web3Enable, web3FromAddress, web3Accounts } from '@polkadot/extension-dapp' // 启用扩展 await web3Enable('My dApp') // 获取账户 const accounts = await web3Accounts() const account = accounts[0] // 连接到链 const wsProvider = new WsProvider('wss://rpc.polkadot.io') const api = await ApiPromise.create({ provider: wsProvider }) // 获取 injector const injector = await web3FromAddress(account.address) // 创建并签名交易 const tx = api.tx.balances.transfer( recipientAddress, 1000000000000 // 1 DOT (10^12 planck) ) // 签名并发送 const hash = await tx.signAndSend( account.address, { signer: injector.signer } ) console.log('交易哈希:', hash.toHex())

监听交易事件

await tx.signAndSend( account.address, { signer: injector.signer }, ({ status, events }) => { if (status.isInBlock) { console.log('已入块:', status.asInBlock.toHex()) } if (status.isFinalized) { console.log('已确认:', status.asFinalized.toHex()) events.forEach(({ event }) => { if (api.events.system.ExtrinsicSuccess.is(event)) { console.log('交易成功') } if (api.events.system.ExtrinsicFailed.is(event)) { console.log('交易失败') } }) } } )

RPC 方法

发送 RPC 请求

const response = await provider.web3RpcSend({ method: 'chain_getHeader', params: [], }) console.log('最新区块头:', response.result)

订阅 RPC 事件

const subscriptionId = await provider.web3RpcSubscribe( { method: 'chain_subscribeNewHeads', params: [], }, (response) => { console.log('新区块:', response.result) } ) // 稍后取消订阅 await provider.web3RpcUnSubscribe()

列出可用 Provider

const providers = await provider.web3RpcListProviders() console.log('可用 providers:', providers)

API 参考

方法

方法说明
web3Enable(dappName)为 dApp 启用扩展
web3Accounts(anyType?)获取所有账户
web3AccountsSubscribe(callback)订阅账户变化
web3SignPayload(payload)签名交易 payload
web3SignRaw(payload)签名原始消息
web3RpcSend(request)发送 RPC 请求
web3RpcSubscribe(request, callback)订阅 RPC 事件
web3RpcUnSubscribe()取消所有订阅
web3RpcListProviders()列出 RPC providers
web3RpcStartProvider(key)启动特定 provider

类型

interface InjectedAccount { address: string // Substrate 地址 name?: string // 账户名称 type?: 'sr25519' | 'ed25519' | 'ecdsa' genesisHash?: string // 可选的链限制 } interface SignerPayloadJSON { address: string blockHash: string blockNumber: string era: string genesisHash: string method: string nonce: string specVersion: string tip: string transactionVersion: string signedExtensions: string[] version: number } interface SignerPayloadRaw { address: string data: string // 十六进制编码的数据 type: 'bytes' | 'payload' } interface SignerResult { id: number signature: string // 十六进制签名 }

支持的链

说明
Polkadot主中继链
Kusama金丝雀网络
AcalaDeFi 中心
MoonbeamEVM 兼容
Astar智能合约平台
任意 Substrate自定义链

错误处理

try { const result = await provider.web3SignPayload(payload) } catch (error) { if (error.message === 'Cancelled') { console.log('用户取消了签名') } else { console.error('签名失败:', error) } }

配合 React 使用

import { useState, useEffect } from 'react' import { web3Enable, web3Accounts } from '@polkadot/extension-dapp' function usePolkadotWallet() { const [accounts, setAccounts] = useState([]) const [isConnected, setIsConnected] = useState(false) const connect = async () => { const extensions = await web3Enable('My dApp') if (extensions.length > 0) { const allAccounts = await web3Accounts() setAccounts(allAccounts) setIsConnected(true) } } return { accounts, isConnected, connect } }
Last updated on