跳到主要内容

签署

这里演示如何通过 UKey Wallet Polkadot Provider 签名交易 payload、原始消息,并监听交易状态。


签名交易 Payload

交易 payload 通常由 Polkadot.js API 生成,钱包负责展示并签名:

import { web3FromAddress } from '@polkadot/extension-dapp'

// 读取特定账户的注入器
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 callResult = await provider.web3SignPayload(payload)

console.log({
id: callResult.id,
signature: callResult.signature, // hex 形式的签名
})

签名原始消息

const payload = {
address: accountAddress,
data: "0x48656c6c6f", // hex 编码后的消息内容
type: "bytes",
};

const callResult = await provider.web3SignRaw(payload);

console.log({
id: callResult.id,
signature: callResult.signature,
});

监听交易事件

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 requestResult = await provider.web3RpcSend({
method: "chain_getHeader",
requestParams: [],
});

console.log("最新区块头数据:", requestResult.result);

订阅 RPC 事件

const subscriptionId = await provider.web3RpcSubscribe(
{
method: "chain_subscribeNewHeads",
requestParams: [],
},
(response) => {
console.log("捕获到的新区块:", response.result);
},
);

// 后续记得取消订阅
await provider.web3RpcUnSubscribe();

处理异常

try {
const callResult = 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 usePolkadotAccounts() {
const [accounts, setAccounts] = useState([]);
const [isConnected, setIsConnected] = useState(false);

const connect = async () => {
const extensions = await web3Enable("UKey Wallet Demo");
if (extensions.length > 0) {
const allAccounts = await web3Accounts();
setAccounts(allAccounts);
setIsConnected(true);
}
};

return { accounts, isConnected, connect };
}