[Aura Core Architecture #7] Aura eUTxO State Machine: 순수 함수형 상태 전이와 불변 원장의 동시성 모델
Published: 2026-08-11
Author: Joy & Hope Stake Pool / Aura Core Architecture Team
Category: Blockchain Architecture / Pure Functional Programming
Tags: Haskell, Cardano, eUTxO, StateMachine, Concurrency, FormalVerification, Aura
1. 서론: 가변 전역 상태(Global State)가 낳은 비결정론의 덫
이더리움을 위시한 계정 기반(Account-Based) 블록체인은 원장을 단 하나의 거대한 전역 키-값 맵(Global Key-Value Map)으로 모델링합니다.
이러한 구조에서는 동일한 블록 내의 여러 트랜잭션이 동일한 스마트 컨트랙트 상태를 동시에 읽고 쓰기 때문에 필연적으로 다음과 같은 병목과 취약점에 직면합니다:
- 상태 접근 경쟁(State Contention)과 직렬화 병목: 수천 개의 트랜잭션이 특정 계정의 잔고나 스토리지를 갱신할 때 순차적 실행(Sequential Execution)이 강제되며, 이는 전체 네트워크 처리량을 극단적으로 제한합니다.
- 트랜잭션 실행 결과의 비결정론: 오프체인에서 서명할 당시의 상태와 온체인에서 실제로 채굴되는 순간의 전역 상태가 달라질 수 있습니다. 이로 인해 슬리피지(Slippage) 오차, 불합리한 가스비 증발, 그리고 트랜잭션 순서 조작 공격(MEV/샌드위치 공격)이 만연하게 됩니다.
- 재진입 공격(Reentrancy Attacks): 상태 업데이트가 완료되기 전에 외부 컨트랙트를 재귀 호출하여 잔고를 탈취하는 치명적인 취약점이 발생합니다.
5세대 블록체인 Aura는 전역 가변 상태를 완전히 해체하고, 입력과 출력이 완전히 고립된 대수적 eUTxO 상태 머신(Algebraic eUTxO State Machine)을 구축하여 완전한 결정론과 선형 확장성을 확보했습니다.
2. eUTxO 상태 전이의 수학적 정식화
eUTxO 모델에서 블록체인의 전체 상태 $S$는 소비되지 않은 출력값(UTxO)들의 유한 집합입니다:
$$S = { u_1, u_2, \dots, u_k }, \quad u_i = (\text{TxOutRef}, \text{TxOut})$$
트랜잭션 $Tx$는 상태 $S$에 대한 가변 연산이 아니라, 기존 원소의 차집합(소비)과 새로운 원소의 합집합(생성)으로 정의되는 순수 전이 함수(Transition Function)입니다:
$$S' = (S \setminus \text{Inputs}(Tx)) \cup \text{Outputs}(Tx)$$
flowchart LR
subgraph Current_Ledger["원장 상태 집합 S"]
u1["UTxO 1 (소비 대상)"]
u2["UTxO 2 (소비 대상)"]
u3["UTxO 3 (영향 없음)"]
u4["UTxO 4 (영향 없음)"]
end
Tx["⚡ 트랜잭션 전이 (Tx)<br/>Inputs = {u1, u2}<br/>Outputs = {u5, u6}"]
subgraph Next_Ledger["새 원장 상태 집합 S'"]
u3_next["UTxO 3"]
u4_next["UTxO 4"]
u5["UTxO 5 (새로 생성)"]
u6["UTxO 6 (새로 생성)"]
end
Current_Ledger --> Tx
Tx --> Next_Ledger
2.1. eUTxO 상태 머신의 3대 대수적 성질
- 국소성(Locality): 트랜잭션 유효성은 오직 자신이 소비하는 입력 UTxO와 생성하는 출력 UTxO만을 참조하며, 원장의 나머지 수억 개 UTxO와는 완전히 독립적입니다.
- 참조 투명성(Referential Transparency): 동일한 입력 UTxO가 주어지면 트랜잭션 검증 결과는 언제, 어디서, 누가 실행하든 정확히 동일합니다.
- 재진입 공격 원천 불가능: 입력 UTxO는 트랜잭션 실행 시작과 동시에 원장에서 소멸(Consume)하므로 재귀 호출을 통한 중복 인출이 수학적으로 불가능합니다.
3. 대수적 데이터 타입(ADT) 기반 상태 머신 모델링
Aura 코어의 eUTxO 상태 머신은 순수 하스켈 타입 시스템을 통해 불변 원장의 상태 전이를 완벽히 모델링합니다.
3.1. 트랜잭션 입출력 및 데이텀(Datum) 구조체
module Aura.Core.StateMachine where
import CardanoBlake2b (Hash256)
import CardanoCoin (Coin, addCoin, subCoinSafe)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
-- | eUTxO 고유 식별자 (TxID + Output Index)
data TxOutRef = TxOutRef
{ txId :: Hash256
, txIdx :: Integer
} deriving (Show, Eq, Ord)
-- | 스마트 컨트랙트 상태를 담는 불변 데이텀
data Datum = Datum
{ stateCounter :: Integer
, ownerHash :: Hash256
} deriving (Show, Eq)
-- | 개별 eUTxO 출력값
data TxOut = TxOut
{ outAddress :: String
, outValue :: Coin
, outDatum :: Maybe Datum
} deriving (Show, Eq)
-- | 불변 분산원장 전체 UTxO 상태 맵
type LedgerState = Map.Map TxOutRef TxOut
3.2. 순수 상태 전이 함수: applyTx
-- | 트랜잭션 구조체
data Transaction = Transaction
{ txInputs :: Set.Set TxOutRef
, txOutputs :: [TxOut]
, txFee :: Coin
} deriving (Show, Eq)
-- | 전이 실패 오류 범주 (Fail-Safe ADT)
data TransitionError
= InputUtxoNotFound TxOutRef
| ValueConservationViolated String
| StateValidationFailed String
deriving (Show, Eq)
-- | 순수 상태 전이 함수 S' = (S \ In) U Out
applyTx :: Transaction -> LedgerState -> Either TransitionError LedgerState
applyTx tx state = do
-- 1. 입력 UTxO 존재성 및 원본 추출
inputOutputs <- mapM lookupInput (Set.toList (txInputs tx))
-- 2. 자산 보존 법칙 검증 (Sum Inputs == Sum Outputs + Fee)
let totalIn = foldl addCoin (Coin 0) (map outValue inputOutputs)
totalOut = foldl addCoin (Coin 0) (map outValue (txOutputs tx))
case subCoinSafe totalIn (addCoin totalOut (txFee tx)) of
Just remCoin | remCoin == Coin 0 -> pure ()
_ -> Left (ValueConservationViolated "투입액과 산출액+수수료가 정확히 일치하지 않습니다.")
-- 3. 차집합 (소비)
let stateAfterConsumed = foldr Map.delete state (Set.toList (txInputs tx))
-- 4. 합집합 (새 출력값 생성)
let newRefs = [ TxOutRef (txFee tx) idx | idx <- [0..] ] -- 실제는 TxID 기준
newEntries = Map.fromList (zip newRefs (txOutputs tx))
pure (Map.union stateAfterConsumed newEntries)
where
lookupInput ref = case Map.lookup ref state of
Just out -> Right out
Nothing -> Left (InputUtxoNotFound ref)
어떠한 락(Mutex)이나 전역 트랜잭션 차단 없이도, 순수 함수형 전이 식에 의해 원장의 무결성이 영구히 수호됩니다.
4. 무경합 병렬 실행(Contention-Free Concurrency)의 실현
두 트랜잭션 $Tx_A$와 $Tx_B$가 서로 다른 입력 집합을 가질 때, 두 트랜잭션은 상태 간섭이 전혀 없으므로 완전한 병렬(Embarrassingly Parallel) 처리가 가능합니다:
$$\text{Inputs}(Tx_A) \cap \text{Inputs}(Tx_B) = \emptyset \implies \text{ExecutionOrder}(Tx_A, Tx_B) \text{ is Irrelevant}$$
graph TD
subgraph Parallel_Worker_Pool["Aura 멀티코어 병렬 검증기 (Parallel Workers)"]
W1["Worker 1: Tx A 검증<br/>(Inputs: u1, u2)"]
W2["Worker 2: Tx B 검증<br/>(Inputs: u3)"]
W3["Worker 3: Tx C 검증<br/>(Inputs: u4, u5)"]
end
W1 --> Merge["병렬 머클 트리 상태 결합 (Lock-Free Merge)"]
W2 --> Merge
W3 --> Merge
Merge --> FinalBlock["💎 5세대 무충돌 고속 블록 확정"]
계정 기반 체인처럼 단일 스마트 컨트랙트에 모든 호출이 집중되어 가스비가 폭등하는 현상이 원천적으로 차단되며, 하드웨어 코어 수가 증가할수록 네트워크 처리량이 선형적으로 비례하여 확장됩니다.
5. 실전 검증: 상태 보존 및 더블 스펜딩 차단 시뮬레이션
-- 시나리오: 동일한 u1을 동시에 소비하려는 두 트랜잭션 Tx1, Tx2 유입
let state0 = Map.fromList [(ref1, out1), (ref2, out2)]
-- 1. Tx1 전이 성공
case applyTx tx1 state0 of
Right state1 -> do
-- 2. 이미 소비된 ref1을 다시 소비하려는 Tx2 집행 시도
case applyTx tx2 state1 of
Left (InputUtxoNotFound ref1) ->
putStrLn "이중 지불 공격이 즉각 정적 차단되었습니다!"
Aura의 대수적 eUTxO 상태 머신은 런타임 레이스 컨디션 없이 이중 지불을 단 1회의 맵 룩업으로 즉시 판정하여 차단합니다.
6. 결론: AI 자율 에이전트 경제를 지탱하는 결정론적 원장
Aura eUTxO 상태 머신은 5세대 블록체인이 도달해야 할 최종 기술적 고지입니다:
- 결정론적 수수료: 오프체인 시뮬레이션 결과와 온체인 실행 결과가 $100\%$ 일치하므로 가스비 낭비와 슬리피지 제로.
- MEV 샌드위치 공격 불능: 트랜잭션 순서가 뒤바뀌어도 내 입력 UTxO가 변하지 않는 한 실행 결과에 불이익이 없음.
- 초당 수만 건의 무경합 M2M 병렬 처리: 수천 대의 자율 AI 에이전트가 독자적인 eUTxO 스트림을 통해 경합 없이 동시 결제 수행.
Aura 5세대 블록체인은 Blake2b 해시 ➔ Coin 원장 ➔ Address 주소 ➔ Merkle 증명 ➔ CBOR 파서 ➔ eUTxO 상태 머신으로 이어지는 순수 함수형 수학적 통합을 완성하였습니다.