Auf dieser Seite
Eine Transaktion senden
Sobald eine Webanwendung mit OneKey verbunden ist, kann sie den Nutzer um Erlaubnis bitten, Transaktionen in seinem Namen zu senden. Dazu muss eine Webanwendung:
- Eine unsignierte Transaktion erstellen.
- Die Transaktion von der OneKey-Wallet des Nutzers signieren und an das Netzwerk senden lassen.
- Optional über eine Solana-JSON-RPC-Verbindung auf die Netzwerkbestätigung warten.
Weitere Informationen zur Funktionsweise von Solana-Transaktionen finden Sie in solana-web3.js Dokumentation sowie im Solana Cookbook .
Voraussetzungen
Die Beispiele verwenden Connection und Transaction aus @solana/web3.js; die rohen request-Beispiele verwenden außerdem bs58. Verbinden Sie zuerst die Wallet und erstellen Sie eine Transaktion mit Anweisungen, Gebührenzahler und aktuellem Blockhash aus dem vorgesehenen Netzwerk. Ersetzen Sie <NETWORK_URL> mit dem RPC-Endpunkt dieses Netzwerks. Eine leere new Transaction() kann nicht signiert oder gesendet werden.
Eine Transaktion signieren und senden
Nachdem eine Transaktion erstellt wurde, kann die Webanwendung die OneKey-Wallet des Nutzers bitten, sie zu signieren und zu senden.
Bei Annahme signiert OneKey die Transaktion mit dem privaten Schlüssel des Nutzers und sendet sie über eine Solana-JSON-RPC-Verbindung. Der mit Abstand einfachste und am meisten empfohlene Weg dafür ist die Verwendung der signAndSendTransaction-Methode des Providers; es ist aber auch möglich mit request. In beiden Fällen gibt der Aufruf ein Promise für ein Objekt zurück, das Folgendes enthält: signature.
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.Anfrage
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.Sie können auch ein SendOptions-Objekt als zweites Argument an signAndSendTransaction oder bei Verwendung von request als options-Parameter übergeben.
Weitere Signiermethoden
Verwenden Sie reine Signiermethoden, wenn Ihre Anwendung die Übermittlung steuern muss. Sie geben signierte Transaktionen zurück, ohne sie zu übertragen; Ihre Anwendung muss sie einreichen und das Ergebnis bestätigen. Der Provider kennzeichnet diese Hilfsmethoden als veraltet; prüfen Sie daher den von Ihrer SDK-Version unterstützten Integrationsweg.
Eine Transaktion signieren (ohne Senden)
Nachdem eine Transaktion erstellt wurde, kann eine Webanwendung die OneKey-Wallet des Nutzers bitten, sie zu signieren, ohne sie auch an das Netzwerk zu senden. Der einfachste und empfohlene Weg ist die signTransaction-Methode des Providers; es ist aber auch möglich über request. In beiden Fällen gibt der Aufruf ein Promise für die signierte Transaktion.
Nachdem die Transaktion signiert wurde, kann eine Anwendung sie selbst einreichen über 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());Anfrage
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());Mehrere Transaktionen signieren
Verwenden Sie signAllTransactions, um mehrere Transaktionen zu signieren. Sie werden nicht gesendet; reichen Sie jede signierte Transaktion bei Bedarf separat ein.
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 },
});