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 서론: EVM 가스 모델의 파멸적 결함과 튜링 완전성의 정지 문제(Halting Problem)

스마트 컨트랙트 가상 머신 설계에서 가장 근본적인 난제는 튜링 완전성(Turing Completeness)이 수반하는 정지 문제(Halting Problem)입니다. 임의의 스마트 컨트랙트 코드가 유한한 단계 내에 실행을 종료할지, 아니면 무한 루프에 빠져 검증 노드의 CPU를 영구 점유할지는 실행 전에 정적으로 판별할 수 없습니다.

이더리움 가상 머신(EVM)은 이를 해결하기 위해 매 연산(Opcode)마다 런타임 가스(Gas)를 동적으로 차감하는 모델을 채택했습니다. 그러나 이 동적 가스 모델은 치명적인 부작용을 낳았습니다:

가스비 증발 자산 손실

실행 중 가스가 부족하면 상태는 롤백되나 소모된 가스비는 증발하여 사용자는 돈만 날리게 됩니다.

실행 비결정론

전역 계정 상태 변화에 따라 가스 소모량이 가변되어 로컬에서 성공한 트랜잭션이 메인넷에서 실패합니다.

가스 한도 DoS 공격

복잡한 연산을 유도하여 블록 가스 리밋을 채우고 다른 트랜잭션 유입을 물리적으로 봉쇄합니다.

5세대 블록체인 Aura는 카르다노의 플루투스 코어(Plutus Core) 및 결정론적 2차원 연산 단위(ExUnits) 체계를 계승하여, 온체인 실행 전에 연산 비용을 100% 확정하고 검증 단계에서 런타임 패닉 없이 안전하게 종료되는 AuraPlutusExecution.hs 엔진을 구축했습니다.

2 결정론적 2차원 연산 예산 (ExUnits: CPU & Memory)

Aura의 eUTxO 스마트 컨트랙트는 단일 스칼라 수치인 '가스' 대신, 물리적 컴퓨터 자원을 정밀하게 분리한 2차원 연산 예산(Execution Budget) 모델을 적용합니다:

  • CPU 단계 수 (CPU Steps): 람다 대수 항의 환원(Reduction) 및 기본 연산에 소요되는 순수 클록 틱.
  • 메모리 단위 (Memory Units): 힙(Heap) 메모리에 할당되는 바이트 및 환경(Environment) 바인딩 크기.
