솔라나의 토큰

토큰은 다양한 카테고리의 자산에 대한 소유권을 나타내는 디지털 자산입니다. 토큰화는 재산권의 디지털화를 가능하게 합니다. 솔라나의 토큰은 SPL (Solana Program Library) 토큰이라고 불립니다.

이 섹션에서는 솔라나에서 토큰이 어떻게 표현되는지에 대한 기본 개념을 다룹니다. 코드 예제는 SPL 토큰 기초 섹션을 참조하세요.

주요 포인트

  • Token Program은 네트워크에서 토큰(대체 가능 및 대체 불가능 토큰 모두)과 상호 작용하기 위한 모든 명령 로직을 포함합니다.

  • Mint Account는 특정 토큰을 나타내며 총 공급량과 민트 권한(토큰의 새 단위를 생성할 권한이 있는 주소)과 같은 토큰에 대한 전역 메타데이터를 저장합니다.

  • Token Account는 특정 소유자를 위한 특정 mint account의 토큰에 대한 개별 소유권을 추적합니다.

  • Associated Token Account는 소유자와 mint account 주소에서 파생된 주소로 생성된 Token Account입니다.

Token Programs

솔라나 생태계에는 두 가지 주요 Token Program이 있습니다. 아래는 두 프로그램의 소스 코드입니다.

Token Program은 네트워크에서 토큰(대체 가능 및 대체 불가능 토큰 모두)과 상호 작용하기 위한 모든 명령 로직을 포함합니다. 솔라나의 모든 토큰은 실질적으로 Token Program이 소유한 데이터 계정입니다.

Token ProgramToken Program

Mint Account

솔라나의 토큰은 Token Program이 소유한 Mint Account의 주소로 고유하게 식별됩니다. 이 계정은 특정 토큰에 대한 글로벌 카운터 역할을 하며 다음과 같은 데이터를 저장합니다:

  • 공급량: 토큰의 총 공급량
  • 소수점: 토큰의 소수점 정밀도
  • 발행 권한: 토큰의 새 단위를 생성하여 공급량을 증가시킬 수 있는 권한이 있는 계정
  • 동결 권한: Token Account에서 토큰을 동결하여 전송이나 소각을 방지할 수 있는 권한이 있는 계정

Mint AccountMint Account

각 Mint Account에 저장된 전체 세부 정보는 다음과 같습니다:

Mint Account State
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

참고로, 다음은 USDC Mint Account의 Solana Explorer 링크입니다.

Token Account

Token Program은 각 토큰 단위의 개별 소유권을 추적하기 위해 Token Accounts를 생성합니다. Token Account는 다음과 같은 데이터를 저장합니다:

  • Mint: Token Account가 보유하고 있는 토큰 유형
  • Owner: Token Account에서 토큰을 전송할 권한이 있는 계정
  • Amount: Token Account가 현재 보유하고 있는 토큰의 수량

Token AccountToken Account

각 Token Account에 저장된 전체 세부 정보는 다음과 같습니다:

Token Account State
pub struct Account {
/// The mint associated with this account
pub mint: Pubkey,
/// The owner of this account.
pub owner: Pubkey,
/// The amount of tokens this account holds.
pub amount: u64,
/// If `delegate` is `Some` then `delegated_amount` represents
/// the amount authorized by the delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub state: AccountState,
/// If is_native.is_some, this is a native token, and the value logs the
/// rent-exempt reserve. An Account is required to be rent-exempt, so
/// the value is used by the Processor to ensure that wrapped SOL
/// accounts do not drop below this threshold.
pub is_native: COption<u64>,
/// The amount delegated
pub delegated_amount: u64,
/// Optional authority to close the account.
pub close_authority: COption<Pubkey>,
}

지갑은 보유하고자 하는 각 토큰(mint)에 대해 token account가 필요하며, 지갑 주소가 token account 소유자로 설정됩니다. 각 지갑은 동일한 토큰(mint)에 대해 여러 token account를 소유할 수 있지만, 하나의 token account는 하나의 소유자만 가질 수 있으며 하나의 토큰(mint) 단위만 보유할 수 있습니다.

Account RelationshipAccount Relationship

각 Token Account의 데이터에는 Token Account에 대한 권한을 가진 사람을 식별하는 owner 필드가 포함되어 있습니다. 이는 모든 Token Account에 대해 Token Program인 기본 Account 유형에 지정된 프로그램 소유자와는 다릅니다.

Associated Token Account

Associated Token Account는 특정 mint와 소유자에 대한 token account의 주소를 찾는 과정을 단순화합니다. Associated Token Account를 특정 mint와 소유자에 대한 "기본" token account로 생각하면 됩니다.

연결 토큰 계정(Associated Token Account)은 소유자의 주소와 민트 계정의 주소에서 파생된 주소로 생성됩니다. 연결 토큰 계정은 특정 주소를 가진 일반 토큰 계정일 뿐이라는 점을 이해하는 것이 중요합니다.

이는 Solana 개발에서 핵심 개념을 소개합니다: Program Derived Address (PDA). PDA는 미리 정의된 입력을 사용하여 주소를 결정론적으로 도출하므로 계정의 주소를 쉽게 찾을 수 있습니다.

연결 토큰 계정연결 토큰 계정

동일한 민트의 토큰을 보유하기 위해 각 지갑은 자체 토큰 계정이 필요하다는 점에 유의하세요.

확장된 계정 관계확장된 계정 관계

