发交易
连接 UKey Wallet 后,应用可以构造 Solana 交易并请求用户确认。用户在钱包中批准后,交易才会被签名并发送。
典型流程如下:
- 创建一笔未签名交易。
- 设置 recent blockhash、fee payer 和必要指令。
- 请求 UKey Wallet 签名并发送交易。
- 使用 Solana JSON RPC 查询交易状态或等待确认。
更多 Solana 交易结构可参考 solana-web3.js 文档和 Solana Cookbook。
签名并发送交易
交易构造完成后,应用可以调用 signAndSendTransaction,让钱包完成签名和广播。
这是建议优先采用的方式,因为用户确认后交易会立即确认提交,应用只需跟踪返回的 signature。如果项目统一使用 request 封装,也可以调用同名方法。
使用 signAndSendTransaction 方法
const provider = getProvider(); // 这个辅助函数可参考“检测 Provider”一节
const network = "<DEMO_NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const { signature } = await provider.signAndSendTransaction(transaction);
await connection.getSignatureStatus(signature);
用 request
const provider = getProvider(); // 这个辅助函数可参考“检测 Provider”一节
const network = "<DEMO_NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const { signature } = await provider.request({
method: "signAndSendTransaction",
requestParams: {
message: bs58.encode(transaction.serializeMessage()),
},
});
await connection.getSignatureStatus(signature);
如需设置发送选项,可将 SendOptions 对象作为 signAndSendTransaction 的第二个参数,或在 request 中放入 options。
其他签名方法
下面的方法仍可使用,但一般不建议优先采用。让钱包在签名后立即广播交易,可以减少应用拿到已签名交易后被误用或延迟确认提交的风险。若只签名不发送,钱包会向用户展示额外提醒。
签名交易(不发送)
signTransaction 只让钱包签名,不负责广播。应用拿到已签名交易后,需要自行确认提交到网络。
签名完成后,可通过 web3.js 的 sendRawTransaction 广播。
使用 signTransaction 方法
const provider = getProvider();
const network = "<DEMO_NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const signedTransaction = await provider.signTransaction(transaction);
const signature = await connection.sendRawTransaction(
signedTransaction.serialize(),
);
用 request
const provider = getProvider();
const network = "<DEMO_NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const signedTransaction = await provider.request({
method: "signTransaction",
requestParams: {
message: bs58.encode(transaction.serializeMessage()),
},
});
const signature = await connection.sendRawTransaction(
signedTransaction.serialize(),
);
签名多个交易
如果业务需要批量处理,可以使用 signAllTransactions 请求用户签名多个交易。请确保每笔交易都能在钱包中被用户理解,并在前端明确展示批量签名的目的。
使用 signAllTransactions 方法
const signedTransactions = await provider.signAllTransactions(transactions);
用 request
const message = transactions.map((transaction) => {
return bs58.encode(transaction.serializeMessage());
});
const signedTransactions = await provider.request({
method: "signAllTransactions",
requestParams: { message },
});