Aller au contenu

Votre Première Transaction

Les transactions sont le moyen fondamental de changer les données sur la blockchain Aptos. Pensez-y comme envoyer un colis : vous devez spécifier ce que vous envoyez, à qui cela va, puis le suivre jusqu’à ce que la livraison soit confirmée. En termes de blockchain, les transactions vous permettent de transférer des pièces, d’appeler des fonctions de contrats intelligents, et de mettre à jour l’état sur la chaîne.

Ce tutoriel vous guidera dans la création et la soumission de votre première transaction sur la blockchain Aptos. Vous apprendrez comment :

  1. Configurer votre environnement de développement
  2. Créer des comptes de test et les financer
  3. Construire une transaction pour transférer des pièces
  4. Simuler la transaction pour estimer les coûts
  5. Signer et soumettre la transaction
  6. Vérifier que la transaction a été exécutée avec succès

Avant de pouvoir créer des transactions, nous devons configurer notre environnement de développement avec les outils et SDKs nécessaires.

  1. Installer le SDK TypeScript

    Installez le SDK TypeScript en utilisant votre gestionnaire de paquets préféré :

    Fenêtre de terminal
    npm install @aptos-labs/ts-sdk
  2. Créer votre fichier de configuration

    Créez un nouveau fichier appelé first-transaction.ts et importez les modules nécessaires :

    import {
    Account,
    Aptos,
    AptosConfig,
    Network,
    NetworkToNetworkName,
    } from "@aptos-labs/ts-sdk";
  3. Configurer la configuration réseau

    Configurez votre client pour se connecter au réseau testnet Aptos :

    // Configuration pour le réseau testnet
    const config = new AptosConfig({ network: Network.TESTNET });
    const aptos = new Aptos(config);
    console.log(
    `Connecté au réseau: ${NetworkToNetworkName[config.network]}`
    );

Chaque transaction sur Aptos nécessite un compte avec des fonds pour payer les frais de gaz. Créons deux comptes : un expéditeur et un destinataire.

async function createAndFundAccounts() {
// Créer deux nouveaux comptes
const senderAccount = Account.generate();
const receiverAccount = Account.generate();
console.log("=== Informations du compte ===");
console.log(`Adresse de l'expéditeur: ${senderAccount.accountAddress}`);
console.log(`Adresse du destinataire: ${receiverAccount.accountAddress}`);
// Financer le compte expéditeur avec des APT testnet
console.log("\n=== Financement des comptes ===");
const senderFund = await aptos.fundAccount({
accountAddress: senderAccount.accountAddress,
amount: 100_000_000, // 1 APT = 100,000,000 Octas
});
console.log(`Transaction de financement de l'expéditeur: ${senderFund}`);
return { senderAccount, receiverAccount };
}

Avant de créer notre transaction, vérifions les soldes de nos comptes pour confirmer que le financement a réussi.

async function checkAccountBalances(
senderAddress: string,
receiverAddress: string
) {
console.log("\n=== Soldes de compte ===");
// Vérifier le solde de l'expéditeur
const senderBalance = await aptos.getAccountAPTAmount({
accountAddress: senderAddress,
});
console.log(`Solde de l'expéditeur: ${senderBalance} Octas`);
// Vérifier le solde du destinataire
try {
const receiverBalance = await aptos.getAccountAPTAmount({
accountAddress: receiverAddress,
});
console.log(`Solde du destinataire: ${receiverBalance} Octas`);
} catch (error) {
console.log("Le destinataire n'a pas encore de compte (solde: 0 Octas)");
}
}

Maintenant créons une transaction pour transférer 1 APT (100,000,000 Octas) de l’expéditeur au destinataire.

async function buildTransaction(
senderAccount: Account,
receiverAddress: string,
amount: number
) {
console.log("\n=== Construction de la transaction ===");
console.log(`Transfert de ${amount} Octas vers ${receiverAddress}`);
// Construire la transaction de transfert
const transaction = await aptos.transaction.build.simple({
sender: senderAccount.accountAddress,
data: {
// Utiliser la fonction de transfert APT intégrée
function: "0x1::aptos_account::transfer",
functionArguments: [receiverAddress, amount],
},
});
console.log("Transaction construite avec succès");
return transaction;
}

Avant de soumettre, simulons la transaction pour estimer les frais de gaz et nous assurer qu’elle sera exécutée avec succès.

async function simulateTransaction(
senderAccount: Account,
transaction: any
) {
console.log("\n=== Simulation de la transaction ===");
// Simuler la transaction pour obtenir les estimations de gaz
const [simulationResult] = await aptos.transaction.simulate.simple({
signerPublicKey: senderAccount.publicKey,
transaction,
});
console.log("Résultat de la simulation :");
console.log(`- Unités de gaz utilisées: ${simulationResult.gas_used}`);
console.log(`- Succès: ${simulationResult.success}`);
if (!simulationResult.success) {
console.error("Erreur de simulation :", simulationResult.vm_status);
throw new Error("Échec de la simulation de transaction");
}
return simulationResult;
}
async function submitTransaction(
senderAccount: Account,
transaction: any
) {
console.log("\n=== Soumission de la transaction ===");
// Signer et soumettre la transaction
const committedTransaction = await aptos.transaction.signAndSubmitTransaction({
signer: senderAccount,
transaction,
});
console.log(`Transaction soumise: ${committedTransaction.hash}`);
// Attendre que la transaction soit confirmée
const executedTransaction = await aptos.waitForTransaction({
transactionHash: committedTransaction.hash,
});
console.log("Transaction confirmée !");
console.log(`- Hash: ${executedTransaction.hash}`);
console.log(`- Unités de gaz utilisées: ${executedTransaction.gas_used}`);
return executedTransaction;
}

