Skip to Content
dApp 接入

发送交易

Web 应用连接 OneKey 后,可以请求用户授权发送交易。发送交易的步骤如下:

  1. 创建未签名交易。
  2. 由用户的 OneKey 钱包签名并提交到网络。
  3. 如有需要,通过 Solana JSON RPC 连接等待网络确认。

Solana 交易的更多信息见 solana-web3.js 文档和 Solana Cookbook 。

前置条件

示例使用 @solana/web3.js 中的 Connection 和 Transaction;直接调用 request 的示例还需要 bs58。先连接钱包,再构建包含指令、手续费支付方和目标网络近期 blockhash 的交易。将 <NETWORK_URL> 替换为该网络的 RPC 端点。空的 new Transaction() 不能用于签名或发送。

签名并发送交易

创建交易后,Web 应用可以请求用户的 OneKey 钱包签名并发送交易。

如果接受,OneKey 将使用用户的私钥签名交易并通过 Solana JSON RPC 连接提交。到目前为止,最简单且最推荐的方式是使用 Provider 上的 signAndSendTransaction 方法,但也可以使用 request。在这两种情况下,调用都将返回一个包含 signature 的对象的 Promise 。

使用 signAndSendTransaction 方法

const provider = getProvider(); // see "Detecting the Provider" const network = "<NETWORK_URL>"; const connection = new Connection(network); // `transaction` is a fully constructed Transaction with instructions, // feePayer, and a recent blockhash for this connection. const { signature } = await provider.signAndSendTransaction(transaction); const status = await connection.getSignatureStatus(signature); // This is a status query, not a wait for confirmation. Inspect status.value.

使用 request 方法

const provider = getProvider(); // see "Detecting the Provider" const network = "<NETWORK_URL>"; const connection = new Connection(network); // `transaction` is a fully constructed Transaction with instructions, // feePayer, and a recent blockhash for this connection. const { signature } = await provider.request({ method: "signAndSendTransaction", params: { message: bs58.encode(transaction.serialize({ requireAllSignatures: false })), }, }); const status = await connection.getSignatureStatus(signature); // This is a status query, not a wait for confirmation. Inspect status.value.

你还可以将 SendOptions 对象 作为第二个参数传入 signAndSendTransaction,或在使用 request 时作为 options 参数。

其他签名方法

应用需要自行控制提交时,可使用仅签名方法。这些方法返回已签名交易,不负责广播;应用需要自行提交并确认结果。provider 已将这些便捷方法标记为弃用,请核对所用 SDK 版本支持的集成方式。

签名交易(不发送)

创建交易后,Web 应用可以请求用户的 OneKey 钱包签名交易,但_不_提交到网络。最简单且最推荐的方式是通过 Provider 上的 signTransaction 方法,但也可以通过 request 实现。在这两种情况下,调用都将返回已签名交易的 Promise 。

交易签名后,应用可以通过 web3js 的 sendRawTransaction 自行提交交易。

使用 signTransaction 方法

const provider = getProvider(); const network = "<NETWORK_URL>"; const connection = new Connection(network); // `transaction` is a fully constructed Transaction with instructions, // feePayer, and a recent blockhash for this connection. const signedTransaction = await provider.signTransaction(transaction); const signature = await connection.sendRawTransaction(signedTransaction.serialize());

使用 request 方法

const provider = getProvider(); const network = "<NETWORK_URL>"; const connection = new Connection(network); // `transaction` is a fully constructed Transaction with instructions, // feePayer, and a recent blockhash for this connection. const signedTransaction = await provider.request({ method: "signTransaction", params: { message: bs58.encode(transaction.serialize({ requireAllSignatures: false })), }, }); 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.serialize({ requireAllSignatures: false })); }); const signedTransactions = await provider.request({ method: "signAllTransactions", params: { message }, });
最后更新于