EPguy

[솔라나 Dapp 튜토리얼 - 1] Hello World를 출력하는 솔라나 프로그램을 개발해보자 ! 본문

개발/Solana Dapp Tutorial

[솔라나 Dapp 튜토리얼 - 1] Hello World를 출력하는 솔라나 프로그램을 개발해보자 !

EPguy 2024. 2. 13. 10:44

이 글에선 브라우저 기반 IDE인 Solana Playground를 사용하여 "Hello world" 를 출력하는 프로그램을 개발 및 배포하고 Typescript로 상호작용 하는 방법을 소개합니다.

1. 이 글에서 어떤걸 배울 수 있나요?

  • Solana Playground 를 사용하는 방법
  • Solana Playground에서 지갑을 생성하는 방법
  • Rust로 Solana Program을 작성하는 방법
  • Solana Rust Prgogram 을 배포하는 방법
  • 온체인에 배포된 프로그램을 Typescript를 이용해서 상호작용 하는 방법

 

2. Solana Playground 사용하기

Solana Playground는 브라우저 기반 IDE 입니다. 여기선 어떠한 설치도 필요하지 않고

오로지 브라우저만으로 솔라나 프로그램을 작성, 빌드, 배포할 수 있습니다.

 

프로젝트 Import 하기

새 탭을 열어 Solana Playground 에 접속하여 저희가 개발할 프로젝트인

"Hello World" 프로젝트를 Import 합니다. 왼쪽에 있는 Import 버튼을 누른 후

hello_world 라는 이름으로 프로젝트를 생성합니다.

Import를 안해도 빌드 및 배포를 할 수 있지만 코드 수정은 할 수 없습니다.

지갑 생성하기

맨 아래에 있는 Not Connected 버튼을 누르면 지갑을 생성 할 수 있습니다.
지갑을 생성하면 지갑의 주소및 Sol 잔액을 확인이 가능합니다.

지갑을 생성하면 브라우저의 Local Storage 에 저장됩니다. 따라서 브라우저 캐시를 지우면 지갑도 삭제되므로 지갑 생성 시 keypair를 따로 > 저장해 두는것을 추천합니다.

EndPoint를 Testnet으로 변경하고 2 SOL 에어드랍 받기

아래 톱니바퀴 버튼을 눌러 EndPointtestnet으로 변경합니다.

그리고 terminal에solana airdrop 2 를 입력하여 2 SOL를 에어드랍을 받습니다.

 

3. Solana Program 개발하기

Rust 기반 Solana 프로그램의 코드는 src/lib.rs 파일에 있습니다.

Playground에서 src/lib.rs파일을 엽니다.

solana_program 크레이트 가져오기

먼저 프로그램을 작성하기 위해 필요한 크레이트들을 import 해야합니다.

use solana_program::{
    account_info::AccountInfo,
    entrypoint,
    entrypoint::ProgramResult,
    pubkey::Pubkey,
    msg,
};

프로그램 로직 작성하기

온체인 프로그램의 시작점을 먼저 작성해야합니다.

온체인 프로그램과의 모든 상호작용은 process_instruction이라는 공용 함수에서 부터 시작됩니다.

pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    Ok(())
}

 

process_instruction은 총 3가지의 파라미터를 받습니다.

 

1. program_id : 프로그램의 publick key입니다.

2. accounts  :  프로그램에서 사용되는 account들 입니다. 저희는 간단한 Hello World 프로그램이기 때문에 이 파라미터는 사용하지 않습니다.

3. instruction_data  :  프로그램에 전달된 bytes data 입니다. 이 파라미터도 저희는 사용하지 않습니다.

 

Rust에선 로그를 찍을때 println!을 사용했지만 솔라나에서는 msg!를 사용하여 로그를 찍습니다.

msg!("Hello, world!");

 

온체인 프로그램과 상호작용을 하기 위해선 먼저 엔트리포인트 정의를 해야합니다.

엔트리포인트 정의는 solana_program 크레이트 내에 있는 entrypoint!매크로를 사용하여 정의할 수 있습니다.

이 코드는 최상단(import 바로 밑에) 작성해주면 됩니다. 

entrypoint!(process_instruction);

 

4. Solana Program 빌드 및 배포하기

왼쪽에 도구 아이콘을 눌러 BUILD & DEPLOY 메뉴로 들어갑니다.

이 메뉴에선 작성한 코드를 빌드하고 배포할 수 있습니다.

빌드하기

Build 버튼을 누르거나 terminal 에서 build 명령어를 입력하여 저희가 작성한 코드를 빌드해줍니다.

