비트코인에서는 UTXO Model을 사용하고, 이더리움에서는 Account Model을 사용합니다. 흐름 상 이더리움의 Account Model부터 알아보려고 합니다.
모든 트랜잭션은 일회성입니다. 하나의 트랜잭션은 하나의 상태만 변화시킬 수 있습니다. 비트코인의 경우 UTXO를 통해 해결하고, 이더리움은 어카운트 기반 시스템으로 논스값을 각 트랜잭션이 오직 한번만 처리되게 하는 카운터로 사용합니다. 이 논스는 트랜잭션을 발신한 사람이 트랜잭션에 필요한 메시지 (이더리움 트랜잭션에 필요한 데이터) 재사용을 방지하기 위함입니다. 이를 인지한 상태로 코드를 살펴보자.
//genesis state
Object {}
//state transition function
apply_transaction(state, transaction){
// (1) Check the tx signature
// (2) Check the nonce
// (3) Apply our 'mint' or 'send' tx
return new state
}
//state
[Object{
contents: Object{
amount: 100,
from: "0x123",
nonce: 1,
to: "0xabc",
type: "mint"
},
sig: "0x321"
}, Object{
contents: Object{
amount: 100,
from: "0x456",
nonce: 1,
to: "0xdef",
type: "send"
},
sig: "0x654"
}]
// state transition function
// (1) Check the tx signature
// (2) Check the nonce
// (3) Apply our 'mint' or 'send' tx
["State at time 0" Object {
0xzyx: Object {
balance: 100,
nonce: 1
}
}, Object{
contents: Object{
amount: 100,
from: "0x456",
nonce: 1,
to: "0xdef",
type: "send"
},
sig: "0x654"
}]
{
contents: {
list of inputs,
list of outputs
},
list of input signitures
}
UTXO Model은 위와 같습니다. 이제 아래에서 어떻게 진행되는지 살펴봅시다.
//genesis state
Object {}
//state transition function
apply_transaction(state, transaction){
// (1) Check all tx signatures
// (2) Check that all inputs are `unspent`
// (3) Check that input value == output value
// (4) Set inputs to `spent`
// (5) Save our new `unspent` outputs
return new state
}
//state
[Object {
contents: Object {
inputs: [0],
outputs: [Object {
owner: "0x123",
value: 250
}, Object {
owner: "0xabc",
value: 250
}, Object {
owner: "0x456",
value: 500
}
]
},
sigs: ["0xdef"]
}, Object {
contents: Object{
inputs: [1,2],
outputs: [Object {
owner: "0x456",
value: 500
}
]
},
sigs: ["0xpqr"]
}
]
시각적으로 보기 위해서, Alice의 UTXO를 살펴봅시다.
State는 다음과 같습니다.
outputs = [{value: 100, owner: 0x171}]
is_spent = [0] // 0 = unspent, 1 = spent
100달러를 Aparna와 Jing에게 $49씩 나눠서 보내기로 해보자.
Alice는 이 트랜잭션을 생성하고 이 트랜잭션은 input에 list 됩니다. input은 이제 우리의 0번째 요소입니다.