Sending APT Coin

How to Transfer APT?

트랜잭션을 실행하여 보유하고 있는 APT Coin을 다른 계정으로 전송할 수 있습니다. Aptos 네트워크의 모든 트랜잭션은 다음과 같은 순서로 실행됩니다.

  1. 트랜잭션 빌드
    • 필요한 데이터를 입력하여 Raw Transaction을 생성합니다.
  2. 트랜잭션 시뮬레이션(선택 사항)
    • 트랜잭션 서명 및 제출 전 시뮬레이션을 진행하여 트랜잭션의 결과를 미리 확인합니다.
  3. 트랜잭션 서명
    • Sender Account를 이용하여 트랜잭션에 서명합니다.
  4. 트랜잭션 제출
    • 트랜잭션을 Aptos 네트워크로 제출합니다.
  5. 트랜잭션 결과 확인
    • 트랜잭션이 네트워크에서 commit된 것을 확인한 후 결과를 확인합니다.

이번 튜토리얼에서는 이러한 순서를 따라 APT를 전송하는 트랜잭션을 실행해 보도록 하겠습니다.


📘

이 튜토리얼을 통해 아래 내용을 배울 수 있습니다!


트랜잭션을 실행하기 위한 전체적인 코드는 다음과 같습니다.

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은 항상 이를 확인하고 있으나 시점에 따라 코드 변경으로 인한 오류가 발생할 수 있습니다.