Sending APT Coin
How to Transfer APT?
트랜잭션을 실행하여 보유하고 있는 APT Coin을 다른 계정으로 전송할 수 있습니다. Aptos 네트워크의 모든 트랜잭션은 다음과 같은 순서로 실행됩니다.
- 트랜잭션 빌드
- 필요한 데이터를 입력하여 Raw Transaction을 생성합니다.
- 트랜잭션 시뮬레이션(선택 사항)
- 트랜잭션 서명 및 제출 전 시뮬레이션을 진행하여 트랜잭션의 결과를 미리 확인합니다.
- 트랜잭션 서명
- Sender Account를 이용하여 트랜잭션에 서명합니다.
- 트랜잭션 제출
- 트랜잭션을 Aptos 네트워크로 제출합니다.
- 트랜잭션 결과 확인
- 트랜잭션이 네트워크에서 commit된 것을 확인한 후 결과를 확인합니다.
이번 튜토리얼에서는 이러한 순서를 따라 APT를 전송하는 트랜잭션을 실행해 보도록 하겠습니다.
이 튜토리얼을 통해 아래 내용을 배울 수 있습니다!
- Aptos의 트랜잭션 로직 및 실행 방법을 알 수 있습니다.
- APT Coin 전송 방법을 알 수 있습니다.
- 전체 튜토리얼 코드는 아래 링크를 통해 확인할 수 있습니다.
트랜잭션을 실행하기 위한 전체적인 코드는 다음과 같습니다.
import {
Account,
Aptos,
AptosConfig,
Ed25519PrivateKey,
} from "@aptos-labs/ts-sdk";
const config = new AptosConfig({
fullnode: "your_Nodit_Aptos_testnet_node_endpoint",
indexer: "your_Nodit_Aptos_indexer_endpoint",
});
const aptos = new Aptos(config);
const privateKey = "your_private_key"; // 0x12345...
const ed25519Scheme = new Ed25519PrivateKey(privateKey);
const senderAccount = Account.fromPrivateKey({
privateKey: ed25519Scheme,
});
const receiverAddress = Account.generate().accountAddress.toString();
(async (senderAccount: Account, receiverAddress: string, amount: number) => {
try {
const senderAddress = senderAccount.accountAddress.toString();
// build transaction
const transaction = await aptos.transaction.build.simple({
sender: senderAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [receiverAddress, amount],
},
});
// simulate transaction(optional)
const [simulateTransactionResult] = await aptos.transaction.simulate.simple(
{
signerPublicKey: senderAccount.publicKey,
transaction,
}
);
// sign transaction
const senderAuthenticator = aptos.transaction.sign({
signer: senderAccount,
transaction,
});
// submit transaction
const submitTx = await aptos.transaction.submit.simple({
transaction,
senderAuthenticator,
});
const executedTransaction = await aptos.waitForTransaction({
transactionHash: submitTx.hash,
});
console.log(executedTransaction);
} catch (error) {
console.error(error);
}
})(senderAccount, receiverAddress, 100_000_000);
코드에 작성된 각 기능들이 어떻게 구성되어 있는지 살펴보도록 하겠습니다.
Step 1. 트랜잭션 빌드
const senderAddress = senderAccount.accountAddress.toString();
// build transaction
const transaction = await aptos.transaction.build.simple({
sender: senderAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [receiverAddress, amount],
},
});
APT Coin을 전송하는 트랜잭션을 실행하기 위해서는 가장 먼저 트랜잭션을 빌드하여 RawTransaction을 생성해야 합니다.
Step 2. 트랜잭션 시뮬레이션(선택 사항)
// simulate transaction(optional)
const [simulateTransactionResult] = await aptos.transaction.simulate.simple(
{
signerPublicKey: senderAccount.publicKey,
transaction,
}
);
트랜잭션을 가상으로 실행시켜 해당 트랜잭션의 실행 결과를 확인할 수 있습니다. 이를 이용해 해당 트랜잭션이 사용자의 요구에 따라 정상적으로 실행되었는지 확인할 수 있습니다. 다만 트랜잭션 실행을 위한 필수적인 단계가 아니기 때문에 진행하지 않아도 트랜잭션 실행에 문제가 되진 않습니다.
Step 3. 트랜잭션 서명
// sign transaction
const senderAuthenticator = aptos.transaction.sign({
signer: senderAccount,
transaction,
});
트랜잭션을 실행하기 위해 전송자는 Raw Transaction에 서명합니다. 서명의 결과로 반환받은 Authenticator와 Raw Transaction을 네트워크에 전파하여 트랜잭션을 실행할 수 있습니다.
Step 4. 트랜잭션 제출
// submit transaction
const submitTx = await aptos.transaction.submit.simple({
transaction,
senderAuthenticator,
});
서명 과정까지 완료했다면 서명과 RawTransaction을 제출하여 네트워크에 전파하는 일만 남았습니다.
코드를 실행하면 트랜잭션 제출의 결과로 PendingTransactionResponse
타입의 객체를 확인할 수 있습니다. CommittedTransactionReseponse
타입의 결과가 아닌 PendingTransactionResponse
를 받는 이유는 트랜잭션이 실행되고 블록에 포함된 후 합의가 이뤄져 블록이 Confirm 되기 전 응답을 받기 때문입니다.
type PendingTransactionResponse = {
type: TransactionResponseType.Pending;
hash: string;
sender: string;
sequence_number: string;
max_gas_amount: string;
gas_unit_price: string;
expiration_timestamp_secs: string;
payload: TransactionPayloadResponse;
signature?: TransactionSignature;
};
Step 5. 트랜잭션 결과 확인
따라서 트랜잭션을 제출하고 확정된 결과를 얻기 위해 waitForTransaction
메서드를 이용할 수 있습니다.
이를 위해 트랜잭션을 제출한 후 받은 PendingTransactionResponse
에서 트랜잭션 해시를 추출하여 waitForTransaction
의 인자로 입력합니다.
const executedTransaction = await aptos.waitForTransaction({
transactionHash: submitTx.hash,
});
성공적으로 트랜잭션이 실행된 후 CommittedTransactionReseponse
타입에 정의된 내용에 따라 트랜잭션 별 알맞은 응답을 받을 수 있습니다.
Step 6. 다른 Method 이용하여 전송하기
Aptos Typescript SDK에는 이러한 과정 진행할 수 있는 다른 메서드를 제공하고 있습니다. 다음은 다른 메서드를 이용하여 APT Coin을 전송하는 코드입니다.
import {
Account,
Aptos,
AptosConfig,
Ed25519PrivateKey,
} from "@aptos-labs/ts-sdk";
const config = new AptosConfig({
fullnode: "your_Nodit_Aptos_testnet_node_endpoint",
indexer: "your_Nodit_Aptos_indexer_endpoint",
});
const aptos = new Aptos(config);
const privateKey = "your_private_key"; // 0x12345...
const ed25519Scheme = new Ed25519PrivateKey(privateKey);
const senderAccount = Account.fromPrivateKey({
privateKey: ed25519Scheme,
});
const receiverAddress = Account.generate().accountAddress.toString();
(async (senderAccount: Account, recipientAddress: string, amount: number) => {
try {
const senderAddress = senderAccount.accountAddress.toString();
// build transaction
const transaction = await aptos.transferCoinTransaction({
sender: senderAddress,
recipient: recipientAddress,
amount: amount,
});
// sign and submit transaction
const signAndSubmit = await aptos.signAndSubmitTransaction({
signer: senderAccount,
transaction,
});
const executedTransaction = await aptos.waitForTransaction({
transactionHash: signAndSubmit.hash,
});
console.log(executedTransaction);
} catch (error) {
console.error(error);
}
})(senderAccount, receiverAddress, 100_000_000);
transferCoinTransaction
메서드를 이용하여 RawTransaction을 생성하고 signAndSubmitTransaction
메서드를 이용하여 서명 값을 구해 RawTransaction과 함께 네트워크에 제출을 할 수 있습니다.
- 확인이 되지 않는다면 위의 코드와 다른 부분이 있는지 확인해 보세요.
- 위의 코드와 차이가 없는데 되지 않나요? 여기[QnA 링크]를 클릭하여 QnA로 남겨주세요!
Aptos는 매우 빠르게 업데이트 되고 있습니다!
Aptos 재단에서 배포한 SDK 버전에 따라 변경되는 점이 있을 수 있습니다. Nodit은 항상 이를 확인하고 있으나 시점에 따라 코드 변경으로 인한 오류가 발생할 수 있습니다.
Updated 4 months ago