초등학생도 이해할 수 있다! Solana의 프로그래밍 모델, 도대체 ETH와 어떤 차이가 있을까?
작성자: Foresight News, Alex Liu
Solana는 dApps를 지원하기 위해 설계된 고성능 블록체인 플랫폼으로, 속도와 확장성으로 유명하며, 이는 독특한 합의 메커니즘과 아키텍처 설계를 통해 실현됩니다. 본문에서는 이더리움을 비교 대상으로 삼아 Solana 스마트 계약 프로그래밍 모델의 특징을 간략히 소개합니다.
스마트 계약, 체인 상 프로그램:
이더리움에서 실행되는 프로그램은 스마트 계약이라고 하며, 이는 이더리움의 특정 주소에 위치한 일련의 코드(함수)와 데이터(상태)입니다. (오호, 코드와 데이터가 결합되었습니다) 스마트 계약은 또한 계약 계정이라고 불리는 이더리움 계정으로, 잔액이 있으며 거래 객체가 될 수 있지만, 사람에 의해 조작될 수 없고, 네트워크에 배포되어 프로그램으로 실행됩니다.
반면 Solana에서 실행되는 실행 가능한 코드는 체인 상 프로그램(On-chain Program)이라고 하며, 이들은 각 거래에서 전송된 지시를 해석할 수 있습니다. 이러한 프로그램은 네트워크 핵심에 원주 프로그램으로 직접 배포되거나, 누구나 SPL 프로그램으로 게시할 수 있습니다.
- 지시(Instructions): 지시는 Solana 체인 상 프로그램의 고유 용어입니다. 체인 상 프로그램은 지시로 구성되며, 특정 작업을 수행하는 최소 단위입니다: 각 Solana 거래에는 하나 이상의 지시가 포함됩니다. 지시는 수행할 작업을 지정하며, 특정 체인 상 프로그램 호출, 계정 전달, 입력 목록 및 바이트 배열 제공을 포함합니다. 지시는 계산 제한이 있으므로 체인 상 프로그램은 적은 계산 단위를 사용하도록 최적화되어야 하며, 비싼 작업은 여러 지시로 나누어야 합니다.
- 원주 프로그램: 검증 노드에 필요한 기능을 제공하는 원주 프로그램입니다. 그 중 가장 유명한 것은 System Program으로, 이는 새 계정을 생성하고 두 계정 간에 SOL을 전송하는 역할을 합니다.
- SPL 프로그램: 토큰 생성, 교환, 대출 및 스테이킹 풀 생성, 체인 상 도메인 이름 해석 서비스 유지 관리 등 일련의 체인 상 활동을 정의합니다. 그 중 SPL Token Program은 토큰 작업에 사용되며, Associated Token Account Program 등은 다른 맞춤형 프로그램을 작성하는 데 자주 사용됩니다.
너는 스마트 계약이라고 하고, 나는 체인 상 프로그램이라고 하며, 모두 다른 용어를 사용하지만 블록체인에서 실행되는 코드를 지칭합니다. 장삼리사왕마자도 사람 이름이지만, 결국 품질은 다른 측면을 고려해야 합니다.
계정 모델, 데이터 분리:
이더리움과 유사하게, Solana도 계정 모델 기반의 블록체인이지만, Solana는 이더리움과는 다른 계정 모델을 제공하며, 데이터를 다른 방식으로 저장합니다.
Solana에서는 계정이 지갑 정보와 기타 데이터를 저장할 수 있으며, 계정 정의 필드는 Lamports(계정 잔액), Owner(계정 소유자), Executable(실행 가능한 계정 여부) 및 Data(계정 저장 데이터)를 포함합니다. 각 계정은 특정 프로그램을 소유자로 지정하여 어떤 프로그램의 상태 저장소로 사용되는지를 구분합니다. 이러한 체인 상 프로그램은 읽기 전용 또는 무상태입니다: 프로그램 계정(실행 가능한 계정)은 BPF 바이트코드만 저장하고, 어떤 상태도 저장하지 않으며, 프로그램은 상태를 다른 독립 계정(비실행 계정)에 저장합니다. 즉, Solana의 프로그래밍 모델은 코드와 데이터를 분리합니다.
반면 이더리움 계정은 주로 EVM 상태의 참조이며, 스마트 계약은 코드 논리와 사용자 데이터를 모두 저장해야 합니다. 이는 일반적으로 EVM의 역사적 설계 결함으로 간주됩니다.
이 차이를 과소평가하지 마세요! Solana 스마트 계약은 본질적으로 결합된 프로그래밍 모델을 가진 블록체인(예: 이더리움)보다 공격하기 더 어렵습니다:
이더리움에서 스마트 계약의 "소유자"는 전역 변수로, 스마트 계약과 일대일로 대응합니다. 따라서 특정 함수를 호출하면 계약의 "소유자"를 직접 변경할 수 있습니다.
반면 Solana에서 스마트 계약의 "소유자"는 계정과 연관된 데이터이며, 전역 변수가 아닙니다. 하나의 계정은 여러 소유자를 가질 수 있으며, 일대일로 연결되지 않습니다. 공격자가 스마트 계약의 보안 취약점을 이용하려면 문제 있는 함수를 찾아야 할 뿐만 아니라, 해당 함수를 호출하기 위한 "올바른" 계정을 준비해야 합니다. 이 단계는 쉽지 않으며, Solana 스마트 계약은 일반적으로 여러 입력 계정을 포함하고, 제약 조건(예: ` account1 . owner == account2 . key `)을 통해 이들 간의 관계를 관리합니다. "올바른 계정 준비"에서 "공격 시작"까지의 과정은 보안 모니터링 담당자가 공격 전에 스마트 계약과 관련된 "가짜" 계정을 생성하는 의심스러운 거래를 능동적으로 감지할 수 있게 합니다.
이더리움의 스마트 계약은 유일한 비밀번호를 사용하는 금고와 같으며, 이 비밀번호를 얻기만 하면 전체 소유권을 얻을 수 있습니다. 반면 Solana의 스마트 계약은 여러 개의 비밀번호가 있는 금고와 같으며, 권한을 얻으려면 비밀번호를 얻는 것뿐만 아니라 이 비밀번호에 해당하는 번호를 파악해야 잠금을 열 수 있습니다.
프로그래밍 언어
Rust는 Solana에서 스마트 계약을 개발하는 주요 프로그래밍 언어입니다. 성능과 보안 특성 덕분에 블록체인 및 스마트 계약의 고위험 환경에 적합합니다. Solana는 또한 C, C++ 및 기타 언어(드물게 사용됨)를 지원합니다. 공식적으로 Rust와 C의 SDK를 제공하여 체인 상 프로그램 개발을 지원합니다. 개발자는 도구를 사용하여 프로그램을 Berkley Packet Filter(BPF) 바이트코드(파일 확장자는 .so)로 컴파일한 후 Solana 체인에 배포하고, Sealevel 병렬 스마트 계약 실행 환경을 통해 스마트 계약의 논리를 실행할 수 있습니다.
Rust 언어는 본래 배우기 어려운 특성이 있으며, 블록체인 개발을 위해 특별히 설계되지 않아 많은 요구 사항이 반복적으로 발생하고 코드가 중복되는 문제가 있습니다. (생산 중 많은 프로젝트가 Backpack 공동 창립자인 Armani가 만든 Anchor 프레임워크를 사용하여 개발을 간소화합니다) 블록체인 개발을 위해 새로 만들어진 많은 프로그래밍 언어는 Rust를 기반으로 하며, Cairo(Starknet), Move(Sui, Aptos) 등이 있습니다.
생산 중 많은 프로젝트가 Anchor 프레임워크를 사용합니다.
이더리움 스마트 계약은 주로 Solidity 언어로 개발됩니다(구문이 JavaScript와 유사하며, 코드 파일의 확장자는 .sol입니다). 구문이 상대적으로 간단하고 개발 도구가 더 성숙하여(Hardhat 프레임워크, Remix IDE 등) 일반적으로 이더리움의 개발 경험이 더 간단하고 쾌적하다고 여겨지며, Solana 개발은 진입 장벽이 높습니다. 따라서 현재 Solana의 인기가 높지만, 실제로 이더리움의 개발자 수는 여전히 Solana보다 훨씬 많습니다.
특정 도로 상황에서는 최고급 경주차가 개조차보다 빠르지 않습니다. Rust는 최고급 경주차와 같으며, Solana의 성능과 안전성을 강력하게 보장하지만, 체인 상 프로그램 개발이라는 경주 트랙을 위해 태어난 것이 아니므로 오히려 운전(개발) 난이도를 높입니다. Rust 기반의 체인 상 개발 맞춤형 언어를 사용하는 공공 블록체인은 이 경주차를 개조하여 도로 상황에 더 적합하게 만든 것과 같습니다. Solana는 이 점에서 열세입니다.
요약
Solana의 스마트 계약 프로그래밍 모델은 혁신적입니다. 이는 상태가 없는 스마트 계약 개발 방법을 제공하며, Rust를 주요 프로그래밍 언어로 사용하고, 논리와 상태를 분리하는 아키텍처를 통해 개발자에게 스마트 계약을 구축하고 배포할 수 있는 강력한 환경을 제공하여 안전성과 성능을 보장하지만, 개발 난이도가 높습니다. Solana는 높은 처리량, 낮은 비용 및 확장성에 집중하고 있으며, 여전히 고성능 dApps를 생성하려는 개발자에게 이상적인 선택입니다.