
Solana Dev 101 — TypeScript로 Solana 토큰을 전송하는 방법
Solana에서는 대체 불가능 토큰(NFT)을 비롯한 토큰을 보관하고 관리하는 데 토큰 계정을 사용합니다. 이 때문에 Solana 초보 개발자에게는 코드로 토큰을 전송하는 과정이 다소 어려울 수 있습니다. 이 튜토리얼에서는 Solana 블록체인에서 한 지갑의 NFT를 다른 지갑으로 전송하는 방법을 알아봅니다. 수신자를 위한 새로운 연결 토큰 계정(ATA)을 생성하고 해당 계정으로 NFT를 전송합니다.
Kite로 Solana 프로그램을 간편하게 개발하세요.
NFT 전송과 SOL 전송의 차이점
토큰 전송에서는 이전 소유자에서 새 소유자로 전송을 시작하기 위해 새로운 연결 토큰 계정(ATA)을 생성해야 합니다. 지갑 → 지갑 방식으로 직접 전송되지 않습니다.
일반적인 SOL 전송과는 다릅니다. SOL 전송은 시스템 프로그램이 처리하므로 트랜잭션에 포함된 SOL을 보관할 새 ATA를 생성할 필요가 없습니다.
과정을 간단히 시각화한 자료는 다음과 같습니다.
요약하면, NFT/토큰 전송에서는 자산을 지갑으로 직접 보내는 대신 현재 ATA에서 수신자가 소유한 새 ATA로 보냅니다.
사전 요구 사항
이 튜토리얼을 시작하기 전에 다음 요구 사항을 충족하는지 확인하세요.
- TypeScript에 대한 기본 지식.
- 컴퓨터에 Node.js 설치.
- npm 또는 yarn 패키지 관리자 설치.
빌드 단계
이제 아래 단계에 따라 코드를 작성해 보겠습니다.
1. 프로젝트 설정
- “Transfer”라는 새 프로젝트 디렉터리를 만듭니다.
- 터미널을 열고 프로젝트 폴더로 이동합니다.
npm init -y또는yarn init -y명령어를 사용해 새 Node.js 프로젝트를 초기화합니다.- 다음 명령어를 실행해 필요한 종속성을 설치합니다.
npm install @solana/web3.js @solana/spl-token bs58- transferNFT.ts와 같은 새 TypeScript 파일을 만들고 코드 편집기에서 엽니다.
2. 라이브러리 가져오기
필요한 라이브러리를 가져오고 새 transferNFT.ts 파일에 전송 함수를 정의합니다.
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";
async function transfer() {
// Code for transferring NFTs goes here
}
transfer();위 코드에서는 필요한 패키지를 가져오고 전송 함수를 생성합니다.
3. Solana 네트워크 연결 설정
const connection = new Connection("https://rpc.helius.xyz/?api-key=");위 코드에서는 Helius RPC를 사용해 Solana 블록체인과 연결합니다.
4. 수수료 지불자와 이전 소유자의 키 쌍 정의
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));5. 민트 공개 키와 수신자 지갑 주소 지정
민트 공개 키는 전송할 NFT의 토큰 주소입니다.
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");6. 수신자의 연결 토큰 주소(ATA) 생성
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);이 코드에서는 새 ATA의 소유자를 다른 주소의 공개 키로 설정합니다. 이 주소는 트랜잭션 수수료 지불자일 필요가 없습니다.
receiveAddress을 자산을 받을 주소로 설정해야 합니다.
7. 소스 토큰 계정과 대상 계정의 공개 키 지정
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);8. 새 트랜잭션 생성 및 전송 명령 추가
const tx = new Transaction();
tx.add(
createTransferCheckedInstruction(
tokenAccount1Pubkey,
mintPubkey,
tokenAccount2Pubkey,
prevOwner.publicKey,
1, // Amount you are transferring.
0 // Decimals, since this is an NFT you can leave 0.
)
);위 코드에서는 다음을 수행합니다.
- 이전 토큰 계정과 현재 토큰 계정을 정의합니다.
- 민트 주소의 공급량이 1개뿐이므로 전송 수량을 1로 설정합니다.
- 대체 불가능 토큰 표준을 따르므로 소수 자릿수를 0으로 설정합니다. 대체 가능 토큰은 전송에 맞게 소수 자릿수를 설정할 수 있습니다.
9. Solana 네트워크로 트랜잭션 전송
const txhash = await connection.sendTransaction(tx, [feePayer, prevOwner]);
console.log(`Transaction hash: ${txhash}`);이제 sendTransaction 메서드로 트랜잭션을 완료하고 수수료 지불자와 자산의 이전 소유자가 서명하도록 지정합니다.
전체 코드
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";
async function transfer() {
// connection to Solana.
const connection = new Connection("https://rpc.helius.xyz/?api-key=");
// Payer of new ATA.
const feePayer = Keypair.fromSecretKey(
bs58.decode("privateKey")
);
// Previous owner of Token or NFT
const prevOwner = Keypair.fromSecretKey(
bs58.decode("privateKey")
);
// Mint address of the NFT.
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
// Recipient of the NFT.
const receiveAdress = new PublicKey('2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX')
// Original Token Account
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
let ata = await getAssociatedTokenAddress(
mintPubkey, // mint
receiveAdress // owner
);
// Create transfer instruction to from the previous ATA owned by old wallet, to new ATA.
const tokenAccount2Pubkey = new PublicKey(ata);
let tx = new Transaction();
tx.add(
createTransferCheckedInstruction(
tokenAccount1Pubkey, // from
mintPubkey, // mint
tokenAccount2Pubkey, // to
prevOwner.publicKey, // from's owner
1, // amount
0 // decimals
)
);
// Send Transaction here.
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer, prevOwner])}`);
}
transfer()코드의 자리표시자 값을 RPC URL, 비밀 키, 전송에 사용할 공개 키 등 실제 값으로 교체해야 합니다.
마무리
축하합니다! 새로운 연결 토큰 계정(ATA)을 생성하고 수신자 계정으로 NFT를 전송하는 코드를 성공적으로 작성했습니다. 이 튜토리얼을 통해 Solana 블록체인 연결 설정, ATA 생성, 트랜잭션 전송 방법을 배웠습니다. 이제 여기서 익힌 내용을 다양한 dApp 개발에 적용할 수 있습니다.
관련 아티클
Helius 구독하기
최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요


