신규: Helius가 Light Protocol을 인수했습니다
TypeScript와 Poseidon으로 Solana 프로그램 구축하기
블로그/개발

Poseidon: TypeScript로 Solana 프로그램 구축하기

Solana 인재를 키우는 엔진.X의 Team Turbin3LinkedIn의 Team Turbin3
읽는 데 8분

Poseidon은 전 세계 수백만 명에게 익숙한 TypeScript만으로 웹 개발자가 Solana 온체인 프로그램, 즉 스마트 컨트랙트를 만들 수 있게 해주는 새로운 트랜스파일러 프레임워크입니다. 온체인 개발의 진입 장벽을 크게 낮춰 더 많은 개발자가 Solana를 활용할 수 있게 합니다. Poseidon은 TypeScript 코드를 Solana에서 가장 널리 사용되는 프로그램 프레임워크인 Anchor로 직접 변환합니다.

이 글에서는 Poseidon의 탄생 배경, 아키텍처 설계, 주요 기능과 Solana 개발 생태계에 미칠 긍정적 영향을 살펴봅니다. 또한 Poseidon으로 작성한 간단한 토큰 볼트 프로그램의 실용적인 예제를 통해 프레임워크의 주요 기능을 소개합니다.

배경

2023년 말, Turbin3 팀은 Solana Foundation으로부터 야심 찬 과제를 받았습니다. “개발자가 TypeScript로 Solana 프로그램을 만들 수 있는 프레임워크를 구축할 수 있나요?” 당연히 첫 반응은 “왜 필요한가요?”였습니다.

TypeScript는 JavaScript의 정적 타입 슈퍼셋으로, 개발자가 오류를 더 일찍 발견하고 유지보수하기 쉬운 코드를 작성하도록 돕습니다. 현대 웹 개발의 사실상 표준인 TypeScript와 JavaScript는 세계 최대 규모의 개발자 커뮤니티 중 하나를 형성했습니다. TypeScript로 프로그램을 개발할 수 있게 되면 새로운 Solana 개발자층을 크게 확대하고 블록체인 개발의 진입 장벽을 낮출 수 있습니다.

Solana 프로그램 개발을 익히는 일은 다른 여러 블록체인에 비해 어렵습니다. 신규 개발자는 Solana의 계정 모델을 이해하는 동시에 Rust도 배워야 하므로 학습 곡선이 가파릅니다. Turbin3는 이를 누구보다 잘 알고 있습니다. 전체 신규 Solana 개발자의 15%가 Turbin3 프로그램을 거칩니다.

TypeScript 프레임워크를 도입하면 개발자는 이 두 과제를 분리할 수 있습니다. 이미 알고 있는 언어를 활용해 첫 프로그램을 테스트넷에 더 빠르게 배포할 수 있습니다. TypeScript 기반 온체인 프로그램 개발 프레임워크를 사용하면 처음으로 단일 언어만으로 풀스택 Solana 애플리케이션을 매끄럽게 구축할 수 있습니다.

솔루션: Poseidon

이 프로젝트는 기본적인 타입 라이브러리와 트랜스파일러 구상으로 시작했습니다. 하지만 초기 프로토타이핑과 Solana 및 TypeScript 전문가의 면밀한 피드백을 거치며 훨씬 강력한 프로젝트로 빠르게 성장했습니다. 수개월간 구축, 테스트, 문제 해결을 반복하고 업계 전문가의 귀중한 의견을 반영한 끝에 Poseidon은 올해 초 Breakpoint 2024에서 중요한 이정표를 맞았습니다. 호기심 가득한 개발자들 앞에서 그동안의 성과를 공개했습니다. 

라이브 프레젠테이션에서 Poseidon의 수석 개발자 Shrinath는 TypeScript로 Solana 프로그램을 작성하는 과정을 시연했습니다. 단 하나의 빌드 명령으로 Poseidon이 TypeScript 코드를 완전한 Anchor 구문으로 트랜스파일하는 모습을 청중 앞에서 바로 보여주었습니다. 행사장은 기대감으로 술렁였고 곳곳에서 이런 속삭임이 들렸습니다. “정말 가능한 걸까?”

그 후 Poseidon 오픈 소스 저장소는 X와 Discord에서 성장 중인 Poseidon Army의 기여에 힘입어 빠르게 발전했습니다. 커뮤니티 구성원들은 이슈를 해결하고 풀 리퀘스트를 제출했으며 새로운 패키지 구축에 협력했습니다. 덕분에 Poseidon은 매일 더 성숙해지고 있습니다. 향상된 CLI, 토큰 프로그램 함수 지원 추가, 더 나은 오류 메시지 등이 주요 개선 사항입니다. 아직 초기 단계지만 Poseidon의 잠재력은 분명합니다.

