Interacting with the Module

How to interact to your module?

튜토리얼에서는 배포한 Message Module을 이용하여 메시지를 변경하는 트랜잭션을 실행하고 이에 대한 결과를 확인하는 과정을 진행하며 Module의 함수를 이용하는 방법을 알아보겠습니다.

🚧

Module을 배포하지 못했나요?

Nodit에서 제공하는 Aptos Tutorials를 이용해 Module 배포 튜토리얼을 진행할 수 있습니다! 아래 링크를 클릭하여 Module에 대해 공부하고 나만의 Message 모듈을 배포해 보세요!


📘

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


Step 1. set_message 실행

Nodit Aptos Module 튜토리얼을 통해 배포한 Module에는 아래와 같이 set_message 함수가 정의되어 있습니다.

  public entry fun set_message(admin: &signer, message : String) acquires Message{
    let message_owner_address = signer::address_of(admin);
    if (exists<Message>(message_owner_address)) {
      let stored_message = borrow_global_mut<Message>(message_owner_address);
      stored_message.message = message;
    } else {
      move_to(admin, Message{
        message_counter : 1,
        message : message
      });
    }
  }

이를 바탕으로 해당 함수를 호출하는 코드를 작성합니다.

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 ownerAccount = Account.fromPrivateKey({
  privateKey: ed25519Scheme,
});

const message = "Input_your_Message";

(async (ownerAccount: Account, message: string) => {
  try {
    const transaction = await aptos.transaction.build.simple({
      sender: ownerAccount.accountAddress.toString(),
      data: {
        function:
          "module_owner_address::message_module_name::set_message", //0x1::aptos_account::transfer
        functionArguments: [message],
      },
    });

    const ownerAuthenticator = aptos.transaction.sign({
      signer: ownerAccount,
      transaction,
    });

    const submitTx = await aptos.transaction.submit.simple({
      transaction,
      senderAuthenticator : ownerAuthenticator,
    });

    const executedTransaction = await aptos.waitForTransaction({
      transactionHash: submitTx.hash,
    });

    console.log(executedTransaction);
  } catch (error) {
    console.error(error);
  }
})(senderAccount, message);

각 단계 별 코드 내용을 확인해 보도록 하겠습니다.


  1. Aptos 인스턴스 생성

Nodit의 Aptos Node Endpoint와 Aptos Indexer Endpoint를 이용해 새로운 AptosConfig 인스턴스를 생성하고 이를 바탕으로 Aptos 인스턴스를 생성합니다. 이러한 작업을 통해 사용자는 Nodit에서 제공하는 Aptos Full node와 Indexer API를 이용할 수 있습니다.

	const config = new AptosConfig({
  fullnode: "<Your_Nodit_Aptos_Node_API_Endpoint>",
  indexer: "<Your_Nodit_Aptos_Indexer_API_Endpoint>",
});
const aptos = new Aptos(config);

1-1. Account 생성

사용자의 Private Key를 이용해 Account를 생성합니다. 로직 상 module을 배포한 계정만 set_message를 호출할 수 있기 때문에 privateKey는 Module을 배포한 Account의 Private Key여야 합니다.

const privateKey = "your_private_key"; // 0x12345...
const ed25519Scheme = new Ed25519PrivateKey(privateKey);
const ownerAccount = Account.fromPrivateKey({
  privateKey: ed25519Scheme,
});

1-2. Faucet 받기 (Optional)

Module을 배포한 Account에 APT 코인이 없을 경우, 트랜잭션 실행에 필요한 Gas Fee를 지불하지 못해 트랜잭션이 실행되지 않을 수 있습니다. 따라서 APT 코인을 Faucet 받은 후 진행해야 합니다. (이미 APT 코인을 가지고 있는 경우 해당 function을 실행하지 않아도 이후 단계를 진행할 수 있습니다.)

async function getFaucet(accountAddress: string, amount: number) {
  try {
    await aptos.fundAccount({
      accountAddress: accountAddress,
      amount: amount,
    });
  } catch (error) {
    console.log(error);
  }
}

  1. 트랜잭션 실행 함수 작성

사용자가 작성할 메시지를 message 변수에 할당합니다. 이후 set_message를 호출할 실행 함수를 작성합니다.

해당 함수는 사용자가 작성한 메시지를 사용자가 배포한 Message Module의 set_message 함수에 인자로 입력하여 set_message 함수를 호출하는 RawTransaction을 생성합니다.

이후 서명 값을 구해 서명 값과 RawTransaction을 네트워크에 제출하여 트랜잭션을 실행합니다.


let message = "Input_your_Message";

(async (ownerAccount: Account, message: string) => {
  try {
    const ownerAddress = ownerAccount.accountAddress.toString();
    const transaction = await aptos.transaction.build.simple({
      sender: ownerAddress,
      data: {
        function: "module_owner_address::message::set_message", //0x1::aptos_account::transfer
        functionArguments: [message],
      },
    });

    const ownerAuthenticator = aptos.transaction.sign({
      signer: ownerAccount,
      transaction,
    });

    const submitTx = await aptos.transaction.submit.simple({
      transaction,
      senderAuthenticator: ownerAuthenticator,
    });

    const executedTransaction = await aptos.waitForTransaction({
      transactionHash: submitTx.hash,
    });

    console.log(executedTransaction);
  } catch (error) {
    console.error(error);
  }
})(ownerAccount, message);


  1. 코드 실행

지금까지 작성한 내용을 토대로 ts 파일을 실행하여 Message를 Aptos 네트워크에 작성해 보세요! 그리고 Aptos Explorer에서 자신의 주소를 검색해 [Resources] 탭에서 나의 메시지를 확인해 보세요!


Step 2. Message 확인하기

Message를 확인할 수 있는 방법은 get_message 함수를 호출하는 것과 Message 구조체를 가진 계정의 Resource를 조회하는 방법이 있습니다. 다음은 계정의 Resource를 조회하는 방법입니다.

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 ownerAccount = Account.fromPrivateKey({
  privateKey: ed25519Scheme,
});

const ownerAddress = ownerAccount.accountAddress.toString();

(async (address: string) => {
  try {
    const result = await aptos.getAccountResource({
      accountAddress: address,
      resourceType: "module_owner_address::message::Message", //0x1::aptos_account::Account
    });
    console.log(result);
  } catch (error) {
    console.error(error);
  }
})(ownerAddress);


혹은 Node API를 이용해서 get_message 함수를 호출할 수 있습니다. 아래의 코드에 Nodit API Key를 입력한후 터미널에 다음과 같이 작성하여 호출해 보세요.

curl --request POST \
  --url https://aptos-testnet.nodit.io/v1/view \
  --header 'Accept: application/json, application/x-bcs' \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: your_nodit_API_Key' \
  --data '{
  "function": "module_owner_address::message_module_name::get_message",
  "type_arguments": [
  ],
  "arguments": [
   "input_owner_address"
  ]
}'

set_message를 이용해 Aptos 네트워크에 저장한 message가 확인되시나요?


  • 확인이 되지 않는다면 위의 코드와 다른 부분이 있는지 확인해 보세요.
  • 위의 코드와 차이가 없는데 되지 않나요? 여기[QnA 링크]를 클릭하여 QnA로 남겨주세요!

📘

Aptos는 매우 빠르게 업데이트 되고 있습니다!

Aptos 재단에서 배포한 SDK 버전에 따라 변경되는 점이 있을 수 있습니다. Nodit은 항상 이를 확인하고 있으나 시점에 따라 코드 변경으로 인한 오류가 발생할 수 있습니다.