신규: Helius가 Light Protocol을 인수했습니다
Solana에서 Shadow Drive에 파일을 업로드하는 방법
블로그/개발

Solana에서 Shadow Drive에 파일 업로드하기

개발자 관계 책임자LinkedIn의 Hunter Davis
읽는 데 4분

개요

Solana는 비용이 높고 저장 용량이 제한적이어서 대량의 데이터를 저장하려면 지나치게 많은 비용이 듭니다. 이러한 한계를 극복하기 위해 GenesysGo가 만든 Shadow Drive 같은 오프체인 스토리지 솔루션이 주목받고 있습니다.

Shadow Drive는 Solana에서 대량의 데이터를 비용 효율적으로 빠르게 저장할 수 있는 옵션입니다. 다만 메인넷 토큰이 필요하며, SOL → SHDW 스왑을 통해 확보할 수 있습니다.

이 튜토리얼에서는 TypeScript를 사용해 Shadow Drive에 파일을 업로드하는 과정을 안내합니다.

사전 준비 사항

시작하기 전에 Backpack Wallet 확장 프로그램과 다음 항목이 설치되어 있는지 확인하세요.

Node.js

코드
sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)"

Solana CLI 설치

코드
npm install -g ts-node

환경 설정

프로젝트 생성

  1. 터미널에서 Shadow라는 새 폴더를 만듭니다.
  2. Shadow 폴더 안에 upload.ts라는 새 파일을 만듭니다.
  3. 필요한 패키지를 설치합니다.
코드
npm install @shadow-drive/sdk @project-serum/anchor

     4. 다음 명령어로 지갑을 생성합니다.

코드
solana-keygen grind --starts-with N:1

     5. "Shadow" 폴더 안에 "helius.txt"라는 파일을 만들고 내용을 추가합니다. 이 예시에서는 다음 내용만 입력합니다.

이 단계를 완료하면 파일 디렉터리 구조는 다음과 같아야 합니다.

  1. [walletAddress].json 파일을 열고 비밀 키를 복사합니다. 예제를 진행하려면 이 지갑에 자금을 충전해야 합니다.
  2. Chrome 웹 스토어에서 브라우저용 Backpack Wallet 확장 프로그램을 설치합니다.
  3. Backpack Wallet 확장 프로그램을 열고 "설정"으로 이동합니다.

      4. 설정 메뉴에서 "지갑"을 선택합니다.

      5. 오른쪽 상단의 "+" 버튼을 클릭해 새 지갑을 추가합니다.

      6. 지갑 유형으로 Solana를 선택합니다. "비밀 키로 가져오기"를 선택합니다.

        7. 지갑 파일의 내용을 가져오기 필드에 붙여 넣고 "가져오기"를 클릭합니다.

가져오기가 완료되면 지갑에서 공개 키를 복사합니다. 다른 Solana 지갑에서 0.03 SOL 미만을 이 테스트 지갑으로 전송해 자금을 충전할 수 있습니다.

SHDW 토큰 확보

SHDW Drive에서 스토리지 계정을 생성하려면 SHDW(SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y)라는 토큰이 필요합니다. Solana의 Jupiter에서 스왑해 SHDW 토큰을 확보할 수 있습니다.

  1. Jupiter에 접속해 SOL을 SHDW 토큰으로 스왑합니다.
  2. SHDW로 스왑할 SOL 수량을 입력하고 "스왑"을 클릭합니다. 이 테스트에는 1 SHDW 미만만 필요합니다. 이는 0.01 SOL에 해당합니다.

      3. 트랜잭션을 확인합니다. 트랜잭션이 승인되면 SHDW 토큰이 지갑에 표시됩니다.

빌드 단계

1. SHDW 연결 설정

upload.ts 파일에서 필요한 모듈을 가져오고 SHDW 네트워크 연결을 설정합니다. 코드를 포함할 main 비동기 함수를 생성합니다.

코드
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key = require('./{wallet_address}.json');
const fs = require('fs');
const rpc = "https://rpc.helius.xyz/?api-key="
async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        rpc , "confirmed"
    );    
		const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		console.log(drive)
}
main();

rpc 변수의 api-key을 유효한 API 키로 바꾸세요. API 키는 Helius Developer Portal에서 발급받을 수 있습니다. 또한 const key을 앞서 생성한 지갑의 올바른 파일 이름으로 바꾸세요.

지금 ts-node upload.ts로 파일을 실행하면 터미널에 다음 결과가 표시됩니다.