토큰 CLI 예제

spl-token CLI는 SPL 토큰을 실험하는 데 도움이 됩니다. 아래 예제는 Solana Playground 터미널을 사용하여 로컬 설치 없이 브라우저에서 직접 CLI 명령을 실행합니다.

토큰 및 계정 생성에는 계정 임대 보증금과 트랜잭션 수수료를 위한 SOL이 필요합니다. Solana Playground를 처음 사용하는 경우, Playground 지갑을 만들고 Playground 터미널에서 solana airdrop 1 명령을 실행하세요. 공개 웹 수도꼭지(faucet)에서 devnet SOL을 얻을 수도 있습니다.

solana airdrop 1

spl-token --help를 실행하여 사용 가능한 모든 명령을 확인하세요.

spl-token --help

spl-token CLI를 로컬에 설치하려면 다음을 실행하세요:

cargo install spl-token-cli

더 많은 예제는 spl-token 문서에서 찾을 수 있습니다.

터미널 출력에 표시되는 계정 주소는 아래 예제와 다릅니다. 따라할 때는 Playground 터미널에서 나온 주소를 사용하세요. 예를 들어, spl-token create-token 명령은 Playground 지갑을 민트 권한자로 하는 민트 계정 주소를 출력합니다.

새 토큰 생성하기

새 토큰(민트 계정)을 생성하려면 다음을 실행하세요:

spl-token create-token

출력은 다음과 같습니다:

Creating token 4VNVRJetwapjwYU8jf4qPgaCeD76wyz8DuNj8yMCQ62o
Signature: 3E6UFVamHCm6Bgk8gXdWyx9Q9QRN9Ztpd5nhyFTgE39pqXbTm1HnpKUMBMK8q2xUVbUKQrJw7PrmTZ4nkPQkTnVT

새로운 mint account는 공급량이 0으로 시작합니다. 현재 공급량을 다음과 같이 확인하세요:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

새 토큰에 대한 supply 명령은 0를 반환합니다:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

새 Mint Account를 생성하려면 두 개의 명령어가 포함된 트랜잭션이 필요합니다. 다음은 Solana Playground에서의 자바스크립트 예제입니다.

  1. System Program이 Mint Account 데이터를 위한 공간이 있는 새 계정을 생성하고 소유권을 Token Program으로 이전합니다.

  2. Token Program이 새 계정의 데이터를 Mint Account로 초기화합니다

token account 생성하기

특정 mint의 토큰을 보유하려면 token account를 생성하세요:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

명령어 예시:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

출력:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

create-account 명령은 사용자의 지갑 주소를 소유자로 하는 associated token account를 생성합니다.

다른 소유자로 token account를 생성하려면:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

참고: <TOKEN_ADDRESS>는 token account의 mint account를 지정합니다.

명령어 예시:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

출력:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

Associated Token Account를 생성하려면 Associated Token Program을 호출하는 하나의 명령어가 필요합니다. Solana Playground에서 자바스크립트 예제를 확인하세요.

Associated Token Program은 크로스 프로그램 호출을 사용하여:

Associated Token Account 주소 대신 새로운 keypair로 새 Token Account를 생성하려면 두 개의 명령어가 포함된 트랜잭션을 전송하세요. 다음은 Solana Playground의 자바스크립트 예제입니다.

  1. System Program이 Token Account 데이터를 위한 공간이 있는 새 계정을 생성하고 소유권을 Token Program에 이전합니다.

  2. Token Program이 데이터를 Token Account로 초기화합니다

토큰 발행하기

토큰의 새 단위를 생성하려면 Token Account에 토큰을 발행하세요:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

명령어 예시:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

출력:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

다른 token account에 토큰을 발행하려면:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

출력:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7

Token Program의 MintTo 명령어는 새 토큰을 생성합니다. 발행 권한자가 트랜잭션에 서명해야 합니다. 이 명령어는 Token Account에 토큰을 발행하고 Mint Account의 총 공급량을 증가시킵니다. Solana Playground에서 자바스크립트 예제를 확인하세요.

토큰 전송하기

token account 간에 토큰을 전송하려면:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

명령어 예시:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

출력:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o

Token Program의 Transfer 명령어는 토큰 전송을 처리합니다. 발신자의 Token Account 소유자가 트랜잭션에 서명해야 합니다. 이 명령어는 Token Account 간에 토큰을 이동시킵니다. Solana Playground에서 자바스크립트 예제를 확인하세요.

발신자와 수신자 모두 특정 토큰(mint)에 대한 token account가 필요합니다. 발신자는 동일한 트랜잭션에서 수신자의 token account를 생성하는 명령어를 포함할 수 있습니다.

토큰 메타데이터 생성하기

Token Extensions Program을 사용하면 메타데이터(이름, 심볼, 이미지 링크)를 Mint Account에 직접 저장할 수 있습니다.

메타데이터 확장 기능이 있는 토큰을 생성하려면:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

출력:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.
Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

메타데이터를 초기화하려면:

Terminal
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

토큰 URI는 오프체인 메타데이터에 연결됩니다. JSON 형식 예시는 여기에서 확인하세요.

명령어 예시:

Example
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

Solana Explorer에서 메타데이터를 확인하세요.

자세한 내용은 메타데이터 확장 가이드에서 확인하세요. Token Extensions에 대한 자세한 내용은 Token Extensions 시작 가이드SPL 문서를 참조하세요.

Is this page helpful?

목차

페이지 편집