UTXO vs Account
UTXO
UTXO 는 Unspent Transaction Output 의 약자로, 직역하면 “미사용 트랜잭션 출력” 이다.
현실에서 지갑에 10,000원짜리 지폐 한 장, 5,000원짜리 지폐 두 장, 1,000원짜리 동전 세 개가 있다고 가정해보자.
당신의 총 자산은 23,000원이지만, 실제로는 이 금액이 여러 개의 독립적인 “조각”으로 존재한다.
UTXO 모델은 정확히 이런 방식으로 작동한다.
비트코인 네트워크에서 각 UTXO는 다음과 같은 속성을 가진다:
-
고유성: 각 UTXO는 이전 트랜잭션의 특정 출력으로 식별된다
-
불가분성: UTXO는 완전히 소비되거나, 전혀 소비되지 않거나 둘 중 하나다
-
일회성: 한 번 소비된 UTXO는 다시 사용할 수 없다
-
독립성: 각 UTXO는 다른 UTXO와 독립적으로 존재하고 검증된다
사실 각 속성을 외울 필요는 없고 UTXO 의 동작 방식을 이해하는 것이 중요하다.
비트코인 트랜잭션에서 UTXO는 다음과 같은 구조를 가진다:
{
"txid": "a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d",
"vout": 0,
"scriptPubKey": "76a91489abcdefabbaabbaabbaabbaabbaabbaabbaabba88ac",
"amount": 0.5,
"confirmations": 150
}
각 필드의 의미는 다음과 같다:
-
txid: 이 UTXO를 생성한 트랜잭션의 해시
-
vout: 해당 트랜잭션 내에서의 출력 인덱스 (하나의 트랜잭션은 여러 개의 출력을 가질 수 있다)
-
scriptPubKey: 이 UTXO를 소비하기 위한 조건을 정의하는 Bitcoin Script
-
amount: UTXO의 금액 (BTC 단위)
-
confirmations: 블록체인에 포함된 이후 생성된 블록 수
UTXO 와 트랜잭션
UTXO 모델에서 트랜잭션은 다음과 같은 프로세스로 생성된다:
예시 시나리오: Alice가 Bob에게 1.2 BTC를 전송한다. Alice의 지갑에는 다음과 같은 UTXO가 있다:
-
UTXO #1: 0.5 BTC
-
UTXO #2: 0.8 BTC
-
UTXO #3: 0.3 BTC
단계별 프로세스:
-
Input Selection
-
1.2 BTC를 전송하기 위해 충분한 UTXO를 선택한다
-
UTXO #1 (0.5 BTC) + UTXO #2 (0.8 BTC) = 1.3 BTC 선택
-
나머지 UTXO #3는 그대로 유지된다
-
-
Output Creation
-
#1: Bob의 주소로 1.2 BTC
-
#2: Alice의 새로운 주소로 0.0998 BTC (거스름돈, Change Output)
-
수수료: 0.0002 BTC (1.3 - 1.2 - 0.0998)
-
-
Signing
-
Alice는 자신의 개인키로 각 입력 UTXO에 대해 서명한다
-
각 UTXO의 scriptPubKey 조건을 만족하는 scriptSig를 생성한다
-
-
검증 및 브로드캐스트
-
트랜잭션이 네트워크에 전파된다
-
각 노드는 UTXO가 실제로 미사용 상태인지 확인한다
-
비트코인 네트워크의 모든 노드는 UTXO Set이라고 불리는 데이터베이스를 유지한다.
이는 현재 네트워크에 존재하는 모든 미사용 UTXO의 집합이다.
UTXO Set의 특징:
-
항목 수: 약 1억 5천만 개 이상의 UTXO
-
검증 속도: UTXO 기반 검증은 O(1) 시간복잡도로 매우 빠르다
UTXO 모델은 다음과 같은 설계 원칙을 따른다:
1. Stateless Verification (무상태 검증) 각 트랜잭션은 독립적으로 검증 가능하다. 트랜잭션 검증에 필요한 모든 정보는 UTXO Set과 트랜잭션 자체에 포함되어 있다.
2. Immutability (불변성) 한 번 생성된 UTXO는 변경되지 않는다. 소비되거나, 미사용 상태로 남거나 둘 중 하나다.
3. Explicit State Transition (명시적 상태 전이) 상태 변화는 항상 명시적이다. UTXO가 소비되면 UTXO Set에서 제거되고, 새로운 UTXO가 추가된다.
4. Parallelizability (병렬화 가능성) 각 UTXO가 독립적이므로, 서로 다른 UTXO를 사용하는 트랜잭션들은 병렬로 검증될 수 있다.
Account
Account 모델은 2015년 이더리움이 도입한 상태 관리 방식으로, 은행 계좌 시스템과 유사하게 작동한다.
UTXO 모델이 “동전”의 개념이라면, Account 모델은 “계좌 잔액”의 개념이다.
Account 모델에서 블록체인의 상태는 글로벌 상태 트리(Global State Trie)로 표현된다.
각 계정은 고유한 주소를 가지며, 해당 주소에 연결된 상태 정보를 유지한다.
어떻게 보면 일반적으로 생각하는 마인드 모델에 부합하는 모델이기도 하다.
1. EOA (Externally Owned Account)
EOA는 일반 사용자가 개인키로 제어하는 계정이다:
{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"balance": "15.5 ETH",
"nonce": 47,
"codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
}
-
address: 20바이트 길이의 계정 주소
-
balance: 계정이 보유한 Ether 잔액
-
nonce: 이 계정에서 발생한 트랜잭션 수 (재생 공격 방지용)
-
codeHash: EOA의 경우 빈 코드의 해시값
2. Contract Account
스마트 컨트랙트가 배포된 계정이다:
{
"address": "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d",
"balance": "1250.3 ETH",
"nonce": 1,
"codeHash": "0x1a2b3c4d...",
"storageRoot": "0x5e6f7a8b...",
"code": "0x6080604052..."
}
-
storageRoot: 컨트랙트의 저장소 상태를 나타내는 Merkle Patricia Trie의 루트
-
code: 컨트랙트의 바이트코드
Global State Trie
이더리움의 상태는 Merkle Patricia Trie라는 데이터 구조로 관리된다.
이는 모든 계정의 상태를 효율적으로 저장하고 검증할 수 있게 한다.

Account 모델은 다음과 같은 설계 철학을 따른다.
1. Stateful Execution (상태 기반 실행) 스마트 컨트랙트는 글로벌 상태에 접근하고 수정할 수 있다. 이는 복잡한 애플리케이션 로직 구현을 가능하게 한다.
2. Account Abstraction (계정 추상화) 코드와 자산을 동일한 추상화 수준에서 다룬다. 컨트랙트 계정도 Ether를 보유하고 트랜잭션을 받을 수 있다.
3. Continuous State (연속적 상태) 각 계정의 상태는 연속적으로 업데이트된다. UTXO처럼 “소비”되는 것이 아니라 “수정”된다.
4. Global Context (글로벌 컨텍스트) 스마트 컨트랙트는 다른 컨트랙트의 상태를 읽고 호출할 수 있다. 이는 DeFi 생태계의 조합성(composability)을 가능하게 한다.