A
Aura Core Research FORMAL VERIFICATION & LEDGERS
Home / Blockchain Architecture / aura-core-9-hard-fork-combinator
Blockchain Architecture · Architecture Whitepaper

Aura Hard Fork Combinator: 무중단 온체인 프로토콜 진화와 타입 레벨 다중 에라(Era) 합성 엔진

체인 분열과 노드 재부팅 없는 무중단 하드포크를 실현하는 타입 레벨 이기종 리스트(HList) 기반 하드포크 콤비네이터 설계와 수학적 전이(Transition) 함수 명세

PK
Paul Ko (Cardano Ambassador & DRep)
Published: 2026-08-15 · Verified Spec
#Haskell#Cardano#HardForkCombinator#TypeLevel#Consensus#Governance#Aura
Sponsored Academic Research

1 서론: PoS 분산원장의 아킬레스건, '사후 키 탈취'와 역사 왜곡

작업 증명(PoW) 블록체인에서 과거 블록을 덮어쓰려면 막대한 양의 전력과 해시 연산력을 과거 시점부터 다시 쏟아부어야 합니다. 반면 지분 증명(PoS) 블록체인은 과거 특정 시점에 다수의 지분을 보유했던 검증자의 서명 키(Secret Key)만 확보하면, 연산 비용 없이 제네시스 블록부터 갈라져 나오는 대안 체인(Alternative History)을 즉시 생성할 수 있습니다. 이것이 바로 롱 레인지 공격(Long-Range Attack)입니다.

일반적인 Ed25519나 ECDSA 같은 정적(Static) 서명 알고리즘을 사용할 경우 다음과 같은 치명적인 보안 붕괴에 직면합니다:

사후 검증자 침해 (Post-Compromise Insecurity)

은퇴한 검증자 노드의 서버가 수개월 뒤 해킹당하거나, 악의적인 검증자가 과거의 비밀키를 암시장에 매각할 경우 공격자는 과거의 합의를 통째로 위조할 수 있습니다.

신규 참여 노드의 신뢰 딜레마 (Weak Subjectivity)

새로 네트워크에 합류하거나 오랜 기간 오프라인이었던 노드는 진짜 체인과 위조된 역사적 체인을 오프체인 신뢰(Social Consensus) 없이 자체 암호학적 증명만으로 구분할 수 없습니다.

5세대 블록체인 Aura는 카르다노의 전방향 보안(Forward Security) 원칙을 계승하여, 시간이 흐르면 과거의 비밀키가 암호학적으로 자동 파기되는 순수 함수형 키 진화 서명 엔진 CardanoKES.hs를 구축했습니다.

2 KES(Key Evolving Signature)와 전방향 보안의 수학적 원리

KES는 단일 비밀키를 영구히 유지하는 대신, 시간을 이산적인 주기(Period, \(t \in [0, 2^d - 1]\))로 나누어 주기가 바뀔 때마다 비밀키를 일방향(One-Way)으로 진화시키는 암호 체계입니다.

flowchart LR subgraph Period0 ["주기 0 (Period 0)"] SK0["SK_0 (서명 발급)"] --> B0["Block 0 생성"] end subgraph Period1 ["주기 1 (Period 1)"] SK1["SK_1 (서명 발급)"] --> B1["Block 1 생성"] end subgraph Period2 ["주기 2 (Period 2)"] SK2["SK_2 (서명 발급)"] --> B2["Block 2 생성"] end subgraph PeriodT ["주기 t (현재)"] SKt["SK_t (서명 발급)"] --> Bt["Block t 생성"] end SK0 -- "일방향 진화 (SK_0 영구 소각)" --> SK1 SK1 -- "일방향 진화 (SK_1 영구 소각)" --> SK2 SK2 -.-> SKt PK["마스터 루트 공개키 PK (영구 불변)"] PK -. "verifyKES(PK, t, Block, Sig)" .-> B0 PK -. "verifyKES(PK, t, Block, Sig)" .-> B1 PK -. "verifyKES(PK, t, Block, Sig)" .-> B2 PK -. "verifyKES(PK, t, Block, Sig)" .-> Bt

전방향 보안의 수학적 보존성 (Forward Security Invariant)

  • 비가역성(Irreversibility): 주기 \(t\)에서 비밀키 \(SK_t\)를 가진 공격자가 어떠한 다항식 시간(Polynomial Time) 알고리즘을 사용하더라도 이전 주기의 비밀키 \(SK_{t-1}\)을 역산할 수 없습니다.
    $$SK_t \centernot\implies SK_{t-1}$$
  • 불변 공개키(Invariant Public Key): 비밀키가 \(2^d\)번 진화하는 동안, 외부 피어들이 블록을 검증하는 데 사용하는 마스터 공개키 \(PK\)는 단 한 번도 바뀌지 않습니다.
  • 침해 격리(Compromise Containment): 특정 시점 \(t\)에 노드의 물리 메모리가 통째로 유출되더라도, 공격자는 \(t\) 이전의 과거 블록을 단 하나도 위조할 수 없습니다. 블록체인의 역사는 암호학적으로 불변성을 영구 보존합니다.

