跳到主要内容

发交易

连接 UKey Wallet 后,应用可以构造 Solana 交易并请求用户确认。用户在钱包中批准后,交易才会被签名并发送。

典型流程如下:

  1. 创建一笔未签名交易。
  2. 设置 recent blockhash、fee payer 和必要指令。
  3. 请求 UKey Wallet 签名并发送交易。
  4. 使用 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 },
});