发送交易
Web 应用连接到 OneKey 后,可以提示用户授权代表他们发送交易。要发送交易,Web 应用必须:
- 创建一个未签名的交易。
- 让用户的 OneKey 钱包签名并提交交易到网络。
- (可选)使用 Solana JSON RPC 连接等待网络确认。
有关 Solana 交易性质的更多信息,请查阅 solana-web3.js 文档以及 Solana Cookbook 。有关示例 OneKey 交易,请参阅下面的示例。
签名并发送交易
创建交易后,Web 应用可以请求用户的 OneKey 钱包签名并发送交易。
如果接受,OneKey 将使用用户的私钥签名交易并通过 Solana JSON RPC 连接提交。到目前为止,最简单且最推荐的方式是使用 Provider 上的 signAndSendTransaction 方法,但也可以使用 request。在这两种情况下,调用都将返回一个包含 signature 的对象的 Promise 。
使用 signAndSendTransaction 方法
const provider = getProvider(); // 参见"检测 Provider"
const network = "<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 = "<NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const { signature } = await provider.request({
method: "signAndSendTransaction",
params: {
message: bs58.encode(transaction.serializeMessage()),
},
});
await connection.getSignatureStatus(signature);你还可以将 SendOptions 对象 作为第二个参数传入 signAndSendTransaction,或在使用 request 时作为 options 参数。
其他签名方法
以下方法也受支持,但不推荐使用,应优先使用 signAndSendTransaction。对于用户来说更安全,对于开发者来说 API 更简单,让 OneKey 在签名后立即提交交易,而不是依赖应用来完成。如果你使用以下方法,OneKey 将向用户显示警告消息。
签名交易(不发送)
创建交易后,Web 应用可以请求用户的 OneKey 钱包签名交易,但_不_提交到网络。最简单且最推荐的方式是通过 Provider 上的 signTransaction 方法,但也可以通过 request 实现。在这两种情况下,调用都将返回已签名交易的 Promise 。
交易签名后,应用可以通过 web3js 的 sendRawTransaction 自行提交交易。
使用 signTransaction 方法
const provider = getProvider();
const network = "<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 = "<NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const signedTransaction = await provider.request({
method: "signTransaction",
params: {
message: bs58.encode(transaction.serializeMessage()),
},
});
const signature = await connection.sendRawTransaction(signedTransaction.serialize());签名多个交易
也可以一次签名并发送多个交易。这通过 Provider 上的 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",
params: { message },
});