기술적 관점에서 Poseidon의 개발 과정은 네 단계로 나눌 수 있습니다. 초기 논의와 브레인스토밍, 아키텍처 설계를 마친 뒤 몇 가지 중요한 결정을 내려야 했습니다. 특히 다음 사항이 핵심이었습니다. 

  • 필요한 라이브러리에 관한 가정 수립
  • 메서드 체이닝을 통한 명령어 본문 내 계정 파생
  • 절차적 매크로(많은 개발자에게 생소한 개념)

이후 Breakpoint 공개를 앞두고 개발과 반복 개선에 몰두했습니다.  큰 자신감과 함께 진행된 공개를 계기로 현재 단계의 문이 활짝 열렸습니다. 이제 얼리어답터들이 프레임워크를 직접 실험하고 탐색하며 개선할 수 있도록 제공하고 있습니다.

2024년을 마무리하며 프레임워크의 성장을 계속 지원하고 있습니다. 핵심 기능 개선, 지원 범위 확대를 위한 커뮤니티 참여, 필요한 SPL 함수와 Anchor 라이브러리 지원 파악에 집중하고 있습니다. 이를 통해 핵심 개발자들은 중요한 개선 작업에 집중할 수 있습니다.

2025년을 내다보며 1분기 말 첫 Turbin3 Poseidon Cohort를 출범해 개발에 속도를 낼 예정입니다. 발표도 곧 공개됩니다. 이 프로그램은 프레임워크를 발전시키고 공개 패키지, 튜토리얼과 기타 교육 자료 제작에 집중합니다. 목표는 분명합니다. Poseidon을 TypeScript 기반 Solana 프로그램 개발을 가속하는 대표 도구로 만드는 것입니다.

주요 기능

Poseidon은 다음과 같은 차별화된 기능을 제공합니다.

  • 간소화된 개발: TypeScript 기반 인터페이스로 웹 개발자의 학습 곡선을 완화합니다. Rust와 씨름하는 대신 애플리케이션 로직에 집중할 수 있습니다
  • 생산성 향상: 익숙한 도구와 워크플로를 활용해 더 효율적으로 작업하고 개발 프로세스를 가속할 수 있습니다
  • 향상된 보안과 성능: 트랜스파일된 Rust 코드가 Solana의 엄격한 보안 및 성능 표준을 충족하도록 보장해 온체인 프로그램의 무결성을 유지합니다
  • 원활한 통합: Poseidon은 Solana 생태계와 매끄럽게 통합되므로 기존 도구와 라이브러리를 활용할 수 있습니다

시스템 아키텍처

Poseidon의 아키텍처는 다음과 같은 주요 구성 요소로 이루어집니다.

  • TypeScript 기반 프로그래밍 인터페이스: 개발자가 익숙한 구문과 도구로 Solana 프로그램을 작성할 수 있는 계층입니다
  • 트랜스파일 엔진: TypeScript의 타입 시스템과 언어 기능을 활용해 TypeScript 코드를 동일한 기능의 Rust 코드로 변환합니다
  • Anchor 코드 생성: 트랜스파일된 Rust 코드를 추가로 처리해 Solana 네트워크에 컴파일하고 배포할 수 있는 유효한 Anchor 프로그램을 생성합니다
  • 계정 관리: 계정과 관련 데이터를 간편하게 관리할 수 있어 Solana 블록체인과 더 쉽게 상호작용할 수 있습니다

활용 사례

Poseidon은 개발자가 Solana 계정 모델을 더 빠르게 이해하도록 설계되었습니다. 신규 개발자가 첫 프로그램을 테스트넷에 배포하는 데 걸리는 시간을 크게 줄여줍니다. 블록체인 애플리케이션에는 엄격한 보안이 요구되므로 현재 Poseidon은 프로덕션급 메인넷 애플리케이션 구축에 적합하지 않습니다. Solana 프로토콜 엔지니어를 목표로 한다면 궁극적으로 Anchor와 Rust를 배워 Solana의 기반 아키텍처를 더 깊이 이해해야 합니다.

이 프레임워크를 사용해 다음과 같은 다양한 탈중앙화 애플리케이션을 탐색하고 실험할 수 있습니다.

  • 탈중앙화 금융(DeFi): 대출 프로토콜, 탈중앙화 거래소, 이자 농사 플랫폼과 같은 혁신적인 금융 애플리케이션을 개발합니다
  • 대체 불가능 토큰(NFT): Solana 블록체인에서 디지털 자산을 생성하고 관리합니다
  • 게임: 블록체인 기반 게임과 가상 세계를 개발합니다
  • 공급망 관리: 제품과 자재의 원산지를 추적하고 검증합니다

먼저 거의 모든 블록체인 애플리케이션을 뒷받침하는 기본 프로그램인 Counter, Vault, Escrow에 집중했습니다. 수많은 프로토콜의 기반이 되는 핵심 구성 요소이므로 출발점으로 가장 적합합니다.