flowchart TD subgraph OffChain ["트랜잭션 서명 전 (오프체인 로컬)"] A1["개발자/AI 노드가 로컬 순수 CEK 머신으로 스크립트 시뮬레이션"] --> A2["정확한 자원 측정:
ExUnits { exCPU = 14,230,100 steps, exMem = 32,450 bytes }"] A2 --> A3["해당 ExUnits에 정확히 비례하는 최소 수수료(Fee)를 트랜잭션 바디에 고정"] end OffChain -- "온체인 트랜잭션 브로드캐스트" --> OnChain subgraph OnChain ["온체인 검증 노드 (AuraPlutusExecution.hs)"] B1["사전 선언된 ExUnits 한도 내에서 CEK 환원 실행"] --> B2{"선언 예산 초과 여부?"} B2 -- "예산 초과" --> B3["즉시 트랜잭션 거절 (상태 오염 방지)"] B2 -- "예산 내 완료" --> B4["원장의 다른 상태와 무관하게 100% 동일 결과 도출"] end

오프체인 결정론 정리 (Off-Chain Determinism Theorem)

eUTxO 모델에서 스크립트의 입력값은 오직 Datum, Redeemer, 그리고 트랜잭션 전체 컨텍스트를 담은 ScriptContext 세 가지 불변 값으로 한정됩니다.

$$\text{eval}(\text{Validator}, \text{Datum}, \text{Redeemer}, \text{Context}) \in \{ \text{Pass}, \text{Fail} \}$$

전역 계정 상태나 외부 상태를 조회할 수 없으므로, 로컬 머신에서 소모된 CPU/Memory 수치는 온체인 검증 노드가 연산할 때 단 1단계의 오차도 없이 100% 완벽히 일치합니다. 가스 부족으로 인한 트랜잭션 실패나 수수료 증발 사고가 수학적으로 불가능합니다.

3 CEK 머신(Context-Environment-Kontinuation) 순수 함수형 아키텍처

플루투스 코어(UPLC: Untyped Plutus Core)의 의미론은 컴퓨터 과학의 고전적인 CEK 추상 기계(CEK Abstract Machine)를 순수 함수형 상태 전이로 모델링하여 구체화됩니다.

  • C (Control / Term): 현재 평가 중인 람다 대수 표현식.
  • E (Environment): 자유 변수(Free Variables)를 값에 바인딩하는 불변 맵.
  • K (Kontinuation): 현재 계산이 끝난 후 값을 전달받을 상위 평가 문맥 스택.
flowchart TD State["CEK Machine State
⟨ Term, Environment, Kontinuation ⟩"] State --> Step["순수 상태 전이: stepCEK
람다 적용 및 변수 치환"] State --> Budget["자원 차감: consumeBudget
CPU Step -1, Memory Check"] Step --> Check{"Remaining Budget < 0 ?"} Budget --> Check Check -- "YES" --> Fail["ExBudgetExhausted 에러 반환"] Check -- "NO" --> Done["Return: 최종 값 도출"]

4 AuraPlutusExecution.hs 순수 구현 명세

외부 의존성 및 C 라이브러리 없이, 순수 대수 데이터 타입(ADT)과 모나딕 상태 전이를 통해 UPLC 람다식을 평가하고 연산 예산을 차감하는 마이크로 스크립트 엔진입니다.

4.1 UPLC 항(Term)과 실행 예산 데이터 타입

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

module AuraPlutusExecution
  ( ExUnits(..)
  , ExBudget(..)
  , Term(..)
  , Value(..)
  , EvalError(..)
  , runPlutusScript
  ) where

import Data.Word (Word64)
import qualified Data.Map.Strict as Map

-- 2차원 연산 자원 단위
data ExUnits = ExUnits
  { exCPU :: Word64
  , exMem :: Word64
  } deriving (Eq, Show)

-- 실행 예산 상태
newtype ExBudget = ExBudget { unExBudget :: ExUnits }
  deriving (Eq, Show)

-- UPLC 핵심 람다 항 (Untyped Plutus Core AST)
data Term
  = Var String
  | LamAbs String Term
  | Apply Term Term
  | ConstantInt Integer
  | BuiltinAdd Term Term
  | BuiltinEquals Term Term
  | ErrorTerm
  deriving (Eq, Show)

-- 평가 완료된 런타임 값
data Value
  = VInt Integer
  | VClosure String Term Env
  | VBool Bool
  deriving (Eq, Show)

type Env = Map.Map String Value

-- 평가 지속 컨텍스트 (Kontinuation Stack)
data Kont
  = KDone
  | KApplyL Env Term Kont
  | KApplyR Value Kont
  | KBuiltin1 (Integer -> Value) Kont
  | KBuiltin2 (Integer -> Integer -> Value) Env Term Kont

-- 스크립트 실행 오류
data EvalError
  = ExBudgetExhausted ExUnits
  | VariableNotFound String
  | TypeMismatch String
  | ScriptExplicitError
  deriving (Eq, Show)

4.2 예산 차감과 상태 모나드 (EvalM)

매 연산 스텝마다 CPU와 메모리 예산을 불변 차감하며, 음수로 떨어지는 즉시 계산을 조기 중단(Short-Circuit)합니다.

-- 순수 상태-에러 모나드
newtype EvalM a = EvalM { runEvalM :: ExBudget -> Either EvalError (a, ExBudget) }

instance Functor EvalM where
  fmap f (EvalM m) = EvalM $ \b -> do
    (a, b') <- m b
    return (f a, b')

instance Applicative EvalM where
  pure a = EvalM $ \b -> Right (a, b)
  (EvalM mf) <*> (EvalM ma) = EvalM $ \b -> do
    (f, b1) <- mf b
    (a, b2) <- ma b1
    return (f a, b2)

instance Monad EvalM where
  (EvalM m) >>= f = EvalM $ \b -> do
    (a, b1) <- m b
    runEvalM (f a) b1

-- 원자적 연산 자원 소비 함수
consumeBudget :: ExUnits -> EvalM ()
consumeBudget (ExUnits cpu mem) = EvalM $ \(ExBudget current) ->
  if exCPU current >= cpu && exMem current >= mem
    then Right ((), ExBudget (ExUnits (exCPU current - cpu) (exMem current - mem)))
    else Left (ExBudgetExhausted current)

4.3 순수 CEK 머신 전이 루프

-- 기본 연산 스텝 비용 상수
stepCostCPU, stepCostMem :: Word64
stepCostCPU = 1000
stepCostMem = 100

-- CEK 메인 루프: Compute 단계
compute :: Env -> Term -> Kont -> EvalM Value
compute env term k = do
  consumeBudget (ExUnits stepCostCPU stepCostMem)
  case term of
    ConstantInt i -> returnCEK k (VInt i)
    Var x -> case Map.lookup x env of
      Just val -> returnCEK k val
      Nothing  -> EvalM $ \_ -> Left (VariableNotFound x)
    LamAbs x body -> returnCEK k (VClosure x body env)
    Apply f arg -> compute env f (KApplyL env arg k)
    BuiltinAdd t1 t2 -> compute env t1 (KBuiltin2 (\a b -> VInt (a + b)) env t2 k)
    BuiltinEquals t1 t2 -> compute env t1 (KBuiltin2 (\a b -> VBool (a == b)) env t2 k)
    ErrorTerm -> EvalM $ \_ -> Left ScriptExplicitError

-- CEK 메인 루프: Return 단계
returnCEK :: Kont -> Value -> EvalM Value
returnCEK KDone val = pure val
returnCEK (KApplyL env arg k) (VClosure x body cEnv) =
  compute env arg (KApplyR (VClosure x body cEnv) k)
returnCEK (KApplyR (VClosure x body cEnv) k) argVal =
  let extendedEnv = Map.insert x argVal cEnv
  in compute extendedEnv body k
returnCEK (KBuiltin2 op env t2 k) (VInt v1) =
  compute env t2 (KBuiltin1 (op v1) k)
returnCEK (KBuiltin1 op k) (VInt v2) =
  returnCEK k (op v2)
returnCEK _ _ = EvalM $ \_ -> Left (TypeMismatch "비정상적인 Kontinuation 적용")

-- 스크립트 최상위 진입점
runPlutusScript :: Term -> ExUnits -> Either EvalError (Value, ExUnits)
runPlutusScript script initialUnits =
  case runEvalM (compute Map.empty script KDone) (ExBudget initialUnits) of
    Left err -> Left err
    Right (val, ExBudget remaining) -> Right (val, remaining)

5 자율 AI 에이전트의 DeFi 상호작용 신뢰성

AI 에이전트가 탈중앙화 금융(DeFi) 프로토콜과 상호작용할 때, AuraPlutusExecution.hs는 다음과 같은 절대적인 자산 안전성을 보장합니다:

  • 시뮬레이션 신뢰도 100%: AI 에이전트는 로컬 샌드박스에서 트랜잭션을 사전 검증할 때 필요한 ExUnits를 정확히 도출합니다. 네트워크 혼잡도나 타인의 트랜잭션 유입으로 인해 컨트랙트가 실패하거나 가스비가 낭비될 확률은 0%입니다.
  • 무한 루프 DoS로부터의 노드 보호: 적대적 공격자가 복잡한 재귀식을 포함한 악성 스크립트를 배포하더라도, 지정된 ExUnits가 소진되는 순간 \(O(1)\)의 비용으로 안전하게 거절되며 검증 노드는 CPU 스파이크 없이 온전한 처리 성능을 유지합니다.

6 결론 및 다음 단계

AuraPlutusExecution.hs는 튜링 완전 언어가 지닌 비결정론의 맹수를 함수형 타입 시스템과 2차원 연산 예산이라는 고삐로 안전하게 길들인 결과물입니다.

이어지는 제15편에서는 스마트 컨트랙트 간에 가치를 교환할 때 보안성과 상호운용성을 극대화하는 AuraMultiAsset.hs: 네이티브 토큰(Native Tokens) 민팅 정책과 스마트 컨트랙트 프리 트랜잭션 회계 엔진을 다룹니다.

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

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

GitHub 저장소 보기