Sur cette page
Envoi d’une transaction
Une fois une application web connectée à OneKey, elle peut demander à l’utilisateur l’autorisation d’envoyer des transactions en son nom. Pour envoyer une transaction, elle doit :
- Créer une transaction non signée.
- Faire signer la transaction et la faire soumettre au réseau par le portefeuille OneKey de l’utilisateur.
- Éventuellement attendre la confirmation du réseau via une connexion JSON RPC Solana.
Pour en savoir plus sur la nature des transactions Solana, consultez la documentation de solana-web3.js ainsi que le Solana Cookbook .
Prérequis
Les exemples utilisent Connection et Transaction depuis @solana/web3.js ; les exemples bruts de request utilisent également bs58. Connectez d’abord le portefeuille et construisez une transaction avec des instructions, un payeur des frais et un blockhash récent du réseau prévu. Remplacez <NETWORK_URL> avec le point de terminaison RPC de ce réseau. Un objet vide new Transaction() ne peut être ni signé ni envoyé.
Signer et envoyer une transaction
Une fois une transaction créée, l’application web peut demander au portefeuille OneKey de l’utilisateur de la signer et de l’envoyer.
Si elle est acceptée, OneKey signe la transaction avec la clé privée de l’utilisateur et la soumet via une connexion JSON RPC Solana. La façon la plus simple et la plus recommandée de procéder consiste à utiliser la méthode signAndSendTransaction sur le fournisseur, mais il est également possible d’utiliser request. Dans les deux cas, l’appel renvoie une Promise pour un objet contenant 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.Requête
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.Vous pouvez aussi spécifier un objet SendOptions comme deuxième argument de signAndSendTransaction ou comme paramètre options lors de l’utilisation de request.
Autres méthodes de signature
Utilisez les méthodes de signature seule lorsque votre application doit contrôler la soumission. Elles renvoient les transactions signées sans les diffuser ; votre application doit les soumettre et confirmer le résultat. Le fournisseur marque ces méthodes utilitaires comme obsolètes ; vérifiez donc le parcours d’intégration pris en charge par votre version du SDK.
Signer une transaction (sans l’envoyer)
Une fois une transaction créée, une application web peut demander au portefeuille OneKey de l’utilisateur de la signer sans la soumettre également au réseau. La façon la plus simple et la plus recommandée consiste à utiliser la méthode signTransaction sur le fournisseur, mais il est aussi possible d’utiliser request. Dans les deux cas, l’appel renvoie une Promise pour la transaction signée.
Après la signature, l’application peut soumettre elle-même la transaction via 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());Requête
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());Signer plusieurs transactions
Utilisez signAllTransactions pour signer plusieurs transactions. Cette méthode ne les envoie pas ; soumettez chaque transaction signée séparément au moment approprié.
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 },
});