Poseidon 프로그램 예제

코드를 살펴보겠습니다. Poseidon으로 TypeScript에서 구축한 볼트 프로그램 예제를 각 구성 요소로 나누어 자세히 알아봅니다. 이 프로그램과 다른 프로그램의 전체 코드는 Poseidon GitHub 저장소에서 확인할 수 있습니다.

가져오기와 프로그램 선언

프로그램은 프로그램 ID를 지정하는 정적 PROGRAM_ID가 포함된 TypeScript 클래스로 정의됩니다. @solanaturbine/poseidon 패키지는 Rust 타입(u8, u64, i8, i128, boolean, string), SPL 타입(Pubkey, AssociatedTokenAccount, Mint, TokenAccount, TokenProgram), Anchor 계정 타입(Signer, UncheckedAccount, SystemAccount) 등 명령어 정의에 필요한 타입을 제공합니다.

코드
import { Account, Pubkey, Result, Signer, SystemAccount, SystemProgram, UncheckedAccount, u64, u8 } from "@solanaturbine/poseidon";

export default class VaultProgram {
    static PROGRAM_ID = new Pubkey("11111111111111111111111111111111");

명령어

일반적으로 프로그램 클래스 내부에 메서드를 정의해 Poseidon 명령어를 구성합니다. 각 명령어의 컨텍스트는 메서드 매개변수에 암시적으로 포함됩니다. @solanaturbine/poseidon를 사용해 계정을 프로그램 파생 주소(PDA)로 정의하려면 derive 메서드로 배열 내 첫 번째 매개변수에 시드를 지정합니다.

코드
    initialize(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount
    ): Result {

        auth.derive(['auth', state.key])
        state.derive(['state', owner.key]).init(owner)
        vault.derive(['vault', auth.key])

        // assign an argument of type Pubkey by calling the key property
        state.owner = owner.key;

        // to store bumps in the custom_Acc(state), we can simply call getBump
        state.stateBump = state.getBump()
        state.authBump = auth.getBump()
        state.vaultBump = vault.getBump()
    }

    deposit(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount,
        amount: u64
    ) {
        state.deriveWithBump(['state', owner.key], state.stateBump)
        auth.deriveWithBump(['auth', state.key], state.authBump)
        vault.deriveWithBump(['vault', auth.key], state.vaultBump)

        SystemProgram.transfer(
            owner, // from
            vault, // to
            amount // amount to be sent
        )
    }

    withdraw(
        owner: Signer,
        state: Vault,
        auth: UncheckedAccount,
        vault: SystemAccount,
        amount: u64
    ) {
        state.deriveWithBump(['state', owner.key], state.stateBump)
        auth.deriveWithBump(['auth', state.key], state.authBump)
        vault.deriveWithBump(['vault', auth.key], state.vaultBump)

        SystemProgram.transfer(
            vault,
            owner,
            amount,
            ['vault', state.key, state.authBump]
        )
    }
}

계정 상태

사용자 정의 상태 계정은 Account를 확장하는 인터페이스로 정의됩니다. 사용자 정의 상태 계정의 필드는 @solanaturbine/Poseidon 패키지의 타입을 사용해 정의할 수 있습니다.

코드
export interface Vault extends Account {
    owner: Pubkey
    stateBump: u8
    authBump: u8
    vaultBump: u8
}

Poseidon의 영향

Poseidon은 다음과 같은 방식으로 블록체인 개발 환경에 영향을 미칠 수 있습니다.

  • Solana 개발자 커뮤니티 확대: 더 많은 개발자를 Solana 생태계로 유입합니다
  • 개발 가속: Solana 프로젝트의 개발 시간과 노력을 줄입니다
  • 개발자 경험 개선: 더 직관적이고 효율적인 개발 경험을 제공합니다

향후 방향

앞으로 Poseidon은 다음과 같은 방식으로 기능을 더욱 강화할 계획입니다.

  • 언어 지원 확대: JavaScript와 Python 같은 추가 언어를 지원합니다
  • 성능 개선: 트랜스파일 프로세스와 생성된 Rust 코드를 최적화합니다
  • 보안 강화: 프레임워크와 생성된 코드의 취약점을 엄격하게 테스트합니다

결론

Poseidon은 더 많은 사람이 Solana 프로그램 개발에 접근할 수 있게 하는 중요한 진전입니다. 웹 개발과 블록체인 프로그래밍의 간극을 좁혀 개발자가 Solana 블록체인에서 혁신적이고 영향력 있는 애플리케이션을 만들 수 있도록 합니다. 블록체인 분야가 발전함에 따라 Poseidon은 새롭게 성장하는 Solana 개발자에게 필수 도구가 될 잠재력이 있습니다.

추가 자료

‍

Helius 구독하기

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

확대 이미지