코드
ShdwDrive {
  connection: Connection {
    _commitment: 'confirmed',
    _confirmTransactionInitialTimeout: undefined,
    _rpcEndpoint: 'https://rpc.helius.xyz/?api-key=',
...

2. 스토리지 계정 생성

스토리지 계정을 생성하려면 main 함수 안에 다음 코드를 추가합니다.

코드
const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
console.log(newAccount);

여기서 ts-node upload.ts 명령어를 실행하면 새로 생성된 스토리지 계정의 ID와 트랜잭션 서명이 출력됩니다.

코드
{
  shdw_bucket: '5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1',
  transaction_signature: '4EFw2R7KNw45Rngg6MASqfhGDpeZvcaoQHApADhopD9WQxB6XMYBcshd7neyLFa6QtKZC5H9U5iTnggUuhdNDLfE'
}

3. 파일 업로드

스토리지 계정을 만들었으므로 이제 파일을 업로드할 수 있습니다. main 함수 안에 다음 코드를 추가합니다.

코드
const accts = await drive.getStorageAccounts("v2");
const fileBuff = fs.readFileSync("./helius.txt");
let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
const fileToUpload: ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
console.log(uploadFile);

위 코드는 네 가지 주요 작업을 수행합니다.

  1. 로컬 파일 helius.txt를 버퍼로 읽습니다.
  2. 생성한 스토리지 계정을 찾고 계정 공개 키로 정의합니다.
  3. 파일 이름과 데이터가 포함된 ShadowFile 객체를 생성합니다.
  4. uploadFile 함수를 사용해 지정된 스토리지 계정에 파일을 업로드합니다.

이제 다음 명령어를 실행해 업로드를 시작할 수 있습니다.

코드
ts-node upload.ts

콘솔에 다음 결과가 표시됩니다.

코드
{
  finalized_locations: [
    'https://shdw-drive.genesysgo.net/5pzNpvGk3VK4XsqoCoJpqfXE7vioKkr7t4UEqbHkqnz1/helius.txt'
  ],
  message: '3UNhH2UMys8GxqSouVPtKLAd3rcP7m3oP8LwvwH8HSp3yChaYPSaAhjub5iV2i1LDvSU3JZ9ck322kt7QhRdbMhY',
  upload_errors: []
}

이제 파일이 업로드되었습니다. 생성된 finalized_location 링크에 접속해 파일이 올바르게 업로드되었는지 확인하세요.

파일의 URL은 https://shdw-drive.genesysgo.net/[storage_account_address]/[file_name] 형식입니다.

즉, 이 스토리지 계정에 업로드된 모든 파일은 URL 앞부분이 같고 파일 이름만 달라집니다. 파일을 저장할 별도의 스토리지 계정을 만들 수도 있습니다.

지갑을 확인하면 이 작업을 완료하는 데 0.00244 SHDW만 사용된 것도 확인할 수 있습니다.

전체 코드

코드
const anchor = require("@project-serum/anchor");
const { Connection, clusterApiUrl, Keypair } = require("@solana/web3.js");
const { ShdwDrive, ShadowFile } = require("@shadow-drive/sdk");
const key =  require('./wallet.json');
const fs = require('fs');

async function main() {
    let secretKey = Uint8Array.from(key);
    let keypair = Keypair.fromSecretKey(secretKey);
    const connection = new Connection(
        "https://rpc.helius.xyz/?api-key=", "confirmed"
    );    const wallet = new anchor.Wallet(keypair);
    const drive = await new ShdwDrive(connection, wallet).init();
		const newAccount = await drive.createStorageAccount("heliusDemo", "1MB", "v2");
		console.log(newAccount);  
    const accts = await drive.getStorageAccounts("v2");
    const fileBuff = fs.readFileSync("./helius.txt");
    let acctPubKey = new anchor.web3.PublicKey(accts[0].publicKey);
    const fileToUpload: typeof ShadowFile = {
    name: "helius.txt",
    file: fileBuff,
    };
    const uploadFile = await drive.uploadFile(acctPubKey, fileToUpload);
    console.log(uploadFile);

}
main();

마무리

완료했습니다! TypeScript를 사용해 Shadow Drive에 파일을 성공적으로 업로드했습니다. 이 기본 지식을 활용하면 SHDW의 탈중앙화 기능을 이용하고 더 고급 활용 사례로 확장할 수 있습니다. 예를 들어 이 튜토리얼을 확장해 웹 애플리케이션에 파일 업로드 기능을 통합하거나 탈중앙화 파일 스토리지 서비스를 만들 수 있습니다. 더 다양한 활용 방법은 Shadow Drive SDK 공식 문서를 확인하세요.

‍

Helius 구독하기

최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요

확대 이미지