Enfin, vérifions les soldes de compte mis à jour pour confirmer que notre transfert a réussi.

// Fonction principale pour exécuter tout le processus
async function main() {
try {
// Créer et financer des comptes
const { senderAccount, receiverAccount } = await createAndFundAccounts();
// Vérifier les soldes initiaux
await checkAccountBalances(
senderAccount.accountAddress.toString(),
receiverAccount.accountAddress.toString()
);
// Construire la transaction (transfert 1 APT = 100,000,000 Octas)
const transaction = await buildTransaction(
senderAccount,
receiverAccount.accountAddress.toString(),
100_000_000
);
// Simuler la transaction
await simulateTransaction(senderAccount, transaction);
// Soumettre la transaction
await submitTransaction(senderAccount, transaction);
// Vérifier les soldes finaux
console.log("\n=== Soldes finaux ===");
await checkAccountBalances(
senderAccount.accountAddress.toString(),
receiverAccount.accountAddress.toString()
);
} catch (error) {
console.error("Erreur :", error);
}
}
// Exécuter le script
main();
import {
Account,
Aptos,
AptosConfig,
Network,
NetworkToNetworkName,
} from "@aptos-labs/ts-sdk";
// Configuration pour le réseau testnet
const config = new AptosConfig({ network: Network.TESTNET });
const aptos = new Aptos(config);
async function createAndFundAccounts() {
const senderAccount = Account.generate();
const receiverAccount = Account.generate();
console.log("=== Informations du compte ===");
console.log(`Adresse de l'expéditeur: ${senderAccount.accountAddress}`);
console.log(`Adresse du destinataire: ${receiverAccount.accountAddress}`);
console.log("\n=== Financement des comptes ===");
const senderFund = await aptos.fundAccount({
accountAddress: senderAccount.accountAddress,
amount: 100_000_000,
});
console.log(`Transaction de financement de l'expéditeur: ${senderFund}`);
return { senderAccount, receiverAccount };
}
async function checkAccountBalances(senderAddress: string, receiverAddress: string) {
console.log("\n=== Soldes de compte ===");
const senderBalance = await aptos.getAccountAPTAmount({
accountAddress: senderAddress,
});
console.log(`Solde de l'expéditeur: ${senderBalance} Octas`);
try {
const receiverBalance = await aptos.getAccountAPTAmount({
accountAddress: receiverAddress,
});
console.log(`Solde du destinataire: ${receiverBalance} Octas`);
} catch (error) {
console.log("Le destinataire n'a pas encore de compte (solde: 0 Octas)");
}
}
async function buildTransaction(senderAccount: Account, receiverAddress: string, amount: number) {
console.log("\n=== Construction de la transaction ===");
console.log(`Transfert de ${amount} Octas vers ${receiverAddress}`);
const transaction = await aptos.transaction.build.simple({
sender: senderAccount.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [receiverAddress, amount],
},
});
console.log("Transaction construite avec succès");
return transaction;
}
async function simulateTransaction(senderAccount: Account, transaction: any) {
console.log("\n=== Simulation de la transaction ===");
const [simulationResult] = await aptos.transaction.simulate.simple({
signerPublicKey: senderAccount.publicKey,
transaction,
});
console.log("Résultat de la simulation :");
console.log(`- Unités de gaz utilisées: ${simulationResult.gas_used}`);
console.log(`- Succès: ${simulationResult.success}`);
if (!simulationResult.success) {
console.error("Erreur de simulation :", simulationResult.vm_status);
throw new Error("Échec de la simulation de transaction");
}
return simulationResult;
}
async function submitTransaction(senderAccount: Account, transaction: any) {
console.log("\n=== Soumission de la transaction ===");
const committedTransaction = await aptos.transaction.signAndSubmitTransaction({
signer: senderAccount,
transaction,
});
console.log(`Transaction soumise: ${committedTransaction.hash}`);
const executedTransaction = await aptos.waitForTransaction({
transactionHash: committedTransaction.hash,
});
console.log("Transaction confirmée !");
console.log(`- Hash: ${executedTransaction.hash}`);
console.log(`- Unités de gaz utilisées: ${executedTransaction.gas_used}`);
return executedTransaction;
}
async function main() {
try {
console.log(`Connecté au réseau: ${NetworkToNetworkName[config.network]}`);
const { senderAccount, receiverAccount } = await createAndFundAccounts();
await checkAccountBalances(
senderAccount.accountAddress.toString(),
receiverAccount.accountAddress.toString()
);
const transaction = await buildTransaction(
senderAccount,
receiverAccount.accountAddress.toString(),
100_000_000
);
await simulateTransaction(senderAccount, transaction);
await submitTransaction(senderAccount, transaction);
console.log("\n=== Soldes finaux ===");
await checkAccountBalances(
senderAccount.accountAddress.toString(),
receiverAccount.accountAddress.toString()
);
} catch (error) {
console.error("Erreur :", error);
}
}
main();

Félicitations ! Vous avez réussi à créer et soumettre votre première transaction sur Aptos. Voici ce que vous pouvez explorer ensuite :

  • Comptes : Chaque utilisateur a un compte identifié par une adresse de 32 octets
  • Transactions : Unités atomiques de changement sur la blockchain
  • Gaz : Frais de traitement payés pour l’exécution de transactions
  • Simulation : Moyen de tester les transactions avant la soumission
  • Octas : Plus petite unité d’APT (1 APT = 100,000,000 Octas)