Blockchain

#11 Transaction ch1.개념

Sila 2022. 6. 22. 21:28

Transaction이라는 단어에는 여러 가지 의미가 있지만 여기서는

 

한 지갑에서 다른 지갑으로 돈/코인을 전송하는 행위라고 보면 된다.

 

이 트랜잭션 (이하 tx) 를 정확하게 발생시키기 위해서는 생각보다 개입되는 요소가 매우 많은데,

 

각각의 정의가 무엇인지, tx 과정에서 어떤 역할을 하는지를 먼저 알고 넘어가도록 하자.

 

지갑1에서 지갑2로 지갑을 보낼 때 필요한 정보엔 어떤 것들이 있을까.

 

우선 어디로 보낼지 지갑의 주소를 특정지어주는 수신인의 지갑 주소가 필요하다.

 

발신인 지갑 입장에서는 액수를 적어보내면 된다.

 

그리고나서 여러가지 검증 단계를 거쳐야 한다.

 

누군가 지갑1에서 지갑2로 코인을 10개 보낸다고 할 때, 우선 지갑1에

 

 

a) 충분한 액수의 코인이 있는지, (실제로 수수료를 감안하면 10개보다 조금 더 많아야 한다)

 

b) 정말로 지갑1의 주인이 보내는게 맞는지

 

 

이 두 가지의 조건을 확인하고 난 후에야 비로소 블록체인 상에서 그 거래가 성립이 된다.

 

이 두 조건을 어떻게 풀어나갈 것인가를 생각해보면서 tx에 필수적인 요소인 utxo, 개인키, 서명에 대해 알아가면 되겠다.

 

1. 정말 지갑 주인이 보내는게 맞는지 확인

주인은 지갑을 생성해 개인키를 가지고 있는 사람을 의미한다. 네트워크 입장에서는 어떤 '사람'인지를

 

확인할 방법 이 없으므로 그 누구든 개인키만 제시하면 지갑의 주인으로 간주해 tx를 일으킬 수 있다.

 

(따라서 개인키는 자신만이 알 수 있도록, 분실하지 않도록 잘 보관해야한다.)

 

그런데 지갑2의 주인인 B가 어쩌다보니 A가 가진 지갑1의 지갑 주소를 알게되었다

 

그래서 수신인란에 지갑2의 지갑 주소를 넣고 코인을 전송하고 싶어졌다.

 

하지만 이런 일은 불가능하다.

 

 B에겐 A가 가진 개인키가 없기 때문에 A만이 자신의 개인키로 만들 수 있는 서명을 똑같이 만들 수가 없기 때문이다.

 

지갑의 주인은 본인만이 아는 개인키를 이용해 공개키를 만들고, 이를 이용한 일련의 암호화 과정을 거쳐

 

tx의 승인을 요청한다. (암호화된 결과물을 서명이라고 한다.)

 

이 때 서명과 함께 공개키를 함께 전달함으로써 상대방에게 암호를 풀 수 있게 해준다.

 

이 공개키는 지갑 주인만이 생성할 수 있으므로 이 공개키를 이용해 암호를 해독할 수 있다면 서명을 만든 사람이

 

개인키를 가지고 있으며, 곧 지갑의 주인이라는 것을 의미한다.

 

2. 충분한 잔액이 있는지 확인

한 지갑에 돈이 얼마나 들어있는지 잔고를 확인하는 방법은 코인마다 다르지만

 

BTC는 unspent transaction output (UTXO)라는 개념을 이용한다.

 

다시 돌아와서 있는 지갑1에서 지갑2로 10개의 코인을 전송하고 싶다고 하자.

 

우선 지갑1이 '사용되지 않은' (unspent)  코인이 얼마나 남았는지 확인을 해야한다.

 

지갑1의 unspent를 구하려면 전체 블록체인에 기록되어 있는

 

지갑1의 주소 앞으로 되어있는 모든 unspent를 찾아서 그 액수를 더하면 된다.

 

전송을 요청하면 짜놓은 코드가 알아서 블록체인 네트워크에 요청을 보내 이 과정을 수행 후, 결과 값을 받아온다.

 

액수가 충분하다면 출금이 가능하다.

 

utxo를 조회했더니 잔액이 50BTC라고 하자. 이중 10BTC를 지갑2로 보낸다.

 

이 출금정보가 input영역에 기록된다. ( A  : 50BTC )

 

50BTC utxo를 바로 쪼갤 수는 없다. 대신, 10BTC를 전송하고 남는 40BTC를 자신 지갑주소로

 

다시 utxo를 생성한다.

 

반대로 입금 기록또한 output 영역에 기록되어야 한다.

 

( B  : 10 BTC (unspent) )

 

여기에 더해 아까 남은 40 BTC도 동일한 영역에 기록된다.

 

( A : 40 BTC (unspent) )

 

이런 일련의 거래들의 정보를 그대로 저장하는 것이 아니라

 

전부 객체로 만들어 배열에 담은후, merkleRoot처럼 해시화한다.

 

그래서 코인을 한 지갑에서 다른 지갑으로 전송하면 그 거래의 hash값이 생성되고,

 

이를 통해 전송 기록을 살펴볼 수 있다.

 

지금까지는 블록을 만들 때 data 속성에 문자열을 담은 배열을 입력했지만

 

원래는 이런 tx 정보를 모아 암호화한 값들이 들어가야 한다. (앞으로는 그렇게 될 것이다.)

 

다음 글부터는 이런 일들을 실제로 어떻게 코드로 구현할 수 있는지 알아보자.

'Blockchain' 카테고리의 다른 글

#13 tx ch3. 채굴자 보상  (0) 2022.06.23
#12 Transaction ch2.코인 전송  (0) 2022.06.22
#10 지갑, 개인키  (0) 2022.06.20
#9 체인 최신화  (0) 2022.06.17
#8 mining ch.2 - 활용  (0) 2022.06.17