Account, UTXO 모델

허정·2022년 3월 3일
0

블록체인

목록 보기
7/38

비트코인에서는 UTXO Model을 사용하고, 이더리움에서는 Account Model을 사용합니다. 흐름 상 이더리움의 Account Model부터 알아보려고 합니다.

모든 트랜잭션은 일회성입니다. 하나의 트랜잭션은 하나의 상태만 변화시킬 수 있습니다. 비트코인의 경우 UTXO를 통해 해결하고, 이더리움은 어카운트 기반 시스템으로 논스값을 각 트랜잭션이 오직 한번만 처리되게 하는 카운터로 사용합니다. 이 논스는 트랜잭션을 발신한 사람이 트랜잭션에 필요한 메시지 (이더리움 트랜잭션에 필요한 데이터) 재사용을 방지하기 위함입니다. 이를 인지한 상태로 코드를 살펴보자.

1. Account Model

//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"
}]

2. UTXO Model

{
  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번째 요소입니다.

0개의 댓글