저희는 process_instruction 함수의 파라미터들을 사용하지 않았기 때문에 빌드를 하면 3개의 Warning 을 보실 수 있는데 이건 그냥 무시하셔도 됩니다.

배포하기

배포를 하기 위해선 소량의 SOL이 필요합니다. 저희는 아까 2SOL을 에어드랍 받았기 때문에 솔라나는 충분히 갖고 있습니다.  Deploy 버튼을 누르거나 teminal 에서 deploy 명령어를 입력하여 프로그램을 온체인에 배포해줍니다.

배포가 완료되었으면 이제 이 프로그램은 솔라나 on-chain에 등록이 된겁니다.

이제 on-chain에 등록된 프로그램을 Typescript를 사용하여 상호작용 할 차례입니다.

 

5. Solana Client 개발하기

on-chain에 등록된 프로그램과 상호작용을 하기 위해선 @solana/web3.js 라이브러리를 사용해야 합니다.

Playground에서 Client  세팅하기

저희는 Solana Playground 에 client generation을 사용하여 쉽게 Client를 세팅할 수 있습니다.

termianl에 client 명령어를 입력하여 client 폴더와 client.ts 파일을 생성합니다.

Playground globals

playground 에서는 많은 유틸리티들을 따로 설치나 임포트 없이 글로벌 하게 사용할 수 있습니다.

예를들어 pg 라이브러리를 사용하여 프로그램 ID 를 불러올 수도 있습니다.

client.ts에 아래 코드를 작성하여 Run 버튼을 눌러 실행해보면 프로그램 ID가 찍히는걸 볼수있습니다.

console.log(pg.PROGRAM_ID.toString());

프로그램 호출하기

온체인 프로그램을 실행하기 위해서는 트랜잭션을 전송해야합니다.

솔라나 블록체인에 제출된 각 트랜잭션에는 명령어 목록이 포함되어 있습니다.

 

새 트랜잭션을 추가하고 저희가 배포한 hello world 프로그램 명령어를 트랜잭션에 추가해줍니다.

// 빈 트랜잭션 생성
const transaction = new web3.Transaction();

// hello world 프로그램을 트랜잭션에 추가해줌.
transaction.add(
  new web3.TransactionInstruction({
    keys: [],
    programId: new web3.PublicKey(pg.PROGRAM_ID),
  }),
);

 

각 명령어에는 작업에 관련된 모든 키와 실행하고자 하는 프로그램 ID가 포함되어야합니다.

저희가 만든 프로그램은 hello world 만 출력하기 때문에 어떠한 키도 필요 하지 않습니다.

console.log("Sending transaction...");
const txHash = await web3.sendAndConfirmTransaction(
  pg.connection,
  transaction,
  [pg.wallet.keypair],
);
console.log("Transaction sent with hash:", txHash);

 

트랜잭션을 만들고나면 cluster에게 전달하면 됩니다.

서명자 배열의 첫번째 서명자는 기본적으로 거래 수수료를 납부할 계정입니다.
저희는 저희 지갑의 keypair를 사용하면 됩니다.

애플리케이션 실행

애플리케이션 코드를 다 작성했으면 terminal 에서 run 명령어를 입력하여 실행하면됩니다.

실행이 정상적으로 되면 아래처럼 출력되는걸 볼 수 있습니다.

참고로 터미널 내에 텍스트 복사는CTRL+SHIFT+C(CMD+SHIFT+C on macOS)로 복사하면됩니다. 

Running client...
  client.ts:
    My address: GkxZRRNPfaUfL9XdYVfKF3rWjMcj5md6b6mpRoWpURwP
    My balance: 5.7254472 SOL
    Sending transaction...
    Transaction sent with hash: 2Ra7D9JoqeNsax9HmNq6MB4qWtKPGcLwoqQ27mPYsPFh3h8wignvKB2mWZVvdzCyTnp7CEZhfg2cEpbavib9mCcq

트랜잭션 로그 조회하기

아래 명령어를 terminal에 작성하면 트랜잭션에 대한 정보를 조회할 수 있습니다.

위에서 콘솔에서 찍어놨던 트랜잭션 hash를 복사해 트랜잭션 정보를 확인해봅시다.

solana confirm -v <TRANSACTION_HASH>

 

짠! Log에 Hello World 가 찍힌걸 볼 수 있습니다.

 

여기까지 Playground를 이용하여 프로그램을 작성하고 배포한 다음 해당 프로그램과 상호작용하는 애플리케이션을 만들어봤습니다 !! 끝까지 봐주신 여러분들에게 감사드립니다.🤗