3 이진 트리 기반 SumKES(\(2^d\)) 아키텍처

CardanoKES.hs는 깊이 \(d\)의 이진 트리를 재귀적으로 합성하는 SumKES(합성 KES) 구조를 사용합니다. 깊이 \(d\)의 KES는 두 개의 깊이 \(d-1\) KES 인스턴스를 좌우 서브트리로 결합하여 총 \(T = 2^d\) 주기의 수명을 가집니다.

graph TD Root["루트 공개키 PK = Hash(PK_L || PK_R)"] Root --> Left["좌측 서브트리 (주기 0 ~ 2^{d-1}-1)
• 기간 내 활성화
• 만료 시 완전 소각"] Root --> Right["우측 서브트리 (주기 2^{d-1} ~ 2^d-1)
• 비활성 (초기 시드 상태)
• 좌측 만료 시 활성화"]

4 CardanoKES.hs 순수 함수형 구현 명세

외부 C 라이브러리 포인터 조작을 배제하고, 대수적 데이터 타입(ADT)과 순수 패턴 매칭을 통해 키의 진화와 이전 서브트리의 소멸을 보장합니다.

4.1 KES 데이터 타입 및 주기(Period) 정의

{-# LANGUAGE StrictData #-}
{-# LANGUAGE GADTs #-}

module CardanoKES
  ( Period(..)
  , KESPublicKey(..)
  , KESSecretKey(..)
  , KESSignature(..)
  , evolveKES
  , signKES
  , verifyKES
  ) where

import Data.Word (Word32, Word8)
import CardanoBlake2b (Blake2b256, blake2b256, hashToBytes)

-- 불변 주기 (0부터 2^d - 1까지 단조 증가)
newtype Period = Period Word32
  deriving (Eq, Ord, Show)

-- 마스터 공개키 (32바이트 다이제스트)
newtype KESPublicKey = KESPublicKey Blake2b256
  deriving (Eq, Show)

-- 기저 서명 프리미티브 (Ed25519 스텁)
newtype RawSecret = RawSecret [Word8] deriving (Eq, Show)
newtype RawPublic = RawPublic [Word8] deriving (Eq, Show)
newtype RawSig    = RawSig [Word8]    deriving (Eq, Show)

-- 깊이 d를 재귀적으로 표현하는 합성 KES 비밀키
data KESSecretKey where
  -- 단말 노드: 깊이 0 (단 1회용 기본 키)
  ZeroSK :: Period -> RawSecret -> KESSecretKey
  -- 분기 노드: 좌측 트리 활성 상태 (우측 시드 보관)
  LeftSK  :: Period -> KESSecretKey -> [Word8] -> KESPublicKey -> KESSecretKey
  -- 분기 노드: 좌측 소각 후 우측 트리 활성 상태
  RightSK :: Period -> KESPublicKey -> KESSecretKey -> KESSecretKey

-- 서명 구조체: 단말 서명 + 공존 서브트리 공개키 + 머클 경로 증명
data KESSignature
  = SigLeaf RawSig
  | SigLeft  KESSignature KESPublicKey
  | SigRight KESPublicKey KESSignature
  deriving (Eq, Show)

4.2 순수 키 진화 함수 (evolveKES)

evolveKES는 기존 비밀키를 메모리 상에서 직접 덮어쓰지 않고, 새로운 주기의 불변 비밀키를 반환합니다. 이전 주기의 좌측 서브트리는 참조가 끊어지며 하스켈 런타임에 의해 즉각 수거(GC)되어 메모리 상에서 영구 소멸합니다.

-- 순수 함수형 키 진화: SK_t -> Maybe SK_{t+1} (수명 초과 시 Nothing)
evolveKES :: KESSecretKey -> Maybe KESSecretKey
evolveKES (ZeroSK _ _) = Nothing -- 단말 키는 자체 진화 불가 (상위 합성자가 제어)

evolveKES (LeftSK (Period p) leftSK rightSeed rightPK) =
  case evolveKES leftSK of
    Just nextLeftSK ->
      Just (LeftSK (Period (p + 1)) nextLeftSK rightSeed rightPK)
    Nothing ->
      let activatedRightSK = deriveSubTree (Period (p + 1)) rightSeed
      in Just (RightSK (Period (p + 1)) (derivePublic leftSK) activatedRightSK)

evolveKES (RightSK (Period p) leftPK rightSK) =
  case evolveKES rightSK of
    Just nextRightSK ->
      Just (RightSK (Period (p + 1)) leftPK nextRightSK)
    Nothing -> Nothing

deriveSubTree :: Period -> [Word8] -> KESSecretKey
deriveSubTree p seed =
  let subSecret = hashToBytes (blake2b256 seed)
  in ZeroSK p (RawSecret subSecret)

derivePublic :: KESSecretKey -> KESPublicKey
derivePublic (ZeroSK _ (RawSecret s)) =
  KESPublicKey (blake2b256 s)
derivePublic (LeftSK _ _ _ pk) = pk
derivePublic (RightSK _ pk _)  = pk

4.3 블록 서명 및 \(O(d)\) 공개키 검증

블록 헤더 검증 노드는 현재 블록의 슬롯 주기 \(t\)와 불변 루트 공개키 \(PK\)만을 사용하여 서명을 검증합니다.

-- 현재 주기에 구속된 결정론적 블록 서명
signKES :: KESSecretKey -> [Word8] -> Maybe KESSignature
signKES (ZeroSK _ (RawSecret sk)) msg =
  Just (SigLeaf (RawSig (hashToBytes (blake2b256 (sk ++ msg)))))

signKES (LeftSK _ leftSK _ rightPK) msg = do
  sig <- signKES leftSK msg
  Just (SigLeft sig rightPK)

signKES (RightSK _ leftPK rightSK) msg = do
  sig <- signKES rightSK msg
  Just (SigRight leftPK sig)

-- 순수 함수형 공개 검증기: verifyKES(PK, Period, Message, Signature)
verifyKES :: KESPublicKey -> Period -> [Word8] -> KESSignature -> Bool
verifyKES (KESPublicKey expectedRoot) (Period p) msg sig =
  case verifyStep p msg sig of
    Just computedRoot -> computedRoot == expectedRoot
    Nothing           -> False
  where
    verifyStep _ m (SigLeaf (RawSig s)) =
      Just (blake2b256 (s ++ m))
    verifyStep period m (SigLeft subSig rPK) = do
      subHash <- verifyStep period m subSig
      Just (combineKESHash (KESPublicKey subHash) rPK)
    verifyStep period m (SigRight lPK subSig) = do
      subHash <- verifyStep period m subSig
      Just (combineKESHash lPK (KESPublicKey subHash))

combineKESHash :: KESPublicKey -> KESPublicKey -> Blake2b256
combineKESHash (KESPublicKey (Blake2b256 h1)) (KESPublicKey (Blake2b256 h2)) =
  blake2b256 (show h1 ++ show h2)

5 AI 에이전트 자율 노드(Unmanned Nodes)의 생존 보장

블록체인 인프라가 인간 운영자의 손을 떠나 자율 AI 에이전트에 의해 무인 구동되는 5세대 환경에서 CardanoKES.hs는 다음과 같은 핵심적인 생존성을 제공합니다:

  • 자동화된 키 수명 주기 관리(Autonomous Key Rotation): 카르다노 표준 \(d = 6\) (\(2^6 = 64\) 주기, 주기당 약 1.5일, 총 90일 유효) 트리 구조에서, AI 에이전트는 주기 전환 슬롯이 도래할 때마다 evolveKES를 자율 호출합니다. 유효 기간이 만료되기 직전, AI 노드는 오프체인 콜드 키(Cold Key)와 연동된 다자간 연산(MPC) 인증서를 통해 다음 90일 치 KES 키를 자동으로 등록하고 온체인 트랜잭션으로 공표합니다.
  • 침해 노드의 자발적 격리: 침입 탐지 시스템이 물리 서버 탈취를 감지하는 즉시, AI 에이전트는 남은 비밀키 구조체의 메모리 참조를 모두 해제하여 런타임 상에서 완전히 소각(Nullify)시킴으로써 과거 및 미래의 모든 블록 생성 권한을 안전하게 자폭(Self-Destruct)시킬 수 있습니다.

6 결론 및 다음 단계

CardanoKES.hs는 과거를 뒤돌아보지 않고 오직 미래로만 전진하는 단방향 시간 화살을 암호학적으로 구현한 합의 방파제입니다. 이로써 Aura는 롱 레인지 공격이라는 PoS의 원죄를 완벽히 극복했습니다.

이어지는 제12편에서는 노드 간에 블록과 트랜잭션을 전파할 때, 악의적인 피어가 보내는 스팸 트래픽을 순수 함수형 평판(Reputation) 스코어로 격리하는 AuraPeerGovernor.hs: P2P 가버너와 순수 상태 기반 공격 방어 아키텍처를 다룹니다.

Cardano Pure Haskell Micro-Modules Suite 원본 소스 코드

외부 C 라이브러리 의존성 없이 순수 하스켈로 검증된 오픈소스 블록체인 코어 모듈 스위트

GitHub 저장소 보기