➡️ Rust 개발자의 Pallas 여정: Rust로 보는 Cardano 소개

발행: (2026년 1월 1일 오후 07:43 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Dive into Pallas, TxPipe’s Rust toolkit for Cardano.
Modular Rust for blockchain without Haskell.

Pallas 요약

pallas-codec – CBOR 직렬화/역직렬화 기반

use pallas_codec::{Encode, Decode};
use pallas_codec::minicbor::Decoder;

#[derive(Encode, Decode)]
enum MyEnum {
    Value(u64),
}

fn main() {
    let val = MyEnum::Value(42);
    let encoded = val.encode_to_vec().unwrap();
    let mut decoder = Decoder::new(&encoded);
    let decoded: MyEnum = decoder.decode().unwrap();
    if let MyEnum::Value(n) = decoded {
        println!("Decoded: {}", n);
    }
}

pallas-primitives – 시대를 초월한 원장 데이터 구조

use pallas_primitives::MultiEraTx;

fn main() {
    let tx_bytes = vec![]; // CBOR 바이트
    let tx = MultiEraTx::from_cbor_bytes(&tx_bytes).unwrap();
    println!("Fee: {:?}", tx.fees());
}

pallas-crypto – 보안을 위한 해시, 서명, VRF

use pallas_crypto::{Blake2b256, Ed25519Bip32SecretKey, Ed25519Signature};
use rand::rngs::OsRng;
use rand::RngCore;

fn main() {
    let mut sk_bytes = [0u8; 32];
    OsRng.fill_bytes(&mut sk_bytes);
    let sk = Ed25519Bip32SecretKey::from_bytes(sk_bytes).unwrap();
    let data = b"test";
    let sig = Ed25519Signature::sign(&sk, data);
    println!("Sig valid: {}", sig.verify(&sk.public_key(), data));
}

pallas-addresses – 주소 인코딩/디코딩

use pallas_addresses::Address;

fn main() {
    let addr = Address::from_bech32("addr1q...").unwrap();
    if let Address::Shelley(s) = addr {
        println!("Payment: {:?}", s.payment);
    }
}

pallas-txbuilder – 트랜잭션 생성 빌더

use pallas_txbuilder::Builder;
use pallas_primitives::ProtocolParameters;

fn main() {
    let params = ProtocolParameters::default();
    let mut builder = Builder::new(params);
    let min_fee = builder.min_fee().unwrap();
    println!("Min fee: {}", min_fee);
}

pallas-traverse – 데이터 분석 / 순회

use pallas_traverse::MultiEraBlock;

fn main() {
    let block_bytes = vec![]; // 바이트
    let block = MultiEraBlock::decode(&block_bytes).unwrap();
    for tx in block.txs() {
        println!("Inputs: {:?}", tx.inputs().len());
    }
}

pallas-network – 노드 통신 스택

use pallas_network::n2c::connect;

#[tokio::main]
async fn main() {
    let _mux = connect("relay.example:3001").await.unwrap();
}

pallas-hardano – Haskell 노드 아티팩트 상호 운용

use pallas_hardano::ImmutableFile;
use std::path::PathBuf;

fn main() {
    let path = PathBuf::from("chunk.file");
    let mut reader = ImmutableFile::open(&path).unwrap();
    if let Some(block) = reader.next() {
        println!("Block: {:?}", block.unwrap().header);
    }
}

pallas-math – 원장/합의를 위한 수학 유틸리티

use pallas_math::slot_to_epoch;

fn main() {
    let epoch = slot_to_epoch(1_000_000, 432_000);
    println!("Epoch: {}", epoch); // ~2
}

pallas-utxorpc – UTxO‑RPC 쿼리

use pallas_utxorpc::Client;

#[tokio::main]
async fn main() {
    let client = Client::connect("grpc://node:50051").await.unwrap();
    let tip = client.get_chain_tip().await.unwrap();
    println!("Tip: {:?}", tip);
}

개념적 레이어

레이어 1 – 원자

우주의 저수준 규칙: 수학, 직렬화, 암호화.

  • pallas-codec – CBOR (Concise Binary Object Representation) 직렬화. Cardano는 데이터를 JSON이 아니라 바이너리 CBOR로 저장합니다.
  • pallas-crypto – Blake2b‑256 해시와 Ed25519 서명. Cardano는 속도와 보안을 위해 Blake2b‑256을 선호합니다.
  • pallas-math – 고정소수점 연산. 합의에서는 부동소수점 오류를 피해야 합니다(예: 0.1 + 0.2 != 0.3).

레이어 2 – 데이터

블록체인을 구성하는 데이터 구조.

  • pallas-primitivesTransactionBody, Block, Header 등에 대한 Rust 구조체. 블록 형태가 다른 시대(Byron, Shelley, Alonzo, Babbage)를 처리합니다.
  • pallas-addresses – Bech32 주소(addr1…)를 결제 키와 스테이크 키로 파싱하고 체크섬을 검증합니다.

레이어 3 – 도구

데이터를 읽고 쓰는 데 사용하는 라이브러리.

  • pallas-traverse – 체인 데이터를 읽는 데 필수적입니다. MultiEraBlock을 제공하여 block.tx_count()와 같은 쿼리를 가능하게 합니다.
  • pallas-txbuilder, pallas-network, pallas-utxorpc, pallas-hardano, 등은 트랜잭션을 구성하고, 노드와 통신하며, Haskell 아티팩트와 상호 운용하기 위한 빌딩 블록을 제공합니다.

외우기 쉽고, 사용하기 강력합니다.

pallas-txbuilder

What: 유효한 트랜잭션 바이너리를 구성하기 위한 도우미.
Why: UTXO 입력, 수수료 계산 및 잔액 주소의 복잡성을 관리합니다.

레이어 4 – 인프라스트럭처

이 모듈들은 여러분의 코드를 물리 네트워크에 연결합니다.

ModuleWhatWhy
pallas-networkOuroboros 미니‑프로토콜(Handshake, ChainSync, TxSubmission)을 구현합니다.Rust 코드를 사용해 TCP를 통해 메인넷 노드에 직접 연결할 수 있게 합니다.
pallas-hardano하드 드라이브에서 원시 ImmutableDB 파일을 직접 읽습니다.고성능 로컬 인덱싱에 필수적이며 (Mithril에서 많이 사용됩니다).
pallas-utxorpcOuroboros 상태 머신을 관리하지 않고 블록체인 데이터를 접근할 수 있는 현대적인 gRPC 브리지입니다.

트랜잭션 수명 주기

Cardano 메인넷에서 트랜잭션이 진행되는 과정.

  1. Creation – 지갑이 pallas-txbuilder(로직)와 pallas-primitives(구조체)를 사용해 트랜잭션을 생성합니다.
  2. Submission – 지갑이 pallas-network(TxSubmission 프로토콜)를 통해 트랜잭션을 로컬 릴레이 노드에 전송합니다.
  3. Propagation (Gossip) – 릴레이 노드가 유효성을 검사하고 트랜잭션을 Slot Leader의 메모풀에 “가십”합니다.
  4. Consensus – 슬롯 리더가 자신의 VRF(Verifiable Random Function)를 확인합니다. 복권에 당첨되면 블록을 생성합니다.
  5. Distribution – 슬롯 리더가 pallas-network(ChainSync 프로토콜)를 사용해 새 블록을 방송합니다.
  6. Observation – 여러분의 Pallas 클라이언트가 블록을 다운로드하고 pallas-traverse를 이용해 디코딩합니다.
Back to Blog

관련 글

더 보기 »