<기사>
2024년 솔라나는 연초 10억 달러에서 현재 약 50억 달러로 급등하며 4번째로 큰 퍼블릭 체인으로 도약하며 두각을 나타내고 있습니다.
솔라나는 이더리움에 비해 더 빠른 속도와 저렴한 수수료로 뛰어난 경험을 제공합니다. 솔라나의 작업 증명 기반 합의 메커니즘과 비동기 트랜잭션 실행 모델은 개발자에게 높은 처리량과 낮은 지연 시간의 블록체인 성능을 제공하여 다양한 탈중앙화 애플리케이션을 위한 플랫폼으로 선택받고 있습니다.
BlockSec 스페셜 솔라나의 기본 개념, 솔라나 트랜잭션 보기 및 분석에 대한 실용적인 가이드, 솔라나 스마트 컨트랙트 작성에 대한 튜토리얼을 다루는 솔라나와 함께 놀기 시리즈를 큐레이팅했습니다.
이 시리즈의 첫 번째 글에서는 솔라나 네트워크의 메커니즘, 계정 모델, 트랜잭션 등 주요 개념을 심층적으로 살펴보고, 적절하고 효율적인 솔라나 콘트랙트 작성을 위한 토대를 마련합니다.
eBPF: 솔라나 트랜잭션의 실행 초석
스마트 컨트랙트를 작성하고 실행하기 위해 블록체인에는 종종 프로그래밍 언어 세트가 필요합니다. 그리고 튜링 완전 컴퓨팅 환경이 필요합니다.
이더리움의 스마트 콘트랙트는 일반적으로 이더 가상 머신이라는 환경에서 실행되는 바이트 코드를 컴파일하는 고급 언어인 솔리디티로 작성됩니다.
솔라나는 완전히 새로운 가상 환경과 언어를 개발하는 대신 기존의 훌륭한 기술을 활용했습니다. 원래 Linux 커널의 기능을 확장하기 위해 설계된 eBPF(확장 버클리 패킷 필터) 가상 머신을 기본 실행 환경으로 솔라나는 선택했습니다.
eBPF는 EVM에 비해 어떤 장점이 있을까요?
해석된 실행만 지원하는 EVM에 비해 eBPF는 바이트코드를 프로세서에서 실행할 수 있는 기계 명령어로 직접 변환하여 JIT(Just-In-Time) 모드로 프로그램을 보다 효율적으로 실행할 수 있습니다.
eBPF는 효율적인 명령어 세트와 성숙한 인프라를 갖추고 있습니다. 개발자는 Rust 언어만을 사용하여 스마트 컨트랙트를 작성할 수 있으며, LLVM 컴파일 프레임워크는 이러한 Rust 언어 프로그램을 eBPF 가상 머신에서 실행할 수 있는 바이트코드로 직접 컴파일하는 eBPF 백엔드를 제공합니다.
솔라나의 계정 모델
1. 솔라나의 계정 구조
솔라나의 데이터는 계정 형태로 저장됩니다. 아래 그림에서 볼 수 있듯이 솔라나의 모든 데이터는 키-값 쌍으로 이루어진 거대한 데이터베이스라고 생각할 수 있습니다. 데이터베이스의 키는 계정의 주소이며, '지갑' 계정(즉, 공개-개인 키 쌍을 통해 솔라나 사용자가 직접 제어하는 계정)의 경우 Ed25519 서명 시스템을 사용하여 생성된 공개 키이고, 데이터베이스의 값은 계정의 세부 정보입니다. 데이터베이스 값은 해당 계정에 고유하며 잔액 및 기타 관련 정보를 포함합니다.
Solana는 다음과 같은 구조를 사용합니다. AccountInfo라는 구조를 사용하여 계정을 설명하며, 그 구성 요소는 아래와 같습니다.
솔라나의 각 계정에는 4개의 필드가 있습니다. 여기에서는 각 필드를 하나씩 설명합니다.
데이터 필드에는 계정에 대한 데이터가 저장됩니다. 계정이 프로그램(예: 스마트 컨트랙트)인 경우 실제 eBPF 바이트코드를 저장합니다. 그렇지 않은 경우, 데이터의 정보 형식은 일반적으로 계정 생성자가 정의합니다.
실행 가능 필드는 계정이 프로그램인지 아닌지를 식별하는 데 사용됩니다. 이더와 달리 솔라나의 프로그램은 업데이트가 가능합니다.
Lamports 필드에는 계정의 솔라나 토큰 잔액이 기록되며, 램프포트는 실제로 SOL 토큰의 가장 작은 단위입니다(1 SOL = 10억 램프포트).
소유자 필드에는 계정의 현재 소유자가 표시됩니다. 솔라나에서는 모든 계정에 소유자가 있습니다. 예를 들어, 모든 지갑 계정의 소유자는 계정 생성 및 기타 기능을 담당하는 솔라나 네트워크의 특별 계정인 시스템 프로그램입니다. 계정 소유자는 계정 데이터를 수정하고 램프포트 잔액을 차감할 수 있는 유일한 사람입니다(단, 누구나 램프포트를 추가하거나 계정으로 이체할 수 있습니다).
2. 사전 정의된 솔라나 계정
솔라나에는 Native Programs라는 사전 정의된 계정 집합이 있습니다. 네이티브 프로그램은 고정된 주소에 배포되는 사전 정의된 런타임의 프로그램입니다. 솔라나 네트워크가 업그레이드되면 이러한 사전 정의된 프로그램이 업데이트될 수 있습니다. 이러한 프로그램은 솔라나 네트워크에서 특정 기능을 제공하는 API 및 라이브러리 기능으로 생각할 수 있습니다.
개발자가 자주 상호 작용해야 하는 네이티브 프로그램 중 하나는 개발자에게 지침을 제공하는 시스템 프로그램입니다( 시스템 프로그램은 개발자에게 여러 가지 명령어를 제공하며, 각 명령어는 별도의 메서드로 해석할 수 있습니다. 예를 들어 CreateAccount 명령어를 사용하여 새 계정을 만들거나 Transfer 명령어를 사용하여 다른 계정으로 램포트를 전송할 수 있습니다.
또 다른 일반적인 네이티브 프로그램은 BPF 로더 프로그램입니다. 다른 모든 프로그램 계정의 소유자이며 특정 프로그램의 배포, 업데이트, 실행을 담당합니다. 월렛 계정에서 배포된 프로그램을 업데이트해야 하는 경우, 프로그램 소유자만 데이터에 직접 액세스할 수 있기 때문에 실제로는 BPF 로더 프로그램에 위임하여 업데이트합니다.
솔라나는 네이티브 프로그램 외에도 Sysvar라는 계정 세트를 제공합니다. 이 계정은 현재 시계, 가장 최근 블록 해시 등 솔라나 네트워크의 현재 상태와 관련된 정보와 전역 변수를 솔라나에 있는 프로그램에 제공합니다.
3. 계정 임대
솔라나 체인에서 각 계정은 일정 수의 램포트를 최소량으로 유지해야 하는데, 이를 <강력 strong>렌트라고 합니다. 현실의 임대료 개념과 달리 솔라나에서의 임대료는 회수할 수 있습니다. 계정의 데이터를 체인에서 사용할 수 있도록 하려면 계정이 그에 상응하는 수의 램포트를 보유해야 하며, 임대료는 체인에서 계정의 저장 공간 크기와 관련이 있습니다.
렌트 금액보다 낮은 금액으로 계정 잔액을 인출하려는 트랜잭션은 계정 잔액을 0으로 직접 인출하지 않는 한 실패합니다. 이 작업은 계정의 임대료가 회수되었음을 나타내며, 거래 실행이 끝나면 Solana는 쓰레기 수거를 통해 해당 계정의 저장소를 비웁니다.
- ? 브라우저에서 Solana 계정 보기
관련 개념에 대한 이해를 돕기 위해 Solana에서 제공하는 "Hello World" 코드를 사용하겠습니다. 솔라나에서 제공하는 "Hello World" 프로젝트를 통해 프로그램 계정을 생성하고, 이 계정은 솔라나의 블록체인 브라우저 솔스캔 다음 계정을 통해 확인할 수 있습니다. .
CJWhxB4qEWBv9eGYUkTN881bNDMDkLbzH1FmdwqLLhoe
위 이미지에서 볼 수 있듯이 솔라나 브라우저에서 계정에 "프로그램"이라는 레이블이 붙은 것을 가장 먼저 확인할 수 있습니다. 계정이 생성될 때 발신자의 잔액에서 램프포트의 일부가 계정에 대한 임대료로 공제되었으므로 SOL 잔액 필드가 비어 있지 않은 것을 확인할 수 있습니다.
두 번째로, 프로그램을 생성하고 있으므로 실행 가능 필드는 예입니다. 여기서 이해하기 어려울 수 있는 한 가지는 데이터 필드에 eBPF 프로그램이 아닌 주소가 저장되어 있다는 점입니다. 앞서 언급했듯이 Solana는 프로그램 업데이트를 허용하지만 실제로는 "프록시" 모델을 통해 이를 수행합니다. 솔라나는 프로그램 계정의 직접 수정을 허용하지 않기 때문에 eBPF 프로그램을 저장할 데이터 계정을 생성하고, 프로그램 계정의 데이터 필드에 데이터 계정의 주소만 저장합니다. 프로그램을 업데이트해야 할 때마다 데이터 계정의 데이터 필드만 수정하면 됩니다. 솔스캔에서 실행 가능한 데이터 필드가 있는 계정을 보면 "프로그램 실행 가능한 데이터 계정"이라는 레이블이 붙어 있고 데이터 필드에 실제 프로그램이 저장되어 있는 것을 볼 수 있습니다.
이전 이미지로 돌아가서, 추가 정보의 소유자 필드가 BPF 로더이며, 이는 이전 섹션에서 설명한 것과 일치합니다.
개요에는 "업그레이드 권한"이라는 또 다른 필드가 있습니다.
앞서 언급했듯이 지갑 계정은 BPF 로더에 위임하여 업데이트되며, 위임자는 위임자에게 업데이트 권한이 있는지 확인합니다. 권한이 있는지 확인합니다. 애플리케이션 계정의 소유자 필드는 이미 BPF 로더에 있으므로 이 정보를 저장할 공간이 없으므로 Solana는 배포된 애플리케이션의 지갑 주소인 데이터 계정의 데이터 필드, 즉 이 경우 '업그레이드 권한'에 저장하기로 선택합니다. ". 다음 다이어그램은 애플리케이션 계정과 데이터 계정 간의 관계를 보여줍니다. 데이터 계정의 데이터 필드는 지갑 주소와 eBPF 코드로 구성되어 있음을 알 수 있습니다.
Solana's 트랜잭션 및 명령
솔라나에서는 사용자가 트랜잭션을 발행하여 프로그램을 실행하기도 합니다. 이러한 트랜잭션을 병렬로 실행할 수 있는 솔라나의 특별한 점은 초고속 트랜잭션 속도를 제공한다는 것입니다. 솔라나의 트랜잭션이 어떻게 설계되었는지 살펴보겠습니다.
솔라나 트랜잭션은 서명과 메시지 본문으로 구성됩니다. 트랜잭션에는 여러 개의 서명이 포함될 수 있습니다. 트랜잭션의 메시지 본문은 아래와 같이 네 부분으로 구성됩니다.
메시지의 헤더(헤더). 헤더 및 계정 주소의 압축 배열 필드는 거래에 관련된 모든 계정과 계정의 서명 제공 여부, 실행 중에 기록할 계정 등 거래에 포함된 계정의 특성을 지정합니다. 이 정보를 사용하여 Solana는 각 계정에서 제공한 서명을 확인할 수 있으며 동일한 계정 집합을 건드리지 않는 트랜잭션을 병렬로 실행할 수 있습니다.
최근 블록해시는 트랜잭션의 타임스탬프이며, 솔라나 네트워크는 트랜잭션이 가장 최근 150개 블록에서 나온 것인지 확인하며, 그렇지 않으면 오래된 것으로 간주하여 트랜잭션을 실행하지 않습니다.
명령어 배열은 트랜잭션에서 가장 중요한 부분이며 하나 이상의 명령어를 포함합니다. 인스트럭션은 실제로 프로그램에서 제공하는 루틴에 대한 호출입니다. 인스트럭션은 다음 그림과 같이 세 개의 필드로 구성됩니다.
. 첫 번째 필드인 프로그램 ID 인덱스는 인스트럭션의 수신자, 즉 인스트럭션을 처리해야 하는 체인 내 프로그램을 지정합니다. 32바이트 주소를 직접 저장하는 대신 메시지 본문에 있는 계정 주소 배열에 해당 주소를 배치합니다. 이 필드는 바이트 첨자를 사용하여 배열에서 해당 위치를 표시하여 일종의 공간 재사용을 구현합니다.
첫 번째 필드와 유사하게 두 번째 필드는 명령 처리와 관련된 모든 계정을 지정하는 계정 주소 인덱스의 컴팩트 배열입니다.
마지막 필드는 프로그램이 명령을 처리하는 데 필요한 추가 정보의 바이트 배열로, 함수에 대한 매개변수로 생각할 수 있습니다.
솔라나는 트랜잭션의 모든 명령을 순차적으로 처리하며 트랜잭션의 실행이 원자적이라는 점에 유의해야 합니다. 즉, 트랜잭션의 모든 명령어는 실패하거나 성공적으로 실행되며, 일부 명령어는 성공적으로 실행되고 일부 명령어는 실패하는 경우는 없습니다.
- ? 브라우저에서 '솔라나 트랜잭션' 보기
다른 솔라나 브라우저를 사용하여 이전에 생성한 프로그램 계정의 트랜잭션을 보려면 어떻게 해야 하나요? . 개요에서 Solana 트랜잭션의 서명, 가장 최근 블록 해시 및 기타 정보를 확인할 수 있습니다:
3uKQ85Lpsnwb5D6CgUntoMyJX3tSaeGb4pjUoMaMyNVqQNPp5PRG1kJEEEk3YNdWLYEMZGmoJ5Rowgon8hZzwL9D
p>
그리고 계정 입력에는 다음이 나열됩니다. 현재 거래에 관련된 모든 계정과 거래에 연결된 계정의 특성이 나열됩니다. 발신자, 프로그램 계정 등의 주소 외에도 두 개의 기본 프로그램 및 Sysvar 계정도 포함되어 있는 것을 볼 수 있습니다.
이 트랜잭션은 단순한 프로그램 생성 트랜잭션이기 때문에 따라서 두 개의 명령어만 포함하며, 첫 번째 수신자는 프로그램 계정 생성을 담당하는 System Program이고, 두 번째 수신자는 실제 배포된 eBPF 코드를 Data 계정에 작성하고 그 주소를 작성하는 BPF Loader입니다. 를 프로그램 계정의 데이터 필드에 기록합니다.
요약
솔라나의 스마트 컨트랙트는 Rust로 개발되었으며 eBPF 가상 머신에서 실행됩니다. 이는 데이터 가용성을 보장하기 위해 체인의 계정이 임대료를 유지해야 하는 계정 모델을 따릅니다. 트랜잭션은 트랜잭션에 의존하는 모든 계정을 명시적으로 정의하는 하나 이상의 명령어로 구성되며, 트랜잭션이 병렬로 처리되어 처리량을 높이고 응답 지연 시간을 줄일 수 있습니다. 이러한 기능 덕분에 솔라나는 빠르게 성장하여 많은 사람들이 찾는 블록체인 플랫폼 중 하나가 되었습니다.